NLP4J [005-1] Twitter4J와 NLP4J에서 Twitter 분석을 해본다(데이터 수집)

색인으로 돌아가기 : [004] 구문 분석의 통계 처리 > [005-1] NLP4J+Twitter4J(데이터 수집) > 다음 페이지

데이터 수집



이제 NLP4J에서 Twitter 데이터를 분석해 보겠습니다.

지금까지 NLP4J는 「간편 분석」의 위치 지정이므로, 간편하게 분석해 보겠습니다.

분석 시나리오로서는 자동차 각사(토요타, 닛산, 혼다)의 공식 Twitter가 어떤 트윗을 하고 있는지를 분석해 본다고 합니다.
htps : // 라고 해서 r. 이 m / 토요타_PR
htps : // 라고 해서 r. 코 m / 닛산 JP
htps : // 라고 해서 r. 코 m/혼다 JP

적당히 쿼리를 바꾸는 것으로 여러가지 커트와 데이터로의 분석을 할 수 있을 것 같은 “기분합니다”.

우선은 데이터 수집으로부터 실시합시다.

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 앱 정의



다음에 액세스하여 응용 프로그램을 정의합니다.
htps : // 아르 ps. 라고 r. 코m/

키 획득



응용 프로그램을 정의하면 apps.twitter.com에서 다음 값을 얻을 수 있으므로 복사하십시오.

애플리케이션 설정
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

아래와 같은 느낌으로 패키지의 루트에 파일을 배치해 두면 확실합니다.


코드



수집한 트윗을 직접 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;
    }
}


간단하네요!
다음 페이지에서는 분석 결과를 살펴보겠습니다.

색인으로 돌아가기 : [004] 구문 분석의 통계 처리 > [005-1] NLP4J+Twitter4J(데이터 수집) > 다음 페이지

프로젝트 URL



htps //w w. nlp4j. rg/

좋은 웹페이지 즐겨찾기