У меня есть некоторые медицинские услуги, а также аналогичные услуги в следующем столбце.В приведенном ниже коде столбец name1
содержит службы, а столбец name2
- аналогичные службы.Вы можете считать name2
целевой переменной.Я пытаюсь извлечь синонимы слова.
A <- data.frame(name1 = c(
"X-ray right leg arteries",
"consultation of gynecologist",
"Magnetic reasoning imaging leg arteries",
"radiography leg with 20km distance"
), name2 = c(
"Radiography left leg arteries",
"inspection of gynecalogist",
"MRI right leg arteries",
"x-ray right leg arteries"
), stringsAsFactors = F)
Я объединил оба столбца, чтобы я мог применить алгоритм word2vec и найти синонимы.
A["name"] = paste(A$name1, A$name2)
A["name"] = gsub("[[:punct:]]", "", A$name)
Проблема этого подхода -после объединения аналогичные слова (например, рентгеновская рентгенография) далеки от расстояния.Алгоритм Word2Vec наказывает их.
library(magrittr)
library(text2vec)
library(stringr)
library(stringi)
tokens = A$name %>% tolower %>% word_tokenizer()
it = itoken(tokens)
# Create and Prune vocabulary
v = create_vocabulary(it) %>% prune_vocabulary(term_count_min=1)
vectorizer = vocab_vectorizer(v)
# Term-co-occurence matrix
tcm = create_tcm(it, vectorizer, skip_grams_window = 10)
# Glove Model
model = GlobalVectors$new(word_vectors_size=50, vocabulary=v, x_max=1, learning_rate=0.15)
wv_main = model$fit_transform(tcm,n_iter=25)
wv = model$components #Dimension words x wvec_size
word_vectors = wv_main + t(wv)
#Make distance matrix
d = dist2(word_vectors, method="cosine") #Smaller values means closer
# Find closely related words
findCloseWords = function(w,d,n) {
words = rownames(d)
i = which(words==w)
if (length(i) > 0) {
res = sort(d[i,])
print(as.matrix(res[2:(n+1)]))
}
else {
print("Word not in corpus.")
}
}
findCloseWords("xray",d,3)
[,1]
right 0.7636013
mri 0.8105633
leg 0.8390371
Он должен возвращать рентгенографию, поскольку рентген и рентгенография означают одно и то же.