知识图谱入门:图谱构建中的数据采集、文本解析处理、数据分析常用工具总结

2021/11/09

以下文章来源于老刘说NLP

正文

当我们进入到一个新的领域,并且希望能够快速地完成图谱的构建,往往需要掌握一些基本的组件,知道有哪些公开的“轮子”可以使用, 而这个轮子,一方面包括已经开放可供使用的工具、平台、软件系统,也包括一些结构化的知识库,了解并熟知已有的资源。

本文分别从文本数据采集工具、文本数据采集工具、文本转换与标准化工具、文本处理分析工具以及文本分析工具等方面进行介绍,可作为入门爱好者的一个索引。

一、文本数据采集工具

数据采集一般包括几个基本流程:先获得目标数据的URL、并向对应的URL提交HTTP请求,解析HTTP响应,存储解析结果。在每个阶段都有成熟的开源工具来支持,例如python自带的urllib组件、Requests组件等,均可以完成向目标URL发起不同种类的HTTP请求。在文本采集模块中,值得一提的包括Selenium、curltrillworks、以及Scrapy。

1)Selenium

有时,在采集网页信息时,常常会出现返回的信息存储在一个js当中,即所需要采集的内容需要使用浏览器进行渲染。Selenium是一个用于测试网站的自动化测试工具,支持各种浏览器包括Chrome、Firefox、Safari等主流界面浏览器,同时也支持phantomJS无界面浏览器。Selenium3.x调用浏览器必须有一个webdriver驱动文件。为此,在这时,则需要借助Selenium或者phantomJS来实施采集。由于频繁的操作界面化浏览器,因此常常会选择phantomJS作为渲染方式。

2)curl.trillworks

通用的爬虫方法往往无法满足当前异构的网页,因此,我们往往会采用具体情况、具体分析的技术路线,例如,curltrillworks是一个常用的采集工具,其能够将某个网页的curl请求转换成可执行的Python爬虫脚本。

3)Scrapy

Scrapy是一套基于基于Twisted的异步处理框架,纯python实现的爬虫框架,用户只需要定制开发几个模块就可以轻松的实现一个爬虫,用来抓取网页内容以及各种数据,非常方便。Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架,可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。其最初是为了网络抓取所设计的,也可以应用在获取API所返回的数据(例如 Amazon Associates Web Services)或者通用的网络爬虫。

4)Redis

在进行大规模采集时,经常会遇到对网站进行遍历采集的问题,这时候,往往需要在采集的过程中维护一个采集URL池,以避免重复查询以及方便多台机器分布式采集。这时候需要采用Redis数据库与Scrapy进行配合使用。Redis 是完全开源的,遵守 BSD 协议,是一个高性能的 key-value 数据库,Redis性能极高,Redis能读的速度是110000次/s,写的速度是81000次/s。此外,Redis还拥有丰富的数据类型,支持二进制案例的Strings,Lists,Hashes,Sets及Ordered Sets数据类型操作;Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。Redis还支持 publish/subscribe,通知,key过期等等特性。

二、文本数据解析工具

网页信息解析,是在进行网页抓取之后,从包含不同标签的网页中提取目标字段和字段的过程,由于提取的信息隐藏在标签当中,因此通常情况下会利用HTML的标签含义例如,文章的标题通常位于title标签下,表格类数据通常位于td标签,段落信息位于p标签下,以及字段排列的规则,例如字段名称与字段值之间常用冒号或者破折号隔开,也就是说,在这个阶段需要手动编写规则实施解析提取。在数据解析阶段,常用的开源工具包括re、BeautifulSoup、LXML是其中的两个常用组件。

1)re正则表达式

正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串,是自然语言处理最基础同时也是最重要的处理工具。例如经常会使用:“[1-9]\d{5}(?!\d)”来匹配中国邮政编码, “^\w+([-+.]\w+)@\w+([-.]\w+).\w+([-.]\w+)*

”来匹配汉字 “^[A-Za-z0-9]+或”来匹配英文和数字。

Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式。;例如compile 函数根据一个模式字符串和可选的标志参数生成一个正则表达式对象,该对象拥有一系列方法用于正则表达式匹配和替换。Re还提供了findall,group等分组功能。

2) BeautifulSoup

