特别感谢router8008对本项目的启发,以及jackeyGao等用户对宋词的爬取收集。
这个项目尝试使用一些文本特征分析的方法,对21000+首宋词进行数据分析。
本项目是为了完成商务智能课程的最后作业,结果详见result.ipynb,以下文档内容尊重原作者的格式不变。
秉承fork源代码的开源精神,这里一切代码供学习之用,全部公开
具体可见result.ipynb文件中的展示。
程序使用了Anaconda的集成python环境进行开发,用到了内部例如numpy
, sklearn
, matplotlib
等机器学习和数学处理库。
另外,还需要如下环境:
pip3 install jieba #用于中文分词
pip3 install gensim #用于计算word2vec
pip3 install wordcloud #用于生成词云
当配置好环境后,这样运行样例:
python3 main.py
首先,数据分析的一个重要部分是计算每个诗人所写的诗的集合词向量,可以看作是诗人的“文风”。关于词向量的计算,使用了两种方法:
-
tf-idf
通过文本中词语的的tf-idf值计算诗人的用词特征,之后计算他们的余弦相似度,推荐一篇可以参考相关知识的blog:sklearn文本特征提取。
这种方法的的弊端在于没有考虑到词语之间的关联性,比如说"青","白"之间的关联程度,和"青","衣"之间的关联度肯定是不同的,所以引入了下一种计算词向量的方法。
-
word2vec
Word2Vec的基本**是把自然语言中的每一个词,表示成一个统一意义统一维度的短向量。通过word2vec训练后,得到每个词语的词向量,再通过求和平均的方法获得文本的词向量,则可以得到每个诗人的词向量。当然,求平均肯定不是一个计算文档词向量的最优方法,此处有待改进。
关于这个方法可以参考:word2vec&doc2vec词向量模型
为了便于显示,将计算结果降维,用到了t-SNE算法。
关于t-SNE算法可以参考:t-SNE聚类算法实践指南,其中的代码实现可以参考sklearn的官方文档:Manifold learning on handwritten digits: Locally Linear Embedding, Isomap…