Message populaire Polymeth Posté(e) le 15 avril 2017 Message populaire Posté(e) le 15 avril 2017 Bonjour, aujourd'hui je vous partage ma dernière création en Skript : un algorithme Soundex Merci de laisser le commentaire avec mon nom avant la fonction si vous l'utiliser dans votre code. Vous pouvez aussi me citer sur le post si vous êtes quelqu'un de gentil Il est très important d'avoir SkUtilities et skQuery pour que la fonction marche ! Qu'est ce que l'algorithme Soundex ? L'algorithme Soundex est un algorithme phonétique d'indexation de noms par prononciations (merci Wikipedia). En gros, il va transformer les mots en chiffres selon certains critères, et permettra ainsi de reconnaitre deux mots proches, deux mots qui ont une correspondance entre eux malgré des différences dans l'écriture. Il est utilisé par beaucoup de sites, du moins est repris par beaucoup de sites (moteurs de recherches, etc.). Je prefère vous le partager plutôt que le voir copier coller depuis mes futurs skripts qui l'utiliseront. L'algorithme L'algorithme Soundex est plutôt simple à comprendre. Je vais le décrire grossièrement, si vous voulez le voir en détail, rendez-vous ici. (le wikipedia anglais indique les exceptions et les règles, alors que la page française non) On retire les espaces, les voyelles (dont celles anglaises), et les lettres doublées puis on met le mot en majuscule On garde la première lettre On attribue un numéro à chaque lettre que l'on a encore sauf la première On garde seulement 3 chiffres, ou bien on ajoute des 0 pour avoir 3 chiffres On met la première lettre suivi des trois chiffres, voilà. Prenons par exemple le mot "Comment" COMMENT CMMNT CMNT M = 5, N = 5, T = 3 C553 La personne écrit mal le mot, et écrit "Cament" CAMENT CMNT M = 5, N = 5, T = 3 C553 Même code, donc mot proche Exceptions Il y a néanmoins quelques exceptions. L'algorithme les respecte parfaitement ! Si 3 chiffres sont les même de suite dans le code final, on en garde qu'un seul. C'est à dire que si 3 lettres avec le même chiffre se suivent, on en garde qu'une. Par exemple, "Jackson" ne donne pas pas "A222" mais "A250" Si deux lettres avec le même chiffre sont séparés d'un H ou d'un W, il n'y a qu'un chiffre et pas deux. Par exemple, "Ashcraft" n'est pas "A226" mais "A261" Le code, la fonction, l'algorithme # Algorithme Soundex en Skript par Polymeth function soundex(a: text) :: text: set {_text} to "%convert string {_a} to uppercase%" set {_first} to first character of {_text} replace all "a", "e", "i", "o", "u", "y" and " " with "" in {_text} if first character of {_text} is not the first character of {_a}: set {_text} to concatenate {_first} and {_text} set {_text::*} to {_text} split at "" loop {_text::*}: set {_v} to (loop-index parsed as number + 1) if "%loop-index%" is "1": remove loop-value from {_text::*} else: if loop-value is "%{_text::%{_v}%}%": remove loop-value from {_text::*} else: if loop-value is "B" or "F" or "P" or "V": add "1" to {_s::*} else if loop-value is "C" or "G" or "J" or "K" or "Q" or "S" or "X" or "Z": add "2" to {_s::*} else if loop-value is "D" or "T": add "3" to {_s::*} else if loop-value is "L": add "4" to {_s::*} else if loop-value is "M" or "N": add "5" to {_s::*} else if loop-value is "R": add "6" to {_s::*} else if loop-value is "H" or "W": add "*" to {_s::*} loop {_s::*}: set {_v} to (loop-index parsed as number + 1) set {_v2} to (loop-index parsed as number + 2) if {_s::*} is "*": return "%{_first}%000" else if loop-value is "%{_s::%{_v}%}%" and "%{_s::%{_v2}%}%": remove {_s::%{_v}%} from {_s::*} remove {_s::%{_v2}%} from {_s::*} else if loop-value is "%{_s::%{_v2}%}%": if "%{_s::%{_v}%}%" is "*": remove {_s::%{_v2}%} from {_s::*} else if loop-value is "*": remove loop-value from {_s::*} else: add 1 to {_t} set {_final} to concatenate {_final} and loop-value if size of {_s::*} is 1: return "%{_first}%%{_final}%00" if size of {_s::*} is 2: if {_t} is 2: return "%{_first}%%{_final}%0" else: if {_t} is 3: return "%{_first}%%{_final}%" donc pour l'utiliser, il suffit de faire soundex("text") et cela retournera un code. Par exemple "set {var} to soundex("salut")" Le code expliqué # Algorithme expliqué en détail sur le topic function soundex(a: text) :: text: # On met le tout en majuscule set {_text} to "%convert string {_a} to uppercase%" # On sauvegarde la première lettre set {_first} to first character of {_text} # On retire toutes les voyelles et les espaces replace all "a", "e", "i", "o", "u", "y" and " " with "" in {_text} # Si la première lettre est retirée, on la remet if first character of {_text} is not the first character of {_a}: set {_text} to concatenate {_first} and {_text} # On sépare chaque caractère pour pouvoir les utiliser un par un puis on les mets dans une liste set {_text::*} to {_text} split at "" # Loop les lettres loop {_text::*}: # On crée une variable qui permettra de récuperer l'index d'après, donc la lettre qui suit set {_v} to (loop-index parsed as number + 1) # Si l'index est 1, c'est la première lettre, donc on enlève if "%loop-index%" is "1": remove loop-value from {_text::*} else: # Si il y a une lettre doublée, alors on en garde qu'une seule if loop-value is "%{_text::%{_v}%}%": remove loop-value from {_text::*} else: # A chaque lettre restante, on attribue un chiffre (voir plus sur le topic encore une fois) if loop-value is "B" or "F" or "P" or "V": add "1" to {_s::*} else if loop-value is "C" or "G" or "J" or "K" or "Q" or "S" or "X" or "Z": add "2" to {_s::*} else if loop-value is "D" or "T": add "3" to {_s::*} else if loop-value is "L": add "4" to {_s::*} else if loop-value is "M" or "N": add "5" to {_s::*} else if loop-value is "R": add "6" to {_s::*} else if loop-value is "H" or "W": add "*" to {_s::*} # Loop les chiffres que l'on a désormais loop {_s::*}: # On reset encore uen fois pour avoir les chiffres qui suivent set {_v} to (loop-index parsed as number + 1) set {_v2} to (loop-index parsed as number + 2) # Si la liste est juste *, alors on return juste des 0 if {_s::*} is "*": return "%{_first}%000" # Règle 1 - Si trois chiffres se suivent, on en garde qu'un seul else if loop-value is "%{_s::%{_v}%}%" and "%{_s::%{_v2}%}%": remove {_s::%{_v}%} from {_s::*} remove {_s::%{_v2}%} from {_s::*} # Règle 2 - Si deux chiffres pareils sont séparés d'un H ou d'un W, on en garde else if loop-value is "%{_s::%{_v2}%}%": if "%{_s::%{_v}%}%" is "*": remove {_s::%{_v2}%} from {_s::*} # Si le chiffre est *, on supprime else if loop-value is "*": remove loop-value from {_s::*} # Après tout cela else: # On ajoute 1 au compteur de chiffres add 1 to {_t} # On ajoute le chiffre à la variable final set {_final} to concatenate {_final} and loop-value # Si il n'y a qu'un chiffre, alors on return le necessaire avec deux 0 if size of {_s::*} is 1: return "%{_first}%%{_final}%00" # Si il n'y a que deux chiffres, alors on return le necessaire avec un 0 if size of {_s::*} is 2: if {_t} is 2: return "%{_first}%%{_final}%0" # Sinon... else: if {_t} is 3: return "%{_first}%%{_final}%" Utilisation théorique Vous allez sûrement vous dire "ok mais je fais quoi de cette fonction". Exemple théorique Il suffit de comparer ce que retourne la fonction pour un terme, et pour l'autre. On peut comparer 'soundex("salut")' et 'soundex("solut")', on aura le même code. Exemple command /money <text>:[/size][/size] [size=5][size=4] trigger: if arg 1 is not "remove": if soundex("remove") is soundex(arg 1): send "The command is /money remove and not /remove %arg 1% :)" Corrige la commande /money remove Il y a des tonnes de choses à faire avec cela ! Des corrections, des anti-spam développés, pleins de trucs ! A vous de voir maintenant... Si vous avez besoin d'aide n'hésitez pas à me demander, et n'hésitez pas non plus à lâcher un petit j'aime et un commentaire si vous aimez l'algorithme. Polymeth. 7
Blackmine57 Posté(e) le 16 avril 2017 Posté(e) le 16 avril 2017 Gg mec, mais même avec le code expliqué rien compris :p 2
Polymeth Posté(e) le 17 avril 2017 Auteur Posté(e) le 17 avril 2017 Gg mec, mais même avec le code expliqué rien compris :p En gros ça convertis les mots en code. Des mots proches ont le même code si tu suis la technique donné sur le wikipedia.
Yghore Posté(e) le 17 avril 2017 Posté(e) le 17 avril 2017 Je ne trouvais pas le post, et puis je me suis souvenue de cette endroit magique que la section algorithme :) GG, peut être assez utile ! :p
Polymeth Posté(e) le 17 avril 2017 Auteur Posté(e) le 17 avril 2017 Je ne trouvais pas le post, et puis je me suis souvenue de cette endroit magique que la section algorithme :) GG, peut être assez utile ! :p Thanks:) Voire très utile ! Correcteur, anti insultes, pleins de trucs:)
LavaPower Posté(e) le 19 avril 2017 Posté(e) le 19 avril 2017 Au début du post je ne comprenais pas l'utilité d'un tel algorithme, maintenant si. Merci de me l'avoir fait découvrir 2
Polymeth Posté(e) le 19 avril 2017 Auteur Posté(e) le 19 avril 2017 Au début du post je ne comprenais pas l'utilité d'un tel algorithme, maintenant si. Merci de me l'avoir fait découvrir Antispam, correction de commandes, etc. Bah pas de soucis alors:)
DoctorWhoFR Posté(e) le 9 mai 2017 Posté(e) le 9 mai 2017 Eu... poly ^^ ? donc code "EXEMPLE" il et pas un peux péter quand même ? vérifie tu va comprendre :) Code: command /money <text>:[/size][/size] trigger: if arg 1 is not "remove": if soundex("remove") is soundex(arg 1): send "The command is /money remove and not /remove %arg 1% :)"
Polymeth Posté(e) le 10 mai 2017 Auteur Posté(e) le 10 mai 2017 Eu... poly ^^ ? donc code "EXEMPLE" il et pas un peux péter quand même ? vérifie tu va comprendre :) C'est juste un exemple pour le principe, bien sûr que là c'est pété
MGamer91 Posté(e) le 20 mai 2017 Posté(e) le 20 mai 2017 C'est juste un exemple pour le principe, bien sûr que là c'est pété Tu penses que tu feras un Skript sur la gestion de Chat en mettant cette algorithme ? 1
Polymeth Posté(e) le 20 mai 2017 Auteur Posté(e) le 20 mai 2017 Tu penses que tu feras un Skript sur la gestion de Chat en mettant cette algorithme ? Moi non mais toi oui
MGamer91 Posté(e) le 21 mai 2017 Posté(e) le 21 mai 2017 Moi non mais toi oui x) je sais à peine faire un menu GUI je pourrai pas je m'y connais pas en Skript, j'aimerais bien !
Polymeth Posté(e) le 30 mai 2017 Auteur Posté(e) le 30 mai 2017 Juste sa veut dire quoi "uppercase" ? Mettre en majuscule. 2
noftaly Posté(e) le 12 août 2018 Posté(e) le 12 août 2018 (modifié) Salut, voici Soundex mis aux dernières version de skript et skquery, et y'a plus besoin de skutilities. Je l'ai pas du tout optimisé, mais si qqn est chaud, foncez ? function Soundex(a: text) :: text: set {_text} to capitalized {_a} set {_first} to first character of {_text} replace all "a", "e", "i", "o", "u", "y" and " " with "" in {_text} set {_1} to first character of {_text} set {_2} to first character of {_a} if {_1} is not {_2}: set {_text} to concatenate {_first} and {_text} set {_text::*} to {_text} split at "" loop {_text::*}: set {_v} to (loop-index parsed as number + 1) if loop-index is "1": remove loop-value from {_text::*} else: if loop-value is "%{_text::%{_v}%}%": remove loop-value from {_text::*} else: if loop-value is "B" or "F" or "P" or "V": add "1" to {_s::*} else if loop-value is "C" or "G" or "J" or "K" or "Q" or "S" or "X" or "Z": add "2" to {_s::*} else if loop-value is "D" or "T": add "3" to {_s::*} else if loop-value is "L": add "4" to {_s::*} else if loop-value is "M" or "N": add "5" to {_s::*} else if loop-value is "R": add "6" to {_s::*} else if loop-value is "H" or "W": add "*" to {_s::*} loop {_s::*}: set {_v} to (loop-index parsed as number + 1) set {_v2} to (loop-index parsed as number + 2) if {_s::*} is "*": return "%{_first}%000" else if loop-value is "%{_s::%{_v}%}%" and "%{_s::%{_v2}%}%": remove {_s::%{_v}%} from {_s::*} remove {_s::%{_v2}%} from {_s::*} else if loop-value is "%{_s::%{_v2}%}%": if "%{_s::%{_v}%}%" is "*": remove {_s::%{_v2}%} from {_s::*} else if loop-value is "*": remove loop-value from {_s::*} else: add 1 to {_t} set {_final} to concatenate {_final} and loop-value if size of {_s::*} is 1: return "%{_first}%%{_final}%00" if size of {_s::*} is 2: if {_t} is 2: return "%{_first}%%{_final}%0" else: if {_t} is 3: return "%{_first}%%{_final}%" Modifié le 12 août 2018 par noftaly oubli du code mdr 2 1
Messages recommandés
Créer un compte ou se connecter pour commenter
Vous devez être membre afin de pouvoir déposer un commentaire
Créer un compte
Créez un compte sur notre communauté. C’est facile !
Créer un nouveau compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant