Slide 1

Slide 1 text

1 文書分類をやってみた 伊藤 健一

Slide 2

Slide 2 text

2 自己紹介 ● 伊藤 健一 ( いとう けんいち ) ● 工学部電子情報工学科 3 年 ● 自然言語処理の研究室に所属 ● Python 歴は 5 ヶ月 ● 機械学習歴は 2 ヶ月

Slide 3

Slide 3 text

3 文書分類タスク概要 ● IT 系総合ニュースサイトから記事を 5 つのカテゴリのみスクレイピング カテゴリ : pc, game, travel, car, dc ● 与えられたニュース記事に対して、カテゴリを推定 ● 学習用データ : 約 15MB の JSON ファイル ● 評価用データ : 約 2MB の JSON ファイル

Slide 4

Slide 4 text

4 試した手法 ● 文章ベクトル化手法 – Bag of Words – TF-IDF (Term Frequency-Inverse Document Frequency) – Doc2Vec – SCDV (Sparse Composite Document Vectors) ● 分類器 – SVM (Support Vector Machine)

Slide 5

Slide 5 text

5 Support Vector Machine (SVM) ● 教師あり機械学習方法 ● 認識性能の優れた学習モデルの一つ ● 各データ点との距離が最大となる マージン最大化超平面を求める ● 未学習データに対する高い汎化性能 ● モデルを人が解釈することはできない ● 今回用いたのは線形 SVM https://home.hiroshima-u.ac.jp/tkurita/lecture/svm.pdf

Slide 6

Slide 6 text

6 https://scikit-learn.org/stable/tutorial/machine_learning_map/index.html

Slide 7

Slide 7 text

7 Bag of Wards 法とは? ● 文章に単語が含まれているかどうかのみを考え、 単語の並び方などは考慮しない ● 文書中にある単語が含まれている回数を値として用いる ● 例 : すもももももももものうち [ すもも , も , もも , も , もも , の , うち ] { すもも : 1, も :2, もも : 2, の : 1, うち :1} [1, 2, 2, 1, 1] ● 日本語の場合、 MeCab などで分かち書きにする必要が ある

Slide 8

Slide 8 text

8 TF-IDF とは ? ● TF (Term Frequency): 文書内における単語の出現頻度 1 つの文書に多く出現する単語ほど重要度が高くなる ● IDF (Inverse Document Frequency): ある単語が含まれている文書数を全ての文書数で割った ものの逆数 多数の文書に出現する単語ほど重要度が低くなる ● TF-IDF は TF と IDF を掛けあわせたもの

Slide 9

Slide 9 text

9 Doc2Vec とは? ● Word2Vec を単語レベルではなく、文や文書といった任 意の長さを扱えるように拡張したもの ● Word2Vec とは? – 単語のベクトル表現を得る方法 – 入力層、隠れ層、出力層からなる単純なニューラルネット ワーク – 単語同士の意味の近さが計算できる – 意味を足し引きできるようなベクトル表現が得られる “King” – “Man” + “Woman” = “Queen” “Tokyo” – “Japan” + “China” = “Beijing”

Slide 10

Slide 10 text

10 Sparse Composite Document Vectors (SCDV) ● 文章データから得られる全単語について、 Word2Vec ベク トルと idf 値を計算しておく。 ● この単語ベクトルについて、混合ガウスモデルで K クラス分 類に学習し、一つ一つの単語ベクトルが各クラスに属する予測 確率を単語ベクトルにかけて連結して、単語ベクトル数 * クラ スタ数に次元を広げる。 ● これに idf 値をかけたものが、単語ベクトル Word-topics vector 。 ● これを、文章の構成単語について平均をとって、スパースさせ たものを、文章ベクトルとして扱う。 ● 今回試した文章ベクトル化手法の中では一番精度が出るはず http://www.ie110704.net/2018/10/12/文書分散表現scdvと他の分散表現を 比較してみた/

Slide 11

Slide 11 text

11 評価用データに対する成績 ● Bag of Words: 正解率 97.61% (693 / 710) ● TF-IDF: 正解率 98.31% (698 / 710) ● Doc2Vec: 正解率 94.08% (668 / 710) ● SCDV: 正解率 96.48% (685 / 710) ()内は文書数 ● TF-IDF が一番正解率が高かった ● Doc2Vec 、 SCDV はパラメータチューニング不足の可能性 も ● データの性質的に TF-IDF で十分だった?

Slide 12

Slide 12 text

12 t-SNE による可視化 ● T-distributed Stochastic Neighbor Embedding (t-SNE) とは ? 元のデータの一部の特徴量を保持したまま、 2 次元や 3 次元への圧縮を行い高次元データを可視化する方法 ● 非線形な構造にも対応 ● より計算量の少ない UMAP という手法が 2018 年 2 月に出ました 最新の次元圧縮法"UMAP"について - Qiita

Slide 13

Slide 13 text

13 BoW( 左 ) と TF-IDF (右)の可視化

Slide 14

Slide 14 text

14 Doc2Vec( 左 ) と SCDV( 右 ) の可視化

Slide 15

Slide 15 text

15 使用した主なライブラリ ● MeCab の python wrapper: mecab-python3 – MeCab: 形態素解析エンジン – 日本語を分かち書きにするために使用 ● トピックモデリングライブラリ : gensim – Word2Vec 、 Doc2Vec のために使用 ● 機械学習ライブラリ : scikit-learn – BoW 、 TF-IDF 、 SVM 、 t-SNE のために使用 ● グラフ描画 : seaborn

Slide 16

Slide 16 text

16 Pickle ● Python の標準ライブラリにあるモジュール ● オブジェクトをバイト列などの表現に変換する ( 直列化 , Serialize という ) ● オブジェクトの状態を保存したり読み込んだりできる import pickle data = {'a': [1, 2.0, 3, 4 + 6j]} # 保存 with open('data.pickle', 'wb') as f: pickle.dump(data, f) # 読込み with open('data.pickle', 'rb') as f: data = pickle.load(f)

Slide 17

Slide 17 text

17 参考サイト ● 【特別連載】 さぁ、自然言語処理を始めよう!(第2回: 単純 集計によるテキストマイニング) | DATUM STUDIO株式会 社 ● scikit-learnでsvm 基本的な使い方 - 備忘録とか日常とか ● 文書分散表現SCDVと他の分散表現を比較してみた - 戦 略コンサルで働くデータサイエンティストのブログ ● SCDVを使ったテキスト分類をしてみる - どん底から這い上 がるまでの記録 ● t-SNEを使った文書ベクトルの可視化 - どん底から這い上 がるまでの記録 ● 高次元のデータを可視化するt-SNEの効果的な使い方 - D eepAge

Slide 18

Slide 18 text

18 参考サイト ● Bag of Wordsについて書いてみる - どん底から這い上が るまでの記録 ● Doc2Vec を使って日本語の Wikipedia を学習する|ofx mp3|note ● Doc2Vecの仕組みとgensimを使った文書類似度算出チ ュートリアル - DeepAge ● 文章をよしなに分散表現しよう | 東京工業大学デジタル創 作同好会traP