Нечеткое сравнение между двумя столбцами улья с использованием искры apache и scala

Я читаю данные из 2 таблиц кустов. В таблице токенов есть токены, которые необходимо сопоставить с входными данными. Входные данные будут иметь столбец описания вместе с другими столбцами. Мне нужно разделить входные данные и сравнить каждый разделенный элемент со всеми элементами из таблицы токенов. в настоящее время я использую библиотеку me.xdrop.fuzzywuzzy.FuzzySearch для нечеткого соответствия.

ниже мой фрагмент кода-

val tokens = sqlContext.sql("select token from tokens")
val desc = sqlContext.sql("select description from desceriptiontable")
val desc_tokens = desc.flatMap(_.toString().split(" "))

Теперь мне нужно перебрать desc_tokens, и каждый элемент desc_tokens должен быть нечетко сопоставлен с каждым элементом токенов, и если совпадение превышает 85%, мне нужно заменить элемент из desc_tokens элементом из токенов.

Пример --

Мой список токенов

hello
this
is
token
file
sample

и мое входное описание

helo this is input desc sampl

код должен вернуться

hello this is input desc sample 

так как hello и helo нечетко совпадают > 85%, поэтому helo будет заменен на hello. Аналогично для сэмпл.


person shashank kulkarni    schedule 28.06.2017    source источник


Ответы (1)


Я делаю тест с этой библиотекой: https://github.com/rockymadden/stringmetric

Другая идея (не оптимизирована):

//I change order tokens
val tokens = Array("this","is","sample","token","file","hello");
val desc_tokens = Array("helo","this","is","token","file","sampl");

val res = desc_tokens.map(str => {
  //Compute score beetween tokens and desc_tokens
  val elem = tokens.zipWithIndex.map{ case(tok,index) => (tok,index,JaroMetric.compare(str, tok).get)}
  //Get token has max score
  val emax = elem.maxBy{case(_,_,score) => score}
  //if emax have a score > 0.85 get It. Else keep input
  if(emax._3 > 0.85) tokens(emax._2) else str

})
res.foreach { println }

Мой вывод: hello this is token file sample

person Jeremy    schedule 28.06.2017
comment
Спасибо @Jeremy за ответ. zipWithIndex будет проходить по индексу. Поэтому, если токен приветствия присутствует в индексе 2 или 3, этот код не будет работать. Что я ищу, так это то, что каждый токен из входного описания должен искать все токены из списка токенов и возвращать токен из списка токенов, который соответствует лучшему или первому совпадению (> 85%) - person shashank kulkarni; 29.06.2017