データナード

機械学習と自然言語処理についての備忘録 (旧ナード戦隊データマン)

お知らせ: ブログの更新を終了

2020-07-11 13:00 でブログの更新を終了します。ブログ自体は残したままにしますが、新規記事の追加を行いません。 以上、よろしくお願いいたします。

継続収集としてのスクレイピング

継続的にターゲットサイトからスクレイピングするためのいくつかの経験則をまとめた。特定のプログラミング言語に依存する話は少なくしてある。 スクレイピングの困難点 1. ターゲットサイトのhtml構造に依存する 2. スクレイピングの効率を上げるとDoS攻撃…

自然言語処理でできること

「自然言語処理でできることは何か」という問いは有用性の観点から考えると自然に思えます。自然言語処理を研究して論文で発表したいのではなく、それを現実の機能要件1 に対して利用したい人もいます。ここでは、自然言語処理でできることについて、有用性…

HConvNetの実装

HConvNetは、Convレイヤーを積み上げ、各ConvレイヤーのMax Poolingを結合することでSentence Embeddingを生成する方法です。 概要 コード 考察 参考 概要 https://research.fb.com/wp-content/uploads/2017/09/emnlp2017.pdf LASERは、エンコーダで複数のBi…

keras-tunerを使う

keras-tunerとは、kerasのハイパーパラメータチューニングのためのツールです。 概要 コード サマリーの出力 考察 参考 追記 2020-04-15 13:10 2020-04-16 9:12 概要 問題: kerasでlaserを実装する際に、論文内に記述のない部分があり、その部分のパラメータ…

keras-laserの修正: ミニバッチ戦略の変更

ミニバッチとは、訓練イテレーションごとに全データの中から部分集合を抽出することです。ミニバッチ戦略は、そのミニバッチの生成方法に対する戦略です。 概要 適用したミニバッチ戦略 コードの主要部分 問題は解決できたのか この手法についての考慮点 次…

keras-laserのいくつかの修正

問題点 kerasでlaserを実装中だが、文Embeddingを使ってみると、どんな文ペアでも殆どが1に近い類似度になってしまう。 現状の解決策 build_model関数でモデルの主要な部分を引数から設定できるようにする。 問題点 現状の解決策 いくつかの仮説 問題に関連…

機械学習研究のためのREADME.mdテンプレート

開発者は、研究者と呼ばれる人々の研究成果をしばしば利用します。そのため、それらの研究成果の再現性は重要です。今回、Papers with Codeが機械学習コードの完全性のためのチェックリストを作成したようなので、それを見てみます。 英語読める人向け 概要 …

OPUSからデータを得てアラインメントする

OPUSとは、継続的に更新を続けている公開パラレルコーパスのコレクションです。 概要 コード 参考 概要 LASERの訓練時に、WikiMatrixを使っていましたが、データの質が悪いらしく、Sentence Embeddingがまともに機能しませんでした。そのため、LASERの論文内…

keras-laser: LASERをkerasで実装

LASERはマルチリンガルのSentence Embeddingを獲得するためのモデルで、facebook researchによって開発されています。 概要 事前準備 主要なコード 現状のモデル 現時点での考察 参考 LASERのオリジナルの事前訓練済みモデルはfairseqを用いて訓練されている…

Semantic Retrievalとは

Semantic Retrievalは、情報検索(IR)タスクの一つで、コーパスからクエリに類似するすべての文を探すタスクです。最近の手法は、主にエンコードされた対象の探索をANN(近似最近傍法)によって行い、その検索精度を評価します。ANNの手法が固定だと仮定すると…

sentence embeddingとdeep metric learning

paraphrase retrievalは、大量の文を保存したシステムに対してクエリを投げて、パラフレーズを高速に検索するタスクを指します。今回は、ベクトル検索のためにパラフレーズコーパスからsentence embeddingを学習する方法についてのメモを書きます。 triplet …

パラフレーズ獲得のbilingual pivotingを実装

bilingual pivotingは、対訳コーパスからパラフレーズを獲得する方法です。 概要 事前準備 mosesで対訳フレーズのアラインメント word2vecとkenlm コード 出力の一部 追記 2020-03-04 15:05 2020-03-05 9:34 2020-03-08 22:53 参考 github.com 概要 ググった…

edict2をjsonに変換

edict2は、JMdict/EDICTプロジェクトで作られている日英辞書です。この辞書を、英語をキー、キーに対応した日本語の単語リストをバリューとしたjsonに変換します。 事前準備 edict2のダウンロード edict2をutf-8化 pythonコード 出力の一部 追記 2020-02-27 …

PAWS-Xに対してhuggingfaceのBERTを使う

PAWSデータセットは、パラフレーズ検出のための英語データセットの一つですが、PAWS-Xはその多言語版です。 概要 ベースライン コード 訓練 テスト 結果 考察 参考 今回は、huggingfaceのBERTをPAWS-Xに使います。 概要 huggingface/transformersというプロ…

wordnetをベクトル化: 意味の外延的定義

意味の外延的定義とは、語の意味を、その語が表すすべてのもので表す方法です。例えば、乗り物={車, 電車, 自転車, 飛行機,...} など、全乗り物の集合で乗り物の意味を表します。 今回は、この外延的定義のアイデアを借りてwordnetをベクトル化します。 概要…

paraphrase retrievalをfaiss+laserで試す

paraphrase retrievalの概念的なメモを前回の記事で行いましたが、今回はベースラインモデルとしてfaiss+laserを使います。 説明 事前準備 データのダウンロード faissのインストール laserのインストール laserencoderのインストール 実行 データの分離 タ…

paraphrase retrievalについてのメモ

paraphrase retrievalは、クエリ文と同等の意味を持つ文をシステムから検索するタスクです。 整理 ベクトル検索 具体例 参考 整理 パラフレーズとはある文の言い換えのことですが、paraphrase retrievalではクエリと同等の意味を持つ文をシステムから検索す…

ルールベースの言い換え: 同義語辞書を使う

ルールベースの言い換えは、if-then形式のルールによってパラフレーズへ変換する方法です。 概要 事前準備 jupyterで実行 考察 参考 概要 言い換え(パラフレーズ)の手法が、抽出、変換、フィルタリングのどれかになることが多そうだ、ということを前回書きま…

パラフレーズコーパスの生成について整理

パラフレーズコーパスとは、ある文とその言い換えからなる同一言語のパラレルコーパスです。 整理 抽出 変換 フィルタリング 手法の例 具体的な方法 アノテーション 参考 整理 パラフレーズコーパスを作成する方法を分類すると、 抽出 変換, 生成 フィルタリ…

グラフ編集距離でmonolingual sentence alignmentをする

monolingual sentence alignmentとは、同一または類似の意味を持つ文ペアを単一言語コーパスから生成するものです。 概要 コード 考察 参考 追記: 2020-02-13 14:23 概要 モノリンガルコーパスに文がn個ある場合、このn個の文からすべての文ペアの組み合わせ…

係り受けパスによるインデクシングをパスのタイプで一般化

前回は日英での一般化において、パスに特定の係り受けタイプを持つトークンを残す方法を使いました。今回は、パスのタイプが複数あるという事実を確認し、それを一般化します。 係り受けのパスのタイプとは モジュール 説明 考察 参考 係り受けのパスのタイ…

係り受けパスによるインデクシングを日英に一般化

前回の係り受けパスによるインデクシングのためのアルゴリズムは、ginzaで日本語に対して適用することだけを念頭においていました。今回は、spacyの英語モデルとginzaの日本語モデルの両方に対する一般化を行います。 アルゴリズム概要 モジュール 参考 アル…

ginzaとnetworkxを使って係り受けパスで文をインデクシング

「共通性の高い文を見つける」という曖昧なタスクにおいて、動作とその目的が一致するものを選ぶ方法を試しています。要件として「類似性と共通性は違う」というものがあるため、単語ベクトルによる方法は使っていません。 概要 モジュール モジュールをつか…

wordnetで異なる抽象度の文を生成

wordnetは、同一概念の単語をまとめ、さらに概念の抽象度に基づくネットワークが定義されたデータです。 概要 単純なモジュール 文を生成する 何がしたいのか 参考 今回は、wordnetを使って単純な文を文レベルで抽象化・具体化します。 概要 以下の文がある…

slurm上でlangstat_generatorを実行

langstatは、各言語のデータが各ドメインにどのくらいあるのかを表す統計ですが、これを生成するためにlangstat_generatorというものを作っております。CommonCrawlは膨大なデータがある上に、cc_netと同様の方法で生成するという要件があったため、slurm上…

slurmでZero Bytes were transmitted or receivedが出たときに行った対処

slurmはジョブを複数の計算ノードに分散実行するために使えるミドルウェアですが、Zero Bytes were transmitted or receivedというエラーが頻発したため、行った対処方法をメモします。 TL;DR slurmの仕様の一つ 対処方法1: タスク実行中は常に標準出力を生…

langstat_generatorの高速化

langstat_generatorとは、cc_netの手法に基づいてlangstat (各ドメインの各言語のテキストがどのぐらいあるかの統計) を生成する自作スクリプトです。slurm上で実行することが目標でしたが、いくつか高速化したため、高速化した点を書きます。 github.com 3…

aws parallel clusterのcompute instanceにpythonパッケージを入れる方法

compute instanceは分散実行させる際に使うノードです。分散実行させるためには、各々のノードに必要なものが入っていなければなりません。どうすればpythonパッケージを入れられるでしょうか。 TL;DR 概要 インストール方法 方法1: virtualenvを使わない方…

cc_net的な方法でlangstatsを生成する

cc_netとは、CommonCrawlからモノリンガルコーパスを生成するためのツールです。langstatsを生成するのにも使えそうですが、slurmによる分散実行部分のコードが欠損しており、sbatchにcc_netを渡すには面倒なコードになってしまいます。そのため、cc_net的な…