前提・実現したいこと
スクリプトA.py、B.pyがあります。両方で共通する処理をモジュール化してC.pyとしました。C.pyの中にはc1とc2のメソッドがあり、A.py、B.pyはc1をなんども実行します。c1はc2を実行しますが、インタプリタの1回のセッションでc2は1度実行されれば十分な内容です(単にタプルをつくるだけなので)。
そこで、c2が一度呼び出されれば、次は参照するだけにとどめることができないでしょうか?(メモリーと実行速度、ネットアクセスを節約したい)
該当のソースコード
python
1# A.py または B.py 2import preprocess 3for sentence in sentence_list: 4 words = tokenize(sentence) #ここでtokenize()が呼び出される。
python
1# preprocess.py 上記のCに該当 2def get_stopwords(): # 上記のc2に該当 3 ''' 4 ストップワードリストを返す 5 ''' 6 import urllib.request 7 url = 'http://svn.sourceforge.jp/svnroot/slothlib/CSharp/Version1/SlothLib/NLP/Filter/StopWord/word/Japanese.txt' 8 with urllib.request.urlopen(url) as response: 9 stop_words = [w for w in response.read().decode().split('\r\n') if w != ''] 10 stop_words.extend(['れる', 'られる', 'する', 'いる', 'なる', 'ある', 'できる', 'おる']) 11 return tuple(stop_words) 12 13def tokenize(sentence): # 上記のc1に該当 14 import MeCab 15 import re 16 stopwords = get_stopwords() # ここが問題 17 mc = MeCab.Tagger('-Ochasen') 18 parsed =[] 19 pattern = r'\t名詞' 20 for morph in mc.parse(sentence).split('\n'): 21 if re.search(pattern, morph): 22 token = morph.split("\t")[2] 23 if token in stopwords: # ここでget_stopwords()を利用 24 continue 25 parsed.append(token) 26 return parsed 27
試したこと
url = 'http://svn.sourceforge.jp/svnroot/slothlib/CSharp/Version1/SlothLib/NLP/Filter/StopWord/word/Japanese.txt' with urllib.request.urlopen(url) as response: stop_words = [w for w in response.read().decode().split('\r\n') if w != '']
の部分をハードコーディングして
stop_words = 'あそこ あたり .... 同じ 感じ'.split()
するのも一案だと思っています。が、c2(get_stopword)が何度も呼ばれる点では違いが生じません。
また、A.py(B.py)側で、c2を呼び出し、変数に入れておくことも一案だと思っています。が、A.py側から見えなくても良いメソッドを利用するのが、スマートさに欠けるようにも思えます
python
1# A.py または B.py 2import preprocess 3stopwords = preprocess.get_stopword() 4for sentence in sentence_list: 5 words = tokenize(sentence, stopwords) #こんな感じ
補足情報(FW/ツールのバージョンなど)
python 3.5 miniconda
A.pyとB.pyのコードが同じように見えるのですが二つある意味はあるのですか。また、c2の処理は手動なりであらかじめダウンロードして前処理を加えたものをtxtなりで保存しておいて読み出すコードに替えてあければよいのではないでしょうか。
A.py、B.pyは参考ですので、実際には上記のスクリプトの前後がA.pyとB.pyで異なります。Cが複数のスクリプトから呼び出されることを表現したかったため、誤解を生じさせてしまいました。
txtなりで保存する場合も結果的にハードコーディングする場合とそれほど差がないように思えるのですが、違うものでしょうか?何度もディスクアクセスが生じるので、イメージなのですが、一度メモリ上に展開したのちは、ポインタ(参照)を使いまわすということで、ディスクアクセスの回数を減らせないかと思案しています。

回答2件
あなたの回答
tips
プレビュー