一、递归的方法
import xlrd
import math
dw = xlrd.open_workbook('中文词库.xlsx')
dic_words = []
rows = dw.sheet_by_index(0).get_rows()
for row in rows:
dic_words.append(row[0].value)
print(dic_words)
# 以下是每一个单词出现的概率。为了问题的简化,我们只列出了一小部分单词的概率。 在这里没有出现的的单词但是出现在词典里的,统一把概率设置成为0.00001
# 比如 p("学院")=p("概率")=...0.00001
word_prob = {
"北京": 0.03,
"的": 0.08,
"天": 0.005,
"气": 0.005,
"天气": 0.06,
"真": 0.04,
"好": 0.05,
"真好": 0.04,
"啊": 0.01,
"真好啊": 0.02,
"今": 0.01,
"今天": 0.07,
"课程": 0.06,
"内容": 0.06,
"有": 0.05,
"很": 0.03,
"很有": 0.04,
"意思": 0.06,
"有意思": 0.005,
"课": 0.01,
"程": 0.005,
"经常": 0.08,
"意见": 0.08,
"意": 0.01,
"见": 0.005,
"有意见": 0.02,
"分歧": 0.04,
"分": 0.02,
"歧": 0.005}
print(sum(word_prob.values()))
# TODO:计算-log(x)
for i in word_prob.keys():
word_prob[i] = round(-math.log(word_prob[i]), 2)
# TODO 编写word_segment_naive函数来实现对输入字符串的分词
def word_segment_naive(input_str, words):
# TODO: 第一步: 计算所有可能的分词结果,要保证每个分完的词存在于词典里,这个结果有可能会非常多。
# 存储所有分词的结果。如果次字符串不可能被完全切分,则返回空列表(list)
if input_str == "":
return [[]]
else:
result = []
for i in range(1, len(input_str) + 1):
if input_str[:i] in words:
for remain_segment in word_segment_naive(input_str[i:], words):
result.append([input_str[:i]] + remain_segment)
return result
# 格式为:segments = [["今天",“天气”,“好”],["今天",“天“,”气”,“好”],["今“,”天",“天气”,“好”],...]
# TODO: 第二步:循环所有的分词结果,并计算出概率最高的分词结果,并返回
segments = word_segment_naive("北京的天气真好啊", dic_words)
best_segment = []
best_score = math.inf
for seg in segments:
score = 0
for word in seg:
if word in word_prob.keys():
score += word_prob[word]
else:
score += round(-math.log(0.00001), 2)
if score < best_score:
best_score = score
best_segment = seg
print(best_segment)
来源:CSDN
作者:路过的AI学习者
链接:https://blog.csdn.net/qq_34194471/article/details/104753481