ホームページ  >  記事  >  バックエンド開発  >  NLTK 学習: 語彙の分類と注釈付け

NLTK 学習: 語彙の分類と注釈付け

巴扎黑
巴扎黑オリジナル
2017-06-23 15:33:582233ブラウズ

[TOC]

品詞タグ付け

その後の多くのタスクでは、タグ付きの単語が必要になります。 nltk には独自の英語タガー pos_tag が付属していますpos_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)

注釈コーパス

は注釈付きの識別子を示します: 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🎜注釈付きコーパス 🎜🎜🎜 には、nltk.bigrams()nltk.trigrams() が必要です。これらは、それぞれ 2 グラム モデルと 3 グラム モデルに対応します。 。 🎜🎜🎜rrreee🎜🎜🎜自動タグ付け🎜🎜デフォルトのタグ付け🎜🎜🎜最も単純なタグ付けは、各識別子に均一のタグを割り当てます。以下は、すべての単語を NN に変換するタガーです。 evaluate() を使用して確認します。これにより、最初の分析が容易になり、多くの単語が名詞である場合の安定性が向上します。 🎜🎜🎜rrreee🎜🎜正規表現タグ付け🎜🎜🎜ここでのルールは固定されていることに注意してください(独自の判断による)。ルールが完成すればするほど精度は高くなります。 🎜🎜🎜rrreee🎜🎜クエリアノテーター🎜🎜🎜本との違いは、Python2とは異なる点です。クエリ タガーには最も可能性の高いタグが保存され、タグをマークできない場合は、このタガーが使用されます (このプロセスはバックオフです) 🎜🎜。 🎜rrreee🎜🎜🎜N-gram アノテーション🎜🎜基本的な単項アノテーター🎜🎜🎜 単項アノテーターの動作は検索アノテーターと非常によく似ており、 単項アノテーターを構築するためのテクノロジーはトレーニングされています。 🎜🎜ここでは、アノテーターは一般的なモデルを構築するのではなく、トレーニング セットを記憶するだけなので、一致は非常に良好ですが、新しいテキストに一般化することはできません。 🎜🎜🎜rrreee🎜🎜一般的な N グラム タガー🎜🎜🎜 N グラム タガーは、index= n の単語と n-N<=index<=n-1 のタグを取得します。すなわち、現在の単語のタグは、前の単語のタグタグを通じてさらに決定される。 nltk.UnigramTagger() と同様に、組み込みのバイナリ タガーは nltk.BigramTagger() です。使用方法は一貫しています。 🎜🎜🎜複合タガー🎜🎜🎜 多くの場合、精度の高いアルゴリズムよりも、範囲が広いアルゴリズムの方が便利です。 backoff を使用して バックオフ タガーを指定し、タガーの組み合わせを実現します。パラメータ cutoff が明示的に int 型として宣言されている場合、1 ~ n 回しか出現しないコンテキストは自動的に破棄されます。 🎜🎜🎜rrreee🎜🎜オリジナルと比較すると、精度が大幅に向上していることがわかります🎜🎜文境界注釈🎜🎜🎜文頭の単語については、最初のn単語がありません。解決策: タグ付きの tagged_sents を使用してタガーをトレーニングします。 🎜🎜🎜🎜変換ベースのアノテーション: Brill アノテーター 🎜🎜🎜 は上記よりも優れています。実装の考え方: 大きなストロークから始めて、細部を修正し、少しずつ細かい変更を加えます。 🎜少量のメモリを消費するだけでなく、状況に応じて、問題が静的ではなく小さくなるにつれてリアルタイムでエラーを修正します。もちろん、python3 と python2 では呼び出しが異なります。 🎜🎜🎜りー🎜🎜🎜🎜🎜

以上がNLTK 学習: 語彙の分類と注釈付けの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。