基于NLP处理中国企业家文档
1. 实验环境
本次技术采用Python编程,Python可以从官网https://www.python.org/下载,选出适合用户操作系统的二进制发行版后,按提示一步一步进行安装。
一般而言,在用Python做数据分析与挖掘时,选择Anaconda。Anaconda是一个用Python做数据分析与挖掘的环境,包含了数百个最主流的数据科学程序包,使得用户能够快速简便的安装、运行和升级数据分析与挖掘环境。其架构如下图所示。可以从官网https://www.anaconda.com/下载并安装。
Anaconda环境中默认包含了Jupyter组件。Jupyter是一个开源的网页应用,用户可以创建和分享包含代码、公式、可视化图表和叙述性文字的文档。双击启动Jupyter,可以在文本框中输入Python代码进行交互式编程
2. 实验程序包的安装以及应用
在Anaconda环境中安装Python程序包非常方便。在联网情况下,在控制台键入命令pip install <程序包名>。
需要使用Python程序包时,用户键入命令import <程序包名> as <别名>。
本次进行文档数据处理时主要采用的程序包有:
-
BeautifulSoup4,该程序包是一个可以从HTML或XML文件中提取数据的Python库。它能够通过喜欢的转换器实现惯用的文档导航,查找,修改文档的方式。
-
jieba,对中文语料进行分词处理
-
gensim,gensim是一款开源的第三方Python工具包,用于从原始的非结构化的文本中,无监督地学习到文本隐层的主题向量表达。 它支持包括TF-IDF,LSA,LDA,和word2vec在内的多种主题模型算法,支持流式训练,并提供了诸如相似度计算,信息检索等一些常用任务的API接口,在本次文档数据处理就应用到了word2vec进行词向量的获取。
-
pandas,这款基于NumPy 的一种工具,该工具是为了解决本次数据分析任务而创建的。Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。另外,pandas提供了大量能使我们快速便捷地处理数据的函数和方法,是款强大而高效的数据分析工具包之一。
-
codecs,该模块进行自然语言编码转换。字符的编码是按照某种规则在单字节字符和多字节字符之间进行转换的某种方法。在Python中,codecs模块提供了实现这些规则的方法,通过模块公开的方法能方便地获取某种编码方式的工厂函数以及StreamReader、StreamWriter和StreamReaderWriter类。
-
math,该模块提供了一系列函数完成特殊的数学运算。
-
Matplotlib,Python的2D绘图库。通过 Matplotlib,开发者可以仅需要几行代码,便可以生成绘图,直方图,功率谱,条形图,错误图,散点图等。它以各种硬拷贝格式和跨平台的交互式环境生成出版质量级别的图形。
-
Kmeans,该程序包可以用于文本的聚类。
3. 实验过程
在本次的NLP对中文传记文档进行处理时,实验过程如下:
-
对30位企业家的传记、期刊以及网页文献进行获取。在进行网页文献获取时,在凤凰网,澎湃新闻,腾讯财经,新浪财经和网易财经这五大新闻网址分别对30个人的资料、文献报道进行爬取,主要采用的框架为:BS4,即BeautifulSoup4。
-
对汇总的传记进行jieba分词处理并去停用词去重。在进行分词时,结巴支持三种分词模式:精确模式,试图将句子最精确的切开;全模式,把句子中所有的可以成词的词语都扫描出来,速度非常快,但是不能解决歧义;搜索引擎模式,在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。在本次试验中,分词采用的精确模式,停用词采用哈工大停用词表,处理后生成的传记文档作为最终的语料词典。
-
使用word2Vec技术,对语料词典获取词向量。
-
获取每个企业家的特征词词向量处理,本步骤采用的仍旧为gensim模块提供的word2vec技术。
-
用余弦相似度计算获取到的特征词词向量和传记语料词典的相关度,以获取语料库中和特征词相关相似的词,最终得到每个企业家特征词的扩展词。
-
对每个企业家的扩展词进行筛选,过滤,抽取7136个特征词以统计词频,并再次对总的传记以及每个企业家的传记进行分词去停用词,此次处理不需要进行去重,编码以获取每个特征词在总的和每个人的传记中分别出现的次数,运行代码,得到特征词和特征词词频的.txt文档。
-
对词频较高的特征词进行聚类分析,本次实验选用的K-means聚类算法,并使用matplotlib绘图,算法聚类效果图是散点图,为了更直观的看到聚类效果,使用tagul可视化,更加直观、具体。
4. 实验总结
在进行编程实现各种需求时,遇到以下了各种问题:
- 传记汇总时,文档编码问题。由于python中默认的编码是Ascii,如果直接使用open方法得到文件对象然后进行文件的读写,都将无法使用包含中文字符(以及其他非ascii码字符),因此分词前使用文档编码格式要进行统一,转换为utf-8编码。否则提醒编码解码错误在进行文档处理时遇到了问题,提示的错误是:
UnicodeDecodeError: 'utf8' codec can't decode bytes in position 5394-5395: invalid continuation byte
谷歌查询了一下,原来是文件中包含非utf-8字符,又用iconv处理了一下这个问题,这样基本上就没问题了,命令码如下:
iconv -c -t UTF-8 < file > file.utf-8
-
编程实现对汇总后的传记进行去重问题。生成新的xxxzhuanji.txt文档,去重尝试了很多种方法,最有效而简洁的方式,就是使用列表进行去重,如下:
seg_article = list(set(seg_article))
-
特征词获取词向量生成新的tzcvector.txt之前,直接对文档特征词进行处理,程序会报错,因此特征词文档需要预处理,否则Excel中的特征词语c复制到.txt文档,出现空格以及编码问题,需要转化为行,写入文档时将空格和换行,才能获取特征词词向量,生成新的tezhengxi.txt文档。
list.append(line_clist[0].strip('\r\n'))
w.write(line_clist[0].strip('\r\n')+ ' ')
-
计算传记词向量和特征词向量之间相关度时的方法选择问题。在计算相关度有多种方法,如:pearman correlation,wordsim-240,余弦相似度等。最终选取了最为常用的余弦相似值进行计算,生成了新扩充的特征词的.txt文档。
-
运行结果、扩充词和平均相似度的保存问题。为将运行结果统一保存在newcos-num.txt文档,方便于观察,保证可信度。
-
数据量过大,程序运行时间较长的优化问题。在编程实现词频统计时,由于不仅要在每个人物的传记资料和文献中,获取7138个特征词的词频,还要在三十位企业家的传记资料和文献汇总中获取词频,编程统计汇总的文献总字数为8239485,内码存储8239485个汉字,需要 1647970个字节,对于有限的计算机配置来说,数据量可以说是相对较大的,所以采用将汇总资料和特征词取出来放进列表中进行读取的方式,速度和效率有了显著的提升。
此外,在总的传记文献资料生成词向量时,由于数据量过大,第一次运行将近4个小时,三十个人的特征词向量的获取,运行了将近三天两夜,后来想要尝试使用GPU集群或者多线程的方式,但是突然想起了pandas这个对大数据进行处理的程序包,尝试优化了代码,运行速度果然提升了特别多。 -
文档的合并问题。由于本次研究的是三十位企业家的传记文献,不免会有进行汇总,尝试使用了批处理,批处理时除了文档编码的转换,还要进行空格换行的去除。
-
聚类结果的可视化问题。在进行文本聚类时,采用的时scikit-learn中的k-means聚类算法,初始时将k设为5,最后将聚类结果可以打印出来,绘制图像时生成的散点图,不是特别直观,尝试采用了tagul可视化工具,以词云的方式展现,就比较直观,具体且美观。
5.实验心得
通过这次对三十位企业家的传记文献的爬取,编码格式处理,批处理汇总,传记文献词向量的获取,特征词向量的获取,向量间余弦相似度的计算,特征词的扩展,词频统计和文本聚类。感触最深的除了编码格式,就是数据处理的时间过长这个问题了,不过经过尝试,还是找到了相应的处理程序包,大大优化了程序,本次除了NLP中文文本处理技术的问题有了些许了解之外,对30位企业家的特征词的获取聚类过程,也了解了他们能成功的关键人格特征,希望自己也努力,向这些成功大佬看齐,不断提升自己的专业技能和人格魅力。