自然语言10_分类与标注

sklearn实战-乳腺癌细胞数据挖掘(博客主亲自录制视频教程)

https://study.163.com/course/introduction.htm?courseId=1005269003&utm_campaign=commission&utm_source=cp-400000000398149&utm_medium=share

http://www.tuicool.com/articles/feAfi2

NLTK读书笔记 — 分类与标注

0. 本章所关注的问题

  • (1) 什么是lexical categories,怎样将它们应用于NLP?
  • (2) 什么样的python数据结构更适合存储词和它们的类别?
  • (3) 我们怎样自动地给词做标注

另外,本章还会包含NLP中一些基础的技术: sequence labeling ,  n-gram models ,  backoff , evaluation

在典型的NLP中,第一步是将文本流切分成语义单元( tokenization 如分词), 第二步就是词性标注( POS tagging )

1. 使用Tagger工具

>>> import nltk

>>> text = nltk.word_tokenize(“And now for something completely different”)

>>> nltk.pos_tag(text)

POS-tagger处理一个词序列,并且给每个词标定一个词性,以列表的形式返回

2. Tagged Corpora

(1) 重表达标记的token

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

>>> tagged_token[0] == ‘fly’

>>> tagged_token[1] == ‘NN’

>>> [nltk.tag.str2tuple(t) for t in sent.split()]

(2) 读取标记的语料库

NLTK的corpus reader提供一个唯一的读取标记语料库的接口 tagged_words ():

>>> nltk.corpus.brown.tagged_words()>>> nltk.corpus.brown.tagged_words(simplify_tags=True)

NLTK中还包括中文的语料库 — Unicode编码;若语料库同时还按句切分过,那么它将会有一个tagged_sents()方法

(3) 简化的POS Tagset

TagMeaningExamples
ADJ adjectivenew, good, high, special, big, local
ADV adverbreally, already, still, early, now
CNJ conjunctionand, or, but, if, while, although
DET determinerthe, a, some, most, every, no
EX existentialthere, there’s
FW foreign worddolce, ersatz, esprit, quo, maitre
MOD modal verbwill, can, would, may, must, should
N nounyear, home, costs, time, education
NP proper nounAlison, Africa, April, Washington
NUM numbertwenty-four, fourth, 1991, 14:24
PRO pronounhe, their, her, its, my, I, us
P prepositionon, of, at, with, by, into, under
TO the word toto
UH interjectionah, bang, ha, whee, hmpf, oops
V verbis, has, get, do, make, see, run
VD past tensesaid, took, told, made, asked
VG present participlemaking, going, playing, working
VN past participlegiven, taken, begun, sung
WH wh determinerwho, which, when, what, where, how

>>> from nltk.corpus import brown

>>> brown_news_tagged = brown.tagged_words(categories=’news’, simplify_tags=True)

>>> tag_fd = nltk.FreqDist(tag for (word, tag) in brown_news_tagged)

>>> tag_fd.keys()

名词 Nons: 通常指代人、地点、事情、概念

动词 Verbs: 用以描述事件和行为

形容词和副词 Adjectives and Adverbs: 形容词用来描述名词,副词用来描述动词…

>>> wsj = nltk.corpus.treebank.tagged_words(simplify_tags = True)

>>> word_tag_fd = nltk.FreqDist(wsj)

>>> [word + “/” + tag for (word, tag) in word_tag_fd if tag.startwith(‘V’)]

(5) 使用标注语料库

>>> brown_learned_text = brown.words(categories=’learned’)

>>> sorted(set(b for (a, b) in nltk.ibigrams(brown_learned_text) if a == ‘often’))

>>> brown_lrnd_tagged = brown.tagged_words(categories=’learned’, simplify_tags=True)

>>> tags = [b[1] for (a, b) in nltk.ibigrams(brown_lrnd_tagged) if a[0] == ‘often’]

>>> fd = nltk.FreqDist(tags)

>>> fd.tabulate()

>>> brown_news_tagged = brown.tagged_words(categories=’news’, simplify_tags=True)

>>> data = nltk.ConditionalFreqDist((word.lower(), tag)

…                                 for (word, tag) in brown_news_tagged)

>>> for word in data.conditions():

…     if len(data[word]) > 3:

…         tags = data[word].keys()

…         print word, ‘ ‘.join(tags)

3. 使用Python的词典将词与属性之间建立映射

POS-Tagging中每个词都会对应一个tag, 很自然地,要建立词与属性的映射

python的dict提供一种defaultdict,nltk也提供一种 nltk.defauldict ,这样使得使用不在dict中的key取value时不抛出异常,而给出默认值

key和value都可以很复杂

4. Automatic Tagging 自动标注

>>> from nltk.corpus import brown

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

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

(1) The Default Tagger

最简单的标注方法就是为每个token标注同样地tag — 把most likely tag标注给每个token是最“懒”的简便方法:

>>> tags = [tag for (word, tag) in brown.tagged_words(categories=’news’)]>>> nltk.FreqDist(tags).max()

执行这两句发现最常见的tag是’NN’

下面就创建一个tagger把所有的token都标为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)

当然这种tagger的实际效果很差:

>>> default_tagger.evaluate(brown_tagged_sents)0.13089484257215028

the default tagger的作用就是 增加语言处理系统的鲁棒性

(2) The Regular Expression Tagger

使用 正则表达式 匹配的tagger

>>> 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 nouns

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

…     (r’.*’, ‘NN’)                     # nouns (default)

… ]

>>> regexp_tagger = nltk.RegexpTagger(patterns)

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

相比与默认的tagger, 正则表达式tagger的效果要好一些

>>> regexp_tagger.evaluate(brown_tagged_sents)0.20326391789486245

(3) The Lookup Tagger

我们找出100个出现频率最高的词并存储其tag — 使用这种信息作为一个”lookup tagger”的模型(在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

比之前两个,这种tagger的效果又要好一些

我们首先使用lookup table, 如果不能决定一个token的tag,我们再使用default tagger — 这个过程就称为backoff

那么这个过程怎么实现呢:将default tagger作为lookup tagger的输入参数

>>> baseline_tagger = nltk.UnigramTagger(model=likely_tags,…                                      backoff=nltk.DefaultTagger(‘NN’))

(4) 评估 Evaluation

对各种工具的评估一直是NLP的核心主题之一 — 首先,最”好”的评估方式是语言专家的评估? 另外,我们可以使用 gold standard test data进行评估

5. N-Gram Tagging N元语法标注

(1) Unigram Tagging 一元语法标注

Unigram tagger基于这样一个简单的统计算法:

for each token, assign the tag that is most likely for that particular token

简单来说,对于词frequent,总是将其标为JJ,因为它作为JJ的情形是最多的

unigram tagger的行为与lookup tagger差不多,所不同的是构建过程: unigram tagger是通过训练(training)过程构建的 — 通过将tagged sentence data作为参数初始化时传递给UnigramTagger来进行训练:

>>> 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])

>>> unigram_tagger.evaluate(brown_tagged_sents)

0.9349006503968017

(2) 将训练数据与测试数据分开

一般将数据集分开,训练90%测试10%

(3) N-Gram Tagging N元语法标注

一元语法结构只考虑当前的token,我们可以向前多看几个token来决定对当前token的标注,这就是N元语法的含义 — 考虑当前token和之前处理的n-1个token — context变大了

N-Gram Tagger中一个特殊的二元语法标注器 bigram tagger

>>> bigram_tagger = nltk.BigramTagger(train_sents)

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

>>> unseen_sent = brown_sents[4203]

>>> bigram_tagger.tag(unseen_sent)

>>> bigram_tagger.evaluate(test_sents)

0.10276088906608193

可以看出Bigram-Tagger对未见过的句子的标注非常差!

N增大时, As n gets larger, the specificity of the contexts increases, as does the chance that the data we wish to tag contains contexts that were not present in the training data. This is known as the sparse data problem, and is quite pervasive in NLP. 这就导致accuracy与coverage之间的权衡问题: precision/recall trade off

(4) Combining Taggers 标注器的组合

为了获取准确性与覆盖性之间的权衡,一种方法是使用更精确的算法,但这一般又要求算法的覆盖率同时要高

另一种方法就是使用标注器的组合:

1) 首先尝试使用bigram tagger进行标注

2) 对于bigram tagger不能标注的token, 尝试使用unigram tagger

3) 对于unigram tagger也不能标注的token, 使用default tagger

>>> t0 = nltk.DefaultTagger(‘NN’)

>>> t1 = nltk.UnigramTagger(train_sents, backoff=t0)

>>> t2 = nltk.BigramTagger(train_sents, backoff=t1)

>>> t2.evaluate(test_sents)

0.84491179108940495

(5) Tagging Unknown Words

对未知词的处理可以使用regular-expression-tagger或default-tagger作为backoff

一种有用的方法A useful method to tag unknown words based on context is to limit the vocabulary of a tagger to the most frequent n words, and to replace every other word with a special word UNK.During training, a unigram tagger will probably learn that UNK is usually a noun. However, the n-gram taggers will detect contexts in which it has some other tag. For example, if the preceding word is to (tagged TO), then UNK will probably be tagged as a verb.

(6) Storing Taggers

训练通常是个漫长的过程,将已经训练过的tagger存起来,以备以后重用

>>> from cPickle import dump

>>> output = open(‘t2.pkl’, ‘wb’)

>>> dump(t2, output, -1)

>>> output.close()

load过程如下

>>> from cPickle import load

>>> input = open(‘t2.pkl’, ‘rb’)

>>> tagger = load(input)

>>> input.close()

(7) Performance Limitations

1) 可以考虑其遇到的ambiguity

>>> cfd = nltk.ConditionalFreqDist(

…            ((x[1], y[1], z[0]), z[1])

…            for sent in brown_tagged_sents

…            for x, y, z in nltk.trigrams(sent))

>>> ambiguous_contexts = [c for c in cfd.conditions() if len(cfd[c]) > 1]

>>> sum(cfd[c].N() for c in ambiguous_contexts) / cfd.N()

0.049297702068029296

2) 可以研究其错误 — confusion matrix

>>> 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)     

基于这些判断我们就可以修改我们的tagset

6. Transformation-Based Tagging

N-Gram Tagger的table size随着N的增大而增大,下面有一种新的tagging方法:Brill tagging, 一种归纳的tagging方法,size比n-gram tagging小得多(只是它很小的一部分)

Brill tagging是一种基于状态转移的学习方法 (a kind of transformation-based leaning ),其基本思想为:猜每个词的tag, 然后回头去修正错误.这样,一个Brill tagger就连续地将一个不好的tagging转成一个好一些的,……

在n-gram tagging中,这是一个受监督的学习过程(a supervised learning method) — 我们需要使用注释好的训练数据来判断tagger的猜测是否正确

Brill tagging可以用着色问题来进行类比:假定我们给一棵树做着色,要在一个天蓝色的背景下对其所有的细节包括主干(boughs)、分枝 (branches)、细枝(twigs)、叶子(leaves)进行着色,我们不是首先给树着色,然后再在其他地方着蓝色;而是首先简单地将整个画布着 成蓝色,然后“修正”树所在的部分,再已有蓝色的基础上重新着色 — begin with broad brush strokes then fix up the details, with successively finer changes .

举例说明,给下句做标注:

The President said he will ask Congress to increase grants to states for vocational rehabilitation

我们首先使用unigram-tagger进行标注,然后按如下规则进行修正:(a) 当前一个词是TO时,使用VB来代替NN   (b) 当下一个词是NNS时使用IN来代替TO,过程如下:

Phrasetoincreasegrantstostatesforvocationalrehabilitation
UnigramTONNNNSTONNSINJJNN
Rule 1 VB      
Rule 2   IN    
OutputTOVBNNSINNNSINJJNN
GoldTOVBNNSINNNSINJJNN

规则的形式可以作为模板:

“replace T1 with T2 in the context C”

典型的context就是前面的词或后面的词的词本身或者词的标注;每个rule还可以有其评分

Brill tagger还有一个有用的属性:这些规则都是语义上可解释的

7. 怎样决定一个词的类别

在语言学上,我们使用词法(morphological)、句法(syntactic)、语义(semantic)上的线索来决定一个词的类别

(1) Morphological Clues

词本身的结构可能就给出词的类别,如:-ness后缀与一个形容词构成一个名词 happy –> happiness;-ment后缀; -ing后缀等等

(2) Syntactic Clues

使用某种词出现的典型语境信息

(3) Semantic Clues

词本身的语义也是一个很有用判断词类型的信息. 如,名词的定义就是 “the name of a person, place or thing”

(4) 新词

(5) Morphology in Part of Speech Tagsets

Like this:

Like Loading...

Related

Categories: NLP Tags: NLP , NLTK

python风控评分卡建模和风控常识(博客主亲自录制视频教程)

https://study.163.com/course/introduction.htm?courseId=1005214003&utm_campaign=commission&utm_source=cp-400000000398149&utm_medium=share

转载于:https://www.cnblogs.com/webRobot/p/6068968.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/573002.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php会不会被人工智能取代,为什么这9种工作不会被人工智能取代?

人工智能(AI)和机器学习(ML)的能力正在逐渐扩大,尽管如此,总会有一些任务所要求的质量是技术难以复制的,例如创造力、同情心和情感意识。有很多任务非常难以实现自动化,而且有些职业总是需要人的技能。我们从了解技术的各种局限性…

git中Please enter a commit message to explain why this merge is necessary.

Please enter a commit message to explain why this merge is necessary. 请输入提交消息来解释为什么这种合并是必要的 git 在pull或者合并分支的时候有时会遇到这个界面。可以不管(直接下面3,4步),如果要输入解释的话就需要: 1.按键盘字母 i 进入insert模式 2.修…

php代码显示灰色,哀悼日-实现网页变灰色的方法

哀悼日期间经常需要把网页设置为灰色状态,现总结一下方法以备后用,在网站的CSS文件中的顶部加入如下代码:html{filter:progid:DXImageTransform.Microsoft.BasicImage(grayscale1);-webkit-filter: grayscale(100%);}或者:html *{…

yum阿里云镜像源

阿里云是最近新出的一个镜像源。得益与阿里云的高速发展,这么大的需求,肯定会推出自己的镜像源。阿里云Linux安装镜像源地址:http://mirrors.aliyun.com/ CentOS系统更换软件安装源第一步:备份你的原镜像文件,以免出错…

abp框架mysql连接配置,abp框架连接数据库

ABP框架搭建项目系列教程基础版完结篇经过前面十二篇的基础教程,现在终于该做个总结了。回顾第一篇,我们建议新手朋友们先通过ABP官网的启动模板生成解决方案,因为这样既快速又准确,不会因为项目的搭建,而让新手畏而却…

【分布式】Zookeeper在大型分布式系统中的应用

一、前言 上一篇博文讲解了Zookeeper的典型应用场景,在大数据时代,各种分布式系统层出不穷,其中,有很多系统都直接或间接使用了Zookeeper,用来解决诸如配置管理、分布式通知/协调、集群管理和Master选举等一系列分布式…

php 数组当链表,php数组和链表的区别总结

PHP中数组和链表的区别从逻辑结构来看1.、数组必须事先定义固定的长度(元素个数),不能适应数据动态地增减的情况。当数据增加时,可能超出原先定义的元素个数;当数据减少时,造成内存浪费;数组可以根据下标直接存取。2、…

Egret资源管理解决方案

关于egret开发H5页游,资源管理和加载的一点看法。 一 多json文件管理 二 资源归类和命名 三 exml文件编写规范 四 资源预加载、分步加载、偷载 五 资源文件group分组 六 ResUtils,多json文件管理类 七 ResUtils,资源组加载管理类 八 开发中遇…

java 等待唤醒机制,Java线程等待唤醒机制

记录面试过程中被问到的几个需要手写代码的小案例1.请手写出线程的等待唤醒机制案例中两个线程:SyncSetThread设置学生信息,SyncGetThread用来获取学生信息,在Student实体中提供一个标记属性flag,记录当前是否有数据。等待唤醒机制…

Xshell实现Windows上传文件到Linux主机

经常有这样的需求,我们在Windows下载的软件包,如何上传到远程Linux主机上?还有如何从Linux主机下载软件包到Windows下;之前我的做法现在看来好笨好繁琐,不过也达到了目的,笨人有本方法嘛; 我是怎…

java实现键盘移动图片,快速移动视图与键盘

我试图在键盘出现时向上移动视图,在键盘隐藏时向下移动 .我遇到的问题是高度似乎不同:KBH1输出216,KBH2输出260 .这导致视图向下移动得比最初移动的距离更远 .我该如何纠正这个?extension UIViewController {func addKeyboardFunc…

python-变量操作-字符串

python对变量(不同数据类型)的操作 数字操作字符串操作列表操作元组操作集合操作字典操作Python3 中有六个标准的数据类型:Number(数字)、String(字符串)、List(列表)、T…

织梦自适应php源码,DEDE织梦PHP源码响应式建筑设计类网站织梦模板(自适应手机端)...

模板名称:响应式建筑设计类网站织梦模板(自适应移动端) 利于SEO优化模板详情:织梦最新内核开发的模板,该模板属于企业通用、HTML5响应式、建筑设计类企业使用,一款适用性很强的模板,基本可以适合各行业的企业网站&…

nyoj 题目5 Binary String Matching

Binary String Matching 时间限制:3000 ms | 内存限制:65535 KB难度:3描述Given two strings A and B, whose alphabet consist only ‘0’ and ‘1’. Your task is only to tell how many times does A appear as a substring of B? For…

php array =,PHP Array 函数

PHP Array 函数PHP Array 函数## PHP Array 简介PHP Array 函数允许您访问并操作数组。支持简单的数组和多维数组。## 安装PHP Array 函数是 PHP 核心的组成部分。无需安装即可使用这些函数。## PHP 5 Array 函数| 函数 | 描述 || ------------ | ------------ || array() | 创…

mac本用WTG(Windows To Go)安装Win10到移动硬盘

准备工作: 一个空的 USB 3.0 移动硬盘(在安装 WTG 时候会将这个硬盘清空重新并分区,注意备份好数据。USB 3.0 的优盘是不行的,即使安装成功,系统的运行速度会奇慢) 原版Windows 10 安装镜像(建议…

mac编译安装php环境,在Mac上编译安装PHP7的开发环境

今天看到鸟哥发微博说php7 beta1测试版发布了,于是赶紧就去抢先下载,把自己的开发环境也升级到PHP7去,话不多少,下面就一起来搞起吧。。。首先你得去官网下载php7 beta1的版本这里由于我是在mac上安装,所以就去下载lin…

js初步简单的编程代码

简单图片切换编码demo图片地址自行替换 简单图片切换编码<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns"http://www.w3.org/1999/xhtml" …

AC自动机——Uva 11468 子串

题目链接&#xff1a;http://vjudge.net/contest/142513#problem/A 题意&#xff1a;给出一些字符和各自对应的选择概率,随机选择L次后将得到一个长度为L的随机字符串S.给出K个模版串,计算S不包含任何一个串的概率. 分析&#xff1a; 在构造好的AC自动机里面&#xff0c;每随机…

安卓文本编辑器php cpp,开源的Android富文本编辑器

RichEditor基于原生EditTextspan实现的Android富文本编辑器github地址&#xff1a;https://github.com/yuruiyin/RichEditor组件描述该组件是基于原生EditTextspan的方式实现的&#xff0c;旨在提供一个功能齐全且使用方便的Android富文本编辑器。主要支持了加粗斜体等行内样式…