2017-06-28 2 views
0

Je lis les données de 2 tables de ruche. La table de jetons a les jetons qui doivent être mis en correspondance avec les données d'entrée. Les données d'entrée auront une colonne de description avec d'autres colonnes. J'ai besoin de séparer les données d'entrée et de comparer chaque élément divisé avec tous les éléments de la table des jetons. actuellement j'utilise me.xdrop.fuzzywuzzy.FuzzySearch bibliothèque pour la correspondance floue.Fuzzy Comparer entre deux colonnes de ruche en utilisant l'étincelle apache avec scala

ci-dessous est mon code snippet-

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

Maintenant je dois itérer desc_tokens et chaque élément de desc_tokens doit être floue en correspondance avec chaque élément de jetons et il dépasse correspondance 85% i besoin de remplacer l'élément de desc_tokens par élément des jetons.

Exemple -

Ma liste jeton est

hello 
this 
is 
token 
file 
sample 

et ma description d'entrée est

helo this is input desc sampl 
Code

doit retourner

hello this is input desc sample 

comme bonjour et helo sont floues assorties> 85% donc helo sera remplacé par bonjour. De même pour sampl.

Répondre

0

Je fais un test avec cette bibliothèque: https://github.com/rockymadden/stringmetric

Autre idée (non optimisé):

//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 } 

Ma sortie: hello this is token file sample

+0

Merci pour la réponse @ Jeremy. zipWithIndex traverse l'index. Donc, si le jeton Hello est présent à l'index 2 ou 3, ce code ne fonctionnera pas. Ce que je cherche, c'est que chaque jeton de la description de l'entrée doit rechercher tous les jetons de la liste de jetons et retourner le jeton de la liste de jetons correspondant le mieux à la première correspondance (> 85%) –