Maison > Article > développement back-end > Apprentissage NLTK : classer et annoter le vocabulaire
[TOC]
De nombreuses tâches ultérieures nécessitent des mots balisés. nltk est livré avec un annotateur anglais
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 nombril fournit une interface unifiée, vous n'avez donc pas à vous soucier des différents formats de fichiers. Format :
语料库.tagged_word()/tagged_sents()
. Les paramètres peuvent spécifier des catégories et des champs
print(nltk.corpus.brown.tagged_words())
Ici, nous prenons les noms comme exemple
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])
nécessite
nltk.bigrams()
etnltk.trigrams()
, qui correspondent respectivement au modèle 2 grammes et au modèle 3 grammes.
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()
Le tagger le plus simple est pour chaque identifiant. Les identifiants se voient attribuer un uniforme balises. Vous trouverez ci-dessous un tagger qui transforme tous les mots en NN. Et utilisez
evaluate()
pour vérifier. Cela facilite la première analyse et améliore la stabilité lorsque de nombreux mots sont des noms.
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))
Notez que les règles ici sont fixes (à votre propre discrétion). À mesure que les règles deviennent de plus en plus complètes, la précision augmente.
patterns = [ (r'.*ing$','VBG'), (r'.*ed$','VBD'), (r'.*es$','VBZ'), (r'.*','NN')#为了方便,只有少量规则] regexp_tagger = nltk.RegexpTagger(patterns) regexp_tagger.evaluate(brown_tagged_sents)
Il y a une différence entre ceci et le livre C'est différent de python2. Le tagger de requête stocke les balises les plus probables et peut définir le paramètre
backoff
Si la balise ne peut pas être marquée, utilisez ce tagger (ce processus est de secours )
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)
L'annotateur unaire se comporte de manière très similaire à l'annotateur de recherche, techniques de construction d'annotateurs unaires, formé pour.
Ici notre annotateur mémorise uniquement l'ensemble d'entraînement au lieu de construire un modèle général, donc l'accord est très bon, mais il ne peut pas être généralisé à de nouveaux textes.
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)
Tagger N-gram consiste à récupérer le mot avec index = n et à récupérer n -N< ;=index<=n-1 balise. Autrement dit, la balise du mot actuel est en outre déterminée par la balise du mot précédent. Semblable àTaggers combinés, l'annotateur binaire intégré est :
nltk.UnigramTagger()
a le même usage.nltk.BigramTagger()
Souvent, un algorithme avec une couverture plus large est plus utile qu'un algorithme avec une plus grande précision. Utilisezpour spécifier
backoff
pour utiliser l'annotateur de secours pour réaliser la combinaison d'annotateurs. Si le paramètre est explicitement déclaré comme type int, les contextes qui n'apparaissent qu'une à n fois seront automatiquement supprimés.cutoff
t0 = nltk.DefaultTagger('NN') t1 = nltk.UnigramTagger(train_sents,backoff=t0) t2 = nltk.BigramTagger(train_sents,backoff=t1) t2.evaluate(test_sents)
Pour Le mot au début de la phrase n'a pas les n premiers mots. Solution : Entraînez le tagueur avec les tagg_sents étiquetés.
est supérieur à celui ci-dessus. L'idée de mise en œuvre : commencer par un grand coup, puis corriger les détails, et apporter des modifications détaillées petit à petit.Non seulement cela prend une petite quantité de mémoire, mais il est également contextuel et corrige les erreurs en temps réel à mesure que le problème devient plus petit plutôt que statique. Bien entendu, les appels sont différents en python3 et python2.
from nltk.tag import brill brill.nltkdemo18plus() brill.nltkdemo18()
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!