尋找只有一個輔音不同的單字在大型單字清單中的方法
P粉757640504
2023-08-15 16:26:13
<p>我有一個近5000個「幻想」單字的列表,這些單字以ASCII文字形式書寫。其中一些單字如下:</p>
<pre class="brush:php;toolbar:false;">txintoq
txiqbal
txiqfun
txiqwek
txiqyal
txiyton
txonmiq
txoqwul
txoqxik</pre>
<p>我想設計一個演算法,檢查/驗證清單中沒有兩個單字之間只相差一個「相似子音」。因此,我會像這樣定義「相似子音集合」(暫時):</p>
<pre class="brush:php;toolbar:false;">zs
xj
pb
td
kg</pre>
<p><em>一個集合中可能有3個或更多輔音,但我現在只展示2個。隨著我對幻想語言音調中哪些輔音聽起來相似的了解越來越深入,我需要進一步調整這個定義。 </em></p>
<p>因此,像下面這樣的單字將被標記為「需要修正」(因為它們聽起來太相似):</p>
<pre class="brush:php;toolbar:false;">txindan
txintan # 只有d/t不同
xumaq
jumaq # 只有x/j不同
dolpar
dolbar # 只有a b/p不同</pre>
<p>我如何在我的約5000個單字清單中以<em>相對高效</em>的方式找到這些只相差一個輔音的單字? </p>
<p>這是我目前所想到的一個非常天真的解決方法,如下所示:</p>
<pre class="brush:php;toolbar:false;">import fs from 'fs'
const terms = fs
.readFileSync('term.csv', 'utf-8')
.trim()
.split(/n /)
.map(line => {
let [term] = line.split(',')
return term
})
.filter(x => x)
const consonantSets = `
zs
xj
pb
td
kg`
.split(/n /)
.map(x => x.split(''))
function computeSimilarTerms(
term: string,
consonantSets: Array<Array<string>>,
) {
const termLetters = term?.split('') ?? []
const newTerms: Array<string> = []
for (const consonantSet of consonantSets) {
for (const letter of consonantSet) {
for (const letter2 of consonantSet) {
if (letter === letter2) {
continue
}
let i = 0
while (i < termLetters.length) {
const termLetter = termLetters[i]
if (termLetter === letter) {
const newTerm = termLetters.concat()
termLetters[i] = letter2
newTerms.push(newTerm.join(''))
}
i
}
}
}
}
return newTerms
}
for (const term of terms) {
const similarTerms = computeSimilarTerms(term, consonantSets)
similarTerms.forEach(similarTerm => {
if (terms.includes(similarTerm)) {
console.log(term, similarTerm)
}
})
}</pre>
<p>如何以相對較少的蠻力方式完成這個任務?而且這個解決方法還不完整,因為它沒有建構<em>所有可能相似的單字組合</em>。所以在演算法的某個地方,它應該能夠做到這一點。有什麼想法嗎? </p>
在每個組中選擇一個子音作為該組的「代表」。然後,建立一個將單字分組在一起的映射,當它們的輔音被代表輔音替換時,它們變得相同。
重要提示:此方法僅在子音組形成等價類別時有效。特別是,輔音的相似性必須是傳遞的。如果
'bp'
相似,'bv'
相似,但'pv'
不相似,則此方法無效。以下是用Python範例的程式碼; 我讓你寫JavaScript程式碼。
f
是一個將每個子音對應到其代表子音的對映;d
是一個將每個代表單字對應到具有此代表的單字清單的對應。最後,我們可以看到哪些單字是相似的: