如何使用python获取关键字和段落之间的相似度(PMI)分数



我正在做一个从客户评论中提取关键词的项目。我设法利用主题建模技术提取了关键词。

现在我正在python中寻找一种技术或算法,根据关键词之间的相似性对评论进行排名。

例如:对于关键字"美味的食物">,我想获得以下评论的相似性分数。

得分
评审
这个地方很贵,但他们的食物很美味 0.7
我不建议去这个地方闲逛 0.0
这是一个非常干净友好的地方,也许,食物不是那么美味 0.2

我有一个这样做的方法,但它很复杂,所以我只展示它,然后再进行检查。这是:

sentences = ["this is place is costly but their food is delicious", "This is place is very clean and friendly, perhaps, food is not so great!", "I would not recommend this place for hangout."]
search = "food delicious"
count = 0
lst = []
for sentence in sentences:
if search in sentence:
lst.append([sentence, 1])
else:
for word in search.split():
if word in sentence:
count += 1
lst.append([sentence, max(round(count / len(search.split()) - 0.3, 1), 0)])
count = 0
for i in lst:
print(*i)

这将提供您想要的输出。

基本上,第一行将评论放入一个数组中。第二行创建一个名为search的变量,其中包含关键字。

现在,在那之后,我们需要创建两个变量,分别称为count、count和lst。Lst将是我们用来存储信息的列表,count是我们稍后需要的计数器。

在第7行,我们开始一个for循环,它将一个接一个地循环句子。

在第8行中,我们检查句子中是否有确切的关键字短语,因此如果"food delicious";出现在句子的某个地方。如果是,那么我们将该句子及其PMI得分1添加到我们之前创建的列表中。

注意:(表中没有说明这是需要的,所以如果不是,那么你可以删除它!(

因此,接下来,我们使用else:来表明,如果句子中的直接关键字短语是而不是,那么我们需要做其他事情来获得PMI分数。如果我们没有这个else:,那么它可能会导致以后的重复。

在第11行中,它启动了另一个for循环,但这一次,它将遍历search.split()中的每个单词。search.split()只生成一个搜索词列表,用空格分隔它们。例如,在这里,search.split()将是["food", "delicious"]。现在,我们正在遍历这个列表。

现在,在第12行,我们检查我们正在循环的当前单词是否在我们正在循环中的当前句子中,如果这有意义的话。如果单词是,那么我们之前创建的名为count的变量将增加该单词在句子中出现的次数,或该单词的count。CCD_ 10将针对每个字递增。

注意:这意味着,如果一个单词,例如食物,出现二十次,计算机仍然会表现得好像只出现一次一样。。为了避免这种情况,您可以将count += 1更改为count += sentence.count(word),这将计算单词在句子中的每一次出现次数。

现在,在search.split()for循环结束后,我们需要将计数添加到列表中。这里来了一些数学的东西。首先,我们将计数除以search.split(),得到search变量中出现的单词数量的小数百分比(小于1(。然而,这引发了一个问题。如果出现了2个单词,并且search变量中有2个词,那么我们将执行2/2,即1。我们不想要1,我们想要0.7。因此,我们还需要从我们的数字中减去0.3。我四舍五入了这个值,因为它最终可能会在划分中变得相当混乱。

现在,我们在lst.append()行中还有最后一个问题。如果句子中有0个单词,但search变量中有2个单词,那么我们将执行0/2,即0。这就是我们想要的,但是,我们减去0.3。这使我们-0.3/为了避免这种情况,我们可以将max()设置为0。

最后,紧接着,我们将count重置为0,这样下一句话就可以从新的计数开始,以避免任何统计错误。

仅此而已!为了打印它,我只是在末尾使用了一个小的for循环,但你不需要它。

这些是我的结果:

this is place is costly but their food is delicious 0.7
This is place is very clean and friendly, perhaps, food is not so great! 0.2
I would not recommend this place for hangout. 0

p.S:(最后一行print()中的*i只是从打印值中删除了括号和逗号。它不会以任何方式更改列表本身。(

我知道这很长,但重要的是要阅读所有内容,以理解每一行的要点。

最新更新