我正试图弄清楚我的字符串是否与列表中的任何项目列表相似。我的错误是,它只迭代到我的列表大小,而不是单个字符串的长度。有什么建议吗?
my_string = "aplpe"
my_list=["orange", "apple", "grape"]
correctamount=0
if(my_string in my_list):
print("Passed")
else:
if any(my_string in s for s in my_list):
for i in range(len(my_string) + 1):
if my_string[i] == my_list[i][i]:
correctamount += 1
print(correctamount)
else:
correctamount == 0
print(correctamount)
if((correctamount/len(my_list) + 1 ) > .75):
print("Passed")
else:
print("Failure")
有一个名为jellyfish
的库用于此目的-https://github.com/jamesturk/jellyfish
>>> import jellyfish
>>> jellyfish.levenshtein_distance(u'jellyfish', u'smellyfish')
2
>>> jellyfish.jaro_distance(u'jellyfish', u'smellyfish')
0.89629629629629637
>>> jellyfish.damerau_levenshtein_distance(u'jellyfish', u'jellyfihs')
1
该库具有不同的字符串匹配算法
Levenshtein Distance
Damerau-Levenshtein Distance
Jaro Distance
Jaro-Winkler Distance
Match Rating Approach Comparison
Hamming Distance
为了找到字符串之间的相似性,有很多种算法,Python有一个名为textdistance的库,它包含了所有的算法。
根据您的要求,我将使用的是Jaccard距离。你需要根据自己的需要来决定算法。
import textdistance as td
similarity_perc = [td.jaccard.normalized_similarity(my_string, s) for s in my_list]
每个字符串的相似性百分比
[0.22, 1.0, 0.42]
获取最相似字符串的索引
most_similar_index = similarity_perc.index(max(similarity_perc))
# Omitted not found check. Please do it yourself.
print(my_list[most_similar_index])
输出
apple
如果您希望将其用于大型数据集,这里会给出与其他库的文本距离基准。
我相信编写一个干净的代码并分离出单独的功能,这样代码就很容易阅读和贡献。
我定义了一个函数is_similar
来检查similarity_percentage
。
看看以下实现:
import math
def is_similar(my_string, test_string):
min_len = min(len(my_string), len(test_string))
count = 0
for i in range(0, min_len):
if(my_string[i] == test_string[i]):
count = count+1
similarity_percentage = count/len(my_string)
print("Similarity Precentage: ", similarity_percentage)
return ( similarity_percentage > 0.75 )
my_string = "aplpe"
my_list=["orange", "apple", "grape"]
if(my_string in my_list):
print("Passed - Identical")
else:
for i in range(0, len(my_list)):
if(is_similar(my_string, my_list[i])):
print("Passed - Similar with", my_list[i], sep=" ")
else:
print("Failure")
输出:
Similarity Precentage: 0.0
Failure
Similarity Precentage: 0.6
Failure
Similarity Precentage: 0.4
Failure
情况2:
如果
my_string = "aplpe"
my_list=["orange", "apppe", "grape"]
然后,输出:
Similarity Precentage: 0.0
Failure
Similarity Precentage: 0.8
Passed - Similar with apppe
Similarity Precentage: 0.4
Failure
情况3:
如果
my_string = "aplpe"
my_list=["orange", "aplpe", "grape"]
然后,输出:
Passed - Identical