2016-11-12 25 views
2

У меня есть набор документов, и я хотел бы преобразовать их в такую ​​форму, чтобы она позволяла мне считать tfidf для слов в этих документах (чтобы каждый документ представляется вектором tfidf-чисел).Как создать (или сгенерировать) теги для nltk lemmatizers

Я думал, что достаточно назвать WordNetLemmatizer.lemmatize (word), а затем PorterStemmer - но все 'have', 'has', 'had' и т. Д. Не преобразуются в 'have' с помощью lemmatizer - и это касается и других слов. Затем я прочитал, что я должен дать подсказку для lemmatizer-tag, представляющего тип слова - будь то существительное, глагол, прилагательное и т. Д.

Мой вопрос: как получить эти теги ? Что я должен преувеличивать по этим документам, чтобы получить это?

Я использую python3.4, и я леммируюсь + вытесняю одно слово за раз. Я попробовал WordNetLemmatizer и EnglishStemmer от nltk, а также stem() от stemming.porter2.

ответ

1

Хорошо, я googled больше, и я узнал, как получить эти теги. Сначала нужно выполнить некоторую предварительную обработку, чтобы убедиться, что файл получит токенизацию (в моем случае речь шла об удалении некоторых вещей, оставшихся после преобразования из pdf в txt).

Затем этот файл должен быть помечен в предложения, а затем каждое предложение в массив слов и может быть помечено тегом nltk. С этой лемматизацией можно сделать, а затем добавить к ней сверху.

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) 

И в этот момент я получаю стебли слова stemW, которое я могу затем записать в файл и использовать их для подсчета tfidf векторов за документ.