Kami menggunakan fail teks "big.txt" Peter Norvig sebagai set data sampel. Set data ini mengandungi sejumlah besar perkataan daripada rencana bahasa Inggeris, dan huruf besar dan kecil telah disatukan kepada huruf kecil. Kita perlu membaca fail baris demi baris dan menggunakan perpustakaan semula dalam Python untuk melaksanakan pemprosesan awal teks:
import re # 读取文本并进行预处理 with open('big.txt') as f: texts = f.readlines() # 清洗数据,去掉数字和标点符号 words = [] for t in texts: words += re.findall(r'\w+', t.lower())
Kita perlu membina rangkaian Bayesian Untuk mengendalikan tugas penyemak ejaan, rangkaian mengandungi 3 nod: keadaan tersembunyi (ejaan yang betul), pemerhatian yang salah dan pemerhatian yang betul. Keadaan tersirat ialah nod sebab akibat, dan nod cerapan yang salah dan nod cerapan yang betul secara langsung bergantung pada nod keadaan tersirat.
Berikut ialah kod untuk membina rangkaian Bayesian:
from pomegranate import * # 建立隐因节点 correct_spell = State(DiscreteDistribution(dict.fromkeys(words, 1)), name='Correct_Spelling') # 建立观察节点(错误拼写和正确拼写) letter_dist = {} for w in words: for l in w: if l not in letter_dist: letter_dist[l] = len(letter_dist) error_spelling = State(DiscreteDistribution(letter_dist), name='Error_Spelling') correct_spelling_observed = State(DiscreteDistribution(letter_dist), name='Correct_Spelling_Observed') # 建立连边关系 model = BayesianNetwork('Spelling Correction') model.add_states(correct_spell, error_spelling, correct_spelling_observed) model.add_edge(correct_spell, error_spelling) model.add_edge(correct_spell, correct_spelling_observed) model.bake()
Setelah data siap, kita boleh mula melatih rangkaian Bayesian. Semasa latihan, kita perlu menganggar parameter rangkaian berdasarkan data yang diperhatikan.
Berikut ialah kod untuk melatih Rangkaian Bayesian:
# 利用语料库训练贝叶斯网络 for word in words: model.predict(word) # 打印结果(即每个字母在不同位置出现的统计概率) print(error_spelling.distribution.parameters[0])
Daripada keputusan yang dihasilkan dalam kod di atas, kita dapat melihat bahawa semasa proses latihan, BayesianNetwork mengetahui kejadian huruf yang berbeza dalam perkataan dalam data sampel Taburan kebarangkalian masa boleh menangkap dengan lebih baik struktur tatabahasa perkataan Inggeris yang betul.
Selepas latihan selesai, kita boleh mencari laluan optimum melalui rangkaian Bayesian dan menggunakan algoritma Viterbi untuk pembetulan ejaan.
Berikut ialah kod untuk menguji rangkaian Bayesian:
from pomegranate import * # 定义输入单词 test_word = 'speling' # 将输入单词转换为列表 letters = list(test_word) # 遍历该输入单词中的所有字母,并将每个字母的错误概率加起来(实际上就是计算“错误观察”节点的联合概率) error_prob = sum([error_spelling.distribution.probability(l) for l in letters]) # 构建“正确观察”节点的联合概率矩阵 correct_prob = [[''.join(letters[k:j]) for j in range(k+1, len(letters)+1)] for k in range(len(letters))] # 利用Viterbi算法查找最优路径(即最可能的正确单词) corrected_word = max(model.viterbi(correct_prob)[1], key=lambda x: x[1])[0] # 打印结果 print('Original word:', test_word) print('Corrected word:', corrected_word)
Dalam kod di atas, kami menukar perkataan input kepada senarai aksara dan mengulanginya. Jumlah kebarangkalian ralat untuk semua aksara kemudiannya dikira dan matriks kebarangkalian bersama nod "dicerap dengan betul" dibina. Akhirnya, algoritma Viterbi digunakan untuk mencari laluan optimum (iaitu, perkataan dengan kebarangkalian tertinggi) dan mengeluarkannya sebagai hasil pembetulan automatik.
Atas ialah kandungan terperinci Cara menggunakan perpustakaan delima Python untuk melaksanakan penyemak ejaan berdasarkan rangkaian Bayesian. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!