>백엔드 개발 >파이썬 튜토리얼 >NLTK 학습: 어휘 분류 및 주석 달기

NLTK 학습: 어휘 분류 및 주석 달기

巴扎黑
巴扎黑원래의
2017-06-23 15:33:582283검색

[TOC]

품사 태거

이후의 많은 작업에는 태그된 단어가 필요합니다. nltk에는 자체 영어 태거 pos_tagpos_tag

import nltk
text = nltk.word_tokenize("And now for something compleyely difference")print(text)print(nltk.pos_tag(text))

标注语料库

表示已经标注的标识符:nltk.tag.str2tuple('word/类型')

text = "The/AT grand/JJ is/VBD ."print([nltk.tag.str2tuple(t) for t in text.split()])

读取已经标注的语料库

nltk语料库ue肚脐提供了统一接口,可以不必理会不同的文件格式。格式:语料库.tagged_word()/tagged_sents()。参数可以指定categories和fields

print(nltk.corpus.brown.tagged_words())

名词、动词、形容词等

这里以名词为例

from nltk.corpus import brown
word_tag = nltk.FreqDist(brown.tagged_words(categories="news"))print([word+'/'+tag for (word,tag)in word_tag if tag.startswith('V')])################下面是查找money的不同标注#################################wsj = brown.tagged_words(categories="news")
cfd = nltk.ConditionalFreqDist(wsj)print(cfd['money'].keys())

尝试找出每个名词类型中最频繁的名词

def findtag(tag_prefix,tagged_text):
    cfd = nltk.ConditionalFreqDist((tag,word) for (word,tag) in tagged_text if tag.startswith(tag_prefix))return dict((tag,list(cfd[tag].keys())[:5]) for tag in cfd.conditions())#数据类型必须转换为list才能进行切片操作tagdict = findtag('NN',nltk.corpus.brown.tagged_words(categories="news"))for tag in sorted(tagdict):print(tag,tagdict[tag])

探索已经标注的语料库

需要nltk.bigrams()nltk.trigrams(),分别对应2-gram模型和3-gram模型。

brown_tagged = brown.tagged_words(categories="learned")
tags = [b[1] for (a,b) in nltk.bigrams(brown_tagged) if a[0]=="often"]
fd = nltk.FreqDist(tags)
fd.tabulate()

自动标注

默认标注器

最简单的标注器是为每个标识符分配统一标记。下面就是一个将所有词都变成NN的标注器。并且用evaluate()进行检验。当很多词语是名词时候,它有利于第一次分析并提高稳定性。

brown_tagged_sents = brown.tagged_sents(categories="news")

raw = 'I do not like eggs and ham, I do not like them Sam I am'tokens = nltk.word_tokenize(raw)
default_tagger = nltk.DefaultTagger('NN')#创建标注器print(default_tagger.tag(tokens)) # 调用tag()方法进行标注print(default_tagger.evaluate(brown_tagged_sents))

正则表达式标注器

注意这里规则是固定(由自己决定)。当规则越来越完善的时候,精确度越高。

patterns = [
    (r'.*ing$','VBG'),
    (r'.*ed$','VBD'),
    (r'.*es$','VBZ'),
    (r'.*','NN')#为了方便,只有少量规则]
regexp_tagger = nltk.RegexpTagger(patterns)
regexp_tagger.evaluate(brown_tagged_sents)

查询标注器

这里和书里是有差别的,不同于python2,注意调试。而查询标注器就是存储最有可能的标记,并且可以设置backoff参数,不能标记的情况下,就使用这个标注器(这个过程是回退

fd = nltk.FreqDist(brown.words(categories="news"))
cfd = nltk.ConditionalFreqDist(brown.tagged_words(categories="news"))##############################################python2和3的区别#########most_freq_words = fd.most_common(100)
likely_tags = dict((word,cfd[word].max()) for (word,times) in most_freq_words)#######################################################################baseline_tagger = nltk.UnigramTagger(model=likely_tags,backoff=nltk.DefaultTagger('NN'))
baseline_tagger.evaluate(brown_tagged_sents)

N-gram标注

基础的一元标注器

一元标注器的行为和查找标注器很相似,建立一元标注器的技术,为训练

这里我们的标注器只是记忆训练集,而不是建立一般模型,那么吻合很好,但是不能推广到新文本。

size = int(len(brown_tagged_sents)*0.9)
train_sents = brown_tagged_sents[:size]
test_sents = brown_tagged_sents[size+1:]
unigram_tagger = nltk.UnigramTagger(train_sents)
unigram_tagger.evaluate(test_sents)

一般的N-gram标注器

N元标注器,就是检索index= n 的 word,并且检索n-N<=index<=n-1 的 tag。即通过前面词的tag标签,进一步确定当前词汇的tag。类似于nltk.UnigramTagger(),自带的二元标注器为:nltk.BigramTagger()用法一致。

组合标注器

很多时候,覆盖范围更广的算法比精度更高的算法更有用。利用backoff指明回退标注器,来实现标注器的组合。而参数cutoff

t0 = nltk.DefaultTagger(&#39;NN&#39;)
t1 = nltk.UnigramTagger(train_sents,backoff=t0)
t2 = nltk.BigramTagger(train_sents,backoff=t1)
t2.evaluate(test_sents)

annotation corpus

가 주석이 달린 식별자를 나타냅니다: nltk.tag.str2tuple('word/type')

from nltk.tag import brill
brill.nltkdemo18plus()
brill.nltkdemo18()

주석이 달린 말뭉치 읽기

nltk corpus ue navel은 통합된 인터페이스를 제공하므로 다양한 파일 형식에 대해 걱정할 필요가 없습니다. 형식: Corpus.tagged_word()/tagged_sents(). 매개변수는 카테고리와 필드를 지정할 수 있습니다

rrreee

명사, 동사, 형용사 등을 지정할 수 있습니다.
다음은 명사를 예로 든 것입니다
rrreee
🎜각 명사 유형에서 가장 자주 나오는 명사를 찾아보세요🎜🎜rrreee🎜 🎜탐색 주석이 달린 말뭉치 🎜🎜🎜에는 각각 2그램 모델과 3그램 모델에 해당하는 nltk.bigrams()nltk.trigrams()가 필요합니다. . 🎜🎜🎜rrreee🎜🎜🎜자동 태깅🎜🎜기본 태거🎜🎜🎜가장 간단한 태거는 각 식별자에 균일한 태그를 할당합니다. 아래는 모든 단어를 NN으로 변환하는 태거입니다. 그리고 evaluate()를 사용하여 확인하세요. 많은 단어가 명사인 경우 1차 분석이 용이하고 안정성이 향상됩니다. 🎜🎜🎜rrreee🎜🎜정규식 태거🎜🎜🎜여기의 규칙은 고정되어 있습니다(귀하의 재량에 따라 다름). 규칙이 점점 더 완전해지면 정확도가 높아집니다. 🎜🎜🎜rrreee🎜🎜Query annotator🎜🎜🎜이 책과 차이점이 있습니다. 디버깅에 주의하세요. 쿼리 태거는 가능성이 가장 높은 태그를 저장하며 backoff 매개변수를 설정할 수 있습니다. 태그를 표시할 수 없는 경우 이 태거가 사용됩니다(이 프로세스는 백오프) 🎜🎜 🎜rrreee🎜🎜🎜N-gram 주석🎜🎜기본 단항 주석🎜🎜🎜단항 주석의 동작은 검색 주석자와 매우 유사하며, 단항 주석을 만드는 기술은 훈련입니다. 🎜🎜여기서 주석자는 일반 모델을 구축하는 대신 훈련 세트만 기억하므로 일치는 매우 좋지만 새 텍스트로 일반화할 수는 없습니다. 🎜🎜🎜rrreee🎜🎜일반적인 N-그램 태거🎜🎜🎜N-그램 태거는 index=n인 단어와 n-N<=index<=n-1인 태그를 검색하는 것입니다. 즉, 이전 단어의 태그 태그를 통해 현재 단어의 태그가 더 결정된다. nltk.UnigramTagger()와 마찬가지로 내장 바이너리 태거는 nltk.BigramTagger()입니다. 사용법은 일관됩니다. 🎜🎜🎜결합된 태거🎜🎜🎜정확도가 높은 알고리즘보다 적용 범위가 넓은 알고리즘이 더 유용할 때가 많습니다. 백오프 태거를 지정하여 태거 조합을 달성하려면 백오프를 사용하세요. cutoff 매개변수가 int 유형으로 명시적으로 선언된 경우 1~n회만 나타나는 컨텍스트는 자동으로 삭제됩니다. 🎜🎜🎜rrreee🎜🎜원문과 비교한 결과 정확도가 현저히 향상된 것을 확인할 수 있습니다🎜🎜문장 경계 주석🎜🎜🎜문장 시작 단어의 경우 처음 n 단어가 없습니다. 해결 방법: 태그가 지정된 tagged_sents를 사용하여 태거를 교육합니다. 🎜🎜🎜🎜변환 기반 주석: Brill 주석자 🎜🎜🎜가 위보다 낫습니다. 구현 아이디어 : 큰 스트로크로 시작한 다음 세부 사항을 수정하고 조금씩 세부적인 변경을 수행합니다. 🎜메모리를 적게 차지할 뿐만 아니라, 정적인 것보다 문제가 작아질수록 상황에 맞게 실시간으로 오류를 수정해줍니다. 물론 python3과 python2에서는 호출이 다릅니다. 🎜🎜🎜rrreee🎜🎜🎜🎜🎜

위 내용은 NLTK 학습: 어휘 분류 및 주석 달기의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.