各辞書には 1 つのツイートに関する情報が含まれている辞書を使用して、ツイートを複数の json ファイルに保存しました。各ディクショナリ内に、ユーザー ID (key="uid")、ツイート ID (key="id")、テキスト (key="txt")、およびタイムスタンプ (key="ts") を個別のキーとして保存しました。
ここで、json ファイルから辞書を読み込み、(ツイート ID に基づいて) 冗長なツイートを削除し、結果の冗長でないツイートを 1 つの大きな json ファイルに保存します。
json ファイルの 1 つに含まれるデータの例を以下に示します。
{"id": 1234, "txt":"text here 123", "ts":"Wed, 03 Apr 2013 12:03:28 +0000", "uid":12345}
{"id": 2345, "txt":"more text here", "ts":"Tue, 02 Apr 2013 16:50:20 +0000", "uid":23456}
{"id": 1234, "txt":"text here 123", "ts":"Wed, 03 Apr 2013 12:03:28 +0000", "uid":12345}
この例では、1 番目と 3 番目のツイートは冗長です。したがって、3 番目のツイートを削除したいと思います。
私がこれまでに持っているコードは以下のとおりです。Python での (限られた) 経験と Web 上の他の例に基づいてコードを作成したため、動作しません。次のエラーが表示されます: JSONDecodeError: Extra data: line 1 column 192 - line 1 column 10166 (char 192 - 10166)
少なくとも、ディレクトリ内のファイルを調べて冗長なツイートを削除するという点では、正しい方向に進んでいると思います。しかし、私の問題はjsonファイルを適切にロードして読み取ることにあると思います。ヘルプ、支援、またはガイダンスをいただければ幸いです。
(いいえ、私は課題のためにこれを行っている学生ではありません。研究のために Twitter データを分析することを望んでいる大学院生です。)
import string
import glob
import os
import simplejson as json
listoftweets = {} #to store all of the tweet ids
os.chdir("/mydir") #directory containing the json files with tweets
for f in glob.glob("*.json"):
t = open(f,"r") #loading the json with tweets
f1 = open(alltweets,"a") #open the json file to store all tweets
for line in t:
data = json.loads(line)
tid = data['tweetid']
if not listoftweets.has_key(tid): #if this isn't a redundant tweet
json.dump(data,f1) #dump into the json file
listoftweets[tid] = 0 #add this tweet id to the list
t.close()
f1.close()
編集
コードを少し修正しました。あたかも元のデータが新しい行の各ツイートに保存されていないように見えます.Gary Fixlerに感謝します. 問題が修正されたので、別のエラーが発生しています: Traceback
...
loaded C:\Python27\lib\site-packages\simplejson__init__.py 451
decode C:\Python27\lib\site-packages\simplejson\decoder. py 409
JSONDecodeError: 余分なデータ: 行 1 列 233 - 行 2 列 1 (文字 233 - 456)
その他のメモ: Wesley Baugh に感謝します。提案された変更をできるだけ多く実装しました。
また、一度にすべてを読み込むにはツイートが多すぎます。ツイートは 3 か月間継続して収集されました。
更新されたコードは以下のとおりです
listoftweets = {}
listoffiles = []
os.chdir("/mydir")
for f in glob.glob("*.json"):
listoffiles.append(str(f))
t2 = open("cadillaccue_newline.json",'a')
for files in listoffiles:
t = open(files,'r')
for line in t:
text = line
text = text.replace('}{','}\n{')
t2.write(text)
t.close()
t2.close()
t = open("cadillaccue_newline.json",'r')
f1 = open("cadillaccue_alltweets.json",'a')
for line in t:
data = json.loads(line)
tid = data['id']
if tid not in listoftweets:
json.dump(data,f1)
listoftweets[tid] = 0
t.close()
f1.close()