[Python知识图谱] 一.哈工大pyltp安装及中文分句、中文分词、导入

系统 453 0

本系列文章主要结合Python语言实现知识图谱构建相关工程,具有一定创新性和实用性,非常希望各位博友交流讨论,相互促进成长。第一篇文章主要介绍哈工大pyltp工具,包括安装过程、中文分词、词性标注和实体识别等。

知识图谱系列文章:
[知识图谱实战篇] 一.数据抓取之Python3抓取JSON格式的电影实体
[知识图谱实战篇] 二.Json+Seaborn可视化展示电影实体
[知识图谱实战篇] 三.Python提取JSON数据、HTML+D3构建基本可视化布局
[知识图谱实战篇] 四.HTML+D3+CSS绘制关系图谱
[知识图谱实战篇] 五.HTML+D3添加鼠标响应事件显示相关节点及边
[知识图谱实战篇] 六.HTML+D3实现点击节点显示相关属性及属性值
[知识图谱实战篇] 七.HTML+D3实现关系图谱搜索功能
[知识图谱实战篇] 八.HTML+D3绘制时间轴线及显示实体

环境下载地址:https://download.csdn.net/download/eastmount/11226539


一.哈工大LTP

LTP(Language Technology Platform)中文为语言技术平台,是哈工大社会计算与信息检索研究中心开发的一整套中文语言处理系统。LTP制定了基于XML的语言处理结果表示,并在此基础上提供了一整套自底向上的丰富而且高效的中文语言处理模块(包括词法、句法、语义等6项中文处理核心技术),以及基于动态链接库(Dynamic Link Library,DLL)的应用程序接口,可视化工具,并且能够以网络服务的形式进行使用。

LTP开发文档:https://ltp.readthedocs.io/zh_CN/latest/index.html
语言云LTP-Cloud:http://www.ltp-cloud.com/
模型下载地址:http://ltp.ai/download.html

在线演示案例如下图所示:

[Python知识图谱] 一.哈工大pyltp安装及中文分句、中文分词、导入词典基本用法_第1张图片
[Python知识图谱] 一.哈工大pyltp安装及中文分句、中文分词、导入词典基本用法_第2张图片

相信从事NLP、数据挖掘、知识图谱等领域的博友都知道哈工大LTP、同义词词林这些工具,该系列文章也会介绍相关的知识,希望对您有所帮助。

下面补充另一个在线NLP分析系统:http://ictclas.nlpir.org/nlpir/

[Python知识图谱] 一.哈工大pyltp安装及中文分句、中文分词、导入词典基本用法_第3张图片
[Python知识图谱] 一.哈工大pyltp安装及中文分句、中文分词、导入词典基本用法_第4张图片
[Python知识图谱] 一.哈工大pyltp安装及中文分句、中文分词、导入词典基本用法_第5张图片

二.pyltp终极安装

下面介绍Windows10 Python环境下LTP的扩展包pyltp安装过程。

1.常见错误
大家通常会调用 “pip install pyltp” 安装该扩展包,但会遇到各种错误,下面介绍一种可行的方法。

2.安装pyltp包
首先,安装Python3.6环境,如下图所示“python-3.6.7-amd64.exe”。

[Python知识图谱] 一.哈工大pyltp安装及中文分句、中文分词、导入词典基本用法_第6张图片

接着,下载pyltp扩展包的whl文件至本地,调用CMD环境进行安装,注意需要将所在文件的路径写清楚。
C:\Users\yxz\AppData\Local\Programs\Python\Python36\Scripts

            
              pyltp
              
                -
              
              
                0.2
              
              
                .1
              
              
                -
              
              cp35
              
                -
              
              cp35m
              
                -
              
              win_amd64
              
                .
              
              whl (对应Python3
              
                .
              
              
                5
              
              版本)
pyltp
              
                -
              
              
                0.2
              
              
                .1
              
              
                -
              
              cp36
              
                -
              
              cp36m
              
                -
              
              win_amd64
              
                .
              
              whl (对应Python3
              
                .
              
              
                6
              
              版本)
pip install C
              
                :
              
              \Python36\Scripts\pyltp
              
                -
              
              
                0.2
              
              
                .1
              
              
                -
              
              cp36
              
                -
              
              cp36m
              
                -
              
              win_amd64
              
                .
              
              whl

            
          

whl下载地址:https://download.csdn.net/download/qq_22521211/10460778

安装过程下图所示,此时表示pyltp安装成功。

[Python知识图谱] 一.哈工大pyltp安装及中文分句、中文分词、导入词典基本用法_第7张图片

注意,如果报错“error:Microsoft Visual C++ 9.0 is required”,则安装下面exe文件。

[Python知识图谱] 一.哈工大pyltp安装及中文分句、中文分词、导入词典基本用法_第8张图片

3.下载模型文件
最后需要下载模型文件,其下载地址为:
百度云
七牛云

本文下载3.4版本的模型,下载解压如下图所示:

[Python知识图谱] 一.哈工大pyltp安装及中文分句、中文分词、导入词典基本用法_第9张图片

模型对应的说明如下图所示:

