python - 文本相似性方法不反映文本之间的“真实”相似性
问题描述
我正在将 CV 的内容(已删除停用词的 .txt 文件)与真正紧凑的职位描述 (JD) 进行比较,如下所示:
项目管理、领导力、销售、SAP、市场营销
简历大约有 600 个单词,而 JD 则只有上面突出显示的单词。
我目前遇到的问题,我确信这是由于我缺乏知识,当我对其应用相似性度量时,我得到了令人困惑的结果。例如,我的 CV 编号 1 包含 JD 中的所有单词,有时重复不止一次。我也有 CV 2,与 JD相比,它只包含项目一词。尽管如此,当我应用余弦相似度、差异、杰卡德距离和编辑距离时,所有这些度量都返回给我 CV2 和 JD 之间更高程度的相似性,这对我来说很奇怪,因为它们之间只有一个词是相等的,而CV1拥有JD的所有单词。
我使用了错误的措施来评估相似性?如果这是一个幼稚的问题,我很抱歉,我是编程初学者。
代码如下
差异
from difflib import SequenceMatcher
def similar(a, b):
return SequenceMatcher(None, a, b).ratio()
similar('job.txt','LucasQuadros.txt')
0.43478260869565216
similar('job.txt','BrunaA.Fernandes.txt')
0.2962962962962963
余弦
from sklearn.feature_extraction.text import TfidfVectorizer
document= ('job.txt','LucasQuadros.txt','BrunaA.Fernandes')
tfidf = TfidfVectorizer().fit_transform(document)
matrix= tfidf * tfidf.T
matrix.todense()
matrix([[1. , 0.36644682, 0. ],
[0.36644682, 1. , 0. ],
[0. , 0. , 1. ]])
编辑距离
import nltk
w1= ('job.txt')
w2= ('LucasQuadros.txt')
w3= ('BrunaA.Fernandes.txt')
nltk.edit_distance(w1,w2)
11
nltk.edit_distance(w1,w3)
16
杰卡德距离
import nltk
a1= set('job.txt')
a2= set('LucasQuadros.txt')
a3= set('BrunaA.Fernandes.txt')
nltk.jaccard_distance(a1,a2)
0.7142857142857143
nltk.jaccard_distance(a1,a3)
0.8125
正如你们所看到的,'LucasQuadros.txt'(CV1)与'job.txt'(职位描述)具有更高的相似性,即使它只包含职位描述中的一个词。
解决方案
我已经意识到我做错了什么。当我编写如下代码行时,我将单词“job.txt”与“LucasQuadros.txt”进行比较,而不是文档本身。
similar('job.txt','LucasQuadros.txt')
为了改变这一点,我只是在我的代码中包含了 .read 函数:
jd = open('job.txt')
jd = jd.read()
cv1= ('LucasQuadros.txt')
cv1= cv1.read()
from difflib import SequenceMatcher
def similar(a, b):
return SequenceMatcher(None, a, b).ratio()
similar(jd, cv1)
0.0
similar(jd,cv2)
0.007104795737122558
现在相似性是正确的。正如我上面所说,这是一个非常初学者的错误。
推荐阅读
- windows - 批处理文件:如何在命令本身需要引号时双引号 /C
- keras - 当 return_state 和 return_sequences 为 false 时 lstm 返回什么
- github - 如何在 git 保护分支中将用户例外添加到“合并前需要拉取请求审查”选项?
- c# - Automapper ConstructUsing 方法不起作用
- javascript - How to map two objects into an array of objects in Angular?
- coq - 卡住了无法证明的子目标的证明引理
- elasticsearch - Logstash 2.3.4 如何使用logstash-jdbc插件在elasticsearch中加载嵌套文档
- azure - 如何以编程方式接受用于 sendgrid 青铜帐户的 ARM 模板的市场条款
- machine-learning - 如何在训练期间使用 lambda 函数更改层的激活
- angular - 将正则表达式从 json 绑定到打字稿