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

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

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

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

простой поиск Google для лемматизации в R будет только укажите на пакет wordnet 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")).

5 ответов


привет вы можете попробовать пакет 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"))
tagged.results@TT.res

##     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 столбец для результата, который вы просите.


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

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

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

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

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

Если вы действительно хотите покопаться в теме, то вы можете покопаться в архивах событий, связанных в той же Стэнфордской группе НЛП публикации. Есть несколько книг на эту тему.


Lemmatization можно сделать в R легко с пакетом textStem. Шаги: 1) установить textstem 2) добавить пакет библиотека (textstem) 3) stem_word=lemmatize_words(слово, словарь = лексика:: hash_lemmas) #где stem_word является результатом лемматизации, а word-входным словом.


@Andy и @Arunkumar правы, когда они говорят textstem библиотека может использоваться для выполнения вытекающих и/или лемматизация. Однако 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 () принимает как аргумент.)

надеюсь, что это помогает!