Стемминг в питоне

Я хочу остановить мой текст, который я читаю из файла CSV. Но после стебл-оператора текст не меняется. Тогда я где-то читал, что мне нужно использовать POS-теги, чтобы это произошло, но это не помогло.

Подскажите, пожалуйста, что я делаю не так? Поэтому я читаю csv, удаляю знаки препинания, разбиваю токены, получаю POS-теги и пытаюсь остановить, но ничего не меняется.

from nltk.tokenize import sent_tokenize, word_tokenize
from nltk.stem import PorterStemmer
import nltk
from nltk import pos_tag

stemmer = nltk.PorterStemmer()
data = pd.read_csv(open('data.csv'),sep=';')

translator=str.maketrans('','',string.punctuation)

with open('output.csv', 'w', newline='') as csvfile:
   writer = csv.writer(csvfile, delimiter=';',
                            quotechar='^', quoting=csv.QUOTE_MINIMAL)

   for line in data['sent']:
        line = line.translate(translator)
        tokens = word_tokenize(line)
        tokens_pos = nltk.pos_tag(tokens)
        final = [stemmer.stem(tagged_word[0]) for tagged_word in tokens_pos]
        writer.writerow(tokens_pos)

Примеры данных для stemming:

The question was, what are you going to cut?
Well, again, while you were on the board of the Woods Foundation...
We've got some long-term challenges in this economy.

Спасибо заранее за любую помощь!

2 ответа

Решение

Вы должны были попытаться отладить свой код. Если (после необходимого импорта) вы только что попробовали print(stemmer.stem("challenges")), вы бы увидели, что стеминг работает (выше будет напечатано "вызов"). Ваша проблема - небольшой недосмотр: вы собираете стебли в final, но вы печатаете tokens_pos, Итак, "решение" таково:

writer.writerow(final)

Ваш код должен напечатать окончательную переменную для желаемого вывода, вместо этого вы печатаете tokens_pos:)

Попробуйте следующее:

import string
import nltk
from nltk.tokenize import word_tokenize
from nltk.stem import PorterStemmer


def preprocess(sentence):
    stemmer = nltk.PorterStemmer()
    translator=sentence.translate(string.maketrans("",""), string.punctuation)
    translator = translator.lower()
    tokens = word_tokenize(translator)
    final = [stemmer.stem(tagged_word) for tagged_word in tokens]
    return " ".join(final)

sentence = "We've got some long-term challenges in this economy."
print "Original: "+ sentence

stemmed=preprocess(sentence)
print "Processed: "+ stemmed

Выход:

Original: We've got some long-term challenges in this economy.
Processed: weve got some longterm challeng in thi economi

Надеюсь, это поможет вам!

Другие вопросы по тегам