50 lines
1.9 KiB
Python
50 lines
1.9 KiB
Python
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(稀疏)
|
||
- 问题场景:
|
||
处理百万级文档的语料时,向量维度会达到几十万,计算成本极高,且模型容易过拟合,在机器学习任务中训练效率极低。
|
||
""") |