[NLP] 中文文本相似度实战

原文: https://blog.csdn.net/github_36326955/article/details/54891204

1. 计算文本相似度的常用算法

(1) 基于词向量: 余弦相似度, 曼哈顿距离, 欧几里得距离, 明式距离(是前两种距离测度的推广)
(2) 基于字符: 编辑距离, simhash(适用于海量数据), 共有字符数(有点类似 onehot 编码, 直接统计两个文本的共有字符数, 最naive)
(3) 基于概率统计: 杰卡德相似系数
(4) 基于词嵌入模型: word2vec/doc2vec

2. TF-IDF简介

TF-IDF = term frequency–inverse document frequency = 词频-逆文本频率指数
思想: 如果某个词或短语在一篇文章中出现的频率TF高, 并且在其他文章中很少出现, 则认为此词或者短语具有很好的类别区分能力, 适合用来分类.
具体原理描述:
TF: 某个词在该文件中出现的次数(往往会被归一化).
IDF: 度量词语的普遍性, 某一词语的 IDF=log I D F = log ⁡ 包 含 该 词 语 的 文 件 数 目 总 文 件 数 目
如果一个词语的TF很高而IDF很低, 则它的TF-IDF权重就会很高, 即该词语有很好的分类能力.

3. sklearn库

sklearn是基于numpy和scipy的一个机器学习算法库.

3.1 该库共包括三大模块:

监督学习: neighbors, svm, kernel-ridge, discriminant_analysis 等
无监督学习: cluster, manifold, mixture, neural_network 等
数据变换: feature_extraction, feature_selection, preprocess 等

4. 数据集和训练任务

tmt.txt, eng.txt, food.txt: 这三个txt文件是训练数据, 每一行都是一个物品的介绍, 文件名指的是产品的类别(训练集共包含三个类别的产品).
test.txt: 这个txt文件是测试数据, 和训练数据一样每一行都是一个物品的介绍, 要训练一个模型来判断每一行说的是那种物品.
在训练之前, 我把这些txt文件都按行拆分为了很多小txt, 如tmt_1.txt中的内容是tmt.txt第一行的内容. txt文件的按行拆分可以使用”txt杀手”这个小工具.

5. 整个训练步骤

(1) 用jieba分词(corpus_segment.py).

主要使用了jieba这个工具库.

(2) 把分好的词转换为sklearn库中的Bunch格式(corpus2Bunch.py).

分词后的结果依然是一系列的txt文件, 这一步是把它们变成变量, 采用的是sklearn库中的Bunch数据结构. Bunch结构可以理解为字典, 它的每一行都包含了四个信息: 类别(target_name, 包括tmt, eng, food, test), 文件名(filenames), 文本标签(label, 包括tmt, eng, food), 文本内容(contents).

bunch = Bunch(target_name=[], label=[], filenames=[], contents=[])
(3) 用TF-IDF构建有权词向量空间(TFIDF_space.py).

这部分的任务是构建词向量空间W.
每一个词都是W的一个维度(好比是三维空间中的x, y, z), 该维度上的值是该词的权重(由TF-IDF算出). 为了减少W的维度, 要把没用的词(如”的”, “了”等)去掉, 为实现这个功能可以使用一个停用词表, 把没用的词剔除.
注意测试集和训练集要用同一个词向量空间W. 因此测试集出现但是训练集中没有出现的词将不再设为W的一个维度.
该部分最后的运行结果有两个: (1) 词典(单词及其对应的序号), (2) 权重矩阵tdm(该矩阵是二维的, 即tdm[i][j]表示第i个词在第j个类别中的权值).

(4) 用朴素贝叶斯算法对test数据进行分类(NBayes_Predict.py).

所有源码: https://github.com/YasinQiu/Chinese-Text-Classification-NBayes

你可能感兴趣的:(NLP)