**数据和特征决定了机器学习的上限,而模型和算法只是无线逼近这个上限。**正是因为数据处理的重要性,在NLP算法的工作中,大部分的时间是与数据打交道,文本预处理更是重中之重!
文本预处理
-
方法:
-
文本处理的基本方法
- 分词
- 作用: 为了更好的进行语言语义的理解(why)
- 工具: jieba 安装: pip install jieb
- jieba特性:
- 多种分词模式
- 精确模式(how)
- jieba.cut(content, cut_all=False)—> 生成器
- jieba.lcut(content, cut_all=False)—> 列表
- 全模式
- jieba.cut(content, cut_all=True)—> 生成器
- jieba.lcut(content, cut_all=True)—> 列表
- 搜索引擎模式
- jieba.cut_for_search(content)> 生成器
- jieba.lcut_for_search(content)—> 列表
- 精确模式(how)
- 中文繁体分析
- 用户自定义的模式
- 自定义字典: 格式: 词语 词频[可省略] 词性[可省略]
- 加载自定义字典: jieba.load_userdict(自定义字典文件)
- 多种分词模式
- jieba特性:
- 词性标注**[POS]**
- 作用: 为了计算机更好的理解自然语言, 处理更高阶的NLP任务自动问答, 机器翻译等任务
- 命名实体识别[NER] eg: 马云 创办了阿里巴巴
- 实质是一个NLP任务类型
- 命名实体: 人名, 地名, 机构名等专有名称
- 分词
-
文本张量表示方法
-
One-hot编码 0 1 001 010 100
- 定义了词汇映射器[词—>数字]
- one-hot编码的保存 joblib.dump()
- 优点: 操作简单, 容易理解
- 缺点:词和词之间的联系少,大语料集上, 占用的内容大
-
Word2vec(what)—(why)
-
第一种模式: CBOW: 词袋模式—> 两边(输入)到中间(输出)
-
第二种模式: skipgram—> 中间(输入)到两边(输出)
-
fasttext工具进行词向量的训练(how)
-
安装:
-
第一种方式的安装: pip install fasttext(简洁版)
-
第二种方式安装: (建议使用这种方式)
$ git clone https://github.com/facebookresearch/fastText.git $ cd fastText # 使用pip安装python中的fasttext工具包 $ sudo pip install .
-
-
训练词向量(how)
- 步骤:
-
- 获取训练数据集 enwik9
- 训练词向量
- 训练api: Fasttext.train_unsupervised(data)
- 查看词向量: model.get_word_vector(词)
- 模型参数的设定
- 模型的训练类型
- epoch
- lr
- thread等等
- 模型检验
- model.get_nearest_neighbors(词)
- 模型的保存和重加载
- 模型的保存: model.save_model(模型的名字)
- 模型的重加载: new_model = fasttext.load_model(模型的名字)
-
- 步骤:
-
-
-
Word Embedding
- 广义上说: word2vec
- 狭义的word Embedding: 就是网络中的embedding层, 最后是输入所有词汇的向量表示组成的矩阵
-
-
文本语料的数据分析—> 绘制图像
-
标签数量的分析
- 目的: 查看各个类别之前的数量关系, 确定样本是否均衡
-
句子的长度进行分析—绘制柱状图
- 目的: 指导对句子长度进行截断或是补齐
- 散点图的绘制目的: 为了方便人工审核, 异常数据
-
词频的统计和关键词词云
-
不同词汇的统计
# 不同词汇总数的统计 --> embedding上 one-hot set(chain(*map(lambda x: jieba.lcut(x), train_data["sentence"])))
-
词云的绘制
- 训练集上绘制正样本的词云
- 训练集上绘制负样本的词云
- 验证集上绘制正样本的词云
- 验证集上绘制负样本的词云
-
-
-
文本特征处理
-
n_gram特征
-
定义: 在文本序列中, n个词或字相邻且共现即n_gram特征 n: 1 2 3 4 5
-
作用 为了增加更多的语义信息, 是语句有更多元化的语义表示
-
如何实现
set(zip(*[input_list[i:] for i in range(ngram_range)]))
-
-
文本长度的规范 处理成一定的长度
-
原因: 网络需要等尺寸大小的语句序列.
-
前期要进行的处理: 进行句子长度的分析(绘制图像), 然后确定要规范的句子长度
- Eg: 语句 现象的阐述, 后面的结论
-
How 怎么做
# 在此api函数中, 可以根据业务需求, 进行前面截断补齐或是后面截断补齐的选择 sequence.pad_sequences(x_train, cutlen, padding='post', truncating='post')
-
-
-
数据增强方法
-
回译增强法
- 第一种方式 pip install itranslate
import itranslate text = ["酒店设施非常不错", "这家酒店服务好,价格便宜"] ko_result = itranslate.itranslate(text, from_lang='zh-cn', to_lang='ko') print(text) print("翻译成韩文:", ko_result) cn_result = itranslate.itranslate(ko_result, from_lang='ko', to_lang='zh-cn') print('回译成中文:', cn_result)
-
第二种方式: google接口 pip install google_trans_new
-
如果发生错误: json解析错误 修改源码: google_trans_new.py文件中151行
# 151行 修改源码 # response = (decoded_line + ']') # 导致json解析错误 # 修改成 # response = decoded_line # 即可
-
-
-