Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用python获得关键字和段落之间的相似性(PMI)分数?_Python_Nlp_Similarity_Topic Modeling - Fatal编程技术网

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

如何使用python获得关键字和段落之间的相似性(PMI)分数?,python,nlp,similarity,topic-modeling,Python,Nlp,Similarity,Topic Modeling,我正在做一个从客户评论中提取关键词的项目。我设法用主题建模技术提取关键词 现在,我正在寻找python中的一种技术或算法,根据关键字之间的相似性对评论进行排序 例如: 对于关键词“美味食品”,我想获得评论的相似性分数,如下所示 回顾 分数 这地方很贵,但他们的食物很好吃 0.7 我不推荐这个地方出去玩。 0 这是一个非常干净和友好的地方,也许,食物不是很好! 0.2 我有一个方法来做这件事,但它很复杂,所以我会展示它,然后再看。这是: 句子=[“这是一个昂贵的地方,但他们的食物很美味”,“这是一

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

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

例如: 对于关键词“美味食品”,我想获得评论的相似性分数,如下所示

回顾 分数 这地方很贵,但他们的食物很好吃 0.7 我不推荐这个地方出去玩。 0 这是一个非常干净和友好的地方,也许,食物不是很好! 0.2
我有一个方法来做这件事,但它很复杂,所以我会展示它,然后再看。这是:

句子=[“这是一个昂贵的地方,但他们的食物很美味”,“这是一个非常干净友好的地方,也许,食物不太好!”,“我不推荐这个地方出去玩。”]
search=“美食”
计数=0
lst=[]
对于句子中的句子:
如果在句子中搜索:
附加([句子,1])
其他:
对于搜索中的单词。拆分()
如果单词在句子中:
计数+=1
第一个附加([句子,最大值(整数(count/len(search.split())-0.3,1,0)])
计数=0
对于lst中的i:
打印(*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
<代码>计数将为每个单词递增

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

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

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

最后,紧接着,我们将
计数重置为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
注意:(最后一行的
print()
中的
*i
只删除了打印值中的括号和逗号。它不会以任何方式更改列表本身。)


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

出于好奇,这是干什么用的?