Как мне подойти к этой задаче классификации имен?

Я задаю связанный с этим вопрос здесь, но этот вопрос является более общим. Я взял большие корпуса и написал некоторые слова с их именами. В моем случае они специфичны для домена, и я называю их: Entity, Action, Incident. Я хочу использовать их как семя для извлечения большего количества именных объектов. Например, следующее предложение:

Когда у робота был технический сбой, объект был брошен, но позже был пойман другим роботом.

помечен как:

Когда (робот)/Сущность имел (технический сбой)/Инцидент, объект (объект)/Сущность был (брошен)/Действие, но позже (пойман)/Действие(другой робот)/Сущность.

В таких примерах, как это, я все же могу обучить классификатор распознавать новые именованные сущности? Например, учитывая следующее предложение:

У нанобота была ошибка, и он врезался в стену.

следует пометить следующим образом:

У (nanobot)/Entity был (ошибка)/инцидент и поэтому он (разбился)/Действие в (стена)/Entity.

Конечно, я знаю, что точность 100% невозможна, но мне было бы интересно узнать какие-либо формальные подходы к этому. Какие-либо предложения?

3 ответа

Это вообще не называется распознаванием сущностей, так как ни одна из отмеченных частей не является именем, поэтому набор функций для NER-систем не поможет вам (английские системы NER склонны полагаться на капитализацию довольно сильно и предпочтут существительные). Это своего рода информационное извлечение/семантическая интерпретация. Я подозреваю, что это будет довольно сложно в настройке машинного обучения, потому что ваша аннотация действительно непоследовательна:

Когда (робот)/Сущность имел (технический сбой)/Инцидент, объект (объект)/Сущность был (брошен)/Действие, но позже (пойман)/Действие другим роботом.

Почему "другой робот" не аннотируется?

Если вы хотите решить эту проблему, лучше начать с некоторых регулярных выражений, возможно, сопоставленных с POS-тегами версий строки.


Вы можете попробовать моделирование роли объекта на http://www.ormfoundation.com/, которая рассматривает семантику (факты) между одним или несколькими объектами или именами и их отношениями с другими объектами. Существуют также инструменты для преобразования моделей orm в xml и другие языки и наоборот. См. Http://orm.sourceforge.net/


Я могу думать о двух подходах.

Во-первых, это сопоставление шаблонов над словами в предложении. Что-то вроде этого (псевдокод, хотя он похож на синтаксис синтаксического анализатора NLTK):

<some_word>+ (<nn|nns>) <have|has|had> (<nn|nns>) 
<nn|nns> (<vb>|was <vb>) (<and|but> (<vb>|was <vb>))* <into|onto|by> (<nn|nns>)
</nn|nns></into|onto|by></vb></vb></and|but></vb></vb></nn|nns></nn|nns></have|has|had></nn|nns></some_word>

Эти 2 шаблона могут (грубо) поймать 2 части вашего первого предложения. Это хороший выбор, если у вас не очень много предложений. Я считаю, что можно получить до 90% точности с хорошо подобранными шаблонами. Недостатком является то, что эту модель трудно расширить или изменить.

Другой подход заключается в том, чтобы сопоставлять зависимости между словами в предложении, например, с помощью Stanford Dependency Parser. Среди прочего, он позволяет разминировать объект, субъект и предикат, который кажется очень похожим на то, что вы хотите: в вашем первом предложении "робот" является субъектом, "имел" предикат, а "сбой" - объект.

licensed under cc by-sa 3.0 with attribution.