2016-07-31 2 views
1

大きなデータセット(100万行以上)があり、各行は複数の文章のテキストです。たとえば、次は2行のサンプルです:R:一つの文書に複数の文があるときにdgramを使って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を2回使用できます。一度トークン化してから各文章の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()呼び出し後tokens_tolower()を挿入するか、最後にchar_tolower()を使用しています。イオタの回答作品@

+0

ありがとうございました!これは、外部tokenize()をdfm()に変更して、これらのバイグラム語を自分のデータセットのフィーチャにすることができます – 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 

を追加しました:

その後、.句読点であなたを任意のnグラムを削除するには次のものを使用できます: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

はい、私の答えに追加を参照してください。 –

関連する問題