<p>ASCII テキストで書かれた 5000 近くの「ファンタジー」単語のリストがあります。これらの単語の一部は次のとおりです。 </p>
<pre class="brush:php;toolbar:false;">txintoq
チクバル
ちくふん
ツイクウェク
ツィキヤル
ティクシトン
チョンミク
チョクウル
txoqxik</pre>
<p>リスト内の 2 つの単語が 1 つの「類似子音」だけで異なることをチェック/検証するアルゴリズムを設計したいと考えています。そこで、「類似した子音のセット」を (暫定的に) 次のように定義します。 </p>
<pre class="brush:php;toolbar:false;">zs
xj
ポンド
た
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 個の単語のリストから、子音が 1 つだけ異なる単語を比較的効率的に <em>/em> 見つけるにはどうすればよいですか? </p>
<p>これは、私が現在考えている非常に素朴な解決策であり、次のとおりです。
<pre class="brush:php;toolbar:false;">「fs」から fs をインポート
定数項 = fs
.readFileSync('term.csv', 'utf-8')
。トリム()
.split(/n /)
.map(line => {
let [用語] = line.split(',')
返品期間
})
.filter(x => x)
const consonantSets = `
zs
xj
ポンド
た
kg`
.split(/n /)
.map(x => x.split(''))
関数 computeSimilarTerms(
用語: 文字列、
consonantSets: 配列<配列<文字列>>、
) {
const termLetters = term?.split('') ?? []
const newTerms: 配列<文字列> = []
for (const consonantSet of consonantSets) {
for (子音セットの定数文字) {
for (consonantSet の const 文字 2) {
if (文字 === 文字 2) {
続く
}
i = 0 とします
while (i
各グループの「代表」となる子音を 1 つ選択します。次に、子音を代表的な子音に置き換えたときに単語が同一になるように単語をグループ化するマップを作成します。
重要な注意: この方法は、子音グループが 同値クラスを形成する場合にのみ機能します。特に、子音の類似性は推移的である必要があります。
'bp'
が類似しており、'bv'
も類似しているが、'pv'
が類似していない場合、このメソッドは無効です。以下は Python の例のコードです。JavaScript コードを記述してもらいます。
f
は、各子音をその代表子音にマッピングするマッピングです。は、各代表単語を、この代表を持つ単語のリストにマッピングするマップです。
リーリー