2017-07-12 20 views
1

Pythonでは、私はmakovifyを使って、マルコフモデルを作成して、ランダムな文章を生成します。私はまた、マルコフモデルを文構造に従わせるためにnltkを使用しています。マルコフモデルを大量のコーパスから、特にnltkの品詞タグを使って生成するにはかなりの時間がかかるので、毎回同じモデルを生成するのは無駄です。そのため、マルコフモデルを後で再利用するJSONファイルとして保存することにしました。 しかし、これらの大きなJSONファイルをPythonで読み込もうとすると、いくつかの問題があります。次のコードです:Pythonのマルコフチェーンと大きな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') 

しかし、私は次のエラーを取得する:

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 

私はこの問題に対処する方法については、このウェブサイト上のいくつかの同様の質問を読んでいると、それらのほとんどが使用を指摘しますijsonとJSONファイルの望ましくない部分をスキップしていますが、実際にはJSON内には何もありません。

+1

ファイルが大きすぎてメモリにロードできないようです。ファイルを 'pickle 'しようとするが、それが役立つかどうかは100%確信していない。 – PYA

+0

これを試してみてくださいhttps://stackoverflow.com/questions/519633/lazy-method-for-reading-big-file-in-python/519653#519653 – PYA

+0

実際のデータベースが必要でしょうか? – thebjorn

答えて

0

ジェネレータを使用して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)) 
関連する問題