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

[Indexに戻る](https://qiita.com/oyahiroki/items/ba79a759c599d3459d29) : [[004]構文解析の統計処理](https://qiita.com/oyahiroki/items/257b2d730fc71366fbcc) > [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
http://twitter4j.org/ja/index.html

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

#Maven POM
```xml
<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 の準備 (クラスパスに通す)
以下のプロパティファイルを用意しておき、クラスパスに通しておきます。

```properties
debug=false
http.prettyDebug=false

oauth.consumerKey= (1)で取得した値
oauth.consumerSecret= (2)で取得した値
oauth.accessToken= (3)で取得した値
oauth.accessTokenSecret= (4)で取得した値
jsonStoreEnabled=true
```
以下のような感じでパッケージのルートにファイルを配置しておくと確実です。
![hellonlp4j-twitter4j.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110265/ade18cdc-2de0-6c9b-deb4-8f832feaaea5.png)


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

```java
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に戻る](https://qiita.com/oyahiroki/items/ba79a759c599d3459d29) : [[004]構文解析の統計処理](https://qiita.com/oyahiroki/items/257b2d730fc71366fbcc) > [005-1] NLP4J+Twitter4J(データ収集) > 次のページ

#プロジェクトURL
https://www.nlp4j.org/
<img width="64" alt="NLP4J_N_128.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110265/4f59b21b-4b43-187d-0aac-7b99c0fd4bac.png">



---