精华内容
下载资源
问答
  • jieba分词器字典

    2018-07-13 16:53:16
    jieba分词器所用的字典,包含词频以及词性,可自行调整频次等属性。(仅做学习交流用,禁止商用)
  • Python3中的 jieba分词

    千次阅读 2018-08-02 11:36:46
    ... 中文分词 ...对于NLP(自然语言处理)来说,分词是一步重要的工作,市面上也有各种分词库,11款开放中文分词系统比较。 1.基于词典:基于字典、词库匹配的分词方法;(字符串匹配、机械分词法) 2...

     jiebaGitHub地址:https://github.com/fxsjy/jieba

    参考地址:https://www.cnblogs.com/jiayongji/p/7119065.html

    中文分词

    对于NLP(自然语言处理)来说,分词是一步重要的工作,市面上也有各种分词库,11款开放中文分词系统比较

    1.基于词典:基于字典、词库匹配的分词方法;(字符串匹配、机械分词法)
    2.基于统计:基于词频度统计的分词方法;
    3.基于规则:基于知识理解的分词方法。

    • 第一类方法应用词典匹配、汉语词法或其它汉语语言知识进行分词,如:最大匹配法、最小分词方法等。这类方法简单、分词效率较高,但汉语语言现象复杂丰富,词典的完备性、规则的一致性等问题使其难以适应开放的大规模文本的分词处理。
    • 第二类基于统计的分词方法则基于字和词的统计信息,如把相邻字间的信息、词频及相应的共现信息等应用于分词,由于这些信息是通过调查真实语料而取得的,因而基于统计的分词方法具有较好的实用性。

    jieba分词,完全开源,有集成的python库,简单易用。
    jieba分词是基于前缀词典实现高效的词图扫描,生成句子中汉字所有可能成词情况所构成的有向无环图 (DAG),动态规划查找最大概率路径, 找出基于词频的最大切分组合

    安装jieba

    在安装有python3 和 pip 的机子上,安装jieba库很简单,使用pip即可:

    pip install jieba

     

    jieba分词特性

    1. 支持三种分词模式:

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

    3. 支持自定义词典
    4. MIT 授权协议

    主要功能


    分词


    • jieba.cut : 方法接受三个输入参数: 需要分词的字符串;cut_all 参数用来控制是否采用全模式;HMM 参数用来控制是否使用 HMM 模型
    • jieba.cut_for_search : 方法接受两个参数:需要分词的字符串;是否使用 HMM 模型。该方法适合用于搜索引擎构建倒排索引的分词,粒度比较细
    • 待分词的字符串可以是 unicode 或 UTF-8 字符串、GBK 字符串。注意:不建议直接输入 GBK 字符串,可能无法预料地错误解码成 UTF-8
    • jieba.cut 以及 jieba.cut_for_search 返回的结构都是一个可迭代的 generator,可以使用 for 循环来获得分词后得到的每一个词语(unicode),或者用jieba.lcut 以及jieba.lcut_for_search 直接返回 list
    • jieba.Tokenizer(dictionary=DEFAULT_DICT) : 新建自定义分词器,可用于同时使用不同词典。jieba.dt 为默认分词器,所有全局分词相关函数都是该分词器的映射。
    # 官方例程
    
    # encoding=utf-8
    import jieba
    
    seg_list = jieba.cut("我来到北京清华大学", cut_all=True)
    print("Full Mode: " + "/ ".join(seg_list))  # 全模式
    
    seg_list = jieba.cut("我来到北京清华大学", cut_all=False)
    print("Default Mode: " + "/ ".join(seg_list))  # 精确模式
    
    seg_list = jieba.cut("他来到了网易杭研大厦")  # 默认是精确模式
    print(", ".join(seg_list))
    
    seg_list = jieba.cut_for_search("小明硕士毕业于中国科学院计算所,后在日本京都大学深造")  # 搜索引擎模式
    print(", ".join(seg_list))

     

     

    【全模式】: 我/ 来到/ 北京/ 清华/ 清华大学/ 华大/ 大学
    【精确模式】: 我/ 来到/ 北京/ 清华大学
    【新词识别】:他, 来到, 了, 网易, 杭研, 大厦 (此处,“杭研”并没有在词典中,但是也被Viterbi算法识别出来了)
    【搜索引擎模式】: 小明, 硕士, 毕业, 于, 中国, 科学, 学院, 科学院, 中国科学院, 计算, 计算所, 后, 在, 日本, 京都, 大学, 日本京都大学, 深造


    关键词提取


    基于 TF-IDF(term frequency–inverse document frequency) 算法的关键词抽取

    import jieba.analyse

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

    • sentence :为待提取的文本
    • topK: 为返回几个 TF/IDF 权重最大的关键词,默认值为 20
    • withWeight : 为是否一并返回关键词权重值,默认值为 False
    • allowPOS : 仅包括指定词性的词,默认值为空,即不筛选
    # 基于TF-IDF算法的关键词抽取
    
    import jieba
    import jieba.analyse
    
    sentence = '全国港澳研究会会长徐泽在会上发言指出,学习系列重要讲话要深刻领会 主席关于香港回归后的宪制基础和宪制秩序的论述,这是过去20年特别是中共十八大以来"一国两制"在香港实践取得成功的根本经验。首先,要在夯实 香港的宪制基础、巩固香港的宪制秩序上着力。只有牢牢确立起"一国两制"的宪制秩序,才能保证"一国两制"实践不走样 、不变形。其次,要在完善基本法实施的制度和机制上用功。中央直接行使的权力和特区高度自治权的结合是特区宪制秩 序不可或缺的两个方面,同时必须切实建立以行政长官为核心的行政主导体制。第三,要切实加强香港社会特别是针对公 职人员和青少年的宪法、基本法宣传,牢固树立"一国"意识,坚守"一国"原则。第四,要努力在全社会形成聚焦发展、抵 制泛政治化的氛围和势能,全面准确理解和落实基本法有关经济事务的规定,使香港继续在国家发展中发挥独特作用并由 此让最广大民众获得更实在的利益。'
    
    keywords = jieba.analyse.extract_tags(sentence, topK=20, withWeight=True, allowPOS=('n','nr','ns'))
    
    # print(type(keywords))
    # <class 'list'>
    
    for item in keywords:
        print(item[0],item[1])

    运行结果:

    基于 TextRank 算法的关键词抽取

    • jieba.analyse.textrank(sentence, topK=20, withWeight=False, allowPOS=(‘ns’, ‘n’, ‘vn’, ‘v’)) 直接使用,接口相同,注意默认过滤词性。
    • jieba.analyse.TextRank() 新建自定义 TextRank 实例

    基本思想:

    • 将待抽取关键词的文本进行分词
    • 以固定窗口大小(默认为5,通过span属性调整),词之间的共现关系,构建图
    • 计算图中节点的PageRank,注意是无向带权图
    # 基于TextRank算法的关键词抽取
    
    keywords = jieba.analyse.extract_tags(sentence, topK=20, withWeight=True, allowPOS=('n','nr','ns'))
    
    # type(keywords)
    # <class 'list'>
    
    for item in keywords:
        print(item[0],item[1])

     

     

    运行结果:


    词性标注


    • jieba.posseg.POSTokenizer(tokenizer=None) 新建自定义分词器,tokenizer 参数可指定内部使用的 jieba.Tokenizer 分词器。jieba.posseg.dt 为默认词性标注分词器。
    • 标注句子分词后每个词的词性,采用和 ictclas 兼容的标记法。
    # 官方例程
    import jieba.posseg as pseg
    
    words = pseg.cut("我爱北京天安门")
    # words类别为:generator
    
    for word, flag in words:
        print('%s %s' % (word, flag))

     

    运行结果:

    我 r
    爱 v
    北京 ns
    天安门 ns

    词性对照表

    1. 名词 (1个一类,7个二类,5个三类)
      名词分为以下子类:
      n 名词
      nr 人名
      nr1 汉语姓氏
      nr2 汉语名字
      nrj 日语人名
      nrf 音译人名
      ns 地名
      nsf 音译地名
      nt 机构团体名
      nz 其它专名
      nl 名词性惯用语
      ng 名词性语素
    2. 时间词(1个一类,1个二类)
      t 时间词
      tg 时间词性语素
    3. 处所词(1个一类)
      s 处所词
    4. 方位词(1个一类)
      f 方位词
    5. 动词(1个一类,9个二类)
      v 动词
      vd 副动词
      vn 名动词
      vshi 动词“是”
      vyou 动词“有”
      vf 趋向动词
      vx 形式动词
      vi 不及物动词(内动词)
      vl 动词性惯用语
      vg 动词性语素
    6. 形容词(1个一类,4个二类)
      a 形容词
      ad 副形词
      an 名形词
      ag 形容词性语素
      al 形容词性惯用语
    7. 区别词(1个一类,2个二类)
      b 区别词
      bl 区别词性惯用语
    8. 状态词(1个一类)
      z 状态词
    9. 代词(1个一类,4个二类,6个三类)
      r 代词
      rr 人称代词
      rz 指示代词
      rzt 时间指示代词
      rzs 处所指示代词
      rzv 谓词性指示代词
      ry 疑问代词
      ryt 时间疑问代词
      rys 处所疑问代词
      ryv 谓词性疑问代词
      rg 代词性语素
    10. 数词(1个一类,1个二类)
      m 数词
      mq 数量词
    11. 量词(1个一类,2个二类)
      q 量词
      qv 动量词
      qt 时量词
    12. 副词(1个一类)
      d 副词
    13. 介词(1个一类,2个二类)
      p 介词
      pba 介词“把”
      pbei 介词“被”
    14. 连词(1个一类,1个二类)
      c 连词
      cc 并列连词
    15. 助词(1个一类,15个二类)
      u 助词
      uzhe 着
      ule 了 喽
      uguo 过
      ude1 的 底
      ude2 地
      ude3 得
      usuo 所
      udeng 等 等等 云云
      uyy 一样 一般 似的 般
      udh 的话
      uls 来讲 来说 而言 说来
      uzhi 之
      ulian 连 (“连小学生都会”)
    16. 叹词(1个一类)
      e 叹词
    17. 语气词(1个一类)
      y 语气词(delete yg)
    18. 拟声词(1个一类)
      o 拟声词
    19. 前缀(1个一类)
      h 前缀
    20. 后缀(1个一类)
      k 后缀
    21. 字符串(1个一类,2个二类)
      x 字符串
      xx 非语素字
      xu 网址URL
    22. 标点符号(1个一类,16个二类)
      w 标点符号
      wkz 左括号,全角:( 〔 [ { 《 【 〖 〈 半角:( [ { <
      wky 右括号,全角:) 〕 ] } 》 】 〗 〉 半角: ) ] { >
      wyz 左引号,全角:“ ‘ 『
      wyy 右引号,全角:” ’ 』
      wj 句号,全角:。
      ww 问号,全角:? 半角:?
      wt 叹号,全角:! 半角:!
      wd 逗号,全角:, 半角:,
      wf 分号,全角:; 半角: ;
      wn 顿号,全角:、
      wm 冒号,全角:: 半角: :
      ws 省略号,全角:…… …
      wp 破折号,全角:—— -- ——- 半角:— —-
      wb 百分号千分号,全角:% ‰ 半角:%
      wh 单位符号,全角:¥ $ £ ° ℃ 半角:$
    展开全文
  • jieba中文分词

    2019-04-16 22:22:09
    https://blog.csdn.net/qq_34337272/article/details/79554772
    展开全文
  • 《【手把手带你Godot游戏开发 第二弹】名场面临摹 之 街霸3D》中使用的模型 教程地址:https://orzgame.blog.csdn.net/article/details/109402316
  • jieba分词特点支持四种分词模式:精确模式试图将句子最精确地切开,适合文本分析;全模式把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义;搜索引擎模式在精确模式的基础...

    jieba分词特点

    支持四种分词模式:

    • 精确模式
      试图将句子最精确地切开,适合文本分析;

    • 全模式
      把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义;

    • 搜索引擎模式
      在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。

    • paddle模式
      利用PaddlePaddle深度学习框架,训练序列标注(双向GRU)网络模型实现分词。同时支持词性标注。
      paddle模式使用需安装paddlepaddle-tiny.

    jieba分词安装

    全自动安装:

    pip install jieba (window环境)
    pip3 install jieba (Linux环境)

    半自动安装:

    先下载 http://pypi.python.org/pypi/jieba/
    解压后运行 python setup.py install

    手动安装:

    将 jieba 目录放置于当前目录或者 site-packages 目录

    通过 import jieba 来引用

    如果需要使用paddle模式下的分词和词性标注功能,请先安装paddlepaddle-tiny,pip install paddlepaddle-tiny==1.6.1

    主要功能

    分词

    1、基本步骤

    初始化

    初始化时,先加载词典文件dict.txt,遍历每一行,生成词语-词数的键值对和总词数,并将生成结果保存到cache中,下次直接从cache中读取即可。

    初始化可以简单理解为,读取词典文件,构建词语-词数键值对,方便后面步骤中查词典,也就是字符串匹配。

    切分短语
    1. 首先进行将语句转换为UTF-8或者GBK。

    2. 然后根据用户指定的模式,是否全模式,是否采用HMM隐马尔科夫,来设置cut方式。

    3. 然后根据正则,将输入文本分为一个个语句。

    4. 最后遍历语句,对每个语句单独进行分词。

    构建DAG

    看构建DAG的过程。

    先遍历一个个切分好的短语,对这些短语来进行分词。

    首先要构建短语的有向无环图DAG。查词典进行字符串匹配的过程中,可能会出现好几种可能的切分方式,将这些组合构成有向无环图,如下图所示:

    得到语句的有向无环图DAG,DAG中记录了某个词的开始位置和它可能的结束位置。开始位置作为key,结束位置是一个list。

    上面语句的完整DAG为:

    {  0: [1, 2],    1: [2],    2: [3, 4, 5],    3: [4],    4: [5] }

    比如位置0的DAG表达为 {0: [1, 2]}, 也就是说0位置为词的开始位置时,1, 2位置都有可能是词的结束位置。

    动态规划构建Route,计算从语句末尾到语句起始,DAG中每个节点到语句结束位置的最大路径概率,以及概率最大时节点对应词语的结束位置。

    def calc(self, sentence, DAG, route):
        N = len(sentence)
        route[N] = (0, 0)
        logtotal = log(self.total)
        for idx in xrange(N - 1, -1, -1):
    # route[idx] = (该汉字到最后一个汉字的最大路径概率, 
      # 最大路径概率时该汉字对应的词语结束位置).
    # 遍历DAG中该汉字节点的结束位置,也就是DAG[idx],
      # 计算idx到x之间构成的词语的概率,然后乘以x到语句结束位置的最大概率,
      # 即可得到idx到语句结束的路径最大概率.
            route[idx] = max(
                           (log(self.FREQ.get(sentence[idx:x + 1]) or 1) 
                            - log(total) 
                           + route[x + 1][0]
                         , x) for x in DAG[idx])
    # 每个词的概率 = 字典中该词的词数 / 字典总词数。
    

    对于上图构建每个节点的最大路径概率的过程如下:

    p(5)= 1, p(4)= max(p(5) * p(4->5)),
    p(3)= max(p(4) * p(3->4)),
    p(2)= max(p(3) * p(2->3),   p(4) * p(2->4),   p(5) * p(2->5)),
    对于节点2,他有2->3, 2->4, 2->4三条路径,我们取概率最大的路径作为节点2的路径概率,并记下概率最大时节点2的结束位置。

    p(1) = max(p(2) * p(1->2)) p(0) = max(p(1) * p(0->1),   p(2) * p(0->2))

    遍历每个节点的Route,组装词语组合。

    如果词语不在字典中,也就是新词,使用HMM隐马尔科夫模型进行分割。

    通过yield将词语逐个返回。

    2、基本方法

    待分词的字符串可以是 unicode 或 UTF-8 字符串、GBK 字符串。注意:不建议直接输入 GBK 字符串,可能无法预料地错误解码成 UTF-8。

    jieba.cut(sentence, 
              cut_all=False, 
              HMM=True, 
              use_paddle=False)
    

    sentence:  需要分词的字符串
    cut_all:  用来控制是否采用全模式
    HMM: 用来控制是否使用 HMM 模型
    use_paddle: 用来控制是否使用paddle模式下的分词模式,paddle模式采用延迟加载方式,通过enable_paddle接口

     jieba.cut_for_search(sentence, HMM=True)
    

    该方法适合用于搜索引擎构建倒排索引的分词,粒度比较细。

    sentence: 分词的字符串
    HMM: 使用 HMM 模型

    jieba.cut 以及 jieba.cut_for_search 返回的结构都是一个可迭代的 generator,可以使用 for 循环来获得分词后得到的每一个词语(unicode)

    jieba.lcut 以及 jieba.lcut_for_search 直接返回 list

    jieba.Tokenizer(dictionary=DEFAULT_DICT) 新建自定义分词器,可用于同时使用不同词典。jieba.dt 为默认分词器,所有全局分词相关函数都是该分词器的映射。

    代码示例:

    # encoding=utf-8
    import jieba
    
    jieba.enable_paddle()# 启动paddle模式。
    strs=["我关注了数据STUDIO","我是数据分析师","四川大学"]
    for str in strs:
        seg_list = jieba.cut(str,use_paddle=True) # 使用paddle模式
        print("Paddle Mode: " + '/'.join(list(seg_list)))
    
    seg_list = jieba.cut("我毕业于四川大学,我关注了数据STUDIO", cut_all=True)
    print("Full Mode: " + "/ ".join(seg_list))  # 全模式
    
    seg_list = jieba.cut("我毕业于四川大学,我关注了数据STUDIO", cut_all=False)
    print("Default Mode: " + "/ ".join(seg_list))  # 精确模式
    
    seg_list = jieba.cut("他来到了网易杭研大厦")  # 默认是精确模式
    print(", ".join(seg_list))
    
    seg_list = jieba.cut_for_search("我是云朵君,我关注了数据STUDIO")  # 搜索引擎模式
    print(", ".join(seg_list))
    

    Paddle enabled successfully......
    Paddle Mode: 我/关注/了/数据/STUDIO
    Paddle Mode: 我/是/数据/分析师
    Paddle Mode: 四川大学
    Full Mode: 我/ 毕业/ 于/ 四川/ 四川大学/ 大学/ ,/ 我/ 关注/ 了/ 数据/ STUDIO
    Default Mode: 我/ 毕业/ 于/ 四川大学/ ,/ 我/ 关注/ 了/ 数据/ STUDIO
    他, 来到, 了, 网易, 杭研, 大厦
    我, 是, 云朵, 君, ,, 我, 关注, 了, 数据, STUDIO

    添加自定义词典

    1、原始词典

    词典是基于字符串匹配的分词算法的关键所在,决定了最终分词的准确度。jieba词典dict.txt是jieba作者采集了超大规模的语料数据,统计得到的。有5M,包含349,046条词语。每一行对应一个词语,包含词语 词数 词性三部分。

    2、载入词典

    开发者可以指定自己自定义的词典,以便包含 jieba 词库里没有的词。虽然 jieba 有新词识别能力,但是自行添加新词可以保证更高的正确率。

     jieba.load_userdict(file_name) 
    

    词典格式和 dict.txt 一样,一个词占一行;每一行分三部分:词语、词频(可省略)、词性(可省略),用空格隔开,顺序不可颠倒。

    file_name 为文件类对象或自定义词典的路径,若为路径或二进制方式打开的文件,则文件必须为 UTF-8 编码。

    词频省略时使用自动计算的能保证分出该词的词频。

    例如:

    创新办 3 i
    云计算 5
    凱特琳 nz
    台中
    

    更改分词器(默认为 jieba.dt)的 tmp_dircache_file 属性,可分别指定缓存文件所在的文件夹及其文件名,用于受限的文件系统。

    代码示例:

    #encoding=utf-8
    import sys
    sys.path.append("../")
    import jieba
    import jieba.posseg as pseg
    
    test_sent = (
    "李小福是创新办主任也是云计算方面的专家; 什么是八一双鹿\n"
    "例如我输入一个带“韩玉赏鉴”的标题,在自定义词库中也增加了此词为N类\n"
    "「台中」正確應該不會被切開。mac上可分出「石墨烯」;此時又可以分出來凱特琳了。"
    )
    words = jieba.cut(test_sent)
    print("使用默认词库:\n {}".format('/'.join(words)))
    print("="*40)
    
    jieba.load_userdict("userdict.txt")
    """
    userdict.txt
    云计算 5
    李小福 2 nr
    创新办 3 i
    pip_install 3 eng
    好用 300
    韩玉赏鉴 3 nz
    八一双鹿 3 nz
    台中
    凱特琳 nz
    Edu Trust认证 2000
    """
    jieba.add_word('石墨烯')
    jieba.add_word('凱特琳')
    jieba.del_word('自定义词')
    
    words = jieba.cut(test_sent)
    print("加载自定义词库后: \n{}".format('/'.join(words)))
    print("="*40)
    
    # 带有词性的分词
    result = pseg.cut(test_sent)
    
    for w in result:
        print(w.word, "/", w.flag, ", ", end=' ')
    print("\n" + "="*40)
    
    terms = jieba.cut('pip_install is great')
    print('/'.join(terms))
    terms = jieba.cut('python 的正则表达式是好用的')
    print('/'.join(terms))
    print("="*40)
    

    使用默认词库::
    李小福 / 是 / 创新 / 办 / 主任 / 也 / 是 / 云 / 计算 / 方面 / 的 / 专家 /

    加载自定义词库后:
    李小福 / 是 / 创新办 / 主任 / 也 / 是 / 云计算 / 方面 / 的 / 专家 /

    3、调整词典

    使用 add_word(word, freq=None, tag=None)del_word(word) 可在程序中动态修改词典。

    使用 get_FREQ(word) 用来统计当前词的词频。

    使用 suggest_freq(segment, tune=True) 可调节单个词语的词频,使其能(或不能)被分出来。

    注意:自动计算的词频在使用 HMM 新词发现功能时可能无效。

    代码示例:

    # test frequency tune
    testlist = [
    ('今天天气不错', ('今天', '天气')),
    ('如果放到post中将出错。', ('中', '将')),
    ('我们中出了一个叛徒', ('中', '出')),
    ]
    
    for sent, seg in testlist:
        print('/'.join(jieba.cut(sent, HMM=False)))
        word = ''.join(seg)
        print('%s Before: %s, After: %s' % (word, jieba.get_FREQ(word), jieba.suggest_freq(seg, True)))
        print('/'.join(jieba.cut(sent, HMM=False)))
        print("-"*40)
    

    今天天气/不错
    今天天气 Before: 3, After: 0
    今天/天气/不错

    如果/放到/post/中将/出错/
    中将 Before: 763, After: 494
    如果/放到/post/中/将/出错/。

    我们/中/出/了/一个/叛徒
    中出 Before: 3, After: 3
    我们/中/出/了/一个/叛徒

    通过用户自定义词典来增强歧义纠错能力[2]

    参考资料

    [1]

    jieba分词: https://github.com/fxsjy/jieba

    [2]

    用户自定义词典: https://github.com/fxsjy/jieba/issues/14

    -- 数据STUDIO -- 

    展开全文
  • 基于python的中文分词的实现及应用 刘新亮 严姗姗 (北京工商大学计算机学院,100037) 摘 要 中文分词的实现及应用属于自然语言处理范畴,完成的是中文分词在Python语言环境下的实现,以及利用这个实现的一个...

    基于python的中文分词的实现及应用

    刘新亮 严姗姗
    (北京工商大学计算机学院,100037)
     
         摘  要  中文分词的实现及应用属于自然语言处理范畴,完成的是中文分词在Python语言环境下的实现,以及利用这个实现的一个应用程序接口和一个中文文本处理的应用。设计共分为五个部分,分别是:分词模块、包装模块、应用程序接口、Nonsense模块,这个项目是为了下一步开放源代码的中文搜索引擎提供中文分词功能,同时通过表现代码的娱乐性达到促进公开源代码的发展。
        关键词  中文分词;Python语言;程序接口
     

     

    1 引言

        自然语言处理是研究实现人与计算机之间用自然语言进行有效通信的各种理论和方法的一个领域,是计算机科学领域和人工智能领域的重要发展方向之一。它大体包括自然语言理解和自然语言生成两个部分,前者是使计算机理解自然语言文本,后者是使计算机以自然语言文本来表达给定的意图、思想等。
        自然语言处理是目前比较前沿的学科,拥有广阔的前景,但同时是非常有难度的。现在已经出现了能够针对一定应用的实用系统,但是通用的、高质量的自然语言系统仍然是较长期的努力目标。这些实用系统已经具有相当的自然语言处理能力,其中有些已经商品化、甚至产业化。典型的例子有:各种数据库和专家系统的自然语言接口、各种机器翻译系统、全文信息检索系统、自动文摘系统等 [1]

    2 中文分词技术

        中文分词技术属于自然语言处理技术范畴,对于一句话,人可以通过自己的知识来明白哪些是词,哪些不是词,但如何让计算机也能理解,其处理过程就是分词算法。现有的分词算法可分为三大类:基于字符串匹配的分词方法、基于理解的分词方法和基于统计的分词方法 [2]
        (1)基于字符串匹配的分词方法:这种方法又叫做机械分词方法,它是按照一定的策略将待分析的汉字串与一个“充分大的”机器词典中的词条进行匹配,若在词典中找到某个字符串,则匹配成功(识别出一个词)。按照扫描方向的不同,串匹配分词方法可以分为正向匹配和逆向匹配;按照不同长度优先匹配的情况,可以分为最大(最长)匹配和最小(最短)匹配;按照是否与词性标注过程相结合,又可以分为单纯分词方法和分词与标注相结合的一体化方法。
        (2)基于理解的分词方法:这种分词方法是通过让计算机模拟人对句子的理解,达到识别词的效果。其基本思想就是在分词的同时进行句法、语义分析,利用句法信息和语义信息来处理歧义现象。它通常包括三个部分:分词子系统、句法语义子系统、总控部分。在总控部分的协调下,分词子系统可以获得有关词、句子等的句法和语义信息来对分词歧义进行判断,即模拟人对句子的理解过程。
        (3)基于统计的分词方法:从形式上看,词是稳定的字的组合,因此在上下文中,相邻的字同时出现的次数越多,就越有可能构成一个词。
        到底哪种分词算法的准确度更高,目前并无定论。对于任何一个成熟的分词系统来说,不可能单独依靠某一种算法来实现,都需要综合不同的算法。笔者了解,海量科技的分词算法就采用“复方分词法”。所谓复方,相当于用中药中的复方概念,即用不同的药材综合起来去医治疾病。同样,对于中文词的识别,需要多种算法来处理不同的问题。

    3 分词中的难题

        有了成熟的分词算法,是否就能容易的解决中文分词的问题呢?事实远非如此。中文是一种十分复杂的语言,让计算机理解中文语言更是困难。在中文分词过程中,有两大难题一直没有完全突破。
        (1)歧义识别:歧义是指同样的一句话,可能有两种或者更多的切分方法。例如:表面的,因为“表面”和“面的”都是词,那么这个短语就可以分成“表面的”和“表 面的”。这种称为交叉歧义。
        (2)新词识别:新词,专业术语称为未登录词。也就是那些在字典中都没有收录过,但又确实能称为词的那些词。最典型的是人名,人可以很容易理解句子“王军虎去广州了”中,“王军虎”是个词,因为是一个人的名字,但要是让计算机去识别就困难了。如果把“王军虎”作为一个词收录到字典中去,全世界有那么多名字,而且每时每刻都有新增的人名,收录这些人名本身就是一项巨大的工程。即使这项工作可以完成,还是会存在问题,例如:在句子“王军虎头虎脑的”中,“王军虎”还能不能算词?新词中除了人名以外,还有机构名、地名、产品名、商标名、简称、省略语等都是很难处理的问题,而且这些又正好是人们经常使用的词,因此对于搜索引擎来说,分词系统中的新词识别十分重要。目前新词识别准确率已经成为评价一个分词系统好坏的重要标志之一。

    4 软件结构

        如图1所示,软件实现过程大体是:首先由分词模块用C语言实现分词,这部分主要运用了中国科学院的ICTCLAS,对它进行研究及处理;然后用SWIG对分词模块进行包装,使其能够被Python语言调用,在Python语言环境下实现中文分词

     

    图1  软件结构图

    4.1 分词模块结构

        分词模块包括两个部分,其一是中国科学院的公开源代码软件ICTCLAS(Institute of Computing Technology, Chinese Lexical Analysis System) 。该系统的功能有:中文分词;词性标注;未登录词识别。分词正确率高达97.58%(973专家组评测结果),未登录词识别召回率均高于90%,其中中国人名的识别召回率接近98%,处理速度为31.5Kbytes/s。ICTCLAS的特色还在于:可以根据需要输出多个高概率结果,有多种输出格式,支持北大词性标注集,973专家组给出的词性标注集合。该系统得到了专家的好评,并有多篇论文在国内外发表。 [3][4][5]
        ICTCLAS的功能有:中文分词,词性标注,未登录词识别。中文分词,即输入“我是中国人。” ,得到处理结果为“我/是/中国/人/。/” 。词性标注,即对每个切分开的词进行词性说明,支持北大词性标注集。如上例可得到结果为:“我/r  是/v  中国/n  人/n  。/w  ” 。未登录词识别即解决新词识别问题。分词模块还可以根据需要输出多个高概率结果,例如,用户输入“我是中国人。”
        分词模块的第二个部分是对ICTCLAS的处理。通过对源代码中ICTCLAS_WinDlg.cpp的函数On_button_run()的修改,得到seg.cpp,以便下一步对ICTCLAS进行包装。
        Seg.h:
    class Segment{
        CResult m_ICTCLAS;
    public: char* process_paragraph(char* sSource,int type,int format);
    };
    seg.cpp:
    //#include <ICTCLAS.h>
    #include <string.h>
    //#include "StdAfx.h"
    //#include <iostream.h>
    #include "seg.h"
    char* Segment::process_paragraph(char* sSource,int type,int format)
    {   
        char* sResult;//,*sSource;
        //CResult m_ICTCLAS;
        m_ICTCLAS.m_nOutputFormat=format;
        m_ICTCLAS.m_nOperateType=type;
        //clock_t start, finish;
        if(format!=2)
             sResult=new char [(strlen(sSource)+13)*3];
        else
             sResult=new char [(strlen(sSource)+13)*50];
        if (!m_ICTCLAS.ParagraphProcessing(sSource,sResult)){
             return NULL;
         }
        else{
             return sResult;
         }

    4.2 包装模块

        具体过程是:① 根据seg.cpp编写seg.i文件;②通过swig用seg.i生成seg.py 和seg_wrap.cpp,命令行为:swig –c++ -python cpp1.i;③ 通过setup.py 把seg.cxx和seg_wrap.cxx编译到一起,生成_seg1.pyd, a.编写setup.py,b.输入命令行setup.py build.ext;④ 把_seg.pyd拷贝到与其他文件同一目录下;⑤ 在seg.py中import _seg.pyd;⑥ 用python调用此程序时import seg.py;
        具体算法:
    seg.i:
     %module seg
    %{
    #include "seg.h"
    %}
    extern class Segment{
    public: char* process_paragraph(char* sSource,int type,int format);
    };
        整个分词模块相当于一个黑盒子,seg.py相当于是唯一与其联系的线,我们通过seg.py使用分词模块,体现包装的作用。process_paragraph是seg.cpp中的函数,通过调用它,可以完成分词工作。函数有三个参数,分别是中文文本,标示类型和输出标准。
    setup.py:
    from distutils.core import setup, Extension
    setup(name="_seg", version="1.0",
          ext_modules=[Extension("_seg", ["seg.cpp","Result\\Result.cpp","Segment\\Segment.cpp","Utility\\Dictionary.cpp",
    "Segment\\DynamicArray.cpp","Segment\\NShortPath.cpp","Segment\\Queue.cpp","Segment\\SegGraph.cpp","Tag\\Span.cpp",
    "StdAfx.cpp","Unknown\\UnknowWord.cpp","Utility\\Utility.cpp","Utility\\ContextStat.cpp","seg_wrap.cxx"],
    include_dirs="Result\\","Segment\\","Dictionary\\","DynamicArray\\","NShortPath\\","Queue\\","SegGraph\\","Span\\","StdAfx\\",
    "UnkownWord\\","Utility\\","ContextStat\\"])])

    4.3 应用程序接口 

    forexoweb.py:
    import seg
    import sys
    import string
    a=seg.Segment()
    def tokenizer(filecontent):
        (type=1 一级标注;format=0 北大标准)
        b=a.process_paragraph(filecontent,1,0)
        list=b.split()
        (删去标点,助词,叹词)
        list = filter(lambda x: (not (x[-2:] in ('/w','/u','/e'))),
               list)
        list = map(lambda x: x.split('/')[0],
    list)
        定义函数tokenizer,参数filecontent表示需要被分词的中文文本。调用函数process_paragraph,选择一级标注,并且以北大标准输出。然后将分次结果转换成列表形式,并删去标点符号,助词和叹词,删除标注,以方便之后开发搜索引擎之用。
        例如,需要被分词的中文文本为“我是中国人吗?” ,对其处理过程如下:
        分词:“我/r  是/v  中国/n  人/n  吗/y  ?/w  ”
        转换成列表形式:
        ['我',’/r’,'是',’/v’,'中国',’/n’,'人',’/n’,'吗',’/y’,'?',’/w’]
    删除标点符号,助词和叹词,删除标注:
        ['我', '是', '中国', '人']

    4.4 Nonsense模块

        基本算法:
        ①  对中文文本进行分词处理
        ②  确定新文本第一个词
        ③  确定新文本第二个词
        ④  循环确定下一个词,直到新文本字数等于原文本
    import seg
    import sys
    import string
    import random
    class Myclass:
            def __init__(self):
            self.a = seg.Segment()
           def tokenizer(self,allLines):
            b = self.a.process_paragraph(allLines,0,0)
            words = b.split()
            self.first = self.find_firstword_dict(words)
            (self.word_dict, self.sum_dict) = self.change_ to_dict(words)
            self.word_length = len(words) 
            #return [ unicode(word, 'GBK') for word in words ]
        def find_firstword_dict(self,words):
                sentences = []
            current_sentence = []
            for word in words:
              if word in ["。","?","!"]:
                 sentences.append(current_sentence)
                    current_sentence = []
                else:
                  current_sentence.append(word)
            if len(current_sentence) > 0:
                 sentences.append(current_sentence)
            sum=0
            a=0
            first={}
            for current_sentence in sentences:
               a = current_sentence[0]
               first[a] = first.setdefault(a,0) + 1
               sum += 1
              for key in first.keys():
                first[key] = float(first[key]) / sum
            return first
            (first={'我':0.33,'你':0.33,'她':0.33}
            假设:first={'我':0.5,'你':0.2,'她':0.3})
        def find_first_word(self):
            first = self.first
            h = random.random()
            m=0
            firstword = ''
           values = []
            firstkeys = first.keys()
            start = 0
            for eachkey in firstkeys:
                values.append((eachkey,start,start+self.first[eachkey]))
                start += self.first[eachkey]
            (values = [('我',  0,0.5),
                      ('你',0.5,0,7),
                     ('她',0.7,  1)])
           for value in values:
              word,start,end = value
                if h >= start and h <= end:
                    firstword = word
                    break
            return firstword
        def change_to_dict(self,words):
            word_dict = {}
            sum_dict = {}
            sum = 0
            curr_word = words[0]
            for next_word in words[1:]:
               if word_dict.has_key(curr_word):
                  if word_dict[curr_word].has_key(next_word):
                        word_dict[curr_word][next_word] += 1
                    else:
                        word_dict[curr_word][next_word] = 1
                    sum_dict[curr_word] += 1   
                else:
                  word_dict[curr_word] = {next_word:1}
                    sum_dict[curr_word] = 1
                curr_word = next_word
                sum_dict = {'我':1,'是':3})
            return (word_dict, sum_dict)
        def get_next_word(self,next_words,sum):
           h = random.randint(1,sum)
      m=0
            nextword = ''
            values = []
            nextkeys = next_words.keys()
            (nextkeys = ['我','你','她'])
            start = 0
               for eachkey in nextkeys:
                values.append((eachkey,start,start+next_words[eachkey]))
                start += next_words[eachkey]
            for value in values:
                word,start,end = value
                if h >= start and h <= end:
                    nextword = word
                    break
            return nextword       
     

    5 结论

        在这个软件中,我们在Python语言环境下实现了中文分词,并进行了中文信息处理的应用。这对Python语言和中文信息处理来说,是双向的扩展,都具有积极的意义:Python语言的优势可以给中文信息处理带来更好的效果,同时中文信息处理的广阔前景也给Python语言以及与其相关的Zope等提供了更大的发展空间。有关中文分词的应用,还可以继续往人工智能方向发展,例如利用Python语言编写的贝叶斯分类器,可以获得更有实际意义的应用,比如垃圾邮件分类等。

    参考文献

        [1]《python核心编程》, (美)Wesley J.Chun(陈仲才)著, 杨涛 王建桥 杨晓云 高文雅 等译, 机械工业出版社, 2001.8
        [2]徐飞 孙劲光,基于一种粗切分的最短路径中文分词研究[J] 计算机与信息技术,2007(11)
        [3]Hua-Ping ZHANG Qun LIU Xue-Qi CHENG Hao Zhang Hong-KuiYu. Chinese Lexical Analysis Using Hierarchical Hidden Markov Model.
        [4]Remi Delon, CherryPy Tutorial, 12 May 2004, Release 0.10
        [5]Python Tutorial,Guido van Rossum Fred L. Drake, Jr., editor,PythonLabs ,Release 2.3.4,May 20, 2004
        收稿日期:9月10日       修改日期:9月12日

        作者简介:刘新亮(1972-),男,北京工商大学计算机学院讲师,研究方向:数据库应用。

    转载于:https://www.cnblogs.com/appler/archive/2012/02/02/2335834.html

    展开全文
  • 少年街霸游戏程序

    2017-10-29 17:11:36
    少年街霸游戏,小时候经常玩的游戏,可以回忆下童年。
  • 街霸html5,能实现大战电脑或双人对战。小时候经常去街机厅玩的游戏。适合初学js编程者学习源代码。缺点是大招有点难搓出来。欢迎优化代码。第一次发布,大佬不喜勿喷。
  • 街霸游戏源码J2ME

    2021-04-02 17:51:54
    街霸游戏源码J2ME,该游戏的源码比较完整,功能也很齐全,而且游戏的源码也比较清晰,界面还可以,值得大家java游戏开发的朋友可以下载研究看看。
  • 街霸:隆(Ryu)绑定下载 Blender 2.83 关键Pose Idle 蓄力
  • 效果图 关键姿势(Key Pose) 首帧的Idle 蓄力 最高点 下降 ...注意:由于这个动画的角色在Z轴方向旋转了360度(欧拉模式),所以,尾帧的Idle是将首帧Idle姿态复制后将腰部的控制器Z轴值增加360度得来的。...
  • 少年街霸图标下载

    2020-12-25 00:59:55
    ……………………该文档为少年街霸图标下载,是一份很不错的参考资料,具有较高参考价值,感兴趣的可以下载看看
  • Lowpoly风街霸角色维加(Vega)Blender源文件 老王的原创教程见《手把手带你Godot游戏开发 第二弹】名场面临摹 之 街霸3D》 https://orzgame.blog.csdn.net/article/details/109402316
  • Lowpoly风街霸角色布兰卡(Blanka)Blender源文件 老王的原创教程见《手把手带你Godot游戏开发 第二弹】名场面临摹 之 街霸3D》 https://orzgame.blog.csdn.net/article/details/109402316
  • 书接上文《Godot Engine:街霸隆的动画状态机(Animation State Machine)》,我们已经为隆构造简单的动画状态机,本章节我们把《Godot Engine:格斗游戏中的必杀技(大招/绝招/特殊技/Special Move )输入系统实现...
  • 电子-街霸.zip

    2019-09-05 12:16:31
    电子-街霸.zip,单片机/嵌入式STM32-F0/F1/F2
  • 效果图 上一篇关键Pose的效果 《街霸 隆(Ryu)波动拳(Hadoken)动画(一)关键姿势》 腰带细节 左侧腰带被弯曲的左腿挑起来 肖带细节 肖带随惯性被甩到前面
  • 街霸4设置汉化补丁

    2013-04-07 17:36:00
    街霸4设置汉化补丁,界面汉化补丁,使用与街霸43DM
  • Java手机街霸游戏源码,以前的j2me游戏源码,打拳游戏,在电子游戏室玩的那种,源码包内带完整资源文件,现在看来,Android游戏也在此基础上扩展,学好j2me对编写Android游戏相当有用。
  • 街头霸王-源码

    2021-02-14 00:14:50
    异步球运动 球非同步运动的锅炉板
  • 文章目录 效果图 三视图 渲染图 下载地址 效果图 三视图 渲染图 下载地址 街霸:维加(Vega)模型下载
  • USB摇杆手柄完美玩PC版街霸4的XP方案
  • 预告片儿 今天水一篇,明天正式发波儿
  • 应该还是可以看出区别 微调之前 微调后
  • 书接上文:《Godot Engine:街霸隆的动画(Idle/波动拳/升龙拳)导入步骤以及运行时的简单动画切换》,我们已经完成了Idle/波动拳/升龙拳动画的导入与加载,甚至还写了动画简单切换的代码 为什么要使用动画状态机?
  • 这个模型的原设计者是油管UP主:WatchMeAnimate,他免费提供了模型下载,原文件格式是Maya的,我把其中的模型提取出来,用Blender的Rigify重新绑定了一下。不过有小伙伴想了解这个...街霸:隆模型下载(不含绑定) ...
  • 文章目录三视图渲染图下载地址 仿照隆的风格做了一个布兰卡,这个角色是原创的哦。 三视图 渲染图 下载地址 街霸:布兰卡(Blanka)建模及模型下载
  • 街霸4图形技术讲解

    千次阅读 2014-02-18 20:14:06
    动作全部手工添加。巨大化攻击部位的秘密和正... 在前篇中虽然解说了Shading和Lighting等[涂色]的部分,但实际上,在[形体]和[动作]的设计中,是有[真实感]是不够的,还要寻求继承[2D格斗风格][街霸2系列的像素画风格]
  • 文章目录效果展示0. 动画准备Idle动画波动拳升龙拳1. 导出模型与动画1.1. 隐藏不必要的集合1.2. 以glTF格式导出2. 导入Godot Engine3....这三个动画全是用的同一个绑定,下载地址见Blender Rigify版街霸角色隆(Ry
  • 角色模型街霸4.zip

    2021-04-19 18:35:19
    街霸隆的3D模型

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 794
精华内容 317
关键字:

jieba分词去掉标点符号