[Python知识图谱] 一.哈工大pyltp安装及中文分句、中文分词、导入词典基本用法_第10张图片

在编写代码时,需要导入指定文件夹中的模型,再进行中文分词、词性标注、命名实体识别、依存句法分析、语义角色标注等分析。例如:

            
              
                #词性标注
              
              
pdir
              
                =
              
              
                'AgriKG\\ltp\\pos.model'
              
              
pos 
              
                =
              
               Postagger
              
                (
              
              
                )
              
              
pos
              
                .
              
              load
              
                (
              
              pdir
              
                )
              
              
postags 
              
                =
              
               pos
              
                .
              
              postag
              
                (
              
              word
              
                )
              
              
                #基于分词得到的list将下词性标注
              
              
postags 
              
                =
              
              
                list
              
              
                (
              
              postags
              
                )
              
              
                print
              
              
                (
              
              u
              
                "词性:"
              
              
                ,
              
               postags
              
                )
              
            
          

分词、词性标注、句法分析一系列任务之间存在依赖关系。举例来讲,对于词性标注,必须在分词结果之上进行才有意义。LTP中提供的5种分析之间的依赖关系如下所示:

[Python知识图谱] 一.哈工大pyltp安装及中文分句、中文分词、导入词典基本用法_第11张图片

讲到这里,哈工大pyltp基本安装成功,接下来将介绍它的基本用法。
基础性文章,希望对入门者有所帮助。


三.中文分句和分词

官方文档:https://pyltp.readthedocs.io/zh_CN/latest/api.html#id13
实现原理:https://ltp.readthedocs.io/zh_CN/latest/theory.html#customized-cws-reference-label

1.中文分句

            
              
                # -*- coding: utf-8 -*-
              
              
                from
              
               pyltp  
              
                import
              
               SentenceSplitter

              
                from
              
               pyltp 
              
                import
              
               Segmentor

              
                from
              
               pyltp 
              
                import
              
               Postagger

              
                from
              
               pyltp 
              
                import
              
               NamedEntityRecognizer


              
                #分句
              
              
text 
              
                =
              
              
                "贵州财经大学要举办大数据比赛吗?那让欧几里得去问问看吧!其实是在贵阳花溪区吧。"
              
              
sents 
              
                =
              
               SentenceSplitter
              
                .
              
              split
              
                (
              
              text
              
                )
              
              
                print
              
              
                (
              
              
                '\n'
              
              
                .
              
              join
              
                (
              
              sents
              
                )
              
              
                )
              
            
          

中文分句的输出结果如下所示:

            
              贵州财经大学要举办大数据比赛吗?
那让欧几里得去问问看吧!
其实是在贵阳花溪区吧。

            
          

2.中文分词

            
              
                # -*- coding: utf-8 -*-
              
              
                from
              
               pyltp  
              
                import
              
               SentenceSplitter

              
                from
              
               pyltp 
              
                import
              
               Segmentor

              
                from
              
               pyltp 
              
                import
              
               Postagger

              
                from
              
               pyltp 
              
                import
              
               NamedEntityRecognizer

text 
              
                =
              
              
                "贵州财经大学要举办大数据比赛吗?那让欧几里得去问问看吧!其实是在贵阳花溪区吧。"
              
              
                #中文分词
              
              
segmentor 
              
                =
              
               Segmentor
              
                (
              
              
                )
              
              
                #初始化实例
              
              
segmentor
              
                .
              
              load
              
                (
              
              
                "AgriKG\\ltp\\cws.model"
              
              
                )
              
              
                #加载模型
              
              
words 
              
                =
              
               segmentor
              
                .
              
              segment
              
                (
              
              text
              
                )
              
              
                #分词
              
              
                print
              
              
                (
              
              
                type
              
              
                (
              
              words
              
                )
              
              
                )
              
              
                print
              
              
                (
              
              
                ' '
              
              
                .
              
              join
              
                (
              
              words
              
                )
              
              
                )
              
              
segmentor
              
                .
              
              release
              
                (
              
              
                )
              
              
                #释放模型
              
            
          

输出结果如下所示(人工换行):

            
              
                <
              
              
                class
              
              
                'pyltp.VectorOfString'
              
              
                >
              
              
贵州 财经 大学 要 举办 大 数据 比赛 吗 ? 
那 让 欧 几 里 得 去 问问 看 吧 ! 
其实 是 在 贵阳 花溪区 吧 。

            
          

此时的分词效果并不理想,如 “大数据” 分为了“大”、“数据”,“欧几里得”分为了“欧”、“几”、“里”、“得”,“贵阳花溪区”分为了“贵阳”、“花溪区”等,故需要引入词典进行更为准确的分词。同时,返回值类型是native的VectorOfString类型,可以使用list转换成Python的列表类型。

3.导入词典中文分词

pyltp 分词支持用户使用自定义词典。分词外部词典本身是一个文本文件(plain text),每行指定一个词,编码同样须为 UTF-8,比如“word”文件,如下图所示:

[Python知识图谱] 一.哈工大pyltp安装及中文分句、中文分词、导入词典基本用法_第12张图片

