Как выполнить лемматизацию в R?

Этот вопрос является возможным дубликатом лемматизатора в R или python (am, are, is → be?), но я добавив его снова, поскольку предыдущий был закрыт, говоря, что он слишком широк, и единственный ответ, который он имеет, неэффективен (поскольку он обращается к внешнему веб-сайту для этого, что слишком медленно, так как у меня очень большой корпус, чтобы найти леммы для). Поэтому часть этого вопроса будет аналогична вышеупомянутому вопросу.

Согласно Википедии, лемматизация определяется как:

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

Простой поиск Google для лемматизации в R будет указывать только на пакет wordnet of R. Когда я попробовал этот пакет, ожидая, что вектор символа c("run", "ran", "running"), введенный в функцию лемматизации, приведет к c("run", "run", "run"), я увидел что этот пакет обеспечивает функциональность, аналогичную функции grepl, через различные имена фильтров и словарь.

Пример кода из пакета wordnet, который дает максимум 5 слов, начинающихся с "car", поскольку имя фильтра объясняет сам себя:

filter <- getTermFilter("StartsWithFilter", "car", TRUE)
terms <- getIndexTerms("NOUN", 5, filter)
sapply(terms, getLemma)

Вышеупомянутая НЕ лемматизация, которую я ищу. Я ищу, используя R. Я хочу найти истинные корни слов: (например, от c("run", "ran", "running") до c("run", "run", "run")).

Ответ 1

Здравствуйте, вы можете попробовать пакет koRpus, который позволяет использовать Treetagger:

tagged.results <- treetag(c("run", "ran", "running"), treetagger="manual", format="obj",
                      TT.tknz=FALSE , lang="en",
                      TT.options=list(path="./TreeTagger", preset="en"))
[email protected]

##     token tag lemma lttr wclass                               desc stop stem
## 1     run  NN   run    3   noun             Noun, singular or mass   NA   NA
## 2     ran VVD   run    3   verb                   Verb, past tense   NA   NA
## 3 running VVG   run    7   verb Verb, gerund or present participle   NA   NA

См. столбец lemma для результата, который вы запрашиваете.

Ответ 2

Как упоминалось ранее, функция lemmatize_words() из текстового объекта R-пакета может выполнить это и дать вам то, что я понимаю, как ваши желаемые результаты:

library(textstem)
vector <- c("run", "ran", "running")
lemmatize_words(vector)

## [1] "run" "run" "run"

Ответ 3

Возможно, stemming вам достаточно? Типичные задачи обработки естественного языка связаны с текстовыми текстами. Вы можете найти несколько пакетов из CRAN Task View для NLP: http://cran.r-project.org/web/views/NaturalLanguageProcessing.html

Если вам действительно нужно что-то более сложное, тогда есть специализированные решения, основанные на предложениях отображения для нейронных сетей. Насколько мне известно, для этого требуется огромное количество данных обучения. Существует много открытого программного обеспечения, созданного и предоставленного Stanford NLP Group.

Если вы действительно хотите вникнуть в эту тему, вы можете прорвать архивы событий, связанные с той же группой Stanford NLP publications. Там также есть книги по этой теме.

Ответ 4

Лемматизировать можно легко в R с помощью пакета textStem.
Шаги:
1) Установить текстовое сообщение
2) Загрузите пакет library(textstem)
3) stem_word=lemmatize_words(word, dictionary = lexicon::hash_lemmas)
где stem_word - результат лемматизации, а word - входное слово.

Ответ 5

@Andy и @Arunkumar правы, когда говорят, что текстовая библиотека может использоваться для выполнения стволов и/или лемматизации. Однако lemmatize_words() будет работать только с вектором слов. Но в корпусе у нас нет вектора слов; у нас есть строки, каждая из которых является содержимым документа. Следовательно, для выполнения лемматизации в корпусе вы можете использовать функцию lemmatize_strings() в качестве аргумента для tm_map() пакета tm.

> corpus[[1]]
[1] " earnest roughshod document serves workable primer regions recent history make 
terrific th-grade learning tool samuel beckett applied iranian voting process bard 
black comedy willie loved another trumpet blast may new mexican cinema -bornin "
> corpus <- tm_map(corpus, lemmatize_strings)
> corpus[[1]]
[1] "earnest roughshod document serve workable primer region recent history make 
terrific th - grade learn tool samuel beckett apply iranian vote process bard black 
comedy willie love another trumpet blast may new mexican cinema - bornin"

Не забудьте запустить следующую строку кода после выполнения лемматизации:

> corpus <- tm_map(corpus, PlainTextDocument)

Это связано с тем, что для создания матрицы термина документа необходимо иметь объект типа "PlainTextDocument", который изменяется после использования lemmatize_strings() (точнее, объект корпуса не содержит содержимого и метаданных каждый документ больше - теперь это просто структура, содержащая содержимое документов, это не тот тип объекта, который DocumentTermMatrix() принимает в качестве аргумента).

Надеюсь это поможет!