ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

python自然语言处理实战学习——2

2021-04-05 15:03:06  阅读:214  来源: 互联网

标签:实战 词性 word python 基于 规则 自然语言 分词 标注


python自然语言处理实战学习笔记2

第三章 中文分词技术

1、在处理中文文本时,需要进行分词处理,将句子转化为此的表达。这个切词处理过程就是中文分词,它通过计算机自动识别出句子的词,在词间加入边界标记符,分割出各个词汇。
中文自动分词被提出以来,主要归纳为“规则分词”,“统计分词”,“混合分词(规则+统计)”这三个主要流派。

2、规则分词——基于规则的分词是一种机械分词方法,主要是通过维护词典,在切分语句时,将语句的每个字符串与词表中的词进行逐一匹配,找到则切分,否则不予切分。

  • 按照匹配切分的方式,主要有正向最大匹配法、逆向最大匹配法以及双向最大匹配法三种方法。

在这里插入图片描述

# -*- coding:utf-8 -*-

class MM(object):
    def __init__(self):
        self.window_size = 3
        
    def cut (self,text):
        result = []
        index = 0
        text_length = len (text)
        dic = ["研究","研究生","生命","命","的","起源"]
        while text_length > index:
            for size in range (self.window_size+index,index,-1):   #4,0,-1
                piece = text[index:size]
                if piece in dic:
                    index = size-1
                    break
            index = index + 1
            result.append(piece+"----")
        print(result)
        
    if __name__ == "__main__":
        text = "研究生命的起源"
        tokenizer = MM()
        print(tokenizer.cut(text))

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
3、统计分词

  1. 建立统计语言模型
  2. 对句子进行单词划分,然后对划分结果进行概率计算,获得概率最大的分词方式。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    5、混合分词

6、中文分词工具——Jieba
Jieba 分词结合了基于规则和基于统计这两类方法。首先基于前缀词典进行词图扫描,前缀词典是指词典中的词按照前缀包含的顺序排列,从而形成一种层级包含结构。如果将词看作节点,词和词之间的分词符看作边,那么一种分词方案则对应这从第一个字到最后一个字的一条分词路径。因此,基于前缀词典可以快速构建包含全部可能分词结果的有向无环图,这个图中包含多条分词路径,邮箱是指全部的路径都始于第一个字、止于最后一个字,无环是指节点之间不构成闭环。基于标注语料,使用动态规划的方法可以找出最大概率路径,并将其作为最终的分词结果。对于未登录词,Jieba使用了基于汉字成语的HMM模型,采用了Viterbi算法进行推导。
在这里插入图片描述
7、实战之高频词提取
高频词一般是指文档中出现频率较高且非无用的词语,其一定程度上代表了文档的焦点所在。针对单篇文档,可以作为一种关键词来看。对于如新闻这样的多篇文档,可以将其作为热词,发现舆论热点。
高频词提取其实就是自然语言处理中的TF(Term Frequency)策略。其主要有以下干扰项:

  • 标点符号:一般标点符号无任何价值,需要去除。
  • 停用词:诸如“的”“是”“了”等常用词无任何意义,也需要剔除。

第四章 词性标注与命名实体识别

1、词性标注

  • 词性是词汇基本的语法属性,通常也称为词类。词性标注是在给定句子中判断每个词的语法范畴,确定其词性并加以标注的过程。
  • 在中文中,一个词的词性很多时候都表示固定的,一般表现为同音同形的词在不同场景下,其表示的语法属性截然不同。
  • 词性标注最简单的方法是从语料库中统计每个词所对应的高频词性,将其作为默认词性,但这样显然还有提升空间。
  • 词性标注需要有一定的标注规范,如将词分为名词、形容词、动词,然后用“n”,“adj”,“v”等来进行表示。中文领域中尚无统一的标注标准,较为主流的主要为北大的词性标注集和宾州词性标注集两大类。

2、jieba分词中的词性标注
jieba的词性标注同样是结合规则和统计的方式,具体为在词性标注的过程中,词典匹配和HMM共同作用。词性标注流程如下:

  1. 首先居于正则表达式进行汉字判断,正则表达式如下:
