我有一个大数据集(> 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()的有效方法来解决这个问题。任何建议将不胜感激!
答案 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()
。