“詞形還原”(lemmatization)是指去掉單詞的詞形詞綴,返回單詞原型。
例如對於動詞來說,就是去掉動詞的過去式、過去完成時等形式,返回動詞原型;對於名詞來說,則是去掉名詞的複數形式,返回名詞原型;對於形容詞來說,則是去掉比較級、最高級等形式,返回形容詞原型。
“詞性還原”與“詞幹提取”(stemming)的區別在於:詞幹提取的結果可能不是完整的詞,而詞性還原的結果則是具有一定意義的、完整的詞語。
下面我們對NLTK、spaCy和LemmInflect的準確率進行評測。我們使用Automatically Generated Inflection Database (AGID)作為基準來進行評測。
Automatically Generated Inflection Database的下載地址:http://wordlist.aspell.net/other/
準確率評測結果:
<code>| Package | Accuracy |
|-----------------------------|
| LemmInflect | 94.66% |
| NLTK | 83.72% |
| spaCy | 65.98% |
|-----------------------------|/<code>
基於LemmInflect的詞形還原實現
Github地址:https://github.com/bjascob/LemmInflect
<code>def by_lemminflect(word, pos):
""" 使用lemminflect.getLemma實現詞性還原
:param word:單詞 /<code>
:param pos:詞性
:return:詞性還原結果
"""
if pos.lower() == "a":
pos = "ADJ"
elif pos.lower() == "n":
pos = "NOUN"
elif pos.lower() == "v":
pos = "VERB"
elif pos.lower() == "p":
pos = "PROPN"
return getLemma(word, pos)
if __name__ == "__main__":
test_word_list = [["men", "n"], ["computer", "n"], ["ate", "v"], ["running", "v"], ["saddest", "a"],
["fancier", "a"]]
for test_word in test_word_list:
print(by_lemminflect(test_word[0], test_word[1]))
運行結果
<code>('man',)
('computer',)
('eat',)
('run',)
('sad',)
('fancy',)/<code>
基於NLTK的詞形還原實現
NLTK在Github上擁有8800星標,其中stem.WordNetLemmatizer用於實現詞形還原。
Github地址:https://github.com/nltk/nltk
<code>def by_nltk(word, pos):
""" 使用nltk.stem.WordNetLemmatizer實現詞性還原
:param word:單詞 /<code>
:param pos:詞性
:return:詞性還原結果
"""
return nltk_wnl.lemmatize(word, pos.lower())
if __name__ == "__main__":
test_word_list = [["men", "n"], ["computer", "n"], ["ate", "v"], ["running", "v"], ["saddest", "a"],
["fancier", "a"]]
for test_word in test_word_list:
print(by_nltk(test_word[0], test_word[1]))
運行結果
<code>men
computer
eat
run
sad
fancy/<code>
基於spaCy的詞形還原實現
spaCy的安裝方法詳見:
閱讀更多 數據藝術家 的文章