完整代码如下所示:

            
              
                # -*- coding: utf-8 -*-
              
              
                from
              
               pyltp  
              
                import
              
               SentenceSplitter

              
                from
              
               pyltp 
              
                import
              
               Segmentor

              
                from
              
               pyltp 
              
                import
              
               Postagger

              
                from
              
               pyltp 
              
                import
              
               NamedEntityRecognizer

ldir
              
                =
              
              
                'AgriKG\\ltp\\cws.model'
              
              
                #分词模型
              
              
dicdir
              
                =
              
              
                'word'
              
              
                #外部字典
              
              
text 
              
                =
              
              
                "贵州财经大学要举办大数据比赛吗?那让欧几里得去问问看吧!其实是在贵阳花溪区吧。"
              
              
                #中文分词
              
              
segmentor 
              
                =
              
               Segmentor
              
                (
              
              
                )
              
              
                #初始化实例
              
              
segmentor
              
                .
              
              load_with_lexicon
              
                (
              
              ldir
              
                ,
              
              
                'word'
              
              
                )
              
              
                #加载模型
              
              
words 
              
                =
              
               segmentor
              
                .
              
              segment
              
                (
              
              text
              
                )
              
              
                #分词
              
              
                print
              
              
                (
              
              
                ' '
              
              
                .
              
              join
              
                (
              
              words
              
                )
              
              
                )
              
              
                #分词拼接
              
              
words 
              
                =
              
              
                list
              
              
                (
              
              words
              
                )
              
              
                #转换list
              
              
                print
              
              
                (
              
              u
              
                "分词:"
              
              
                ,
              
               words
              
                )
              
              
segmentor
              
                .
              
              release
              
                (
              
              
                )
              
              
                #释放模型
              
            
          

输出结果如下所示,它将“大数据”、“欧几里得”、“贵阳花溪区”进行了词典匹配,再进行相关分词,但是“贵州财经大学”仍然划分为“贵州”、“财经”、“大学”。 Why?

            
              贵州 财经 大学 要 举办 大数据 比赛 吗 ? 
那 让 欧几里得 去 问问 看 吧 ! 
其实 是 在 贵阳花溪区 吧 。
分词
              
                :
              
              
                [
              
              
                '贵州'
              
              
                ,
              
              
                '财经'
              
              
                ,
              
              
                '大学'
              
              
                ,
              
              
                '要'
              
              
                ,
              
              
                '举办'
              
              
                ,
              
              
                '大数据'
              
              
                ,
              
              
                '比赛'
              
              
                ,
              
              
                '吗'
              
              
                ,
              
              
                '?'
              
              
                ,
              
              
                '那'
              
              
                ,
              
              
                '让'
              
              
                ,
              
              
                '欧几里得'
              
              
                ,
              
              
                '去'
              
              
                ,
              
              
                '问问'
              
              
                ,
              
              
                '看'
              
              
                ,
              
              
                '吧'
              
              
                ,
              
              
                '!'
              
              
                ,
              
              
                '其实'
              
              
                ,
              
              
                '是'
              
              
                ,
              
              
                '在'
              
              
                ,
              
              
                '贵阳花溪区'
              
              
                ,
              
              
                '吧'
              
              
                ,
              
              
                '。'
              
              
                ]
              
            
          

4.个性化分词

个性化分词是 LTP 的特色功能。个性化分词为了解决测试数据切换到如小说、财经等不同于新闻领域的领域。 在切换到新领域时,用户只需要标注少量数据。 个性化分词会在原有新闻数据基础之上进行增量训练。 从而达到即利用新闻领域的丰富数据,又兼顾目标领域特殊性的目的。

pyltp 支持使用用户训练好的个性化模型。关于个性化模型的训练需使用 LTP,详细介绍和训练方法请参考 个性化分词 。在 pyltp 中使用个性化分词模型的示例如下:

            
              
                # -*- coding: utf-8 -*-
              
              
                from
              
               pyltp 
              
                import
              
               CustomizedSegmentor
customized_segmentor 
              
                =
              
               CustomizedSegmentor
              
                (
              
              
                )
              
              
                #初始化实例
              
              
customized_segmentor
              
                .
              
              load
              
                (
              
              
                '基本模型'
              
              
                ,
              
              
                '个性模型'
              
              
                )
              
              
                #加载模型
              
              
words 
              
                =
              
               customized_segmentor
              
                .
              
              segment
              
                (
              
              
                '亚硝酸盐是一种化学物质'
              
              
                )
              
              
                print
              
              
                '\t'
              
              
                .
              
              join
              
                (
              
              words
              
                )
              
              
customized_segmentor
              
                .
              
              release
              
                (
              
              
                )
              
            
          

你好!六月。
这些年通过CSDN认识了很多志同道合的朋友,也有很多编程领域的大佬,每天都感觉自己差距还很大,优秀的很多。很高兴认识这些素未谋面的新朋友。靡不有初,鲜克有终,一起加油。coding~

(By:Eastmount 2019-06-05 深夜1点写于金阳 https://blog.csdn.net/Eastmount )


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

发表我的评论
最新评论 总共0条评论