隐马尔可可夫模型(Hidden Markov Model,HMM)是统计模型,用于描述一个含有隐含未知参数的马尔可夫过程。
HMM由初始概率分布、状态转移概率分布和观测概率分布确定。
BMES => B:词语开始、M:词语中间、E:词语结束、S:单独成词
并非所有中文任务都需要分词
语料库
- 每行是一篇“文章”
- 每篇文章用空格分开
- 语料库的准确性,严重影响分词结果
- 理论上,语料库越大越好
每个字都有一个标识(隐藏状态),可以根据语料库得到所有标识
中文分词就是为了得到状态
麻 | 辣 | 肥 | 牛 | 真 | 好 | 吃 | ! |
B | M | M | E | S | B | E | S |
根据已知状态进行分词,即在"E"和"S"后面输出空格即可
将已分好的词 得到 每个字的状态
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")