2017-10-13 10 views
0

J'ai 2 phrases à comparer sur la base de leur grammaire en utilisant la PNL. Je suis complètement nouveau à la PNL et je veux savoir s'il existe un algorithme pour le déterminer. Je sais comment comparer en utilisant la similarité des mots et des sentiments.Comparer deux phrases sur la base de la grammaire en utilisant NLP

+3

"comparer sur la base de leur grammaire" pouvez-vous élaborer un peu plus sur ce sujet? peut-être avec un exemple? –

+0

Supposons que j'ai les phrases: "J'aime les hot-dogs" et "La nourriture préférée de mon père est le hot-dog". Maintenant, je veux comparer ces deux phrases à quel point elles sont similaires en termes de grammaire en utilisant la PNL. –

+0

ce n'est toujours pas clair pour moi ce que vous voulez exactement, comparez combien de verbes communs ils ont? ou des adjectifs communs? ou structure d'analyse de dépendances, quelle est la fréquence de la structure? –

Répondre

0

Vous pouvez utiliser NLTK les synsets de WordNet pour mesurer la similitude entre les deux phrases

voici comment générer tous les synsets possibles sans avoir à spécifier la grammaire, vous pouvez ensuite choisir qui Synsets à utiliser en fonction d'un certain critère

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

Voici un échantillon des valeurs dans le dictionnaire 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... 

Voici une façon. ici je mesure la similarité entre tous les synsets possibles de deux mots puis prends le maximum.

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) 

Sortie

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

Maintenant, nous trouvons la similitude max chaque mot dans une phrase à atteindre. puis prendre la moyenne

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

la sortie est .778

Ce qui précède est l'approche commune lors de la mesure de similarité des documents. Si vous cherchez à comparer la grammaire, vous pouvez utiliser un tagueur de partie du discours comme pos_tag (ou en utilisant un corpus étiqueté comme nltk.corpus.brown.tagged_words()) sur les deux phrases puis trouver la distance Jaccard entre les balises.

+0

Désolé de répondre tard et merci! C'est quelque chose dont j'avais besoin. J'ai utilisé des synsets auparavant, mais pour comparer des mots individuels, je ne savais pas comment utiliser les synsets pour comparer des phrases. –