2010-02-18 6 views
2

InputString: Un soldat peut avoir des bleus, des blessures, des marques, des dislocations ou d'autres blessures qui le blessent.Java Regex, capturant des groupes avec des valeurs séparées par des virgules

ExpectedOutput:
contusions

plaies marques

dislocations

Blessures

diagramme généralisé essayé:

  ".[\s]?(\w+?)"+     // bruises. 
     "(?:(\s)?,(\s)?(\w+?))*"+    // wounds marks dislocations 
     "[\s]?(?:or|and) other (\w+).";  // Injuries

le motif doit être en mesure de mat ch autres chaînes d'entrée comme: Un soldat peut avoir Bruiser ou d'autres blessures qui lui font mal.

En essayant le modèle généralisé ci-dessus, la sortie est: ecchymoses dislocations Blessures

Il y a quelque chose de mal avec le groupe de capture pour « (: (\ s), (\ s)? (\ w +?)) * ". Le groupe de capture a une occurrence de plus ... mais il ne renvoie que des "dislocations". « marques » et « dislocation:.? sont dévorés

Pourriez-vous s'il vous plaît suggérer ce que devrait être le bon modèle, et où est l'erreur Cette question se rapproche le plus de ce question, mais cette solution n'a pas aidé

.

Merci.

+3

Ce qui rend les mots «meurtrissures», «blessures», «marques», «dislocations» et «blessures» différents de les autres mots? Les quatre premiers mots ont une virgule avant ou après, mais je ne vois pas comment «Blessures» entre dans l'image. –

+0

Je suis en train d'accomplir la tâche suivante pour mettre en œuvre des modèles pour extraire les relations: NP {NP} * {}, d'autres NP Ecchymoses, des blessures, des luxations ou d'autres blessures ... hyponyme (blessures « contusion », " "), hyponym (" blessure "," blessures "), hyponym (" dislocations "," blessures ") Ainsi, on pourrait voir comment l'ajustement" Blessures "doit être satisfait. – niks

+0

Lorsque le groupe de capture est annoté avec un quantificateur [ie: (foo) *] alors vous n'obtiendrez que la dernière correspondance. Si vous voulez tous les obtenir, vous devez quantifier à l'intérieur de la capture et ensuite vous devrez analyser manuellement les valeurs. Aussi grand fan que je suis de regex, je ne pense pas que ce soit approprié ici pour un certain nombre de raisons ... même si vous n'étiez pas en train de faire de la PNL. – PSpeed

Répondre

0

Lorsque le groupe de capture est annotées avec un quantificateur [ie: (foo) *], alors vous n'obtiendrez le dernier match. Si vous voulez tous les obtenir, vous devez quantifier à l'intérieur de la capture et ensuite vous devrez analyser manuellement les valeurs. Aussi grand fan que je suis de regex, je ne pense pas que ce soit approprié ici pour un certain nombre de raisons ... même si vous n'étiez pas en train de faire de la PNL.

Comment fixer: (: (\ s), (\ s) (\ w +??)) *

Eh bien, le quantificateur couvre essentiellement toute la regex dans ce cas et vous pourriez aussi bien utiliser Matcher.find() pour parcourir chaque correspondance. En outre, je suis curieux de savoir pourquoi vous avez des groupes de capture pour les espaces. Si tout ce que vous essayez de faire est de trouver un ensemble de mots séparés par des virgules, alors c'est quelque chose comme: \ w + (?: \ S *, \ s * \ w +) * Alors ne vous embêtez pas avec les groupes de capture rencontre.

Et pour tout ce qui est plus compliqué: NLP, GATE est un outil assez puissant. La courbe d'apprentissage est parfois abrupte, mais vous avez toute une industrie de la science: http://gate.ac.uk/

0

regex en ne convient pas pour le traitement du langage (naturel). avec regex, vous ne pouvez faire correspondre bien des modèles définis. vous devriez vraiment abandonner vraiment l'idée de le faire avec regex.

vous pouvez vouloir commencer une nouvelle question où vous spécifiez quelle programmi Langue que vous utilisez pour effectuer cette tâche et demander des pointeurs là-bas.

EDIT

PSpeed a posté un lien prometteur à une bibliothèque 3ème partie, Gate, qui est capable de faire beaucoup de tâches de traitement des langues. Et c'est écrit en Java. Je ne l'ai pas utilisé moi-même, mais en regardant les personnes/institutions qui travaillent dessus, ça semble assez solide.

+0

Je suis entièrement d'accord avec vous. Perl et Python peuvent être les meilleurs quand il s'agit de traitement de texte. mais le travail est en Java. Ce travail sur Patterns est un petit sous-module. Donc, besoin de trouver une solution pour ce problème regex dans Java! – niks

+0

Eh bien, que puis-je dire? Il n'y a vraiment aucun moyen viable d'extraire ces mots de la chaîne de saisie comme «Un soldat peut avoir des contusions ou d'autres blessures qui le blessent» en utilisant regex. Vraiment. –

+0

Notez que vous n'avez pas besoin de Perl ou Python pour cela. Java peut le faire aussi bien. Regex n'est tout simplement pas le bon outil pour ce travail. –

0

Le modèle qui fonctionne est la suivante: \ w + (: \ s *, \ s * \ w +) * puis séparer manuellement CSV Il n'y a pas d'autre méthode pour le faire avec Java Regex.

Idéalement, Java regex ne convient pas à la PNL. Un outil utile pour l'extraction de texte est: gate.ac.uk
Merci à Bart K. et PSpeed.

Questions connexes