2017-01-18 8 views
-1

こんにちは、私のプロジェクトに取り組んでいます。私は以下のアルゴリズムを使ってテキストブロックの候補を取得したい。Python Pandas出力をcsvに保存する方法

私の入力が含まれているCSV形式のドキュメントです:

  1. HTML列:行のHTMLコードのタグ
  2. 言葉::内のテキスト行
  3. タグ列のHTMLコードアリーンタグ
  4. TC:ラインにおけるアンカー・ワードの数
  5. TG:タグの数ライン
  6. LTC内の単語の数ライン
  7. P:タグpの数およびBr線
  8. CTTDで:TCの+(0.2 * LTC)+ TG - P
  9. CTTDs:平滑CTTD

enter image description here

これは、テキストブロックの候補を見つけるための私のアルゴリズムです。私はcsvファイルをpandasを使ってデータフレームにします。私は候補を見つけるためにCTTD、TC、TGの列を使用しています。

from ListSmoothing import get_filepaths_smoothing 
import pandas as pd 
import numpy as np 
import csv 

filenames = get_filepaths_smoothing(r"C:\Users\kimhyesung\PycharmProjects\newsextraction\smoothing") 
index = 0 
for f in filenames: 
    file_html=open(str(f),"r") 
    df = pd.read_csv(file_html) 
#df = pd.read_csv('smoothing/Smoothing001.csv') 

    news = np.array(df['CTTDs']) 
    new = np.array(df['TG']) 

    minval = np.min(news[np.nonzero(news)]) 
    maxval = np.max(news[np.nonzero(news)]) 

    j = 0.2 
    thetaCTTD = minval + j * (maxval-minval) 
#maxGap = np.max(new[np.nonzero(new)]) 
#minGap = np.min(new[np.nonzero(new)]) 
    thetaGap = np.min(new[np.nonzero(new)]) 
    #print thetaCTTD 
    #print maxval 
    #print minval 
    #print thetaGap 
    def create_candidates(df, thetaCTTD, thetaGAP): 
     k = 0 
     TB = {} 
     TC = 0 
     for index in range(0, len(df) - 1): 
      start = index 
      if df.ix[index]['CTTDs'] > thetaCTTD: 
       start = index 
       gap = 0 
       TC = df.ix[index]['TC'] 
       for index in range(index + 1, len(df) - 1): 
        if df.ix[index]['TG'] == 0: 
         continue 
        elif df.ix[index]['CTTDs'] <= thetaCTTD and gap >= thetaGAP: 
         break 
        elif df.ix[index]['CTTDs'] <= thetaCTTD: 
         gap += 1 
        TC += df.ix[index]['TC'] 
      if (TC < 1) or (start == index): 
       continue 
      TB.update({ 
       k: { 
        'start': start, 
        'end': index - 1 
       } 
      }) 
      k += 1 
     return TB 

    def get_unique_candidate(TB): 
     TB = tb.copy() 
     for key, value in tb.iteritems(): 
      if key == len(tb) - 1: 
       break 
      if value['end'] == tb[key+1]['end']: 
       del TB[key+1] 
      elif value['start'] < tb[key+1]['start'] < value['end']: 
       TB[key]['end'] = tb[key+1]['start'] - 1 
      else: 
       continue 
     return TB 

    index += 1 
    stored_file = "textcandidate/textcandidate" + '{0:03}'.format(index) + ".csv" 
    tb = create_candidates(df, thetaCTTD, thetaGap) 
    TB = get_unique_candidate(tb) 
    filewrite = open(stored_file, "wb") 
    df_list = [] 
    for (k, d) in TB.iteritems(): 
     candidate_df = df.loc[d['start']:d['end']] 
     candidate_df['candidate'] = k 
     df_list.append(candidate_df) 
    output_df = pd.concat(df_list) 
    output_df.to_csv(stored_file) 

    writer = csv.writer(filewrite, lineterminator='\n') 
    filewrite.close 

ThetaCTTDが10.36でありthethaGap 1.

ある出力

enter image description here

ある出力は、テキストブロックの2つの候補があることを意味します。最初に、テキストブロックの候補は、行番号215と行末番号225から始まります(pict bellowのように)。もう1つのテキストブロックの候補は、行番号500と行末番号501から始まります。

私の質問は、行の数だけでなく、テキストブロックの範囲と他の列をcsvに保存する方法です出力としても表示されますか?

私の予想出力は、候補テキストブロックのスクリーンショットのようなものですが、あなたの出力を想定すると、この1

enter image description here

答えて

1

のようなものである辞書のリストです:私たちはラベルによってスライス

pd.concat([df.loc[d['start']:d['end']] for (k, d) in TB.iteritems()]) 

注意ので、d['end']が含まれます。


編集:新しい列に候補番号を追加します。

df_list = [] 
for (k, d) in TB.iteritems(): 
    candidate_df = df.loc[d['start']:d['end']] 
    candidate_df['candidate'] = k 
    df_list.append(candidate_df) 

output_df = pd.concat(df_list) 

それは終わりで、一度にすべてのデータフレームを連結するためにも高速です:2つの、連結操作を行うことよりも、

それはループを記述するクリーナーです。

+0

私はあなたが何を意味するのか分かりません。私に説明することはできますか?私のコードでどのような構文を追加する必要があります。私は自分のプログラムにあなたのコードを直接追加しますが、動作しません。 –

+0

[ここ](https://i.stack.imgur.com/ZzlDy.jpg)で印刷した変数は何ですか? – IanS

+0

私はTBの中でxのために印刷します.iteritems():print x。 TB.UPDATE –

関連する問題