最近在研究NLP的相关知识,然后就遇到了n-gram这个模型。拜读了高老师的博客后,觉得通俗易懂,所以对知识进行了以下整理。
维基百科的定义:在计算语言学中,n-gram指的是文本中连续的n个item(item可以是phoneme, syllable, letter, word或base pairs)
n-gram 中如果n=1则为unigram,n=2则为bigram,n=3则为trigram。n>4后,则直接用数字指称,如4-gram,5-gram。
gram 常用来比较句子相似度,模糊查询,以及句子合理性,句子矫正等.
示例
以 “我将要去美国”这句话为例。首先通过jieba分词工具进行分词,分词代码和分词结果如下
import jieba
text = "我将要去美国"
cut = jieba.cut(text)
sent = list(cut)
print(sent)
['我', '将要', '去', '美国']
bigram结果为:
我将要
将要去
去美国
用python3实现bigram模型
sent="我将要去美国"
bigram=[]
for i in range(len(sent)-1):
bigram.append(sent[i] + sent[i+1])
print(bigram)
输出结果:['我将要', '将要去', '去美国']
示例
还是以 “我将要去美国”这句话为例。trigram结果为:
我将要去
将要去美国
用python3实现trigram模型
import jieba
text = "我将要去美国"
cut = jieba.cut(text)
sent = list(cut)
#sent=[“我”,“将要”,“去”,“美国”]
trigram=[]
for i in range(len(sent)-2):
trigram.append(sent[i] + sent[i+1] + sent[i+2])
print(trigram)
输出结果:['我将要去', '将要去美国']
是不是感觉很简单呢?那我们继续来实现n-gram模型吧
def nGram(lst,n):
ngram=[]
for i in range(len(lst)-n+1):
ngram.append(lst[i]+...+lst[i+n])
print(ngram)
调用nGram()即可,sent="我将要去美国",n可以为小于len(lst)的一个数字
参考文献:http://blog.sina.com.cn/s/blog_5f4150730102wkdq.html