Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
文書分類をやってみた
Search
Kenichi Ito
February 09, 2019
Technology
0
950
文書分類をやってみた
PyData.Fukuoka Meetup #2 - ハンズオン & LT大会 での発表資料
Kenichi Ito
February 09, 2019
Tweet
Share
Other Decks in Technology
See All in Technology
分解して理解する Aspire
nenonaninu
2
520
転生CISOサバイバル・ガイド / CISO Career Transition Survival Guide
kanny
3
1.1k
NFV基盤のOpenStack更新 ~9世代バージョンアップへの挑戦~
vtj
0
320
AWSを活用したIoTにおけるセキュリティ対策のご紹介
kwskyk
0
120
Oracle Cloud Infrastructure:2025年2月度サービス・アップデート
oracle4engineer
PRO
1
400
Cloud Spanner 導入で実現した快適な開発と運用について
colopl
1
980
なぜ私は自分が使わないサービスを作るのか? / Why would I create a service that I would not use?
aiandrox
0
910
Exadata Database Service on Cloud@Customer セキュリティ、ネットワーク、および管理について
oracle4engineer
PRO
2
1.5k
デスクトップだけじゃないUbuntu
mtyshibata
0
600
Reading Code Is Harder Than Writing It
trishagee
2
120
Perlの生きのこり - エンジニアがこの先生きのこるためのカンファレンス2025
kfly8
1
230
エンジニアリング価値を黒字化する バリューベース戦略を用いた 技術戦略策定の道のり
kzkmaeda
5
1.2k
Featured
See All Featured
Designing Dashboards & Data Visualisations in Web Apps
destraynor
231
53k
Scaling GitHub
holman
459
140k
KATA
mclloyd
29
14k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
44
7k
Optimising Largest Contentful Paint
csswizardry
34
3.1k
Agile that works and the tools we love
rasmusluckow
328
21k
YesSQL, Process and Tooling at Scale
rocio
172
14k
Principles of Awesome APIs and How to Build Them.
keavy
126
17k
GitHub's CSS Performance
jonrohan
1030
460k
Why Our Code Smells
bkeepers
PRO
336
57k
Building an army of robots
kneath
303
45k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
366
25k
Transcript
1 文書分類をやってみた 伊藤 健一
2 自己紹介 • 伊藤 健一 ( いとう けんいち ) •
工学部電子情報工学科 3 年 • 自然言語処理の研究室に所属 • Python 歴は 5 ヶ月 • 機械学習歴は 2 ヶ月
3 文書分類タスク概要 • IT 系総合ニュースサイトから記事を 5 つのカテゴリのみスクレイピング カテゴリ : pc,
game, travel, car, dc • 与えられたニュース記事に対して、カテゴリを推定 • 学習用データ : 約 15MB の JSON ファイル • 評価用データ : 約 2MB の JSON ファイル
4 試した手法 • 文章ベクトル化手法 – Bag of Words – TF-IDF
(Term Frequency-Inverse Document Frequency) – Doc2Vec – SCDV (Sparse Composite Document Vectors) • 分類器 – SVM (Support Vector Machine)
5 Support Vector Machine (SVM) • 教師あり機械学習方法 • 認識性能の優れた学習モデルの一つ •
各データ点との距離が最大となる マージン最大化超平面を求める • 未学習データに対する高い汎化性能 • モデルを人が解釈することはできない • 今回用いたのは線形 SVM https://home.hiroshima-u.ac.jp/tkurita/lecture/svm.pdf
6 https://scikit-learn.org/stable/tutorial/machine_learning_map/index.html
7 Bag of Wards 法とは? • 文章に単語が含まれているかどうかのみを考え、 単語の並び方などは考慮しない • 文書中にある単語が含まれている回数を値として用いる
• 例 : すもももももももものうち [ すもも , も , もも , も , もも , の , うち ] { すもも : 1, も :2, もも : 2, の : 1, うち :1} [1, 2, 2, 1, 1] • 日本語の場合、 MeCab などで分かち書きにする必要が ある
8 TF-IDF とは ? • TF (Term Frequency): 文書内における単語の出現頻度 1
つの文書に多く出現する単語ほど重要度が高くなる • IDF (Inverse Document Frequency): ある単語が含まれている文書数を全ての文書数で割った ものの逆数 多数の文書に出現する単語ほど重要度が低くなる • TF-IDF は TF と IDF を掛けあわせたもの
9 Doc2Vec とは? • Word2Vec を単語レベルではなく、文や文書といった任 意の長さを扱えるように拡張したもの • Word2Vec とは?
– 単語のベクトル表現を得る方法 – 入力層、隠れ層、出力層からなる単純なニューラルネット ワーク – 単語同士の意味の近さが計算できる – 意味を足し引きできるようなベクトル表現が得られる “King” – “Man” + “Woman” = “Queen” “Tokyo” – “Japan” + “China” = “Beijing”
10 Sparse Composite Document Vectors (SCDV) • 文章データから得られる全単語について、 Word2Vec ベク
トルと idf 値を計算しておく。 • この単語ベクトルについて、混合ガウスモデルで K クラス分 類に学習し、一つ一つの単語ベクトルが各クラスに属する予測 確率を単語ベクトルにかけて連結して、単語ベクトル数 * クラ スタ数に次元を広げる。 • これに idf 値をかけたものが、単語ベクトル Word-topics vector 。 • これを、文章の構成単語について平均をとって、スパースさせ たものを、文章ベクトルとして扱う。 • 今回試した文章ベクトル化手法の中では一番精度が出るはず http://www.ie110704.net/2018/10/12/文書分散表現scdvと他の分散表現を 比較してみた/
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 で十分だった?
12 t-SNE による可視化 • T-distributed Stochastic Neighbor Embedding (t-SNE) とは
? 元のデータの一部の特徴量を保持したまま、 2 次元や 3 次元への圧縮を行い高次元データを可視化する方法 • 非線形な構造にも対応 • より計算量の少ない UMAP という手法が 2018 年 2 月に出ました 最新の次元圧縮法"UMAP"について - Qiita
13 BoW( 左 ) と TF-IDF (右)の可視化
14 Doc2Vec( 左 ) と SCDV( 右 ) の可視化
15 使用した主なライブラリ • MeCab の python wrapper: mecab-python3 – MeCab:
形態素解析エンジン – 日本語を分かち書きにするために使用 • トピックモデリングライブラリ : gensim – Word2Vec 、 Doc2Vec のために使用 • 機械学習ライブラリ : scikit-learn – BoW 、 TF-IDF 、 SVM 、 t-SNE のために使用 • グラフ描画 : seaborn
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)
17 参考サイト • 【特別連載】 さぁ、自然言語処理を始めよう!(第2回: 単純 集計によるテキストマイニング) | DATUM STUDIO株式会
社 • scikit-learnでsvm 基本的な使い方 - 備忘録とか日常とか • 文書分散表現SCDVと他の分散表現を比較してみた - 戦 略コンサルで働くデータサイエンティストのブログ • SCDVを使ったテキスト分類をしてみる - どん底から這い上 がるまでの記録 • t-SNEを使った文書ベクトルの可視化 - どん底から這い上 がるまでの記録 • 高次元のデータを可視化するt-SNEの効果的な使い方 - D eepAge
18 参考サイト • Bag of Wordsについて書いてみる - どん底から這い上が るまでの記録 •
Doc2Vec を使って日本語の Wikipedia を学習する|ofx mp3|note • Doc2Vecの仕組みとgensimを使った文書類似度算出チ ュートリアル - DeepAge • 文章をよしなに分散表現しよう | 東京工業大学デジタル創 作同好会traP