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

How to perform Lemmatization in R?

这个问题可能与 Lemmatizer in R or python (am, are, is -> be?) 重复,但我再次添加它是因为前一个问题已关闭,说它过于宽泛并且是唯一的答案它效率不高(因为它为此访问外部网站,这太慢了,因为我有非常大的语料库来查找引理)。所以这个问题的一部分会和上面提到的问题类似。

根据维基百科,词形还原定义为:

Lemmatisation (or lemmatization) in linguistics, is the process of grouping together the different inflected forms of a word so they can be analysed as a single item.

一个简单的 Google 在 R 中搜索词形还原将 指向 R 的包 wordnet。当我尝试这个包时期望一个字符vector 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"))。

也许stemming is enough for you? Typical natural language processing tasks make do with stemmed texts. You can find several packages from CRAN Task View of NLP: http://cran.r-project.org/web/views/NaturalLanguageProcessing.html

如果您确实需要更复杂的东西,那么可以使用基于将句子映射到神经网络的专门解决方案。据我所知,这些需要大量的训练数据。 Stanford NLP Group.

创建并提供了许多开放软件

如果你真的想深入研究这个话题,那么你可以通过在同一个 Stanford NLP Group publications 部分链接的事件档案进行挖掘。还有一些关于这个主题的书。

您好,您可以试试包 koRpus which allow to use 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 列以获取您要求的结果。

可以使用 textStem 包在 R 中轻松完成词形还原。
步骤为:
1) 安装 textstem
2)加载包 library(textstem)
3) stem_word=lemmatize_words(word, dictionary = lexicon::hash_lemmas)
其中 stem_word 是词形还原的结果,word 是输入词。

正如前面 post 提到的,R 包 textstem 中的函数 lemmatize_words() 可以执行此操作并为您提供我所理解的所需结果:

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

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

@Andy 和@A运行kumar 说 textstem 库可用于执行词干提取 and/or 词形还原是正确的。但是,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() 作为参数的对象类型)。

希望对您有所帮助!

我认为这里的答案有点过时了。您现在应该使用 R 包 udpipe - 可在 https://CRAN.R-project.org/package=udpipe - see https://github.com/bnosac/udpipe or docs at https://bnosac.github.io/udpipe/en

获得

请注意以下示例中词元化和词干提取时单词 meeting (NOUN) 和单词 meet (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"