• 【火炉炼AI】机器学习034-NLP对文本进行分词


    【火炉炼AI】机器学习034-NLP对文本进行分词

    (本文所使用的Python库和版本号: Python 3.6, Numpy 1.14, scikit-learn 0.19, matplotlib 2.2, NLTK 3.3, jieba 0.39)

    分词过程可以认为是自然语言处理(NLP)的第一步,在我们获取了文本数据集后,首先要做的就是将文本句子分割成各种单词,下面介绍各种常用的分词工具。


    1. 对英文进行分词

    1.1 对句子进行分割--sent_tokenize

    NLP可以对句子进行分割,也就将一整段文本分割成几句话,经常是以句子结尾符号为标志来分割。这些符号包括有问号,感叹号,句号等。(逗号不会分割。)如下演示代码

    # 对句子进行分割(tokenization)
    from nltk.tokenize import sent_tokenize
    text = "Are you curious about tokenization? Let's see how it works! We need to analyze, a couple of sentences with punctuations to see it in action."
    sent_list=sent_tokenize(text)
    print(sent_list) # 句子结尾符号为标志分割
    

    -------------------------------------输---------出--------------------------------

    ['Are you curious about tokenization?', "Let's see how it works!", 'We need to analyze, a couple of sentences with punctuations to see it in action.']

    --------------------------------------------完-------------------------------------

    可以看出sent_tokenize以问号,感叹号,句号来分割,但是中间的逗号却留在原来的句子中,没有分割。

    1.2 对句子进行分词--word_tokenize

    对句子进行分词,是将一段文本,一句话或者几个单词分割成几个单独的单词,分割的依据是空格,问号,逗号,句号等符号,代码如下:

    # 对句子进行分词,即根据语义将一句话分成多个单词
    from nltk.tokenize import word_tokenize
    text = "Are you curious about tokenization? Let's see how it works! We need to analyze, a couple of sentences with punctuations to see it in action."
    word_list=word_tokenize(text)
    print(word_list) # 以空格,问号,感叹号,句号等分割成单词
    # 分词在NLP中非常重要,经常是NLP的第一步
    

    -------------------------------------输---------出--------------------------------

    ['Are', 'you', 'curious', 'about', 'tokenization', '?', 'Let', "'s", 'see', 'how', 'it', 'works', '!', 'We', 'need', 'to', 'analyze', ',', 'a', 'couple', 'of', 'sentences', 'with', 'punctuations', 'to', 'see', 'it', 'in', 'action', '.']

    --------------------------------------------完-------------------------------------

    1.3 对句子进行分词--WordPunctTokenizer

    WordPunctTokenizer的结果基本和上面的word_tokenize结果一致,不同的地方在于WordPunctTokenizer分词器可以将标点符号保留到不同的句子标记中。代码如下:

    # 还有一个分词方法:WordPunct分词器,可以将标点符号保留到不同的句子标记中
    from nltk.tokenize import WordPunctTokenizer
    text = "Are you curious about tokenization? Let's see how it works! We need to analyze, a couple of sentences with punctuations to see it in action."
    word_punct=WordPunctTokenizer()
    word_punct_list=word_punct.tokenize(text)
    print(word_punct_list)
    

    -------------------------------------输---------出--------------------------------

    ['Are', 'you', 'curious', 'about', 'tokenization', '?', 'Let', "'", 's', 'see', 'how', 'it', 'works', '!', 'We', 'need', 'to', 'analyze', ',', 'a', 'couple', 'of', 'sentences', 'with', 'punctuations', 'to', 'see', 'it', 'in', 'action', '.']

    --------------------------------------------完-------------------------------------

    通过和上面的word_tokenize结果结果进行比较可以发现,唯一的不同就是Let's分割时不同,WordPunctTokenizer将Let's分割为三个单词,而word_tokenize却分割成两个单词。一般情况下,这一点区别意义不大,故而word_tokenize用得跟多一些。

    (注意:虽然在《Python机器学习经典实例》中提到还有一个分词器PunktWordTokenizer,但是这个分词器已经弃用了,就连import都会出错,故而此处不讲解。)

    2. 对中文进行分词

    上面的几个分词器对英文非常好用,但是很遗憾,对中文不能分词成功,我自己尝试过。对英文的分词很简单,因为是以空格作为自然分解符,可是中文却不是的,中文要分成单词而不是汉字。

    对于中文分词,有很多种分词模块,比如:jieba、SnowNLP(MIT)、pynlpir(大数据搜索挖掘实验室(北京市海量语言信息处理与云计算应用工程技术研究中心))、thulac(清华大学自然语言处理与社会人文计算实验室)等。比较常用的是"jieba"分词器,意思就是像结巴一样结结巴巴的把一个句子分成几个单词。

    jieba分词器需要单独安装,安装也很简单,直接使用pip install jieba即可。

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

    下面分别用着三种模式来进行中文分词,比较其异同点。

    # 中文分词应该使用jieba等分词模块
    import jieba
    text = "这是【火炉炼AI】的机器学习系列文章,本文的标题是《【火炉炼AI】机器学习034-NLP对文本进行分词》。"+ 
        "你可以从这个系列文章中学习到很多关于机器学习,人工智能方面的基础知识和实战技巧。"+
        "请尽情享受吧!我的AI朋友们。。。"
    mode1_list=jieba.cut(text,cut_all=False) # 精确模式(默认为False,精确模式)
    print('jieba-精确模式结果:')
    print('/'.join(mode1_list))
    
    mode2_list=jieba.cut(text,cut_all=True) # 全模式
    print('jieba-全模式结果:')
    print('/'.join(mode2_list))
    
    mode3_list=jieba.cut_for_search(text) # 搜索引擎模式
    print('jieba-搜索引擎模式结果:')
    print('/'.join(mode3_list))
    

    -------------------------------------输---------出--------------------------------

    这是/【/火炉/炼/AI/】/的/机器/学习/系列/文章/,/本文/的/标题/是/《/【/火炉/炼/AI/】/机器/学习/034/-/NLP/对/文本/进行/分词/》/。/你/可以/从/这个/系列/文章/中/学习/到/很多/关于/机器/学习/,/人工智能/方面/的/基础知识/和/实战/技巧/。/请/尽情/享受/吧/!/我/的/AI/朋友/们/。/。/。
    jieba-全模式结果:
    这/是///火炉/炼/AI//的/机器/学习/系列/文章///本文/的/标题/是////火炉/炼/AI//机器/学习/034/NLP/对/文本/进行/分词////你/可以/从/这个/系列/文章/中学/学习/到/很多/关于/机器/学习///人工/人工智能/智能/方面/的/基础/基础知识/知识/和/实战/战技/技巧///请/尽情/享受/吧///我/的/AI/朋友/们////
    jieba-搜索引擎模式结果:
    这是/【/火炉/炼/AI/】/的/机器/学习/系列/文章/,/本文/的/标题/是/《/【/火炉/炼/AI/】/机器/学习/034/-/NLP/对/文本/进行/分词/》/。/你/可以/从/这个/系列/文章/中/学习/到/很多/关于/机器/学习/,/人工/智能/人工智能/方面/的/基础/知识/基础知识/和/实战/技巧/。/请/尽情/享受/吧/!/我/的/AI/朋友/们/。/。/。

    --------------------------------------------完-------------------------------------

    从上面的输出结果可以看出,这三种方法还是有很多不同点的,比如全模式的结果都没有标点符号,而且有几个地方有重复,比如"文章中学习到"被分割成/文章/中学/学习/到/,而搜索引擎模式则对长词在此切分,所以有些地方重复,比如/人工/智能/人工智能/方面/的/基础/知识/基础知识/等。

    ########################小**********结###############################

    1,如果想对英文进行分词,可以直接使用NLP中自带的sent_tokenize,word_tokenize,WordPunctTokenizer分词器,其中的word_tokenize是应用最频繁的。

    2,如果想对中文进行分词,可以使用jieba模块,其中的精确模式(也是其默认模式)已经能够很好的将文本切分开来。其他模式在不同的应用场景中会用到。

    #################################################################


    注:本部分代码已经全部上传到(我的github)上,欢迎下载。

    参考资料:

    1, Python机器学习经典实例,Prateek Joshi著,陶俊杰,陈小莉译

  • 相关阅读:
    接口的故事
    Bash CookBook(一)--基础
    Spring学习笔记(四)--MVC概述
    Spring学习笔记(三)--Convert System设计
    java web框架发展的新趋势--跨界轻型App
    由Strurts2漏洞引开谈谈web代码安全问题
    Java线程同步之一--AQS
    Android Studio 0.4 + PhoneGap 3.3 开发环境的搭建
    redis的多线程
    原电商设计框架
  • 原文地址:https://www.cnblogs.com/RayDean/p/9765766.html
Copyright © 2020-2023  润新知