學習NLP的第22天——英文詞形還原(附各處理庫準確率比較)

“詞形還原”(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: 單詞
: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>

運行結果

<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: 單詞
: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>

運行結果

<code>men
computer
eat
run
sad
fancy/<code>

基於spaCy的詞形還原實現

spaCy的安裝方法詳見:


分享到:


相關文章: