NLP4J [005-1] Twitter4J と NLP4J でTwitter分析をしてみる(データ収集)


Indexに戻る : [004]構文解析の統計処理 > [005-1] NLP4J+Twitter4J(データ収集) > 次のページ

データ収集

では次にNLP4JでTwitterのデータを分析してみましょう。

今のところNLP4Jは「お手軽分析」の位置づけですので、お手軽に分析してみます。

分析シナリオとしては自動車各社(トヨタ、日産、ホンダ)の公式Twitterがどのようなツイートをしているのかを分析してみる、というものにしてみます。
https://twitter.com/TOYOTA_PR
https://twitter.com/NissanJP
https://twitter.com/HondaJP

適当にクエリーを作り替えることで様々な切り口とデータでの分析ができそうな”気がします”。

まずはデータ収集から行いましょう。

Twitterのデータ収集には、Twitter API の Java Wrapperとして有名な「Twitter4j」を使ってみることにします。

Twitter4J

Maven pom.xml に Twitter4J を追加しましょう。

Maven POM

<dependency>
    <groupId>org.nlp4j</groupId>
    <artifactId>nlp4j</artifactId>
    <version>1.0.0.0</version>
</dependency>
<dependency>
    <groupId>org.twitter4j</groupId>
    <artifactId>twitter4j-core</artifactId>
    <version>[4.0,)</version>
</dependency>

Twitter4J の準備

Twitter アプリの定義

以下にアクセスして、アプリケーションの定義を行います。
https://apps.twitter.com/

キーの取得

アプリケーションの定義をするとapps.twitter.com にて以下の値を取得できますのでコピーしておきます。

Application Settings
Consumer Key (API Key) --> (1)としてメモ
Consumer Secret (API Secret) --> (2)としてメモ

Your Access Token
Access Token --> (3)としてメモ
Access Token Secret --(4)としてメモ

twitter4j.properties の準備 (クラスパスに通す)

以下のプロパティファイルを用意しておき、クラスパスに通しておきます。

debug=false
http.prettyDebug=false

oauth.consumerKey= (1)で取得した値
oauth.consumerSecret= (2)で取得した値
oauth.accessToken= (3)で取得した値
oauth.accessTokenSecret= (4)で取得した値
jsonStoreEnabled=true

以下のような感じでパッケージのルートにファイルを配置しておくと確実です。

Code

収集したツイートを直接NLP4Jに投入してみます。
(もちろんCSVやJSONなどのファイルに保存してもOKです。)

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

import nlp4j.DocumentAnnotator;
import nlp4j.Document;
import nlp4j.Index;
import nlp4j.Keyword;
import nlp4j.impl.DefaultDocument;
import nlp4j.index.SimpleDocumentIndex;
import nlp4j.yhoo_jp.YjpAllAnnotator;
import twitter4j.Query;
import twitter4j.QueryResult;
import twitter4j.Status;
import twitter4j.Twitter;
import twitter4j.TwitterFactory;

public class HelloTextMiningTwitter {
    public static void main(String[] args) throws Exception {
        String[] accounts = { "NissanJP", "TOYOTA_PR", "HondaJP" };
        List<Document> docs = new ArrayList<Document>();
        for (String account : accounts) {
            docs.addAll(createDocumentTwitter(account));
        }
// 形態素解析アノテーター+構文解析アノテーター
        DocumentAnnotator annotator = new YjpAllAnnotator(); // 形態素解析+構文解析
        {
            System.err.println("形態素解析+構文解析");
            // 形態素解析+構文解析
            annotator.annotate(docs);
        }
// キーワードインデックス(統計処理)の用意
        Index index = new SimpleDocumentIndex();
        {
            System.err.println("インデックス作成");
            // キーワードインデックス作成処理
            index.addDocuments(docs);
        }
        {
            // 頻度の高いキーワードの取得
            System.out.println("名詞の頻度順");
            List<Keyword> kwds = index.getKeywords();
            kwds = kwds.stream() //
                    .filter(o -> o.getCount() > 1) // 2件以上
                    .filter(o -> o.getFacet().equals("名詞")) // 品詞が名詞
                    .collect(Collectors.toList());
            for (Keyword kwd : kwds) {
                System.out.println(
                        String.format("count=%d,facet=%s,lex=%s", kwd.getCount(), kwd.getFacet(), kwd.getLex()));
            }
        }
        for (String account : accounts) {
            {
                // 共起性の高いキーワードの取得
                List<Keyword> kwds = index.getKeywords("名詞", "item=" + account);
                System.out.println("名詞 for " + account);
                for (Keyword kwd : kwds) {
                    System.out.println(String.format("count=%d,correlation=%.1f,lex=%s", kwd.getCount(),
                            kwd.getCorrelation(), kwd.getLex()));
                }
            }
            {
                // 共起性の高いキーワードの取得
                List<Keyword> kwds = index.getKeywords("名詞...動詞", "item=" + account);
                System.out.println("名詞...動詞 for " + account);
                for (Keyword kwd : kwds) {
                    System.out.println(String.format("count=%d,correlation=%.1f,lex=%s", kwd.getCount(),
                            kwd.getCorrelation(), kwd.getLex()));
                }
            }
        }
    }

    static List<Document> createDocumentTwitter(String item) {
        ArrayList<Document> docs = new ArrayList<Document>();
        try {
            Twitter twitter = TwitterFactory.getSingleton();
            Query query = new Query("from:" + item);
            query.setCount(10);
            QueryResult result = twitter.search(query);
            for (Status status : result.getTweets()) {
                // System.out.println("@" + status.getUser().getScreenName() + ":" +
                // status.getText());
                Document doc = new DefaultDocument();
                doc.putAttribute("item", item);
                doc.setText(status.getText());
                docs.add(doc);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return docs;
    }
}

簡単ですね!
次のページでは、分析結果を見てみることにします。


Indexに戻る : [004]構文解析の統計処理 > [005-1] NLP4J+Twitter4J(データ収集) > 次のページ

プロジェクトURL

https://www.nlp4j.org/