您的位置:首页 > 编程语言 > Python开发

python-nlp-学到的一点东西

2017-03-24 15:46 471 查看
//2017/3/24

1、加载一些要用的文本:from nltk.book import *

就是从NLTK的book模块加载所有的文本数据。

2、词语索引视图:显示一个指定单词的所有的出现地方,并将它出现的上下文显示出来:

text1.concordance('monstrous'),其中text1就是nltk.book里的数据,而monstrous就是要查看的单词。

结果:***the monstrous pictures***

3、查找上下文相似的其它词:

在2中,通过输入单词monstrous查找到这个词出现的上下文信息,而上下文相似的其它词就是跟monstrous的上下文结构相似的词:

text1.similar('monstrous')。

4、两个或两个以上的词共同的上下文:

text2.common_contexts(['monstrous','very'])

结果:be_glad   am_glad   a_pretty   is_pretty   a_lucky(这些都是上下文)

意思就是text2中出现了  即be  monstrous glad,又出现了be very glad,即出现了am monstrous pretty又出现了am very glad等等等等。。。

5、使用离散图显示出指定的某个单词在整个文本中的位置:

text4.dispersion_plot(['citizens','democracy','freedom','duties','America'])

6、产生随机文本:

text1.generate():重复使用text1中的词汇,产生与其风格一样的随机文本。

7、获取文本的长度:

len(text3)

8、计算一个特定的词在文本中占据的百分比:

100*text3.count('smote')/len(text3)

//2017/3/29

1、NLTK中统计文本中的词频的函数:

fdist1 = FreqDist(text1),fdist1中包含总的词数(词数x频数),而vocabulary1=fdist1.keys()就是文本中所有的单词(包括符号),而找到某个词出现的频数:fdist1['单词']。

2、画出词汇的累积频率图:

fdist1.plot(50,cumulative=True),50就是fdist1中的前50个词,cumulative就是累积的意思。

3、与高频词相对应的低频词(只出现一次的词——hapaxes):

通过fdist1.hapaxes()查看这些词。

4、有时候可以研究那些指定长度的单词

5、在文本词汇中提取双连词:

bigrams(['more','is','said','than','done']):[('more','is'),('is','said'),('said','than'),('than','done')]

6、找到文本中频繁!!!出现的双连词:

text4.collocations()

7、还可以对文本中单词的长度进行统计。

8、NLTK频率分布类中定义的函数:





9、又见条件表达式:

[w for w in text if condition]

10、测试词汇的各种属性的函数:



11、自然语言处理中的一些语言理解技术:

a)词义消岐:算出特定上下文中的词被赋予的是哪个意思。

b)指代消解:检测主语和动词的宾语。

//2017/3/30

c)自动生成语言:在自动问答中,一台机器要能够回答用户关于特定文本集的问题。在机器翻译中,机器要能够把文本翻译成另一种语言文字,并准确传达原文的意思。

1、NLTK古腾堡项目语料库阅读器的一些访问方法:

gutenberg.raw()、gutenberg.words()、gutenberg.sents()

2、NLTK网络文本小集合语料库:

from nltk.corpus import webtext

3、即时消息聊天会话语料库:

from nltk.corpus import nps_chat

4、布朗语料库:

from nltk.corpus import brown

brown.categories(),nltk提供了带条件的频率分布函数:nltk.conditionalFreqDist()

5、路透社语料库:

from nltk.corpus import reuters

6、就职演说语料库:

from nltk.corpus import inaugural

//2017/4/1

1、文本语料库的常见结构:



2、NLTK中定义的基本语料库函数:



3、条件概率分布:

使用NLTK的ConditionalFreqDist实现:



4、检查条件概率分布:

cfd=nltk.ConditionalFreqDist(genre_word);  cfd.conditions():['news','romance'],还可以cfd['news']、cfd['romance']

5、对plot和tabulate()的绘制限制:

a)conditions=parameter来指定哪些条件显示;

b)使用samples=parameter来限制要显示的样本。

其中tabulate的绘制样式:



5、LTK 中的条件频率分布: 定义、访问和可视化一个计数的条件频率分布的常用方法和习惯用法:



6、词典术语:



7、查找两个voca_set中不同的单词:

differents = voca_set1.difference(voca_set2)

//2017/4/5

1、发音的词典:

