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

标签 python nlp

我正在从事文本分析项目,一次比较两个不同的报告并将结果保存到 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/

相关文章:

python - 最简单的方法来 "store"一个类上的函数而不绑定(bind)它?

python-3.x - python中文本清理/处理的管道

parsing - 从句子中找到有意义的子句子

python - 使用 Wordnet 生成最高级、比较级和形容词

python elasticsearch客户端在创建索引期间设置映射

python_d 2.7 将不会加载 __m2crypto_d.pyd

python - Pandas 数据框 : columns with long names

python - Django Haystack SOLR 中的排序顺序

machine-learning - 使用 LingPipe 进行分层情感分析

python - 海量数据汇总