我收集了一些关于某种疾病的报纸文章(没有标签,只是原始的文章)。我也有三组手动选择的与疾病相关的关键字,例如:phase-1,phase-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计算一组关键词和新闻文章之间的相似度?
发布于 2020-07-21 09:13:24
您可以为这样的任务定义各种相似性度量。然后你可以去看看哪一个效果最好。以下是一些想法:
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.)我还建议尝试基于单词Mover's Distance (WMD)的更高级的方法。为此,您需要在某个向量空间中表示您的单词(例如,通过word2vec模型获得)。然后,您可以将一篇新闻文章和一个列表表示为该空间中的向量集合。度量标准衡量两种表示的不同程度(您必须移动多少表示才能匹配另一种表示)。距离越小,两种表示法越相似。
您可以根据新闻文章训练您的word2vec模型。我建议使用gensim来训练模型,并在以后评估单词mover的距离。
https://radimrehurek.com/gensim/auto_examples/tutorials/run_wmd.html
它不能保证能工作,但我会试一试。在我的经验中,WMD通常比余弦距离更好,但这当然取决于应用程序。
这两种方法还取决于您预先进行的文本处理。在评估指标/训练word2vec模型之前,请确保您的新闻文章采用您期望的格式。
发布于 2020-07-21 02:36:44
在命名列表时,我不建议使用破折号或其他顶部字符。我希望这能有所帮助:
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)https://stackoverflow.com/questions/63001234
复制相似问题