2017-10-13 3 views
0

NLPを使用して文法に基づいて比較する2つの文があります。私はNLPを全く新しくしており、これを決定するアルゴリズムがあるかどうかを知りたいと思っています。私は、単語の類似性と感情を使って比較する方法を知っています。NLPを使用して文法に基づいて2つの文を比較する

+3

「彼らの文法に基づいて比較する」 もう少し詳しいことを教えてください。多分例を挙げて? –

+0

私は「私はホットドッグが好きです」と「私の父の好きな食べ物はホットドッグです」という文章があるとします。今度は、これら2つの文章を、NLPを使って文法の面でどれほど似ているかを比較したいと思います。 –

+0

あなたは何をよく知っているのですか?または一般的な形容詞ですか?または依存関係の構文解析の構造、構造の共通性 –

答えて

0

あなたはここに2つの文

間の類似性を測定するためNLTKのWordNetののsynsetを使用することができますが、文法を指定することなく、すべての可能なのsynsetを生成する方法で、後で特定の基準に基づいて使用するのsynsetを選択でき

ここで
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))) 

は、ここに1つの方法です

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... 

S1辞書内の値のサンプルです。ここでは、2つの単語のすべての可能なsynsetの間の類似性を測定し、最大値を取る。

{('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} 

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) 

出力は、今、私たちは、文中の各単語が達成最大の類似性を見つけます。その後、平均を取る

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

出力は文書の類似性を測定する場合.778

上記の一般的なアプローチです。文法を比較しようとしている場合は、pos_tag(またはnltk.corpus.brown.tagged_words()のようなタグ付きコーパスを両方のセンテンスのようなA品詞タグを使用して、タグ間のJaccard距離を見つけることができます。

+0

ご返信ありがとうございます、ありがとうございます!これは私が必要なものです。以前はsynsetを使っていましたが、個々の単語を比較するために、synsetを使って文を比較する方法はわかりませんでした。 –

関連する問題