Bagaimanakah kita boleh memisahkan teks dengan cekap tanpa ruang ke dalam senarai perkataan, memanfaatkan kekerapan perkataan dan pengaturcaraan dinamik?

DDD
Lepaskan: 2024-11-04 10:13:30
asal
302 orang telah melayarinya

How can we efficiently separate text without spaces into a word list, leveraging word frequency and dynamic programming?

Memisahkan Teks Tanpa Ruang ke dalam Senarai Perkataan

Ikhtisar

Memandangkan rentetan yang terdiri daripada perkataan tanpa ruang, artikel ini membentangkan algoritma yang cekap untuk membahagikan ia menjadi perkataan individu sambil mempertimbangkan frekuensi relatifnya.

Pernyataan Masalah

Input: "tableapplechairtablecupboard..."

Output: ["table", "apple", " kerusi", "meja", ["almari", ["cawan", "papan"]], ...]

Gambaran Keseluruhan Algoritma

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.

Kod

<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>
Salin selepas log masuk

Anggaran Kekerapan Perkataan

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.

Pengaturcaraan Dinamik

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.

Pengoptimuman Prestasi

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!