2016-10-20 1 views
0

Je suis nouveau dans le domaine de l'exploration de texte et de la PNL. Je travaille sur un petit projet où j'essaie d'extraire des informations de quelques documents.Je fais essentiellement un tag de pos et j'utilise un chunker pour trouver le motif en fonction des mots marqués. Dois-je utiliser des mots d'arrêt avant de faire ce marquage POS? L'utilisation de mots vides affectera-t-elle l'exactitude de mon étiqueteuse POS?Avons-nous besoin d'utiliser le filtrage Stopwords avant l'étiquetage POS?

+3

Le marquage POS est effectué en tant que classification de séquence, donc changer la séquence en supprimant les mots vides changera très probablement les étiquettes POS pour les mots restants. Les étiqueteurs POS sont généralement formés sur du texte complet, y compris les mots vides. – lenz

Répondre

1

Ce que dit @lenz. Ne supprimez pas les mots vides avant d'étiqueter - ou avant que vous n'ayez copié, d'ailleurs, à moins que vous n'entraîniez un chunker et que vous décidiez de le former (et ensuite de l'utiliser) sur du texte nettoyé. Mais je ne le recommanderais pas non plus. La suppression des mots vides est appropriée pour les processus de mots comme TF-IDF, mais les mots communs comme les déterminants et les prépositions fournissent des indices essentiels sur la structure de la phrase, et donc sur la partie du discours. Ne les supprimez pas si vous voulez détecter des unités de phrase.

Mais pourquoi me croire sur parole? Vous pouvez facilement vérifier cela par vous-même, en prenant un peu de données étiquetées et en évaluant votre tagueur et chunker avec et sans suppression des mots vides. Je vous recommande de le faire de toute façon pour le reste de votre pipeline.

2

Utilisons this comme exemple pour former/tester un tagueur:

d'abord obtenir le corpus et antidico

>>> import nltk 
>>> nltk.download('stopwords') 
>>> nltk.download('cess_esp') 

Chargez les enveloppes en NLTK

>>> from nltk.corpus import cess_esp as cess 
>>> from nltk.corpus import stopwords 

# Import the function to train a tagger. 
>>> from nltk import UnigramTagger, BigramTagger 
# Load the Spanish stopwords 
>>> stoplist = stopwords.words('spanish') 
# Load the Spanish tagger 
>>> cess_sents = cess.tagged_sents() 

de Split le corpus en train/bancs d'essai

>>> len(cess_sents) 
6030 
>>> test_set = cess_sents[-int(6030/10):] 
>>> train_set = cess_sents[:-int(6030/10)] 
>>> range(10) 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
>>> range(10)[-2:] 
[8, 9] 
>>> range(10)[:-2] 
[0, 1, 2, 3, 4, 5, 6, 7] 

Créez un autre train_set sans mots vides.

>>> train_set_nostop = [[(word,tag) for word, tag in sent if word.lower() not in stoplist] for sent in train_set] 

Voir la différence:

>>> train_set[0] 
[(u'El', u'da0ms0'), (u'grupo', u'ncms000'), (u'estatal', u'aq0cs0'), (u'Electricit\xe9_de_France', u'np00000'), (u'-Fpa-', u'Fpa'), (u'EDF', u'np00000'), (u'-Fpt-', u'Fpt'), (u'anunci\xf3', u'vmis3s0'), (u'hoy', u'rg'), (u',', u'Fc'), (u'jueves', u'W'), (u',', u'Fc'), (u'la', u'da0fs0'), (u'compra', u'ncfs000'), (u'del', u'spcms'), (u'51_por_ciento', u'Zp'), (u'de', u'sps00'), (u'la', u'da0fs0'), (u'empresa', u'ncfs000'), (u'mexicana', u'aq0fs0'), (u'Electricidad_\xc1guila_de_Altamira', u'np00000'), (u'-Fpa-', u'Fpa'), (u'EAA', u'np00000'), (u'-Fpt-', u'Fpt'), (u',', u'Fc'), (u'creada', u'aq0fsp'), (u'por', u'sps00'), (u'el', u'da0ms0'), (u'japon\xe9s', u'aq0ms0'), (u'Mitsubishi_Corporation', u'np00000'), (u'para', u'sps00'), (u'poner_en_marcha', u'vmn0000'), (u'una', u'di0fs0'), (u'central', u'ncfs000'), (u'de', u'sps00'), (u'gas', u'ncms000'), (u'de', u'sps00'), (u'495', u'Z'), (u'megavatios', u'ncmp000'), (u'.', u'Fp')] 
>>> train_set_nostop[0] 
[(u'grupo', u'ncms000'), (u'estatal', u'aq0cs0'), (u'Electricit\xe9_de_France', u'np00000'), (u'-Fpa-', u'Fpa'), (u'EDF', u'np00000'), (u'-Fpt-', u'Fpt'), (u'anunci\xf3', u'vmis3s0'), (u'hoy', u'rg'), (u',', u'Fc'), (u'jueves', u'W'), (u',', u'Fc'), (u'compra', u'ncfs000'), (u'51_por_ciento', u'Zp'), (u'empresa', u'ncfs000'), (u'mexicana', u'aq0fs0'), (u'Electricidad_\xc1guila_de_Altamira', u'np00000'), (u'-Fpa-', u'Fpa'), (u'EAA', u'np00000'), (u'-Fpt-', u'Fpt'), (u',', u'Fc'), (u'creada', u'aq0fsp'), (u'japon\xe9s', u'aq0ms0'), (u'Mitsubishi_Corporation', u'np00000'), (u'poner_en_marcha', u'vmn0000'), (u'central', u'ncfs000'), (u'gas', u'ncms000'), (u'495', u'Z'), (u'megavatios', u'ncmp000'), (u'.', u'Fp')] 
>>> 

train tagueur:

>>> uni_tag = UnigramTagger(train_set) 

train tagueur avec corpus sans mots vides:

>>> uni_tag_nostop = UnigramTagger(train_set_nostop) 

Divise le test_set en mots et tags:

>>> test_words, test_tags = zip(*[zip(*sent) for sent in test_set]) 

Tag les phrases de test:

>>> uni_tag.tag_sents(test_words) 
>>> uni_tag_nostop.tag_sents(test_words) 

Évaluer la précision (faisons juste vrais positifs pour l'instant):

>>> sum([ sum(1 for (word,pred_tag), (word, gold_tag) in zip(pred,gold) if pred_tag==gold_tag) for pred, gold in zip(tagged_sents, test_set)]) 
11266 
>>> sum([ sum(1 for (word,pred_tag), (word, gold_tag) in zip(pred,gold) if pred_tag==gold_tag) for pred, gold in zip(tagged_sents_nostop, test_set)]) 
5963 

note il y a beaucoup de choses qui sont injustes ici lorsque vous supprimé les mots vides avant d'entraîner le taggeur, pas exhaustivement:

  • votre ensemble d'entraînement sera naturellement plus petit puisque le no.des mots dans la phrase est plus petit après avoir enlevé les mots vides

  • le tagger ne sera pas apprendre les balises pour les mots vides et donc renvoie None pour tous les mots vides, ce qui réduit la précision de votre tagger puisque l'ensemble de test ne comprend des mots vides

  • lors de la formation d'un ngram d'ordre supérieur, sans les mots vides, cela pourrait ne pas avoir de sens du tout. Ce n'est pas que la grammaticalité ou la sensibilité explique l'exactitude (en particulier dans la PNL d'aujourd'hui). Par exemple , "le chat est sur la table" -> "table de chat" sans mots d'arrêt.

Mais comme @alexia a souligné, pour le sac-de-mots modèles à base d'espace vectoriel (alias comme modèles distribués, alias. « Vous pouvez connaître un mot par ses voisins » modèle, aka. Le non-neurones modèle d'intégration de prédiction), en supprimant les mots d'arrêt pourrait vous apporter un certain kilométrage en termes de précision. Mais comme pour TF-IDF, la chose (statistiquement) magique est que les mots vides auront automatiquement un score TF-IDF bas car ils apparaissent trop fréquemment dans la plupart des documents et cela ne les rend pas moins discriminatoires pour rendre chaque document différent (donc ils ne sont pas si importants, ce sont les pièces de l'IDF qui font la magie).