R:当一个文档中有多个句子时,使用dfm查找ngram

时间:2016-07-31 02:46:45

标签: r nlp text-mining quanteda

我有一个大数据集(> 100万行),每行都是一个多句话文本。例如,以下是2行的示例:

mydat <- data.frame(text=c('I like apple. Me too','One two. Thank you'),stringsAsFactors = F)

我想要做的是在每一行中提取两个术语(“。”将能够分离ngram术语)。如果我只使用dfm函数:

mydfm  = dfm(mydat$text,toLower = T,removePunct = F,ngrams=2)
dtm = as.DocumentTermMatrix(mydfm)
txt_data = as.data.frame(as.matrix(dtm))

这些是我得到的条款:

"i_like"     "like_apple" "apple_."    "._me"       "me_too"     "one_two"    "two_."      "._thank"    "thank_you" 

这些是我所期望的,基本上是“。”被跳过并用于分隔术语:

"i_like"     "like_apple"  "me_too"     "one_two"    "thank_you" 

相信编写慢循环也可以解决这个问题,但鉴于它是一个庞大的数据集,我宁愿选择类似于quanteda中的dfm()的有效方法来解决这个问题。任何建议将不胜感激!

2 个答案:

答案 0 :(得分:2)

@ Jota的答案有效但有一种方法可以更好地控制令牌化,同时只调用一次:

(toks <- tokenize(toLower(mydat$text), removePunct = 2, ngrams = 2))
## tokenizedText object from 2 documents.
## Component 1 :
## [1] "i_like"     "like_apple" "apple_me"   "me_too"    
## 
## Component 2 :
## [1] "one_two"   "two_thank" "thank_you"

dfm(toks)
## Document-feature matrix of: 2 documents, 7 features.
## 2 x 7 sparse Matrix of class "dfmSparse"
##        features
## docs    i_like like_apple apple_me me_too one_two two_thank thank_you
##   text1      1          1        1      1       0         0         0
##   text2      0          0        0      0       1         1         1

<强>加了:

然后要删除带有.标点符号的任何ngram,您可以使用:以下内容,默认为valuetype = "glob"

removeFeatures(toks2, "*.*")
## tokenizedText object from 2 documents.
## Component 1 :
## [1] "i_like"     "like_apple" "me_too"    
## 
## Component 2 :
## [1] "one_two"   "thank_you"

答案 1 :(得分:1)

如果你的目标只是提取那些双字母,那么你可以使用tokens两次。一旦标记为句子,然后再次为每个句子制作ngram。

library("quanteda")
mydat$text %>% 
    tokens(mydat$text, what = "sentence") %>% 
    as.character() %>%
    tokens(ngrams = 2, remove_punct = TRUE) %>%
    as.character()
#[1] "I_like"     "like_apple" "Me_too"     "One_two"    "Thank_you"

如果您愿意,可在第一次tokens_tolower()来电后插入tokens(),或在结尾处使用char_tolower()