1. 数据预处理
1.2 xml文本解析
extract_text.py : 读取SogouCS_reduced文件夹下的文件,进行xml解析,得到每个新闻的content,并将其放在对应的分类文件夹下;
split_text.py : 读取分类好的新闻预料(SogouCS_reduced_after文件夹下),采用jieba库进行分词,其中停用词表采用的是哈工大停用词表。
2. 分析数据
analysize_corpus.py: 统计每类新闻的篇幅数,并统计每条新闻的单词数。
各类别文章数统计如下(总计新闻337,046篇):
奥运 | 房产 | 互联网 | 健康 | 教育 | 军事 | 旅游 | 汽车 | 商业 | 时尚 | 体育 | 文化 | 娱乐 | 招聘 |
26,437 | 69,661 | 10,736 | 5,442 | 10,045 | 2,889 | 8,760 | 6,539 | 60,790 | 16,412 | 83,689 | 3,225 | 32,335 | 86 |
其中去除有效词后,词数不超过50的新闻共计70,541篇(这里可认为是短文本,占总新闻的20.9%),具体分布如下:
奥运 | 房产 | 互联网 | 健康 | 教育 | 军事 | 旅游 | 汽车 | 商业 | 时尚 | 体育 | 文化 | 娱乐 | 招聘 |
5,860 | 12,238 | 1,255 | 514 | 4,436 | 278 | 2,056 | 621 | 4,738 | 4,816 | 25,354 | 349 | 7,972 | 54 |
3. 训练word2vector
3.1 数据准备
concate_multiclass_to_one_filehold.py : 把SogouCS_reduced_after_split文件下的多个文件夹,合并到同一个文件夹下segment,方便训练词向量读取数据。
3.2 模型训练
train_word2vec.py: 利用gensim提供的api训练词向量。
3.3 效果评测
test_w2v.py : 测试训练的词向量的准确性。
与“互联网”最相似的10个单词
单词 | 网络 | 网络媒体 | 广告业 | 电子商务 | 搜索引擎 | 网络广告 | 因特网 | 软件业 | 网站 | 网络营销 |
相似度 | 0.645921826 | 0.569461346 | 0.568275571 | 0.561880291 | 0.556282222 | 0.54134655 | 0.529152751 | 0.523529887 | 0.522828937 | 0.512335718 |
与“大学生”最相似的10个单词
单词 | 学生 | 毕业生 | 高校学生 | 学子 | 本科生 | 青年 | 村官 | 研究生 | 中小学生 | 中学生 |
相似度 | 0.654644549 | 0.598364472 | 0.570031106 | 0.553228498 | 0.540517211 | 0.540492177 | 0.535590529 | 0.5238868 | 0.518670142 | 0.508000612 |
与“哈工大”最相似的10个单词
单词 | 哈尔滨工业大学 | 东北大学 | 天津大学 | 北京航空航天大学 | 工学 | 外语系 | 华中农业大学 | 河南大学 | 工程系 | 吉林大学 |
相似度 | 0.632536173 | 0.603031993 | 0.601729929 | 0.587936163 | 0.577684045 | 0.577145576 | 0.571499586 | 0.551698387 | 0.547614992 | 0.546033502 |
4.得到短文本表示向量
4.1 提取短文本
get_short_corpus.py : 从segment文件夹下读取语料,把单词数不差过max_word_count(这里设置为50)的新闻提取出来作为短文本,放置到short_corpus文件夹下。
4.2 获得文本表示向量
get_short_corpus_vector.py: 从short_corpus文件夹下读取文件,计算文本表示向量,这里一共提供两种方式:一种是直接把文档中单词的词向量求平均值,一种是指数加权平均。
visual_word_vector.py: 随机抽取200个文本,通过t-SNE进行降维,然后得到可视化结果。
简单平均效果图如下:
指数加权平均效果图如下:
5.聚类
5.1 基于word embedding的聚类
选择sklearn提供的kmeans进行聚类,聚类前的文本分类情况如下:
奥运 | 房产 | 互联网 | 教育 | 旅游 | 商业 | 时尚 | 体育 | 娱乐 | 总计 |
5,860 | 12,238 | 1,255 | 4,436 | 2,056 | 4,738 | 4,816 | 25,354 | 7,972 | 68,725 |
cluster_use_sklearn.py: 使用sklearn提供的kmeans api进行聚类,采用Fscore进行评测。
5.2 基于传统特征的聚类(tf-idf/LDA)
get_tf_idf.py: 读取short_corpus文件夹下的文本,利用sklearn提供的TfidfVectorizer计算tf_idf,并保存到文件夹short_corpus_with_tfidf下,其中tf_idf维度为1984。
注:运行速度特别慢。
lda_test.py : 读取short_corpus文件夹下的文本,利用gensim提供的lda api训练模型并评测聚类的效果。
注:无。
get_doc2_vec.py : 读取short_corpus文件夹下的文本,利用gensim提供的doc2vec api训练模型并评测聚类的效果。
注:样本量小的话,效果非常差(先在大样本下训练,再在小样本进行测试,效果依然不理想,这里猜测原因可能是由于短文本的词过于少,致使训练的参数过拟合了)。
聚类结果如下所示:
特征提取方法 | F值 |
tf-idf | 64.38% |
lda | 51.48% |
doc_vector | 36.27% |
不同参数对应的聚类结果如下所示:
特征提取方法 | Fscore |
word_vector_average | 67.48% |
word_vector_average_with_exp_weight (beta=0.9) | 59.20% |
word_vector_average_with_exp_weight (beta=dynamic) | 61.73% |
word_vector_average_with_exp_weight (beta=min(dynamic,0.9)) | 62.79% |
word_vector_average_with_exp_weight (beta=min(dynamic,0.95)) | 69.23% |