BeautifulSoup是常用的网页信息解析工具。该组件除了本身自带的解析库外,还可以指定解析库如lxml和html.parser等对HTML文件进行解析。Beautiful Soup将复杂HTML文档转换成一个复杂的树形结构,并将每个节点归纳为Tag , NavigableString , BeautifulSoup , Comment四种python对象,还提供了文档树的遍历、搜索和修改功能针对不同的对象,可以通过对标签的操作获取不同信息,例如通过 .name 来获取每个tag的名字,使用. tag来获取每个tag的属性,利用prettyfy方法来对网页进行整理。此外,Beautifulsoup还可以与正则表达式混合使用,如果传入正则表达式作为参数,Beautiful Soup会通过正则表达式的 match() 来匹配内容

3)LXML

lxml是一种使用Python编写的库,可以迅速、灵活地处理XML和HTML,并且实现了常见的ElementTree API,该组件中封装了xpath,因此常会使用xpath语句进行元素和属性进行遍历。例如,在 XPath 中,定义了包括元素、属性、文本、命名空间、处理指令、注释以及文档(根)节点在内的七种类型,并将XML 文档作为节点树来对待,树的根被称为文档节点或者根节点。Xpath可以根据编写提取语句来实现数据提取,例如:“nodename”来选取此节点的所有子节点;“/”来从根节点选取;“//”来从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置;“.”来选取当前节点;“..”来选取当前节点的父节点;“@“来选取属性。

4) Newspaper

快速收集大规模新闻语料是进行知识图谱构建和文本挖掘十分重要的技术手段,而目前开放的新闻网站往往成为数据源,因此,针对不同异构网站推出的通用信息采集工具包被陆续开放出来。Newspaper是由Lucas Ou-Yang开发的一款用来提取新闻、文章和内容分析程序,使用多线程,支持10多种语言。作者从requests库的简洁与强大得到灵感,使用python开发的可用于提取文章内容的程序,在该工具包中,可以通过新建Article对象,对传入的待抓取URL进行解析,得到正文(text)、标题(title)、源码(html)、作者(authors)、图片(top_image)、视频(movies)、关键词(keywords)等信息。

不过,该框架并不适用于实际工程类新闻信息爬取工作,框架不稳定,爬取过程中会有各种bug,其通用性不强,尤其是针对中文网站而言,获取不到url、新闻信息等问题较多。

5)GeneralNewsExtractor

与Newspaper类似,GNE(GeneralNewsExtractor)是一个通用新闻网站正文抽取模块,输入一篇新闻网页的 HTML, 输出正文内容、标题、作者、发布时间、正文中的图片地址和正文所在的标签源代码。不过,需要注意的是,GNE不支持翻页,并且在不小于Python 3.6.0的开发环境下运行,其所能接受的输入仅能为HTML。GNE是基于HTML来提取正文的,所以传入的HTML一定要是经过JavaScript渲染以后的HTML,否则无法提取。

三、文本转换与标准化工具

文本规范化中,经常会出现跨行、跨页等问题。因此,常常需要使用PDFMiner等工具进行处理,进行格式转换和标准化,以形成规范化的纯文本形式,作为输入数据进行下游任务处理。

1)PDFMiner与PyPDF2

PDFMiner是一个从PDF文档中提取信息的工具。与其他PDF相关的工具不同,它只用于获取和分析文本数据。PDFMiner能获取页面中文本的准确位置,以及字体或行等其他信息。它还有一个PDF转换器,可以将PDF文件转换成其他文本格式,还有一个可扩展的解析器PDF,可以用于文本分析以外的其他用途。PDFMiner内置两个工具:pdf2txt.py提取所有以编程方式呈现的文本。它还提取每个文本段的相应位置、字体名称、字体大小、书写方向(水平或垂直)。它不能识别图像中的文本。对于受限制的PDF文档,需要提供密码。dumppdf.py用于调试PDF文件。它以伪XML格式转储所有内部内容。PyPDF2是一个python PDF库,能够分割、合并、裁剪和转换PDF文件的页面。它还可以向PDF文件中添加自定义数据、查看选项和密码。它可以从PDF检索文本和元数据,还可以将整个文件合并在一起。

2)python-docx

python-docx是用于创建可修改微软Word的一个 python 库,提供全套的 Word 操作,是最常用的Word工具。实际上,doc文件底层是由xml文件来编写的,当我们将一个doc文件的后缀名改成.rar或者.zip,并进行解压缩之后,可以得到其中的xml文件、css样式以及图片文件。因此,docx的操作也常可以转化为对xml文件的操作。

四、文本处理工具

1)NLTK

