pythonでtfidfの処理に時間がかかるので、並列処理をしています
しかし、速度が並列化していない処理よりも5秒ほど遅くなるので(並列化していない時は15秒ほど)
cProfileコマンドを用いたところ
普通に実行した際にはでないエラーのようなものがでています
python
1import nltk 2import numpy as np 3import json 4import time 5from multiprocessing import Pool 6import sys 7 8def subcalc(word, collection): 9 subdoc = [] 10 lists = [] 11 wo=[] 12 for term in set(word): 13 if(collection.tf_idf(term, word) > 0): 14 wo.append([term,collection.tf_idf(term, word)]) #ここも上のサイトにのってる 15 wo.sort(key=lambda x:x[1]) #keyに無名関数lambdaをいれてる woの1番目の要素(WO(1,2)だったら”2”)でソート 16 wo.reverse() 17 try: 18 slice1 = np.array(wo[:20]) #先頭の文字から終了インデックスまでが抽出 19 lists = slice1[:,0] #[:]は戦闘から終了のインデックスまで抽出と、slice1の0番目を格納 20 subdoc.append(list(lists)) #listsが文字列だから、リストに格納 21 del wo 22 except: 23 print(wo) 24 return subdoc 25 26def tfidf(): 27 t1 = time.time() 28 doc0 = [] 29 doc = [] 30 word0 = [] 31 word = [] 32 f = open("/Users/uuu/Desktop/Dropbox/prg/dataset/word0_a.txt") #/Users/uuu/Desktop/Dropbox/prg/dataset 33 for row in f: 34 word0.append(row.split("][")) 35 f.close() 36 for i in word0: #word0[0] #普通の時(形態素解析したテキストが改行されてない時) #word0 #改行されてる時 37 word.append(str(i).replace("[","").replace("]","").replace(",","").replace("'","").replace("\"","").split()) 38 #word.pop() 39 ttt = time.time() 40 p = Pool() 41 collection = nltk.TextCollection(word) #サイトにのっていた 42 words = [(i, collection) for i in word] 43 doc = p.starmap(subcalc, words) #複数コアによる実行 44 t3 = time.time() 45 print('processing time2(終わり): ' + str(t3 - ttt) + '(sec)') 46 47if __name__ == "__main__": 48 tfidf() 49 50----------------------------------------------------------------- 51cProfile 実行結果(エラー部分のみ) 52 53Traceback (most recent call last): 54 File "C:\Users\uuu\AppData\Local\conda\conda\envs\anaconda\lib\runpy.py", line 193, in _run_module_as_main 55 "__main__", mod_spec) 56 File "C:\Users\uuu\AppData\Local\conda\conda\envs\anaconda\lib\runpy.py", line 85, in _run_code 57 exec(code, run_globals) 58 File "C:\Users\uuu\AppData\Local\conda\conda\envs\anaconda\lib\cProfile.py", line 160, in <module> 59 main() 60 File "C:\Users\uuu\AppData\Local\conda\conda\envs\anaconda\lib\cProfile.py", line 153, in main 61 runctx(code, globs, None, options.outfile, options.sort) 62 File "C:\Users\uuu\AppData\Local\conda\conda\envs\anaconda\lib\cProfile.py", line 20, in runctx 63 filename, sort) 64 File "C:\Users\uuu\AppData\Local\conda\conda\envs\anaconda\lib\profile.py", line 64, in runctx 65 prof.runctx(statement, globals, locals) 66 File "C:\Users\uuu\AppData\Local\conda\conda\envs\anaconda\lib\cProfile.py", line 100, in runctx 67 exec(cmd, globals, locals) 68 File "tfidf(speedy).py", line 80, in <module> 69 tfidf() 70 File "tfidf(speedy).py", line 66, in tfidf 71 doc = p.starmap(subcalc, words) #複数コアによる実行 72 File "C:\Users\uuu\AppData\Local\conda\conda\envs\anaconda\lib\multiprocessing\pool.py", line 268, in starmap 73 return self._map_async(func, iterable, starmapstar, chunksize).get() 74 File "C:\Users\uuu\AppData\Local\conda\conda\envs\anaconda\lib\multiprocessing\pool.py", line 608, in get 75 raise self._value 76 File "C:\Users\uuu\AppData\Local\conda\conda\envs\anaconda\lib\multiprocessing\pool.py", line 385, in _handle_tasks 77 put(task) 78 File "C:\Users\uuu\AppData\Local\conda\conda\envs\anaconda\lib\multiprocessing\connection.py", line 206, in send 79 self._send_bytes(_ForkingPickler.dumps(obj)) 80 File "C:\Users\uuu\AppData\Local\conda\conda\envs\anaconda\lib\multiprocessing\reduction.py", line 51, in dumps 81 cls(buf, protocol).dump(obj) 82_pickle.PicklingError: Can't pickle <function subcalc at 0x0000016615E9F048>: attribute lookup subcalc on __main__ failed 83
pickle化ができませんというエラーのようなのですが
この部分に速度が速くならない要因があるのでしょうか
あと、対処法があれば教えていただきたいです
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/07/28 01:41
2017/07/28 02:05
2017/07/28 02:09