質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.83%

  • Java

    12835questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • Eclipse

    1568questions

    Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

Java-word2vecで日本語の関連単語を出力したい

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 85

sakamot

score 2

 前提・実現したいこと

word2vecで入力した単語(日本語)の関連単語を出力するプログラムを作りたいです。
このサイトのサンプルプログラム1を使いました。
27行目のraw_sentences.txtを日本語のウィキペディア全文(分かち書きにしたもの)のデータに置き換えただけでできると思い、実行したのですが、関連単語が出力されませんでした。
エラーはありませんでした。
英語ではなく日本語で実行できるようにするにはどうすればいいでしょうか。
教えていただけると幸いです。

 該当のソースコード

import java.io.File;
import java.io.IOException;
import java.util.Collection;

import org.deeplearning4j.models.embeddings.loader.WordVectorSerializer;
import org.deeplearning4j.models.word2vec.Word2Vec;
import org.deeplearning4j.text.sentenceiterator.LineSentenceIterator;
import org.deeplearning4j.text.sentenceiterator.SentenceIterator;
import org.deeplearning4j.text.sentenceiterator.SentencePreProcessor;
import org.deeplearning4j.text.tokenization.tokenizer.TokenPreProcess;
import org.deeplearning4j.text.tokenization.tokenizer.preprocessor.EndingPreProcessor;
import org.deeplearning4j.text.tokenization.tokenizerfactory.DefaultTokenizerFactory;
import org.deeplearning4j.text.tokenization.tokenizerfactory.TokenizerFactory;

/**
 * DeepLearning4jでWord2Vecを行うサンプルプログラム
 * @author karura
 */
public class Word2VecTest1
{

    public static void main(String[] args) throws IOException
    {
        // コーパス(文章集)データの読み込み
        // 読み込み時に文字をすべて小文字に変換する
        System.out.println( "Load data..." );
        File                f       = new File( "input/raw_sentences.txt" );
        SentenceIterator    ite     = new LineSentenceIterator( f );
        ite.setPreProcessor( new SentencePreProcessor()
        {
            @Override
            public String preProcess( String sentence ){ return sentence.toLowerCase(); }
        });

        // 文章を単語に分解
        // 分解時に単語を小文字に、半角数を"d"に変換する
        System.out.println( "Tokenize data..." );
        final EndingPreProcessor    preProcessor    = new EndingPreProcessor();
        TokenizerFactory            tokenizer       = new DefaultTokenizerFactory();
        tokenizer.setTokenPreProcessor( new TokenPreProcess()
        {
            @Override
            public String preProcess( String token )
            {
                token       = token.toLowerCase();
                String base = preProcessor.preProcess( token );
                base        = base.replaceAll( "\\d" , "d" );
                return base;
            }
        });

        // モデル作成
        System.out.println( "Build model..." );
        int     batchSize   = 1000;         // 1回のミニバッチで学習する単語数
        int     iterations  = 3;
        int     layerSize   = 150;

        Word2Vec    vec     = new Word2Vec.Builder()
                .batchSize( batchSize )         // ミニバッチのサイズ
                .minWordFrequency( 5 )          // 単語の最低出現回数。ここで指定した回数以下の出現回数の単語は学習から除外される
                .useAdaGrad( false )            // AdaGradを利用するかどうか
                .iterations( iterations )       // 学習時の反復回数
                .learningRate( 0.025 )          // 学習率
                .minLearningRate( 1e-3 )        // 学習率の最低値
                .negativeSample( 10 )           //
                .iterate( ite )                 // 文章データクラス
                .tokenizerFactory(tokenizer)    // 単語分解クラス
                .build();

        // 学習
        System.out.println( "Learning..." );
        vec.fit();

        // モデルを保存
        System.out.println( "Save Model..." );
        WordVectorSerializer.writeWordVectors( vec , "output/words.txt" );

        // 評価1(二つの単語の類似性)
        // コサイン距離
        System.out.println( "Evaluate model..." );
        String  word1       = "people";
        String  word2       = "money";
        double  similarity  = vec.similarity( word1 , word2 );
        System.out.println( String.format( "The similarity between 「%s」 and 「%s」 is %f" , word1 , word2 , similarity ) );

        // 評価2(ある単語に最も意味が近い言葉)
        String  word        = "day";
        int     ranking     = 10;
        Collection<String>  similarTop10    = vec.wordsNearest( word , ranking );
        System.out.println( String.format( "Similar word to 「%s」 is %s" , word , similarTop10 ) );


    }

}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • mts10806

    2018/06/19 15:00

    プログラムコード(およびエラーメッセージ)は質問内容としては最も重要な部分であるため、見やすくしていただけると助かります。<code>ボタン押下→「コード」部分にコードを貼り付け→「ここに言語を入力」に対象言語名記入(エラーメッセージの場合は不要)の手順で「コードハイライト化」してください。(質問編集画面ではリアルタイムでプレビューが表示されるので見ながら調整してください)

    キャンセル

  • mts10806

    2018/06/19 15:04

    また、マークダウンを利用することでリンクを貼れますので、調整してみてください。 https://teratail.com/help#about-markdown

    キャンセル

回答 1

checkベストアンサー

+1

形態素解析器(Tokenizer)がDefaultなのが問題なのでは。

日本語用の解析器を使ってみてはどうか。

deeplearning4jで日本語WikipediaのWord2Vecを作る - APITORE BLOG

Kuromojiについて - Qiita

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.83%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 受付中

    [java][日付チェック]質問

    java初心者です。 テキストファイルを一行づつ読み込んで行く時に、 32日や14月など、異常な日付が紛れていた場合例外として処理する方法はありますでしょうか? while ((

  • 受付中

    社員情報のプログラム

    社員情報のプログラム (JAVA) プログラの機能 (1)社員情報の追加 入力項目としては、社員番号、氏名(性、名)、生年月日(年、月、日) (3)で読み込んだ情報を追加する仕

  • 受付中

    計算機の機能追加に関する質問

    javaで計算機のプログラムを作成しました。 単項マイナス演算(例、-10+5)を行う処理を追加したいのですが 修正方法がわかりません。 どのように修正したらよいでしょうか?

  • 解決済

    javaについて

    javaについて質問です。情報処理検定第53回のプログラミング部門1級のjavaの問題をやっているんですけど、そのjavaに平均値を追加したいです。どのように追加すれば良いのでしょ

  • 解決済

    Javaでそれぞれの英単語のTFIDFの求め方がわかりません。

    Javaを独学で勉強中のJava初心者です。Javaで英文テキストファイルを読み込みそれぞれの英単語のTFIDFを表示させるプログラムを作りたいのですが、どうしてもうまくできません

  • 解決済

    Javaもしくは、openoffice calcを用いて様々な文字列を数値に変換したい

    Javaについての質問です。 このようなテキストファイルがあるとします userID           venueID     star g;ajgfadjfajk

  • 解決済

    javaの配列に文字を格納して処理する方法

     疑問、質問 javaについての質問です。 キーボードから文字を一字ずつ入力し配列に格納する。 その後配列に格納されていた文字によってそれぞれ順番に処理していくというプログラ

  • 解決済

    CSVからデータを取得して検索した文字列のみを表示したい

    プログラム初心者です。 Javaを勉強中で、質問があります。 CSVからデータを取得し、取得したデータの中から検索した文字列のみを表示するプログラムを作りたいです。

同じタグがついた質問を見る

  • Java

    12835questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • Eclipse

    1568questions

    Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。