最大匹配是指以词典为依据,取词典中最长单词为第一个次取字数量的扫描串,在词典中进行扫描(为提升扫描效率,还可以跟据字数多少设计多个字典,然后根据字数分别从不同字典中进行扫描)。例如:词典中最长词为“中华人民共和国”共7个汉字,则最大匹配起始字数为7个汉字。然后逐字递减,在对应的词典中进行查找。
下面以“我们在野生动物园玩”详细说明一下这几种匹配方法:
正向即从前往后取词,从7->1,每次减一个字,直到词典命中或剩下1个单字。
正向最大匹配法,最终切分结果为:“我们/在野/生动/物/园/玩”,其中,单字字典词为2,非词典词为1。
逆向即从后往前取词,从7->1,每次减一个字,直到词典命中或剩下1个单字。即:
逆向最大匹配法,最终切分结果为:“我们/在/野生动物园/玩”,其中,单字字典词为2,非词典词为0。
正向最大匹配法和逆向最大匹配法,都有其局限性,我举得例子是正向最大匹配法局限性的例子,逆向也同样存在(如:长春药店,逆向切分为“长/春药店”),因此有人又提出了双向最大匹配法,双向最大匹配法。即,两种算法都切一遍,然后根据大颗粒度词越多越好,非词典词和单字词越少越好的原则,选取其中一种分词结果输出。
如:“我们在野生动物园玩”
正向最大匹配法,最终切分结果为:“我们/在野/生动/物/园/玩”,其中,两字词3个,单字字典词为2,非词典词为1。
逆向最大匹配法,最终切分结果为:“我们/在/野生动物园/玩”,其中,五字词1个,两字词1个,单字字典词为2,非词典词为0。
非字典词:正向(1)>逆向(0)(越少越好)
单字字典词:正向(2)=逆向(2)(越少越好)
总词数:正向(6)>逆向(4)(越少越好)
因此最终输出为逆向结果
# 计算词频
seg_list = jieba.cut(train_data["content"][0], cut_all=False)
result = []
for seg in seg_list:
seg = ''.join(seg.split())
if seg != '' and seg != "\n" and seg != "\n\n" and seg not in stopwords:
result.append(seg)
word_fre = {}
for i in set(result):
word_fre[i] = result.count(i)
word_fre = sorted(word_fre.items(), key=lambda item: item[1], reverse=True)
自然语言处理中的N-Gram模型介绍
步骤有:
import jieba
# 全模式
text= '昨天,我和施瓦布先生一起与部分企业家进行了交流,大家对中国经济当前、未来发展的态势、走势都十分关心。'
## 去除符号哦
text= re.sub(remove, '', str(text).strip())
seg_list = jieba.cut(text, cut_all=True)
print(u"[全模式]: ", "/ ".join(seg_list))
# 精确模式
seg_list = jieba.cut(text, cut_all=False)
print(u"[精确模式]: ", "/ ".join(seg_list))
# 默认是精确模式
seg_list = jieba.cut(text)
print(u"[默认模式]: ", "/ ".join(seg_list))
# 搜索引擎模式
seg_list = jieba.cut_for_search(text)
print(u"[搜索引擎模式]: ", "/ ".join(seg_list))
# 新词识别
import jieba
#新词识别 “杭研”并没有在词典中,但是也被Viterbi算法识别出来了
seg_list = jieba.cut("他来到了网易杭研大厦")
print (u"[新词识别]: ", "/ ".join(seg_list))
# 分词方式2
seg_list = jieba.cut(train_data["content"][0], cut_all=False)
print("Full Mode: " + "/ ".join(seg_list)) # 全模式
# 读取停用词
stopwords = []
with open('stopwords.txt', 'r') as fr:
for line in fr:
stopwords.append(line[:-1])
# 计算词频
seg_list = jieba.cut(train_data["content"][0], cut_all=False)
result = []
for seg in seg_list:
seg = ''.join(seg.split())
if seg != '' and seg != "\n" and seg != "\n\n" and seg not in stopwords:
result.append(seg)
word_fre = {}
for i in set(result):
word_fre[i] = result.count(i)
word_fre = sorted(word_fre.items(), key=lambda item: item[1], reverse=True)
train_data = train_data[:5]
words = []
for sentence in train_data['content']:
word = list(jieba.cut(sentence))
for w in list(set(word) and set(stopwords)):
while w in word:
word.remove(w)
words.append(' '.join(word))
train_data['content_'] = words
# 计算 TF-IDF
count_vectorizer = CountVectorizer(max_features=256, min_df=2)
count_vectorizer.fit_transform(train_data['content_'])
fea_vec = count_vectorizer.transform(train_data['content_']).toarray()
结巴分词介绍和使用