Un moyen de trouver des mots qui diffèrent d'une seule consonne dans une grande liste de mots
P粉757640504
P粉757640504 2023-08-15 16:26:13
0
1
489

J'ai une liste de près de 5 000 mots « fantastiques » écrits en texte ASCII. Certains de ces mots sont les suivants :

txintoq txiqbal txiqfun txiqwek txiqyal txiyton txonmiq txoqwul txoqxik≪/pré> 

Je souhaite concevoir un algorithme qui vérifie/vérifie qu'aucun mot dans une liste ne diffère d'une seule "consonne similaire".Je vais donc définir « ensemble de consonnes similaires » comme ceci (provisoirement) :

zs xj pb td kg≪/pré> 

Il peut y avoir 3 consonnes ou plus dans un ensemble, mais je n'en montrerai que 2 maintenant. À mesure que j’en apprends davantage sur les consonnes qui se ressemblent dans les tons des langues fantastiques, je dois affiner davantage cette définition.

Par conséquent, les mots comme ceux-ci seront marqués comme « nécessite une correction » (car ils semblent trop similaires) :

txindan txintan # Seul d/t est différent xumaq jumaq # Seul x/j est différent dolpar dolbar # Seul un b/p est différent

Comment puis-je trouver ces mots qui diffèrent par une seule consonne dans ma liste d'environ 5 000 mots d'une manière relativement efficace

C'est une solution très naïve que j'ai actuellement en tête, comme suit :

importer fs depuis 'fs' termes const = fs .readFileSync('term.csv', 'utf-8') .garniture() .split(/n+/) .map(ligne => { laisser [terme] = line.split(',') délai de retour }) .filter(x => x) const consonantSets = ` zs xj pb td kg` .split(/n+/) .map(x => x.split('')) fonction calculateSimilarTerms ( terme : chaîne, consonantSets : Array>, ) { const termLetters = term?.split('') ?? const newTerms : Array pour (const consonantSet de consonantSets) { pour (lettre const de consonantSet) { pour (lettre const2 de consonantSet) { si (lettre === lettre2) { continuer } soit je = 0 while (i < termLetters.length) { const termLetter = termLetters[i] if (termLetter === lettre) { const newTerm = termLetters.concat() termeLettres[i] = lettre2 newTerms.push(newTerm.join('')) } je++ } } } } retourner les nouvelles conditions } pour (terme const des termes) { const similarTerms = calculateSimilarTerms (terme, consonantSets) similarTerms.forEach(similarTerm => { if (terms.includes(similarTerm)) { console.log(terme, similarTerm) } }) } 

Comment cela peut-il être accompli avec relativement peu de force brute ? Et cette solution est incomplète car elle ne crée pas toutes les combinaisons de mots similaires possibles. Donc, quelque part dans l'algorithme, il devrait être capable de le faire. Des idées?

P粉757640504
P粉757640504

répondre à tous (1)
P粉238433862

Choisissez une consonne dans chaque groupe pour être le "représentant" de ce groupe. Ensuite, créez une carte qui regroupe les mots de telle sorte qu'ils deviennent identiques lorsque leurs consonnes sont remplacées par leurs consonnes représentatives.

Remarque importante : Cette méthode ne fonctionne que lorsque les groupes de consonnes forment desclasses d'équivalence. En particulier, la similarité des consonnes doit être transitive. Si'bp'相似,'bv'相似,但'pv'n’est pas similaire, cette méthode n’a aucun effet.

Voici le code de l'exemple en Python ; je vous laisse écrire le code JavaScript.

  • fest une cartographie qui mappe chaque consonne à sa consonne représentative
  • ;
  • dest une carte qui mappe chaque mot représenté à une liste de mots avec cette représentation.
bigwordlist = '''dolbar dolpar jumaq txindan txintan txintoq txiqbal txiqfun txiqwek txiqyal txinton txonmiq txoqwul txoqxik xumaq'''.splitlines() consonant_groups = '''zs xj pb td kg'''.splitlines() f = {} for g in consonant_groups: for c in g: f[c] = g[0] print(f) # {'z': 'z', 's': 'z', 'x': 'x', 'j': 'x', 'p': 'p', 'b': 'p', 't': 't', 'd': 't', 'k': 'k', 'g': 'k'} d = {} for word in bigwordlist: key = ''.join(f.get(c, c) for c in word) d.setdefault(key, []).append(word) print(d) # {'tolpar': ['dolbar', 'dolpar'], 'xumaq': ['jumaq', 'xumaq'], 'txintan': ['txindan', 'txintan'], 'txintoq': ['txintoq'], 'txiqpal': ['txiqbal'], 'txiqfun': ['txiqfun'], 'txiqwek': ['txiqwek'], 'txiqyal': ['txiqyal'], 'txinton': ['txinton'], 'txonmiq': ['txonmiq'], 'txoqwul': ['txoqwul'], 'txoqxik': ['txoqxik']}

Enfin, nous pouvons voir quels mots sont similaires :

print([g for g in d.values() if len(g) > 1]) # [['dolbar', 'dolpar'], ['jumaq', 'xumaq'], ['txindan', 'txintan']]
    Derniers téléchargements
    Plus>
    effets Web
    Code source du site Web
    Matériel du site Web
    Modèle frontal
    À propos de nous Clause de non-responsabilité Sitemap
    Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!