2016-03-31 25 views
1

tmパッケージのfindAssocs()をドキュメントの頻度行列に使用して、コーパス内のさまざまなドキュメントの特定の用語に関連する単語を識別しています。tmパッケージのfindAssocs()が関連を抑制する

私の問題は、1つの単語を入力として与えた場合と比べて、関数の入力として単語のベクトルを与えると、出力が違うことです。

これは私の例です。

library(tm) 
txt <- c("alpha bravo", "alpha charlie", "alpha charlie", "zulu") 
corp <- Corpus(VectorSource(txt)) 
dtm <- DocumentTermMatrix(corp) 

私は(意図したように)以下のような出力を得る"alpha"に関連付けられたすべての用語を特定したい場合は、以下のDTM

> as.matrix(dtm) 
    Terms 
Docs alpha bravo charlie zulu 
    1  1  1  0 0 
    2  1  0  1 0 
    3  1  0  1 0 
    4  0  0  0 1 

を返します:

> findAssocs(dtm, "alpha", 0.00) 
$alpha 
charlie bravo 
    0.58 0.33 

私が行うことができます"bravo"と同じで、次のような出力が得られます(0120)。

> findAssocs(dtm, "bravo", 0.00) 
$bravo 
alpha 
0.33 

これらの関連付けをいくつかの用語で検索したいので、必要な出力を得るためにベクトルをfindAssocsに渡しました。

> findAssocs(dtm, c("alpha","bravo"), 0.00) 
$alpha 
charlie 
    0.58 

$bravo 
numeric(0) 

実際、"alpha""bravo"間assocationが動作されていない省略されている:私は、関数への用語(CHR)のベクトルを渡す場合は、出力は、私は、単一の入力のために得るものとは異なります私はここに期待していただろう。この関数は、個々の項を互いに独立して扱うようであるため、両方ともベクトルの関数に渡される場合、"alpha""bravo"の間の相関を分析しません。

誰もその動作を説明し、それを省略する方法を教えてもらえますか?回避策として...私は、各単一タームのための機能を適用できるが、それは本当に便利ではありません

UPDATE

私は奇妙な見つけることは"alpha""bravo"間の相関が省略されていないということであるならば、私たちのプロット協会、例えば以下のコードを:どのように

> freqTerm <- findFreqTerms(dtm, 1) 
> freqTerm 
[1] "alpha" "bravo" "charlie" "zulu" 

plot(dtm, term=freqTerm, corThreshold=0.0, weighting=T, attrs=list(node=list(fixedsize=FALSE, shape="ellipse"))) 

plot(dtm, term=freqTerm ..."findAssocs()"は異なるのですか?

+2

'findAssocs(dtm、c(" alpha "、" bravo ")、0.00)'という用語は、 'c(" alpha "、" bravo " *コーパスの用語。これはあなたが渡したベクトル内の項のペアごとの相関関係を計算しません。 –

+0

あなたが望むことを行う適切な方法は、 'sapply(c(" alpha "、" bravo ")、function(x)findAssocs(dtm、 ) – scoa

答えて

0

tm::findAssocs()は、@ Steven Beauportのコメントに記載された理由と直接的な比較は省略しています。相関性が高い可能性のある小さな用語セットを探していることを考えると、これは機能よりもバグのようです。これは、oilopecという用語が最もよく似ているが、他方の関連ベクトルのそれぞれを省略することによってマスクされている、この関数の例で説明されています(?tm::findAssocs参照)。

library(quanteda) 
txt <- c("alpha bravo", "alpha charlie", "alpha charlie", "zulu") 
corp <- corpus(txt) 
dtm <- dfm(corp, verbose = FALSE) 
# this also works fine if you want to go straight from text: 
# dtm <- dfm(txt, verbose = FALSE) 

(simlist <- similarity(dtm, c("alpha","bravo"), margin = "features")) 
## similarity Matrix: 
## $alpha 
## charlie bravo zulu 
## 0.5774 0.3333 -1.0000 
## 
## $bravo 
## alpha zulu charlie 
## 0.3333 -0.3333 -0.5774 

それとも、マトリックスとしてそれを好む場合:

as.matrix(simlist) 
##    alpha  bravo 
## alpha 1.0000000 0.3333333 
## charlie 0.5773503 -0.5773503 
## bravo 0.3333333 1.0000000 
## zulu -1.0000000 -0.3333333 

similarity()はコサイン類似性を行うことができますだけでなく、

代替はquantedaパッケージから同等の機能を使用することですプロキシパッケージで定義されている他の類似点ですが、(ピアソンの)相関およびコサインメソッドは現在、完全に疎な計算で実装されています他の人は(まだ)そうではありません。 margin = "documents"を定義することによって、クラスタリングなどの用語の代わりに文書を比較することもできます。

+0

また、プロット関数が異なっている理由も知っているでしょう。(上の質問の更新を見てください) – BjoSch

+0

dtmオブジェクトのプロットメソッドはfindAssocs()とは何の関係もないからです。完全な項の行列を持つdtmに基づいています。 –

関連する問題