如何使用余弦相似度/ TF-IDF

时间:2020-06-30 10:19:16

标签: r tf-idf cosine-similarity text2vec textmatching

我正在尝试查找医生报告的术语与其他正确字符串之间的近似/精确匹配 这里有示例术语和代码。

report_df <- data.frame(Verb=c('head pain','lung cance','abdminal pain'),stringsAsFactors = FALSE)

report_df
 
med_df <- data.frame(Lowest=c('cardio attack','breast cancer','abdomen pain','head ache','lung cancer'),stringsAsFactors = FALSE)

my_dist <- function(x, y) 1 - adist(x, y) / nchar(y)

x <- my_dist(report_df$Verb, med_df$Lowest)
 
mx <- apply(x, 1, function(y) {mx <- which.max(y); c(y[mx], mx)})
 
data.frame(Written.Terms = report_df$Verb, 
           suggestedterms = med_df$Lowest[mx[2, ]], 
           Similarity_percentage = mx[1, ])

output

肺癌报告应获取 95%百分比,但其获取率为88%,如下所示。

我面临的两个挑战: 我现在面临两个挑战:

  • 我有1万个报告术语,需要在8万个术语中查找最接近/相似的匹配项。
  • 文本到文本的比较匹配总是要花费大量时间,因此我正在寻求有关TFIDF概念在计算相似性方面的帮助

这是使用text2vec pacakge中的余弦函数计算相似度的代码:

it11 = itoken(report_df$Verb, progressbar = FALSE)
it11

it22 = itoken(med_df$Lowest, progressbar = FALSE)

ver <- data.frame(verb=report_df$Verb,stringsAsFactors = FALSE)
llt1 <- data.frame(verb=med_df$Lowest,stringsAsFactors = FALSE)
ver1_llt <- data.frame(verb_llt=rbind(ver,llt1),stringsAsFactors = FALSE)


it = itoken(ver1_llt$verb, progressbar = FALSE)
v = create_vocabulary(it)
v = prune_vocabulary(v, doc_proportion_max = 0.1, term_count_min = 0)
vectorizer = vocab_vectorizer(v)

dtm1 = create_dtm(it11, vectorizer)
dim(dtm1)


dtm2 = create_dtm(it22, vectorizer)
dim(dtm2)

d1_d2_jac_sim = sim2(dtm1, dtm2, method = "jaccard", norm = "none")
dim(d1_d2_jac_sim)
d1_d2_jac_sim

d1_d2_cos_sim = sim2(dtm1, dtm2, method = "cosine", norm = "l2")
d1_d2_cos_sim

apply(d1_d2_cos_sim, 1,max) 

能否请您为此提供帮助,并提供您宝贵的建议。 谢谢

0 个答案:

没有答案