1

大きなデータセット (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() に似た効率的な方法を好むでしょう。任意の提案をいただければ幸いです!

4

2 に答える 2

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"
于 2016-07-31T14:51:03.700 に答える
1

tokensこれらのバイグラムを抽出するだけが目的の場合は、 2 回使用できます。1 回文にトークン化してから、各文の 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()必要に応じて、最初の呼び出しの後にa を挿入するtokens()char_tolower()、最後に使用します。

于 2016-07-31T03:07:08.870 に答える