如何用我自己 table 中的词干版本替换标记(词)?

How to replace tokens (words) with stemmed versions of words from my own table?

我得到这样的数据(简化):

library(quanteda)

示例数据

myText <- c("ala ma kotka", "kasia ma pieska")  
myDF <- data.frame(myText)
myDF$myText <- as.character(myDF$myText)

标记化

tokens <- tokens(myDF$myText, what = "word",  
             remove_numbers = TRUE, remove_punct = TRUE,
             remove_symbols = TRUE, remove_hyphens = TRUE)

源于我自己的数据 示例字典

Origin <- c("kot", "pies")
Word <- c("kotek","piesek")

myDict <- data.frame(Origin, Word)

myDict$Origin <- as.character(myDict$Origin)
myDict$Word <- as.character(myDict$Word)

我得到了什么

tokens[1]
[1] "Ala"   "ma"    "kotka"

我想得到什么

tokens[1]
[1] "Ala"   "ma"    "kot"
tokens[2]
[1] "Kasia"   "ma"    "pies"

一个类似的问题已得到回答 here,但由于该问题的标题(和已接受的答案)并不明显 link,我将向您展示这如何具体适用于您的问题。我还将在下面提供更多详细信息,以使用后缀的通配符实现您自己的基本词干分析器。

手动将词干映射到变形形式

执行此操作的最简单方法是使用自定义词典,其中键是词干,值是变形形式。然后,您可以将 tokens_lookup()exclusive = FALSE, capkeys = FALSE 选项结合使用,将变形词转换为它们的词干。

请注意,我对您的示例进行了一些修改以简化它,并纠正我认为的错误。

library("quanteda")
packageVersion("quanteda")
[1] ‘0.99.9’

# no need for the data.frame() call
myText <- c("ala ma kotka", "kasia ma pieska")  
toks <- tokens(myText, 
               remove_numbers = TRUE, remove_punct = TRUE,
               remove_symbols = TRUE, remove_hyphens = TRUE)

Origin <- c("kot", "kot", "pies", "pies")
Word <- c("kotek", "kotka", "piesek", "pieska")

然后我们创建字典,如下。从 quanteda v0.99.9 开始,具有相同键的值被合并,因此您可以有一个列表将多个不同的变形形式映射到相同的键。在这里,我不得不添加新值,因为在 myText 示例中找不到原始 Word 向量中的变形形式。

temp_list <- as.list(Word) 
names(temp_list) <- Origin
(stem_dict <- dictionary(temp_list))
## Dictionary object with 2 key entries.
## - [kot]:
##   - kotek, kotka
## - [pies]:
##   - piesek, pieska    

然后 tokens_lookup() 施展魔法。

tokens_lookup(toks, dictionary = stem_dict, exclusive = FALSE, capkeys = FALSE)
## tokens from 2 documents.
## text1 :
## [1] "ala" "ma"  "kot"
## 
## text2 :
## [1] "kasia" "ma"    "pies" 

通配所有来自共同根的词干

另一种方法是使用 "glob" 通配符来实现您自己的词干分析器来表示 Origin 向量的所有后缀,这(至少在此处)产生相同的结果:

temp_list <- lapply(unique(Origin), paste0, "*")
names(temp_list) <- unique(Origin)
(stem_dict2 <- dictionary(temp_list))
# Dictionary object with 2 key entries.
# - [kot]:
#   - kot*
# - [pies]:
#   - pies*

tokens_lookup(toks, dictionary = stem_dict, exclusive = FALSE, capkeys = FALSE)
## tokens from 2 documents.
## text1 :
## [1] "ala" "ma"  "kot"
## 
## text2 :
## [1] "kasia" "ma"    "pies"