ナード戦隊データマン

データサイエンスを用いて悪と戦うぞ

bpembをkerasのEmbeddingに凍結

BPEmbとは、事前訓練済みのSentencepieceモデルです。 github.com 今回は、BPEmbをKerasのEmbedding layerに凍結する方法を書きます。 コード まず、以下のURLからBPEmbをダウンロードします。 https://github.com/bheinzerling/bpemb#downloads-for-each-la…

議論マイニング: IBM Debater Claim Stance Dataset

IBM Debater Claim Stance Datasetとは、議題と主張を入力として、主張が議題に対して賛成か反対かを判定するためのデータセットです。 コード import pandas as pd import numpy as np import sentencepiece as spm from sklearn.utils import shuffle from…

討論を分析するというアイデア

討論とは、議題に対して賛否を争う言論上の戦いのことです。オンラインでは、debate.orgのようないくつかの議論サイトがあり、こういった議論のデータを使った分析が行えないか、というのが今回考えたいアイデアです。 概念図 なぜ討論を分析するのか 討論と…

名詞と形容詞の文内における共起関係

名詞と形容詞の共起関係の抽出は、その名詞の持つ性質についてなにか手がかりが得られるかもしれません。ここでは、名詞と形容詞の共起関係を抽出する単純なスクリプトを作成してみます。 コード # coding: utf-8 import nltk import nltk.tokenize as nt de…

入力語と共起しやすい単語をレコメンド

記事を書く人が利用するボキャブラリーやアイデアに悩んでいるとき、入力語に関連する単語をレコメンドすることによってアイデアが生まれるかもしれません。ここでは、そのような単語レコメンドのためのスクリプトを書きます。 wikipediaダンプから共起グラ…

XNLIとは何か

Cross-lingual Natural Language Inference (XNLI) コーパス1とは、MultiNLIコーパス2のために、集められたデータです。データは前提・仮説・ラベルから成り、14の言語に翻訳されています。このコーパスは、英語のNLIデータだけをトレーニング時に利用し、そ…

Sentence Embeddingを用いた多言語の転移学習

facebookresearch/LASER1とは、複数の言語に対応したSentence Embeddingです。 ざっくりした要約 LASERでは、英語のSentence Embeddingと他の言語のSentence Embeddingの類似度が同一空間で測れるように訓練されます。 モデル^2は以下のようになっています: …

Multilingual Unsupervised and Supervised Embeddings ってどんな手法?

facebook/MUSE1とは、Multilingual Word Embeddingにおいて、教師なし学習と教師あり学習を組み合わせた手法の一つ2です。 ざっくりいうと 2組のWord Embeddingを用いる。翻訳が共有空間において近くなるように写像を学習するのが目的。 教師あり学習 過去の…

英語word2vecを日本語word2vecに変換

マルチリンガルなWord Embeddingとは、複数の言語に対応するためのWord Embeddingの手法です。今回は、最も初歩的なモデルとして線形写像を使います。 概要 線形写像を用いたMultilingual Word Embeddingは、ソース言語のベクトルから、ターゲット言語のベク…

エンティティ名と定義文からタイプ予測

keras-self-attention1 は、self-attentionを簡単に使うためのライブラリです。今回は、このライブラリを使うことによって、エンティティタイプ予測の問題をより汎用的な特徴量から学習させられることを確かめます。 事前準備 pip install keras-self-attent…

語の定義を自動的に抽出する

Wikipediaにおけるエンティティとは、「ジョン・フォン・ノイマン」のようなタイトルを持つ、各々のページのことです。今回は、各々のエンティティを辞書的に定義する文を抽出します。 定義文の例 英語における定義文は、概ね以下の形式に従います。 X is a …

Wikipediaのタイプ予測

DBPedia Instance Typesは、DBPediaのオントロジー情報によって各記事を分類したものです。今回は、Wikipediaの記事をこのDBPedia Instance Typesで分類してみます。 特徴量 Wikipedia記事の定義文の単語の平均ベクトル。 Wikipedia記事のカテゴリー。 実行…

Word-sense disambiguation: 語義の曖昧性解消問題

曖昧性解消とは、ある単語が複数の意味を持つとき、文脈に応じて適切なエンティティを選択することです。今回は、前回作成したスクリプトの続きとして作成します。 仕組み node=(entity, mention), edge=(node1, node2)とした共起グラフを構築。 あるメンシ…

type probability: エンティティリンキングに使えそうな特徴量

DBPediaには、各エンティティのタイプ情報を持つデータがあります。今回は、Wikipediaから各メンションがどのエンティティと紐付いているかを統計的に算出し、その上でDBPediaと結びつけることで、語のタイプ確率を求めます。 実行 git clone https://github…

固有表現抽出のモデルを訓練する

NERとは、Named Entity Recognitionの略で、固有表現認識といいう自然言語処理のタスクの一つです。Stanford NER Taggerは、このタスクを解くためのツールです。今回は、これを自分で訓練します。 事前準備 まず、訓練データの例をダウンロードします。 http…

