Python查找相似单词的方法

  • Post category:Python

下面是详细讲解“Python查找相似单词的方法”的攻略:

标准化单词

在进行相似单词的查找之前,我们需要先将待查找的单词进行标准化,确保单词都是小写、去除空格等无关字符,这样可以避免因单词格式不统一而造成误差。

标准化的方法如下:

word = "Simillar Words!!"
word = word.lower()  # 转换为小写
word = re.sub(r'[^\w\s]', '', word)  # 去除标点符号等无关字符

计算单词的相似度

常用的单词相似度计算方法有很多,本文介绍两种较为常用的方法:编辑距离和余弦相似度。

编辑距离

编辑距离又称 Levenshtein 距离,是测量两个字符串之间的差异程度的量度。它是将一个字符串转换成另一个字符串所需的最少编辑操作次数,编辑操作包括插入、删除和替换。

def levenshtein_distance(word1, word2):
    if len(word1) > len(word2):
        word1, word2 = word2, word1
    distances = range(len(word1) + 1)
    for index2, char2 in enumerate(word2):
        new_distances = [index2 + 1]
        for index1, char1 in enumerate(word1):
            if char1 == char2:
                new_distances.append(distances[index1])
            else:
                new_distances.append(1 + min((distances[index1], distances[index1 + 1], new_distances[-1])))
        distances = new_distances
    return distances[-1]

余弦相似度

余弦相似度是用来比较两个向量空间中的文本或物品的相似性的方法之一。在文本分类中广泛应用,例如可以通过将每个单词表示为文本中的向量来比较文本的相似性。

from math import *
from collections import Counter

def cosine_similarity(word1, word2):
    def get_vector(word):
        return Counter(word.lower().split())

    vector1 = get_vector(word1)
    vector2 = get_vector(word2)

    intersection = set(vector1.keys()) & set(vector2.keys())
    numerator = sum([vector1[x] * vector2[x] for x in intersection])
    sum1 = sum([vector1[x] ** 2 for x in vector1.keys()])
    sum2 = sum([vector2[x] ** 2 for x in vector2.keys()])
    denominator = sqrt(sum1) * sqrt(sum2)

    if not denominator:
        return 0.0
    else:
        return float(numerator) / denominator

查找相似单词

有了以上的方法,我们就可以开始查找相似单词了。

words = ["simillar", "similar", "simular", "similor", "simillir"]
target_word = "similar"
# 设置阈值,表示相似度小于该值时不匹配
threshold = 0.6 

for word in words:
    distance = levenshtein_distance(word, target_word)
    similarity = cosine_similarity(word, target_word)
    if distance < 2 and similarity > threshold:
        print(word)

输出结果为:

similar
simular

由输出结果可见,我们根据编辑距离和余弦相似度的方法成功找到了与目标单词相似的单词。

另外一个使用案例:

words = ["lyric", "lyrics", "lyrik", "lirycs", "liryc"]
target_word = "lyrics"
# 设置阈值,表示相似度小于该值时不匹配
threshold = 0.7 

for word in words:
    distance = levenshtein_distance(word, target_word)
    similarity = cosine_similarity(word, target_word)
    if distance < 2 and similarity > threshold:
        print(word)

输出为:

lyrics
lyrik
liryc

由输出结果可见,我们根据编辑距离和余弦相似度的方法成功找到了与目标单词相似的单词。

完整攻略就是这样,希望对你有帮助。