NLTK 大概是最知名的Python自然语言处理工具了,全称”Natural Language Toolkit”, 由Steven Bird和Edward Loper在宾夕法尼亚大学计算机和信息科学系开发。该组件支持英文文本的处理,并内置了数据集、处理以及分析模块,支持语料库获取、字符串处理、搭配发现、语义分析等功能。例如nltk.corpus提供了例如gutenberg、brown语料库和词典wordnet等的标准化接口,可以通过wordnet获取给定词的定义、例句、同义词、反义词、上下位词等数据,nltk.toknnize和nltk.stem用于分词和提取主干(词性还原),ntltk.collocations提供了基于t-检验、卡方和点间互信息的搭配算法,nltk.chunk用于正则表达式和命名实体识别。

虽然nltk无法直接处理中文,但可以基于NLTK进行文本数据分析,将中文文本经分词后转换为nltk能处理的Text类,则可以进行文本搜索和计算。例如,可以利用nltk完成基本的语料库操作:text.concordance来获取某个词语在text中的上下文;text.similar来获取word上下文中最相似的词;textcommon_contexts获取多个词语的共同上下文,count进行词语频次统计,text.dispersion_plot来获取特定词语在text中的索引位置,以展示词语的离散图。

2)Standfordparser

StandfordParser是Stanford NLP小组提供的一系列工具之一,是用来完成语法分析的任务。StanfordParser可以找出句子中词语之间的dependency关联信息,并且以StanfordDependency格式输出,包括有向图及树等形式。stanfordcorenlp是Stanford CoreNLP的Python封装器。它为文本处理任务提供了一个简单的API,如Tokenization、Part of Speech Tagging、Named Entity Reconigtion、Constituency Parsing、Dependency Parsing等。

Standfordparser支持中文分析,其中的句子成分分析(使用频次最高)和依存句法分析是使用最为广泛的一个模块,该模块既是一个高度优化的概率上下文无关文法和词汇化依存分析器,也是一个词汇化上下文无关文法分析器。基于权威可靠的宾州树库(Penn Treebank)作为分析器的训练数据,目前已面向英文、中文、德文、阿拉伯文、意大利文、保加利亚文、葡萄牙文等语种提供句法分析功能,提供了多样化的分析输出形式,除句法分析树输出外,还支持分词和词性标注文本输出、短语结构树输出、斯坦福依存关系输出等。基于standfordparser进行短语组块识别,可以得到比单词更为凝固的中文语言单位。

3)Spacy

spaCy是最流行的开源NLP开发包之一,它有极快的处理速度,并且预置了词性标注、句法依存分析、命名实体识别等多个自然语言处理的必备模型,因此受到社区的热烈欢迎。中文版预训练模型包括词性标注、依存分析和命名实体识别,Spacy是一个免费的开源库,用于Python中的高级自然语言处理(NLP)。其定位为一个工业级的自然语言处理组件。spaCy是一个用Python和Cython进行高级自然语言处理的库。它建立在最新的研究基础上,从设计的第一天起就被用于实际产品中。

Spacy自带预训练的统计模型和词向量,目前支持60多种语言的标记化。它具有最先进的速度,卷积神经网络模型用于标记、解析和命名实体识别,并易于深度学习集成。它是商业性的开源软件,以MIT授权发布。

Spacy包含了一个快速的实体识别模型,它可以识别出文档中的 实体短语。有多种类型的实体,例如人物,地点,组织,日期,数字。spaCy 的 document 可以在 tokenized 过程中被分割成单句,这些单句还可以进一步分割成单词词性标注即标注语法正确的句子中的词语的词性。这些标注可以用于信息过滤、统计模型,或者基于某些规则进行文本解析。

spaCy 拥有一个快速实体识别模型,这个实体识别模型能够从 document 中找出实体短语。它能识别各种类型的实体,例如人名、位置、机构、日期、数字等。你可以通过“.ents”属性来读取这些实体。spaCy最强大的功能之一就是它可以通过调用轻量级的API来实现又快又准确的依存分析。这个分析器也可以用于句子边界检测以及区分短语块。依存关系可以通过“.children”、“.root”、“.ancestor”等属性读取。依存树也可以用来生成名词短语。SpaCy提供了内置整合的向量值算法,这些向量值可以反映词中的真正表达信息。它使用GloVe来生成向量。GloVe是一种用于获取表示单词的向量的无监督学习算法。

4)jieba

