私は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値は増加します。
ボーナスの質問:最後の例では、 "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
@Jotaクール、それは理にかなっています。今、私はこのスケーリングのことを迂回しますか? – user3554004
@ user3554004実際には、あなたの例では並列バックエンドを使用していません。この[vignette](https://cran.r-project.org/web/packages/text2vec/vignettes/files-multicore.html#multicore_machines)で 'jobs'をどのように作成するかをご覧ください。また、 'tcm'に並列バックエンドを使用することは、非常に大きなコーパスに対してのみ意味をなさないことを追加したいと思います。 –