Ошибка при использовании string.punctuation для удаления знаков препинания для строки - PullRequest
0 голосов
/ 27 января 2020

Быстрый вопрос:

Я использую string и nltk.stopwords, чтобы убрать блок текста со всеми пунктуацией и стоп-словами в рамках предварительной обработки данных перед подачей их в некоторую обработку на естественном языке. алгоритмы.

Я тестировал каждый компонент отдельно на нескольких блоках необработанного текста, потому что я все еще привыкаю к ​​этому процессу, и он выглядел хорошо.

    def text_process(text):
        """
        Takes in string of text, and does following operations: 
        1. Removes punctuation. 
        2. Removes stopwords. 
        3. Returns a list of cleaned "tokenized" text.
        """
        nopunc = [char for char in text.lower() if char not in string.punctuation]

        nopunc = ''.join(nopunc)

        return [word for word in nopunc.split() if word not in 
               stopwords.words('english')]

Однако, когда я применяю эту функцию к текстовому столбцу моего фрейма данных - это текст из набора обзоров Pitchfork - я вижу, что пунктуация на самом деле не удаляется, хотя стоп-слова .

Необработано:

    pitchfork['content'].head(5)

0    “Trip-hop” eventually became a ’90s punchline,...
1    Eight years, five albums, and two EPs in, the ...
2    Minneapolis’ Uranium Club seem to revel in bei...
3    Minneapolis’ Uranium Club seem to revel in bei...
4    Kleenex began with a crash. It transpired one ...
Name: content, dtype: object

Обработано:

    pitchfork['content'].head(5).apply(text_process)


0    [“triphop”, eventually, became, ’90s, punchlin...
1    [eight, years, five, albums, two, eps, new, yo...
2    [minneapolis’, uranium, club, seem, revel, agg...
3    [minneapolis’, uranium, club, seem, revel, agg...
4    [kleenex, began, crash, it, transpired, one, n...
Name: content, dtype: object

Есть мысли о том, что здесь происходит не так? Я просмотрел документацию и не видел никого, кто бы боролся с этой проблемой точно таким же образом, поэтому я хотел бы получить некоторое представление о том, как решить эту проблему. Спасибо!

1 Ответ

0 голосов
/ 27 января 2020

Проблема здесь в том, что utf-8 имеет разные кодировки для левой и правой кавычек (одинарные и двойные), а не только обычные кавычки, которые включены в string.punctuation.

Я бы сделал что-то вроде

punctuation = [ c for c in string.punctuation ] + [u'\u201c',u'\u201d',u'\u2018',u'\u2019']

nopunc = [ char for char in text.decode('utf-8').lower() if char not in punctuation ]

, это добавляет значения utf-8 для кавычек не-ascii в список с именем punctuation, а затем декодирует текст в * 1008. * и заменяет эти значения.

примечание: это python2, если вы используете python3, форматирование значений utf, вероятно, будет немного отличаться

...