Как использовать LSH для сопоставления имен в R? - PullRequest
0 голосов
/ 28 марта 2019

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

Есть предложения? Большое спасибо!

...