データナード

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

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

ルールベースの言い換えは、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的な…

aws-parallelclusterでslurmを使う

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

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

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

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

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

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

記事テキストのコーパスから、単語の共起関係を使って単語グラフを生成するだけの単純なスクリプトを書きました。 コード 共起関係の構築 グラフの構築 グラフを使う例 追記 参考 コード 共起関係の構築 wordgraphは共起語のDBを使うため、それを構築する必…

CCNetとCCMatrixについて

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

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

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

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

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

括弧の文法エラーをチェックする30行のコード

括弧は、始括弧と終括弧のペアによって機能する文法です。括弧の文法エラーは単純なルールベースで検出できると思ったため、コードを書きました。 カッコの文法規則 コード テスト 考察 コーパス中の括弧の傾向 Text normalization 参考 カッコの文法規則 カ…

bitextorで使うlangstatsを生成する方法

langstatsでは、各ドメインに対する各々の言語のドキュメント量を定義します。langstatsをbitextorに渡せば、スレッショルドを指定して候補ドメインを制限することができます。このlangstatsを生成する方法があったので書きます。 paracrawl/extractor 使い…

記事に対するローカルクローラの抽象化

ローカルクローラは、「特定のサイト内に限定したクローラ」とここでは定義するとすると、さまざまなサイトに対して異なるクローラが存在するはずです。しかし、それらのローカルクローラの共通の特徴はなんでしょうか。 グローバルクローラとローカルクロー…

スクレイピングにおいてIPのBanを防ぐ方法

自然言語処理では、しばしばコーパスを作るためにWeb上のリソースを利用します。そのためにスクレイピングをするのですが、大量のリクエストを特定のサイトに送るとBanされる可能性があります。今回はそれを防ぐ一つの方法を書きます。(悪用厳禁) TL;DR 概要…

超効率のいいローカルキーバリューストアkyotocabinetを試してみた

データベースを使う必要はないが、メモリ内でやるには量が多すぎる、という場合にキーバリューストアを利用することができますが、より簡単かつ高速に実行できるライブラリの一つがkyotocabinet1です。今回は、kyotocabinetをインストールし、パフォーマンス…

字幕コーパスJESCのコードを理解し、パラレルコーパスを作成する

JESCとは、ネット上からクロールされた字幕データを用いた日英パラレルコーパスです。 概要 corpus_generation subscene_crawler.py parser_v4.py ドキュメントアラインメント 文アラインメント subscene_crawlerの機能追加とリファクタリング 追加したい機…

パラレルコーパスフィルタリングのMarginベーススコアリング

Marginベーススコアリング手法は、近傍探索を類似度に組み合わせた手法で、Facebook AI Researchによって論文が公開されています。 実装したいもの 簡易実装 使い方 課題 参考 実装したいもの Margin-based Parallel Corpus Mining with Multilingual Senten…

LASERtrain: 文Embedding LASERの訓練方法

LASERはクロスリンガルのセンテンスエンコーダとして使えるモデルです。 概要 LASERについての概要は以下で書いたことがあります。 Sentence Embeddingを用いた多言語の転移学習 - ナード戦隊データマン もし、publicの事前訓練済みモデルを使うだけならば、…

zipporahにLID+overlapスコアを追加する

機械翻訳のデータの質を大きく下げる要因として、言語の誤り、単語のオーバーラップがあります。 概要 zipporahスコアへの組み込み方 zipporahスコアはロジスティック回帰の決定関数を出力しています。この決定関数の最小値よりも小さな値を、「言語の不一致…

WMT19のパラレルコーパスフィルタリングのタスクでzipporahとbicleanerを比較

WMT19では、リソースの少ない言語に対するパラレルコーパスフィルタリングを共有タスクとして公開しています。 概要 zipprahとbicleanerの比較 実行方法 事前準備 プロジェクトのダウンロード 必要なツールのインストール データの準備 baselineの実行 自前…

Language Identificationの2つのモデルのパフォーマンスを比較

Language Identificationとは、与えられたテキストの言語の種類を予測するタスクです。 2つのモデル langdetectモジュール fasttextの公開モデル パフォーマンス比較 コード 結果 考察 2つのモデル langdetectモジュール pythonのlangdetectモジュールは言語…