2017-10-13 3 views
0

NLP를 사용하여 문법을 기준으로 비교할 문장이 두 개 있습니다. 나는 NLP에 완전히 익숙하지 않으며 이것을 결정하는 알고리즘이 있는지 알고 싶습니다. 나는 단어 유사성과 감정을 사용하여 비교하는 방법을 안다.NLP를 사용하여 두 문장 비교하기

+3

"문법을 기준으로 비교하십시오" 좀 더 자세히 설명해 주시겠습니까? 어쩌면 예를 들어? –

+0

"나는 핫도그를 좋아해요" "내 아버지가 좋아하는 음식은 핫도그"라고 가정 해 봅시다. 이제이 두 문장을 NLP를 사용하여 문법의 측면에서 얼마나 유사한 지 비교하고 싶습니다. –

+0

정확히 무엇이 필요한지 나에게 명확하지 않다. 얼마나 많은 동사가 있는지 비교해 보라. 또는 일반적인 형용사? 또는 의존성 분석 구조, 얼마나 일반적인 구조입니까? –

답변

0

당신은 나중에 특정 기준

에 따라 사용할 synset을 선택할 수 있습니다, 두 문장

여기

문법을 지정하지 않고도 가능한 모든 synset을을 생성하는 방법이다 사이의 유사성을 측정하기 위해 워드 넷의 synset을을 NLTK 사용할 수 있습니다 여기

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

여기 한 방법

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 사전있는 숫자 샘플이다. 여기서는 두 단어의 가능한 모든 syn 집합 사이의 유사성을 측정 한 다음 최대 값을 취합니다.

{('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() 같은 태그가 지정된 코퍼스를 사용)를 사용하여 태그 사이의 Jaccard 거리를 찾으십시오.

+0

늦게 답장을 드려 죄송합니다. 감사합니다. 이것은 내가 필요한 것입니다. 이전에 synsets를 사용했지만 개별 단어를 비교하기 위해 synsets을 사용하여 문장을 비교하는 방법을 알지 못했습니다. –

관련 문제