利用python檢測單詞的相似度


百度了一下,似乎都不太復雜,我選擇了兩個不需要安裝第三方組件的例子,地址分別如下

https://www.sohu.com/a/139947378_797291

https://zhuanlan.zhihu.com/p/268410388

整合了兩個例子,我認為我找到了我想要的代碼了,以下是我整理的源代碼

from difflib import SequenceMatcher
from collections import Counter

print("==========第一次測試================")
# 候選單詞
words = {'good', 'hello', 'world', 'python','fuguo', 'yantai', 'shandong', 'great'}
# 每個單詞中字母頻次
words = {word: dict(Counter(word)) for word in words}

def checkAndModify(word):
    # 待檢測單詞的字母頻次
    fre = dict(Counter(word))
    # 待測單詞中各字母頻次與所有候選單詞的距離,即字母頻次之差
    similars = {w: [fre[ch]-words[w].get(ch, 0) for ch in word] + [words[w][ch]-fre.get(ch, 0) for ch in w] for w in words}
    # 返回最接近的單詞,即字母頻次之差的平方和最小的單詞
    return min(similars.items(), key=lambda item: sum(map(lambda i: i**2, item[1])))[0]

# 測試
for word in ['god', 'hood', 'weloo', 'heloo', 'wello', 'helo', 'pychon', 'guguo', 'shangdong']:
    print(word, ':', checkAndModify(word))

print("==========第二次測試================")
def similarity(a, b):
    return SequenceMatcher(None, a, b).ratio()

def checkAndModify2(test):
    similars = {word: similarity(word,test) for word in words}
    return max(similars, key=similars.get)

# 測試
for word in ['god', 'hood', 'weloo', 'heloo', 'wello', 'helo', 'pychon', 'guguo', 'shangdong']:
    print(word, ':', checkAndModify2(word))

以下的測試的結果

 

 對於heloo第一個測試認為good是最接近的,第二個測試認為hello更為接近。我認為第二測試的結果。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM