0

我想使用宽松的单词移动距离来计算文本相似度。我有两个不同的数据集(语料库)。见下文。

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)

我在 R 中使用 text2vec 包。

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 个单词?例如,文本 'X-ray right leg arteries' 将变成矢量 - target :'X-ray'

right   leg arteries
1   1   1

有什么用word_vectors_size?我读过手套的算法,但不明白这个函数的用法。

glove_model = GloVe$new(word_vectors_size = 10, 词汇 = v, x_max = 3)

4

1 回答 1

0

建议与参数一起指定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 年 10 月回复,

典型的间隔在 100-300 之间。我会说您至少需要 50D 才能达到最低精度。如果您选择较少的维度,您将开始失去高维空间的属性。如果训练时间对您的应用程序来说不是什么大问题,我会坚持使用 200D 尺寸,因为它提供了很好的功能。使用 300D 可以获得极高的精度。300D 之后的单词特征不会有显着提升,训练会非常慢。

于 2018-09-09T00:27:30.857 回答