Как выполнить лемматизацию в 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() принимает в качестве аргумента).
Надеюсь это поможет!