Maison  >  Article  >  développement back-end  >  Apprentissage NLTK : classer et annoter le vocabulaire

Apprentissage NLTK : classer et annoter le vocabulaire

巴扎黑
巴扎黑original
2017-06-23 15:33:582233parcourir

[TOC]

Tagueur de parties du discours

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

corpus d'annotation

représente l'identifiant annoté : nltk.tag.str2tuple('word/类型')

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

Lire le corpus annoté

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

noms, verbes, adjectifs, etc.

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

Essayez de trouver le nom le plus fréquent de chaque type de nom

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

Explorez le corpus annoté

nécessite nltk.bigrams() et nltk.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()

Marquage automatique

Tagger par défaut

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

Tagger d'expression régulière

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)

Tageur de requêtes

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(&#39;NN&#39;))
baseline_tagger.evaluate(brown_tagged_sents)

Annotation N-gram

Annotateur unaire de base

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 général

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 à

, l'annotateur binaire intégré est : nltk.UnigramTagger() a le même usage. nltk.BigramTagger()

Taggers combinés

Souvent, un algorithme avec une couverture plus large est plus utile qu'un algorithme avec une plus grande précision. Utilisez

pour 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(&#39;NN&#39;)
t1 = nltk.UnigramTagger(train_sents,backoff=t0)
t2 = nltk.BigramTagger(train_sents,backoff=t1)
t2.evaluate(test_sents)
On peut constater qu'après comparaison avec l'original, la précision est considérablement améliorée

Annotation des limites de phrases croisées

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.


Annotation basée sur la transformation : l'annotateur Brill

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn