2017-08-26 9 views
1

私はこのコードを使って、私がしばらくのうちに最適化するのに苦労してきました。ループを避け、パンダのデータフレームを正しく反復するには?

私のdataframeは2列のcsvファイルで、2列目にはテキストが含まれています。画像上のように見える:

enter image description here

Iは入力として単一のテキストと整数を必要とする関数集計(テキスト、n)を有しています。

def summarize(text, n): 
sents = sent_tokenize(text) # text into tokenized sentences 
# Checking if there are less sentences in the given review than the required length of the summary 
assert n <= len(sents) 
list_sentences = [word_tokenize(s.lower()) for s in sents] # word tokenized sentences 
frequency = calculate_freq(list_sentences) # calculating the word frequency for all the sentences 
ranking = defaultdict(int) 
for i, sent in enumerate(list_sentences): 
    for w in sent: 
     if w in frequency: 
      ranking[i] += frequency[w] 
# Calling the rank function to get the highest ranking 
sents_idx = rank(ranking, n) 
# Return the best choices 
return [sents[j] for j in sents_idx] 

だから私は最初、私は後で私ができるように、集計()関数にそれらを一つずつを送信するために再び反復され、私のデータフレームを反復処理し、すべてのテキストのリストを作成し、すべてのテキスト)(要約テキストの要約を取得します。これらのforループはコードを本当に遅くしていますが、効率を上げる方法を見つけ出すことはできませんでした。

data = pd.read_csv('dataframe.csv') 

text = data.iloc[:,2] # ilocating the texts 
list_of_strings = [] 
for t in text: 
    list_of_strings.append(t) # creating a list of all the texts 

our_summary = [] 
for s in list_of_strings: 
    for f in summarize(s, 1): 
     our_summary.append(f) 

ours = pd.DataFrame({"our_summary": our_summary}) 

EDIT: 、他の2つの関数は、次のとおりです。

def calculate_freq(list_sentences): 
frequency = defaultdict(int) 
for sentence in list_sentences: 
    for word in sentence: 
     if word not in our_stopwords: 
      frequency[word] += 1 

# We want to filter out the words with frequency below 0.1 or above 0.9 (once normalized) 
if frequency.values(): 
    max_word = float(max(frequency.values())) 
else: 
    max_word = 1 
for w in frequency.keys(): 
    frequency[w] = frequency[w]/max_word # normalize 
    if frequency[w] <= min_freq or frequency[w] >= max_freq: 
     del frequency[w] # filter 
return frequency 


def rank(ranking, n): 
    # return n first sentences with highest ranking 
    return nlargest(n, ranking, key=ranking.get) 

入力テキスト:レシピは簡単で、犬はそれらを愛します。私はこの本を何度も買うだろう。唯一のことは、レシピではどれくらいのおやつがあるのか​​を教えてくれないということですが、それはあなたがそれらをすべて異なるサイズにすることができるからです。素晴らしい買い物! 出力テキスト:私はこの本を何度も買うだろう。

+0

このコードの代わりに、テキストと予想される出力でデータを入力できますか? –

+0

pandas.DataFrame.applyを見てみるとよいでしょう。 –

+0

'summarize()'が別の関数を呼び出しています。このための入力と出力の例を含めることができますか? – roganjosh

答えて

1

あなたはこれを試しましたか?

# Test data 
df = pd.DataFrame({'ASIN': [0,1], 'Summary': ['This is the first text', 'Second text']}) 

# Example function 
def summarize(text, n=5): 

    """A very basic summary""" 
    return (text[:n] + '..') if len(text) > n else text 

# Applying the function to the text 
df['Result'] = df['Summary'].map(summarize) 

# ASIN     Summary Result 
# 0  0 This is the first text This .. 
# 1  1    Second text Secon.. 
+0

魅力的な作品です。本当にありがとう。 – saremisona

0

このような長い話...

私は、テキスト周波数解析を行っていることから、reviewTextの順序は重要ではありませんと仮定するつもりです。その場合、

Mega_String = ' '.join(data['reviewText']) 

レビューテキストのすべての文字列を1つの大きな文字列に連結し、各レビューを空白で区切ります。

あなたの関数にこの結果を投げることができます。

関連する問題