LoginSignup
0
0

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-10-28

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

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

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/
NLP4J_N_128.png


0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0