Ich habe eine Liste mit fast 5000 „Fantasie“-Wörtern, die in ASCII-Text geschrieben sind. Einige dieser Wörter lauten wie folgt:
txintoq txiqbal txiqfun txiqwek txiqyal txiyton txonmiq txoqwul txoqxik
Ich möchte einen Algorithmus entwerfen, der prüft/verifiziert, dass sich keine zwei Wörter in einer Liste nur durch einen „ähnlichen Konsonanten“ unterscheiden.Deshalb werde ich „Satz ähnlicher Konsonanten“ (vorläufig) wie folgt definieren:
zs xj pb td kg
Es kann 3 oder mehr Konsonanten in einem Satz geben, aber ich werde jetzt nur 2 zeigen. Da ich mehr darüber erfahre, welche Konsonanten in den Tönen von Fantasiesprachen gleich klingen, muss ich diese Definition weiter verfeinern.
Daher werden Wörter wie die folgenden als „Korrektur erforderlich“ markiert (weil sie zu ähnlich klingen):
txindan txintan # Nur d/t ist unterschiedlich xumaq jumaq # Nur x/j ist unterschiedlich Dolpar dolbar # Nur ein b/p ist anders
Wie finde ich diese Wörter, die sich nur um einen Konsonanten in meiner Liste von ~5000 Wörtern unterscheiden, auf relativ effiziente Weise
Das ist eine sehr naive Lösung, die ich derzeit im Sinn habe, und zwar wie folgt:
fs aus 'fs' importieren const terme = fs .readFileSync('term.csv', 'utf-8') .trimmen() .split(/n+/) .map(line => { let [term] = line.split(',') Rückgabefrist }) .filter(x => x) const consonantSets = ` zs xj pb td kg` .split(/n+/) .map(x => x.split('')) Funktion berechnenSimilarTerms( Begriff: Zeichenfolge, consonantSets: Array>, ) { const termLetters = term?.split('') ?? const newTerms: Array for (const consonantSet of consonantSets) { for (const-Buchstabe von consonantSet) { for (const letter2 of consonantSet) { if (Buchstabe === Buchstabe2) { weitermachen } sei i = 0 while (i < termLetters.length) { const termLetter = termLetters[i] if (termLetter === Buchstabe) { const newTerm = termLetters.concat() termLetters[i] = Buchstabe2 newTerms.push(newTerm.join('')) } i++ } } } } return newTerms } for (const term of terms) { const ähnlicheTerms = berechneSimilarTerms(term, consonantSets) ähnlicheTerms.forEach(similarTerm => { if (terms.includes(similarTerm)) { console.log(Begriff, ähnlicher Begriff) } }) }
Wie kann dies mit relativ wenig roher Gewalt erreicht werden? Und diese Lösung ist unvollständig, da sie nicht alle möglichen ähnlichen Wortkombinationen erstellt. Irgendwo im Algorithmus sollte dies also möglich sein. Irgendwelche Ideen?
在每个组中选择一个辅音作为该组的“代表”。然后,构建一个将单词分组在一起的映射,当它们的辅音被代表辅音替换时,它们变得相同。
重要提示:此方法仅在辅音组形成等价类时有效。特别是,辅音的相似性必须是传递的。如果
'bp'
相似,'bv'
相似,但'pv'
不相似,则此方法无效。以下是用Python示例的代码; 我让你编写JavaScript代码。
f
是一个将每个辅音映射到其代表辅音的映射;d
是一个将每个代表单词映射到具有此代表的单词列表的映射。最后,我们可以看到哪些单词是相似的: