質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.51%

  • Python

    11744questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pythonでTFIDFの処理を並列処理するには

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 681

kohekoh

score 122

pythonについてです

タイトル通り、TFIDFの処理を並列処理したいと考えています
普通にTFIDFをするぶんにはできるのですが、TFIDFしたいと考えているファイルが大きくて
並列化しないととてもじゃないけど終わらないということでやっています

コードを書いているところで、エラーが出たので投稿しました

現在以下のコードを書いていて
エラーがでます

import nltk
import numpy as np
import json
#import nltk_exa as nl
import time
import multiprocessing as mp

def subcalc(p): #p = 0~8
    word = []
    proc = 8
    f = open("word0_a.txt")
    line = f.readline()
    while line:
        line = f.readline()
        word.append(line.replace("[","").replace("]","").replace(",","").replace("\"","").split())
    f.close()
    word.pop()
    print(word)

    ini = len(word) * p / proc
    fin = len(word) * (p+1) / proc

    subdoc = []
    lists = []
    proc = 8
    collection = nltk.TextCollection(word) 
    t1 = time.time()

    for do in range(ini, fin):
        wo=[]
        for term in set(do):
            if(collection.tf_idf(term, do) > 0):
                wo.append([term,collection.tf_idf(term, do)]) #ここも上のサイトにのってる
                #print(wo)
        wo.sort(key=lambda x:x[1]) 
        wo.reverse()
        slice1 = np.array(wo[:20]) 
        lists = slice1[:,0] 
        subdoc.append(list(lists)) 
        #print(doc[0])
        t2 = time.time()
        print('processing time1(一回のfor文): ' + str(t2 - t1) + '(sec)')
        del wo

    return subdoc

def tfidf():

    proc = 8
    pool = mp.Pool(proc)
    doc = pool.map(subcalc, range(8))
    t3 = time.time()
    print(doc)
    print('processing time2(終わり): ' + str(t3 - t1) + '(sec)')

if __name__ == "__main__":
    tfidf()

-------------------------------------------------------------
実行結果

doc = pool.map(subcalc, range(8))
TypeError: 'float' object cannot be interpreted as an integer


word0_a.txt(一部抜粋)

["portions", "Sandwich", "top", "Rick", "come", "parents", "ONLY", "Brother", "advice", "My", "lunch", "text", "Sundays", "fish", "people", "friendly", "bit", "Fish", "giant", "Mom", "drinks", "Dad", "Sebak", "Pittsburgh", "CASH", "Open-Faced", "late", "afternoon", "staff", "ATM", "accurate", "several", "dishes", "recommendations", "Reuben", "early", "massive", "Mondays", "times", "affordable", "sandwich", "place", "Saturday", "prepared", "DELICIOUS", "Things", "today", "large", "time", "Steak", "sure", "recommendation", "good", "meal", "pretty", "Oh"]
["busy", "table", "portions", "taste", "ages", "service", "happy", "Rib", "Sandwiich", "years", "more", "while", "menu", "text", "people", "friendly", "fresh", "-Flounder", "little", "huge", "value", "lot", "Special", "delicious", "everything", "style", "nothing", "Pittsburgh", "girls", "movie", "reviews", "St", "few", "ways", "-Fish", "ambiance", "glad", "times", "slow", "Worth", "food", "Norfolk", "place", "miss", "prepared", "prices", "complaints", "-Salmon", "kitchen", "AWESOME", "hit", "Everything", "low", "large", "gem", "sure", "different", "-Prime", "good", "Most", "busier"]


どのように改善すればよろしいですか
よろしくお願いします

ちなみに並列化しないバージョンはこれです

import nltk
import numpy as np
import json
import nltk_exa as nl
import time

#def tfidf(word):
def tfidf():

    word = []
    f = open("word0_a.txt")
    line = f.readline()
    while line:
        line = f.readline()
        word.append(line.replace("[","").replace("]","").replace(",","").replace("\"","").split())
    f.close()
    word.pop()
    #tfidfの計算
    doc = []
    lists = []
    collection = nltk.TextCollection(word) #サイトにのっていた
    t1 = time.time()
    for do in word:
        wo=[]
        for term in set(do):
            if(collection.tf_idf(term, do) > 0):
                wo.append([term,collection.tf_idf(term, do)]) #ここも上のサイトにのってる
                #print(wo)
        wo.sort(key=lambda x:x[1]) 
        wo.reverse()
        #print(wo)
        slice1 = np.array(wo[:20]) #先頭の文字から終了インデックスまでが抽出
        lists = slice1[:,0] #[:]は戦闘から終了のインデックスまで抽出と、slice1の0番目を格納
        doc.append(list(lists)) #listsが文字列だから、リストに格納
        #print(doc[0])
        t2 = time.time()
        #print('processing time1(一回のfor文): ' + str(t2 - t1) + '(sec)')
        del wo

    print(doc)
    t3 = time.time()
    print('processing time2(終わり): ' + str(t3 - t1) + '(sec)')

if __name__ == "__main__":
        tfidf()
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

check解決した方法

0

http://kesin.hatenablog.com/entry/20110825/1314270919

このサイトを参考にしてできました
ご迷惑をおかけしました

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

「普通にTFIDFをするぶんにはできる」とありますが、並列処理以前にsubcalc(7) を実行したとき単体でも動かないですよね?

range(ini, fin) で浮動小数点を range() に入れていたり、set(do) で整数を set() に入れていたりとオブジェクトの型がめちゃくちゃです。

一気に書いて動いた!/動かない!をやっても今回のようにデバッグが大変だと思いますので、1ステップずつ動作を確かめながら開発することをおすすめします。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/07/06 20:32

    subcalc自体は並列化をするときに新たに加えたものです
    特にrangeやsetのところは参考にしたサイトによせて書いているので
    そこらへんの書き方がまずかったみたいです
    ありがとうございます

    キャンセル

  • 2017/07/06 20:39

    ちなみにこのサイトです
    http://qiita.com/yubais/items/5a9d91fe03fe715b21d0

    キャンセル

  • 2017/07/06 20:43

    動くコードをのせました
    どう変えればいいでしょうか

    キャンセル

同じタグがついた質問を見る

  • Python

    11744questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。