[Outils] Drallieiv EHD Work In Progress

Répondre
Partager Rechercher
Bonjour tout le monde,

Comme vous le savez j'ai l'habitude de travailler pour mon site perso et de plus en plus pour celui de JOL. Mais je continue à faire des petits projets au fur et à mesure de mon inspiration.

L'idée est de lancer et présenter des concepts ou des outils simples qui puissent être reprise facilement par ceux qui le souhaitent. Le but est qu'ils puissent être personnalisés ou améliorés et éventuellement intégrés à un Fansite.

Vous avez donc peut être déjà vu "Multiplay" la page web qui permet de jouer en multicompte d'une autre manière. Mais voici quelques news sur une petite gamme d'outils en cours d'étude ou de développement :

EHD Ankama API :
Le but est d'utiliser l'API fournie par le site officiel ankama, pour afficher sur une page les informations d'un item. Le but est ici de mettre en place un mode d'utilisation simple et d'implémenter des plugins sur la version existante (sur le site et les forums officiels)

EHD Id Finder :
La plupart des outils en place pour dofus (y compris les infobulles JOL) se basent sur l'identifiant unique de chaque objet. Le but de cet outil est de fournir une interface simple pour retrouver l'identifiant sans avoir besoin d'utiliser et de maintenir une base de donnée.
Cet outil reprendra le principe de la recherche du moteur de recherche EHD2.0 et sera par la suite éventuellement monté sur la future version.

EHD Natural Search :
Il est souvent difficile de retrouver un objet de dofus lorsque l'on ne connait pas l'orthographe exacte du nom de cet objet. Le but de cet outil, complémentaire à "Id Finder" est de recherche le nom approximatif d'un objet.
Par exemple : "arc isedésange" => "Arc Hisedaisange"


J'ai les idées plutôt bien fixées sur les deux premiers outils, mais je ne sait pas trop par ou commencer pour le dernier. Si quelqu'un à déjà fait ce genre d'outils, ça m'intéresse.

Je vous tient informé de mon avancement sur ces sujet, dans ce fil de discussion.

Drallieiv.
Message supprimé par son auteur.
Citation :
Publié par Garfunk
Quelle API ?
Celle utilisée sur le forum et le site officiel :

en JSON
ou
en XML

Par contre vu qu'il n'y à pas de license précise sur l'API je pense qu'il ne faut pas en abuser et que les droits d'auteurs classique s'appliquent.

Donc pour les petits et les grands, voici une première démo :
http://www.herazade.com/EHD2.0/Dofus_Item_CrossOver/

A vous d'en faire bon usage.
Pour le dernier, tu pourrait bien procéder par un découpage en array de strings, puis compter le nombre de cases dans l'array et par exemple coller un coefficient de 1+-0.3 de longueur a l'array, et ainsi sortir tout les items dont le nom décomposé en array donnerais une longueur dans la même zone (1+-0.3) et ainsi procéder par une comparaison via 2 boucles while (brickées), pour verifier combien de lettre se ressemblent, et a partir d'un certain score converti en % proposer a l'utilisateur le nom de l'item.

Pour aller plus vite aussi il faudra que tu foute dans la bdd un nouveau champ Int ou tu renseigne la longueur du nom de l'item, et ainsi tu accelerera la recherche et tu soulagera le serveur d'enorme requete, parceque a ce moment la tu lui demande juste de te sortir les items where len(itemlenght)<1.3 and len(itemlength)>0.7

Voila, si t'a besoin d'encore plus d'aide envoi un mp

Edit:
Ce qui serais encore plus interessant encore pour pouvoir ordonner les resultat est de calculer un coefficient de proximité des tableaux en matiere de longueur et stocker ça dans une variable, et ensuite essayer de verifier combien de lettre sont dans le bon ordre et coller une sorte de score dans une autre variable, et ainsi coller a chaque item un score de justesse, et au moment de l'affichage classer les items selon cet ordre.

