큰 단어 목록에서 자음 하나만 다른 단어를 찾는 방법
<p>저는 ASCII 텍스트로 작성된 거의 5000개의 "판타지" 단어 목록을 가지고 있습니다. 일부 단어는 다음과 같습니다. </p>
<pre class="brush:php;toolbar:false;">txintoq
트시크발
txiqfun
틱웩
택시얄
택시톤
txonmiq
톡소울
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만 다름
수마크
jumaq # x/j만 다릅니다
돌파르
dolbar # b/p만 다릅니다</pre>
<p>약 5,000개의 단어 목록에서 자음 하나만 다른 단어를 <em>비교적 효율적인</em> 방식으로 찾으려면 어떻게 해야 합니까? </p>
<p>이것은 제가 현재 염두에 두고 있는 매우 순진한 해결책입니다. </p>
<pre class="brush:php;toolbar:false;">'fs'에서 fs 가져오기
const 용어 = fs
.readFileSync('term.csv', 'utf-8')
.손질()
.split(/n+/)
.map(라인 => {
let [용어] = line.split(',')
반품 기간
})
.filter(x => x)
const consonantSets = `
zs
xj
pb
TD
kg'
.split(/n+/)
.map(x => x.split(''))
함수 계산SimilarTerms(
용어: 문자열,
consonantSets: 배열
>,
) {
const termLetters = 용어?.split('') ?? []
const newTerms: 배열<string>
for (const consonantSet of consonantSets) {
for (consonantSet의 상수 문자) {
for (consonantSet의 const letter2) {
if (문자 === 문자2) {
계속하다
}
내가 = 0이라고 하자
while (i < termLetters.length) {
const termLetter = 용어Letters[i]
if (termLetter === 문자) {
const newTerm = termLetters.concat()
용어Letters[i] = letter2
newTerms.push(newTerm.join(''))
}
나++
}
}
}
}
newTerms 반환
}
for (항의 용어) {
const 유사한Terms = 계산SimilarTerms(term, consonantSets)
유사한 용어.forEach(similarTerm => {
if (terms.includes(similarTerm)) {
console.log(용어, 유사용어)
}
})
}</pre>
<p>상대적으로 적은 힘으로 이를 어떻게 달성할 수 있습니까? 그리고 이 솔루션은 <em>가능한 모든 유사한 단어 조합</em>을 구축하지 못하기 때문에 불완전합니다. 따라서 알고리즘 어딘가에서 이를 수행할 수 있어야 합니다. 어떤 아이디어가 있나요? </p>