Соответствие предложения в R - PullRequest
0 голосов
/ 01 октября 2018

У меня есть 2 таблицы.Таблица1 - это таблица меньшего размера со значениями около 10К.Таблица 1 (образец):

KeyWords                         PageView
Phillips Trimmer                123
Buy Samsung Mobile              45
Ripe yellow Banana              63
Pepsi                           140

Таблица 2 содержит 1 миллион значений.

Таблица 2 (образец):

KeyWords                         PageView
Electric Trimmer                123
Samsung Mobile                  45
Yellow Ripe Banana              63
Samsung S6                      304
Banana                          105
Phillips                        209
Trimmer Phillips                29

Теперь я хочу взять все словаиз таблицы 1 и посмотрите в таблицу 2 и найдите лучшее совпадение.Порядок слов не должен иметь большого влияния в матче, т.е. «Спелый желтый банан» должен идеально соответствовать «Желтому спелому банану».«Купить Samsung Mobile» должно совпадать с «Samsung Mobile» и с «Samsung S6».

Окончательный результат должен выглядеть следующим образом.

Таблица 3:

Word                            PageView   Match
Phillips Trimmer                123        Trimmer Phillips
Buy Samsung Mobile              45         Samsung Mobile
Ripe yellow Banana              63         Yellow Ripe Banana
Pepsi                           140        NA

Был бы очень признателен, если бы мы могли поставить и токенизировать предложение перед выполнением сопоставления.

Я пробовал следующее, но оно не работает должным образом, и цикл занимает довольно много времени.

file_1$match <- ""
for(i in 1:dim(file_1)[1]) {
print(i)
x <- grep(file_1$Keywords[i],file_2$Keyword,value = T, ignore.case = m 
T,useBytes = T)
x <- paste0(x,"")
file_1$match[i] <- x
}
  • Я пытался использовать 'agrep', а также изменять 'max.параметр расстояния.Результаты оказались не такими, как ожидалось.

1 Ответ

0 голосов
/ 02 октября 2018

Отредактировано: я использовал функцию «apply», чтобы выполнить следующее в каждой строке tab1: функция внутри «apply», берет x [1], которое является ключевым словом (скажем, «Ripe Yellow Banana»), strsplit разбивает егочерез пробел («Спелый», «Желтый», «Банановый»), sapply выполняет grepl для каждого из этих разбиений, чтобы увидеть, существует ли шаблон в tab2.таким образом, у вас будет 3 колонны истинных ложных фраз для «Спелых», «Желтых» и «Банановых»Следующим шагом является подсчет количества истин для каждой строки и вывод табуляции с этим номером строки.Я также поместил оператор if, чтобы дать NA, если максимальное число истин равно 0:

tab1<-data.frame(Keyword=c("Phillips Trimmer",
                 "Buy Samsung Mobile","Ripe Yellow Banana","Pepsi"),
                 PageView=c(123,45,63,140))

tab2<-data.frame(Keyword=c("Electric Trimmer","Samsung Mobile",
                 "Yellow Ripe Banana","Samsung S6","Banana",
                  "Phillips","Trimmer Phillips","Buy Trimmer Philips"),
                 PageView=c(123,45,63,304,105,209,29,21))

tab2$StrLen<-apply(tab2,1,function(x)length(unlist(strsplit(x[1], " "))))
tab1$BestMatch<-apply(tab1,1,function(x){
  a <-sapply(unlist(strsplit(x[1], " ")), grepl, tab2$Keyword)
  a<-cbind(a,TRUECnt=rowSums(a==TRUE))
  a<-as.data.frame(a)
  a$StrLen <- length(unlist(strsplit(x[1], " ")))

  if (max(a$TRUECnt)==0){
    return(NA)
  }
  return(as.character(tab2[which(a$TRUECnt==max(a$TRUECnt) &
                                 tab2$StrLen <= a$StrLen),]$Keyword))

})

View(tab1)    View(tab1)
       #              Keyword PageView          BestMatch
       # 1   Phillips Trimmer      123   Trimmer Phillips
       # 2 Buy Samsung Mobile       45     Samsung Mobile
       # 3 Ripe Yellow Banana       63 Yellow Ripe Banana
       # 4              Pepsi      140               <NA>
...