Biensur il ne faudra pas lui demander si n[3] == z[3] alors score++ mais plutot jouer la aussi sur un coefficient de proximité variable donc si n[3] == z[3] alors score = score+10 sinon on continue si n[3] == z[4] alors score = score+8, et ainsi de suite et pareillement pour les case avant donc si n[3] == z[2] alors score = score+8
Je viens de faire une modif pour que ce soit à peu près compatible IE.

Citation :
Publié par DanielJackson
Pour le dernier ...
j'ai pas bien compris tes explications.
Avec ta technique si le mot à renvoyer est "serpillière" et que recherche "serrepillère" tous les caractères sont décalés à cause du r en trop.

Et sinon calculer un score de ressemblance entre la recherche et chaque résultat possible c'est beaucoup trop.


Moi d'une manière logique, je pensait crée un index des noms des objets convertis en phonétique. On convertir la saisie en phonétique et on compare avec l'index.

Est-ce que quelqu'un à une idée de la manière ou Google fonctionner par exemple :

http://www.google.fr/search?hl=fr&q=brenkardi%E9
brenkardié => Essayez avec cette orthographe : brancardier
Comment ça marche ? La recherche s'appuie sur l'algorithme de Levenshtein. Elle recherche et compare deux chaînes et renvoie les occurences trouvé dans un tableau.

$keyword = Le mots clé qui à rien donné
$table = Le nom de la table MySQL ou ce trouve les mots à comparer et a proposer (Donc mon cas la table en question correspond à un historique des recherches, mais ça pourrait carrement être un dictionnaire...)

$fields = Array('champs1') doit correspondre aux champs dans lesquelles faire la recherche

$Key = correspond à un champ ID

$treeshold = doit correspondre à la taille divisé par 2 de $keywords si $keywords >=6

-----------------------------------------------------------------------------------------------

function search_keyword($keyword,$table,$fields,$key,$threshold){

if (!$threshold)
if (strlen($keyword)<6) $threshold=round(strlen($keyword)/2);
else $threshold=3;


$keyword=strtolower($keyword);
$res=mysql_query("SELECT * FROM ".$table);

while ($item=mysql_fetch_object($res))
foreach ($fields as $field)
{
$words=explode(" ",$item->$field);
foreach ($words as $word)
if (levenshtein($keyword, strtolower($word)) < $threshold)
{
$result[]=array($item->$key,$field,$item->$field);
break;
}
}

if (!is_array($result)) return (false);
else return ($result);
}


http://fr.wikipedia.org/wiki/Distance_de_Levenshtein


C'est un peu comme la distance de hamming utilisé par ce forum pour le correcteur d'orthographe
Citation :
Publié par drallieivEHD
j'ai pas bien compris tes explications.
Avec ta technique si le mot à renvoyer est "serpillière" et que recherche "serrepillère" tous les caractères sont décalés à cause du r en trop.
Oui sa nous donnerais un score plus naze et je viens de m'en rendre compte en lisant ton exemple, mais a ce moment la on rajoute un autre score de correction pour chaque lettre qui se suis sa precedente si tout les deux son correctes, et la serrpillièere serais plus prêt de serrepillière

Je vais te donner un exemple avec deux entrées sans le score de correction

supposons qu'on a 2 objets dans la bdd: arcoul et arcoual, et moi dans ma recherche j'ai entré arcol
ce qui nous donne 3 tableau a comparé
tab0[] avec 5 elements qui est arcol
tab1[] avec 6 elements qui est arcoul
tab2[] avec 7 elements qui est arcoual

on vois que ce qui est plus proche est arcoul donc on va mettre scoretab1 = 2
on vois aussi que arcoual est assez proche mais moins que arcoul donc mettre scoretab2 = 1.5

on compare maintenant pour arcol et arcoul
on va mettre scoretab1p2 comme variable de deuxieme score est egale a zero
tab0[0] =? tab1[0] est correct donc scoretab1p2 = scoretab1p2 +10 (10)a
tab0[1] =? tab1[1] est correct donc scoretab1p2 = scoretab1p2 +10 (20)r
tab0[2] =? tab1[2] est correct donc scoretab1p2 = scoretab1p2 +10 (30)c
tab0[3] =? tab1[3] est correct donc scoretab1p2 = scoretab1p2 +10 (40)o
tab0[4] =? tab1[4] est correct donc scoretab1p2 = scoretab1p2 +0 (40)l
tab0[4] =? tab1[5] est correct donc scoretab1p2 = scoretab1p2 +8 (48)l