美国英语的CMU发音词典,它是为语音合成器使用而设计的:

nltk.corpus.cumdict.entires()

2、比较词表:

表格词典的另一个例子是比较词表,NLTK中包含了所谓的斯瓦迪士核心词汇列表(swadesh wordlists):

from nltk.corpus import swadesh





//2017/4/6

1、词汇工具: Toolbox和 Shoebox:

from nltk.corpus import toolbox

2、WordNet是面向语义的英语词典, 类似与传统辞典, 但具有更丰富的结构。

3、同义词:句子中所有其他成分都保持不变, 我们可以得出结论: motorcar和 automobile有相同的含义即它们是同义词。:

from nltk.corpus import wordnet as wn

>wn.synsets('motorcar')

[Synset('car.n.01')]

因此, motorcar只有一个可能的含义,它被定义为 car.n.01, car的第一个名词意义。car.n.01被称为synset或“ 同义词集”,意义相同的词(或“ 词条”)的集合:

>>>wn.synset('car.n.01').lemma_names

['car','auto','automobile','machine','motorcar']

同义词集也有一些一般的定义和例句:

>>>wn.synset('car.n.01').definition

'amotorvehicle withfourwheels; usually propelled byan internal combustion engine'

>>>wn.synset('car.n.01').examples

['heneeds a cartoget towork']

4、词条:

为了消除歧义, 我们将这些词标注为 car.n.01.automobile, car.n.01.motorcar等。这种同义词集和词的配对叫做词条。

我们可以得到指定同义词集的所有词条, 查找特定的词条,得到一个词条对应的同义词集,也可以得到一个词条的“名字”。

5、wordnet概念层次:



6、下位词:

wordNet使在概念之间漫游变的容易。 例如: 一个如摩托车这样的概念, 我们可以看到它的更加具体(直接)的概念——下位词。

7、词汇关系:

上位词和下位词被称为词汇关系, 因为它们是同义集之间的关系。这个关系定位上下为“ 是一个”层次。

8、 一些动词有多个蕴涵:

>>> wn.synset('walk.v.01').entailments()

[Synset('step.v.01')]

9、词条之间的一些词汇关系,如: 反义词:

>>> wn.lemma('supply.n.02.supply').antonyms()

[Lemma('demand.n.02.demand')]

10、语义相似度:

我们已经看到同义词集之间构成复杂的词汇关系网络。给定一个同义词集, 我们可以遍历WordNet网络来查找相关含义的同义词集。

11、path_similarityassigns是基于上位词层次结构中相互连接的概念之间的最短路径在0-1范围的打分( 两者之间没有路径就返回-1)。同义词集与自身比较将返回1。考虑以下的相似度:露脊鲸与小须鲸、 逆戟鲸、 乌龟以及小说。 数字本身的意义并不大, 当我们从海洋生物的语义空间转移到非生物时它是减少的。

//2017/4/7

1、对于语言处理, 我们要将字符串分解为词和标点符号, 正如我们在第 1章中所看到的。 这一步被称为分词, 它产生我们所熟悉的结构, 一个词汇和标点符号的链表:

tokens = nltk.word_tokenize(raw)即:tokens[:10] = ['The', 'Project', 'Gutenberg', 'EBook', 'of', 'Crime', 'and', 'Punishment', ',', 'by']

2、方法find()和rfind()(反向的 find)帮助我们得到字符串切片需要用到的正确的索引值。

3、NLTK提供了一个辅助函数nltk.clean_html()将 HTML字符串作为参数,返回原始文本:

 html = urlopen(url).read()

raw = nltk.clean_html(html)

4、我们可以追加元素到一个链表,但不能追加元素到一个字符串。

5、链表中的元素可以很大也可以很小, 只要我们喜欢。 例如: 它们可能是段落、 句子、 短语、 单词、 字符。 所以, 链表的优势是我们可以灵活的决定它包含的元素,相应的后续的处理也变得灵活。因此,我们在一段 NLP 代码中可能做的第一件事情就是将一个字符串分词放入一个字符串链表中( 3.7节)。 相反, 当我们要将结果写入到一个文件或终端,我们通常会将它们格式化为一个字符串( 3.9节)。

6、字符串是不可变的: 一旦你创建了一个字符串, 就不能改变它。 然而, 链表是可变的, 其内容可以随时修改。 

