невозможно заменить цифры пробелом при предварительной обработке текста - PullRequest
0 голосов
/ 16 декабря 2018

Я пытаюсь предварительно обработать текст как часть НЛП. Я новичок в этом. Я не понимаю, почему я не могу заменить цифры

para = "support leaders around the world who do not speak for the big 
polluters, but who speak for all of humanity, for the indigenous people of 
the world, for the first 100 people.In 90's it seems true."

import re
import nltk

sentences = nltk.sent_tokenize(para)

for i in range(len(sentences)):
    words = nltk.word_tokenize(sentences[i])
    words = [re.sub(r'\d','',words)]
    sentences[i] = ' '.join(words)

, делая это, я получаю следующееошибка:


TypeError                                 Traceback (most recent call last)
<ipython-input-28-000671b45ee1> in <module>()
       2 for i in range(len(sentences)):
       3     words = nltk.word_tokenize(sentences[i])
 ----> 4     words = [re.sub(r'\d','',words)].encode('utf8')
       5     sentences[i] = ' '.join(words)

~\Anaconda3\lib\re.py in sub(pattern, repl, string, count, flags)
  189     a callable, it's passed the match object and must return
  190     a replacement string to be used."""
  --> 191     return _compile(pattern, flags).sub(repl, string, count)
  192 
  193  def subn(pattern, repl, string, count=0, flags=0):

  TypeError: expected string or bytes-like object

Как я могу преобразовать в байтовый объект.Я смущен, поскольку я новичок в этом.

Ответы [ 3 ]

0 голосов
/ 16 декабря 2018

Для замены всех цифр в строке вы можете использовать модуль re, для сопоставления и замены шаблонов регулярных выражений.Из вашего последнего примера:

import re

processed_words = [re.sub('\d',' ', word) for word in tokenized]
0 голосов
/ 16 декабря 2018

Ошибка пытается сказать вам, что вы вызвали re.sub с чем-то, что не является строкой (игнорируйте "или байты" и "-подобные" части: у вас есть реальные строки для работы).Виновником является words: функция nltk.word_tokenize() возвращает список, и вы не можете передать все это re.sub.Вам нужен еще один цикл или понимание.Здесь это с пониманием, применяя re.sub к каждому элементу w из words.

sentences = nltk.sent_tokenize(para)
for i in range(len(sentences)):
    words = nltk.word_tokenize(sentences[i])
    words = [re.sub(r'\d','',w) for w in words]
    sentences[i] = ' '.join(words)

Пока мы на этом, я рекомендую заменить ваш цикл по числам на цикл поэлементы списка.Это намного приятнее, но вы должны сохранить результаты в новом списке:

sentences = nltk.sent_tokenize(para)
clean = []
for sent in sentences:
    words = nltk.word_tokenize(sent)
    words = [re.sub(r'\d','',w) for w in words]
    clean.append(' '.join(words))

PS.Вы можете упростить свой код, применив замену ко всем предложениям или даже ко всему абзацу, прежде чем разбить его.Но это не имеет отношения к вашей проблеме ...

0 голосов
/ 16 декабря 2018

Это то, что вы хотите сделать?Или я упускаю суть?

import re

para = """support leaders around the world who do not speak for the big 
polluters, but who speak for all of humanity, for the indigenous people of 
the world, for the first 100 people.In 90's it seems true."""

tokenized = para.split(' ')
new_para = []
for w in tokenized:
    w = re.sub('[0-9]', '', w)
    new_para.append(w)
print(' '.join(new_para))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...