Python - 比较两个列表时出现循环问题
Python - Problem with loops while comparing two lists
我有一个小问题,我正在尝试将 2 个列表与其中的单词进行比较以建立相似度百分比,但问题是,如果我在每个列表中有 2 次相同的单词,我会得到一个错误的百分比.
首先我做了这个小脚本:
data1 = ['test', 'super', 'class', 'test', 'boom']
data2 = ['test', 'super', 'class', 'test', 'boom']
res = 0
nb = (len(data1) + len(data2)) / 2
if data1 and data2 and nb != 0:
for id1, item1 in enumerate(data1):
for id2, item2 in enumerate(data2):
if item1 == item2:
res += 1 - abs(id1 - id2) / nb
print(res / nb * 100)
问题是,如果我在列表中有 2 次相同的单词,百分比将大于 100%。
因此,为了解决这个问题,我在 'res += 1 - abs(id1 - id2) / nb' 行之后添加了一个 'break',但百分比仍然是错误的。
希望你能理解我的问题,谢谢你的帮助!
您可以使用 difflib.SequenceMatcher
来比较两个列表的相似性。试试这个:
from difflib import SequenceMatcher as sm
data1 = ['test', 'super', 'class', 'test', 'boom']
data2 = ['test', 'super', 'class', 'test', 'boom']
matching_percentage = sm(None, data1, data2).ratio() * 100
输出 :
100.0
data1 = ['test', 'super', 'class', 'test', 'boom']
data2 = ['test', 'super', 'class', 'test', 'boom']
from collections import defaultdict
dic1 =defaultdict(int)
dic2=defaultdict(int)
for i in data1:
dic1[i]+=1
for i in data2:
dic2[i]+=1
count = 0
for i in dic1:
if i in dic2.keys():
count+=abs(dic2[i]-dic1[i])
result =( (1-count/(len(data1)+len(data2))) *100)
输出
100.0
试试这个代码:
data1 = ['test', 'super', 'class', 'class', 'test', 'boom']
data2 = ['test', 'super', 'class', 'class', 'test', 'boom']
res = 0
nb = (len(data1) + len(data2)) / 2.0
def pos_iter(index, sz):
yield index
i1 = index - 1
i2 = index + 1
while i1 >=0 and i2 < sz:
if i1 >= 0:
yield i1
i1 -=1
if i2 < sz:
yield i2
i2 += 1
if data1 and data2 and nb != 0:
for id1, item1 in enumerate(data1):
for id2 in pos_iter(id1, len(data2)):
item2 = data2[id2]
if item1 == item2:
res += max(0, 1 - abs(id1 - id2) / nb)
break
print(res / nb * 100)
您的代码存在问题,您总是从头开始寻找第二个 data2
中的匹配词。如果单词重复,这会给你无效的值。您需要始终搜索单词在 data1
中的 "around" 位置,因为您想要找到最接近的单词。
此外,您还需要添加中断,否则包含所有相同单词的文本将远远高于 1.0。您的 nb
变量需要加倍(或者 python2 将舍入除法结果)。你应该确保 1 - abs(id1 - id2) / nb
大于零,因此我添加了 max(0, ...)
.
我有一个小问题,我正在尝试将 2 个列表与其中的单词进行比较以建立相似度百分比,但问题是,如果我在每个列表中有 2 次相同的单词,我会得到一个错误的百分比.
首先我做了这个小脚本:
data1 = ['test', 'super', 'class', 'test', 'boom']
data2 = ['test', 'super', 'class', 'test', 'boom']
res = 0
nb = (len(data1) + len(data2)) / 2
if data1 and data2 and nb != 0:
for id1, item1 in enumerate(data1):
for id2, item2 in enumerate(data2):
if item1 == item2:
res += 1 - abs(id1 - id2) / nb
print(res / nb * 100)
问题是,如果我在列表中有 2 次相同的单词,百分比将大于 100%。 因此,为了解决这个问题,我在 'res += 1 - abs(id1 - id2) / nb' 行之后添加了一个 'break',但百分比仍然是错误的。
希望你能理解我的问题,谢谢你的帮助!
您可以使用 difflib.SequenceMatcher
来比较两个列表的相似性。试试这个:
from difflib import SequenceMatcher as sm
data1 = ['test', 'super', 'class', 'test', 'boom']
data2 = ['test', 'super', 'class', 'test', 'boom']
matching_percentage = sm(None, data1, data2).ratio() * 100
输出 :
100.0
data1 = ['test', 'super', 'class', 'test', 'boom']
data2 = ['test', 'super', 'class', 'test', 'boom']
from collections import defaultdict
dic1 =defaultdict(int)
dic2=defaultdict(int)
for i in data1:
dic1[i]+=1
for i in data2:
dic2[i]+=1
count = 0
for i in dic1:
if i in dic2.keys():
count+=abs(dic2[i]-dic1[i])
result =( (1-count/(len(data1)+len(data2))) *100)
输出
100.0
试试这个代码:
data1 = ['test', 'super', 'class', 'class', 'test', 'boom']
data2 = ['test', 'super', 'class', 'class', 'test', 'boom']
res = 0
nb = (len(data1) + len(data2)) / 2.0
def pos_iter(index, sz):
yield index
i1 = index - 1
i2 = index + 1
while i1 >=0 and i2 < sz:
if i1 >= 0:
yield i1
i1 -=1
if i2 < sz:
yield i2
i2 += 1
if data1 and data2 and nb != 0:
for id1, item1 in enumerate(data1):
for id2 in pos_iter(id1, len(data2)):
item2 = data2[id2]
if item1 == item2:
res += max(0, 1 - abs(id1 - id2) / nb)
break
print(res / nb * 100)
您的代码存在问题,您总是从头开始寻找第二个 data2
中的匹配词。如果单词重复,这会给你无效的值。您需要始终搜索单词在 data1
中的 "around" 位置,因为您想要找到最接近的单词。
此外,您还需要添加中断,否则包含所有相同单词的文本将远远高于 1.0。您的 nb
变量需要加倍(或者 python2 将舍入除法结果)。你应该确保 1 - abs(id1 - id2) / nb
大于零,因此我添加了 max(0, ...)
.