Java Regex, захват групп с разделенными запятыми значениями - PullRequest
2 голосов
/ 18 февраля 2010

InputString : у солдата могут быть синяки, раны, следы, вывихи или другие травмы, которые причиняют ему боль.

ExpectedOutput :
ушибы
раны
знаки
вывихи
Рана

Обобщенный шаблон пробовал :

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

Шаблон должен соответствовать другим входным строкам, таким как: У солдата могут быть синяки или другие травмы, которые причиняют ему боль.

При попытке использовать обобщенный шаблон, приведенный выше, вывод: ушибы вывихи Раны

Что-то не так с группой захвата для "(?: (\ S)?, (\ S)? (\ W +?)) *". У группы захвата есть еще один случай ... но она возвращает только "дислокации". «метки» и «вывих»: пожираются.

Не могли бы вы предложить, какой должен быть правильный шаблон и в чем ошибка? Этот вопрос наиболее близок к этому вопросу , но это решение не помогло.

Спасибо.

Ответы [ 3 ]

0 голосов
/ 18 февраля 2010

Шаблон, который работает: \ w + (?: \ S *, \ s * \ w +) * и затем вручную разделяет CSV. Нет другого способа сделать это с помощью Java Regex.

В идеалеJava regex не подходит для НЛП.Полезный инструмент для интеллектуального анализа текста: gate.ac.uk
Спасибо Bart K. и PSpeed.

0 голосов
/ 18 февраля 2010

Когда группа захвата снабжена квантификатором [т.е.: (foo) *], вы получите только последнее совпадение. Если вы хотите получить все из них, вам нужно определить квантификатор внутри записи, а затем вам придется вручную анализировать значения. Как и большой поклонник регулярных выражений, я не думаю, что это уместно здесь по ряду причин ... даже если вы в конечном итоге не занимались НЛП.

Как исправить: (?: (\ S)?, (\ S)? (\ W +?)) *

Что ж, квантификатор в основном покрывает все регулярные выражения в этом случае, и вы также можете использовать Matcher.find (), чтобы проходить через каждое совпадение. Кроме того, мне любопытно, почему у вас есть группы захвата для пробелов. Если все, что вы пытаетесь сделать, это найти набор слов через запятую, то это что-то вроде: \ w + (?: \ S *, \ s * \ w +) * Тогда не беспокойтесь о группах захвата и просто разбивайте все матч.

И для чего-то более сложного в отношении: НЛП, GATE - довольно мощный инструмент. Кривая обучения порой крута, но у вас есть целая индустрия научных ребят, из которых можно извлечь: http://gate.ac.uk/

0 голосов
/ 18 февраля 2010

Regex не подходит для обработки (естественного) языка. С помощью регулярных выражений вы можете сопоставлять только четко определенные шаблоны. Вы должны действительно отказаться от идеи сделать это с помощью регулярных выражений.

Возможно, вы захотите начать новый вопрос, в котором вы укажете, какой язык программирования вы используете для выполнения этой задачи, и попросите указатели там.

EDIT

PSpeed ​​ опубликовал многообещающую ссылку на стороннюю библиотеку Gate , которая способна выполнять множество задач языковой обработки. И это написано на Java. Я сам этим не пользовался, но, глядя на людей / учреждения, работающие над этим, он выглядит довольно солидно.

...