//2017/4/18

1、上位词和下位词被称为词汇关系, 因为它们是同义集之间的关系。这个关系定位上下为“ 是一个”层次。

2、 WordNet网络另一个重要的漫游方式是从物品到它们的部件( 部分) 或到它们被包含其中的东西( 整体):

例子:

一棵树的部分是它的树干,树冠等;这些都是 part_meronyms()。 一棵树的实质是包括心材和边材组成的, 即substance_meronyms()。树木的集合形成了一个森林,即member_holonyms():



3、用美元符号, 它是正则表达式中有特殊用途的符号,用来匹配单词的末尾:

[w for w in wordlist if re.search('ed$', w)]

4、通配符“ .”匹配任何单个字符。 假设我们有一个8个字母组成的词的字谜室, j是其第三个字母, t是其第六个字母。空白单元格中的每个地方,我们用一个句点:

 [w for w in wordlist if re.search('^..j..t..$', w)]

5、插入符号“ ^” 匹配字符串的开始。

6、符号“ ?”表示前面的字符是可选的。 因此«^e-?mail $»将匹配 email和 e-mail。

7、«^[ghi][mno][jlk][def]$»:

«^[ghi]»匹配以g、 h或i开始的词。表达式的下一部分: «[mno]»限制了第二个字符是m、 n或o。第三部分和第四部分也是限制。四个字母要满足所有这些限制。

8、“ +” 表示的是“ 前面的项目的一个或多个实例,” 它可以是单独的字母如 m,可以是一个集合如[fed], 可以是一个范围如[d-f]。 现在让我们用“ *”替换“ +”, 它表示“ 前面的项目的零个或多个实例。”

9、算符“ ^” 当它出现在方括号内的第一个字符位置时有另外的功能。例如: «[^aeiouAEIOU]»匹配除元音字母之外的所有字母。

10、。 大括号表达式,如{3,5}, 表示前面的项目重复指定次数。

11、圆括号表示一个操作符的范围,它们可以与管道(或叫析取)符号一起使用,如:«w(i|e|ai|oo)t», 匹配wit、 wet、 wait和woot。 

//2017/4/19

1、英文文本是高度冗余的, 忽略掉词内部的元音仍然可以很容易的阅读, 有些时候这很明显。例如: declaration变成 dclrtn, inalienable变成 inlnble, 保留所有词首或词尾的元音序列。

2、对于一些语言处理任务, 我们想忽略词语结尾, 只是处理词干。

3、如果我们要使用括号来指定连接的范围, 但不想选择要输出的字符串,必须添加“ ?:”,它是许多神秘奥妙的正则表达式之一。



4、想将词分成词干和后缀。 所以, 我们应该只是用括号括起正则表达式的这两个部分:

>> re.findall(r'^(.*)(ing|ly|ed|ious|ies|ive|es|s|ment)$', 'processing')

>>[('process', 'ing')]

5、这表明另一个微妙之处:“ *”操作符是“ 贪婪的”,所以表达式的“ .*” 部分试图尽可能多的匹配输入的字符串。如果我们使用“ 非贪婪” 版本的“ *” 操作符,写成“ *?”,我们就得到我们想要的。

//2017/4/20

1、NLTK 中包括了一些现成的词干提取器, 如果你需要一个词干提取器, 你应该优先使用它们中的一个,而不是使用正则表达式制作自己的词干提取器,因为NLTK 中的词干提取器能处理的不规则的情况很广泛。 Porter和Lancaster词干提取器按照它们自己的规则剥离词缀。

2、WordNet词形归并器删除词缀产生的词都是在它的字典中的词。这个额外的检查过程使词形归并器比刚才提到的词干提取器要慢。 

3、如果你想编译一些文本的词汇,或者想要一个有效词条(或中心词)列表, WordNet词形归并器是一个不错的选择。

4、 re库内置的缩写“ \s”,它表示匹配所有空白字符。

5、在正则表达式前加字母“ r”,它告诉Python解释器按照字面表示对待字符串而不去处理正则表达式中包含的反斜杠字符 。

6、函数nltk.regexp_tokenize()与re.findall()类似(我们一直在使用它进行分词)。然而, nltk.regexp_tokenize()分词效率更高,且不需要特殊处理括号。

