Rumah > pembangunan bahagian belakang > Tutorial Python > Bagaimanakah kita boleh memisahkan teks bersebelahan dengan cekap kepada senarai perkataan menggunakan pendekatan kebarangkalian?

Bagaimanakah kita boleh memisahkan teks bersebelahan dengan cekap kepada senarai perkataan menggunakan pendekatan kebarangkalian?

Susan Sarandon
Lepaskan: 2024-11-04 10:55:30
asal
1074 orang telah melayarinya

How can we efficiently split contiguous text into a word list using a probabilistic approach?

Memisahkan Teks Bersebelahan menjadi Senarai Perkataan dengan Cekap

Soalan itu menimbulkan cabaran: diberi rentetan teks tanpa ruang, cipta algoritma untuk mengekstrak perkataan individu.

Pendekatan naif akan secara berulang mengenal pasti dan mengalih keluar perkataan terpanjang yang mungkin. Walau bagaimanapun, strategi ini mungkin terbukti tidak cekap dalam senario dunia sebenar.

Pendekatan Kebarangkalian

Untuk mengatasi batasan ini, model kebarangkalian menggabungkan frekuensi perkataan ke dalam algoritma. Undang-undang Zipf menghampiri kebarangkalian perkataan sebagai berkadar songsang dengan kedudukannya dalam kekerapan perkataan.

Menggunakan model ini, kita boleh mentakrifkan fungsi kos untuk setiap pemecahan perkataan yang mungkin sebagai kebarangkalian log negatif bagi keseluruhan ayat jika itu rehat perlu dibuat. Pengaturcaraan dinamik digunakan untuk mencari kata putus dengan jumlah kos terendah.

Pelaksanaan

Kod Python yang disediakan di bawah melaksanakan algoritma ini:

<code class="python">from math import log

# Build a cost dictionary based on Zipf's law
words = open("words-by-frequency.txt").read().split()
maxword = max(len(x) for x in words)
wordcost = dict((k, log((i+1)*log(len(words)))) for i,k in enumerate(words))

def infer_spaces(s):
    cost = [0]
    for i in range(1,len(s)+1):
        candidates = enumerate(reversed(cost[max(0, i-maxword):i]))
        c,k = min((c + wordcost.get(s[i-k-1:i], 9e999), k+1) for k,c in candidates)
        cost.append(c)
    out = []
    i = len(s)
    while i>0:
        c,k = best_match(i)
        assert c == cost[i]
        out.append(s[i-k:i])
        i -= k
    return " ".join(reversed(out))</code>
Salin selepas log masuk

Menggunakan ini kod:

<code class="python">s = 'thumbgreenappleactiveassignmentweeklymetaphor'
print(infer_spaces(s))</code>
Salin selepas log masuk

Menghasilkan:

thumb green apple active assignment weekly metaphor
Salin selepas log masuk

Pengoptimuman

Untuk kecekapan selanjutnya, pokok akhiran boleh dibina daripada senarai perkataan ke mengurangkan ruang carian. Memisahkan rentetan input kepada ketulan yang lebih kecil juga boleh mengurangkan penggunaan memori.

Kesimpulan

Dengan memodelkan kekerapan perkataan dan menggunakan pengaturcaraan dinamik, kami memperoleh algoritma yang cekap untuk memisahkan teks bersebelahan ke dalam perkataan individu, menawarkan hasil yang tepat untuk teks dunia nyata.

Atas ialah kandungan terperinci Bagaimanakah kita boleh memisahkan teks bersebelahan dengan cekap kepada senarai perkataan menggunakan pendekatan kebarangkalian?. 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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan