NLP4J [004] Java로 자연 언어 처리와 구문 분석의 통계 처리를 사용해 텍스트 분석을 해본다

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

NLP4J를 사용하여 형태소 해석 결과와 간단한 통계 처리를 이용하여 텍스트 분석을 해 봅니다.

반복하지만,
「형태소 해석」이나 「구문 해석」은 요리로 말하면 「부엌칼의 사용법」에 가까운 느낌입니다.
「형태소 해석」이나 「구문 해석」에 가세해 「통계 처리」를 넣으면 텍스트 분석=요리에 가까워지는 것은 아닐까 생각합니다.
여기서 통계 처리는 간단한 것을 이용합니다만, 기계 학습이나 복잡한 통계 처리를 넣어 보는 것도 좋다고 생각합니다.

이제 여기에 다음과 같은 문서가 있다고 가정합니다. 한 줄이 한 레코드입니다.
"Toyota", "ハイブリッドカーを作っています。"
"Toyota", "ハイブリッドカーを売っています。"
"Toyota", "自動車を作っています。"
"Toyota", "自動車を売っています。"
"Nissan", "EVを作っています。"
"Nissan", "EVを売っています。"
"Nissan", "自動車を売っています。"
"Nissan", "ルノーと提携しています。"
"Nissan", "軽自動車を売っています。"
"Honda", "自動車を作っています。"
"Honda", "自動車を売っています。"
"Honda", "バイクを作っています。"
"Honda", "バイクを売っています。"
"Honda", "軽自動車を売っています。"
"Honda", "軽自動車を作っています。"

문서를 'Toyota', 'Nissan', 'Honda'로 나누어 생각했을 때 '특징적인'계속받는'키워드'는 무엇일까요?
특징적인 키워드를 NLP4J를 사용하여 내 보겠습니다. (어려운 처리는 하지 않습니다)
구문 분석을 사용하고, 통계 처리를 「SimpleDocumentIndex」클래스를 사용해 실시하고 있는 곳이 포인트입니다.

Maven


<dependency>
  <groupId>org.nlp4j</groupId>
  <artifactId>nlp4j</artifactId>
  <version>1.0.0.0</version>
</dependency>

코드1


public class HelloTextMiningMain2B {
    public static void main(String[] args) throws Exception {
        // ドキュメントの用意(CSVを読み込むなどでも可)
        List<Document> docs = new ArrayList<Document>();
        {
            docs.add(createDocument("Toyota", "ハイブリッドカーを作っています。"));
            docs.add(createDocument("Toyota", "ハイブリッドカーを売っています。"));
            docs.add(createDocument("Toyota", "自動車を作っています。"));
            docs.add(createDocument("Toyota", "自動車を売っています。"));
            docs.add(createDocument("Nissan", "EVを作っています。"));
            docs.add(createDocument("Nissan", "EVを売っています。"));
            docs.add(createDocument("Nissan", "自動車を売っています。"));
            docs.add(createDocument("Nissan", "ルノーと提携しています。"));
            docs.add(createDocument("Nissan", "軽自動車を売っています。"));
            docs.add(createDocument("Honda", "自動車を作っています。"));
            docs.add(createDocument("Honda", "自動車を売っています。"));
            docs.add(createDocument("Honda", "バイクを作っています。"));
            docs.add(createDocument("Honda", "バイクを売っています。"));
            docs.add(createDocument("Honda", "軽自動車を売っています。"));
            docs.add(createDocument("Honda", "軽自動車を作っています。"));
        }
        // 形態素解析アノテーター+構文解析アノテーター
        DocumentAnnotator annotator = new YjpAllAnnotator(); // 形態素解析+構文解析
        {
            System.err.println("形態素解析+構文解析");
            long time1 = System.currentTimeMillis();
            // 形態素解析+構文解析
            annotator.annotate(docs);
            long time2 = System.currentTimeMillis();
            System.err.println("処理時間[ms]:" + (time2 - time1));
        }
        // キーワードインデックス(統計処理)の用意
        Index index = new SimpleDocumentIndex();
        {
            System.err.println("インデックス作成");
            long time1 = System.currentTimeMillis();
            // キーワードインデックス作成処理
            index.addDocuments(docs);
            long time2 = System.currentTimeMillis();
            System.err.println("処理時間[ms]:" + (time2 - time1));
        }
        {
            // 「名詞...動詞」でNissanに共起性の高いキーワードの取得
            List<Keyword> kwds = index.getKeywords("名詞...動詞", "item=Nissan");
            System.out.println("名詞...動詞 for Nissan");
            for (Keyword kwd : kwds) {
                System.out.println(String.format("count=%d,correlation=%.1f,lex=%s", kwd.getCount(),
                        kwd.getCorrelation(), kwd.getLex()));
            }
        }
        {
            // 「名詞...動詞」でToyotaに共起性の高いキーワードの取得
            List<Keyword> kwds = index.getKeywords("名詞...動詞", "item=Toyota");
            System.out.println("名詞...動詞 for Toyota");
            for (Keyword kwd : kwds) {
                System.out.println(String.format("count=%d,correlation=%.1f,lex=%s", kwd.getCount(),
                        kwd.getCorrelation(), kwd.getLex()));
            }
        }
        {
            // 「名詞...動詞」でHondaに共起性の高いキーワードの取得
            List<Keyword> kwds = index.getKeywords("名詞...動詞", "item=Honda");
            System.out.println("名詞...動詞 for Honda");
            for (Keyword kwd : kwds) {
                System.out.println(String.format("count=%d,correlation=%.1f,lex=%s", kwd.getCount(),
                        kwd.getCorrelation(), kwd.getLex()));
            }
        }
    }
    static Document createDocument(String item, String text) {
        Document doc = new DefaultDocument();
        doc.putAttribute("item", item);
        doc.setText(text);
        return doc;
    }
}

Output


形態素解析+構文解析
処理時間[ms]:9618
インデックス作成
処理時間[ms]:3
名詞...動詞 for Nissan
count=1,correlation=3.0,lex=EV...売る
count=1,correlation=3.0,lex=EV...作る
count=1,correlation=1.5,lex=軽自動車...売る
count=1,correlation=1.0,lex=自動車...売る
名詞...動詞 for Toyota
count=1,correlation=3.8,lex=カー...売る
count=1,correlation=3.8,lex=カー...作る
count=1,correlation=3.8,lex=ハイブリッド...売る
count=1,correlation=3.8,lex=ハイブリッド...作る
count=1,correlation=1.9,lex=自動車...作る
count=1,correlation=1.3,lex=自動車...売る
名詞...動詞 for Honda
count=1,correlation=2.5,lex=バイク...売る
count=1,correlation=2.5,lex=軽自動車...作る
count=1,correlation=2.5,lex=バイク...作る
count=1,correlation=1.3,lex=自動車...作る
count=1,correlation=1.3,lex=軽自動車...売る
count=1,correlation=0.8,lex=自動車...売る

간단하네요!
이런 결과가 되었습니다!
인간의 감각과 맞습니까?

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

프로젝트 URL



htps //w w. nlp4j. rg/

좋은 웹페이지 즐겨찾기