Python 2.7 使用NLP在语法的基础上比较两个句子

Python 2.7 使用NLP在语法的基础上比较两个句子,python-2.7,nlp,nltk,Python 2.7,Nlp,Nltk,我有两个句子要根据它们的语法使用NLP进行比较。我对NLP完全陌生,我想知道是否有一种算法可以确定这一点。我知道如何使用单词相似性和情感进行比较。你可以使用nltk wordnet的语法集来衡量两个句子之间的相似性 下面是如何在不指定语法的情况下生成所有可能的语法集,您可以稍后根据特定标准选择要使用的语法集 import pandas as pd import nltk from nltk.stem.porter import PorterStemmer from nltk.corpus imp

我有两个句子要根据它们的语法使用NLP进行比较。我对NLP完全陌生,我想知道是否有一种算法可以确定这一点。我知道如何使用单词相似性和情感进行比较。

你可以使用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_标记(或使用标记语料库,如
nltk.corpus.brown.tagged_words()
),然后找出标记之间的Jaccard距离。

“根据语法进行比较”你能详细说明一下吗?也许举个例子吧?假设我有这样的句子:“我喜欢热狗”和“我父亲最喜欢的食物是热狗”。现在我想用NLP比较这两个句子在语法上有多相似。我还不清楚你到底想要什么,比较它们有多少常用动词?还是常见的形容词?或者依赖解析结构,这个结构有多常见?我没有考虑结构,但是现在你提到了这个结构,我将尝试一下。您的任何帮助都将非常有用。很抱歉这么晚才回复,谢谢!这是我需要的东西。我以前使用过语法集,但用于比较单个单词,不知道如何使用语法集来比较句子。