计算文档和特定关键字之间的相似度

2024-10-03 06:22:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一份关于疾病的报纸(未贴标签,只是原始文章)收藏。我还有三组手动选择的与疾病相关的关键词,例如:phase-1phase-2等等,如下所示

phase_1 = ["symptoms","signs","fever","ache","vomit","blood","headache","fatigue","breath"]

phase_2 = ["pathogen","flavivirus","swamp","virus","contagious","mosquito bite","virus","agent","host"]

是否有任何方法可以使用PYTHON计算一组关键字和新闻文章之间的相似性


Tags: 文章手动关键词fever疾病报纸phasevirus
2条回答

在命名列表时,我不建议使用破折号或其他顶部字符。我希望这有助于:

phase_1 =  ["symptoms","signs","fever","ache","vomit","blood","headache","fatigue","breath"]

phase_2 = ["pathogen","flavivirus","swamp","virus","contagious","mosquito bite","virus","agent","host"]

# Performing the calculations
res = len(set(phase_1) & set(phase_2))
res2 = res / float(len(set(phase_1) | set(phase_2))) * 100

# Showing the results
msg = "The percentage of smilarity between the 2 lists is:"
print(msg, res2)

您可以为此类任务定义各种相似性度量。然后你可以去看看哪一个效果最好。以下是一些想法:

1.)正如Max在文章中指出的,您可以计算文档和两个列表之间的Jaccard索引。Jaccard索引定义为两个项目的并集除以的交点:

set1 = set(news_article.split())
set2 = set(phase_1)

jcc = len(set1.intersection(set2)) / len(set1.union(set2))

jaccard索引越高,文本与列表越相似。然而,Jaccard索引只有在您的新闻文章完全包含您在列表中定义的单词时才起作用。如果文本包含语义相似但与列表中不同的单词,则jaccard索引仍为0,即使其中包含相似的单词

2.)我还建议尝试一种基于移动距离(WMD)的稍微高级的方法。为此,您需要在一些向量空间中表示您的单词(例如,通过word2vec模型获得)。然后,您可以将一篇新闻文章和一个列表表示为该空间中的向量集合。该度量度量度量两个表示的不同程度(移动一个表示以匹配另一个表示的程度)。距离越小,两种表示形式越相似

您可以在新闻文章中训练word2vec模型。我建议使用gensim来训练模型,然后评估单词移动者的距离

https://radimrehurek.com/gensim/auto_examples/tutorials/run_wmd.html

这不一定能奏效,但我会试试看。根据我的经验,WMD通常比余弦距离更有效,但这当然取决于应用

这两种方法还取决于您事先进行的文本处理。在评估指标/培训word2vec模型之前,确保您的新闻文章采用您期望的格式

相关问题 更多 >