データナード

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

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モジュールは言語…

bicleanerにおけるProbabilistic Dictionaryの正式な生成方法

bicleanerのドキュメントに、確率的辞書の生成方法についての記述が追加されたので紹介します。 事前準備 mosesdecoderとmgizappをインストールします。 cd /opt git clone https://github.com/moses-smt/mosesdecoder.git git clone https://github.com/mos…

bicleanerの特徴量設計コードを抜き出す

bicleanerの特徴量設計のコードを抜き出すことが出来れば、他のツール(例えばzipporahやlaser)の特徴量を組み合わせて使えるようになります。 features.py 基本的に、特徴量設計は以下の部分にまとめて書かれています。 https://github.com/bitextor/biclean…

Zipporahの特徴量設計をpythonで実装

ZipporahはWebクロールによって収集したパラレルコーパスのノイズを除去するツールですが、bashによる複雑なスクリプトで実装されていてモジュール性がありません。そこで、特徴量設計部分をpythonで実装してみます。 論文の要点 ノイズ生成 実装 zipporah_f…

MGIZA++の最終出力からbicleaner用の確率的辞書を生成する

確率的辞書とは、ソース言語の各単語に対して、どのぐらいの確率でターゲット言語の対応する各単語が生起するかを表す辞書です。この辞書は、ターゲット言語の単語[space]ソース言語の単語[space]生起確率[newline]という形式で生成されます。MGIZA++は単語…

Webクロールで集めたパラレルコーパスをクリーニングする

パラレルコーパスフィルタリング1とは、ノイズのあるパラレルコーパスをクリーニングするタスクです。ParaCrawlプロジェクト2 のようにWebクロールしてパラレルコーパスを生成する手法では、間違った対応関係をもつ文ペアを保持することがあります。あるいは…

tensor2tensorのn-best出力を言語モデルでリスコアリング

NMTにおけるリスコアリングとは、NMTによって得た出力を、別のモデルで再評価することです。その一つの方法として、言語モデルによるリスコアリングがあります。 概要 tensor2tensorでn-best出力を得る KenLMで言語モデルを作成 コンパイル 言語モデルの作成…

SGNMT: 機械翻訳のためのデコーディングプラットフォーム

機械翻訳において性能を向上させるための一つの方法として、デコーディング系の手法があります。SGNMT1はStahlbergらによって開発されており、様々なデコーディング手法をサポートしているプラットフォームです。 概要 インストール install_openfst.sh inst…

探索と活用のトレードオフ: バンディットアルゴリズムでの検証

探索と活用のトレードオフとは、情報の探索にかける時間と、情報を活用する時間をどう割り振るかによって引き起こるトレードオフです。 バンディットアルゴリズムの概要 コーディング epsilon_greedy.py bernoulli_arm.py simulator.py jupyter notebookで実…

fairseqを試しに使ってみる

fairseq1とは、研究者や開発者が翻訳、要約、言語モデリング、その他のテキスト生成タスク用のカスタムモデルをトレーニングできるシーケンスモデリングツールキットです。 インストール データのダウンロード 前処理 mecab.pl split_data.py prepare.sh fai…

tensor2tensorでsentencepieceを使う方法

tensor2tensorのt2t-datagen1では指定したproblemに定義された方法を使ってtensorを生成します。内部ではSubwordTextEncoderを使ってサブワードに分割しますが、vocabファイルの生成において、sentencepieceよりも非効率なので大量のメモリを消費する上に実…

MTNTに対するモデリング

MTNTについての解説1や、WMT19でのタスク2などを書いてきましたが、今回は試しに実装してみます。 パイプライン モデル 結果 考察 参考 パイプライン 必要なデータのダウンロード データに対する準備 baselineモデルの訓練 逆翻訳の実行とファインチューニン…

WMT19 Robustness Taskの論文の1つをざっくりまとめる

WMT19のRobustness Task1とは、MTNT2のようなノイズありテキストに対する翻訳タスクです。 Robustness Taskの概要 論文の手法の概要 NMTモデル 前処理 モノリンガルデータ Placeholder ファインチューニング BLUEスコア 参考 今回は、そのうちの一つとして、…