Jieba是使用范围最广的中文分词工具。支持四种分词模式:精确模式,试图将句子最精确地切开,适合文本分析;全模式,把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义;搜索引擎模式,在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。

paddle模式,利用PaddlePaddle深度学习框架,训练序列标注(双向GRU)网络模型实现分词。同时支持词性标注。支持繁体分词支持自定义词典。开发者可以指定自己自定义的词典,以便包含jieba词库里没有的词。虽然 jieba 有新词识别能力,但是自行添加新词可以保证更高的正确率。此外,还提供了基于TF-IDF算法以及TextRank的关键词抽取功能。

5)LTP

语言技术平台(Language Technology Platform,LTP)是哈工大社会计算与信息检索研究中心历时十年研制的一整套开放中文自然语言处理系统。LTP制定了基于XML的语言处理结果表示,并在此基础上提供了一整套自底向上的丰富、高效、高精度的中文自然语言处理模块,包括词法、句法、语义等5项中文处理核心技术,在多次国内外技术评测中获得优异成绩。

LTP提供了包括分词、词性标注、依存句法分析、语义依存分析、语义标注等接口功能,是中文领域学术领域功能完备的一类处理工具。

6)DDParser

DDParser(Baidu Dependency Parser)是百度自然语言处理部基于深度学习平台飞桨(PaddlePaddle)和大规模标注数据研发的依存句法分析工具。其训练数据不仅覆盖了多种输入形式的数据,如键盘输入query、语音输入query,还覆盖了多种场景的数据,如新闻、论坛。该工具在随机评测数据上取得了优异的效果。同时,该工具使用简单,一键完成安装及预测。

7)Hannlp

HanLP是由一系列模型与算法组成的Java工具包,目标是普及自然语言处理在生产环境中的应用。HanLP具备功能完善、性能高效、架构清晰、语料时新、可自定义的特点。Hannlp是面向中文领域功能最为完备的开放组件,支持多语言分词、词性标注、命名实体识别、关键词提取、自动摘要、短语提取、拼音转换、简繁转换、文本推荐、依存句法分析、文本分类、文本聚类、语义分析、Word2vec、新词发现等多个接口。

五、文本分析工具

1)Networkx

图是复杂网络研究中的一个重要概念。Graph是用点和线来刻画离散事物集合中的每对事物间以某种方式相联系的数学模型。Networkx是一个python组件,是一个用Python语言开发的图论与复杂网络建模工具,内置了常用的图与复杂网络分析算法,可以方便的进行复杂网络数据分析、仿真建模等工作。networkx支持创建简单无向图、有向图和多重图(包括多重有向图和多重无向图);内置许多标准的图论算法,节点可为任意数据;支持任意的边值维度,功能丰富,简单易用。利用networkx可以以标准化和非标准化的数据格式存储网络、生成多种随机网络和经典网络、分析网络结构、建立网络模型、设计新的网络算法、进行网络绘制等。

2)Sklearn

Sklearn(scikit-learn)是一个基于python的机器学习工具包,内置了丰富的机器学习算法组件,包括经典的分类算法和聚类算法。与自然语言处理关系较为密切的算法主要包括特征提取、文本分类、聚类、降维等。在使用二维平面进行空间中某个点进行展示时,往往需要使用降维操作,如针对预先训练好的词向量(一般为几百维)进行PCA处理,映射称为两维坐标,Sklearn还提供了对模型的持久化保存机制。

3)Gensim

Gensim是一款开源的第三方Python工具包,用于从原始的非结构化的文本中,无监督地学习到文本隐层的主题向量表达。它支持包括TF-IDF,LSA,LDA,和word2vec在内的多种主题模型算法,支持流式训练,并提供了诸如相似度计算,信息检索等一些常用任务的API接口。Gensim其特点在于完成对文本的语义向量化表示,如采用wordvec词向量训练工具,用户可以通过导入内置文本数据,选择CBOW或Skip-gram模型完成针对该文本的词向量训练操作,得到预训练词向量模型;使用doc2vec工具,训练生成句子向量化表示模型;使用内置的LDA模型,完成对文档集合的主题建模和向量表示;使用author2vec完成对作者的向量化表示。

六、总结

本文分别从文本数据采集工具、文本数据采集工具、文本转换与标准化工具、文本处理分析工具以及文本分析工具等方面进行了介绍。

作为知识图谱构建以及自然语言处理的基本功,利用好开源组件,对提升我们的工作效率有很大的帮助。

Post Directory