搭建中文分词工具

一、递归的方法

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)





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值