Я пытаюсь вычислить матрицу совпадения терминов (или TCM) из корпуса, используя пакет text2vec
в R
(поскольку у него есть хороший параллельный бэкенд). Я следил за этим руководством, но при изучении некоторых игрушечных примеров я заметил, что функция create_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».
Бонусный вопрос: как вообще работает масштабирование по умолчанию? Если вы добавите больше «а» к последнему примеру, то значение b-c будет линейно уменьшаться, в то время как значение b-a на самом деле увеличивается, хотя больше вхождений или «a» появляется дальше от «b».
skip_grams_window = 5
,c("a b", "c a a a a a a b")
иc("a b", "c a a a a a b")
дадут тот же результат, что иtcmtest
. - person Jota   schedule 30.10.2016jobs
в этой винье а>. Также хочу добавить, что использование параллельного бэкенда наtcm
имеет смысл только для очень больших корпусов. - person Dmitriy Selivanov   schedule 31.10.2016tcm
creation отличается — мы вычисляем его для каждого фрагмента, а затем суммируем их, см. здесь. Однако в этом случае мы сталкиваемся с накладными расходами в потреблении памяти... Пока у нас достаточно оперативной памяти, мы можем попытаться увеличить ее параллельно. Но по моему опытуtcm
сборка обычно не является узким местом - мы строим один раз, а повторно используем много раз. Созданиеtcm
в 1 теме на английской википедии занимает ~ 2 часа. - person Dmitriy Selivanov   schedule 01.11.2016create_tcm
. - person Dmitriy Selivanov   schedule 01.02.2017