Ahogrammer

Deep Dive Into NLP, ML and Cloud

機械学習

文書検索におけるリランキングの効果を検証する

日本語でのキーワード検索とベクトル検索に対して、検索結果のリランキングを適用して性能を評価してみました。 リランキングとは? 文書検索では検索クエリにマッチングした文書を順位付けして返しますが、その結果を何らかのモデルを使って並び替えること…

scikit-learnの学習済みモデルをONNX形式に変換して配布する

だいぶ昔の話ですが、日本語テキストをネガ/ポジ分類するソフトウェアとして、scikit-learnを用いて『asari』を作り、Pythonパッケージとして公開したことがあります。作った自分でも存在をほぼ忘れていたのですが、ときどき使うことを試みる方がいて、Issue…

部分的にアノテーションされたデータからの固有表現認識器の学習

本記事では、部分的にアノテーションされたデータを用いて、固有表現認識モデルの学習を試みます。

Python 3.7向けにSageMaker PyTorch Containerをビルドする

先日、Flairを使ったモデルを構築し、SageMakerのトレーニングジョブに投げたところモデルの保存で躓いた。原因を調べたところ、pickleでダンプしようとしていたオブジェクトの中に、Python 3.6ではダンプできないオブジェクトがあるようだった。そこで、Sag…

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

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

入門 AWS Step Functions

最近は仕事の一つとして、機械学習用のワークフローを作成しています。ワークフローを作成するサービスやソフトウェアはいくつかありますが、それら中でもAWS Step Functionsを使おうと考えています。今回の記事は、AWS Step Functionsについて調べたことを…

Object2vecの新機能を使って文の分散表現を計算する

前回の記事では、日本語文の分散表現を計算するためのデータセットを作成した。 hironsan.hatenablog.com 今回は、先日、SageMakerのObject2vecに追加された機能を使って文の分散表現を計算する。追加された機能には、ネガティブサンプリングの自動化、重み…

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

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

Jupyter NotebookがGitHub上で表示されない時にすること

機械学習に携わる人であればJupyter Notebookは頻繁に使うツールであり、共有するときにはGitHubを使うのが一般的だろう。GitHubにはブラウザ上でNotebookをレンダリングする機能があり、地味に便利なのだが、ときたまレンダリングされないNotebookが存在す…

今日からはじめるレコメンデーション -探索と利用のジレンマとベイジアンアプローチ-

前回の記事では平均評価による推薦の問題点とその解決策について紹介しました。推薦の際に確信度が考慮されない問題点を信頼区間で、評価数が0の場合にスコアが不定になる問題点をスムージングによって解決する方法について紹介しました。 hironsan.hatenabl…

今日からはじめるレコメンデーション -平均評価による推薦の問題点と対策-

前回の記事では人気度と新規性、またそれらをハイブリッドした手法による推薦の方法について紹介しました。そこでは、人気度と新規性に基づく手法の問題点とその解決方法について説明しました。 hironsan.hatenablog.com 今回は、平均評価に基づく推薦の問題…

今日からはじめるレコメンデーション -Hacker Newsに学ぶスコア関数の設計-

レコメンデーションといえば、現在最も多く使われている技術の一つと言えるでしょう。その応用は数多く存在し、身近なところで言えば、Amazonによる関連商品の推薦やNetflixによる映画の推薦などに使われており、私たちの意思決定を支援しています。 一口に…

日本語 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といった基礎技術で…

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

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

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

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

日本語版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 という同じような名前のクラスが出てくるのだ。 一体これらの違いは何なのだろうか?