Python 2.7 使用NLP在语法的基础上比较两个句子
我有两个句子要根据它们的语法使用NLP进行比较。我对NLP完全陌生,我想知道是否有一种算法可以确定这一点。我知道如何使用单词相似性和情感进行比较。你可以使用nltk wordnet的语法集来衡量两个句子之间的相似性 下面是如何在不指定语法的情况下生成所有可能的语法集,您可以稍后根据特定标准选择要使用的语法集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
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比较这两个句子在语法上有多相似。我还不清楚你到底想要什么,比较它们有多少常用动词?还是常见的形容词?或者依赖解析结构,这个结构有多常见?我没有考虑结构,但是现在你提到了这个结构,我将尝试一下。您的任何帮助都将非常有用。很抱歉这么晚才回复,谢谢!这是我需要的东西。我以前使用过语法集,但用于比较单个单词,不知道如何使用语法集来比较句子。