<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>
각 그룹에서 해당 그룹의 "대표자"가 될 자음을 선택하세요. 그런 다음 자음을 대표 자음으로 바꾸면 단어가 동일해지도록 단어를 그룹화하는 맵을 만듭니다.
중요 사항: 이 방법은 자음 그룹이 동등 클래스를 형성하는 경우에만 작동합니다. 특히 자음 유사성은 추이적이어야 합니다.
'bp'
相似,'bv'
相似,但'pv'
가 유사하지 않으면 이 방법은 효과가 없습니다.다음은 Python 예제에 대한 코드입니다. JavaScript 코드를 작성해 보겠습니다.
f
는 각 자음을 대표 자음으로 매핑한 매핑입니다.d
으아악