docs = [ "Python 是 编程 语言", # Doc1 "Java 是 编程 语言", # Doc2 "Python Python Python" # Doc3 ] tokenized_docs = [doc.split() for doc in docs] print("分词后的文档:") for i, tokens in enumerate(tokenized_docs, 1): print(f"Doc{i}: {tokens}") vocab = [] for tokens in tokenized_docs: for token in tokens: if token not in vocab: vocab.append(token) print("\nBoW词表:", vocab) bow_vectors = [] for tokens in tokenized_docs: vector = [tokens.count(word) for word in vocab] bow_vectors.append(vector) print("\n每个文档的BoW向量:") for i, vec in enumerate(bow_vectors, 1): print(f"Doc{i}: {vec}") print("\n" + "="*50) print("题目6:BoW模型的缺点(至少2个)") print("="*50) print(""" 1. 完全忽略词序与上下文语义 - 原理:BoW把文档当成「无序词汇袋」,完全丢失词汇顺序、语法、上下文关系 - 问题场景: 句子A:"我喜欢苹果 不喜欢香蕉" 句子B:"我喜欢香蕉 不喜欢苹果" 两个句子语义完全相反,但BoW向量完全相同,会被模型判定为相似,在情感分析、语义理解任务中完全失效。 2. 无法处理一词多义/多词一义 - 原理:BoW把每个词当成独立符号,不考虑词汇的语义关联 - 问题场景: "Python"既可以指编程语言,也可以指蟒蛇;"开心"和"高兴"是同义词,但BoW会把它们当成完全不同的词。 在语义检索、文本分类任务中,会丢失语义关联,导致模型效果差。 3. 维度灾难+稀疏性问题 - 原理:词表维度=语料库词汇总数,大语料下维度极高,且大部分向量元素为0(稀疏) - 问题场景: 处理百万级文档的语料时,向量维度会达到几十万,计算成本极高,且模型容易过拟合,在机器学习任务中训练效率极低。 """)