Heim  >  Artikel  >  Backend-Entwicklung  >  NLTK-Lernen: Vokabeln klassifizieren und kommentieren

NLTK-Lernen: Vokabeln klassifizieren und kommentieren

巴扎黑
巴扎黑Original
2017-06-23 15:33:582251Durchsuche

[TOC]

Teil-of-Speech-Tagger

Viele nachfolgende Aufgaben erfordern getaggte Wörter. nltk wird mit einem englischen Annotator geliefert. pos_tag

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

Annotationskorpus

stellt den annotierten Bezeichner dar: nltk.tag.str2tuple('word/类型')

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

Lesen Sie den kommentierten Korpus

nltk corpus ue navel bietet eine einheitliche Oberfläche, sodass Sie sich keine Gedanken über unterschiedliche Dateiformate machen müssen. Format: 语料库.tagged_word()/tagged_sents(). Parameter können Kategorien und Felder angeben

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

Substantive, Verben, Adjektive usw.

Hier nehmen wir Substantive als Beispiel

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

Versuchen Sie, das häufigste Substantiv jedes Substantivtyps zu finden

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

Erkunden Sie den kommentierten Korpus

erfordert nltk.bigrams() und nltk.trigrams(), die dem 2-Gramm-Modell bzw. dem 3-Gramm-Modell entsprechen.

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

Automatisches Tagging

Standard-Tagger

Der einfachste Tagger ist für jeden Identifier einheitlich zugeordnet Tags. Unten finden Sie einen Tagger, der alle Wörter in NN umwandelt. Und verwenden Sie evaluate() zur Überprüfung. Es erleichtert die erste Analyse und verbessert die Stabilität, wenn viele Wörter Substantive sind.

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

Tagger für reguläre Ausdrücke

Beachten Sie, dass die Regeln hier festgelegt sind (nach Ihrem eigenen Ermessen). Je vollständiger die Regeln werden, desto höher wird die Genauigkeit.

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

Abfrage-Annotator

Es gibt einen Unterschied zu Python2. Der Abfrage-Tagger speichert die wahrscheinlichsten Tags und kann den Parameter backoff festlegen. Wenn das Tag nicht markiert werden kann, verwenden Sie diesen Tagger (dieser Prozess ist Fallback )

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-Gramm-Annotation

Grundlegender unärer Annotator

Der unäre Annotator verhält sich sehr ähnlich wie der Suchannotator, Techniken zum Erstellen unärer Annotatoren, ausgebildet für .

Hier merkt sich unser Annotator nur den Trainingssatz, anstatt ein allgemeines Modell zu erstellen. Daher ist die Übereinstimmung sehr gut, sie kann jedoch nicht auf neue Texte verallgemeinert werden.

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)

Allgemeiner N-Gramm-Tagger

Der N-Gramm-Tagger dient dazu, das Wort mit index= n abzurufen und n -N< abzurufen ;=index<=n-1 Tag. Das heißt, das Tag des aktuellen Wortes wird weiter durch das Tag-Tag des vorherigen Wortes bestimmt. Ähnlich wie nltk.UnigramTagger() lautet der integrierte binäre Annotator: nltk.BigramTagger() hat die gleiche Verwendung.

Kombinierte Tagger

Oft ist ein Algorithmus mit größerer Abdeckung nützlicher als einer mit höherer Genauigkeit. Verwenden Sie backoff, um als Fallback des Annotators anzugeben, , um die Kombination von Annotatoren zu realisieren. Wenn der Parameter cutoff explizit als int-Typ deklariert ist, werden Kontexte, die nur 1-n-mal vorkommen, automatisch verworfen.

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

Es kann festgestellt werden, dass nach dem Vergleich mit dem Original die Genauigkeit erheblich verbessert wurde

Satzübergreifende Annotation

Für das Wort am Satzanfang fehlen die ersten n Wörter. Lösung: Trainieren Sie den Tagger mit tagged tagged_sents.


Transformationsbasierte Annotation: Der Brill-Annotator

ist den oben genannten überlegen. Die Idee der Umsetzung: Beginnen Sie mit einem großen Schritt, korrigieren Sie dann die Details und nehmen Sie nach und nach detaillierte Änderungen vor.
Es beansprucht nicht nur wenig Speicher, sondern ist auch kontextbezogen und korrigiert Fehler in Echtzeit, wenn das Problem kleiner und nicht statisch wird. Natürlich sind die Aufrufe in Python3 und Python2 unterschiedlich.

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


Das obige ist der detaillierte Inhalt vonNLTK-Lernen: Vokabeln klassifizieren und kommentieren. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn