汉语分词中的基本问题:分词规范,歧义的切分和未登录词的识别

分词规范:(一般也就是指“词”的概念的纠缠不清的问题,),一方面来源于 单字词和词素之间的划界,另一方面就是词和短语(词组)的划界问题

歧义切分问题

  交集型切分歧义:汉字串AJB  其中 AJ,JB同时为词,此时的J 称作交集串

        例如:结合成,   “结合”, “合成”分别为词,此时的“合”则为交集串

  链长的概念:一个交集型切分歧义所拥有的交集串的集合成为交集串链,他的个数成为链长

  组合型切分歧义:汉字串AB同时满足,A,B,AB同时为词,

        例如:“起身”分别有两种不同的切分,a: 他站|起|身|来,b:他明|天|起身|去北京

  多义组合型切分歧义:汉字串AB,满足:1:A,B,AB同时为词,2:问题中至少存在一个上下文语境C,在语境c的约束下A,B在语法和语义上都成立

未登录词

  为登陆词又称为生词,一个是指已有的词表中没有收录的词,二是指已有的训练语料中未曾出现的词

  一般分为几类:(1)、新出现的普通词汇,(2)、专有名词,(3)、专业名词和研究领域名称,(4)、其他专用名词

jieba(“结巴”)的简单运用

jieba分词简介:

  jieba分词算法使用了基于前缀词典实现高效的词图扫描,生成句子中汉字所有可能生成词情况所构成的有向无环图(DAG), 再采用了动态规划查找最大概率路径,找出基于词频的最大切分组合,对于未登录词,采用了基于汉字成词能力的HMM模型,使用了Viterbi算法

结巴分词的三种模式:
        精准模式:试图将句子最精确地切开,适合文本分析
        全模式:吧句子中所有的可以成词的词语都扫描出来,但不能解决歧义
        搜索引擎模式:在精准模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词

   jieba的主要功能:

    1、jieba.cut(sentence, cut_all=False, HMM=True)    sentence是要分词的语句,cut_all是是否采用全模式,false为精准模式,HMM是控制是否适用HMM模型

    2、jieba.cut_for_search(sentence, HMM=True)   参数就不细说,该方法适用于搜索引擎模式,分词力度比较细

    3、jieba.lcut()

    4、jieba.lcut_for_search()

    5、

    备注:cut,cut_for_search返回的是一个生成器对象可以用for循环遍历,lcut, lcut_for_search返回的列表可以直接输出使用

import jieba

a = jieba.cut('中华人民共和国成立了', cut_all=False, HMM=True)
print('/'.join(a))
b = jieba.cut_for_search('中华人民共和国成立了')
print('/'.join(b))
c = jieba.lcut('中华人民共和国成立了', cut_all=False, HMM=True)
print(c)
d = jieba.lcut_for_search('中华人民共和国成立了')
print(d)

Loading model cost 0.975 seconds.
a: 中华人民共和国/成立/了
b: 中华/华人/人民/共和/共和国/中华人民共和国/成立/了
Prefix dict has been built successfully.
c: ['中华人民共和国', '成立', '了']
d: ['中华', '华人', '人民', '共和', '共和国', '中华人民共和国', '成立', '了']

Process finished with exit code 0

利用jieba进行关键词提取:

  e = jieba.analyse.extract_tags(sentence, topK=20, withWeight=False, allowPOS=(), withFlag=False)

      sentence: 语句,topk: 返回权重最大的前20个词(默认就是20),withWeight:True返回关键词的权重值,withflag:仅包含指定词性的词 

import jieba
import jieba.analyse
import codecs

file = codecs.open('D:\\PycharmProjects\\jieba\\data\\北京五环双新工业有限公司与北京中赛国信科技发展有限责任公司合..._UTF-8.txt', encoding='utf-8')
word = file.read()
e = jieba.analyse.extract_tags(word, topK=20, withWeight=False, allowPOS=(), withFlag=False)
print(e)

e: [('中赛', 0.46317736484181693), ('五环', 0.44161073871943884), ('双新', 0.4152624650305945), ('国信', 0.3012275175559853), ('500', 0.12777306616325984), ('原审', 0.11621335229458918), ('发票', 0.09795034552924514), ('合同', 0.0951704406034068), ('事实', 0.07558163070853709), ('万元', 0.06746161603875751), ('判决', 0.06737630140485637), ('损失', 0.06716787270968604), ('另案', 0.0649998287000668), ('项目', 0.06197313122931195), ('条码', 0.05947902485014028), ('付款', 0.05895460144782899), ('青苗', 0.05576455176593186), ('二维', 0.055311807331743484), ('解除', 0.0535768954555177), ('借条', 0.052659547265731466)]

  备注:文本格式必须为utf-8 windows下中文为gbk 需要进行处理(我的问题是一个法院的判决书)

  下面用textrank进行关键词提取

 

 

import jieba
import jieba.analyse
import codecs
file = codecs.open('D:\\PycharmProjects\\jieba\\data\\北京五环双新工业有限公司与北京中赛国信科技发展有限责任公司合..._UTF-8.txt', encoding='utf-8')
word = file.read()
e = jieba.analyse.extract_tags(word, topK=5,  withWeight=True)
file.close()
print(e)
file = codecs.open('D:\\PycharmProjects\\jieba\\data\\北京五环双新工业有限公司与北京中赛国信科技发展有限责任公司合..._UTF-8.txt', encoding='utf-8')
word = file.read()
f = jieba.analyse.textrank(word, topK=5, withWeight=True)
print(f)
file.close()

e: [('中赛', 0.46317736484181693), ('五环', 0.44161073871943884), ('双新', 0.4152624650305945), ('国信', 0.3012275175559853), ('500', 0.12777306616325984)]
f: [('中赛', 1.0), ('项目', 0.4889681449083135), ('损失', 0.3692275287965435), ('事实', 0.350037544658924), ('判决', 0.3236495086380529)]

 

  e,f分别为两种关键词提取方法的权重对比

jieba分词的词性标注

import jieba.posseg as pseg

word = pseg.cut('中华人民共和国成立了', HMM=False)
for k, w in word:
    print(k, w)

中华人民共和国 ns
成立 v
了 ul