Короткий ответ заключается в том, что стандартная библиотека или инструментарий 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