cmudict: 発音記号辞書をnltkから使う

cmudictとは、発音記号辞書です。nltkからこの辞書を使って、ラッパーのように韻(rhyme)を踏んでみます。 事前準備 コーパスをダウンロードします。 import nltk nltk.download("cmudict") たった30行のコード import random import nltk from collections i…

soundex: もしかして検索に使えそうなアルゴリズム

表音アルゴリズム(phonetic algorithm)とは、発音で語をインデクシングする方法です。ここでは、jellyfishというライブラリを使って、"natural language processing"のような語に似た語を作ってみます。 soundexとは soundexはphonetic algorithmの一つで、…

doccanoでAutoLabelingっぽいものを自前で実装

doccano1とは、@Hironsan が作成しているアノテーションツールです。今回は、いくつかの要件に基づいて自動ラベリングをテストします。 要件 手作業でアノテーションしたプロジェクトが数件ある。 それらのプロジェクトのラベルは一致している。 自動ラベリ…

Wikipedia記事のグラフ特徴量を求める

ページランクとは、グラフ特徴量の一つで、ネットワーク上のノードの重要性を判別するための量の一つです。ここでは、igraphというパッケージを用いてページランクを求めます。 事前準備 jawikiのダンプから、jawiki-latest-page.sql.gzとjawiki-latest-page…

単語ベクトルの性能評価

JWSAN1 とは、日本語単語類似度・関連度データセットです。ここでは、単語ベクトルの評価にこのデータセットを使ってみます。 事前準備 https://github.com/sugiyamath/jawiki2w2v を使ってword2vecモデルをjawikiから生成します。(おすすめは、t82w.pyを編…

BERTとfaissを組み合わせる

BERTをエンコーダとして使ったらどうなるか検証するために、文をエンコードし、それをfaissへ入れて類似性検索を行います。 そもそもBERTにおける文ベクトルってあるの? BERT Vector Space shows issues with unknown words https://github.com/google-rese…

word2vecのオンライン学習

nonce2vec1とは、少数のデータを用いて訓練済みWord2vecに新語を加えるなどする手法です。ここでは、その使い方を見てみます。 概要 nonce2vecは3つのフェーズを取ります。 事前訓練済みWord2vec(skip-gram)の読み込み。 訓練対象文のボキャブラリー構築。 …

jawiki2w2v: jawikiダンプからword2vecを自動生成

Wikipediaのダンプからword2vecを生成するやり方を知らない初心者がいると思ったので、Ubuntu上で簡単に実行できるスクリプトを作成したので紹介します。 jawiki2w2v jawiki dumpのURLを渡せばText8とword2vecを生成してくれるツール。 https://github.com/s…

word2vecで未知語に対処する

Word2vecの問題点は、訓練後のWord2vecのボキャブラリーは固定で、OOV(Out of vocabulary)へ対処できないことです。ここでは、Word2vecのボキャブラリーをsentencepieceでサブワード分割し、それを訓練することで未知語への対処を試みます。 モデル 事前に必…

移動平均を使って感情を気分へ変換する

感情や気分の心理学的な定義は、感情を使ったアプリの開発に役立てられると考えています。ここでは、感情の構成要素と、それを気分へ変換する方法を論文1をもとに書きます。 概要 感情は、ArousalとValenceという構成要素から成ります。Arousalは感情の覚醒…

共起頻度でタグ予測しMRRで評価

共起頻度とは、2つの対象x,yが現時点までの全イベントの中で同時に現れた回数のことです。今回は、インスタグラムから特定のユーザーのタグを抽出し、共起頻度を用いて予測し、それを平均適合率と平均逆順位を用いてスコアリングします。 問題定義 ユーザー…

ElasticsearchのLTRプラグインの使い方の実例

以前、LTRについての概略を書きましたが、技術的な詳細をあまり書かなかったので、今回はElasticsearchを用いた訓練の仕方を書きます。 利用するプラグイン 以下のプラグインを利用します: https://github.com/o19s/elasticsearch-learning-to-rank パイプラ…

タグレコメンデーション: グラフを使って次のタグを予測

StackLite 1 とは、stackoverflowの質問につけられたタグの一覧のデータセットです。このデータセットを使って、エレガントな方法でタグ候補を予測します。 仮定 使えるデータは、質問IDとそのIDに対応したタグのみ。 入力済みのタグから次のタグを予測する…

気分のダイナミクスに関する数理モデル

前回の記事では、とりあえずそれっぽい仮定の基でオレオレモデリングを行い、その結果をプロットしました。今回はちゃんとした感情・気分の数理モデルを論文1から使います。 論文概要 Modeling the Dynamics of Mood and Depression[^1] という論文では、発…

心理学的な現象の数理モデル化

感情は一時的かつ特定の事象に結びついているのに対し、気分は感情の集合で継続的かつ特定の事象に結びついていません1。この事実を利用してmatplotlibでプロットしてみます。 仮定 感情が引き起こると、ネガティブ(マイナス)またはポジティブ(プラス)の…