Я пытаюсь научиться (на Python3) выполнять анализ настроений для НЛП и использую базу данных «UMICH SI650 - Классификация настроений», доступную на Kaggle: https://www.kaggle.com/c/si650winter11
На данный момент я пытаюсь создать словарь с некоторыми циклами, вот код:
import collections
import nltk
import os
Directory = "../Databases"
# Read training data and generate vocabulary
max_length = 0
freqs = collections.Counter()
num_recs = 0
training = open(os.path.join(Directory, "train_sentiment.txt"), 'rb')
for line in training:
if not line:
continue
label, sentence = line.strip().split("\t".encode())
words = nltk.word_tokenize(sentence.decode("utf-8", "ignore").lower())
if len(words) > max_length:
max_length = len(words)
for word in words:
freqs[word] += 1
num_recs += 1
training.close()
Я продолжаю получать эту ошибку, которую я не до конца понимаю:
в метке предложение = line.strip (). split ("\ t" .encode ()) ValueError: недостаточно значений для распаковки (ожидается 2, получено 1)
Я пытался добавить
if not line:
continue
Как предложено здесь: ValueError: недостаточно значений для распаковки. почему ? Но это не сработало для моего случая. Как я могу решить эту ошибку?
Заранее большое спасибо,
3 ответа
Вот более удобный способ чтения набора данных из https://www.kaggle.com/c/si650winter11а>
Во-первых , менеджер контекста - ваш друг, используйте его, http: //book.pythontips.com/en/latest/context_managers.html
Во-вторых , если это текстовый файл, не читайте его как двоичный файл, т. е. open(filename, 'r')
, а не open(filename, 'rb')
, тогда нет необходимости связываться с str / byte и кодировать / декодировать.
А теперь .
from nltk import word_tokenize
from collections import Counter
word_counts = Counter()
with open('training.txt', 'r') as fin:
for line in fin:
label, text = line.strip().split('\t')
# Avoid lowercasing before tokenization.
# lowercasing after tokenization is much better
# just in case the tokenizer uses captialization as cues.
word_counts.update(map(str.lower, word_tokenize(text)))
print(word_counts)
Самый простой способ решить эту проблему - поместить оператор распаковки в блок try/except
. Что-то вроде:
try:
label, sentence = line.strip().split("\t".encode())
except ValueError:
print(f'Error line: {line}')
continue
Я предполагаю, что у некоторых из ваших строк есть ярлык с пустым пространством после этого.
Вы должны проверить на случай, если у вас неправильное количество полей:
if not line:
continue
fields = line.strip().split("\t".encode())
if len(fields) != 2:
# you could print(fields) here to help debug
continue
label, sentence = fields
Похожие вопросы
Новые вопросы
python-3.x
По вопросам программирования Python, относящегося к версии языка 3+. Используйте более общий тег [python] для всех вопросов Python и добавляйте его только в том случае, если ваш вопрос зависит от версии. Используйте теги [python-2.x] для вопросов Python 2.