维特比最短路径问题 - 统计分词(unigram)

本文介绍了统计分词中的维特比算法,通过建立词库和计算分词概率,找到最短路径进行分词。针对给定字符串"我们学习人工智能,人工智能是未来",展示了如何枚举所有分割方式并利用维特比算法找出最优解。讨论了算法的时间复杂度和空间复杂度。
摘要由CSDN通过智能技术生成

统计分词(unigram)

1 词库

词库中最长字符串为 m m m,输入字符串长度为 n n n,一般 n ≫ m n \gg m nm

import xlrd
def create_dic_words(file_path, sheet_index=0):
    workbook = xlrd.open_workbook(filename=file_path)
    worksheet  = workbook.sheet_by_index(sheet_index)
    
    dic_words = {
   }
    max_len_word = 0
    for idx in range(worksheet.nrows):
        word = worksheet.row(idx)[0].value.strip()
        dic_words[word] = 0.00001
        
        len_word = len(word)
        if len_word > max_len_word:
            max_len_word = len_word
            
    return dic_words, max_len_word

# TODO: 第一步: 从综合类中文词库.xlsx 中读取所有中文词。
#  hint: 思考一下用什么数据结构来存储这个词典会比较好? 要考虑我们每次查询一个单词的效率。 
dic_path = "./综合类中文词库.xlsx"
dic_words, max_len_word = create_dic_words(file_path=dic_path)    # 保存词典库中读取的单词

# 以下是每一个单词出现的概率。为了问题的简化,我们只列出了一小部分单词的概率。
# 在这里没有出现的的单词但是出现在词典里的,统一把概率设置成为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()))
print(max_len_word)

for key, value in word_prob.items():
    dic_words[key] = value

1.0000000000000002
16

2 枚举方法

此项目需要的数据:

  1. 综合类中文词库.xlsx: 包含了中文词,当做词典来用
  2. 以变量的方式提供了部分unigram概率 word_prob

举个例子: 给定词典=[我们 学习 人工 智能 人工智能 未来 是], 另外我们给定unigr

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值