Saya mempunyai senarai hampir 5000 perkataan "fantasi" yang ditulis dalam teks ASCII. Beberapa perkataan ini adalah seperti berikut:
txintoq txiqbal txiqfun txiqwek txiqyal txiyton txonmiq txoqwul txoqxik
Saya mahu mereka bentuk algoritma yang menyemak/mengesahkan bahawa tiada dua perkataan dalam senarai berbeza dengan hanya satu "konsonan serupa".Jadi saya akan mentakrifkan "set konsonan serupa" seperti ini (secara sementara):
zs xj pb td kgMungkin terdapat 3 atau lebih konsonan dalam satu set, tetapi saya hanya akan menunjukkan 2 sekarang. Semasa saya mengetahui lebih lanjut tentang konsonan yang sama bunyinya dalam nada bahasa fantasi, saya perlu memperhalusi lagi takrifan ini.
Oleh itu, perkataan seperti berikut akan ditandakan sebagai "memerlukan pembetulan" (kerana bunyinya terlalu serupa):
txindan txintan # Hanya d/t berbeza xumaq jumaq # Hanya x/j yang berbeza dolpar dolbar # Hanya b/p berbezaBagaimanakah saya mencari perkataan ini yang berbeza dengan hanya satu konsonan dalam senarai ~5000 perkataan saya dalam cara agak cekap
Ini adalah penyelesaian yang sangat naif yang saya fikirkan pada masa ini, seperti berikut:
import fs daripada 'fs' istilah const = fs .readFileSync('term.csv', 'utf-8') .trim() .split(/n+/) .peta(garis => { biarkan [istilah] = line.split(',') tempoh pulangan }) .filter(x => x) consonantSets = ` zs xj pb td kg` .split(/n+/) .peta(x => x.split('')) function computeSimilarTerms( istilah: rentetan, ConsonantSets: Array>, ) { const termLetters = istilah?.split('') ?? const newSyarat: Array untuk (konsonan konsonanSet of consonantSets) { untuk (huruf const of consonantSet) { for (const letter2 of consonantSet) { jika (huruf === huruf2) { teruskan } biarkan i = 0 manakala (i < termLetters.length) { const termLetter = termLetters[i] if (istilahSurat === huruf) { const newTerm = termLetters.concat() istilahHuruf[i] = huruf2 newTerms.push(newTerm.join('')) } i++ } } } } kembali Syarat baharu } untuk (istilah const) { const similarTerms = computeSimilarTerms(istilah, consonantSets) similarTerms.forEach(similarTerm => { if (terms.includes(similarTerm)) { console.log(istilah, similarTerm) } }) } Bagaimana ini boleh dicapai dengan kekerasan yang agak sedikit? Dan penyelesaian ini tidak lengkap kerana ia tidak membina semua kemungkinan gabungan perkataan serupa. Jadi di suatu tempat dalam algoritma ia sepatutnya dapat melakukan ini. Ada idea?
Pilih konsonan dalam setiap kumpulan untuk menjadi "wakil" kumpulan tersebut. Kemudian, bina peta yang mengumpulkan kata-kata supaya ia menjadi serupa apabila konsonan mereka digantikan dengan konsonan wakil mereka.
Nota penting: Kaedah ini hanya berfungsi apabila kumpulan konsonan membentukkelas kesetaraan. Khususnya, persamaan konsonan mestilah transitif. Jika
'bp'
相似,'bv'
相似,但'pv'
tidak serupa, kaedah ini tidak memberi kesan.Berikut ialah kod untuk contoh dalam Python saya membenarkan anda menulis kod JavaScript.
f
ialah pemetaan yang memetakan setiap konsonan kepada konsonan perwakilannyad
ialah peta yang memetakan setiap perkataan yang diwakili kepada senarai perkataan dengan perwakilan ini.Akhir sekali, kita dapat melihat perkataan mana yang serupa: