标签分类
当前位置:首页 > > Python电子书网盘下载
精通Python自然语言处理(Deepti) 精通Python自然语言处理(Deepti)
码小辫

码小辫 提供上传

资源
24
粉丝
44
喜欢
241
评论
6

    精通Python自然语言处理(Deepti) PDF 原书中文高清版

    Python电子书
    • 发布时间:

    给大家带来的一篇关于Python相关的电子书资源,介绍了关于Python、自然语言方面的内容,本书是由人民邮电出版社出版,格式为PDF,资源大小16 MB,印度编写,目前豆瓣、亚马逊、当当、京东等电子书综合评分为:9.8

  • 精通Python自然语言处理(Deepti) PDF 下载
  • 下载地址:https://pan.baidu.com/s/1M4Mgtu-yh3aSSWDUAB0Zyw
  • 分享码:a7j3
  • 读者评价

    《精通Python自然语言处理》提供了非常易学的自然语言处理入门介绍,该领域涵盖从文本和电子邮件预测过滤,到自动总结和翻译等多种语言处理技术。在《精通Python自然语言处理》中,你将学会编写Python程序处理大量非结构化文本。你还将通过使用综合语言数据结构访问含有丰富注释的数据集,理解用于分析书面通信内容和结构的主要算法。
    《精通Python自然语言处理》准备了充足的示例和练习,可以帮助你:
    从非结构化文本中抽取信息,甚至猜测主题或识别“命名实体”;
    分析文本语言结构,包括解析和语义分析;
    访问流行的语言学数据库,包括WordNet和树库(treebank);
    从多种语言学和人工智能领域中提取的整合技巧。
    《精通Python自然语言处理》将帮助你学习运用Python编程语言和自然语言工具包(NLTK)获得实用的自然语言处理技能。如果对于开发Web应用、分析多语言新闻源或记录濒危语言感兴趣——即便只是想从程序员视角观察人类语言如何运作,你将发现《Python自然语言处理》是一本令人着迷且极为有用的好书。

    编辑推荐

    自然语言处理(NLP)是有关计算语言学与人工智能的研究领域之一。NLP主要关注人机交互,它提供了计算机和人类之间的无缝交互,使得计算机在机器学习的帮助下理解人类语言。 本书详细介绍如何使用Python执行各种自然语言处理(NLP)任务,并帮助读者掌握利用Python设计和构建基于NLP的应用的zui佳实践。本书引导读者应用机器学习工具来开发各种各样的模型。对于训练数据的创建和主要NLP应用的实现,例如命名实体识别、问答系统、语篇分析、词义消歧、信息检索、情感分析、文本摘要以及指代消解等,本书都进行了清晰的介绍。

    本书有助于读者使用NLTK创建NLP项目并成为相关领域的专家。 通过阅读本书,你将能够:

    ● 实现字符串匹配算法以及标准化技术;

    ● 实现统计语言建模技术;

    ● 深刻理解词干提取器、词形还原器、形态分析器以及形态生成器的开发;

    ● 开发搜索引擎并实现词性标注和统计建模(包含n-gram方法)等相关概念;

    ● 熟悉诸如树型库建设、CFG建设、CYK以及Earley线图解析算法等相关概念;

    ● 开发基于NER的系统并理解和应用情感分析的相关概念;

    ● 理解并实现信息检索和文本摘要等相关概念;

    ● 开发语篇分析系统以及基于指代消解的系统。

    内容介绍

    自然语言处理是计算语言学和人工智能之中与人机交互相关的领域之一。 本书是学习自然语言处理的一本综合学习指南,介绍了如何用Python实现各种NLP任务,以帮助读者创建基于真实生活应用的项目。全书共10章,分别涉及字符串操作、统计语言建模、形态学、词性标注、语法解析、语义分析、情感分析、信息检索、语篇分析和NLP系统评估等主题。 本书适合熟悉Python语言并对自然语言处理开发有一定了解和兴趣的读者阅读参考。

    内容节选

    Python中一些自然语言工具的使用的入门教程

    NLTK 是使用 Python 教学以及实践计算语言学的极好工具。此外,计算语言学与人工 智能、语言/专门语言识别、翻译以及语法检查等领域关系密切。
    NLTK 包括什么

    NLTK 会被自然地看作是具有栈结构的一系列层,这些层构建于彼此基础之上。那些熟悉人工语言(比如 Python)的文法 和解析的读者来说,理解自然语言模型中类似的 —— 但更深奥的 —— 层不会有太大困难。
    术语表

    全集(Corpora):相关文本的集合。例如,莎士比亚的作品可能被统称为一个 文集(corpus); 而若干个作者的作品称为 全集。

    直方图(Histogram):数据集中不同单词、字母或其他条目的出现频率的统计分布。

    结构(Syntagmatic):对语段的研究;也就是全集中字母、单词或短语连续出现的统计关系。

    上下文无关语法(Context-free grammar): 由四类形式语法构成的 Noam Chomsky 层级中的第二类。参阅 参考资料 以获得 详尽描述。

    尽管 NLTK 附带了很多已经预处理(通常是手工地)到不同程度的全集,但是概念上每一层 都是依赖于相邻的更低层次的处理。首先是断词;然后是为单词加上 标签;然后将成组 的单词解析为语法元素,比如名词短语或句子(取决于几种技术中的某一种,每种技术都有其优缺点); 最后对最终语句或其他语法单元进行分类。通过这些步骤,NLTK 让您可以生成关于不同元素出现情况 的统计,并画出描述处理过程本身或统计合计结果的图表。

    在本文中,您将看到关于低层能力的一些相对完整的示例,而对大部分高层次能力将只是进行简单抽象的描述。 现在让我们来详细分析文本处理的首要步骤。

    断词(Tokenization)

    您可以使用 NLTK 完成的很多工作,尤其是低层的工作,与使用 Python 的基本数据结构来完成相比,并 没有 太 大的区别。不过,NLTK 提供了一组由更高的层所依赖和使用的系统化的接口,而不只是 简单地提供实用的类来处理加过标志或加过标签的文本。

    具体讲, nltk.tokenizer.Token 类被广泛地用于存储文本的有注解的片断;这些 注解可以标记很多不同的特性,包括词类(parts-of-speech)、子标志(subtoken)结构、一个标志(token) 在更大文本中的偏移位置、语形词干 (morphological stems)、文法语句成分,等等。实际上,一个 Token 是一种 特别的字典 —— 并且以字典形式访问 —— 所以它可以容纳任何您希望的键。在 NLTK 中使用了一些专门的键, 不同的键由不同的子程序包所使用。

    让我们来简要地分析一下如何创建一个标志并将其拆分为子标志:
    清单 1. 初识 nltk.tokenizer.Token 类

    >>> from nltk.tokenizer import *
    >>> t = Token(TEXT='This is my first test sentence')
    >>> WSTokenizer().tokenize(t, addlocs=True) # break on whitespace
    >>> print t['TEXT']
    This is my first test sentence
    >>> print t['SUBTOKENS']
    [<This>@[0:4c], <is>@[5:7c], <my>@[8:10c], <first>@[11:16c],
    <test>@[17:21c], <sentence>@[22:30c]]
    >>> t['foo'] = 'bar'
    >>> t
    <TEXT='This is my first test sentence', foo='bar',
    SUBTOKENS=[<This>@[0:4c], <is>@[5:7c], <my>@[8:10c], <first>@[11:16c],
    <test>@[17:21c], <sentence>@[22:30c]]>
    >>> print t['SUBTOKENS'][0]
    <This>@[0:4c]
    >>> print type(t['SUBTOKENS'][0])
    <class 'nltk.token.SafeToken'>
    
    

    概率(Probability)

    对于语言全集,您可能要做的一件相当简单的事情是分析其中各种 事件(events) 的 频率分布,并基于这些已知频率分布做出概率预测。NLTK 支持多种基于自然频率分布数据进行概率预测的方法。 我将不会在这里介绍那些方法(参阅 参考资料 中列出的概率教程), 只要说明您肯定会 期望的那些与您已经 知道的 那些(不止是显而易见的 缩放比例/正规化)之间有着一些模糊的关系就够了。

    基本来讲,NLTK 支持两种类型的频率分布:直方图和条件频率分布(conditional frequency)。 nltk.probability.FreqDist 类用于创建直方图;例如, 可以这样创建一个单词直方图:
    清单 2. 使用 nltk.probability.FreqDist 创建基本的直方图

    >>> from nltk.probability import *
    >>> article = Token(TEXT=open('cp-b17.txt').read())
    >>> WSTokenizer().tokenize(article)
    >>> freq = FreqDist()
    >>> for word in article['SUBTOKENS']:
    ...   freq.inc(word['TEXT'])
    >>> freq.B()
    1194
    >>> freq.count('Python')
    12
    
    

    概率教程讨论了关于更复杂特性的直方图的创建,比如“以元音结尾的词后面的词的长度”。 nltk.draw.plot.Plot 类可用于直方图的可视化显示。当然, 您也可以这样分析高层次语法特性或者甚至是与 NLTK 无关的数据集的频率分布。

    条件频率分布可能比普通的直方图更有趣。条件频率分布是一种二维直方图 —— 它按每个初始条件或者“上下文”为您显示 一个直方图。例如,教程提出了一个对应每个首字母的单词长度分布问题。我们就以这样分析:
    清单 3. 条件频率分布:对应每个首字母的单词长度

    >>> cf = ConditionalFreqDist()
    >>> for word in article['SUBTOKENS']:
    ...   cf[word['TEXT'][0]].inc(len(word['TEXT']))
    ...
    >>> init_letters = cf.conditions()
    >>> init_letters.sort()
    >>> for c in init_letters[44:50]:
    ...   print "Init %s:" % c,
    ...   for length in range(1,6):
    ...     print "len %d/%.2f," % (length,cf[c].freq(n)),
    ...   print
    ...
    Init a: len 1/0.03, len 2/0.03, len 3/0.03, len 4/0.03, len 5/0.03,
    Init b: len 1/0.12, len 2/0.12, len 3/0.12, len 4/0.12, len 5/0.12,
    Init c: len 1/0.06, len 2/0.06, len 3/0.06, len 4/0.06, len 5/0.06,
    Init d: len 1/0.06, len 2/0.06, len 3/0.06, len 4/0.06, len 5/0.06,
    Init e: len 1/0.18, len 2/0.18, len 3/0.18, len 4/0.18, len 5/0.18,
    Init f: len 1/0.25, len 2/0.25, len 3/0.25, len 4/0.25, len 5/0.25,
    
    

    条件频率分布在语言方面的一个极好应用是分析全集中的语段分布 —— 例如,给出一个特定的 词,接下来最可能出现哪个词。当然,语法会带来一些限制;不过,对句法选项的选择的研究 属于语义学、语用论和术语范畴。

    词干提取(Stemming)

    nltk.stemmer.porter.PorterStemmer 类是一个用于从英文单词中 获得符合语法的(前缀)词干的极其便利的工具。这一能力尤其让我心动,因为我以前曾经用 Python 创建了一个公用的、全文本索引的 搜索工具/库(见 Developing a full-text indexer in Python 中的描述,它已经用于相当多的其他项目中)。

    尽管对大量文档进行关于一组确切词的搜索的能力是非常实用的( gnosis.indexer 所做的工作), 但是,对很多搜索用图而言,稍微有一些模糊将会有所帮助。也许,您不能特别确定您正在寻找的电子邮件是否使用了单词 “complicated”、“complications”、“complicating”或者“complicates”,但您却记得那是大概涉及的内容(可能与其他一些 词共同来完成一次有价值的搜索)。

    NLTK 中包括一个用于单词词干提取的极好算法,并且让您可以按您的喜好定制词干提取算法:
    清单 4. 为语形根(morphological roots)提取单词词干

    >>> from nltk.stemmer.porter import PorterStemmer
    >>> PorterStemmer().stem_word('complications')
    'complic'
    
    

    实际上,您可以怎样利用 gnosis.indexer 及其衍生工具或者完全不同的索引工具中的词干 提取功能,取决于您的使用情景。幸运的是,gnosis.indexer 有一个易于进行专门定制的 开放接口。您是否需要一个完全由词干构成的索引?或者您是否在索引中同时包括完整的单词 和词干?您是否需要将结果中的词干匹配从确切匹配中分离出来?在未来版本的 gnosis.indexer 中我将引入一些种类词干的提取能力,不过,最终用户可能仍然希望进行不同的定制。

    无论如何,一般来说添加词干提取是非常简单的:首先,通过特别指定 gnosis.indexer.TextSplitter 来从一个文档中获得词干;然后, 当然执行搜索时,(可选地)在使用搜索条件进行索引查找之前提取其词干,可能是通过定制 您的 MyIndexer.find() 方法来实现。

    在使用 PorterStemmer 时我发现 nltk.tokenizer.WSTokenizer 类确实如教程所警告的那样不好用。它可以胜任概念上的角色,但是对于实际的文本而言,您可以更好地识别出什么是一个 “单词”。幸运的是, gnosis.indexer.TextSplitter 是一个健壮的断词工具。例如:
    清单 5. 基于拙劣的 NLTK 断词工具进行词干提取

    >>> from nltk.tokenizer import *
    >>> article = Token(TEXT=open('cp-b17.txt').read())
    >>> WSTokenizer().tokenize(article)
    >>> from nltk.probability import *
    >>> from nltk.stemmer.porter import *
    >>> stemmer = PorterStemmer()
    >>> stems = FreqDist()
    >>> for word in article['SUBTOKENS']:
    ...   stemmer.stem(word)
    ...   stems.inc(word['STEM'].lower())
    ...
    >>> word_stems = stems.samples()
    >>> word_stems.sort()
    >>> word_stems[20:40]
    ['"generator-bas', '"implement', '"lazili', '"magic"', '"partial',
    '"pluggable"', '"primitives"', '"repres', '"secur', '"semi-coroutines."',
    '"state', '"understand', '"weightless', '"whatev', '#', '#-----',
    '#----------', '#-------------', '#---------------', '#b17:']
    
    

    查看一些词干,集合中的词干看起来并不是都可用于索引。很多根本不是实际的单词,还有其他一些是 用破折号连接起来的组合词,单词中还被加入了一些不相干的标点符号。让我们使用更好的断词工具 来进行尝试:
    清单 6. 使用断词工具中灵巧的启发式方法来进行词干提取

    >>> article = TS().text_splitter(open('cp-b17.txt').read())
    >>> stems = FreqDist()
    >>> for word in article:
    ...   stems.inc(stemmer.stem_word(word.lower()))
    ...
    >>> word_stems = stems.samples()
    >>> word_stems.sort()
    >>> word_stems[60:80]
    ['bool', 'both', 'boundari', 'brain', 'bring', 'built', 'but', 'byte',
    'call', 'can', 'cannot', 'capabl', 'capit', 'carri', 'case', 'cast',
    'certain', 'certainli', 'chang', 'charm']
    
    

    在这里,您可以看到有一些单词有多个可能的扩展,而且所有单词看起来都像是单词或者词素。 断词方法对随机文本集合来说至关重要;公平地讲,NLTK 捆绑的全集已经通过 WSTokenizer() 打包为易用且准确的断词工具。要获得健壮的实际可用的索引器,需要使用健壮的断词工具。

    添加标签(tagging)、分块(chunking)和解析(parsing)

    NLTK 的最大部分由复杂程度各不相同的各种解析器构成。在很大程度上,本篇介绍将不会 解释它们的细节,不过,我愿意大概介绍一下它们要达成什么目的。

    不要忘记标志是特殊的字典这一背景 —— 具体说是那些可以包含一个 TAG 键以指明单词的语法角色的标志。NLTK 全集文档通常有部分专门语言已经预先添加了标签,不过,您当然可以 将您自己的标签添加到没有加标签的文档。

    分块有些类似于“粗略解析”。也就是说,分块工作的进行,或者基于语法成分的已有标志,或者基于 您手工添加的或者使用正则表达式和程序逻辑半自动生成的标志。不过,确切地说,这不是真正的解析 (没有同样的生成规则)。例如:
    清单 7. 分块解析/添加标签:单词和更大的单位

    >>> from nltk.parser.chunk import ChunkedTaggedTokenizer
    >>> chunked = "[ the/DT little/JJ cat/NN ] sat/VBD on/IN [ the/DT mat/NN ]"
    >>> sentence = Token(TEXT=chunked)
    >>> tokenizer = ChunkedTaggedTokenizer(chunk_node='NP')
    >>> tokenizer.tokenize(sentence)
    >>> sentence['SUBTOKENS'][0]
    (NP: <the/DT> <little/JJ> <cat/NN>)
    >>> sentence['SUBTOKENS'][0]['NODE']
    'NP'
    >>> sentence['SUBTOKENS'][0]['CHILDREN'][0]
    <the/DT>
    >>> sentence['SUBTOKENS'][0]['CHILDREN'][0]['TAG']
    'DT'
    >>> chunk_structure = TreeToken(NODE='S', CHILDREN=sentence['SUBTOKENS'])
    (S:
     (NP: <the/DT> <little/JJ> <cat/NN>)
     <sat/VBD>
     <on/IN>
     (NP: <the/DT> <mat/NN>))
    
    

    所提及的分块工作可以由 nltk.tokenizer.RegexpChunkParser 类使用伪正则表达式来描述 构成语法元素的一系列标签来完成。这里是概率教程中的一个例子:
    清单 8. 使用标签上的正则表达式进行分块

    >>> rule1 = ChunkRule('<DT>?<JJ.*>*<NN.*>',
    ...        'Chunk optional det, zero or more adj, and a noun')
    >>> chunkparser = RegexpChunkParser([rule1], chunk_node='NP', top_node='S')
    >>> chunkparser.parse(sentence)
    >>> print sent['TREE']
    (S: (NP: <the/DT> <little/JJ> <cat/NN>)
     <sat/VBD> <on/IN>
     (NP: <the/DT> <mat/NN>))
    
    

    真正的解析将引领我们进入很多理论领域。例如,top-down 解析器可以确保找到每一个可能的产品,但 可能会非常慢,因为要频繁地(指数级)进行回溯。Shift-reduce 效率更高,但是可能会错过一些产品。 不论在哪种情况下,语法规则的声明都类似于解析人工语言的语法声明。本专栏曾经介绍了其中的一些: SimpleParse 、 mx.TextTools 、 Spark 和 gnosis.xml.validity (参阅 参考资料)。

    甚至,除了 top-down 和 shift-reduce 解析器以外,NLTK 还提供了“chart 解析器”,它可以创建部分假定, 这样一个给定的序列就可以继而完成一个规则。这种方法可以是既有效又完全的。举一个生动的(玩具级的)例子:
    清单 9. 为上下文无关语法定义基本的产品

    >>> from nltk.parser.chart import *
    >>> grammar = CFG.parse('''
    ...  S -> NP VP
    ...  VP -> V NP | VP PP
    ...  V -> "saw" | "ate"
    ...  NP -> "John" | "Mary" | "Bob" | Det N | NP PP
    ...  Det -> "a" | "an" | "the" | "my"
    ...  N -> "dog" | "cat" | "cookie"
    ...  PP -> P NP
    ...  P -> "on" | "by" | "with"
    ...  ''')
    >>> sentence = Token(TEXT='John saw a cat with my cookie')
    >>> WSTokenizer().tokenize(sentence)
    >>> parser = ChartParser(grammar, BU_STRATEGY, LEAF='TEXT')
    >>> parser.parse_n(sentence)
    >>> for tree in sentence['TREES']: print tree
    (S:
     (NP: <John>)
     (VP:
      (VP: (V: <saw>) (NP: (Det: <a>) (N: <cat>)))
      (PP: (P: <with>) (NP: (Det: <my>) (N: <cookie>)))))
    (S:
     (NP: <John>)
     (VP:
      (V: <saw>)
      (NP:
       (NP: (Det: <a>) (N: <cat>))
       (PP: (P: <with>) (NP: (Det: <my>) (N: <cookie>))))))
    
    

    probabilistic context-free grammar(或者说是 PCFG)是一种上下文无关语法, 它将其每一个产品关联到一个概率。同样,用于概率解析的解析器也捆绑到了 NLTK 中。

    您在等待什么?

    NLTK 还有其他本篇简短介绍中不能涵盖的重要功能。例如,NLTK 有一个完整的框架,用于通过类似于“naive Bayesian” 和“maximum entropy”等模型的统计技术进行文本分类。 即使还有篇幅,现在我也还不能解释其本质。不过,我认为,即使是 NLTK 较低的层,也可以成为一个既可用于教学应用程序 也可用于实际应用程序的实用框架。

    目录

    • 第1章 字符串操作 1
    • 第2章 统计语言建模 21
    • 第3章 形态学:在实践中学习 47
    • 第4章 词性标注:单词识别 62
    • 第5章 语法解析:分析训练资料 81
    • 第6章 语义分析:意义很重要 103
    • 第7章 情感分析:我很快乐 128
    • 第8章 信息检索:访问信息 160
    • 第9章 语篇分析:理解才是可信的 178
    • 第10章 NLP系统评估:性能分析 189

    上一篇:跟老齐学Python:Django实战  下一篇:Python和HDF5大数据应用

    展开 +

    收起 -

    Python相关电子书
    学习笔记

    Copyright 2018-2019 xz577.com 码农之家

    版权责任说明