2016-11-12 4 views
2

Ich habe eine Reihe von Dokumenten, und ich möchte diese in eine solche Form verwandeln, dass es mir erlauben würde, tfidf für Wörter in diesen Dokumenten zu zählen (so dass jedes Dokument wird durch Vektor von Tfidf-Zahlen dargestellt).Wie (oder generieren) Tags für Nltk Lemmatizer

Ich dachte, dass es ausreicht, WordNetLemmatizer.lemmatize (Wort) und dann PorterStemer aufzurufen - aber alle 'haben', 'hat', 'hatte', usw. werden nicht umgewandelt, um durch den Lemmatizer "zu haben" und es gilt auch für andere Wörter. Dann habe ich gelesen, dass ich einen Hinweis für den Lemmatizer - Tag geben soll, der eine Art des Wortes darstellt - ob Nomen, Verb, Adjektiv, etc.

Meine Frage ist - wie bekomme ich diese Tags ? Was soll ich mit diesen Dokumenten machen, um das zu bekommen?

Ich benutze Python3.4, und ich bin lemmatizing + stemming einzelnes Wort auf einmal. Ich habe WordNetLematisizer und EnglishStemmer von nltk und stem() von stemming.porter2 ausprobiert.

Antwort

1

Ok, ich googelte mehr und ich fand heraus, wie man diese Tags bekommt. Zuerst muss eine Vorverarbeitung durchgeführt werden, um sicherzustellen, dass die Datei in Token umgewandelt wird (in meinem Fall ging es darum, einige Dinge zu entfernen, die nach der Umwandlung von PDF nach txt übrig geblieben sind).

Dann müssen diese Dateien in Sätze tokenisiert werden, dann wird jeder Satz in ein Wort-Array, und das kann durch nltk tagger getaggt werden. Mit dieser Lemmatisierung kann getan werden, und dann stemming darüber hinzugefügt werden.

from nltk.tokenize import sent_tokenize, word_tokenize 
# use sent_tokenize to split text into sentences, and word_tokenize to 
# to split sentences into words 
from nltk.tag import pos_tag 
# use this to generate array of tuples (word, tag) 
# it can be then translated into wordnet tag as in 
# [this response][1]. 
from nltk.stem.wordnet import WordNetLemmatizer 
from stemming.porter2 import stem 

# code from response mentioned above 
def get_wordnet_pos(treebank_tag): 
    if treebank_tag.startswith('J'): 
     return wordnet.ADJ 
    elif treebank_tag.startswith('V'): 
     return wordnet.VERB 
    elif treebank_tag.startswith('N'): 
     return wordnet.NOUN 
    elif treebank_tag.startswith('R'): 
     return wordnet.ADV 
    else: 
     return ''  


with open(myInput, 'r') as f: 
    data = f.read() 
    sentences = sent_tokenize(data) 
    ignoreTypes = ['TO', 'CD', '.', 'LS', ''] # my choice 
    lmtzr = WordNetLemmatizer() 
    for sent in sentences: 
     words = word_tokenize(sentence) 
     tags = pos_tag(words) 
     for (word, type) in tags: 
      if type in ignoreTypes: 
       continue 
      tag = get_wordnet_pos(type) 
      if tag == '': 
       continue 
      lema = lmtzr.lemmatize(word, tag) 
      stemW = stem(lema) 

Und an dieser Stelle ich Wort stammte erhalten stemW die ich dann schreiben kann auf diese Datei, und verwenden Sie TFIDF Vektoren pro Dokument zu zählen.