2010-06-05 16 views
2

Le problème est que j'ai des noms qui peuvent contenir des espaces blancs. Donc, ma contribution pourrait ressembler à ceci. Tout d'abord, une liste de noms:ambiguïté de pypars

Joe 
bob 
Jimmy X 
grjiaer-rreaijgr Y 

Ensuite, les choses qu'ils font:

Joe A 
bob B 
Jimmy X C 

le problème est bien sûr qu'une chose qu'ils font peut être la même que la fin du nom:

Comment est-ce que je peux créer un analyseur pour les lignes d'action?
Jimmy X X 
grjiaer-rreaijgr Y Y 

Comment est-ce que je peux créer un analyseur pour les lignes d'action? La sortie de l'analyse Joe A doit être [Joe, A]. La sortie de l'analyse Jimmy X C doit être [Jimmy X, C], de Jimmy X X - [Jimmy X, X]. C'est, [name, action] paires.

Si je crée mon analyseur de nom naïvement, ce qui signifie quelque chose comme OneOrMore(RegEx("\S*")), il correspondra à la ligne entière me donner [Jimmy X X] suivie d'une erreur d'analyse pour ne pas voir une action (car il était déjà consommé par l'analyseur de nom).

NOTE: Désolé pour le phrasé ambigu précédemment fait que cela ressemble à une question de la PNL.

+0

les noms toujours activés, et est le verbe toujours en minuscules? – FMc

+0

non, les noms peuvent avoir n'importe quoi alphanumérique. Un nom pourrait même être "jimmy foo décide", alors la ligne montrerait "jimmy foo décide de manger." – Claudiu

+0

J'ai à peu près besoin de correspondance non-gourmande du nom – Claudiu

Répondre

1

Amusez-vous:

from pyparsing import Regex, oneOf 

THE_NAMES = \ 
"""Joe 
bob 
Jimmy X 
grjiaer-rreaijgr Y 
""" 

THE_THINGS_THEY_DO = \ 
"""Joe A 
bob B 
Jimmy X C 
Jimmy X X 
grjiaer-rreaijgr Y Y 
""" 

ACTION = Regex('.*') 
NAMES = THE_NAMES.splitlines() 
print NAMES 
GRAMMAR = oneOf(NAMES) + ACTION  
for line in THE_THINGS_THEY_DO.splitlines(): 
    print GRAMMAR.parseString(line) 
+0

Eh oui, c'est l'approche que j'aurais finalement utilisé si j'avais continué de cette façon. le problème, j'ai réalisé plus tard, est que parfois il y a des noms apparaissant dans la liste des actions qui n'apparaissent pas en haut – Claudiu

+0

Veuillez ajouter un exemple. De votre description, un élément de liste d'actions peut être "Tal Holech Lishon", auquel cas vous devrez deviner si "Holech" est le nom de Tal, ou "Holech Lishon" une action dont vous n'avez jamais entendu parler auparavant. –

+0

Je suis passé de ceci pour l'instant, mais la règle est: Je sais toujours ce qu'est une action possible, mais je ne sais pas ce que tous les noms sont. donc en termes de technique non-pypars, je pourrais techniquement effectuer une recherche inversée sur chaque ligne pour chaque action possible, et si j'en trouvais une, je saurais que tout ce qui se trouve à sa gauche est un nom. mais comment encoder cela dans pyparsing? – Claudiu

2

Vous avez besoin de beaucoup plus qu'un simple analyseur. Les analyseurs utilisent les symboles d'une chaîne pour définir quelles parties de la chaîne représentent différents éléments d'une grammaire. C'est pourquoi FM a demandé un indice pour savoir comment vous savez quelle partie est le nom et quelle partie est le reste de la phrase. Si vous pouvez dire que les noms sont composés d'un ou de plusieurs mots en majuscules, alors l'analyseur sait quand le nom s'arrête et le reste de la phrase commence.

Mais un nom comme "jimmy foo décide"? Comment l'analyseur peut-il savoir juste en regardant les symboles dans "décide" si "décide" est ou ne fait pas partie du nom? Même un humain lisant votre phrase "décide de manger" aurait du mal à déterminer où le nom commence ou s'arrête, et s'il s'agissait d'une sorte de faute de frappe.

Si votre entrée est vraiment imprévisible, vous devez utiliser un outil tel que le NLTK (Natural Language Toolkit). Je ne l'ai pas utilisé moi-même, mais il aborde ce problème du point de vue de l'analyse des phrases dans une langue, par opposition à essayer d'analyser des données structurées ou des formats mathématiques.

Je ne recommanderais pas pyparsing pour ce genre d'interprétation de la langue.

+0

ce n'est pas si imprévisible, il n'y a que 3-4 phrases possibles, et ils tous ont une fin littérale (par exemple, "décide de manger", "va au marché"). Je peux analyser cela normalement en faisant simplement str.split() sur l'expression "décide de manger" et en regardant le nom. Je veux juste voir comment le faire avec souplesse de pyparsing – Claudiu

+0

je vais modifier la question pour rendre plus clair – Claudiu

0

On dirait que vous avez besoin de nltk, pas de pyparsing. On dirait que vous avez besoin d'un problème traitable pour travailler. Comment savez-vous comment analyser «jimmy foo décide décide de manger»? Quelles règles utilisez-vous pour déduire (contrairement à ce que la plupart des gens supposeraient) que "décide décide" n'est pas une faute de frappe? Re "noms qui peuvent contenir des espaces": Premièrement, j'espère que vous normaliser cela dans un espace. Deuxièmement: c'est inattendu? Troisièmement: les noms peuvent contenir des apostrophes et des traits d'union (O'Brien, Montagu-Douglas-Scott) et peuvent avoir des composantes qui ne sont pas capitalisées, par ex. Georg von und zu Hohenlohe) et nous ne mentionnerons pas Unicode.

+0

tirets et autres symboles sont bien. si le nom n'avait pas d'espace, je pourrais juste l'analyser avec un Regex (\ S +) et en finir avec lui. l'espace complique le problème car il sépare également le nom du reste de la phrase. – Claudiu