7、在其他情况下, 文本可能只是作为一个字符流。 在将文本分词之前, 我们需要将它分割成句子。 NLTK通过包含Punkt句子分割器(Kiss & Strunk, 2006)简化了这些。

8、对于一些书写系统,由于没有词边界的可视表示这一事实,文本分词变得更加困难。

例如: 在中文中, 三个字符的字符串: 爱国人(ai4 “ love” [verb], guo3 “ country” ,ren2 “ person” ) 可以被分词为“ 爱国/人”,“ country-loving person”,或者“ 爱/国人”,“ l

ove country-person”。

9、把输出到显示器或文件时,必须把这些词的链表转换成字符串。在Python做这些,我们使用的join()方法,并指定作为“ 胶水” 使用的字符串:

>> silly = ['We', 'called', 'him', 'Tortoise', 'because', 'he', 'taught', 'us', '.']

>>> ' '.join(silly)

'We called him Tortoise because he taught us .'

10、'  '.join(silly)的意思是:取出 silly中的所有项目,将它们连接成一个大的字符串,使用' '作为项目之间的间隔符,即join()是一个你想要用来作为胶水的字符串的一个方法。

//2017/4/21

1、一种地道和可读的移动链表内的项目的方式。它相当于下面的传统方式不使用元组做上述任务(注意这种方法需要一个临时变量tmp):





2、, zip()取两个或两个以上的序列中的项目,将它们“ 压缩” 打包成单个的配对链表。给定一个序列s,enumerate(s)返回一个包含索引和索引处项目的配对:



3、 一个链表是一个典型的具有相同类型的对象的序列, 它的长度是任意的。 我们经常使用链表保存词序列。 相反, 一个元组通常是不同类型的对象的集合, 长度固定。

4、Python中,列表是可变的,而元组是不可变的。换句话说,列表可以被修改,而元组不能。

5、设我们现在想要进一步处理这些词。我们可以将上面的表达式插入到一些其他函数的调用中①, Python允许我们省略方括号②:



第二行使用了产生器表达式。 这不仅仅是标记( 形式上看起来)方便: 在许多语言处理的案例中,产生器表达式会更高效。在①中,链表对象的存储空间必须在max()的值被计算之前分配。 如果文本非常大的, 这将会很慢。 在②中, 数据流向调用它的函数。 由于调用的函数只是简单的要找最大值——按字典顺序排在最后的词——它可以处理数据流,而无需存储迄今为止的最大值以外的任何值。

6、每行应少于80个字符长, 如果必要的话, 你可以在圆括号、 方括号或花括号内换行, 因为Python能够探测到该行与下一行是连续的。

//2017/4/24

1、确保循环变量范围的正确相当棘手的。因为这是 NLP 中的常见操作, NLTK提供了支持函数bigrams(text)、 trigrams(text)和一个更通用的ngrams(text, n)。

2、NetworkX包定义和操作被称为图的由节点和边组成的结构。NetworkX可以和 Matplotlib结合使用可视化如 WordNet的网络结构。

3、将词汇按它们的词性( parts-of-speech, POS)分类以及相应的标注它们的过程被称为词性标注( part-of-speech tagging, POS tagging)或干脆简称标注。

4、一词汇按它们的词性( parts-of-speech, POS)分类以及相应的标注它们的过程被称为词性标注( part-of-speech tagging, POS tagging)或干脆简称标记:



在这里我们看到and是 CC,并列连词; now和completely是 RB,副词; for是IN,介词; something是NN,名词; different是JJ,形容词。

5、NLTK中提供了每个标记的文档,可以使用标记来查询,如: nltk.help.upenn_tagset('RB'),或正则表达式,如: nltk.help.upenn_brown_tagset('NN.*')。

6、text.similar()方法为一个词w找出所有上下文w1ww2,然后找出所有出现在相同上下文中的词 w',即w1w'w2。

7、按照NLTK的约定, 一个已标注的标识符使用一个由标识符和标记组成的元组来表示。我们可以使用函数str2tuple()从表示一个已标注的标识符的标准字符串创建一个这样的特殊元组:

>> tagged_token = nltk.tag.str2tuple('fly/NN')

>>> tagged_token

('fly', 'NN')

>>> tagged_token[0]

'fly'

>>> tagged_token[1]

'NN'

8、只要语料库包含已标注的文本, NLTK的语料库接口都将有一个tagged_words()方法。

9、简化的标记集:





10、简化的名词标记对普通名词是N,如:书,对专有名词是NP,如苏格兰。

11、一些动词的句法模式:



12、有许多名词的变种; 最重要的含有$的名词所有格,含有 S的复数名词(因为复数名词通常以 s结尾),以及含有 P的专有名词。此外,大多数的标记都有后缀修饰符: -NC表示引用, -HL表示标题中的词, -TL表示标题( 布朗标记的特征)。

//2017/4/25

1、 Python中最自然的方式存储映射是使用所谓的字典数据类型(在其他的编程语言又称为关联数组或哈希数组)。

2、创建一个任一条目的默认值是'N'的字典①。当我们访问一个不存在的条目②时,它会自动添加到字典③:

>> pos = nltk.defaultdict(lambda: 'N') ①

>>> pos['colorless'] = 'ADJ'

>>> pos['blog'] ②

'N'

>>> pos.items()

[('blog', 'N'), ('colorless', 'ADJ')] ③

3、Python字典方法:常用的方法与字典相关习惯用法的总结:



4、一个词的标记依赖于这个词和它在句子中的上下文。

5、\可以创建一个将所有词都标注成NN的标注器:

>>> raw = 'I do not like green eggs and ham, I do not like them Sam I am!'

>>> tokens = nltk.word_tokenize(raw)

>>> default_tagger = nltk.DefaultTagger('NN')

>>> default_tagger.tag(tokens)

[('I', 'NN'), ('do', 'NN'), ('not', 'NN'), ('like', 'NN'), ('green', 'NN'),

('eggs', 'NN'), ('and', 'NN'), ('ham', 'NN'), (',', 'NN'), ('I', 'NN'),

('do', 'NN'), ('not', 'NN'), ('like', 'NN'), ('them', 'NN'), ('Sam', 'NN'),

('I', 'NN'), ('am', 'NN'), ('!', 'NN')]

标注正确了八分之一的标识符:

>>> default_tagger.evaluate(brown_tagged_sents)

0.13089484257215028

6、正则表达式标注器基于匹配模式分配标记给标识符。例如:我们可能会猜测任一以ed结尾的词都是动词过去分词, 任一以's结尾的词都是名词所有格:

>> patterns = [

... (r'.*ing$', 'VBG'), # gerunds

... (r'.*ed$', 'VBD'), # simple past

... (r'.*es$', 'VBZ'), # 3rd singular present

... (r'.*ould$', 'MD'), # modals

... (r'.*\'s$', 'NN$'), # possessive nouns

... (r'.*s$', 'NNS'), # plural nouns190

... (r'^-?[0-9]+(.[0-9]+)?$', 'CD'), # cardinal numbers

... (r'.*', 'NN') # nouns (default)

... ]

这些是顺序处理的,第一个匹配上的会被使用。现在我们可以建立一个标注器,并用它来标记一个句子。做完这一步会有约五分之一是正确的:

>>> regexp_tagger = nltk.RegexpTagger(patterns)

>>> regexp_tagger.tag(brown_sents[3])

[('``', 'NN'), ('Only', 'NN'), ('a', 'NN'), ('relative', 'NN'), ('handful', 'NN'),

('of', 'NN'), ('such', 'NN'), ('reports', 'NNS'), ('was', 'NNS'), ('received', 'VBD'),

("''", 'NN'), (',', 'NN'), ('the', 'NN'), ('jury', 'NN'), ('said', 'NN'), (',', 'NN'),

('``', 'NN'), ('considering', 'VBG'), ('the', 'NN'), ('widespread', 'NN'), ...]

>>> regexp_tagger.evaluate(brown_tagged_sents)

0.20326391789486245

7、我们找出100个最频繁的词,存储它们最有可能的标记。然后我们可以使用这个信息作为“ 查找标注器”( NLTK UnigramTagger)的模型:

>>> fd = nltk.FreqDist(brown.words(categories='news'))

>>> cfd = nltk.ConditionalFreqDist(brown.tagged_words(categories='news'))

>>> most_freq_words = fd.keys()[:100]

>>> likely_tags = dict((word, cfd[word].max()) for word in most_freq_words)

>>> baseline_tagger = nltk.UnigramTagger(model=likely_tags)

>>> baseline_tagger.evaluate(brown_tagged_sents)

0.45578495136941344

8、通过指定一个标注器作为另一个标注器的参数,如下所示。现在查找标注器将只存储名词以外的词的词-标记对,只要它不能给一个词分配标记,它将会调用默认标注器:

>>> baseline_tagger = nltk.UnigramTagger(model=likely_tags,

... backoff=nltk.DefaultTagger('NN'))

9、元标注器基于一个简单的统计算法:对每个标识符分配这个独特的标识符最有可能的标记。

10、我们训练一个一元标注器,用它来标注一个句子,然后评估:

>>> from nltk.corpus import brown

>>> brown_tagged_sents = brown.tagged_sents(categories='news')

>>> brown_sents = brown.sents(categories='news')

>>> unigram_tagger = nltk.UnigramTagger(brown_tagged_sents)

>>> unigram_tagger.tag(brown_sents[2007])

[('Various', 'JJ'), ('of', 'IN'), ('the', 'A T'), ('apartments', 'NNS'),

('are', 'BER'), ('of', 'IN'), ('the', 'A T'), ('terrace', 'NN'), ('type', 'NN'),

(',', ','), ('being', 'BEG'), ('on', 'IN'), ('the', 'AT'), ('ground', 'NN'),

('floor', 'NN'), ('so', 'QL'), ('that', 'CS'), ('entrance', 'NN'), ('is', 'BEZ'),

('direct', 'JJ'), ('.', '.')]

>>> unigram_tagger.evaluate(brown_tagged_sents)

0.9349006503968017

我们训练一个 UnigramTagger,通过在我们初始化标注器时指定已标注的句子数据作为参数。训练过程中涉及检查每个词的标记,将所有词的最可能的标记存储在一个字典里面,这个字典存储在标注器内部。

//2017/4/26

1、调查标注器性能的另一种方法是研究它的错误。有些标记可能会比别的更难分配,可能需要专门对这些数据进行预处理或后处理。一个方便的方式查看标注错误是混淆矩阵。它用图表表示期望的标记(黄金标准)与实际由标注器产生的标记:

>>> test_tags = [tag for sent in brown.sents(categories='editorial')

...

for (word, tag) in t2.tag(sent)]

>>> gold_tags = [tag for (word, tag) in brown.tagged_words(categories='editorial')]

>>> print nltk.ConfusionMatrix(gold, test)

基于这样的分析,我们可能会决定修改标记集。或许标记之间很难做出的区分可以被丢弃,因为它在一些较大的处理任务的上下文中并不重要。

2、Brill 标注是一种基于转换的学习,以它的发明者命名。一般的想法很简单:猜每个词的标记,然后返回和修复错误的。在这种方式中,Brill 标注器陆续将一个不良标注的文本转换成一个更好的。与 n-gram 标注一样,这是有监督的学习方法,因为我们需要已标注的训练数据来评估标注器的猜测是否是一个错误。然而,不像 n-gram 标注,它不计数观察结果,只编制一个转换修正规则链表。

3、Brill 标注的的过程通常是与绘画类比来解释的。假设我们要画一棵树,包括大树枝、树枝、小枝、叶子和一个统一的天蓝色背景的所有细节。不是先画树然后尝试在空白处画蓝色,而是简单的将整个画布画成蓝色,然后通过在蓝色背景上上色“修正”树的部分。以同样的方式,我们可能会画一个统一的褐色的树干再回过头来用更精细的刷子画进一步的细

节。Brill 标注使用了同样的想法:以大笔画开始,然后修复细节,一点点的细致的改变。

4、在一般情况下,语言学家使用形态学、句法和语义线索确定一个词的类别。

//2017/5/25

1、rill标注器的另一个有趣的特性:规则是语言学可解释的。与采用潜在的巨大的 n-gram表的 n-gram标注器相比,我们并不能从直接观察这样的一个表中学到多少东西,而Brill标注器学到的规则可以。

2、在一般情况下,语言学家使用形态学、句法和语义线索确定一个词的类别。

3、形态学线索:

一个词的内部结构可能为这个词分类提供有用的线索。

4、句法线索:

一个词可能出现的典型的上下文语境。

5、语义线索:

最后, 一个词的意思对其词汇范畴是一个有用的线索。