ce qui nous donne un score finale de 48*2 = 96

pour l'autre c'est la meme chose

on compare maintenant pour arcol et arcoual
on va mettre scoretab2p2 comme variable de deuxieme score est egale a zero
tab0[0] =? tab2[0] est correct donc scoretab2p2 = scoretab2p2 +10 (10)a
tab0[1] =? tab2[1] est correct donc scoretab2p2 = scoretab2p2 +10 (20)r
tab0[2] =? tab2[2] est correct donc scoretab2p2 = scoretab2p2 +10 (30)c
tab0[3] =? tab2[3] est correct donc scoretab2p2 = scoretab2p2 +10 (40)o
tab0[4] =? tab2[4] est incorrect donc scoretab2p2 = scoretab2p2 +0 (40)l
tab0[4] =? tab2[5] est incorrect donc scoretab2p2 = scoretab2p2 +0 (40)l
tab0[4] =? tab2[6] est correct donc scoretab2p2 = scoretab2p2 +6 (46)l

ce qui nous donne un score finale de 46*1.5 = 69

Le premier est gagnant donc l'affiche en premier
L'importance des facteurs est démesurée, mais avec le temps on devrais pouvoir trouver de bonnes valeurs pour les coefficients
Et il y a énormément de travail sur ce principe avant qu'il soit totalement fonctionnel, mais je pense qu'il y'a moyen d'en tirer quelquechose de bien


Quand au principe de Levenstein je ne connais pas


Desolé pour les énormes erreurs de calcul et de comparaison j'ai l'esprit un peu ailleurs (l'estomac aussi)
Au final j'ai fait quelques tests avec certains des algos cités :

http://www.herazade.com/EHD2.0/NaturalSearch/

Un Levenshtein sur l'ensemble du nom
Un Jaro-Winkler sur l'ensemble du nom
Et un Levenshtein mot par mot sur un index des mots

mais bon ça n'as pas l'air très satisfaisant

Un exemple qui marche :
http://www.herazade.com/EHD2.0/Natur...rtau+du+buftou
Tu peux regarder au niveau du soundex pour le 3e outils. Un ami avait fait ça en Java et ça marchait plutôt bien pour des noms et prénoms. En gros les mots sont convertis en une suite de lettre/chiffre selon un algo et c'est cette série de caractère qui est comparé (même genre que l'algorithme de Levenshtein.

A voir ce que ça donne sur des chaines de caractère plus compliquées.
merci pour les pistes sur le phonex (et soundex)
ça correspond bien à ce que j'imaginais à la base, une sort de simplifications des sons pour comparer deux chaines de caractère (cf mon exemple sur google).

J'ai rajouté une démo à base de phonex qui fait une première recherche phonex exacte sur le nom de l'objet, puis un Levenshtein sur le code phonex si il ne trouve pas de résultat exact.

Par contre je crois que j'ai des problèmes de limitation de longueur sur les chiffres ou la BDD pour les items au nom les plus longs (exemple : "Marteau de Forgeur de haches") j'ai plusieurs retours exacts

edit: j'ai aussi mis une démo avec les fonctions SOUNDEX() incorporées à mysql
au final j'ai trouvé beaucoup plus simple : utiliser directement google

Par contre l'indexation de mon site perso n'est pas encore tout à fait exacte.
Beaucoup d'anciens liens avant rewriting sont encore indexés.

Exemple : "mase du corayeur majistal".

Essayez avec cette orthographe : masse du corailleur magistral

La fonction de recherche google est maintenant dispo en complément de la recherche détaillée sur le catalogue de mon site perso.

Il faut que je regarde en détail, mais normalement avec google, il devrait être possible qu'un fansite intègre directement cette recherche sur ses propres pages.
Répondre

Connectés sur ce fil

 
1 connecté (0 membre et 1 invité) Afficher la liste détaillée des connectés