Glove Word Mover Сходство

Я хочу рассчитать сходство текста, используя дистанцию ​​перемещения слов. У меня есть два разных набора данных (корпус). Увидеть ниже.

A <- data.frame(name = c(
  "X-ray right leg arteries",
  "consultation of gynecologist",
  "x-ray leg arteries",
  "x-ray leg with 20km distance",
  "x-ray left hand"
), stringsAsFactors = F)

B <- data.frame(name = c(
  "X-ray left leg arteries",
  "consultation (inspection) of gynecalogist",
  "MRI right leg arteries",
  "X-ray right leg arteries with special care"
), stringsAsFactors = F)

Я использую пакет text2vec в R.

library(text2vec)
library(stringr)
prep_fun = function(x) {
  x %>% 
    # make text lower case
    str_to_lower %>% 
    # remove non-alphanumeric symbols
    str_replace_all("[^[:alnum:]]", " ") %>% 
    # collapse multiple spaces
    str_replace_all("\\s+", " ")
}
Combine both datasets
C = rbind(A, B)

C$name = prep_fun(C$name)

it = itoken(C$name, progressbar = FALSE)
v = create_vocabulary(it) %>% prune_vocabulary()
vectorizer = vocab_vectorizer(v)
dtm = create_dtm(it, vectorizer)
tcm = create_tcm(it, vectorizer, skip_grams_window = 3)
glove_model = GloVe$new(word_vectors_size = 10, vocabulary = v, x_max = 3)
wv = glove_model$fit_transform(tcm, n_iter = 10)

# get average of main and context vectors as proposed in GloVe paper
wv = wv + t(glove_model$components)
rwmd_model = RWMD$new(wv)
rwmd_dist = dist2(dtm[1:nrow(A), ], dtm[nrow(A)+1:nrow(C), ], method = rwmd_model, norm = 'none')

head(rwmd_dist)

          [,1]      [,2]      [,3]      [,4]
[1,] 0.1220713 0.7905035 0.3085216 0.4182328
[2,] 0.7043127 0.1883473 0.8031200 0.7038919
[3,] 0.1220713 0.7905035 0.3856520 0.4836772
[4,] 0.5340587 0.6259011 0.7146630 0.2513135
[5,] 0.3403019 0.5575993 0.7568583 0.5124514

Есть ли skip_grams_window = 3 в tcm = create_tcm(it, vectorizer, skip_grams_window = 3) код означает проверку 3 слов справа при создании матрицы совпадений? Например, текст "Рентгенография артерий правой ноги" станет вектором - цель: "Рентген"

right   leg arteries
1   1   1

Какая польза от word_vectors_size? Я прочитал алгоритм перчатки, но не понял, как использовать эту функцию.

glove_model = GloVe $ new (word_vectors_size = 10, словарь = v, x_max = 3)

1 ответ

Предложите указать skip_grams_window_context (действительные значения: "symmetric", "right", или же "left") вместе с skip_grams_window аргумент. [Документация]

word_vectors_size Аргумент используется для определения размерности базовых векторов слов. Это означает, что каждое слово преобразуется в вектор в векторном пространстве N-измерения. Есть несколько статей с хорошим объяснением векторов слов ( статья 1 и статья 2).

В вашем примереglove_model = GloVe$new(word_vectors_size = 10, vocabulary = v, x_max = 3), это подразумевает 10-мерные векторы слов.

Выбор подходящего размера для векторов слова важен. Согласно этому ответу в октябре 2014 года,

Типичный интервал между 100-300. Я бы сказал, что вам нужно как минимум 50D, чтобы достичь минимальной точности. Если вы выберете меньшее количество измерений, вы начнете терять свойства многомерных пространств. Если время обучения не имеет большого значения для вашего приложения, я бы остановился на 200D измерениях, так как это дает хорошие возможности. Предельная точность может быть достигнута с 300D. После 300D словесные возможности не улучшатся кардинально, а обучение будет очень медленным.

Другие вопросы по тегам