Rumah > Artikel > pembangunan bahagian belakang > Bagaimanakah kita boleh memisahkan teks dengan cekap tanpa ruang ke dalam senarai perkataan, memanfaatkan kekerapan perkataan dan pengaturcaraan dinamik?
Memandangkan rentetan yang terdiri daripada perkataan tanpa ruang, artikel ini membentangkan algoritma yang cekap untuk membahagikan ia menjadi perkataan individu sambil mempertimbangkan frekuensi relatifnya.
Input: "tableapplechairtablecupboard..."
Output: ["table", "apple", " kerusi", "meja", ["almari", ["cawan", "papan"]], ...]
Daripada menggunakan pendekatan naif, algoritma memanfaatkan kekerapan perkataan untuk meningkatkan ketepatan. Dengan mengandaikan perkataan diedarkan secara bebas dan mengikut undang-undang Zipf, algoritma menggunakan pengaturcaraan dinamik untuk mengenal pasti urutan perkataan yang paling mungkin.
<code class="python">from math import log words = open("words-by-frequency.txt").read().split() wordcost = dict((k, log((i+1)*log(len(words)))) for i,k in enumerate(words)) maxword = max(len(x) for x in words) def infer_spaces(s): cost = [0] for i in range(1,len(s)+1): c,k = best_match(i) cost.append(c) out = [] i = len(s) while i>0: c,k = best_match(i) out.append(s[i-k:i]) i -= k return " ".join(reversed(out)) def best_match(i): candidates = enumerate(reversed(cost[max(0, i-maxword):i])) return min((c + wordcost.get(s[i-k-1:i], 9e999), k+1) for k,c in candidates) s = 'thumbgreenappleactiveassignmentweeklymetaphor' print(infer_spaces(s))</code>
Algoritma bergantung pada kamus yang memetakan perkataan kepada frekuensi relatifnya, dengan mengandaikan undang-undang Zipf. Untuk mengambil kira perkataan yang tidak kelihatan, kos yang tinggi dikenakan kepada mereka.
Algoritma mengira kos setiap segmen perkataan yang mungkin, dengan mengambil kira potensi perkataan seterusnya. Ia memilih laluan dengan kos terendah menggunakan pengaturcaraan dinamik, memastikan urutan perkataan yang paling mungkin.
Untuk input yang besar, algoritma boleh dioptimumkan dengan membahagikan teks kepada blok dan memproses mereka secara bebas. Ini mengurangkan penggunaan memori tanpa menjejaskan ketepatan dengan ketara.
Atas ialah kandungan terperinci Bagaimanakah kita boleh memisahkan teks dengan cekap tanpa ruang ke dalam senarai perkataan, memanfaatkan kekerapan perkataan dan pengaturcaraan dinamik?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!