0、前言
本文旨在对自己命名实体识别中词向量与标注预处理阶段的总结。此处假设给定大量文本,以及部分对应的标注(此处使用的是IOB标注方案),但是文本与标注是分开存储的。
在我们进行NER的预测任务之前,我们需要做以下工作:
(1)对每个文本进行分词(当然这里分词也要注意用什么标准进行分词,此处不解释),然后用空格(join)连接每个词,同时对部分文本进行打标注,分开存储成两个文件。
(2)对分好词的文本进行(split)汇总得到总语料,把语料放进去定义好的word2vec模型(调参min_count和size)里面进行训练,得到每个词对应的词向量。
(3)对每篇分词好的文本进行截断处理,然后做词向量拼接。所谓拼接,依据每个词对应的词向量按照顺序依次拼接起来,如果不足句子长度,则padding补0。补0的长度注意要对应上word2vec自定义的词向量长度m,并且少n个词就要补n*m个0。
(4)对标注文件进行截断得到标注列表,列表长度与截断后的文本长度一致。当然可能存在长度不足的情况,直接补0到长度一致即可。然后用LabelEncoder对标注列表进行onehot(提示:先对所有的标注列表展平,转为array再onehot,onehot好之后再reshape回去)。
1、代码如下
将标注的文件夹和存放文本的文件夹进行数据合并,文本合并到一起,标注合并到一起
#source_folder与target_folder分别文本文件夹和标注文件夹
import os
def get_train_list(source_folder, target_folder):
source_string = []
target_string = []
for filename in os.listdir(source_folder):
target_file_name = "targetH_" + "_".join(filename.split("_")[1:])
if os.path.exists(os.path.join(target_folder, target_file_name)):
with open(os.path.join(source_folder, filename), 'r', encoding="utf-8") as source:
with open(os.path.join(target_folder, target_file_name), 'r', encoding="utf-8") as target:
for source_line, target_line in zip