2017-07-12 1 views
1

Ainsi, en Python, j'utilise makovify pour construire des modèles de Markov de grands corpus de texte pour générer des phrases aléatoires avec elle. J'utilise aussi nltk pour que les modèles de Markov obéissent à la structure des phrases. Comme il faut un certain temps pour générer un modèle de Markov à partir d'un vaste corpus, en particulier avec une partie du discours de tagger de NLTK, générant le même modèle chaque fois est tout à fait donc j'ai décidé inutile de sauvegarder les modèles de Markov sous forme de fichiers JSON pour les réutiliser plus tard . Toutefois, lorsque j'essaie de lire ces fichiers JSON volumineux en Python, j'ai quelques problèmes. Ce qui suit est le code:Python, les chaînes de Markov et de lecture de gros fichiers JSON

import nltk 
import markovify 
import os 
import json 

pathfiles = 'C:/Users/MF/Documents/NetBeansProjects/Newyckham/data/' 
filenames = [] 
ebook = [] 

def build_it (path): 
    for root, dirs, files in os.walk(path): 
     for file in files: 
      if file.endswith(".json"): 
       filenames.append(os.path.join(root, file)) 
    for file in filenames: 
     print(str(file)) 
     with open(file) as myjson: 
      ebook.append(markovify.Text.from_json(json.load(myjson))) 
    return ebook 

text_model = markovify.combine(build_it(pathfiles)) 

for i in range(5): 
    print(text_model.make_sentence()) 
    print('\r\n') 
    print(text_model.make_short_sentence(140)) 
    print('\r\n') 

Mais je reçois l'erreur suivante:

Traceback (most recent call last): 
    File "C:\Users\MF\Desktop\eclipse\markovify-master\terceiro.py", line 24, in < 
module> 
    text_model = markovify.combine(build_it(pathfiles)) 
    File "C:\Users\MF\Desktop\eclipse\markovify-master\terceiro.py", line 21, in b 
uild_it 
    ebook.append(markovify.Text.from_json(json.load(myjson))) 
    File "C:\Python27\lib\json\__init__.py", line 290, in load 
    **kw) 
    File "C:\Python27\lib\json\__init__.py", line 338, in loads 
    return _default_decoder.decode(s) 
    File "C:\Python27\lib\json\decoder.py", line 366, in decode 
    obj, end = self.raw_decode(s, idx=_w(s, 0).end()) 
    File "C:\Python27\lib\json\decoder.py", line 382, in raw_decode 
    obj, end = self.scan_once(s, idx) 
MemoryError 

J'ai lu une question similaire sur ce site sur la façon de traiter cette question et la plupart pointent vers l'utilisation ijson et en sautant les parties indésirables du fichier JSON, cependant, il n'y a rien de vraiment dans ces JSON que je peux sauter, donc des idées sur ce sujet?

+1

Le fichier est trop volumineux pour être chargé en mémoire, semble-t-il. Essayez de «pickle» le fichier, mais je ne suis pas sûr à 100% si cela va aider. – PYA

+0

essayer cette https://stackoverflow.com/questions/519633/lazy-method-for-reading-big-file-in-python/519653#519653 – PYA

+0

peut-être vous avez besoin d'une véritable base de données? – thebjorn

Répondre

0

Vous pouvez utiliser des générateurs pour éliminer les copies redondantes du JSON.

def get_filenames(path): 
    for root, dirs, files in os.walk(path): 
     for file in files: 
      if file.endswith(".json"): 
       yield os.path.join(root, file) 

def build_it(path): 
    for file in get_filenames(path): 
     print(str(file)) 
     with open(file) as myjson: 
      yield markovify.Text.from_json(json.load(myjson))