HanLP — HMM隐马尔可夫模型 -- 语料库

隐马尔可可夫模型(Hidden Markov Model,HMM)是统计模型,用于描述一个含有隐含未知参数的马尔可夫过程。
HMM由初始概率分布、状态转移概率分布和观测概率分布确定。

BMES => B:词语开始、M:词语中间、E:词语结束、S:单独成词
并非所有中文任务都需要分词
image
语料库

  • 每行是一篇“文章”
  • 每篇文章用空格分开
  • 语料库的准确性,严重影响分词结果
  • 理论上,语料库越大越好

每个字都有一个标识(隐藏状态),可以根据语料库得到所有标识

中文分词就是为了得到状态

B M M E S B E S

根据已知状态进行分词,即在"E"和"S"后面输出空格即可

将已分好的词 得到 每个字的状态
image

image

https://www.bilibili.com/video/BV1aP4y147gA?p=3

data/train_data.txt
人为将可分词的按空格间隔开

“ 人们 常 说 生活 是 一 部 教科书 , 而 血 与 火 的 战争 更 是 不可多得 的 教科书 , 她 确实 是 名副其实 的 ‘ 我 的 大学 ’ 。
“ 心 静 渐 知 春 似 海 , 花 深 每 觉 影 生 香 。
“ 吃 屎 的 东西 , 连 一 捆 麦 也 铡 不 动 呀 ?
他 “ 严格要求 自己 , 从 一个 科举 出身 的 进士 成为 一个 伟大 的 民主主义 者 , 进而 成为 一 位 杰出 的 党外 共产主义 战士 , 献身 于 崇高 的 共产主义 事业 。
“ 征 而 未 用 的 耕地 和 有 收益 的 土地 , 不准 荒芜 。
from tqdm import tqdm 
 
def make_label(text_str):  # 从单词到label的转换, 如: 今天 ----> BE  麻辣肥牛: ---> BMME  的 ---> S
    text_len = len(text_str)
    if text_len == 1:
        return "S"
    return "B" + "M" * (text_len - 2) + "E"  # 除了开头是 B, 结尾是 E,中间都是M


def text_to_state(train_file, state_file):
    """ 将原始的语料库转换为 对应的状态文件 """
    all_data = open(train_file, "r", encoding="utf-8").read().split("\n")  # 打开文件并按行切分到  all_data 中 , all_data  是一个list
    with open(state_file, "w", encoding="utf-8") as f:  # 代开写入的文件
        for d_index, data in tqdm(enumerate(all_data)):  # 逐行 遍历 , tqdm 是进度条提示 , data 是一篇文章, 有可能为空
            if data:  # 如果 data 不为空
                state_ = ""
                for w in data.split(" "):  # 当前 文章按照空格切分, w是文章中的一个词语
                    if w:  # 如果 w 不为空
                        state_ = state_ + make_label(w) + " "  # 制作单个词语的label
                if d_index != len(all_data) - 1:  # 最后一行不要加 "\n" 其他行都加 "\n"
                    state_ = state_.strip() + "\n"  # 每一行都去掉 最后的空格
                f.write(state_)


if __name__ == "__main__":
    text_to_state("data/train_data.txt", "data/train_state.txt")

https://gitee.com/VipSoft/VipPython/tree/master/hmm_viterbi

posted @ 2023-12-13 16:51  VipSoft  阅读(26)  评论(0编辑  收藏  举报