这个问题可能是 Lemmatizer in R or python (am, are, is -> be?) 的重复,但是我再次添加它是因为上一个问题已经关闭,说它太宽泛了,唯一的答案是效率不高(因为它访问了一个外部网站,因为我有一个非常大的语料库来找到它的外部因素太慢了)。因此,这个问题的一部分将与上述问题类似。
根据维基百科,词形还原定义为:
语言学中的语法化(或词形还原)是将单词的不同变形形式组合在一起的过程,以便将它们作为单个项目进行分析。
在R中简单的谷歌搜索词形还原只指向R的包wordnet
。当我尝试这个包期望字符向量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)
以上是 NOT 我正在寻找的词形还原。我正在寻找的是,使用R
我希望找到这些词的真正根源:(例如从c("run", "ran", "running")
到c("run", "run", "run")
)。
答案 0 :(得分:27)
您好,您可以尝试使用允许使用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
列,了解您要求的结果。
答案 1 :(得分:10)
正如之前提到的那样,R包文本中的函数lemmatize_words()可以执行此操作并为您提供我理解为您期望的结果:
library(textstem)
vector <- c("run", "ran", "running")
lemmatize_words(vector)
## [1] "run" "run" "run"
答案 2 :(得分:4)
也许stemming对你来说已经足够了?典型的自然语言处理任务与词干文本有关。您可以从NLP的CRAN任务视图中找到几个软件包:http://cran.r-project.org/web/views/NaturalLanguageProcessing.html
如果你确实需要更复杂的东西,那么基于将句子映射到神经网络的专业解决方案。据我所知,这些需要大量的培训数据。 Stanford NLP Group创建并提供了许多开放软件。
如果您真的想深入了解该主题,那么您可以浏览在同一个Stanford NLP Group publications部分链接的活动档案。还有关于这个主题的一些书籍。
答案 3 :(得分:3)
@Andy和@Arunkumar说 textstem 库可用于执行词干和/或词义化时,它们是正确的。但是,lemmatize_words()仅适用于单词向量。但是在语料库中,我们没有单词的向量;我们有字符串,每个字符串都是文档的内容。因此,要对语料库执行词法语义化,可以使用lemmatize_strings()函数作为 tm 软件包的tm_map()的参数。
> 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()作为参数的对象类型。
希望这会有所帮助!
答案 4 :(得分:0)
可以使用textStem包在R中轻松完成词形还原
步骤是:
1)安装texttem
2)装入包装
library(textstem)
3)stem_word=lemmatize_words(word, dictionary = lexicon::hash_lemmas)
其中,stem_word是词形还原的结果,而word是输入词。
答案 5 :(得分:0)
我认为这里的答案有些过时了。您现在应该使用R包udpipe-可在https://CRAN.R-project.org/package=udpipe获得-请参见https://github.com/bnosac/udpipe或在https://bnosac.github.io/udpipe/en上的文档
在下面的示例中,在进行词格定形和词干处理时,请注意单词Meeting(名词)和满足词(VERB)之间的区别,而在词干过程中,讨厌的将“ someone”(人)改为“ someon”(某人)
library(udpipe)
x <- c(doc_a = "In our last meeting, someone said that we are meeting again tomorrow",
doc_b = "It's better to be good at being the best")
anno <- udpipe(x, "english")
anno[, c("doc_id", "sentence_id", "token", "lemma", "upos")]
#> doc_id sentence_id token lemma upos
#> 1 doc_a 1 In in ADP
#> 2 doc_a 1 our we PRON
#> 3 doc_a 1 last last ADJ
#> 4 doc_a 1 meeting meeting NOUN
#> 5 doc_a 1 , , PUNCT
#> 6 doc_a 1 someone someone PRON
#> 7 doc_a 1 said say VERB
#> 8 doc_a 1 that that SCONJ
#> 9 doc_a 1 we we PRON
#> 10 doc_a 1 are be AUX
#> 11 doc_a 1 meeting meet VERB
#> 12 doc_a 1 again again ADV
#> 13 doc_a 1 tomorrow tomorrow NOUN
#> 14 doc_b 1 It it PRON
#> 15 doc_b 1 's be AUX
#> 16 doc_b 1 better better ADJ
#> 17 doc_b 1 to to PART
#> 18 doc_b 1 be be AUX
#> 19 doc_b 1 good good ADJ
#> 20 doc_b 1 at at SCONJ
#> 21 doc_b 1 being be AUX
#> 22 doc_b 1 the the DET
#> 23 doc_b 1 best best ADJ
lemmatisation <- paste.data.frame(anno, term = "lemma",
group = c("doc_id", "sentence_id"))
lemmatisation
#> doc_id sentence_id
#> 1 doc_a 1
#> 2 doc_b 1
#> lemma
#> 1 in we last meeting , someone say that we be meet again tomorrow
#> 2 it be better to be good at be the best
library(SnowballC)
tokens <- strsplit(x, split = "[[:space:][:punct:]]+")
stemming <- lapply(tokens, FUN = function(x) wordStem(x, language = "en"))
stemming
#> $doc_a
#> [1] "In" "our" "last" "meet" "someon" "said"
#> [7] "that" "we" "are" "meet" "again" "tomorrow"
#>
#> $doc_b
#> [1] "It" "s" "better" "to" "be" "good" "at" "be"
#> [9] "the" "best"