这篇初级的入门教程是写给女儿的,我觉得现代大数据条件下的外语专业,需要了解一下外语文本分析的概念与技术,以便更好规划自己的学习研究与职业方向,以免被人工智能轻松淘汰(机器翻译现在已经达到初级人工翻译的水准了,比如科大讯飞的即时双向机器翻译已经达到了95%的准确率,相信不久的将来会实现商用),职业方向的选择应该是体现人的知识经验积累的方向。另一方面掌握现代大数据条件下的语言分析技术(NLP)对以后的学习研究乃至职业生涯应该是很有帮助的,近水楼台就介绍一下带进门。各种语言的文本分析是各大搜索引擎等大厂的强项,他们都有很强大的平台,各大NLP平台提供的多数是Python API。不过我选择的是适用于学术与教学的Orange+Orange Text平台,开源免费,单机部署,在卢布尔雅娜大学长期的开发下已经比较完整,功能不错,基本可用。文科生没什么编程基础,Orange可视化工作流的环境是比较合适的,然后要掌握基本的爬虫技术,以收集整理所需的资料。Python学起来相对容易一点,她已经学完了《Python从入门到实践》这本比较简单的教材。纯粹的文科生在大数据时代恐怕会比较困难,要文理结合,适当掌握一些必要的大数据技术,所以为她选择了Python+Orange的组合。<div>本篇以收集整理某西班牙语学术期刊网站上的期刊目录与简介为例介绍一些基本的概念与技术。爬虫技术的具体运用,要遵守法律法规,不得侵犯相关组织机构和作者的合法权益。</div> 一、任务描述<div><a href="https://scielo.isciii.es/scielo.php?lng=es" target="_blank" class="link"><i class="iconfont icon-iconfontlink"> </i>SciELO</a>是西班牙检索医疗领域学术期刊文章的网站,本篇的任务是收集其中一些期刊的简介,并根据简介自动对它们进行分类。<br></div> 本篇要收集下面网页中的<a href="https://scielo.isciii.es/scielo.php?=sci_alphabetic&lng=es&nrm=iso" target="_blank" class="link"><i class="iconfont icon-iconfontlink"> </i>期刊目录</a>,首页按“lista alfabética”进入,按字母顺序排列,分为核心期刊与非核心期刊两部分,要合并。 然后要顺着目录中的链接,收集每个<a href="https://scielo.isciii.es/scielo.php?=sci_serial&pid=1578-908X&lng=es&nrm=iso" target="_blank" class="link"><i class="iconfont icon-iconfontlink"> </i>期刊的简介</a>,这就是爬虫的功能,自动收集整理资料。搜索引擎是最大最强的爬虫,原理是一样的。自己写爬虫的好处是可以按自己的需要收集整理资料。 本篇将把收集整理好的文本介绍资料,存放到一个Excel可以打开的CSV格式文本文件中,然后用Orange Text据此分类。搜索引擎也是收集了各种各样的网页,存储到它的海量资料库中提供搜索。 二、收集整理资料<div>1、网址<br><div>浏览器、搜索引擎与爬虫收集资料的共同步骤是通过http(s)网络协议先把网页从服务器端下载到客户端。网络上在客户端(比如浏览器)与服务器之间流动交换的是数据包,服务器上的资源通过网址来识别,比如https://scielo.isciii.es/scielo.php?=sci_alphabetic&lng=es&nrm=iso这个网址,就识别了期刊目录这个资源,其中https是网络协议,相当于通达的交通方式(比如飞机、火车、汽车),scielo.isciii.es是网址,相当于小区地址,后面的部分相当于单元地址,表示了服务器上资源的地址。数据在网络上收发时,会根据网络协议拆解成一个个快递一样的部件数据包,收到后再根据网络协议拼装起来。所以网络上访问任何资源都需要网址,我们可以通过在浏览器上输入网址来看看资源是否可以公开访问,因为有些资源有密码或防火墙等访问限制。</div><div>2、网页</div></div><div>我们在浏览器中看到的网页,比如上面的图2,是浏览器渲染的结果,并不是它原来的样子。网页其实是个如下图所示html格式的文本文件,它用html语法描述了网页中的各项元素,比如图片的来源网址、大小与位置,文字的字体、颜色、大小与位置,到达其它资源的超链接网址等。浏览器据此渲染出网页的视觉效果;搜索引擎据此建立网页内容的索引,以及通往其它网页的索引;自己写的爬虫,就是分析网页源代码文本的内容,从中提取自己感兴趣的内容,比如本篇提取了期刊目录网页中期刊的名字,出版的期数,以及期刊简介的网址,作为结果数据文件的前3列。在浏览器中网页的空白处按鼠标右键,选择“查看网页源代码”就可以看到下图的网页html源码。</div> 3、语言、字符编码与字符集<div>网页有各种各样的语言,如中文、英文、西班牙语等,每种语言在计算机网络中存储与传输时,都要转换成最底层的二进制编码,它们在计算机内部并不是屏幕上看起来的样子。计算机只认识二进制的0和1,计算机中用一个定长的0与1序列编码来表示一个字母,8位为一个字节(ASCII码,英文,比如二进制序列01000001表示字母A),用几个字节来表示一个汉字,不同的编码方式就产生了不同的字符集,同一个字符集,如汉字常用字符集,也可以用不同的字符编码来表示,比如汉字GB2312编码用两个字节,UTF-8编码用不定长的多字节。UTF-8编码表示了一个非常大的字符集,包括了各种字母语种的常用字母,以及汉字圈常用的汉字。服务器发送网页时,会把网页html转换为其头部所声明的语言与字符编码,浏览器据此用相同的字符编码与语言来解析网页源码,就会正确的显示出来。如果浏览器用了不正确的字符集来解析收到的网页,就会看到乱码。比如上面的网页源码中,红色下划线标记的第3行</div><div>content="text/html; charset=utf-8"</div><div>说明了这是个html格式的网页源码文本文件,它的字符集编码是utf-8,它包括西班牙语的所有字母,所以可以正确显示。</div> 4、爬虫程序模拟浏览器<div>如第1小节所述,浏览器访问一个网址,就是向该网址发送访问请求的数据包。所以可以在Python程序中发送同样的数据包来模拟浏览器,就可以顺利的访问想要的资源,服务器就会发回同样的网页html源码,在Python程序中接收为字符串,处理返回的字符串,就可以提取想要的内容。Python提供了requests包来访问http(s)协议的网络资源,有很多的工具包可以协助处理结果,本篇用xmltodict包来协助提取数据,后面再详细介绍。</div><div>这里,关键是要构造出与浏览器一样的http访问请求参数,就是http request header,让服务器认为另一端的是浏览器,程序及运行结果如下图所示,返回的html源码赋给了字符串变量text,Spyder中可以双击打开它来浏览,与在Chrome浏览器中网页上鼠标右键 - > 查看网页源代码 看到的源码是一样的。</div> 5、提取浏览器访问特定网址的http request header<div>Chrome与Fire Fox都提供了浏览器开发者工具,可以在浏览器端调试网页程序(html网页源代码其实是个html程序,由浏览器解析执行),其中的Network工具标签页可以看到浏览器所有的网络访问详情。以Chrome为例,在浏览器最右上角 ...菜单中选择 更多工具 - > 开发人员工具,打开一个新的调试页面,切换回原页面输入要访问的网址,再切换回调试页面,会显示下图所示的网络访问列表,第一项就是要访问的最初网址(原来有的话可以先清理再刷新网页即可),后面是该网页顺序引用的其它网络资源。单击选中第一项,然后选择 Headers Tab,下拉就可以看到 Request Headers分组,拷贝下来(可以按鼠标右键拖拉选中并拷贝到记事本中),然后在Python程序中,如上图按键与对应的键值定义一个headers字典作为requests.get()函数的参数即可。</div> 6、<a href="http://jeanye.cn/book/scripts/spyderExample.py" target="_blank" class="link"><i class="iconfont icon-iconfontlink"> </i>爬虫程序</a><div>有几个要点。</div><div>1)如上一小节所述构造http request header模拟浏览器。</div><div>2)返回的结果是个Python requests包的response对象r,在提取结果之前,要把返回对象的字符集编码设置为与服务器端一致的utf-8,Python程序猜测出来的iso-8859-1编码是不对的,会读出乱码。</div><div>r.encoding = "utf-8"</div><div>3)观察源码,打开浏览text变量,拷贝并在Spyder中新建一个html文件,以便标签高亮显示。期刊目录是一段以 ul 标签对封装的 li 标签列表,是xml语法的格式(知识点,补充一下对xml语法的了解,标签一般成对出现,类似括号的作用),适合整段截取出来,用xmltodict包转换为字典(先去除单独出现的<br>标签 br,不符合xml规范,对结果没有影响,html语法不是严格的符合xml语法规范),方便按Python字典树(嵌套字典,即字典的键值也是字典)的层次结构提取期刊的名称,简介的网址,以及出版的期数,具体见上面的爬虫程序源码。逐级打开字典了解转换后的层次结构,以便编写提取的程序,如图。</div> 4)提取所有期刊简介网址的列表后,循环逐个爬取期刊的简介网页。同上面一样,选一个测试,提取返回的html源代码另存为html文件,在Spyder中打开浏览观察,用编辑->搜索找到感兴趣的内容,如 Publicación de,Misión,观察感兴趣内容前后的特殊标签,这里通过特殊标签字符串匹配定位,然后截取感兴趣的字符串内容,具体见上面爬虫程序的源码。 5)合并提取的内容列表成数据框,并输出成utf-8编码的CSV数据文件。数据文件有7列:期刊的名称、简介网址、出版期数、出版方、线上ISSN号、线下ISSN号、简介。如果用WPS打开,西班牙文会正确显示,如果用Excel打开,会显示为乱码,这时要在Excel菜单的数据->从文本/CSV 菜单上打开,选择utf-8编码,然后就会正确显示。 7、补充,安装新的Python包。<div>要以管理员的身份安装,才会安装到anaconda3自带的目录,比如安装xmltodict包,否则安装到用户目录,用起来不太方便。</div><div>左下角Windows开始菜单->Anaconda3->Anaconda Prompt->鼠标右键->更多->以管理员身份运行。</div><div>然后输入要安装的包名: pip install 包名,比如:</div><div>pip install xmltodict</div> 三、Orange Text文本分析<div>大数据时代,外语的学习与研究,包括语言学甚至文学上的研究,外语资料的研究,少不了外语资料的文本分析,因此需要一些好用的外语文本分析工具。<br><div>1、简介<br><div><a href="https://orangedatamining.com/" target="_blank" class="link"><i class="iconfont icon-iconfontlink"> </i>Orange</a>是由斯洛文尼亚卢布尔雅娜大学生物科学实验室开发的可视化数据分析教学环境,它的基本数据结构是<a href="https://orangedatamining.com/widget-catalog/data/datatable/" target="_blank" class="link"><i class="iconfont icon-iconfontlink"> </i>Data Table</a>组件,相当于一个Excel数据表,所有的数据分析,包括各种统计图与人工智能算法等,从数据表出发,通过连接一系列的分析算法组件等,形成一个自动处理的工作流,完成数据分析的过程,产生想要看到的结果,一般只需要设定组件的参数与连接,不需要编程,比较适合非计算机专业的数据分析入门,单机处理不太庞大的实验数据,特别是学术与教学用途。它的文档可以看<a href="https://orangedatamining.com/docs/" target="_blank" class="link"><i class="iconfont icon-iconfontlink"> </i>这里</a>,教程可以看<a href="https://orangedatamining.com/getting-started/" target="_blank" class="link"><i class="iconfont icon-iconfontlink"> </i>这里</a>,可视化组件的目录与文档可以看<a href="https://orangedatamining.com/widget-catalog/" target="_blank" class="link"><i class="iconfont icon-iconfontlink"> </i>这里</a>。</div><div><a href="https://orangedatamining.com/widget-catalog/" target="_blank" class="link"><i class="iconfont icon-iconfontlink"> </i>Orange Text</a>是Orange环境上开发的字母语种文本分析工具,增加了一些字母语种文本分析常用的组件,比如语料库、词袋、预处理等。其中<a href="https://orangedatamining.com/widget-catalog/text-mining/corpus-widget/" target="_blank" class="link"><i class="iconfont icon-iconfontlink"> </i>语料库Corpus</a>是基础的数据结构,与Data Table是兼容的数据组件,差别是加载的是文本数据(字符串),而Data Table加载的是数值数据。</div></div><div>文本数据不能直接应用各种人工智能算法,需要转换为数值数据。所有的人工智能算法都是在数值数据上运行的,算法的背后是概率论与统计学,以及神经网络,这些都是数值算法,相当复杂的数学。于是文本分析领域发展了各种方向的文本到数值数据的转换(映射)算法,本篇用一个计算文本间欧几里德距离的组件,把期刊简介文本间的相似度,转换为数值数据,然后应用机器学习(人工智能,AI)的层次聚类算法,对期刊进行分类,同类的期刊性质上是更接近的。本例分类的效果不一定很好,因为只是一个技术与概念的说明。从Orange Text的这些组件与技术,可以看到文本分析领域的研究与发展方向,总体上,Orange Text跟上了该领域前沿的技术,除了机器翻译之外。机器翻译用的是神经网络深度学习技术,各大搜索引擎是该领域的领先者,可以等积累够了再进一步了解。</div><div>这里可以看到Orange平台的另一个优势,就是它各领域的组件是连通兼容的,比如本例中使用的层次聚类算法组件,是通用的AI算法组件,这样Orange就可以打通各领域的研究,发生神奇的化学反应。</div><div>Orange已经有了<a href="https://chengxianzn.one/" target="_blank" class="link"><i class="iconfont icon-iconfontlink"> </i>汉化版</a>,包括Orange Text汉化版。中文与字母语种文本分析的主要差别在于分词,字母语种的分词比较简单,中文的分词则相当复杂,现在是用深度学习算法的效果比较好。字母语种则多了单词的词态、时态、重音等变化,Orange Text的预处理组件已经都可以处理,所以Orange Text是外语专业外语资料分析的一个不错的入口,入门比较合适。</div><div>Orange及Orange Text的<a href="https://chengxianzn.one/docs/" target="_blank" class="link"><i class="iconfont icon-iconfontlink"> </i>中文文档</a>可以看这里。</div></div> 2、启动Orange<div>Window开始菜单->Anaconda3->Anaconda Prompt,打开一个Anaconda Prompt命令行窗口,输入启动命令</div><div>python -m Orange.canvas</div> 3、总体工作流图 Orange的安装与基本使用请看它<a href="https://orangedatamining.com/getting-started/" target="_blank" class="link"><i class="iconfont icon-iconfontlink"> </i>文档</a>中的教程,Orange Text自带了几个英文文本分析的例子,在D:\Anaconda3\Lib\site-packages\orangecontrib\text\tutorials目录下,可以通过Orange菜单 File->Open打开。这是本例已经建好的工作流,下面逐个组件看看组件的参数设置。 1)加载前面爬虫程序生成的期刊简介数据文件。单击或拖动CSV File Import组件到右面画布中后,双击打开组件,浏览选中要加载的数据文件。可以在弹出的面板中修改数据文件的加载设置,比如字符集编码,分隔符,每列的数据类型等,这里用默认即可。 2)单击或拖动Data Table组件到画布,鼠标按住上面CSV File Import组件右边的组件输出端,拖拉到Data Table组件左边的组件输入端,就建立了二者之间的数据连接,现在双击Data Table组件就可以打开浏览数据。文本(字符串)型数据深色显示,浅色的是数值型数据。每个组件都有数据输入与输出端,输入输出数据类型匹配的两个组件之间可以拖动建立连接,从而建立工作流。在连接的线上右击鼠标,可以更改连接的设置,比如有些组件有多个输出和多个输入,可以更改一个组件的哪个输出连接到另一个组件的哪个输入。连接线上会标注线上传送的数据类型。 3)将加载数据转换为语料库,这是Orange Text文本分析关键的一步,所有的文本分析都在语料库的基础上进行。双击打开语料库组件,选择Data Table中的数据列,指定期刊名称name列为语料的标题,指定简介Mission列为要分析的文本。 4)Corpus Viewer可以逐条查看加载的语料。点击左侧语料列表中的一条,右侧就会显示它的详细内容。 5)预处理。这是Orange Text的核心功能,共有6种可以应用的预处理,双击左面列表上的预处理名称,对应的分组就会按执行顺序(注意顺序!)出现在右面的主区域,表示选中应用该组预处理,单击分组上的关闭按钮,则关闭不应用该分组。<div>A、Transformation,转换,主要是清洗文本,比如清除重音,欧洲不少语种都有重音,清除单词的重音更便于不同语料之间意义相同单词的比较,不清除的话有没有重音就是两个不同的单词。</div><div>B、Tokenization,分词或分句,字母语种一般是用空格分隔单词,分词比较简单,这里还提供了标点符号、分句(语料可以是整篇文章)、正则表达式等其它灵活的语料分割方式。Regexp正则表达式对初学者是个知识难点,以后有精力再详细了解。</div><div>C、 Normalization,规范化,好像是同一词干的词,规范化为同一个单词,比如 he, him, his的词干都是he,大概会规范化为he。有几种规范化模型,里面的雪瀑模型(不是雪球)snowball大概就是这样,然后可以选择语种,里面有Spanish。我对这个领域的了解不多,暂时是这样理解,不一定对。规范化是字母语种文本分析领域的前沿课题。</div><div>D、Filtering,过滤,删除分词结果中一些对分析结果意义不大的单词,比如字母语种中的冠词、介词,它们统称为stopwords,可以在下拉列表中选择语种,也可以加载自定义的stopwords列表。Document Frequency统计的是一个单词在各语料中出现的频率,与之相关的IDF模型处理的是体现文档之间差异的少数特异词,而不是共同的高频词,这也是字母语种文本分析的前沿课题。这里我们选择输出过滤后的前50个单词来生成词云图。</div><div>E、N-grams range,用于切分语料的切分长度窗口范围。N-grams算法通过按指定长度切分字符串的所有子串并加以统计比较,来确定两个字符串(单词、句子等)的相似性,或推测一个单词的后续单词等(比如搜索引擎的自动推荐),可以参阅<a href="https://www.zhihu.com/question/357850262" target="_blank" class="link"><i class="iconfont icon-iconfontlink"> </i>这篇文章</a>和<a href="https://zhuanlan.zhihu.com/p/32829048" target="_blank" class="link"><i class="iconfont icon-iconfontlink"> </i>这篇文章</a>。这也是文本分析领域的前沿课题,我还不了解。</div><div>F、POS Tagger,词性标注,在一些文本分析中需要了解每个单词的词性,名词、动词、形容词等。</div> 6)先输出一个词云图来看看这些期刊的主题集中在那些方面,左面是词与词频,右面是词云图,可以调整词的倾角。这里可以看到一个高频词br,显然它是html中的换行标签,应该是前面数据清洗时没有去除,清除这个单词的问题留给读者去解决。 7)生成词袋,词袋是很多文本分析模型的基础,它统计了一个单词在语料文档或所有语料文档(IDF)中出现的频率(数值),在语料库Corpus的Data Table上追加了词袋的一列,所以与它们是兼容的数据类型。 8)浏览词袋。词袋的结构,增加一列统计了每篇语料种各个单词的词频,这里统计的是IDF词频。 9)计算期刊简介之间的距离(相似性),前面词袋统计了词频的数值数据,相当于一个文本语料到数值之间的统计映射,Distance这个通用的组件,通过计算语料(行)之间的欧氏距离,生成了一个欧氏距离的特征矩阵(68行语料,68*68矩阵),后面就可以应用通用的机器学习AI算法,这些AI算法都需要一个数值型的特征矩阵。因此与词袋一样,这是一个关键的中间组件,相当于化学反应中的化学键,连接不同的元素。 10)应用层次聚类模型。在Unsupervized算法组下单击Hierarchical Clustering组件添加到画布,从Distance组件输出端连线到它的输入端,可以看到线上标记传送的数据类型是Distance矩阵。层次聚类是一类无监督的分类算法,以树的形式标记期刊之间的亲疏关系,同一分支下面的就归属到一类。上图是聚类的结果,点击其中一个分支,第4、56、57项分在一起了,蓝色高亮显示表示选中输出,要选中才会有输出。 11)查看输出的聚类结果,连接Hierarchical Clustering组件的输出到一个Corpus Viewer组件的输入,双击打开查看。现在可以逐条查看选中的4种期刊的简介,看看它们是否应该属于同一个领域的期刊,人工判断机器学习的自动分类是否准确。<div>第56、57项是两条重复的语料,分在一起表明按距离来度量其相似性是一个可行的思路。但经女儿的人工智能验证,分类的效果不太好,说明从文本到数值映射的算法(词袋)或从数值映射构建特征矩阵的算法(欧氏距离)效果还不够好,有待改进。之前做的一个<a href="https://www.meipian.cn/35p8l1k1?share_depth=1" target="_blank" class="link"><i class="iconfont icon-iconfontlink"> </i>中文文本分析例子</a>效果好像还可以。<br><div><br></div></div> 四、小结<div>这个例子的真正优化改进,需要深入学习了解层次聚类等AI算法,对一个没有计算机基础的文科生来讲有点难度,不过这个例子与教程将是一个合适的开始,努力一下应该是可以学会应用的。大数据时代的外语专业,还是要掌握一些外语大数据分析的技能。<br><div>外语文本分析可以做的东西很多,本篇用期刊自动分类这个简单的例子演示了相关的概念、技术和工具的使用,要结合自己学习研究的需要,开动大脑,灵活运用。好的工具事半功倍, Orange Text是学生们开始外语文本分析的一个不错的入口。另外要了解外语文本分析与中文文本分析的主要差别,以及目前的前沿课题与技术,走正确的方向。</div></div><div><br></div><div>我不是文本分析领域的专家,这篇教程只是提供孩子了解一下该领域的一些概念与技术,父女俩玩玩的小游戏,无伤大雅。</div>