0

感情が割り当てられた単語のリスト (ファイル 2、タブ区切り、2 列) に対して、ツイート (ファイル 1、標準の twitter json 応答) の感情分析を行うのに問題があります (ポジティブまたはネガティブ)。

問題は、一番上のループが 1 回しか実行されず、ファイル 1 をループしている間にスクリプトが終了し、ファイル 2 をループしている間にスクリプトが終了し、その中でファイル 2 をループし、各ツイートの結合された感情の現在の合計を比較して保持しようとすることです。

ので、私は持っています:

def get_sentiments(tweet_file, sentiment_file):


    sent_score = 0
    for line in tweet_file:

        document = json.loads(line)
        tweets = document.get('text')

        if tweets != None:
            tweet = str(tweets.encode('utf-8'))

            #print tweet


            for z in sentiment_file:
                line = z.split('\t')
                word = line[0].strip()
                score = int(line[1].rstrip('\n').strip())

                #print score



                if word in tweet:
                    print "+++++++++++++++++++++++++++++++++++++++"
                    print word, tweet
                    sent_score += score



            print "====", sent_score, "====="

    #PROBLEM, IT'S ONLY DOING THIS FOR THE FIRST TWEET

file1 = open(tweetsfile.txt)
file2 = open(sentimentfile.txt)


get_sentiments(file1, file2)

file2 のネストされた for ループを使用せずにすべてのツイートを出力する理由を理解するために半日を費やしましたが、それを使用すると、最初のツイートのみを処理してから終了します。

4

1 に答える 1

3

一度だけ実行する理由は、for ループがファイルの最後に到達したためです。これ以上読み取る行がないため停止します。

つまり、最初にループを実行すると、ファイル全体がステップ実行されます。次に、読み取る行がもうないため (ファイルの最後に達したため)、再度ループすることはなく、結果は 1 つだけになります。処理中の行。

これを解決する 1 つの方法は、ファイルを「巻き戻す」ことです。これseekは、ファイル オブジェクトのメソッドを使用して行うことができます。

ファイルが大きくない場合は、別の方法として、それらすべてをリストまたは同様の構造に読み込んでからループする方法があります。

ただし、センチメント スコアは単純なルックアップであるため、センチメント スコアを使用してディクショナリを作成し、ディクショナリ内の各単語をルックアップして、ツイートの全体的なセンチメントを計算することをお勧めします。

import csv
import json

scores = {}  # empty dictionary to store scores for each word

with open('sentimentfile.txt') as f:
    reader = csv.reader(f, delimiter='\t')
    for row in reader:
        scores[row[0].strip()] = int(row[1].strip()) 


with open('tweetsfile.txt') as f:
    for line in f:
        tweet = json.loads(line)
        text = tweet.get('text','').encode('utf-8')
        if text:
            total_sentiment = sum(scores.get(word,0) for word in text.split())
            print("{}: {}".format(text,score))

with statementファイル ハンドラを自動的に閉じます。csvモジュールを使用してファイルを読み取ります(タブ区切りファイルでも機能します)。

この行は計算を行います:

total_sentiment = sum(scores.get(word,0) for word in text.split())

このループを短く書く方法は次のとおりです。

tweet_score = []
for word in text.split():
    if word in scores:
        tweet_score[word] = scores[word]

total_score = sum(tweet_score)

ディクショナリのgetメソッドは、キーが見つからない場合にカスタム値を返すために、2 番目のオプションの引数を取ります。この 2 番目の引数を省略すると、 が返されNoneます。私のループでは、単語にスコアがない場合に 0 を返すために使用しています。

于 2013-05-06T04:53:23.350 に答える