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)

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+", " ")
}

合并两个数据集

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

期望的输出:数据框 A 的“妇科医生会诊”应映射到数据框 B 的“妇科医生会诊(检查)”。同样,数据框 A 的文本应与数据框 B 的文本匹配。

4

1 回答 1

0

我正在做类似或相同的事情,很快我将上传我的试用版。现在,我正在尝试优化向量、窗口和图形,如果 5700 个语音的语料库平均从 1000 到 2000 个单词 [在删除停用词后,词干提取] 是否足够。

如果仍然需要,会回来发布链接,但据我所知,您没有标记语料库 - itokens 与我理解的不同。同样在互联网上,作者使用了 word_tokenizer 函数。

最后,尝试使用 pdist2 函数,并希望数据框中的单独行中的文本。它产生一个平行的距离。

于 2018-11-21T20:33:57.977 回答