Я новичок в методе 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. Даже вышеприведенный подход верен, но это не самый эффективный способ, потому что не имеет смысла сравнивать «это яблоко» и «это яблоко восхитительно». В очень большом наборе данных вычисление чрезвычайно дорого.
Есть предложения? Большое спасибо!