zoukankan      html  css  js  c++  java
  • nlp中文分词(jieba和pyltp)

    分词是中文自然语言处理的基础。目前常用的分词算法有

    1.张华平博士的NShort中文分词算法。

    2.基于条件随机场(CRF)的中文分词算法。

    这两种算法的代表工具包分别是jieba分词系统和哈工大的LTP语言技术平台。下面就分别演示这两个工具的使用方法。

    jieba包有两个分词函数,cutcut_for_search,后者主要为搜索引擎设计,粒度更细。jieba.cut(sentence,cut_all=False,HMM=True) 方法接受三个输入参数: 需要分词的字符串;cut_all 参数用来控制是否采用全模式;HMM 参数用来控制是否使用 HMM 模型。

    pyltp包的分词模块只有一个分词函数,Segmentor.segment(line)只有一个参数:需要分词的字符串。

    #coding:utf-8
    import jieba
    from pyltp import Segmentor
    
    text='奎金斯距离祭台很近,加拉塔“掉落”的部分事物就在他的面前,他下意识就捡起了其中一块金属碎屑般的事物和小片黑色固体。'
    
    segs1=jieba.cut(text)
    print('|'.join(segs1))
    segs1=jieba.cut_for_search(text)
    print('|'.join(segs1))
    
    segmentor=Segmentor()  #实例化分词模块
    segmentor.load("D:\ltp_data\cws.model")
    segs2=segmentor.segment(text)
    print('|'.join(segs2))
    segmentor.release()    #释放模型
    

    分词的结果如下:

    奎金斯|距离|祭台|很近|,|加|拉塔|“|掉落|”|的|部分|事物|就|在|他|的|面前|,|他|下意识|就|捡起|了|其中|一块|金属|碎屑|般的|事物|和|小片|黑色|固体|。
    奎金斯|距离|祭台|很近|,|加|拉塔|“|掉落|”|的|部分|事物|就|在|他|的|面前|,|他|意识|下意识|就|捡起|了|其中|一块|金属|碎屑|般的|事物|和|小片|黑色|固体|。
    奎金斯|距离|祭台|很|近|,|加拉塔|“|掉落|”|的|部分|事物|就|在|他|的|面前|,|他|下|意识|就|捡|起|了|其中|一|块|金属|碎屑|般|的|事物|和|小|片|黑色|固体|。

    可以看到,默认的分词方法还是有一些瑕疵,jieba分词结果里,“加拉塔”被分割成了两部分,pyltp的结果里,“般的”被分割成了两部分。为了更好地分词,两个工具包都提供了调整词典、添加词典的功能。

    jieba里调整词典的函数是jieba.add_word(word,freq=None,tag=None),它接受三个参数:新词,词频,词性。jieba还可以添加自定义词典,jieba.load_userdict(f),f是一个txt文档,要求是utf-8编码。词典格式为一个词占一行,每一行分三部分:词语、词频(可省略)、词性(可省略),用空格隔开,顺序不可颠倒。

    pyltp在加载模型的同时,可加载自定义词典。Segmentor. load_with_lexicon(model_path,user_dict)第一个参数自带的模型文件,第二个参数是自定义词典。词典格式为一个词为一行,第一列是词,第二列到第n列是该词的候选词性。

    本次分词,jieba、pyltp的自定义词典都是只有词,其他省略。词典内容如下:

    下意识
    加拉塔

    调整词典后的分词代码如下:

    #coding:utf-8
    import jieba
    from pyltp import Segmentor
    from pyltp import CustomizedSegmentor
    
    text='奎金斯距离祭台很近,加拉塔“掉落”的部分事物就在他的面前,他下意识就捡起了其中一块金属碎屑般的事物和小片黑色固体。'
    
    jieba.add_word('奎金斯')
    jieba.add_word('加拉塔')
    segs1=jieba.cut(text)
    print('|'.join(segs1))
    
    jieba.load_userdict('userdict_jieba.txt')
    segs1=jieba.cut(text)
    print('|'.join(segs1))
    
    segmentor=Segmentor()
    cws_model="D:\ltp_data\cws.model"
    user_dict="userdict_ltp.txt"
    segmentor.load_with_lexicon(cws_model,user_dict)
    segs2=segmentor.segment(text)
    print('|'.join(segs2))
    segmentor.release()
    

    分词结果:

    奎金斯|距离|祭台|很近|,|加拉塔|“|掉落|”|的|部分|事物|就|在|他|的|面前|,|他|下意识|就|捡起|了|其中|一块|金属|碎屑|般的|事物|和|小片|黑色|固体|。
    奎金斯|距离|祭台|很近|,|加拉塔|“|掉落|”|的|部分|事物|就|在|他|的|面前|,|他|下意识|就|捡起|了|其中|一块|金属|碎屑|般的|事物|和|小片|黑色|固体|。
    [INFO] 2018-04-21 17:49:06 loaded 2 lexicon e
    奎金斯|距离|祭台|很|近|,|加拉塔|“|掉落|”|的|部分|事物|就|在|他|的|面前|,|他|下意识|就|捡|起|了|其中|一|块|金属|碎屑|般|的|事物|和|小|片|黑色|固体|。

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

    pyltp 支持使用用户训练好的个性化模型。关于个性化模型的训练需使用 LTP,详细介绍和训练方法请参考http://ltp.readthedocs.org/zh_CN/latest/theory.html#customized-cws-reference-label。

  • 相关阅读:
    【NOIP 2003】 加分二叉树
    【POJ 1655】 Balancing Act
    【HDU 3613】Best Reward
    【POJ 3461】 Oulipo
    【POJ 2752】 Seek the Name, Seek the Fame
    【POJ 1961】 Period
    【POJ 2406】 Power Strings
    BZOJ3028 食物(生成函数)
    BZOJ5372 PKUSC2018神仙的游戏(NTT)
    BZOJ4836 二元运算(分治FFT)
  • 原文地址:https://www.cnblogs.com/sunnyeveryday/p/8903702.html
Copyright © 2011-2022 走看看