自然语言处理-NLTK纯英文切分词

wylc123 1年前 ⋅ 2418 阅读

自然语言处理-NLTK纯英文切分词

1. 使用背景

项目中使用结巴分词,清华中文分词,CNKI的分词引擎,用户需要对纯英文进行切分词,词性标注、词干处理和去除停用词。调研后发现nltk满足用户的需求实现要求,在此记录,方便自己,服务他人。

2. NLTK简介

NLTK是一个高效的Python构建的平台,用来处理自然语言数据,它提供了易于使用的接口,通过这些接口可以访问超过50个语料库和词汇资源(如WordNet),还有一套用于分类、标记化、词干标记、解析和语义推理的文本处理库。NLTK可以在Windows、Mac OS以及Linux系统上使用。

3. NLTK最详细功能列表

一、使用 NLTK 分析单词和句子
二、NLTK 与停止词
三、NLTK 词干提取
四、NLTK 词性标注
五、NLTK 分块
六、 NLTK 添加缝隙(Chinking)
七、NLTK 命名实体识别
八、NLTK 词形还原
九、NLTK 语料库
十、 NLTK 和 Wordnet
十一、NLTK 文本分类
十二、使用 NLTK 将单词转换为特征
十三、NLTK 朴素贝叶斯分类器
十四、使用 NLTK 保存分类器
十五、NLTK 和 Sklearn
十六、使用 NLTK 组合算法
十七、使用 NLTK 调查偏差
十八、使用 NLTK 改善情感分析的训练数据
十九、使用 NLTK 为情感分析创建模块
二十、NLTK Twitter 情感分析
二十一、使用 NLTK 绘制 Twitter 实时情感分析
二十二、斯坦福 NER 标记器与命名实体识别
二十三、测试 NLTK 和斯坦福 NER 标记器的准确性
二十四、测试 NLTK 和斯坦福 NER 标记器的速度
二十五、使用 BIO 标签创建可读的命名实体列表

4. NLTK模块

语言处理任务 NLTK模块 功能描述
获取和处理语料库 nltk.corpus 语料库和词典的标准化接口
字符串处理 nltk.tokenize, nltk.stem 分词,句子分解提取主干
搭配发现 nltk.collocations t-检验,卡方,点互信息PMI
词性标识符 nltk.tag n-gram, backoff, Brill, HMM, TnT
分类 nltk.classify, nltk.cluster 决策树,最大熵,贝叶斯,EM,k-means
分块 nltk.chunk 正则表达式,n-gram,命名实体
解析 nltk.parse 图表,基于特征,一致性,概率,依赖
语义解释 nltk.sem, nltk.inference λ演算,一阶逻辑,模型检验
指标评测 nltk.metrics 精度,召回率,协议系数
概率与估计 nltk.probability 频率分布,平滑概率分布
应用 nltk.app nltk.chat 图形化的关键词排序,分析器,WordNet查看器,聊天机器人
语言学领域的工作 nltk.toolbox 处理SIL工具箱格式的数据

5. 安装NLTK

使用pip install nltk命令安装NLTK库,NLTK中集成了语料与模型等的包管理器,通过在python解释器中执行以下代码

import nltk
nltk.download()

便会弹出包管理界面,在管理器中可以下载语料,预训练的模型等。

除了一些个人数据包还可以下载整个集合(使用“all”),或者仅下载书中例子和练习中使用到的数据(使用“book”),或者仅下载没有语法和训练模型的语料库(使用“all-corpora”)。为所有软件包选择下载“全部”,然后单击“下载”。 这会给你所有分词器,分块器,其他算法和所有的语料库。 如果空间是个问题,您可以选择手动选择性下载所有内容。 NLTK 模块将占用大约 7MB,整个nltk_data目录将占用大约 1.8GB,其中包括您的分块器,解析器和语料库。

6. 简单文本分析

