gpt4 book ai didi

python - 如何比较两个大文本之间的度量 - Python 中的余弦、Jaccard 相似性、Sim_MinEdit (Sim_String) 和 Sim_Simple

转载 作者:行者123 更新时间:2023-11-28 17:08:59 28 4
gpt4 key购买 nike

我正在从事文本分析项目,一次比较两个不同的报告并将结果保存到 pandas 数据框中。

我能够得到 cosine 和 jacard 的相似性,但需要确保我得到正确的度量。作为参数,我使用位于给定文件夹中的文件名。

对于 cosine_sim,我使用以下代码:

import re, math
from collections import Counter

WORD = re.compile(r'\w+')

def text_to_vector(text):
words = WORD.findall(text)
return Counter(words)

def get_cosine(file1, file2):
t1 = file(Input_path+'/'+file1).read().replace('\n',' ')
t2 = file(Input_path+'/'+file2).read().replace('\n',' ')
vec1 = text_to_vector(t1)
vec2 = text_to_vector(t2)

intersection = set(vec1.keys()) & set(vec2.keys())
numerator = sum([vec1[x] * vec2[x] for x in intersection])
sum1 = sum([vec1[x]**2 for x in vec1.keys()])
sum2 = sum([vec2[x]**2 for x in vec2.keys()])
denominator = math.sqrt(sum1) * math.sqrt(sum2)
if not denominator:
return 0.0
else:
return float(numerator) / denominator

对于 Jaccard,我得到了以下信息:

def get_jaccard(file1, file2):
t1 = file(Input_path+'/'+file1).read().replace('\n',' ')
t2 = file(Input_path+'/'+file2).read().replace('\n',' ')
vec1 = text_to_vector(t1)
vec2 = text_to_vector(t2)

numerator = len(set(vec1.keys()).intersection(set(vec2.keys())))
denominator = float(len(set(vec1.keys())) + len(set(vec2.keys())) -numerator)

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

结果在小字符串示例上工作正常,但我不确定它们在大测试文件上是否正确,尤其是 Jaccard,因为我的结果与 distance.jaccard 有点不同(我使用列表来提供它,而不是字典)

关于其他指标,请确认 sim_simple 可以使用以下方法计算:

from difflib import SequenceMatcher

def similar(file1, file2):
s1 = file(Input_path+'/'+file1).read().replace('\n',' ')
s2 = file(Input_path+'/'+file2).read().replace('\n',' ')
list1 = list(set(text_to_list(s1)))
list2 = list(set(text_to_list(s2)))
return SequenceMatcher(None, list1, list2).ratio()

我不确定 Sim_string(最少编辑)。这就像 Levenshtein 距离,但在单词级别,我不确定 distance.levenshtein 是否有帮助。

能否请您帮我测试一下我得到的指标,并建议将什么用于 Sim_string。

非常感谢!!!

最佳答案

由于没有提及切换单词位置(我在评论部分添加了实际客户的请求),因此我创建了以下过程。我确信它可以被优化,但它对客户来说效果很好。请注意,text_to_vector 过程是在原始问题文本中定义的。我希望我的帖子对某些人有所帮助。

def Sim_MinEdit(file1, file2):
s1 = file(Input_path+'/'+file1).read().replace('\n',' ')
s2 = file(Input_path+'/'+file2).read().replace('\n',' ')
dict1 = text_to_vector(s1)
dict2 = text_to_vector(s2)
dict_diff_1_2 = {k : dict2[k] for k in set(dict2) - set(dict1)}
dict_diff_2_1 = {k : dict1[k] for k in set(dict1) - set(dict2)}
dict_comm_1_2 = {k : abs(dict2[k] - dict1[k]) for k in
set(dict2).intersection(set(dict1))}
numerator = sum(dict_diff_1_2.values()) + sum(dict_diff_2_1.values()) +
sum(dict_comm_1_2.values())
denominator = sum(dict1.values()) + sum(dict2.values())
if not denominator:
return 0.0
else:
return 1 - (float(numerator) / denominator)

关于python - 如何比较两个大文本之间的度量 - Python 中的余弦、Jaccard 相似性、Sim_MinEdit (Sim_String) 和 Sim_Simple,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49035812/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com