Где я ошибаюсь в этом? Я пытаюсь перебрать каждую строку моего фрейма данных и закодировать текст.
data['text'] = data.apply(lambda row:
codecs(row['text'], "r", 'utf-8'), axis=1)
Я получаю эту ошибку - почему кодировка uft влияет на часть кода, если я не запускаю кодировку UTF, я не получаю ошибку:
TypeError Traceback (most recent call last)
<ipython-input-101-0e1d5977a3b3> in <module>
----> 1 data['text'] = codecs(data['text'], "r", 'utf-8')
2
3 data['text'] = data.apply(lambda row:
4 codecs(row['text'], "r", 'utf-8'), axis=1)
TypeError: 'module' object is not callable
Когда я применяю решения, оба работают, однако я получаю эту ошибку:
data['text_tokens'] = data.apply(lambda row:
nltk.word_tokenize(row['text']), axis=1)
Ошибка:
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-138-73972d522748> in <module>
1 data['text_tokens'] = data.apply(lambda row:
----> 2 nltk.word_tokenize(row['text']), axis=1)
~/env/lib64/python3.6/site-packages/pandas/core/frame.py in apply(self, func, axis, broadcast, raw, reduce, result_type, args, **kwds)
6485 args=args,
6486 kwds=kwds)
-> 6487 return op.get_result()
6488
6489 def applymap(self, func):
~/env/lib64/python3.6/site-packages/pandas/core/apply.py in get_result(self)
149 return self.apply_raw()
150
--> 151 return self.apply_standard()
152
153 def apply_empty_result(self):
~/env/lib64/python3.6/site-packages/pandas/core/apply.py in apply_standard(self)
255
256 # compute the result using the series generator
--> 257 self.apply_series_generator()
258
259 # wrap results
~/env/lib64/python3.6/site-packages/pandas/core/apply.py in apply_series_generator(self)
284 try:
285 for i, v in enumerate(series_gen):
--> 286 results[i] = self.f(v)
287 keys.append(v.name)
288 except Exception as e:
<ipython-input-138-73972d522748> in <lambda>(row)
1 data['text_tokens'] = data.apply(lambda row:
----> 2 nltk.word_tokenize(row['text']), axis=1)
~/env/lib64/python3.6/site-packages/nltk/tokenize/__init__.py in word_tokenize(text, language, preserve_line)
142 :type preserve_line: bool
143 """
--> 144 sentences = [text] if preserve_line else sent_tokenize(text, language)
145 return [
146 token for sent in sentences for token in _treebank_word_tokenizer.tokenize(sent)
~/env/lib64/python3.6/site-packages/nltk/tokenize/__init__.py in sent_tokenize(text, language)
104 """
105 tokenizer = load('tokenizers/punkt/{0}.pickle'.format(language))
--> 106 return tokenizer.tokenize(text)
107
108
~/env/lib64/python3.6/site-packages/nltk/tokenize/punkt.py in tokenize(self, text, realign_boundaries)
1275 Given a text, returns a list of the sentences in that text.
1276 """
-> 1277 return list(self.sentences_from_text(text, realign_boundaries))
1278
1279 def debug_decisions(self, text):
~/env/lib64/python3.6/site-packages/nltk/tokenize/punkt.py in sentences_from_text(self, text, realign_boundaries)
1329 follows the period.
1330 """
-> 1331 return [text[s:e] for s, e in self.span_tokenize(text, realign_boundaries)]
1332
1333 def _slices_from_text(self, text):
~/env/lib64/python3.6/site-packages/nltk/tokenize/punkt.py in <listcomp>(.0)
1329 follows the period.
1330 """
-> 1331 return [text[s:e] for s, e in self.span_tokenize(text, realign_boundaries)]
1332
1333 def _slices_from_text(self, text):
~/env/lib64/python3.6/site-packages/nltk/tokenize/punkt.py in span_tokenize(self, text, realign_boundaries)
1319 if realign_boundaries:
1320 slices = self._realign_boundaries(text, slices)
-> 1321 for sl in slices:
1322 yield (sl.start, sl.stop)
1323
~/env/lib64/python3.6/site-packages/nltk/tokenize/punkt.py in _realign_boundaries(self, text, slices)
1360 """
1361 realign = 0
-> 1362 for sl1, sl2 in _pair_iter(slices):
1363 sl1 = slice(sl1.start + realign, sl1.stop)
1364 if not sl2:
~/env/lib64/python3.6/site-packages/nltk/tokenize/punkt.py in _pair_iter(it)
316 it = iter(it)
317 try:
--> 318 prev = next(it)
319 except StopIteration:
320 return
~/env/lib64/python3.6/site-packages/nltk/tokenize/punkt.py in _slices_from_text(self, text)
1333 def _slices_from_text(self, text):
1334 last_break = 0
-> 1335 for match in self._lang_vars.period_context_re().finditer(text):
1336 context = match.group() + match.group('after_tok')
1337 if self.text_contains_sentbreak(context):
TypeError: ('cannot use a string pattern on a bytes-like object', 'occurred at index 0')
Мои данные токенизированы, и это выглядит так: ['item', 'risk', 'factors', 'economic', 'developments', 'could'] тогда как я смотрю видео в 25:30 youtube.com/watch?v=pY9EwZ02sXU, и у них есть такие токены: [u'item', u'risk', u'factors', u'economic', u'developments', u'could']. Я просто не хочу потом столкнуться с проблемами из-за другой структуры.






Как говорит первая ошибка, codecs не вызывается. На самом деле это название модуля.
Вы, вероятно, хотите:
data['text'] = data.apply(lambda row:
codecs.encode(row['text'], 'utf-8'), axis=1)
Ошибка, вызванная word_tokenize, связана с тем, что функция используется для ранее закодированной строки: codecs.encode отображает текст в строку байтов буквальный.
Из codecsдокумент:
Most standard codecs are text encodings, which encode text to bytes, but there are also codecs provided that encode text to text, and bytes to bytes.
word_tokenize не работает с литеральными байтами, как говорит ошибка (последняя строка вашей трассировки ошибки).
Если вы удалите проход кодировки, он будет работать.
Насчет ваших переживаний на видео: приставка u означает юникод.1
Префикс b означает байтовый литерал.2 Это префикс строк, если вы печатаете свой фрейм данных после использования codecs.encode.
В python 3 (из трассировки я вижу, что ваша версия 3.6) типом строки по умолчанию является Unicode, поэтому u избыточен и часто не отображается, но строки уже Unicode.
Так что я совершенно уверен, что вы в безопасности: можете смело не использовать codecs.encode.
Это работает! но следующая строка кода, которую я запускаю data['text_tokens'] = data.apply(lambda row: nltk.word_tokenize(row['text']), axis=1), выдает ошибку.
Можно даже сделать что-то проще:
df['text'] = df['text'].str.encode('utf-8')
Ссылка: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.str.encode.html
Спасибо! это работает, однако я сталкиваюсь с новой ошибкой. Я обновил исходный пост.
Вторая ошибка связана с использованием
word_tokenizeв закодированной строке. Вам нужно использовать его на необработанной строке, и он будет работать. Может быть, будет лучше, если вы опишите нам всю проблему. Зачем нужна кодировка?