• 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。

  • 相关阅读:
    css之深入理解padding
    css布局大杂烩
    css深入理解margin
    css之深入理解border
    css样式画各种图形
    css Sprite雪碧图
    JVM,JRE,JDK
    JAVA 遍历数组
    JAVA 得到数组的长度
    大一对软件工程
  • 原文地址:https://www.cnblogs.com/sunnyeveryday/p/8903702.html
Copyright © 2020-2023  润新知