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

Я ищу способ получить все варианты лексемы определенного слова.

Пример: бежит -> (бежит, бежит, бежит, бежит…)

Я попробовал Stanford NLP в соответствии с этот пост. Однако аннотатор леммы извлекает только лемму (запуск -> запуск), а не полный набор вариантов. Есть ли способ сделать это с помощью Stanford NLP или другой Java Lib/Framework?

Уточнение: я не ищу стеммер. Кроме того, я хотел бы избежать программирования нового алгоритма с нуля для сканирования WordNet или подобных словарей.


person tbm    schedule 30.07.2015    source источник


Ответы (1)


Короткий ответ заключается в том, что стандартная библиотека или инструментарий NLP вряд ли решит эту проблему. Как и в Стэнфордском НЛП, большинство библиотек предоставляют отображение только из word --> lemma. Обратите внимание, что это функция «многие к одному», т. е. обратная функция не определена корректно в словесном пространстве. Однако это четко определенная функция из пространства слов в пространство наборов слов (т. е. это отображение «один ко многим» в пространстве слов).

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

Однако вы можете сгенерировать отображение lemma --> set-of-words без большого количества кода (и определенно без написания нового алгоритма):

// Java
Map<String, Set<String>> inverseLemmaMap = new HashMap<>();

// Guava
Multimap<String, String> inverseLemmaMap = HashMultimap.create();

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

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

Еще одно замечание: люди часто думают, что флексия однозначно определяется частью речи. Это неверно:

String s = "My running was beginning to hurt me. I was running all day."

Первый экземпляр running помечен NN, а второй экземпляр представляет собой настоящее продолженное время глагола с тегом VBG. Это то, что я имел в виду под «односторонней функцией с потерями» ранее в своем ответе.

person Chthonic Project    schedule 30.07.2015
comment
Спасибо. Полезно знать, что нет смысла искать какую-то функциональность обратной лемматизации. Я попробую ваше предложение. - person tbm; 31.07.2015