Segmentation-free Word embeddings using sembei package

In [1]:
import pandas as pd

import matplotlib
import matplotlib.pyplot as plt
matplotlib.style.use('ggplot')
matplotlib.rc('font', family=['IPAexGothic'])
%matplotlib inline

import sembei as sb
In [2]:
with open('/path/to/jawiki-latest-pages-articles_text_10M.txt',
          mode='r', encoding='utf-8', errors='ignore') as f:
    corpus_str = ''.join(line.replace('\n', ' ') for line in f.readlines())

len(corpus_str)
Out[2]:
3952451
In [3]:
corpus_str[100000:100100]
Out[3]:
'別については、平安時代末期にはすでにいずれもの音となり発音上の区別が無くなっていたことにより、相当な表記の揺れがあり、格助詞の「を」を除き前例による基準を見出すことができなかった。そこで『下官集』では'
In [4]:
%%time
n_extract_tuple = [(1, 3000), (2, 100000), (3, 100000), (4, 100000), (5, 100000),
                   (6, 70000), (7, 10000), (8, 10000)]

vocabulary_all = sb.utils.ngram.extract_topn_ngram_lossycounting(
    corpus_str, width_ngram=len(n_extract_tuple), n_extract_tuple=n_extract_tuple,
    epsilon=1e-7, support_threshold=1e-7, n_processes=20)
    
size_vocabulary_all = len(vocabulary_all)
min count   : ('耀', 5) 0
# of 1-gram : 4295
Coverage    : 0.9993060002514895

min count   : ('。奇', 2) 0
# of 2-gram : 208807
Coverage    : 0.9672782787186989

min count   : ('り、厳', 5) 0
# of 3-gram : 930381
Coverage    : 0.6883371862168564

min count   : ('評だった', 5) 0
# of 4-gram : 1738573
Coverage    : 0.47033549562031257

min count   : ('気温が30', 4) 0
# of 5-gram : 2355014
Coverage    : 0.33733119019059316

min count   : ('。 ; ラン', 4) 0
# of 6-gram : 2793533
Coverage    : 0.22495332642960025

min count   : ('。 * 11月2', 10) 0
# of 8-gram : 3304594
Coverage    : 0.0692668928722962

min count   : ('受賞歴 == ', 13) 0
# of 7-gram : 3095326
Coverage    : 0.08868623545238132

CPU times: user 242 ms, sys: 135 ms, total: 377 ms
Wall time: 5.62 s
In [5]:
sembei = sb.embed.Sembei(corpus_str, vocabulary=vocabulary_all, dim=200,
                         n_iter_rsvd=6, wide_window=False)
2017-03-05 22:37:03.763815
Parameters :
            size_vocabulary : 493000
            dim             : 200
            size_window     : 1
            wide_window     : False
            n_iter_rsvd     : 6
            max_n_ngram     : 8
            inc             : 1
            
In [6]:
%%time
sembei.construct_cooccurrence_matrix(n_cores=4, n_chunk=40, n_chunk_pool=10)
# of nonzero : 44028048
size : 493000x986000
density : 0.009057442737884131


