Как использовать LSH для сопоставления имен в R?
Я новичок в методе LSH из пакета textreuse и считаю его очень удобным. Особенно для очень большого набора данных.
Простое парное сравнение не будет возможным, так как у меня есть очень большой набор данных. Попарное сравнение убивает мою сессию R...
Тем не менее, я хотел бы знать, есть ли более простой способ связывания записей с использованием пакета textreuse, когда я уже знаю справочные данные.
Пример: у меня есть список текстовых сообщений, и я хочу связать их со своим ссылочным термином сообщение
**message** 1 this is apple 2 this apple is delicious 3 this pineapple looks good 4 can i find stawberry 5 I like to eat chocolate 6 food is good
Я хочу найти "связь" или совпадать с предоставленным списком терминов
7 apple 8 chocolate 9 food
Поэтому идеальные результаты должны быть
message --------- search_term 1 this is apple --------- 7 apple 2 this apple is delicious --------- 7 apple 3 this pineapple looks good --------- NA 4 can i find stawberry --------- NA 5 I like to eat chocolate --------- 8 chocolate 6 food is good --------- 9 food
Чтобы добиться этого, я попробовал следующий код, но он не увенчался успехом,
docu <- data.frame(message= c("this is apple", "this apple is delicious",
"this pineapple looks good", "can i find stawberry",
"I like to eat chocolate", "food is good"))
search_docu <- data.frame(message= c("apple", "chocolate", "food"))
dat<- rbind(docu, search_docu)%>% rowid_to_column()
minhash <- minhash_generator(n = 240, seed = 02082018)
# build the corpus using textreuse
docs <- apply(dat, 1, function(x) paste(x[-1], collapse = " "))
names(docs)<- dat$rowid
corpus <- TextReuseCorpus(text = docs,
tokenizer = tokenize_words,
progress = FALSE,
keep_tokens = TRUE,
minhash_func = minhash,
skip_short = F
)
buckets <- lsh(corpus, bands = 10, progress = FALSE)
# grab candidate pairs
candidates <- lsh_candidates(buckets)
# get Jaccard similarities only for candidates
lsh_jaccard <- lsh_compare(candidates, corpus, jaccard_similarity, progress = FALSE)
lsh_df<- lsh_jaccard %>% mutate(a=as.numeric(a),b=as.numeric(b)) %>% as.data.frame()%>%
left_join(dat, by = c("a"="rowid")) %>%
left_join(dat, by = c("b"="rowid"))
Теперь у меня есть два вопроса: 1. что не так с этим кодом? 2. Даже вышеприведенный подход верен, но это не самый эффективный способ, потому что не имеет смысла сравнивать "это яблоко" и "это яблоко восхитительно". В очень большом наборе данных это очень дорого вычислять.
Любое предложение? Большое спасибо!