Python+KNN算法判断单词相似度小案例

2017-05-11 董付国 Python小屋 Python小屋

本文代码用于判断待测单词与哪个候选单词最接近,判断标准为字母出现频次(直方图)最接近,只考虑了不小心的拼写错误,而没有考虑故意的拼写错误,例如故意把god写成dog,这可能会造成误判。当然误判率与判断相似的标准有非常大的关系,例如运行结果第一条就是错的(当然这在训练样本足够多的时候可以在一定程度上避免,虽然无法完全避免)。本文代码主要用来演示KNN算法原理以及Python字典推导式以及内置函数map()、min()、sum()和标准库对象Counter的用法。

from collections import Counter


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]


# 候选单词
words = {'good', 'hello', 'world', 'python', 'fuguo', 'yantai', 'shandong', 'great'}


# 每个单词中字母频次
words = {word:dict(Counter(word)) for word in words}


# 测试
for word in ['god', 'hood', 'wello', 'helo', 'pychon', 'guguo', 'shangdong']:
    print(word, ':', checkAndModify(word))


由于本文代码不好排版,所以附上代码截图以供参考,免得因为缩进问题而影响理解。


代码运行结果为:

god : shandong
hood : good
wello : hello
helo : hello
pychon : python
guguo : fuguo
shangdong : shandong