自然言語処理の深遠

Deep Dive Into Natural Language Processing

Pythonで日本語の文字分散表現を学習する

最近の自然言語処理では、文字レベルの言語処理が行われることがあります。 これら文字レベルの言語処理は、ユーザ生成コンテンツに有効であると言われています。 その理由として、ユーザ生成コンテンツのような崩れたテキストでは、形態素解析の性能が大幅…

Pythonで単語分散表現のクラスタリング

最近の自然言語処理では、単語の分散表現は当たり前のように使われています。 単語分散表現では、各単語が高次元ベクトル空間に配置され、加減乗除等の演算を行えるようになります。 これらのベクトルは、意味の近い単語に対しては同じようなベクトルになる…

Wikipediaのリンクを解析して同義語を抽出する

自然言語処理をする際、同義語を考慮したい時があります。 たとえば情報検索を例に挙げると、「car」と検索したときその同義語である「automobile」も検索にかかってくれると嬉しい場合があります。 同義語を獲得する方法は色々考えられますが、本記事では、…

Wikipedia内ページランクを計算して、重要なページを抽出する

自然言語処理をする際、データソースとして Wikipedia を使用することがあります。 Wikipedia を使う際、ページによっては内容が薄いので、ページを選択することがあります。 そのための方法として、Wikipedia 内のページランクを計算して、重要ページを抽出…

日本語版text8コーパスを作って分散表現を学習する

単語の分散表現を学習させる際、Wikipedia ほどのサイズが必要ないときに使われるコーパスとして text8 があります。 text8 は、Wikipedia に対してクリーニング等の処理をした後、100MB分切り出して作成されています。 text8 は前処理済みで簡単に使えるの…

Python で DBpedia から情報抽出する

自然言語処理では、ナレッジベース(knowledge base)を使う場合があります。 その際、手軽に使えるナレッジベースとして DBpedia があります。 DBpedia は Web 上でクエリ(SPARQL)を実行できるのですが、利便性を考えるとプログラムからクエリを実行した…

gensimを使ってKerasのEmbedding層を取得する

2017/06/21にリリースされた gensim 2.2.0 から Keras との統合機能が導入されました。 具体的には、Word2vec の Keras 用ラッパが導入されました。 これにより、gensim で分散表現を学習した後に、その重みを初期値として設定した Keras の Embedding層を取…

Keras の RNN/LSTM/GRU で内部状態を取得する

自然言語処理で RNN を使っていると、RNN の内部状態を取得したくなることがあります。 TensorFlow では tf.nn.dynamic_rnn 等の関数を使うと、出力と状態を返してくれます。 しかし、Keras でのやり方については意外と日本語の情報がありませんでした。 本…

Keras の Conv1D と Convolution1D、MaxPool1D と MaxPooling1D の違い

Kerasで書かれたコードを読んでいるとふと気がつくことがある。 それは、Conv1D と Convolution1D、MaxPool1D と MaxPooling1D という同じような名前のクラスが出てくるのだ。 一体これらの違いは何なのだろうか?

文字レベルの畳込みニューラルネットワークによる文書分類

はじめに 自然言語処理で文書分類は最も基本的なタスクの一つです。 文書分類は、SNSに対する評判分析、ニュースのジャンル分類、メールのスパムフィルタや文書の著者推定といった問題の解決に使われています。 このように基本的なタスクである文書分類は広…

デバッガを使ってKerasのモデルをデバッグする

3行まとめ Keras で作成したモデルをデバッグしたい。 Keras には標準でデバッガが用意されていない。 Keras の Session オブジェクトを tfdbg でラップしてデバッグする。 オープンソースのニューラルネットワークライブラリである Keras は計算グラフに基…

Kerasでカスタムレイヤーを作成する方法

Kerasでは様々なレイヤーが事前定義されており、それらをレゴブロックのように組み合わせてモデルを作成していきます。 たとえば、EmbeddingやConvolution, LSTMといったレイヤーが事前定義されています。 通常は、これらの事前定義された便利なレイヤーを使…

KerasのLambda層でreshapeしたとき、保存に失敗する(場合がある)話

TL;DR keras.backendのreshapeを使ってLambda層でreshapeしたい reshapeのshapeにテンソルを指定するとモデルの保存(save)に失敗する saveではなくsave_weightsを使うと保存できる 背景 まず問題が起きる状況について説明しておきたい。 簡単にまとめると以…

Keras の fit と fit_generator の速度を比較する

Kerasでモデルを学習させるときによく使われるのが、fitメソッドとfit_generatorメソッドだ。 各メソッドについて簡単に説明すると、fitは訓練用データを一括で与えると内部でbatch_size分に分割して学習してくれる。 それに対し、fit_generatorではbatch_si…

形態素解析を並列化して高速化するTip

自然言語処理ではその第一歩として形態素解析が行われることが多いと思います。 しかし、形態素解析をする際に、解析対象が大量にあると実行時間が結構かかります。 本記事では、Pythonの concurrent.futures モジュールを使った高速化方法を紹介します。 ナ…

OpenCVでカメラ画像を取得したときの画像が暗かったのを直した話

機械学習で使うためにPythonからOpenCVを使ってカメラ画像を取得していた。 この際、取得した画像が暗くなってしまう問題に悩まされていた。 以下のような感じだ。 これではとても使えない。 結局ちょっとしたことで解決したので解決策をコードとともに載せ…

PyEnchant使ってサクッとスペルチェックをする

Pythonで英語のスペルチェックをしようとしていたら、PyEnchantというライブラリを見つけたので紹介。PyEnchantを使うことで、スペルチェックしたりミススペルした単語に対して訂正語を提示したりできる。イメージ的にはGoogleのもしかしてに近いことをでき…

Word Mover's Distance を使って文の距離を計算する

自然言語処理にとって文や文書間の類似度を計算するのは重要なタスクです。 類似文(書)の計算には、盗作の検知、関連記事の検索、質問応答における質問文の多様性の吸収といった様々な応用があります。 文書間の距離を計算する手法として Word Mover’s Dista…