比较使用NLP

问题描述:

我有2句使用NLP在他们的语法的基础上,比较于语法的基础上两句。我对NLP完全陌生,想知道是否有算法来确定这一点。我知道如何使用单词相似性和情感进行比较。比较使用NLP

+3

“比较它们的语法的基础上,” 你可以更多地讨论这一点?也许有一个例子? –

+0

假设我有句话:“我喜欢热狗”和“我的父亲最喜欢的食物是热狗”。现在我想比较这两个句子,他们通过使用NLP就他们的语法有多相似。 –

+0

它仍然不是很清楚,我正是你想要做的,比较有多少常用动词有哪些?或常见的形容词?或依赖性解析结构,结构有多常见? –

您可以使用NLTK WordNet中的同义词集来衡量两句话

这里是如何产生的所有可能的同义词集,而无需指定语法之间的相似性,你可以在以后选择哪一个同义词集使用基于特定标准

import pandas as pd 
import nltk 
from nltk.stem.porter import PorterStemmer 
from nltk.corpus import wordnet as wn 
import itertools 

#use stemmer 
stm = PorterStemmer() 
sent1 = "I like hot dogs" 
sent2 = "My father's favourite food is hot dog" 
#Convert the tag given by nltk.pos_tag to the tag used by wordnet.synsets 
tag_dict = {'N': 'n', 'J': 'a', 'R': 'r', 'V': 'v'} 

s1 = nltk.pos_tag(nltk.word_tokenize(sent1)) 

s1 = dict(filter(lambda x: len(x[1])>0, 
       map(lambda row: (row[0],wn.synsets(
         stm.stem(row[0]), 
         tag_dict[row[1][0]])) if row[1][0] in tag_dict.keys() 
        else (row[0],[]),s1))) 

s2 = nltk.pos_tag(nltk.word_tokenize(sent2)) 

s2 = dict(filter(lambda x: len(x[1])>0, 
       map(lambda row: (row[0],wn.synsets(
          stm.stem(row[0]), 
          tag_dict[row[1][0]])) if row[1][0] in tag_dict.keys() 
        else (row[0],[]),s2))) 

这里是在字典中的值的S1

dogs [Synset('dog.n.01'), Synset('frump.n.01'), Synset('dog.n.03'), Synset('cad.n... 
hot  [Synset('hot.a.01'), Synset('hot.s.02'), Synset('hot.a.03'), Synset('hot.s.0... 
like [Synset('wish.v.02'), Synset('like.v.02'), Synset('like.v.03'), Synset('like... 

样品在这里是一种方法。在这里我测量两个单词的所有可能的同义词之间的相似度,然后取最大值。

res = {} 
for w2,gr2 in s2.items(): 
    for w1,gr1 in s1.items(): 
     tmp = pd.Series(list(map(lambda row: row[1].path_similarity(row[0]), 
           itertools.product(gr1,gr2)))).dropna() 
     if len(tmp)>0: 
      res[(w1,w2)] = tmp.max() 
print(res) 

输出

{('dogs', 'dog'): 1.0, 
('dogs', 'father'): 0.16666666666666666, 
('dogs', 'food'): 0.25, 
('dogs', 'is'): 0.10000000000000001, 
('hot', 'hot'): 1.0, 
('hot', 'is'): 0.33333333333333331, 
('like', 'is'): 0.33333333333333331} 

现在,我们发现最大的相似句子中的每个单词实现。然后取均值

similarity = pd.Series(res).groupby(level=0).max().mean() 
print(similarity) 

输出为.778

以上是常见的方法测量文档相似时。如果你正在寻找比较语法,你可能需要使用部分的语音捉像pos_tag(或使用标注语料像nltk.corpus.brown.tagged_words())上的两个句子,然后找到标签之间的距离捷卡。

+0

不好意思回答迟到,谢谢!这是我需要的东西。我之前使用过synsets,但是用于比较单个单词,不知道如何使用synsets来比较句子。 –