ナード戦隊データマン

機械学習, 自然言語処理, データサイエンスについてのブログ

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 …

ダークトライアドを2因子で説明する

ダークトライアドとは、自己愛性 (N)、他者の操作性 (M)、サイコパシー (P) の3つのパーソナリティ特性をあわせたものです。 精神医学とそのデータセット jupyterで実行 codebook 記述統計の表示 相関関係を見る kmeansでざっくりとクラスタリング ヒストグ…

パラフレーズ獲得の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はその多言語版です。 概要 ベースライン コード 訓練 テスト 結果 考察 参考 github.com 今回は、huggingfaceのBERTをPAWS-Xに使います。 概要 huggingface/transformers…

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

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

paraphrase retrievalをfaiss+laserで試す

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

paraphrase retrievalについてのメモ

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

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

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

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

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

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

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

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

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

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

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

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

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

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

wordnetは、同一概念の単語をまとめ、さらに概念の抽象度に基づくネットワークが定義されたデータです。 概要 単純なモジュール 文を生成する 何がしたいのか 参考 github.com 今回は、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的な…

aws-parallelclusterでslurmを使う

AWS parallelclusterとは、AWSでハイパフォーマンスコンピューティング(HPC)を実行するための環境です。slurmはワークロードを管理するためのツールで、分散実行したいジョブを管理します。今回は、paracrawl/extractorというツールの分散実行を例にします。…

単語Embeddingを2次元上にプロットする

前回 ( https://datanerd.hateblo.jp/entry/2019/12/14/134234 ) は、単語の共起グラフから単語Embeddingを作りました。今回は、このEmbeddingをプロットします。なお、ここでの手順は一般的なword2vecにも適用可能です。 コード 出力 考察 参考 github.com …

単語グラフから単語Embeddingを生成する

前回の記事( https://datanerd.hateblo.jp/entry/2019/12/13/123857 )で単語の共起関係からグラフを作成しました。今回は、そこで用いた共起関係を用いてEmbeddingを作成します。 考えた方法 コード 共起語の生成 Embeddingの訓練 不正なEmbeddingの修正 Emb…

wordgraph: 単語グラフを記事テキストから生成する

記事テキストのコーパスから、単語の共起関係を使って単語グラフを生成するだけの単純なスクリプトを作ったので書きます。 使い方 ダウンロード セットアップ 共起関係の構築 グラフの構築 グラフを使う例 追記 参考 github.com 使い方 ダウンロード $ git c…

CCNetとCCMatrixについて

CCNetとは、言語を識別しながらCommon Crawlからモノリンガルコーパスを生成するFacebook Researchのツールです。一方、CCMatrixは「CCNetによって生成されたコーパスからパラレルセンテンスを抽出する」というタスクに対する一つの手法です。 概要 CCMatrix…

sentimentjaの作り方: 日本語の感情分析モデルを簡単作成

sentiment_jaは、日本語テキストの感情を6種類に分類するためのモデルです。このモデルを作るのはそれほど難しくはありませんし、ブログ記事の中で作り方を書いた覚えがありますが、「使い方しかわからん!」という人もいると思うので、sentiment_jaを作るた…

sentimentjaのモデルを更新しました

sentimentjaは、2018年に作った感情分析モデルです。Ekmanの6感情に基づいて、テキストを6つの感情によって分類します。今回は、モデルを更新したので更新した部分がどこなのか書きます。 更新点 インストール 使い方 v2の注意点 リンク 更新点 tensorflowの…