# 实验一、中文分词实现
## 1.1 问题描述
中文分词指的是将一个汉字序列切分成一个一个单独的词。中文分词是文本挖掘的基础,对于输入的一段中文,成功的进行中文分词,可以达到电脑自动识别语句含义的效果。它是信息提取、信息检索、机器翻译、文本分类、自动文摘、语音识别、文本语音转换、自然语言理解等中文信息处理领域的基础。
### 1.1.1 基础任务
**实现基于词典的分词算法**
实验一资料包下的“Dictionary_based”文件夹中提供了基础词典和分词算法的大致框架。分词算法的核心部分需要大家完成,实验中提供了若干测试样本用以帮助大家判断算法是否正确实现。
**实现基于统计学习的分词算法**
实验中给出 Bi-LSTM+CRF 模型的基础实现,相关代码及说明文档位于实验一资料包下的“Bi-LSTM+CRF”文件夹下。请根据给定的实验资料中 README.md 文件配置相应实验环境,说明:(1)提供源码 PyTorch 语言编写(可根据个人掌情况用其他语言编写),默认运行版本是 CPU 版本;(2)如希望运行 NPU 版本,大家可跟任课老师联系,申请华为云资源运行(需提前统计名单:姓名 + 学号 + 个人手机号码 + 邮箱);
### 1.1.2 选做任务
优化基础任务中实现的分词器,可考虑的优化方案有:
- 修改网络结构,例如引入 BERT 等预训练语言模型;
- 与命名实体识别算法相互配合,减少对命名实体的错误分割;
- 构造合适的词典集(可扩充 + 人工整理);
- 实现新词发现(登录)功能,识别测试集中的新词(未登录词);
- 调整、优化模型训练过程中的超参数。
完成优化后对测试文件“Bi-LSTM+CRF/data/test.txt”进行分词,分词结果保存到.txt 文件中 utf-8 编码,词与词之间以空格分隔,每个测试样本占一行。文件“Bi-LSTM+CRF/cws_result.txt”中给出了输出示例。提交分词结果后,依据单词级别的 F1-score 进行评判,决定选做部分的实验分数。
单词级别的 F1-score 的计算方式如下:
- Gold: 共同 创造 美好 的 新 世纪 —— 二 ○○ 一年 新年 贺词
- Hypothesis: 共同 创造 美 好 的 新 世纪 —— 二 ○○ 一年 新年 贺词
- Precision = 9 / 11 = 0.818
- Recall = 9 / 10 = 0.9
- F1-score = 2*Precision*Recall/(Precision+Recall)=0.857
## 1.2 模块设计-基于词典
### 1.2.1 前向最大匹配
从待分词句子的左边向右边搜索,寻找词的最大匹配。我们需要规定一个词的最大长度,每次扫描的时候寻找当前开始的这个长度的词来和字典中的词匹配,如果没有找到,就缩短长度继续寻找,直到找到字典中的词或者成为单字。
算法流程如下:
- (1)从待分词子串中从前往后取出 max_len 个字,然后扫描分词字典,测试该 max_len 个字的子串是否在字典中;
- (2)如果存在,则从待分词子串中删除掉该 max_len 个字的子串,重新按照规则取子串,重复(1);
- (3)如果不存在于字典中,则减少该子串的最右一个字,之后重复(1)。
### 1.2.2 后向最大匹配
从待分词句子的右边向左边搜索,寻找词的最大匹配。同样,我们也需要规定一个词的最大长度,每次扫描的时候寻找当前开始的这个长度的词来和字典中的词匹配,如果没有找到,就缩短长度继续寻找,直到找到字典中的词或者成为单字。
算法流程如下:
- (1)从待分词子串中从后往前取出 max_len 个字,然后扫描分词字典,测试该 max_len 个字的子串是否在字典中;
- (2)如果存在,则从待分词子串中删除掉该 max_len 个字的子串,重新按照规则取子串,重复(1);
- (3)如果不存在于字典中,则减少该子串的最左一个字,之后重复(1)。
### 1.2.3 双向最大匹配
将前向最大匹配算法和后向最大匹配算法进行比较,从而确定正确的分词方法。
算法流程如下:
- (1)比较前向最大匹配和后向最大匹配结果;
- (2)如果分词结果相同,返回其中任意一个;
- (3)如果分词结果不同:
- 比较两者分词总数量,数量高者罚分;
- 比较两者分词中单字词数量,单字词多者罚分;
- 比较两者分词中非字典词数量,非字典词多者罚分;
- 选择罚分最少的作为最终结果。
## 1.3 模块设计-基于统计学习
### 1.3.1 data_u.py
- getist:单个分词转换成 tag 序列。按行读入数据,并分析各个字对应的标签,然后返回分析结果。
- handle_data:处理数据,并保存至 save_path。按行读取对应文件中的数据,并做相应的处理,然后把处理的结果保存到 data_save.pkl 中。
### 1.3.2 dataloader.py
读取通过 data_u.py 处理完后的文件 data_save.pkl,并将其向量化。
### 1.3.3 infer.py
通过已经训练好的模型,完成对测试文件的分析,并将分词结果保存到 cws_result.txt 文件中。
### 1.3.4 model.py
- init_hidden:通过 torch.randn 函数进行初始化操作。
- _get_lstm_features:获取 LSTM 框架。
- forward:预测每个标签的 loss 值,以减少无效预测。
- infer:采用 Bi-LSTM+CRF 的基础结构的分析结果。
### 1.3.5 run.py
采用小批量梯度下降法,对模型进行训练,使得 loss 值降低。
小批量梯度下降,是对批量梯度下降以及随机梯度下降的一个折中办法。其思想是:每次迭代 使用 batch_size 个样本来对参数进行更新,每次使用一个 batch 可以大大减小收敛所需要的迭代次数,同时可以使收敛到的结果更加接近梯度下降的效果。
## 1.4 代码实现-基于词典
### 1.4.1 前向最大匹配
```python
def forward_mm_split(self, fmm_text):
"""
正向最大匹配分词算法
:param fmm_text:待分词字符串
:return:分词结果,以list形式存放,每个元素为分出的词
"""
# 字词列表,存放分词结果
word_list = []
# 用于记录分词的起始位置
count = 0
# 字或词当前的长度
word_len = self.max_len
while word_len > 0 and count < len(fmm_text):
word = fmm_text[count:count + word_len]
word_len = len(word)
if (word in self.words) or (word in self.delimiter):
word_list.append(word)
count = count + word_len
word_len = self.max_len
else:
word_len = word_len - 1
return word_list
```
### 1.4.2 后向最大匹配
```python
def reverse_mm_split(self, rmm_text):
"""
逆向最大匹配分词算法
:param rmm_text:待分词字符串
:return:分词结果,以list形式存放,每个元素为分出的词
"""
# 字词列表,存放分词结果
word_list = []
# 用于记录分词的末尾位置
count = len(rmm_text)
# 字或词当前的长度
word_len = self.max_len
while word_len > 0 and count > 0:
if count <= word_len:
word = rmm_text[:count]
else:
word = rmm_text[(count - word_len):count]
word_len = len(word)
if (word in self.words) or (word in self.delimiter):
word_list.insert(0, word)
count = count - word_len
word_len = self.max_len
else:
word_len = word_len - 1
return word_list
```
### 1.4.3 双向最大匹配
```python
def bidirectional_mm_split(self, bi_text):
"""
双向最大匹配分词算法
:param bi_text:待分词字符串
:return:分词结果,以list形式存放,每个元素为分出的词
"""
# 前向最大匹配得到的分词结果
forward = self.forward_mm_split(bi_text)
# 后向最大匹配得到的分词结果
reverse = self.reverse_mm_split(bi_text)
# 总词数
forward_total_words = len(forward)
reverse_total_words = len(reverse)
# 单字词个数
forward_single_words = 0
reverse_single_words = 0
# 非�
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
求构造一个命名实体识别(NER)模型,除了基本的预测功能外,能够对测试集进行批量预测并将测试结果保存为文件。中文分词指的是将一个汉字序列切分成一个一个单独的词。中文分词是文本挖掘的基础,对于输入的一段中文,成功的进行中文分词,可以达到电脑自动识别语句含义的效果。它是信息提取、信息检索、机器翻译、文本分类、自动文摘、语音识别、文本语音转换、自然语言理解等中文信息处理领域的基础。 1.1.1 基础任务 实现基于词典的分词算法 实验一资料包下的“Dictionary_based”文件夹中提供了基础词典和分词算法的大致框架。分词算法的核心部分需要大家完成,实验中提供了若干测试样本用以帮助大家判断算法是否正确实现。 实现基于统计学习的分词算法 实验中给出 Bi-LSTM+CRF 模型的基础实现,相关代码及说明文档位于实验一资料包下的“Bi-LSTM+CRF”文件夹下。请根据给定的实验资料中 README.md 文件配置相应实验环境,说明:(1)提供源码 PyTorch 语言编写(可根据个人掌情况用其他语言编写),默认运行版本是 CPU 版本;(2)如希望运行 NPU 版本,大家可跟任课老
资源推荐
资源详情
资源评论
收起资源包目录
基于BiLSTM-CRF的命名实体识别 附完整代码.zip (78个子文件)
nlp_lab
实验1-中文分词
基于词典
Dictionary_based.py 5KB
.idea
Dictionary_based.iml 619B
misc.xml 172B
modules.xml 284B
.gitignore 180B
dict.txt 4.84MB
test.txt 646B
README.md 62B
基于Bi-LSTM+CRF
data
test_final.txt 158KB
data_save.pkl 19.12MB
test_data.txt 158KB
test.txt 542KB
data_u.py 2KB
train.txt 16.03MB
save
model_epoch3.pkl 2.76MB
model_epoch0.pkl 2.76MB
model_epoch9.pkl 2.76MB
model_epoch2.pkl 2.76MB
model_epoch1.pkl 2.76MB
log.txt 2KB
model.pkl 2.95MB
cws_result.txt 189KB
infer.py 1KB
model.py 2KB
.idea
misc.xml 297B
inspectionProfiles
Project_Default.xml 965B
profiles_settings.xml 174B
modules.xml 274B
deployment.xml 786B
Bi-LSTM+CRF.iml 339B
.gitignore 176B
run.py 5KB
dataloader.py 2KB
requirements.txt 74B
__pycache__
dataloader.cpython-37.pyc 2KB
model.cpython-37.pyc 2KB
README.md 2KB
自然语言处理_实验任务书(2021年暂定版).docx 604KB
LICENSE 1KB
实验2-中文命名实体识别
data
0.split.py 976B
ner_data_save.pkl 7.95MB
ner_valid.txt 999KB
ner_test.txt 975KB
ner_train.txt 7.8MB
RMRB_NER_CORPUS.txt 11.42MB
1.data_u_ner.py 2KB
ner_result.txt 973KB
save
model_epoch3.pkl 2.42MB
model_epoch0.pkl 2.42MB
model_epoch6.pkl 2.42MB
model_epoch9.pkl 2.42MB
model_epoch5.pkl 2.42MB
model_epoch2.pkl 2.42MB
model_epoch8.pkl 2.42MB
model_epoch1.pkl 2.42MB
log.txt 3KB
model_epoch4.pkl 2.42MB
model.pkl 2.56MB
model_epoch7.pkl 2.42MB
infer.py 1KB
model.py 2KB
.idea
workspace.xml 3KB
实验二NER_基于深度学习版(Bi-LSTM+CRF).iml 619B
misc.xml 289B
modules.xml 354B
.gitignore 0B
encodings.xml 257B
run.py 4KB
dataloader.py 2KB
requirements.txt 48B
__pycache__
dataloader.cpython-37.pyc 2KB
model.cpython-37.pyc 2KB
README.md 2KB
实验指导v0.ppt 1.87MB
photo
d0cb15c846f3aae31969dc1ed8fb65d0.writebug 228KB
b76484b09c7ac138954b3518e996d98e.writebug 290KB
README.md 39KB
中文分词在线测评结果.png 22KB
共 78 条
- 1
甜辣uu
- 粉丝: 8386
- 资源: 1103
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 基于STM32使用HAL库实现USB组合设备之多路CDC源码+说明文档.zip
- 金融贸易项目springboot
- mybatis动态sqlSQL 映射 XML 文件是所有 sql 语句
- 基于基于STM32的智能家居系统源码+qt上位机源码.zip
- 深圳房地产资源数据报告
- 基于stm32的智能门禁系统源码+设计文档+演示视频.zip
- cef + chromium 完整源码支持h265和h264
- 基于SpringBoot的API管理平台源代码+数据库,以项目的形式管理API文档,可以进行API的编辑、测试、Mock等操作
- protobuf 3.11版本,静态编译
- 2023NOC创客智慧编程赛项真题图形化-选拔赛(有解析)
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
- 3
前往页