re_han_internal = re.compile("([\u4E00-\u9FD5a-zA-z0-9+#&\._]+)")
  1. 若符合上面的正则表达式,则判定为汉字,然后基于前缀词典构建有向无环图,再基于有向无环图计算最大概率路径,同时在前缀词典中找出它所分出的词性,若在词典中未找到,则赋予词性为“x”(代表未知)。
  2. 若不符合上面的正则表达式,那么将继续通过正则表达式进行类型判断,分别赋予“x”,“m”(数词),“eng(英文)”。

3、命名实体识别

  • 基于规则的命名实体识别:规则加词典是早期命名实体识别中最行之有效的方式。其依赖手工规则的系统,结合命名实体库,对每条规则进行权重赋值,然后通过实体与规则的相符情况来进行类型判断。当提取的规则能够较好反映语言现象时,该方法能明显优于其他方法。但在大多数场景下,规则往往依赖于具体语言、领域和文本风格,其编制过程耗时且难以涵盖所有的语言现象,存在可移植性差、更新维护困难等问题。
  • 基于统计的命名实体识别:与分词类似,目前主流的基于统计的命名实体识别方法有:隐马尔科夫模型、最大熵模型、条件随机场等。其主要思想是基于人工标注的语料,将命名实体识别任务作为序列标注问题来解决。基于统计的方法对语料库的依赖比较大,而可以用来建设和评估命名实体识别系统的大规模通用语料库又比较少,这是该方法的一大制约。
  • 混合方法:自然语言处理缤纷不完全是一个随机过程,单独使用基于统计的方法使状态搜索空间非常庞大,必须借助规则知识提前进行过滤修剪处理 。目前几乎没有单纯使用统计模型而不使用规则知识的命名实体识别系统,在很多情况下是使用混合方法,结合规则和统计方法。

实战一:日期识别
本节实战的背景如下:现有一个基于语音问答的酒店预订系统,其根据用户的每句语音进行解析,识别出用户的酒店预订需求,如房间型号、入住时间等;用户的语音在发送给后台进行请求时已经转换成中文文本,然而由于语音转换工具的识别问题,许多日期类的数据并不是严格的数字,会出现诸如“六月12”“2016年八月”“20160812”“后天下午”等形式。这里我们的主要目的是识别出每个请求的文本中可能的日期信息,并将其转换成统一的格式进行输出。

import re
from datetime import datetime,timedelta
from dateutil.parser import parse
import jieba.posseg as psg

def time_extract(text):
    time_res = []
    word = ''
    keyDate = {'今天':0,'明天':1,'后天':2}
for k, v in psg.cut(text):
    if k in keyDate:
        if word != '':
            time_res.append(word)
            word = (datetime.today()+ timedelta(days = keyDate.get(k,0))).strftime('%Y年%m月%d日')
    elif word != '':
        if v in ['m','t']:
            word = word + k
        else:
            time_res.append(word)
            word = ''
    elif v in ['m','t']:
        word = k
if word != '':
    time_res.append(word)
result = list(filter(lambda x:x is not None,[check_time_valid(w) for w in time_res]))
final_res = [parse_datetime(w) for w in result]
return [x for x in final_res if x is not None]
  • 首先通过jieba分词将带有时间信息的词进行切分,然后记录连续时间信息的词。这里面就用到jieba词性标注的功能,提取其中“m”(数字)“t”(时间)词性的词。
  • time_extract实现了这样的规则约束:对句子进行解析,提取其中所有能够表示日期时间的词,并进行上下文拼接,如词性标注完后出现“今天/t 住/v 到/v 明天/t 下午/t 3/m 点/m”,那么需要将“今天”和“明天下午3点”提取出来。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    实战二 地名识别
    在日期识别中,我们主要采用了基于规则(正则表达式)的方式。在本节,我们将采用基于条件随机场的方法来完成地名识别任务。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

标签:实战,词性,word,python,基于,规则,自然语言,分词,标注
来源: https://blog.csdn.net/weixin_46853773/article/details/115370272

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有