Как найти правильные имена в строке?

Я пытаюсь определить собственные существительные в представленном пользователем параграфе предложений 3-4. Я в порядке, когда функция несколько искажена, поскольку у меня есть команда модераторов, которые проверяют практически все.

Ниже приведен пример входящего абзаца.

Ник Свишер устроился с Джеймсом Шилдсом, чтобы сыграть пятикратную паузу в первом таймане, а в Нью-Йорке янки обыграли Тампа-Бэй 8-3 во вторник вечером, открыв 2 1/2-й матч над лучами в AL East.

Я хочу, чтобы функция вывела следующие ключевые слова / собственные имена.

Ник Свишер, Джеймс Шилдс, Нью-Йорк Янкиз, Тампа-Бэй, Лучи, AL East

Я думаю, что могу взорвать строку и отделить слова пробелами. Затем я проверил каждое слово, чтобы увидеть, является ли первая буква заглавной. Если это так, верните его. Если нет, переходите к следующему слову.

Но как насчет многословных ключевых слов / правильных существительных? Как получить функцию, чтобы проверить слово после уже найденного слова с буквой в первой букве?

Таким образом, функция найдет Ника, но как мне сказать, чтобы проверить следующее слово? Поэтому проверьте, закрыто ли следующее, и если да, верните Ник Свишер. Если нет, просто верните Нику.

И, идя дальше, что, если это фраза из трех слов? Найден новый, найден Йорк, как мне его найти, чтобы найти янки?

Попробуйте регулярное выражение, например:

[AZ]{1,1}[az]*([\s][AZ]{1,1}[az]*)* 

Но не забудьте проверить регистр

Я не думаю, что вы можете положиться на капитализацию. Даже если вам не нужно работать с языками, отличными от английского (например, немецкий капитализирует все существительные), значительная часть пользователей не капитализируется вообще или не последовательно.

Я подозреваю, что любая попытка сделать это на основе синтаксических правил не удастся – ваши проблемы с 3-мя словными комбинациями указывают на это. Реальная проблема заключается в том, что вы, вероятно, не можете найти полезное, недвусмысленное синтаксическое определение того, что такое «собственное существительное».

Другой способ приблизиться к ней – это работать со списком известных собственных существительных (названия городов, имена, фамилии) и предположить, что если вы обнаружите, что два или более из них разделены пробелами, это составное существительное.

Я использовал эту услугу, открыв Кале когда-то для проекта. Может работать для вас. Вам нужно будет написать простой скрипт для загрузки вашего текста на сервер. Проверьте их API для настройки и т. Д.

вы, как правило, не можете сделать что-то подобное, а не легко.

что, если он забыл использовать собственное имя? Как насчет «четверга»? А как насчет предложения: «Только я. Этот человек»?

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

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

 $text = 'Nick Swisher homered off James Shields to key a five-run burst in the first inning and the New York Yankees beat Tampa Bay 8-3 on Tuesday night, opening a 2 1/2-game lead over the Rays in the AL East.'; $matches= array(); preg_match_all('/([[:upper:]]+[[:lower:]]*(\W|$))+/', $text, $matches); print_r($matches); 

Обратите внимание, что строки в $matches[0] заканчиваются символами, найденными в $matches[2] . Это можно легко решить с помощью инструкции очистки foreach или, возможно, путем изменения регулярного выражения.

Вот сценарий, который при запуске в вашем абзаце создает массив со следующими значениями:

Массив ([0] => Ник Свишер [1] => Джеймс Шилдс [2] => Нью-Йорк Янкиз [3] => Тампа-Бэй [4] => Вторник [5] => Лучи [6] => AL East .)

Это полезно?

 $proper_nouns = Array(); $words = explode(' ', $paragraph); for ($i = 0; $i < count($words); $i++) { if (preg_match('/[AZ]/', $words[$i]) > 0) { $proper_noun = $words[$i]; $index = 1; while (true) { if ($i + $index < count($words)) { if (preg_match('/[AZ]/', $words[$i + $index]) > 0) { $proper_noun = $proper_noun." ".$words[$i + $index]; $index++; } else { $i = $i + $index - 1; break; } } else { break; } } array_push($proper_nouns, $proper_noun); } } 

Не уверен, на каком языке вы работаете, но вот класс php, чтобы найти собственные существительные. Он использует намного больше, чем просто заглавные буквы. Даже если вы не используете php, вы можете использовать его в качестве модели для используемого вами языка. Вот описание:

Класс подходящих существительных может находить и извлекать собственные существительные из заданного текста, используя эвристику, основанную на синтаксических подсказках, таких как первая буква в верхнем регистре, позиция слова в предложении и т. Д. Он может попытаться объединить собственные существительные, используя союзы, чтобы найти несколько собственных существительных слов. Этот класс предоставляет настройки, поэтому его можно применять к другим языкам, в грамматике которых используются те же эвристики.

Если вам нужно что-то большее, чем Regex, лучший способ сделать это – использовать процессор с естественным языком, такой как openNLP, который построен поверх Solr. http://opennlp.apache.org/

Первым шагом будет установка Apache Solr / Lucene. https://lucene.apache.org/solr/

Вы можете скачать Solr и встать и запустить в течение нескольких минут. Затем установите / запустите openNLP.

Это звучит пугающе, но это даст вам много энергии и действительно масштабируемое решение для таких вещей, как правильное извлечение существительных и многое другое.