NLPNLP数据清洗
英文可以空格分词,中文不可。中文文本用连续的字序列构成,词和词之间没有天然分隔符,因此中文分词很困难。尤其困难是歧义问题,分词分为两种:
1.基于词典进行分词:(套规则进行分词)优点是简单有效。但是很容易就有搞笑的歧义,且应对流行词汇表现效果不好。。。。
2.基于统计的分词:通过人工标注对中文建模,将准备好的语料进行训练,选出不同阶段下每个词的出现概率。。。选出概率最大的情况进行分词。 比较好的解决分词奇异问题,但是却要耗费巨大的性能
获取语料?
1.已经有的语料
2.网上下载的抓取语料
预料预处理
1.语料清洗
爬取的内容去除标签,去掉注释等。。。。;
把语料中的不需要的文本部分删除掉,包括标题,摘要,小标题等等。。
2.分词
我们不对一大块文本进行处理,我们希望文本的最小单位粒度是词语,因此借助分词工具对文本进行分词。
常见的分词算法就是:
1. 基于字符串匹配的分词
2. 基于理解的分词
3. 基于统计的分词
4. 基于规则的分词
3.词性标注
给每个词或者词语打标签,比如形容词,动词。
1. 基于规则的方法
2. 基于统计的方法
1. 最大熵
2. 统计最大概率
3. 基于HMM的词性标注
4.去停用词
停用词一般指对文本特征没有任何贡献的词。比如,标点符号、语气、人称、等一些词,所以在一般的文本处理之后,接下来就是去除停用词,不同项目要求你去掉的停用词是不同的。
特征工程
上面那么多,最终得到了一个个分词结果。 接下来,将这些分词之后的词和短语表示成计算机能够计算的类型吧~
显然,我们猜也可以猜出来,必须要把字符串转化成数字
,准确地说就是向量。我们一般有两种方法:
- 词袋模型
暴力进行计数,直接将词语或者符号统一放置在集合里面,统计词频。TF-IDF - 词向量模型
将字,词语转换成向量矩阵的形式。最常用的方法就是OneHot 和 Word2Vec, 值得一提的就是,Word2Vec可以很好的反映词之间的相似和类比关系。词向量包括:跳字模型和连续词袋模型
特征选择
从上面的特征集合中 选出一部分
,当做特征子集,可以较好地保存特征信息,虽然会丢失掉部分的语义信息。 这个过程更多地依赖经验和专业知识。。
模型训练
有了这些特征向量,接下来就是训练模型,我们有:
- 有监督学习
- 无监督学习
KNN,SVM,Naive Bayes、决策树、GBDT,K-Means 等; 深度学习例如:CNN,RNN,LSTM,Seq2Seq,FastTxt,TextCnn等,这些模型在后续的分类,聚类,神经序列,情感分析中都可以用到。
注意点
1.过拟合和欠拟合问题:
过拟合的话:
1.使用dropout
2.增加训练量
3.增加正则化选项,如L1正则和L2正则。
4.重新选择特征子集
欠拟合的话
1.增加网络的复杂度
2.增加特征的数量
3.减少正则化选项
2.评价指标
二分类问题,混淆矩阵常考:
tp fn
fp tn
准确率,精确率,召回率,
准确率= tp/(tp+fp)
精确度=tp+tn /(tp + fn + fp + tn)【一般用的不多】
召回率=tp/(tp+fn)【疾病类问题一定要注意】
F1衡量: 【体现你对与查准率和查全率的不同偏好】
f1= 2* 准确率*召回率 / 准确率+召回率
3.ROC曲线
我们根据模型的预测结果,把阈值从0调整到最大,【即 一开始每个样本都是正样本 ---- 正样本逐渐减少------ 每个样本都是负样本】。每次计算出 TPR为y轴,FPR为x轴。
tpr = tp/( tp + fn)
fpr = fp/(tn + fp)
ROC曲线很容易查出任意阈值对于模型泛化能力的影响,有助于选择最佳的阈值,并且可以对不同的模型比较性能。