如何在R中执行词形还原?

时间:2015-01-29 11:55:17

标签: r nlp lemmatization

这个问题可能是 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"))。

6 个答案:

答案 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"