Möglichkeit, in einer großen Wortliste Wörter zu finden, die sich nur um einen Konsonanten unterscheiden
P粉757640504
2023-08-15 16:26:13
<p>Ich habe eine Liste mit fast 5000 „Fantasie“-Wörtern, die in ASCII-Text geschrieben sind. Einige dieser Wörter lauten wie folgt: </p>
<pre class="brush:php;toolbar:false;">txintoq
txiqbal
txiqfun
txiqwek
txiqyal
txiyton
txonmiq
txoqwul
txoqxik</pre>
<p>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: </p>
<pre class="brush:php;toolbar:false;">zs
xj
pb
td
kg</pre>
<p><em>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. </em></p>
<p>Daher werden Wörter wie die folgenden als „Korrektur erforderlich“ markiert (weil sie zu ähnlich klingen): </p>
<pre class="brush:php;toolbar:false;">txindan
txintan # Nur d/t ist unterschiedlich
xumaq
jumaq # Nur x/j ist unterschiedlich
Dolpar
dolbar # Nur ein b/p ist anders</pre>
<p>Wie finde ich diese Wörter, die sich nur um einen Konsonanten in meiner Liste von ~5000 Wörtern unterscheiden, auf <em>relativ effiziente Weise</em> </p>
<p>Das ist eine sehr naive Lösung, die ich derzeit im Sinn habe, und zwar wie folgt: </p>
<pre class="brush:php;toolbar:false;">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<Array<string>>,
) {
const termLetters = term?.split('') ??
const newTerms: Array<string>
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)
}
})
}</pre>
<p>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? </p>
在每个组中选择一个辅音作为该组的“代表”。然后,构建一个将单词分组在一起的映射,当它们的辅音被代表辅音替换时,它们变得相同。
重要提示:此方法仅在辅音组形成等价类时有效。特别是,辅音的相似性必须是传递的。如果
'bp'
相似,'bv'
相似,但'pv'
不相似,则此方法无效。以下是用Python示例的代码; 我让你编写JavaScript代码。
f
是一个将每个辅音映射到其代表辅音的映射;d
是一个将每个代表单词映射到具有此代表的单词列表的映射。最后,我们可以看到哪些单词是相似的: