如何在 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"
这个问题可能与 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"