2017-05-08 7 views
0

私はすべての品詞タグを1行に数えて合計します。今では列ごとのPOSタグのカウント

は、私は2つの出力に達し:

1)/ DTの質問を/ NNでした/ VBDは、/、どのような/ WPは/ VBPあなた/ PRP// VBをカットするために/ VBGを行く/ですか?。 "VB"、 "VBP"、 "PRP"、 "VBG"、 "TO"、 "VB"、 "VB"、 "VB"、 "VB"、 "VB"、 "VB"、。 「)

この特定の例では、望ましい出力は次のとおりです。

 DT NN VBD WP VBP PRP VBG TO VB 
1 doc 1 1 1 1 1 1  1  1 1 

しかし、私はデータフレームで列全体のためにそれを作成したいので、私が対応され、列にそこにも0の値を見てみたいですこの文で使われていなかったPOSタグ。

例:

1 doc = "The/DT question/NN was/VBD ,/, what/WP are/VBP you/PRP going/VBG to/TO cut/VB ?/" 

2 doc = "Response/NN ?/." 

出力:私は今でやった

 DT NN VBD WP VBP PRP VBG TO VB 
1 doc 1 1 1 1 1 1  1  1 1 
2 doc 0 1 0 0 0 0  0  0 0 

library(stringr) 
#Spliting into sentence based on carriage return 

s <- unlist(lapply(df$sentence, function(x) { str_split(x, "\n")  })) 

library(NLP) 
library(openNLP) 

tagPOS <- function(x, ...) { 
s <- as.String(x) 
word_token_annotator <- Maxent_Word_Token_Annotator() 
a2 <- Annotation(1L, "sentence", 1L, nchar(s)) 
a2 <- annotate(s, word_token_annotator, a2) 
a3 <- annotate(s, Maxent_POS_Tag_Annotator(), a2) 
a3w <- a3[a3$type == "word"] 
POStags <- unlist(lapply(a3w$features, `[[`, "POS")) 
POStagged <- paste(sprintf("%s/%s", s[a3w], POStags), collapse = " ") 
list(POStagged = POStagged, POStags = POStags) 
} 

result <- lapply(s,tagPOS) 
result <- as.data.frame(do.call(rbind,result)) 

私は初め

で記述された出力に達した方法です

Ih aveは次のような出現回数をカウントしようとしました: 出現< -as.data.frame(table(unlist(result $ POStags)))

しかし、データフレーム全体で出現回数がカウントされます。既存のデータフレームに新しい列を作成し、最初の列にオカレンスを数える必要があります。

誰でも教えてください。 :(tmを使用して

+1

だけでなく、あなたも可能性が所望の出力を追加し、あなたがこれまでに試した上で行われますが、あなたの 'df'のサンプルを提供しますか? –

+1

また、 'tm :: TermDocumentMatrix'を見て、ドキュメントの実際の単語の代わりにPOStagsを使って、マトリックスを作成することもできます。 –

+0

私はtmに関して同じ考えを持っていました。私は今日後でそれを試してみます。ありがとうございました! dfについて: '問題は何だったのですか? 完全に制御不能です。 私はクリーンコールテクノロジーをサポートしています。 ' これは私がdfで持っているものです – ZverArt

答えて

1

は比較的painfreeです:

corpus <- Corpus(VectorSource(df$tags)) 
#default minimum wordlength is 3, so make sure you change this 
dtm <- DocumentTermMatrix(corpus, control= list(wordLengths=c(1,Inf))) 

#see what you've done 
inspect(dtm) 

<<DocumentTermMatrix (documents: 2, terms: 9)>> 
Non-/sparse entries: 10/8 
Sparsity   : 44% 
Maximal term length: 3 
Weighting   : term frequency (tf) 
Sample    : 
    Terms 
Docs dt nn prp to vb vbd vbg vbp wp 
    1 0 1 0 0 0 0 0 0 0 
    2 1 1 1 1 1 1 1 1 1 

ETA:

ダミーデータ

require(tm) 
    df <- data.frame(ID = c("doc1","doc2"), 
        tags = c(paste("NN"), 
          paste("DT", "NN", "VBD", ",", "WP", "VBP", "PRP", "VBG", "TO", "VB", "."))) 

コーパスとDocumentTermMatrix作るあなたはDTMでの作業嫌いならば、それをデータフレームに強制することができます:

as.data.frame(as.matrix(dtm)) 

    nn dt prp to vb vbd vbg vbp wp 
1 1 0 0 0 0 0 0 0 0 
2 1 1 1 1 1 1 1 1 1 

ETA2:Corpusのみカラムdf$tagsのコーパスを作成し、VectorSourceデータの各行が一つのドキュメントであると仮定し、そうDocumentTermMatrixにおけるデータフレームdfの行の順序、およびドキュメントの順序であります同じ:私はcbinddf$ID出力データフレームにすることができます。私はそれが最も読みやすいコードになりだと思うので、私は(と%>%を読んで「とし、」)dplyrを使用してこの操作を行います。

require(dplyr) 
result <- as.data.frame(as.matrix(dtm)) %>% 
      bind_col(df$ID) 
+0

スーパー!できます!どうもありがとうございました! – ZverArt

+1

あなたが今「もし私が 'simple_triplet_matrix'で何をやろうとしているのか? –

+1

POStag名を小文字に変換しないように設定できるコントロールオプションもあります。 –

関連する問題