CPU times: user 14 s, sys: 4.55 s, total: 18.5 s
Wall time: 37.4 s
In [7]:
%%time
sembei.compute()
CPU times: user 7min 19s, sys: 32.2 s, total: 7min 51s
Wall time: 3min 11s
In [8]:
vectors = sembei.get_vectors(gamma=1e-6)
vectors.sample(n=10)
Out[8]:
0 1 2 3 4 5 6 7 8 9 ... 190 191 192 193 194 195 196 197 198 199
バチョ 0.077998 -0.037611 -0.020097 -0.066258 0.010417 -0.140067 -0.106383 0.088268 -0.054278 -0.086803 ... 0.020286 -0.104530 0.010540 -0.021246 0.008079 0.038633 -0.044461 0.046050 -0.068043 -0.162837
語) 0.056905 -0.000030 0.062438 -0.011356 0.052454 -0.033687 0.019676 -0.020970 0.055687 -0.087037 ... 0.127746 -0.132135 0.087781 -0.057754 0.124884 0.074581 0.011535 -0.043010 -0.049325 0.105588
0-02 0.037308 0.145455 -0.045877 0.030019 -0.032574 0.047172 0.013472 0.036119 0.029550 0.032121 ... 0.080449 0.019541 0.141052 -0.087551 0.016398 -0.012597 0.074907 0.028787 0.077165 -0.015193
lu-r 0.014693 0.018605 0.031527 -0.042050 0.134051 0.138170 -0.100017 0.001874 0.014674 0.020066 ... -0.053971 0.064431 -0.076410 -0.051773 0.129474 0.167587 -0.199108 -0.071694 -0.073959 -0.077074
* × 0.103788 0.006394 0.128155 -0.055478 -0.057030 -0.013949 -0.009306 0.048166 -0.165246 0.062002 ... 0.031081 0.026098 0.059643 -0.044120 0.010884 0.020322 0.037533 0.014124 -0.088021 -0.008631
放送(A 0.033215 0.004244 0.020444 -0.012796 0.030776 0.006534 -0.063223 -0.009870 -0.015151 -0.019767 ... -0.001466 -0.028490 0.042410 -0.029716 -0.039965 0.058726 -0.016588 0.000103 0.004351 0.068114
南條 0.092183 0.025092 -0.040878 -0.210191 -0.075419 0.045938 -0.019855 0.007060 -0.114902 0.094371 ... -0.053765 0.010106 0.100130 0.042323 0.100870 -0.067852 0.063837 -0.159801 0.059474 -0.039502
、ソクラテス 0.098753 -0.069497 -0.128208 -0.042553 -0.016165 0.023803 0.017016 -0.036826 -0.002750 0.006691 ... 0.066177 0.111697 0.058886 -0.041210 0.048598 0.025722 0.046111 0.028791 -0.068115 0.025351
*1983年 0.074382 0.064198 0.026473 -0.097615 0.036517 -0.008862 0.090672 -0.014979 -0.077349 0.021358 ... -0.129474 0.024275 0.068709 -0.052284 0.059597 0.026180 0.068189 -0.032604 0.016550 0.003851
現状 0.127993 -0.071221 -0.120712 -0.151789 0.030281 0.012364 0.144940 -0.043020 0.138425 0.050534 ... -0.089055 -0.077025 0.059590 0.060203 -0.063410 0.031642 -0.124048 0.054329 0.080577 -0.162585

10 rows × 200 columns

In [9]:
query_list = '鉄腕アトム 生成 確率 プログラム 倒す 数学 江戸時代 中国'.split(' ')
sb.utils.show.get_topn_df(sembei, query_list)
Out[9]:
プログラム 中国 倒す 数学 江戸時代 生成 確率 鉄腕アトム
0 プロセス ドイツ 施す 言語学 戦国時代 実行 規範 火の鳥
1 アプリケーション 朝鮮 離す 哲学 1950年代 否定 慣習 新宝島
2 システム スペイン 示す 科学 1960年代 拡張 形状 陽だまりの樹
3 プロセッサ イタリア 計る 政治学 19世紀 理解 階層構造 ひぃ
4 ハードウェア フランス 押す 物理学 鎌倉時代 観察 感情 フクちゃん
5 ソフトウェア ヨーロッパ 向上させる 医学 17世紀 フェアに説明 儀式 バンパイヤ
6 データ アメリカ 踏む 地理学 2000年代 定式化 個性 ウイングマン
7 端末 広東 貼る 生物学 平安時代 決定 感覚 リボンの騎士
8 プログ 琉球 検証する 宗教 室町時代 阻止 文字列 ふたりの誓い
9 コンテンツ 拡張する 心理学 1970年代 優先 語尾 饗宴
In [ ]: