Ahogrammer

Deep Dive Into NLP, ML and Cloud

自然言語処理

バイオ医療分野と固有表現認識

最近、職場の同僚が「医療/製薬分野に自然言語処理を使えないか」というような話をしていた。私自身はその分野にそれほど関心が高かったわけではないが、固有表現認識系の論文で医療/化学ドメインに対する取り組みが行われているのは今までに目にしていた。…

文字ベース固有表現認識の手法たち

固有表現認識(NER: Named Entity Recognition)とは、テキストに出現する人名や地名などの固有名詞や、日付や時間などの数値表現を認識する技術です。NERはエンティティリンキングや関係抽出、イベント抽出、共参照解決といった自然言語処理タスクの要素技…

文の分散表現を計算するためのデータセットを作って公開する

先日、SageMakerのObject2vecに新機能が追加された。機能としては、ネガティブサンプリングの自動化、重み共有、学習の高速化といった機能が追加されており、以下のNotebookから試すことができる。このNotebookでは英文の分散表現の計算、モデルのデプロイ、…

Kerasで固有表現認識のf1スコアを計算する

一般に固有表現認識では、学習済みモデルの性能を評価するためにf1が使用されます。その際、評価はトークンごとではなくエンティティごとに行われるのが特徴となっています。 f1スコアを評価する関数は、多くの機械学習フレームワークに実装されています。し…

日本語 Sentiment Analyzer を作ってパッケージ化した話

Sentiment Analysisと言えば自然言語処理ではよく知られたタスクで、典型的にはテキストをポジティブ/ネガティブの2クラスに分類するものだ。 その使い道としては、Twitter等のSNSから自社製品についての投稿を収集して評価や緊急度によって分類し、問題に対…

テキストの構造化を支える技術 -OpenIEの未解決問題-

第3回目の今回は節ベースのOpenIE手法を紹介する予定でしたが、予定を変更してOpenIEの未解決問題について紹介することにします。 2018年に発表された論文「A Survey on Open Information Extraction」では、OpenIEには以下の未解決問題があると主張していま…

テキストの構造化を支える技術 -パターンマッチで始める情報抽出-

前回の記事「テキストの構造化を支える技術 -概要編-」では、OpenIEの記念碑的なシステムであるTextRunnerを紹介しました。第2回目である今回は、シンプルながら強力なReVerbと呼ばれるシステムを紹介します。 記事の構成としては、最初にTextRunnerの課題に…

テキストの構造化を支える技術 -概要編-

最近、情報抽出、特にOpen Information Extraction(OpenIE)という分野について勉強しています。せっかく勉強しているので、学んだ内容について何回かに分けて紹介していこうと思います。第一回目の今回は、OpenIEという分野の概要について紹介し、OpenIEの…

固有表現認識器に言語モデルを組み込んで、性能を向上させる

最近の自然言語処理では言語モデルを使って転移学習をしたり、性能向上に役立てたりするようになってきました。言語モデルの1つであるELMoでは、言語モデルから得られる分散表現を他のタスクの入力に使うことで、質問応答や固有表現認識、評価分析といった…

教師なしで作る評価分析器

評価分析は自然言語処理の基礎技術でありながら実世界に広く応用されている技術です。たとえば、顧客の声を拾うために商品レビューを評価分析して肯定的なのか否定的なのか判断するのに使われています。また、情報抽出の技術と組み合わせて、文書のどの部分…

文字ベース言語モデルの作り方

最近の言語処理では言語モデルを使って転移学習をしたり、性能向上に役立てたりするようになってきました。言語モデルの1つであるELMoでは、言語モデルから得られる分散表現を他のタスクの入力に使うことで、質問応答や固有表現認識、評価分析といった様々…

リアルタイム固有表現認識

固有表現認識器にanaGo、フロントエンドにVue.js、バックエンドにFlaskを使ってリアルタイムに固有表現認識をしてみた。 anaGo Demo github.com

KerasにおけるSpatialDropoutとは何者なのか?

SpatialDropoutは、画像認識の分野でTompsonらによって提案されたドロップアウト方法です。通常のドロップアウトが各要素を独立して落とすのに対して、SpatialDropoutはある領域全体をまるごと落とします。それにより、画像認識の分野で性能向上が報告されて…

単語の順序を考慮しつつ文書を固定長で表現する

本日はACL 2017のベストペーパーの1つである以下の論文で用いられている文書表現の方法を紹介します。 A Local Detection Approach for Named Entity Recognition and Mention Detection この論文は、固有表現認識をFeedForward Neural Networkを使って文書…

ディープラーニングで作る固有表現認識器

固有表現認識は自然言語処理の基礎技術であり、様々なタスクの要素技術として使われます。たとえば、情報抽出や対話システム、質問応答といった応用システムの中で固有表現認識は使われることがあります。また、関係認識やEntity Linkingといった基礎技術で…

Tweetを定期的に取得してBigQueryに格納する

本記事ではTwitter Search APIを使ってTweetを取得し、結果をBigQueryに格納する方法について紹介します。データ分析のフローである「取得」「保存」「分析」「可視化」のうち、「取得」と「保存」までを行うことになります。

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 でのやり方については意外と日本語の情報がありませんでした。 本…

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

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

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

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

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

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

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

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

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

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