Необходимо исключить конкретную запись из большого набора данных в Python - PullRequest
0 голосов
/ 25 февраля 2019

Итак, у меня есть этот набор данных dblp, где мне нужно исключить конференции.Это мой код, где я конвертирую json в csv, но мне нужны некоторые изменения, чтобы он мог копировать только документы, кроме конференций.моя логика заключалась в том, чтобы найти конференцию в месте проведения, но код не работает должным образом

import json
import csv

with open('test1.json') as lines, open('data3.csv', 'w',encoding='utf-8') as output:
    output = csv.DictWriter(output, ['abstract','authors','n_citation',"references","title","venue","year",'id'],lineterminator='\n')
    output.writeheader()
    for line in lines:
        line = line.strip()
        if line[0] == '{' and line[-1] == '}':
            if line.find("conference")!=True:
                output.writerow(json.loads(line))

Вот пример json

{"abstract": "AdaBoost algorithm based on Haar-like features can achieves high accuracy (above 95%) in object detection.", 
"authors": ["Zheng Xu", "Runbin Shi", "Zhihao Sun", "Yaqi Li", "Yuanjia Zhao", "Chenjian Wu"], 
"n_citation": 0,
 "references": ["0a11984c-ab6e-4b75-9291-e1b700c98d52", "1f4152a3-481f-4adf-a29a-2193a3d4303c", "3c2ddf0a-237b-4d17-8083-c90df5f3514b", "522ce553-29ea-4e0b-9ad3-0ed4eb9de065", "579e5f24-5b13-4e92-b255-0c46d066e306", "5d0b987d-eed9-42ce-9bf3-734d98824f1b", "80656b4d-b24c-4d92-8753-bdb965bcd50a", "d6e37fb1-5f7e-448e-847b-7d1f1271c574"],
 "title": "A Heterogeneous System for Real-Time Detection with AdaBoost",
 "venue": "high performance computing and communications",
 "year": 2016,
 "id": "001eef4f-1d00-4ae6-8b4f-7e66344bbc6e"}


{"abstract": "In this paper, a kind of novel jigsaw EBG structure is designed and applied into conformal antenna array",
 "authors": ["Yufei Liang", "Yan Zhang", "Tao Dong", "Shan-wei Lu"], 
"n_citation": 0, 
"references": [], 
"title": "A novel conformal jigsaw EBG structure design", 
"venue": "international conference on conceptual structures", 
"year": 2016, 
"id": "002e0b7e-d62f-4140-b015-1fe29a9acbaa"}

Код работает нормально, если я уберу эту строку

if line.find("conference")!=True:

вот ссылка на скачивание примера файла json

https://drive.google.com/open?id=1056yrc_Y4Y-tAZT52YUDxPPsWYsLcn48

меньший размер json http://s000.tinyupload.com/?file_id=57175973595937350188

Ответы [ 2 ]

0 голосов
/ 25 февраля 2019

Следующее похоже на работу.Поскольку каждая строка вашего входного файла содержит полный объект JSON, он сначала вызывает json.loads(), чтобы получить словарь Python, а затем проверяет содержимое словаря, чтобы узнать, имеет ли он ключ "venue", и, если это так,строковое значение этого ключа содержит подстроку "conference".

Также обратите внимание, я не думаю, что вам действительно нужна часть:

        line = line.strip()
        if line[0] == '{' and line[-1] == '}':

, но я оставил ее, поскольку я нене весь ваш файлЭто не больно, но в некоторой степени замедляет обработку.

import csv
import json


fields = 'abstract,authors,n_citation,references,title,venue,year,id'.split(',')

with open('test1.json') as lines, \
     open('data3.csv', 'w', encoding='utf-8') as output:
    output = csv.DictWriter(output, fields, lineterminator='\n')
    output.writeheader()
    for line in lines:
        line = line.strip()
        if line[0] == '{' and line[-1] == '}':
            json_obj = json.loads(line)
            if 'conference' not in json_obj.get('venue', ''):
                output.writerow(json_obj)

Изменено , чтобы ответить (я думаю) на дополнительный вопрос в комментариях:

import collections
import csv
import json
from pprint import pprint


fields = 'abstract,authors,n_citation,references,title,venue,year,id'.split(',')
# Added.
venue_citations = collections.defaultdict(int)  # Total number of citations per venue.

with open('test1.json') as lines, \
     open('data3.csv', 'w', encoding='utf-8') as output:
    output = csv.DictWriter(output, fields, lineterminator='\n')
    output.writeheader()
    for line in lines:
        line = line.strip()
        if line[0] == '{' and line[-1] == '}':
            json_obj = json.loads(line)
            venue = json_obj.get('venue', '')
            if 'conference' not in venue:
                output.writerow(json_obj)
                venue_citations[venue] += json_obj["n_citation"]  # Update count.

pprint(dict(venue_citations))
0 голосов
/ 25 февраля 2019

вы можете легко получить доступ к различным полям с помощью модуля JSON.Если вы можете представить объекты json в виде списка в файле test1.json, вы можете вызвать json.load(open('test1.json','r')), чтобы загрузить данные json в виде списка объектов json.Если это невозможно, вы можете попробовать следующее.

import json

json_objs=list()

#iterate through the json data and create json objects
with open('test.json') as lines:
    s_buffer = list()

    for line in lines:
        s_buffer.append(line)
        if '}' in line:
            json_objs.append(json.loads(''.join(s_buffer)))
            s_buffer = list()

#check if each event is a conference or not
output_list = list()
for obj in json_objs:

    if not 'conference' in obj['venue']:
        output_list.append(obj)


Попытка записи в файл во время обработки данных может привести к снижению производительности. Я добавляю выходные данные к output_list, которыйможет быть использован для записи в файл CSV позже.

...