JSONDecodeError: Дополнительные данные: строка 1, столбец 884 (символ 883) - PullRequest
0 голосов
/ 21 октября 2019

Я хочу разбить и отсортировать обзоры по ключевым словам, но есть проблема с открытием json, и программы выдают ошибку: JSONDecodeError: Дополнительные данные: строка 1, столбец 884 (символ 883). Файлы test2.json и Keywords.txt находятся здесь: https://github.com/SilverYar/TransportDataMiner

enter image description here

Вот мой код:


import nltk
from nltk.stem.snowball import RussianStemmer
from nltk.corpus import stopwords
import nltk, string, json

st = RussianStemmer()

def tokenize_me(file_text):
    #applying nltk tokenization
    tokens = nltk.word_tokenize(file_text)

    #deleting punctuation symbols
    tokens = [i for i in tokens if (i not in string.punctuation)]

    #deleting stop_words
    stop_words = stopwords.words('russian')
    stop_words.extend(['что', 'это', 'так', 'вот', 'быть', 'как', 'в', '—', 'к', 'на'])
    tokens = [i for i in tokens if (i not in stop_words)]

    #cleaning words
    tokens = [i.replace('«', '').replace('»', '') for i in tokens]

    return tokens

with open('C:\\Creme\\token\\keywords.txt') as fin:
    ww = fin.read().split(', ')
    key_words = list(set([st.stem(w) for w in ww]))



with open('C:\\Creme\\token\\test2.json') as fin:
    text = json.load(fin)

with open('C:\\Creme\\token\\bad.json', 'a', encoding='utf8') as fout:
    for dd in text:
        #for d in dd:
        words = tokenize_me(dd['description'])
        split_text = list(set([st.stem(word) for word in words]))
        #break
        tt = list(filter(lambda w: w in key_words, split_text))
        if tt:
            json.dump(dd, fout)
            fout.write('\n')

Помогите найти ошибку и исправить код.

Ответы [ 2 ]

1 голос
/ 21 октября 2019

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

for dd in text:
    if tt:
        json.dump(dd, fout)    # <<-- cannot do this in the loop
        fout.write('\n')

По сути, он должен быть записан сразу, с одним вызовом dump() или dumps().


хорошо, сначала нужно создать большой список, а затем вывести его в файл:

bad_words_list = []
for dd in text:
    words = tokenize_me(dd['description'])
    split_text = list(set([st.stem(word) for word in words]))
    tt = list(filter(lambda w: w in key_words, split_text))
    if tt:
         bad_words_list.append( dd )

with open('C:\\Creme\\token\\bad.json', 'a', encoding='utf8') as fout:
    json.dump( bad_words_list, fout )
0 голосов
/ 23 октября 2019

Я решил немного иначе - прочитайте файл и отформатируйте строку в правильные форматы json:

with open('C:\\Creme\\token\\test2.json', 'r', encoding='utf8') as fin:
    data = fin.read()
    formated_text = data.replace('}{', '},{')
    text = json.loads(f'[{formated_text}]')    


with open('C:\\Creme\\token\\bad.json', 'a', encoding='utf8') as fout:
    for dd in text:
        #for d in dd:
        words = tokenize_me(dd['description'])
        split_text = list(set([st.stem(word) for word in words]))
        #break
        tt = list(filter(lambda w: w in key_words, split_text))
        if tt:
            json.dump(dd, fout)
            fout.write('\n')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...