基本功能:

  • 分词
  • 词性标注
  • 名实体识别
    import nltk
    
    #先分句再分词
    sents = nltk.sent_tokenize("And now for something completely different. I love you.")
    word = []
    for sent in sents:
        word.append(nltk.word_tokenize(sent))
    print(word)
    
    #分词
    word_list= nltk.word_tokenize("And now for something completely different.")
    print(word_list)
    # 3、统计词频:
    freq_dist = nltk.FreqDist(word_list)    #nltk.FreqDist返回一个词典,key是不同的词,value是词出现的次数
    #词性标注
    tagged = nltk.pos_tag(text)
    print (tagged[0:6])
    #命名实体识别
    entities = nltk.chunk.ne_chunk(tagged)
    print (entities)
    
    >>>[['And', 'now', 'for', 'something', 'completely', 'different', '.'], ['I', 'love', 'you', '.']]
    >>>['And', 'now', 'for', 'something', 'completely', 'different', '.']
    >>>[('And', 'CC'), ('now', 'RB'), ('for', 'IN'), ('something', 'NN'), ('completely', 'RB'), ('different', 'JJ')]
    >>>(S And/CC now/RB for/IN something/NN completely/RB different/JJ ./.)​

    7. NLTK 与停止词

      自然语言处理的思想,是进行某种形式的分析或处理,机器至少可以在某种程度上理解文本的含义,表述或暗示。

      这显然是一个巨大的挑战,但是有一些任何人都能遵循的步骤。然而,主要思想是电脑根本不会直接理解单词。令人震惊的是,人类也不会。在人类中,记忆被分解成大脑中的电信号,以发射模式的神经组的形式。对于大脑还有很多未知的事情,但是我们越是把人脑分解成基本的元素,我们就会发现基本的元素。那么,事实证明,计算机以非常相似的方式存储信息!如果我们要模仿人类如何阅读和理解文本,我们需要一种尽可能接近的方法。一般来说,计算机使用数字来表示一切事物,但是我们经常直接在编程中看到使用二进制信号(TrueFalse,可以直接转换为 1 或 0,直接来源于电信号存在(True, 1)或不存在(False, 0))。为此,我们需要一种方法,将单词转换为数值或信号模式。将数据转换成计算机可以理解的东西,这个过程称为“预处理”。预处理的主要形式之一就是过滤掉无用的数据。在自然语言处理中,无用词(数据)被称为停止词。

      我们可以立即认识到,有些词语比其他词语更有意义。我们也可以看到,有些单词是无用的,是填充词。例如,我们在英语中使用它们来填充句子,这样就没有那么奇怪的声音了。一个最常见的,非官方的,无用词的例子是单词umm。人们经常用umm来填充,比别的词多一些。这个词毫无意义,除非我们正在寻找一个可能缺乏自信,困惑,或者说没有太多话的人。我们都这样做,有...呃...很多时候,你可以在视频中听到我说ummuhh。对于大多数分析而言,这些词是无用的。

      我们不希望这些词占用我们数据库的空间,或占用宝贵的处理时间。因此,我们称这些词为“无用词”,因为它们是无用的,我们希望对它们不做处理。 “停止词”这个词的另一个版本可以更书面一些:我们停在上面的单词。

      例如,如果您发现通常用于讽刺的词语,可能希望立即停止。讽刺的单词或短语将因词库和语料库而异。就目前而言,我们将把停止词当作不含任何含义的词,我们要把它们删除。

      您可以轻松地实现它,通过存储您认为是停止词的单词列表。 NLTK 用一堆他们认为是停止词的单词,来让你起步,你可以通过 NLTK 语料库来访问它:

    from nltk.corpus import stopwords​

    这里是这个列表:

    >>> set(stopwords.words('english'))
    {'ourselves', 'hers', 'between', 'yourself', 'but', 'again', 'there', 'about', 'once', 'during', 'out', 'very', 'having', 'with', 'they', 'own', 'an', 'be', 'some', 'for', 'do', 'its', 'yours', 'such', 'into', 'of', 'most', 'itself', 'other', 'off', 'is', 's', 'am', 'or', 'who', 'as', 'from', 'him', 'each', 'the', 'themselves', 'until', 'below', 'are', 'we', 'these', 'your', 'his', 'through', 'don', 'nor', 'me', 'were', 'her', 'more', 'himself', 'this', 'down', 'should', 'our', 'their', 'while', 'above', 'both', 'up', 'to', 'ours', 'had', 'she', 'all', 'no', 'when', 'at', 'any', 'before', 'them', 'same', 'and', 'been', 'have', 'in', 'will', 'on', 'does', 'yourselves', 'then', 'that', 'because', 'what', 'over', 'why', 'so', 'can', 'did', 'not', 'now', 'under', 'he', 'you', 'herself', 'has', 'just', 'where', 'too', 'only', 'myself', 'which', 'those', 'i', 'after', 'few', 'whom', 't', 'being', 'if', 'theirs', 'my', 'against', 'a', 'by', 'doing', 'it', 'how', 'further', 'was', 'here', 'than'}​

    以下是结合使用stop_words集合,从文本中删除停止词的方法:

    from nltk.corpus import stopwords
    from nltk.tokenize import word_tokenize
    
    
    example_sent = "This is a sample sentence, showing off the stop words filtration."
    
    stop_words = set(stopwords.words('english'))
    
    word_tokens = word_tokenize(example_sent)
    
    filtered_sentence = [w for w in word_tokens if not w in stop_words]
    
    filtered_sentence = []
    
    for w in word_tokens:
        if w not in stop_words:
            filtered_sentence.append(w)
    
    print(word_tokens)
    print(filtered_sentence)

      我们的输出是:

    ['This', 'is', 'a', 'sample', 'sentence', ',', 'showing', 'off', 'the', 'stop', 'words', 'filtration', '.']
    ['This', 'sample', 'sentence', ',', 'showing', 'stop', 'words', 'filtration', '.']​

      我们的数据库感谢了我们。数据预处理的另一种形式是“词干提取(Stemming)”,这就是我们接下来要讨论的内容。

    8. NLTK 词干提取

      词干的概念是一种规范化方法。 除涉及时态之外,许多词语的变体都具有相同的含义。

      我们提取词干的原因是为了缩短查找的时间,使句子正常化。

      考虑:

    I was taking a ride in the car.
    I was riding in the car.​

              这两句话意味着同样的事情。 in the car(在车上)是一样的。 I(我)是一样的。 在这两种情况下,ing都明确表示过去式,所以在试图弄清这个过去式活动的含义的情况下,是否真的有必要区分ridingtaking a ride

      不,并没有。

      这只是一个小例子,但想象英语中的每个单词,可以放在单词上的每个可能的时态和词缀。 每个版本有单独的字典条目,将非常冗余和低效,特别是因为一旦我们转换为数字,“价值”将是相同的。

      最流行的瓷感提取算法之一是 Porter,1979 年就存在了。

      首先,我们要抓取并定义我们的词干:

    from nltk.stem import PorterStemmer
    from nltk.tokenize import sent_tokenize, word_tokenize
    
    ps = PorterStemmer()​

          现在让我们选择一些带有相似词干的单词,例如:

    example_words = ["python","pythoner","pythoning","pythoned","pythonly"]​

          下面,我们可以这样做来轻易提取词干:  

    for w in example_words:
        print(ps.stem(w))

          我们的输出:

    python
    python
    python
    python
    pythonli​

         现在让我们尝试对一个典型的句子,而不是一些单词提取词干:  

    new_text = "It is important to by very pythonly while you are pythoning with python. All pythoners have pythoned poorly at least once."
    words = word_tokenize(new_text)
    
    for w in words:
        print(ps.stem(w))
    现在我们的结果为:
    It
    is
    import
    to
    by
    veri
    pythonli
    while
    you
    are
    python
    with
    python
    .
    All
    python
    have
    python
    poorli
    at
    least
    onc
    .​
    接下来,我们将讨论 NLTK 模块中一些更高级的内容,词性标注,其中我们可以使用 NLTK 模块来识别句子中每个单词的词性。

      9. 参考

        利用NLTK进行分词

        自然语言处理 | NLTK英文分词尝试

        NLTK最详细功能介绍

      

更多内容请访问:IT源点

相关文章推荐

全部评论: 0

    我有话说: