一、前向最大匹配算法
二、后向最大匹配算法
三、最大匹配算法的缺点
- 不能考虑短的情况
- 属于贪心算法,只能得出局部最优解
- 效率不高,很大程度上依赖参数max_len的设置
- 不能很好的处理歧义的情况,不同的单词在不同的场景中的意思是不一样的
前向最大匹配算法代码
from nltk.stem import WordNetLemmatizer
from nltk.corpus import words
wordlist = set(words.words())
wordnet_lemmatizer = WordNetLemmatizer()
def max_match(text):
pos2 = len(text)
result = ''
while len(text) > 0:
word = wordnet_lemmatizer.lemmatize(text[0:pos2])
if word in wordlist:
result = result + text[0:pos2] + ' '
text = text[pos2:]
pos2 = len(text)
else:
pos2 = pos2-1
return result[0:-1]
python实现unigram
# n-gram
from sklearn.feature_extraction.text import CountVectorizer
import pandas as pd
import jieba
data = ["他用报话机向上级呼喊:“为了祖国,为了胜利,向我开炮!向我开炮!",
"记者:你怎么会说出那番话?",
"韦昌进:我只是觉得,对准我自己打,才有可能把上了我哨位的这些敌人打死,或者打下去。"]
data = [" ".join(jieba.lcut(e)) for e in data] # 分词,并用" "连接
vec = CountVectorizer(min_df=1, ngram_range=(1,1))
# ngram_range=(1,1) 表示 unigram, ngram_range=(2,2) 表示 bigram, ngram_range=(3,3) 表示 thirgram
X = vec.fit_transform(data) # transform text to metrix
vec.get_feature_names() # get features
X.toarray()
df = pd.DataFrame(X.toarray(), columns=vec.get_feature_names()) # to DataFrame
df.head()