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