0

ツイート分析用のシステムを設計する際にアドバイスが必要です。

目的: 特定のハッシュタグについて、他のハッシュタグとの共起頻度を調べます。時間ごとのパターンを見つけます。この形式のクエリに答えることができるはずです: 特定の日付 (たとえば 2013 年 4 月 13 日) と特定の 1 時間 (たとえば 3:00-4:00 PM ) について、上位 5 つの共起は何ですか?ハッシュタグ「#iPhone」。

私のアプローチ: 「twitter4j」ライブラリを使用して Twitter データにアクセスしています。1 回の呼び出しで 100 個のツイートを照会して取得できます (Twitter はそれらの数のみを許可します)。時間やその他の関連データを抽出できます。5 分ごとに Twitter にクエリを実行するスレッドを作成する予定です。これはオブザーバーの毎時パターンに対して行われます。これが私が打たれたところです:この情報をDBにどのように保存すればよいですか? 「#iPhone」で発生する頻度としてキーと値を持つハッシュマップを維持する必要があります。または、集計されていないデータを DB に直接保存する必要がありますか? オブザーバーの時間パターンに「twitter」を照会する最良の方法は何ですか? 時間をDBに「エポック」形式で保存するか、1つの列と時間をDBの別の列として日付として保存する必要がありますか?

貴重なご意見をありがとうございます。

4

3 に答える 3

2

Twitter で Streaming APIを使用することをお勧めします。これにより、Twitter への永続的な HTTP 接続を維持できるため、ツイートを検索できます。Twitter では、ツイート分析型のアプリケーションにStreaming APIを推奨しています。

ただし、分析を高速化するために、特定のデータを前処理する必要があります。また、twitter4j 固有のストリーミング APIサポートについても調べてください。

例として、次のGithub コードを調べてください。

于 2013-04-13T18:30:00.973 に答える
1

ay89 が言ったように、key - tag と value - freq を使用し、DB に格納する前に集計し、epoch を使用します。

さらに、これはマルチスレッド プログラムであるため、同期には次の 2 つのオプションがあります。

オプション 1 は、ConcurrentHashMapを使用することです。アグリゲーターが実行されると、以下が使用されます。

(for Key key : hashMap.keySet()) {
    Database.save(key, hashMap.get(key));
    hashMap.replace(key, 0);
}

つまり、タグをデータベースに書き込んだ後、タグの freq を 0 に設定します。そして、ツイートデータを追加する方法は使用します

public void increment(Key key) {
    boolean done = false;
    while(!done) {
        int current = hashMap.get(key);
        int newValue = current + 1;
        done = hashMap.replace(key, current, newValue);
    }
}

これは、頻度をインクリメントするためのスレッドセーフな方法です。

オプション 2 はおそらくより理にかなっています。アグリゲーターは、ハッシュマップを新しいインスタンスに置き換えます。

class DataStore {
    Map map = new HashMap();

    public void add(Key key, Value value) {
        // called by the method querying tweet data
    }

    public void aggregate() {
       // called by the aggregator thread every five minutes
       Map oldMap = map;
       map = new HashMap();
       DataBase.save(oldMap);
   }
}

肝心なのは、アグリゲーターがハッシュマップをデータベースに保存している間、制御されていない方法でハッシュマップを変更したくないということです。2 番目のオプションは、アグリゲーターが古いハッシュマップをデータベースに保存している間に、クエリを実行するスレッドが変更する新しいハッシュマップを作成するだけなので、より単純です。

于 2013-04-13T18:16:16.223 に答える
0

頻度のみを取得する必要があるため、ハッシュに保存することをお勧めします (キー - タグ、値 - 頻度)。集計されていないデータを db に保存すると、より多くのスペースが必要になるため (ほとんどの場合、不要な情報のために)、最終的には後で集計する必要があります。

エポック時間は時間を保存する良い方法です。後で必要に応じて、タイムゾーンに従ってローカライズするために使用できるためです。

于 2013-04-13T11:22:56.210 に答える