在 Pandas 中检查字符串相似性需要很长时间

Check string similarities in Pandas takes a very long time

提问人:Gogo 提问时间:10/27/2023 最后编辑:halferGogo 更新时间:10/30/2023 访问量:59

问:

我想修改我的代码,使其运行得更快。我以前从未使用过发电机,也不知道怎么做。

我修改了我的代码,但仍然没有进展:

def shortest_word_version(my_list):
    similar_words_concat=[]
    for i in my_list:
        similarity_ratio=(SequenceMatcher(a= w[0], b=i[0] ).ratio() for w in my_list)
        high_similarity_indices=(i for i,v in enumerate(similarity_ratio) if v >= .7)
        similar_words = min(((''.join(my_list[j]) for j in high_similarity_indices)), key=len)
        similar_words_concat.append(similar_words)
    return similar_words_concat

我想检查列表中的所有字符串,对相似的字符串进行分组,并将它们全部替换为最短的对应字符串。

ex. ['adjust' , 'adjustment' , 'pear', 'lemon' , 'commitment', 'commit']

应该返回

['adjust' , 'adjust' , 'pear', 'lemon' , 'commit', 'commit']

当列表相当短时,我的代码可以正常工作,但是当我的方法的参数是具有 7000+ 个元素的 Pandas 列时,它需要很长时间并且永远无法看到结果。

如何更改我的代码以确保它及时运行更大的列表?

from difflib import SequenceMatcher
l1=['adjust' , 'adjustment' , 'pear', 'lemon' , 'commitment', 'commit']

def shortest_word_version(my_list):
    similar_words_concat=[]
    for i in my_list:
        similarity_ratio=[SequenceMatcher(a= w[0], b=i[0] ).ratio() for w in my_list]
        high_similarity_indices=[i for i,v in enumerate(similarity_ratio) if v >= .7]
        similar_words = min(([''.join(my_list[j]) for j in high_similarity_indices]), key=len)
        similar_words_concat.append(similar_words)
    return(similar_words_concat)

print(shortest_word_version(l1)) # prints correct result
python pandas 字符串 时间

评论

1赞 mozway 10/27/2023
你能给出“相似的”的明确定义吗?它应该是同一个前缀吗?
0赞 Gogo 10/27/2023
如上例所示,像“调整”这样的词包含位于同一列表中的“调整”。这些词至少有 70% 的相似度。这是单词需要遵循的标准。类似地,“commit”和“commitment”这两个词也遵循这条规则,因为“commit”是“commitment”一词的子字符串,占据了“commitment”的70%以上
0赞 OM222O 10/27/2023
如果检查自己的代码,SequenceMatcher 的输出似乎是二进制(0 或 1),而不是比率。这是预期行为吗?此外,此代码使用 O(n^2) 内存,在处理 N^2 算法时切换到使用生成器以减少不必要的内存使用
0赞 Gogo 10/27/2023
你是对的,比例不应该是二进制的,但是如果你将所有元素包装到子列表中 l1=[['adjust'] , ['adjustment'] ,[ 'pear'], ['lemon'] , ['commitment'],[ 'commit']] 你就会得到适当的比率值。当你提到 O(n^2) 和如何使用生成器时,恐怕我没有关注你。你能给我举个例子吗?

答: 暂无答案