Я пытаюсь научиться (на 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: недостаточно значений для распаковки. почему ? Но это не сработало для моего случая. Как я могу решить эту ошибку?

Заранее большое спасибо,

1
iraciv94 20 Авг 2018 в 23:15

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)
1
alvas 23 Авг 2018 в 04:44

Самый простой способ решить эту проблему - поместить оператор распаковки в блок try/except. Что-то вроде:

try:
    label, sentence = line.strip().split("\t".encode())
except ValueError:
    print(f'Error line: {line}')
    continue

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

1
PMende 20 Авг 2018 в 20:27

Вы должны проверить на случай, если у вас неправильное количество полей:

 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
0
robx 20 Авг 2018 в 20:18
51937926