近年、多くの企業が連日、AIやビッグデータ関連のリリースを出しておりまして、
それに伴い、データサイエンティストの市場価値も高まっている状況です。
しかしながら今後、AIが発達して自動でデータの収集や分析、可視化を行う世界が来た時、
データサイエンティストの価値とは何になるのでしょうか。
データサイエンティストとは、データサイエンティスト協会によると
統計・機械学習スキル x プログラミング(エンジニアリング)スキル x ビジネススキルを併せ持ったものとのことです。
では、それぞれのスキルをデータサイエンティストから除くと、
一体何者になるのでしょうか。ただの人でしょうか。
今後AIが担ういろんなものを除いてもそれでも残る価値、
それが将来的に必要な本質的な”データサイエンティスト”の価値なのかもしれません。
そこで今回は、
「word2vecを用いて、”データサイエンティスト”の価値を検証」したいと思います。
まずは簡単にword2vecの説明をします。
word2vecとはその名の通り、文章中の単語をベクトルに変換する技術となります。
各単語を、任意の特徴量(たとえば100個の特徴量)でのベクトルにしていきます。
各単語のベクトルの、どの特徴量をどのように値を決めるか、は、
文章中の単語同士のつながりを用います。
ある単語が出現したとき、別の任意の単語の出現確率を計算するには、
ある単語ベクトルのどの特徴量をどのような値にすべきか、ということをニューラルネット的に計算していきます。
各単語をベクトルにすると何がよいかというと、単語の線形計算ができるということです。
単語間の距離(類似度)を計算したり、加算・減算ができます。
つまり、「王様 – 男 + 女 = 女王」とか「東京- 日本 + フランス = パリ」などの計算ができるということです。
そう、今回は
「データサイエンティスト – データ」、
「データサイエンティスト – プログラミング」、
「データサイエンティスト – 分析」、
とは何か、を求めようとしています。
さて、word2vecを用いるためには、各単語の特徴ベクトルを計算するための元データ、すなわちテキストが必要となります。
wikipediaなどを食わせてもよいのですが、
せっかく、本サイトはデータ分析、データサイエンスに関する記事を執筆していますので、
本サイトの全記事を用いて各単語の特徴ベクトルを計算しようと思います。
まずは、mirandora.comのリンクから、”?p=”を含む記事リンクをクローリングし、
その中で記事本文箇所である”post-body”箇所を抽出していきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
from bs4 import BeautifulSoup from urllib.request import * from urllib.parse import * import re domain_url ="http://www.mirandora.com" url_links = [] all_text = [] def get_urls(url): with urllib.request.urlopen(url) as response: html = response.read() soup = BeautifulSoup(html,"html.parser") links = soup.select("a[href]") for a in links: href = a.attrs['href'] url = urljoin(domain_url,href) if url not in url_links: if url.startswith('http://www.mirandora.com'): if url.find('?p=') > -1: print(url) get_bodytext(url) url_links.append(url) get_urls(url) def get_bodytext(url): with urllib.request.urlopen(url) as response: html = response.read() soup = BeautifulSoup(html,"html.parser") body = soup.find(class_="post-body") body = body.get_text() all_text.append(body) get_urls(domain_url) |
上記の処理で、all_textに、全記事テキストを格納できました。
word2vecで処理できるよう、
スペース区切りの分かち書きしたテキストに変換しつつ、
前処理として、形態素解析をして不要な単語の除去、
および各単語を基本形に変換しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
from janome.tokenizer import Tokenizer from gensim.models import word2vec t = Tokenizer() all_text_tokenize = [] for text in all_text: text = text.strip() text = text.replace("'", "") text = text.replace(u" ", "") text = text.replace(u" ","") text = re.sub(r'[\xa0|\n|\r|\t]', '', text) text = re.sub(r'[a-zA-Z0-9¥"¥.¥,¥@]+', '', text) text = re.sub(r'[!"“#$%&()\*\+\-\.,\/:;<=>?@\[\\\]^_`{|}~]', '', text) lines = text.split("。") for line in lines: s = line tokens = t.tokenize(s) r = [] for tok in tokens: if tok.base_form == "*": w = tok.surface else: w = tok.base_form ps = tok.part_of_speech hinsi = ps.split(',')[0] if hinsi in ['名詞','形容詞','動詞']: r.append(w) rl = (" ".join(r)).strip() all_text_tokenize.append(rl) print(rl) |
※ちなみに、jacomeは日本語以外の文字が混在しているとエラーになるようでして、
余計な文字を除去する処理を挟んでおります。
(参考記事:日本語以外の文字と記号を排除し日本語の平文コーパスを作成する呪文)
さて、これでword2vecを用いる用意はできました。
早速、分かち書きしたテキストを流し込んでみましょう。
1 2 3 4 5 6 |
wakati_file = 'mirandora.wakati' with open(wakati_file, 'w', encoding='utf-8') as fp: fp.write("\n".join(all_text_tokenize)) data = word2vec.LineSentence(wakati_file) model = word2vec.Word2Vec(data,size=200,window=10,hs=1,min_count=2,sg=1) |
ようやく検証のための準備が整いました。
まずは”データサイエンティスト”に関係する単語を出してみます。
、、というところですが、”データ”と”サイエンティスト”が別の単語して別れて処理されておりました。
しかし、本サイトにおいて、”データサイエンティスト”以外の意味で、
“サイエンティスト”について述べる事はほぼありませんので、
“サイエンティスト”=”データサイエンティスト”として、関係する単語を出してみます。
1 |
model.most_similar(positive=['サイエンティスト']) |
データビジュアライズ | 0.88009 |
業務 | 0.87979 |
参入 | 0.87371 |
地道 | 0.86989 |
イノベーション | 0.86675 |
「データビジュアライズ」、「イノベーション」という華やかなワードがある一方、
「地道」という妙に生々しいワードがあることで納得感がありますね。
さて、では、いよいよ本題である検証に入りたいと思います。
まずは、「データ」がない「データサイエンティスト」とは何なのか。
※つまり「データサイエンティスト」 – 「データ」
1 |
model.most_similar(positive=['サイエンティスト'],negative=['データ']) |
役割 | 0.58428 |
集中 | 0.56401 |
主義 | 0.56064 |
文化 | 0.54829 |
体験 | 0.53060 |
エモい結果となりました。
データを扱えなくても、「役割」としてのデータサイエンティストは残るということでしょうか。
そんなデータサイエンティストは、「主義」や「文化」や「体験」で勝負するとよさそうです。
次に、「分析」のない「データサイエンティスト」とは何なのか。
※つまり「データサイエンティスト」 – 「分析」
1 |
model.most_similar(positive=['サイエンティスト'],negative=['分析']) |
役割 | 0.57317 |
変化 | 0.55608 |
果たす | 0.51304 |
文化 | 0.50304 |
デバイス | 0.49489 |
「データ」をのぞいた結果とある程度似ていますが、「デバイス」という単語が気になります。
「デバイス」て。人では無くなってしまいました。
せめて、「分析」はできる状態はキープする必要がありそうですね。
最後に、「思考」のない「データサイエンティスト」とは何なのか。
※つまり「データサイエンティスト」 – 「思考」
1 |
model.most_similar(positive=['サイエンティスト'],negative=['思考']) |
生存 | 0.41615 |
分離 | 0.38316 |
ダウンロード | 0.37998 |
検査 | 0.37643 |
有効 | 0.37129 |
もはや「生存」。
生きているって素晴らしいことです。
上記、検証により、「データサイエンティスト」は「データ」処理自体はAIに任せる時代が来たとしても、
「文化」や「体験」などから「主義」を作り出す作業、つまり”なぜ”、”何をやるのか”としての「役割」は残りそうです。
では今現在の業務の中心である機械学習手法を学ぶことに価値がないかというと、そんなことはなく、
テクニカルな手法を知ることで、表面的ではない、実践的な「分析」や「思考」能力を高めることにつながると思います。
逆にもしも「分析」や「思考」を高めることができなければ、「デバイス」です。
でも、大丈夫、「生存」はしています。
以上、word2vecを用いたデータサイエンティストの価値の検証でした。