Токенизация и лемматизация для использования TF-IDF для набора текстовых файлов с использованием библиотеки NLTK - PullRequest
0 голосов
/ 12 июня 2018

Проведение текстового анализа итальянского текста (токенизация, леммализация) для будущего использования техники TF-IDF и построение кластеров на его основе.Для предварительной обработки я использую NLTK, и для одного текстового файла все работает нормально:

import nltk
from nltk.stem.wordnet import WordNetLemmatizer

it_stop_words = nltk.corpus.stopwords.words('italian')

lmtzr = WordNetLemmatizer()

with open('3003.txt', 'r' , encoding="latin-1") as myfile:
    data=myfile.read()

word_tokenized_list = nltk.tokenize.word_tokenize(data)

word_tokenized_no_punct = [str.lower(x) for x in word_tokenized_list if x not in string.punctuation]

word_tokenized_no_punct_no_sw = [x for x in word_tokenized_no_punct if x not in it_stop_words]

word_tokenized_no_punct_no_sw_no_apostrophe = [x.split("'") for x in word_tokenized_no_punct_no_sw]
word_tokenized_no_punct_no_sw_no_apostrophe = [y for x in word_tokenized_no_punct_no_sw_no_apostrophe for y in x]

word_tokenize_list_no_punct_lc_no_stowords_lemmatized = [lmtzr.lemmatize(x) for x in word_tokenized_no_punct_no_sw_no_apostrophe]

Но вопрос в том, что мне нужно выполнить следующие действия для набора файлов .txt в папке.Для этого я пытаюсь использовать возможности PlaintextCorpusReader():

from nltk.corpus.reader.plaintext import PlaintextCorpusReader

corpusdir = 'reports/'

newcorpus = PlaintextCorpusReader(corpusdir, '.txt')

В принципе, я не могу просто применить newcorpus к предыдущим функциям, потому что это объект, а не строка.Итак, мои вопросы:

  1. Как должны выглядеть функции (или как я должен изменить существующие для отдельного файла) для выполнения токенизации и лемматизации для совокупности файлов (используя PlaintextCorpusReader())
  2. Как будет подходить TF-IDF (стандартный подход sklearn vectorizer = TfidfVectorizer() будет выглядеть в PlaintextCorpusReader()

Большое спасибо!

1 Ответ

0 голосов
/ 12 июня 2018

Я думаю, что на ваш вопрос можно ответить следующим образом: этот вопрос , этот еще один и [TfidfVectorizer docs] [3].Для полноты я обернул ответы ниже:


Сначала вы хотите получить идентификаторы файлов, по первому вопросу вы можете получить их следующим образом:

ids = newcorpus.fileids()

Затем, основываясь на второй очереди , вы можете получить слова, предложения или абзацы документов:

doc_words = []
doc_sents = []
doc_paras = []
for id_ in ids:
    # Get words
    doc_words.append(newcorpus.words(id_))
    # Get sentences
    doc_sents.append(newcorpus.sents(id_))
    # Get paragraph
    doc_paras.append(newcorpus.paras(id_))

Теперь, на позиции ith doc_words, doc_sents и doc_paras у вас есть все слова, предложения и абзацы (соответственно) для каждого документа в корпусе.

Для tf-idf вы, вероятно, просто хотитеслова.Так как метод TfidfVectorizer.fit получает итерацию, которая возвращает str, Unicode или файловые объекты, вам необходимо либо преобразовать ваши документы (массив токенизированных слов) в одну строку, либо использовать аналогичный подходдо этого .Последнее решение использует фиктивный токенизатор для непосредственного обращения с массивами слов.

Вы также можете передать свой собственный токенизатор в TfidVectorizer и использовать PlaintextCorpusReader просто для чтения файлов.

...