2016-10-30 9 views
0

私はtext2vecパッケージをRに入れてコーパスから用語の共起行列(またはTCM)を計算しようとしています(これは良い並列バックエンドを持っているためです)。私はthis tutorialを追跡しましたが、いくつかのおもちゃの例を調べているうちに、create_tcm関数は、用語の共起値に何らかのスケーリングや重み付けをしていることに気付きました。私はそれが内部的にスキップグラムを使用することを知っていますが、ドキュメンテーションはそれらがどのようにスケールするかについては言及していません - 明らかに遠い用語/ユニグラムは重み付けが低くなります。ここでRのtext2vecを使用して、重み付けされていないbag-of-wordsベースのTCMを計算しますか?

は一例です:

tcmtest = function(sentences){ 
    tokens <- space_tokenizer(sentences) 
    it = itoken(tokens, progressbar = FALSE) 
    vocab <- create_vocabulary(it, ngram = c(ngram_min = 1L, ngram_max = 1L)) 
    vectorizer <- vocab_vectorizer(vocab, grow_dtm = FALSE, skip_grams_window = 5L) 
    return(create_tcm(it, vectorizer)) 
} 

> tcmtest(c("a b", "a b c")) 
3 x 3 sparse Matrix of class "dgTMatrix" 
    b c a 
b . 1 2.0 
c . . 0.5 
a . . . 
> tcmtest(c("a b", "c a b")) 
3 x 3 sparse Matrix of class "dgTMatrix" 
    b c a 
b . 0.5 2 
c . . 1 
a . . . 
> tcmtest(c("a b", "c a a a b")) 
3 x 3 sparse Matrix of class "dgTMatrix" 
    b c  a 
b . 0.25 2.833333 
c . . 1.833333 
a . . . 

質問:スキップグラムウィンドウ内のすべての用語/ユニグラムが平等に扱われるように、この動作を無効にする方法は、ありますか?つまり、ある用語が別の用語のコンテキストウィンドウ内でコーパス内で2回発生する場合、TCM行列では「2」と表示されます。

ボーナスに関する質問:デフォルトスケーリングの仕組みはどういう仕組みですか?最後の例に "a"を追加すると、b-c値は直線的に減少するように見えますが、実際にはb-a値は増加します。

+2

ボーナスの質問:最後の例では、 "b"はcの4番目の文字です。それは1/4です。 "a"と "c"には、cから1,2,3文字で "a"があります。それは1 + 1/2 + 1/3 = 1.833333です。 "b"と "a"の場合、 "a"が "b"のすぐ隣にあり、次に2つの "a"のインスタンスがあり、それぞれ "b"から2と3の距離にあります。それは2 + 1/2 + 1/3です。あなたは 'skip_grams_window = 5'を持っているので' c( "a b"、 "c a a a a a b") 'と' c( "a b"、 "c a a a a a b") 'は' tcmtest'と同じ結果を生成します。 – Jota

+0

@Jotaクール、それは理にかなっています。今、私はこのスケーリングのことを迂回しますか? – user3554004

+0

@ user3554004実際には、あなたの例では並列バックエンドを使用していません。この[vignette](https://cran.r-project.org/web/packages/text2vec/vignettes/files-multicore.html#multicore_machines)で 'jobs'をどのように作成するかをご覧ください。また、 'tcm'に並列バックエンドを使用することは、非常に大きなコーパスに対してのみ意味をなさないことを追加したいと思います。 –

答えて

1

UPDATE 2017年2月1日 Pushed update to github - 今、あなたはcreate_tcmに直接重みベクトルを指定することができます。

重み関数は、hereと定義されています。 あなたは、ウィンドウ内の各用語について等しい重みが必要な場合は、常に1を返すように重み関数を調整する必要があります(ただ、変更機能の定義をレポのクローンを作成し、devtoolsまたはR CMD buildでソースからパッケージをビルドする):

inline float weighting_fun(uint32_t offset) { 
    return 1.0; 
} 

しかし、いくつかの人々は既にこの機能を求めており、おそらく次のリリースでこのオプションを含める予定です。

関連する問題