6、词可以组成类,如名词、动词、形容词以及副词。这些类被称为词汇范畴或者词性。词性被分配短标签或者标记,如NN和VB。

7、给文本中的词自动分配词性的过程称为词性标注、 POS标注或只是标注。

8、自动标注是NLP流程中重要的一步,在各种情况下都十分有用,包括预测先前未见过的词的行为、分析语料库中词的使用以及文本到语音转换系统。

9、一些语言学语料库,如布朗语料库,已经做了词性标注。

10、有多种标注方法, 如默认标注器、正则表达式标注器、 unigram标注器、 n-gram标注器。这些都可以结合一种叫做回退的技术一起使用。

11、标注器可以使用已标注语料库进行训练和评估。

12、回退是一个组合模型的方法:当一个较专业的模型(如bigram 标注器)不能为给定内容分配标记时,我们回退到一个较一般的模型(如unigram 标注器)

13、词性标注是NLP中一个重要的早期的序列分类任务:利用局部上下文语境中的词和标记对序列中任意一点的分类决策。

14、N-gram标注器可以定义较大数值的 n,但是当n大于3时,我们常常会面临数据稀疏问题;即使使用大量的训练数据,我们看到的也只是可能的上下文的一小部分。

15、基于转换的标注学习一系列“ 改变标记s为标记 t在上下文 c中” 形式的修复规则, 每个规则会修复错误,也可能引入(较小的)错误。

//2017/6/20

1、用于实体识别的基本技术是分块(chunking),分割和标注图 7-2所示的多标识符序列。 小框显示词级标识符和词性标注, 大框显示较高级别的分块。 每个这种较大的框叫做一大块( chunk)。就像分词忽略空白符,分块通常选择标识符的一个子集。同样像分词一样,分块构成的源文本中的片段不能重叠。



2、可以建一个NP-块, 我们将首先定义一个块语法, 规则句子应如何分块,一个简单的基于正则表达式的NP分块器的例子:



3、组成一个块语法的规则使用标记模式来描述已标注的词的序列。一个标记模式是一个用尖括号分隔的词性标记序列,如<DT>?<JJ>*<NN>。标记模式类似于正则表达式模式。

4、可以为不包括在一大块中的一个标识符序列定义一个缝隙。加缝隙是从一大块中去除一个标识符序列的过程:

/


5、一个标识符被标注为B, 如果它标志着一个块的开始。 块内的标识符子序列被标注为I。 所有其他的标识符被标注为O。 B和I标记加块类型的后缀, 如B-NP, I-NP。 当然, 没有必要指定出现在块外的标识符的类型,所以这些都只标注为O:



6、函数chunk.conllstr2tree()用这些多行字符串(IOB格式)建立一个树表示。

//2017/6/23

1、一种最简单的分析器将一个文法作为如何将一个高层次的目标分解成几个低层次的子目标的规范来解释。 

2、NLTK提供了一个递归下降分析器:

>>> rd_parser = nltk.RecursiveDescentParser(grammar1)

>>> sent = 'Mary saw a dog'.split()

>>> for t in rd_parser.nbest_parse(sent):

... print t

(S (NP Mary) (VP (V saw) (NP (Det a) (N dog))))

其中grammar1是一个CFG

3、递归下降分析是一种自上而下分析。自上而下分析器在检查输入之前先使用文法预测输入将是什么!然而, 由于输入对分析器一直是可用的, 从一开始就考虑输入的句子会是更明智的做法。这种方法被称为自下而上分析。

4、一种简单的自下而上分析器是移进-归约分析器。 与所有自下而上的分析器一样, 移进-归约分析器尝试找到对应文法生产式右侧的词和短语的序列, 用左侧的替换它们, 直到整个句子归约为一个S。

5、移位-规约分析器反复将下一个输入词推到堆栈( 见 4.1节), 这是移位操作。 如果堆栈上的前n项, 匹配一些产生式的右侧的n个项目, 那么就把它们弹出栈, 并把产生式左边的项目压入栈。这种替换前n项为一项的操作就是规约操作。此操作只适用于堆栈的顶部;规约栈中的项目必须在后面的项目被压入栈之前做。当所有的输入都使用过, 堆栈中只剩余一个项目,也就是一颗分析树作为它的根的S节点时,分析器完成。移位-规约分析器通过上述过程建立一颗分析树。 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: