Heim >Backend-Entwicklung >Python-Tutorial >NLTK-Lernen: Vokabeln klassifizieren und kommentieren
[TOC]
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))
nltk.tag.str2tuple('word/类型')
text = "The/AT grand/JJ is/VBD ."print([nltk.tag.str2tuple(t) for t in text.split()])
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())
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())
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])
erfordert
nltk.bigrams()
undnltk.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()
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))
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)
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)
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)
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.
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 Parametercutoff
explizit als int-Typ deklariert ist, werden Kontexte, die nur 1-n-mal vorkommen, automatisch verworfen.
t0 = nltk.DefaultTagger('NN') 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
Für das Wort am Satzanfang fehlen die ersten n Wörter. Lösung: Trainieren Sie den Tagger mit tagged tagged_sents.
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!