实现中文分词、词性标注、关键词提取、句法分析等智能预处理
作者:互联网
实现中文分词、词性标注、关键词提取、句法分析等智能预处理的一个简单的小实验作业
一、实验目的
1、理解文本素材预处理的主要任务;
2、掌握文本素材预处理的主要方法;
3、掌握并实现中文分词、词性标注、关键词提取、句法分析等智能预处理。
二、实验环境
操作系统:window10
软件开发环境:anacoda、jupyterLab、python3.7+
环境变量配置等:anacoda全局变量
三、实验内容(内容以txt1分析为例)
1、文本素材自动分词
(1)分词初步处理
(2)jieba精准模式分词
(3)部分结果分析
主要看到对于俄罗斯报以及阿特里奇的人名,jieba的精准模式分词是存在问题的,为解决这一问题进行以下分析。
(4)调整分词结果
不难发现,以上运行结果跟我们的预期与想表达的意思是不一致的。
为了使分词结果与预期一致,我们可以采用如下方法:
(5)添加自定义词典
开发者可以指定自己自定义的词典,以便包含jieba词库里没有的词。虽然jieba有新词识别能力,但是自行添加新词可以保证更高的正确率。
词典格式和dict.txt一样,一个词占一行;每一行分三部分:词语、词频(可省略)、词性(可省略),用空格隔开,顺序不可颠倒。
使用 jieba.load_userdict(file_name) 即可载入词典。
可以看到,虽然文本分词准确率有了提高,但是俄罗斯报以及阿特里奇的人名还是仍有问题。
(6)动态调整词典
使用 add_word(word, freq=None, tag=None) 和 del_word(word) 可在程序中动态修改词典,这是对“添加自定义词典”功能的补充。
从结果上看,将阿特里奇的人名加入自定义的词典,并且这个字典可以动态的加入到其中。
(7)调整词频
使用 suggest_freq(segment, tune=True) 可调节单个词语的词频,使其能(或不能)被分出来,这个功能不是基于词典的。
(8)导出结果
最后将相对准确的结果导出。
2.文本素材自动词性标注
- 通过查询字典的方式获取识别词的词性,通过HMM隐马尔科夫模型来获取未登录词的词性,从而完成整个语句的词性标注。但可以看到查询字典的方式不能解决一词多词性的问题,也就是词性歧义问题。故精度上还是有所欠缺的。
- 标注句子分词后每个词的词性,词性标示兼容ICTCLAS 汉语词性标注集。
- 除了jieba默认分词模式,提供paddle模式下的词性标注功能。
(1)基于jieba词性标注
(2)基于jieba词性标注结果分析
可以看到,jieba词性标注对数字的分组是尤为敏感的,在这里为进一步找到更好的词性标注方法,我们选择了基于hanlp的词性标注。
(3)基于hanlp词性标注结果分析
pyhanlp实现的分词器有很多,同时pyhanlp获取hanlp中分词器也有两种方式
第一种是直接从封装好的hanlp类中获取,这种获取方式一共可以获取五种分词器,而现在默认的就是第一种维特比分词器
- 1.维特比 (viterbi):效率和效果的最佳平衡。也是最短路分词,HanLP最短路求解采用Viterbi算法2.
- 2.双数组trie树 (dat):极速词典分词,千万字符每秒(可能无法获取词性,此处取决于你的词典)
- 3.条件随机场 (crf):分词、词性标注与命名实体识别精度都较高,适合要求较高的NLP任务
- 4.感知机 (perceptron):分词、词性标注与命名实体识别,支持在线学习
- 5.N最短路 (nshort):命名实体识别稍微好一些,牺牲了速度
- 6.第二种方式是使用JClass直接获取java类,然后使用。这种方式除了获取上面的五种分词器以外还可以获得一些其他分词器,如NLP分词器,索引分词,快速词典分词等等
1)NLP分词器
2)维特比分词器
3)条件随机场 (crf)分词
4)结果分析
分析结果可以看到条件随机场 (crf)分词对于四机以及人名有着较为良好的词性标注能力。
3.文本素材关键词提取
- allowPOS 仅包括指定词性的词,TF-IDF 算法默认为空,不筛选,TextRank 算法默认过滤词性。
- "ns", “n”, “vn”, “v”, “nr”,对应 地名、名词、动名词、动词、人名
(1)TF-IDF
期间使用百度的停用词表
(2)TextRank算法
extract_tags() 将频繁词作为关键词;textrank() 是利用局部词汇之间关系对后续关键词进行排序,其模型一般表示为一个有向有权图,计算过程中要迭代,较为耗时。
(3)基于hanlp的TextRank算法
结果:
(4)词云绘制
4.文本自动摘要与依存句法分析
在文本摘要以及依存句法分析中选用的是基于hanlp的自然语言处理。
(1)自动摘要
(2)依存句法分析
结果:
四、结果分析
-
基于不同方法算法以及各自领域功能中性能、精度各有差异
- 中文分词
- HMM-Bigram(速度与精度最佳平衡;一百兆内存)
- 最短路分词、N-最短路分词
- 由字构词(侧重精度,全世界最大语料库,可识别新词;适合NLP任务)
- 感知机分词、CRF分词
- 词典分词(侧重速度,每秒数千万字符;省内存)
- 极速词典分词
- 所有分词器都支持:
- 索引全切分模式
- 用户自定义词典
- 兼容繁体中文
- 训练用户自己的领域模型
- 词性标注
- HMM词性标注(速度快)
- 感知机词性标注、CRF词性标注(精度高)
- 命名实体识别
- 基于HMM角色标注的命名实体识别 (速度快)
- 中国人名识别、音译人名识别、日本人名识别、地名识别、实体机构名识别
- 基于线性模型的命名实体识别(精度高)
- 感知机命名实体识别、CRF命名实体识别
- 关键词提取
- TextRank关键词提取
- 自动摘要
- TextRank自动摘要
- 短语提取
- 基于互信息和左右信息熵的短语提取
2.对于部分文本的分词、标注等出现格式的错误分析
(1)由于格式符号问题代码报错
在进行实验操作:7.txt中,我的代码出现了报错如图所示:
为分析其原因,我进行了回溯,发现jupyter针对文本内容识别报错。对此,有以下几个原因:
- 文本格式、编码不识别,我用的是pandas自带的读取read_csv方法,对于此可能是由于UTF-8、或者csv不识别,简单的转换代码编码后,错误仍然出现,问题排除。
- 代码版本兼容问题,由于其他文本均不会出现报错,将此问题排除。
- 文本部分符号与代码的识别上出现问题。看报错的回溯信息,在文本的第25行,发现,空格以及双引号的问题,简单的对符号进行修改,发现问题解决,代码得以成功跑通,简单分析的是由于文本预处理相关出了问题。由此,可以分析得到,在自然语言处理前,数据信息的采集过程后对于文本的筛选处理格式是非常重要的。
第25行:
(2)分词以及词性标注后,出现空格太多的问题。
如图是科大讯飞语言处理结果,其对于多余的空格以及由于符号的分词效果相当良好,而我们出来的结果相差一些,尤其是词性标注。
txt导读中间的空格会直接被我们的算法识别成两个词,而其他平台中却没有出现这个问题。
3.改进方案思考
- 文本预处理很最重要,针对我们的算法,我们需要文本的格式可以被算法识别,且保证不会因为格式等原因影响分词、标注、关键词提取的精度。
- 算法的挑选很重要、不同的算法基于不同的功能方向(例如分词、标注、关键词提取等),针对数据量以及时间性能等对算法的选择进行考量。
实验数据、代码会在后续上传,
本文仅供交流,转载请标明来处,谢谢
标签:词性,文本,句法分析,词典,识别,分词,标注 来源: https://blog.csdn.net/weixin_45284767/article/details/122736502