2016-11-16 1 views
4

Je suis en train d'analyser des phrases de violation de la circulation à l'aide pyparsing, quand je l'utilise grammar.searchString(sentence) il est ok, mais quand je l'utilise parseString un ParseException est jeté. Quelqu'un peut-il m'aider à dire ce qui ne va pas avec mon code?pyparsing.ParseException lors de l'utilisation parseString (searchString fonctionne)

from pyparsing import Or, Literal, oneOf, OneOrMore, nums, alphas, Regex, Word, \ 
    SkipTo, LineEnd, originalTextFor, Optional, ZeroOrMore, Keyword, Group 
import pyparsing as pp 

from nltk.tag import pos_tag 

sentences = ['Failure to control vehicle speed on highway to avoid collision','Failure to stop at stop sign', 'Introducing additives into special fuel by unauthorized person and contrary to regulations', 'driver fail to stop at yield sign at nearest pointf approaching traffic view when req. for safety', 'Operating unregistered motor vehicle on highway', 'Exceeding maximum speed: 39 MPH in a posted 30 MPH zone'] 


for sentence in sentences: 
    words = pos_tag(sentence.split()) 
    #print words 
    verbs = [word for word, pos in words if pos in ['VB','VBD','VBG']] 
    nouns = [word for word, pos in words if pos == 'NN'] 
    adjectives = [word for word, pos in words if pos == 'JJ'] 

    adjectives.append('great') # initializing 
    verbs.append('get') # initializing 


    object_generator = oneOf('for to') 
    location_generator = oneOf('at in into on onto over within') 
    speed_generator = oneOf('MPH KM/H') 

    noun = oneOf(nouns) 
    adjective = oneOf(adjectives) 

    location = location_generator + pp.Group(Optional(adjective) + noun) 

    action = oneOf(verbs) 
    speed = Word(nums) + speed_generator 

    grammar = action | location | speed 

    parsed = grammar.parseString(sentence) 

    print parsed 

Erreur retraçage

retraçage (appel le plus récent en dernier): Fichier "script3.py", ligne 35, parsage = grammar.parseString (phrase) Fichier «/Users/Alana/Anaconda /lib/python2.7/site-packages/pyparsing .py ", ligne 1032, dans parseString raise exc pyparsing.ParseException: Attendu Re :('control | avoid | get') (au char 0), (ligne: 1 , col: 1)

+0

S'il vous plaît, ajouter toute erreur retraçage à votre poste. – kvorobiev

+0

retraçage (appel le plus récent en dernier): Fichier "script3.py", ligne 35, dans location_parsed = location.parseString (phrase) fichier « /Users/alana/anaconda/lib/python2.7/site-packages /pyparsing.py ", ligne 1032, dans parseString relance exc pyparsing.ParseException: attendu Re :('à | dans | dans | sur | sur | sur | dans') (à 0), (ligne: 1, col: 1) –

+0

Je ne vois pas la ligne 'location_parsed = location.parseString (phrase)' dans votre code. Fournir des sources où l'exception a été levée. – kvorobiev

Répondre

2

searchString fonctionne parce qu'il ignore le texte qui ne correspond pas exactement au e grammaire. parseString est beaucoup plus particulier, nécessitant une correspondance grammaticale complète, commençant à droite avec le premier caractère de la chaîne d'entrée. Dans votre cas, la grammaire est un peu difficile à déterminer, car elle est générée automatiquement à partir de l'analyse NLTK de la phrase d'entrée (une approche intéressante, btw). Si vous imprimez simplement la grammaire elle-même, il peut vous donner un aperçu de ce que les chaînes qu'il recherche. Par exemple, je suppose que NLTK interprétera 'Failure' dans votre premier exemple en tant que nom, mais aucune de vos 3 expressions dans votre grammaire ne commence par un nom - par conséquent, parseString échouera.

Vous aurez probablement besoin de faire beaucoup plus d'impression interne des listes de noms, d'adjectifs et de verbes en fonction de ce que trouve NLTK, puis de voir comment cela correspond à votre grammaire générée.

Vous pouvez également essayer de combiner les résultats de plusieurs correspondances dans la phrase en utilisant la somme de Python() builtin:

grammar = action("action") | Group(location)("location") | Group(speed)("speed") 

#parsed = grammar.parseString(sentence) 
parsed = sum(grammar.searchString(sentence)) 
print(parsed.dump()) 
+0

Cela a fonctionné parfaitement! Juste ce dont j'avais besoin pour aller de l'avant avec mon projet. Merci beaucoup!! –