首先是基本的ONE-HOT编码实现词嵌入,这里就不做赘述。
Bag of Words
Bag of Words(词袋表示),也称为Count Vectors,每个文档的字/词可以使用其出现次数来进行表示。
句子1:我 爱 北 京 天 安 门
句子2:我 喜 欢 上 海
直接统计每个字出现的次数,并进行赋值:
句子1:我 爱 北 京 天 安 门
转换为 [1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0]
句子2:我 喜 欢 上 海
转换为 [1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1]
在sklearn中可以直接CountVectorizer
来实现这一步骤:
N-gram
N-gram与Count Vectors类似,不过加入了相邻单词组合成为新的单词,并进行计数。(也就是字符组合窗口大小)
如果N取值为2,则句子1和句子2就变为:
句子1:我爱 爱北 北京 京天 天安 安门
句子2:我喜 喜欢 欢上 上海
TF-IDF
TF-IDF 分数由两部分组成:第一部分是词语频率(Term Frequency),第二部分是逆文档频率(Inverse Document Frequency)。其 中计算语料库中文档总数除以含有该词语的文档数量,然后再取对数就是逆文档频率。
TF(t)= 该词语在当前文档出现的次数 / 当前文档中词语的总数
IDF(t)= log_e(文档总数 / 出现该词语的文档总数)
使用CountVec的样例如下:
使用TF-IDF的样例如下:
- 尝试改变TF-IDF的参数,并验证精度
- 尝试使用其他机器学习模型,完成训练和验证 答:1,(1)增加了N-gram到1-4,精度上升0.001+,增加max_features精度下降,ngram增加到5本地没法运行,已入手16G内存条到了就干!2,更改线性分类器,为lightgbm代码如下:
祖传参数,未调参训练等待内存条到手调参查看效果!