-
Unigram(一元模型)
- 定义:单个的词语或者符号。
- 示例:在句子“我爱自然语言处理”里,unigram 有“我”“爱”“自然”“语言”“处理”。
- 用途:可用于词频统计,像构建词袋模型就会用到。
-
Bigram(二元模型)
- 定义:由两个连续的词语构成的序列。
- 示例:上述句子的 bigram 为“我爱”“爱自然”“自然语言”“语言处理”。
- 用途:能够对词序信息进行捕捉,在预测下一个词时会用到,例如“苹果”后面接“手机”的概率。
-
Trigram(三元模型)
- 定义:由三个连续的词语组成的序列。
- 示例:该句子的 trigram 是“我爱自然”“爱自然语言”“自然语言处理”。
- 用途:能捕捉更丰富的上下文信息,不过数据稀疏问题也会更明显。
-
N-gram(N元模型)
- 定义:N 个连续词语组成的序列,这里的 N 是正整数。当 N=1 时就是 unigram,N=2 时是 bigram,N=3 时是 trigram。
- 用途:随着 N 值的增大,模型能捕捉到更长的上下文信息,但同时计算成本也会增加,并且需要更多的数据来支持。
应用场景
- 自动补全功能,比如输入法的联想。
- 机器翻译,对翻译候选项的概率进行评估。
- 语音识别,提升识别结果的准确性。
- 文本生成,像创作诗歌、故事等。
优缺点
- 优点:实现起来较为简单,计算效率高,还能解释词语之间的共现关系。
- 缺点:无法捕捉长距离的依赖关系,数据稀疏问题会导致泛化能力变弱。
示例代码(统计bigram频率)
from collections import defaultdict, Counter
def count_bigrams(sentences):
bigram_counts = defaultdict(Counter)
for sentence in sentences:
words = sentence.split()
for i in range(len(words) - 1):
bigram_counts[words[i]][words[i+1]] += 1
return bigram_counts
# 示例用法
sentences = ["我爱自然语言处理", "自然语言处理很有趣"]
bigrams = count_bigrams(sentences)
print(bigrams["自然"]["语言"]) # 输出: 2
通过调整 N 的取值,就能构建出不同类型的 n-gram 模型,进而应用于各种自然语言处理任务之中。
注意:本文归作者所有,未经作者允许,不得转载