Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Нейронка на Python и библиотеке tensorflow. Проблема с чтением датасета(наверное). Модуль json

Чумаков Никита Ученик (110), на голосовании 1 неделю назад
Приветствую, дорогие эксперты. Я хотел бы спросить у вас совета как сделать, чтобы исправить данную ошибку:
raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
Сам код (думаю, что ошибка происходит на этапе выполнения функции load_data, в качестве датасета), в котором что-то не так:

 import numpy as np 
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Embedding, LSTM, Dropout, Dense
from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.preprocessing.sequence import pad_sequences
import json


class HeapkaAI:
def __init__(self, prompt, dataset_path='dataset.jsonl'):
self.corpus = self.load_data(dataset_path)

self.max_vocab_size = 1000
self.max_sequence_length = 10
self.embedding_dim = 64

self.tokenizer = Tokenizer(num_words=self.max_vocab_size)
self.tokenizer.fit_on_texts(self.corpus)
self.sequences = self.tokenizer.texts_to_sequences(self.corpus)

self.X, self.y = self.prepare_data()

self.model = self.build_model()

self.train_model()

response = self.generate_response(prompt)
print(f"{response}")

def load_data(self, dataset_path):
corpus = []
with open(dataset_path, 'r', encoding='utf-8') as file:
for line in file:
data = json.loads(line)
if 'text' in data:
corpus.append(data['text'])
return corpus

def prepare_data(self):
X = []
y = []
for seq in self.sequences:
for i in range(1, len(seq)):
X.append(seq[:i])
y.append(seq[i])

X = pad_sequences(X, maxlen=self.max_sequence_length)
y = tf.keras.utils.to_categorical(y, num_classes=self.max_vocab_size)

return np.array(X), np.array(y)

def build_model(self):
model = Sequential()
model.add(Embedding(input_dim=self.max_vocab_size, output_dim=self.embedding_dim,
input_length=self.max_sequence_length))
model.add(LSTM(128))
model.add(Dropout(0.2))
model.add(Dense(self.max_vocab_size, activation='softmax'))

model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

return model

def train_model(self):
self.model.fit(self.X, self.y, epochs=100, verbose=1)

def generate_response(self, input_text):
input_seq = self.tokenizer.texts_to_sequences([input_text])
input_seq = pad_sequences(input_seq, maxlen=self.max_sequence_length)

predicted_index = np.argmax(self.model.predict(input_seq), axis=-1)[0]

predicted_word = self.tokenizer.index_word.get(predicted_index, "Извините, я не понимаю.")

return predicted_word
Голосование за лучший ответ
catkilla Мыслитель (5916) 1 месяц назад
Ошибка вида json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0) указывает на то, что при чтении файла с датасетом какой-то из line (строка) не является корректным JSON (либо пуста, либо содержит пробелы / недопустимые символы).

Наиболее частые причины:
  • В файле dataset.jsonl есть пустые строки.
  • В файле dataset.jsonl есть неверно сформированный JSON. Например, какая-то строка содержит данные не в формате JSON или содержит «мусорные» символы.
Некорректная кодировка файла или наличие невидимых символов (например, BOM).

Способы решения:

1. Убедиться, что каждая строка в dataset.jsonl – валидный JSON
Если ваш файл dataset.jsonl должен выглядеть в стиле:

 {"text": "Пример текста 1"}  

{"text": "Пример текста 2"}

{"text": "Пример текста 3"}

то каждая строка должна точно содержать корректный JSON-объект и не иметь пустых строк.

Убедитесь, что в конце файла нет лишних пустых строк.

2. Пропуск пустых строк при чтении

Если в вашем датасете точно могут встречаться пустые строки и вы хотите их игнорировать, можете добавить проверку. Например:

 def load_data(self, dataset_path):  

corpus = []

with open(dataset_path, 'r', encoding='utf-8') as file:

for line in file:

line = line.strip()

if not line:

# Пустая строка – пропускаем

continue

data = json.loads(line) # Тут возможен json.JSONDecodeError, если формат неверен

if 'text' in data:

corpus.append(data['text'])

return corpus


Здесь перед json.loads() мы удаляем пробелы по краям и пропускаем, если строка пустая.

3. Обработка ошибок парсинга (если есть заведомо «плохие» строки)

Если в некоторых строках может быть неправильный JSON и вы хотите продолжить обработку, можно добавить try-except. Но лучше, конечно, поправить сам датасет, чтобы таких проблем не было.


 def load_data(self, dataset_path):  

corpus = []

with open(dataset_path, 'r', encoding='utf-8') as file:

for line in file:

line = line.strip()

if not line:

continue

try:

data = json.loads(line)

if 'text' in data:

corpus.append(data['text'])

except json.JSONDecodeError:

print(f"Некорректная строка: {line}")

continue

return corpus


4. Проверить кодировку файла
Иногда проблема появляется при наличии BOM или неправильной кодировке. Убедитесь, что ваш dataset.jsonl – в UTF-8 (без BOM).

В большинстве современных редакторов кода есть возможность пересохранить файл в правильной кодировке.
Если вы открываете файл в Notepad (Windows) – будьте внимательны, чтобы не появился BOM.
Похожие вопросы