2016-07-31 23 views
1

我有一個大數據集(> 100萬行),每行都是多句話文本。例如下面的2行示例:R:在一個文檔中有多個句子時使用dfm查找ngram

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()有效的方式來解決這個問題。任何建議,將不勝感激!

回答

1

如果您的目標只是提取這些bigrams,那麼您可以使用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()

+0

謝謝!這有助於我將外部tokenize()更改爲dfm(),以便這些bigram項可以是我的數據集的特徵 – snowneji

1

@霍塔的答案的作品,但有一種方法,以更好地控制在斷詞,而調用它只有一次:

(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" 
+0

@Jota嘗試了不同的方法後,我最終使用了'dfm(mydat $ text,ignoredFeatures ='。')這將自動刪除那些包含'。' – snowneji

+0

是的,請參閱我的答案。 –

相關問題