2016-05-04 7 views
2

私はコードを提供しなかったので、この質問を以前に聞いて、否定的なフィードバックを得ました。私は一日を過ごして試してみると、今は問題に悩まされています。キーの用語(コーパス)を別のものに検索するR

このコードは、Stackoverflowのユーザーが "Tyler Rincker" <で取得しました - 彼に大きな感謝!ここ

はコードです:

strip <- function(x, digit.remove = TRUE, apostrophe.remove = FALSE){ 
      strp <- function(x, digit.remove, apostrophe.remove){ 
      x2 <- Trim(tolower(gsub(".*?($|'|[^[:punct:]]).*?", "\\1", as.character(x)))) 
      x2 <- if(apostrophe.remove) gsub("'", "", x2) else x2 
      ifelse(digit.remove==TRUE, gsub("[[:digit:]]", "", x2), x2) 
      } 
      unlist(lapply(x, function(x) Trim(strp(x =x, digit.remove = digit.remove, 
           apostrophe.remove = apostrophe.remove)))) 

corpus2 <- "In Westerman's disruptive article, Quantitative research as 
     an interpretive enterprise: The mostly 
     unacknowledged role of interpretation in research efforts." 

    corpus2 <- gsub("\\s+", " ", gsub("\n|\t", " ", corpus2)) 
    corpus2.wrds <- as.vector(unlist(strsplit(strip(corpus2), " "))) 

    corpus2.Freq <- data.frame(table(corpus2.wrds)) 
    corpus2.Freq$corpus2.wrds <- as.character(corpus2.Freq$corpus2.wrds) 
    corpus2.Freq <- corpus2.Freq[order(-corpus2.Freq$Freq), ] 
    rownames(corpus2.Freq) <- 1:nrow(corpus2.Freq) 

    key.terms <- c("research as") 

私の問題は、コーパス中で、私はバイグラムやトライグラム(2または3ワード)を検索したいということです。私が「1」の周波数を表示する必要があり、この結果を得る

corpus2.Freq[corpus2.Freq$corpus2.wrds %in%key.terms, ] 

:私はこのコード行を実行

[1] corpus2.wrds Freq   
<0 rows> (or 0-length row.names) 

しかし、keytermが唯一の1単語の場合:正常に動作し、私は次のような結果を取得され

key.terms <- c("research") 
    corpus2.Freq[corpus2.Freq$corpus2.wrds %in%key.terms, ] 

コード:

corpus2.wrds Freq 
research 2 

おかげでたくさん!うまくいけば誰かが助けることができる。

答えて

1

作成していないため、バイグラムは見つかりません。ユニグラムのみを作成する関数strsplit(strip(corpus2), " ")を使用します。

strip()機能の代わりにtmパッケージから入手できる前処理機能を使用することをお勧めします。

あなたはユニグラムのために、このような何かを試すことができます:両方ユニグラムとバイグラムのため

library(tm) 

# create corpora 
corp = VCorpus(VectorSource(corpus2)) 

# this should replace your strip() function 
ctrl = list(tokenize = function(x) unlist(strsplit(as.character(x), "[[:space:]]+")), 
     removePunctuation = TRUE, 
     removeNubers = TRUE, 
     tolower = TRUE) 

tdm = TermDocumentMatrix(corp, control = ctrl) 
inspect(tdm) 
inspect(tdm[c("research"),]) 

または類似コード:

ctrl2 = list(tokenize = function(x) unlist(lapply(ngrams(words(x), 1:2), paste, collapse = " "), use.names = FALSE), 
     removePunctuation = TRUE, 
     removeNubers = TRUE, 
     tolower = TRUE) 

tdm_bigrams = TermDocumentMatrix(corp, control = ctrl2) 
inspect(tdm_bigrams) 
inspect(tdm_bigrams[c("research"),]) 
inspect(tdm_bigrams[c("research as"),]) 
+0

こんにちはレンカ、ありがとうございました。はい、私が実装したコードは何とか古いものです。 unigramsであなたのソリューションを試したとき、私は縛られたエラーを出しました。 –

+0

例文( 'corpus2')と同じ文で試しましたか? 「研究」という言葉があなたのコーパスに現れないと、「範囲外」というエラーが出る可能性があります。 'inspect(tdm)'を実行すると、どのような出力が得られますか? –