word2vecに英辞郎データを放り込んでみた
英辞郎をword2vecに放り込んでみたらちょっと面白かったのでメモを。word2vecについては前回の記事を参照。
使ったのはEIJI-138.TXT(最新より1つ古いバージョンです)
EDPさんから1980円ぐらいで買えます。
■semantically-motivated {形} : 意味論的{いみろん てき}に動機付けられた ■semantically-restricted {形} : 意味的{いみ てき}に制限{せいげん}された ■semantics {名-1} : 意味論{いみろん}、記号論{きごうろん} ■semantics {名-2} : 《コ》〔プログラムの〕動作 ■semantics : 【@】セマンティックス、【分節】se・man・tics ■semantics course : 意味論{いみろん}のコース ■semaphore {名-1} : 手旗信号{てばた しんごう}、信号装置{しんごう そうち} ■semaphore {名-2} : 《コ》セマフォ◆共有リソースへの同時アクセスを一定数以下に制限する手続き ■semaphore {自他動} : 〔手旗{てばた}などで〕信号{しんごう}を送る ■semaphore : 【発音】se'mэfo`:(r)、【分節】sem・a・phore ■semaphore signal : 腕木信号機 ■semaphorically {副} : シグナル[信号{しんごう}]のように[を使って] ■Semarang {地名} : スマラン◆インドネシア
みたいな、いわゆるPDIC一行形式のテキストです
前処理(pre.sed)は適当。→https://gist.github.com/naoyat/6511066
$ nkf -Sw EIJI-138.TXT | sed 's|^■||g; s| : | |g' | mecab -Owakati | sed -f pre.sed > eiji-sep.txt $ ./word2vec -train eiji-sep.txt -output eijiro.bin -cbow 0 -size 200 -window 5 -ne 1e-3 -threads 12 -binary 1
で。さっきの例だと
semantically motivated 意味 論 的 に 動機付け られ た semantically restricted 意味 的 さ れ た semantics 意味 論 semantics 動作 semantics se man tics semantics course 意味 論 の コース semaphore 手旗 信号 semaphore セマフォ 共有 リソース へ の 同時 アクセス を 一定 数 以下 に 制限 する 手続き semaphore 手旗 を 送る semaphore sem a phore semaphore signal 腕木 信号 機 semaphorically シグナル semarang スマ ラン インドネシア
みたいな形で出てきます。この作業は数分で終わります。
distance
英語だけ / 日本語だけ出てきた例
(1) "find"
$ ./distance eijiro.bin Enter word or sentence (EXIT to break): find Word: find Position in vocabulary: 540 Word Cosine distance ------------------------------------------------------------------------ discover 0.647269 have 0.579349 perhaps 0.573466 enjoys 0.573027 wanting 0.569895 explain 0.569127 finds 0.568667 make 0.563059 remembers 0.558325 prove 0.558116 seems 0.557699 ...
(2) "found"
Enter word or sentence (EXIT to break): found Word: found Position in vocabulary: 3623 Word Cosine distance ------------------------------------------------------------------------ came 0.632690 was 0.619852 murdered 0.618065 discovered 0.597480 knew 0.596393 believed 0.594432 warned 0.580562 always 0.580353 arrived 0.579750 perhaps 0.567445 ...
(3) 「決める」
Enter word or sentence (EXIT to break): 決める Word: 決める Position in vocabulary: 2919 Word Cosine distance ------------------------------------------------------------------------ 確かめる 0.549179 日時 0.487234 範 0.486695 定める 0.474006 否 0.466640 試す 0.464715 知らせる 0.460535 ゴール 0.459710 見つける 0.455723 日取り 0.454051 そろえる 0.453285 選ぶ 0.448462 ...
Wordの右端が揃わないのはword2vecさんがprintfで"%-50s"とかで出力してるからだけど気分悪いのでそろそろパッチあてたい…
英語と日本語がいい感じに混ざって出てくる例
(1) 「甘い」
Enter word or sentence (EXIT to break): 甘い Word: 甘い Position in vocabulary: 5821 Word Cosine distance ------------------------------------------------------------------------ 美味 0.557716 いため 0.543678 気立て 0.535328 臭い 0.523367 香り 0.519421 甘ったるい 0.514284 おいしい 0.514217 甘党 0.512827 食べる 0.504979 sweet 0.504394 汁 0.503534 甘み 0.502789 sweets 0.501972 おいしく 0.501309 食べ物 0.499953 お菓子 0.497123 風味 0.497013 飲める 0.496544 味わい 0.496355 口当たり 0.495846 菓子 0.495530 sugary 0.493757 ごちそう 0.491298 触り 0.491183 快い 0.486044 派手 0.485320 着こなし 0.483575 ドッグフード 0.483424 塩気 0.482835 柔らかい 0.477246 にんにく 0.477052 果物 0.476662 おおらか 0.476204 柔らかく 0.475804 脂っこい 0.475188 濁す 0.474357 野菜 0.471492 tasting 0.470279 チョコレート 0.468524 砂糖 0.467779
日本語の類義語が出てきたり、対応する英単語が出てきたりで面白い。
(2) "semaphore"
Enter word or sentence (EXIT to break): semaphore Word: semaphore Position in vocabulary: 91870 Word Cosine distance ------------------------------------------------------------------------ 手旗 0.747331 chrominance 0.696490 tachometer 0.659605 マルチプレクサ 0.655955 demodulator 0.646253 commutator 0.623882 シンクロ 0.620550 decoder 0.619331 selector 0.613113 transmitter 0.613081 energization 0.612786 transceiver 0.611227 regenerator 0.608915 信号 0.602611 ジャイロトロン 0.600938 sorter 0.599987 トランスポンダ 0.599316 gyrotron 0.598349 除算 0.596615 励磁 0.596164 アレー 0.595458 sounder 0.593749 ストローブ 0.593125 transducer 0.593007 腕木 0.592226 multiplexer 0.591710 ディザー 0.591218 exciter 0.590356 測深 0.587591 セレクター 0.586178 signal 0.586045 reproducer 0.585224 サイリスタ 0.585093 energisation 0.584465 clocking 0.583642 theodolite 0.583461 復調 0.582414 baseband 0.580201 ファインダー 0.579673 repeater 0.579630
word-analogy してみる
訳語を探すならこれ。
("see" と「見る」の関係が、"find" と何の関係に似ているかを調べます)
$ ./word-analogy eijiro.bin Enter three words (EXIT to break): see 見る find Word: see Position in vocabulary: 345 Word: 見る Position in vocabulary: 68 Word: find Position in vocabulary: 540 Word Distance ------------------------------------------------------------------------ 見つける 0.450238 見いだす 0.439524 喜ぶ 0.435330 ちらりと 0.422546 垣間見る 0.412824 とてつもなく 0.398096 盗み見 0.397557 食い入る 0.396959 ...
"bread" における「パン」は "rice" における何?
Enter three words (EXIT to break): bread パン rice Word: bread Position in vocabulary: 5895 Word: パン Position in vocabulary: 3637 Word: rice Position in vocabulary: 3062 Word Distance ------------------------------------------------------------------------ 穀物 0.532821 稲 0.521359 小麦 0.507522 鶏肉 0.502062 白米 0.492565 トマト 0.481958 cereal 0.477263 穀類 0.476511 水稲 0.474788 全粒粉 0.470013
なんかこれ日本語Wordnetみたいな使い方が出来そうな気がしますね。meronym/holonym, hyponym みたいなのが出てくるだけでなく訳語が一緒にくっついて来る感じ。
Project Eulerまた流行ってるね
Euler、naoya_tさんには追いつきたいなあ
— Nobuaki Tanaka (@tomerun) 2013, 8月 26
どゆこと…
それはさておきMy Friend Keyは
4864086150836_7abbecb3db29e56be631729040879af9
ですよろしくです。
去年のLisp Advent Calendarに寄稿した拙記事「Project EulerにGaucheで挑戦する話」もどうぞ。
入り口はこちら
http://projecteuler.net/
Deep-learningはラテン語の動詞活用を学習できるか? Can deep-learning learn latin conjugation?
工藤さんがぐぐたすで紹介してた word2vec が面白そうだったので。
https://code.google.com/p/word2vec/
で少し遊んでみた。いわゆる deep learning で 単語のベクトル表現を学習してくれる。
面白いのは、2つのベクトルの差が、2つの単語の関係をよく近似してくれること。
It was recently shown that the word vectors capture many linguistic regularities, for example vector operations vector('Paris') - vector('France') + vector('Italy') results in a vector that is very close to vector('Rome'), and vector('king') - vector('man') + vector('woman') is close to vector('queen')
日本語のコーパスを mecab で解析して、何個か試してみた。うまくいった例を抜き出したとはいえ、それっぽい結果が得られた。いいじゃん。
A B C → X (A → Bの関係に対し、 C → X に当てはまるXを探す)
グーグル ヤフー トヨタ → 日産
工藤さんが「word2vecで少し遊んでみた」Google+のエントリ
渋谷 新宿 札幌 → 旭川
警察 泥棒 正義 → くそ
...
word2vecで遊んでみた。2つの単語のベクトルの差が2つの単語の関係を学習している点が非常に面白い。 何個か試したけらそれっぽい結果が得られた。 https://t.co/WEZjZfg9MN
— Taku Kudo (@taku910) 2013, 8月 28
word2vec は単語をベクトル表現にするだけだけど、deep learningがNLPにどう貢献するかっていう問いに対するベストアンサーだと思う。 実用性や扱いやすさという点で抜群に良いし、機械学習タスクの素性として使うだけでも精度向上が見込めそう。
— Taku Kudo (@taku910) 2013, 8月 29
だって可能性感じたんだ
そうだ…ススメ!
ラテン語コーパスからのトピック抽出 - Topic extraction from latin corpus using LDA modelling
折角DSIRNLPに来たので、NLPっぽいことをして遊んでみた話。ネタです。
コードは https://github.com/naoyat/latin にあります。lda_demo.py というやつです。
gensim便利です。PythonからLDAとかLSIとか割と高速にやってくれるトピックモデリングライブラリです。
http://radimrehurek.com/gensim/
↑チュートリアルが分かりやすくてためになるのでぜひご一読を!
from gensim import corpora, models, similarities
元テキスト
初級ラテン語リーディングで読んだラテン語テキストをコーパスにしましょう
text = latin.textutil.load_text_from_file('latin.txt') print text
Thēseus et Ariadnē. In Crētā īnsulā māgnum labyrinthum Daedalus aedificāvit plēnum viārum flexuōsārum. In mediō labyrinthō foedum mōnstrum, taurus partim, partim homō, habitābat. Mōnstrum, fīlius rēgis Crētae saevum captīvōs dēvorābat. Inter miserandās illās victimās quondam erat Thēseus, rēgulus Atticus. Ariadnē autem, fīlia rēgis, plēna misericordiae et amōris, juvenī fīlum longum mīrumque gladium dat. Intrat igitur labyrinthum, fīlumque ad portam alligat. Itaque juvenis auxiliō fīliae certam viam in vastī aedificiī flexūrīs servat. Tum gladiō mōnstrum fēlīciter necat. Nec longa mora fuit. Thēseus cum fīliā rēgis nāvī trāns lātum mare fugit. Vespere autem ad Naxum īnsulam veniunt. Mediā tamen nocte Thēseus ingrātus juvenis, puellam fīdam et amantem dēserit; sōlusque ad patriam redit. Rōmulus et Sabīnae 1. Rōmulus erat Mārtis fīlius. Mārs est deus bellī et armōrum. Mīlitēs Rōmānī Mārtem adōrābant et in Mā ...
活用形を原形に直す&ストップワードを削除
拙作ラテン語辞書引きツール https://github.com/naoyat/latin で作ってる辞書を使って原形を抽出してきます
前置詞、副詞、間投詞とか"sum" (be動詞)とか、ストップワードを削除してます
texts_in_baseform = [base_forms_of_words(sentence.split(' ')) for sentence in sentences]
Thēseus Ariadnē
Crēta īnsula māgnus labyrinthum Daedalus aedificō plēnus via flexuōsus
medius labyrinthum foedus mōnstrum taurus homō habitō
mōnstrum fīlius rēx Crēta saevus captīvus dēvorō
miserandus victima Thēseus rēgulus Atticus
Ariadnē fīlia rēx plēnus misericordia amor juvenis fīlum longus mīrus gladius dō
intrō labyrinthum fīlum porta alligō
juvenis auxilium fīlia certus via vastus aedificium flectō servō
gladius mōnstrum necō
longus mora
Thēseus fīlia rēx nāvis ferō mare fugiō
vesper Naxus īnsula veniō
medius nox Thēseus ingrātus juvenis puella fīdus amō dēserō
sōlus patria redeō
Rōmulus Sabīnus
Rōmulus Mārs fīlius
Mārs deus bellum armum
mīles Rōmānus Mārs adōrō Mārs āra victima mactō
Rōmulus mīles armum amō
urbs Rōma prīmus rēx
...
[gensim] dictionary
dictionary = corpora.Dictionary(texts_in_baseform) print dictionary.token2id # 嘘です;これだとunicode文字列がエスケープ表示されるよ
{ "veniō": 51, "fīlius": 19, "pater": 122, "Paris": 195, "Thēseus": 1, "herbōsus": 233, "fortitūdō": 200, "properō": 93, "patria": 59, "meus": 153, "stultus": 291, "tuus": 152, "plēnus": 8, "fīdus": 55, "placidus": 127, "suus": 124, "errō": 231, "pandō": 117, "plaustra": 257, "raptō": 90, "Trōjānus": 155, "mōnstrum": 15, "ferō": 46, "rosa": 238, "mactō": 70, "virgo": 91, "validus": 137, "Mycēna": 166, "Persephonē": 221, "auxilium": 39, "ambulō": 284, "dēvorō": 18, "videō": 146, "rogō": 248, "māgnus": 7, "tempus": 206, "stō": 113, "parvus": 259, "pūgnō": 115, "rēgīna": 300, "Juppiter": 299, "līber": 129, "Crēta": 2, "dīvīnus": 271, "nox": 57, "sapiēns": 184, "victima": 25, "expūgnō": 186, "placeō": 198, "īnsula": 10, "maneō": 110, "foedus": 11, "cīvis": 81, "bellum": 66, "oppūgnō": 188, "lacrima": 123, "servō": 42, "Sabīnus": 63, "scūtum": 96, "Triptolemus": 269, "parō": 111, "gremium": 268, "noscō": 161, "porta": 37, "certus": 40, "nāvis": 49, "gladius": 30, "exclāmō": 242, "Mārs": 64, "fīnitimus": 84, "malus": 143, "Rōmulus": 62, "commūtātiō": 214, "Daedalus": 3, "interrogō": 160, "labyrinthum": 6, "scelerō": 290, "somnus": 283, "capillus": 116, "perterreō": 144, "schola": 158, "gelidus": 258, "parvulus": 121, "Plūtō": 240, "cūrō": 225, "urbs": 75, "doceō": 292, "lūdus": 89, "vesper": 52, "memoria": 193, "saltō": 236, "mīles": 71, "fōrma": 210, "Cerēs": 220, "invītō": 88, "puer": 263, "templum": 297, "fīlia": 28, "intrō": 36, "flōs": 213, "frāter": 119, "fugiō": 47, "īrātus": 108, "laus": 173, "patruus": 241, "Mercurius": 301, "tractō": 159, "albus": 239, "dea": 222, "unda": 139, "necō": 44, "vastus": 43, "vocō": 149, "timeō": 287, "ūva": 253, "flamma": 286, "odor": 212, "Ariadnē": 0, "nōmen": 191, "silva": 245, "hūmānus": 216, "jūcundus": 275, "Phthia": 172, "prūdēns": 178, "animus": 281, "spectō": 97, "amor": 26, "Achillēs": 169, "miser": 249, "cīvitās": 82, "verbum": 148, "cēna": 273, "īnsīgnis": 199, "Sicilia": 230, "līlium": 237, "Agamemnō": 176, "cēterus": 150, "stella": 151, "superō": 180, "aedificium": 38, "flāvus": 138, "ēvolō": 118, "incola": 170, "hiems": 109, "juvenis": 31, "redeō": 60, "rēs": 157, "flectō": 41, "convocō": 80, "via": 9, "rūsticus": 279, "revertō": 106, "ratiō": 219, "caelum": 145, "color": 208, "puella": 58, "cantō": 235, "misericordia": 33, "prūdentia": 174, "Agamemnōn": 164, "locus": 234, "vir": 76, "longus": 32, "caeruleus": 228, "Ulixēs": 177, "aeger": 264, "Nestor": 181, "fortis": 140, "mare": 48, "Atticus": 22, "probō": 203, "armum": 65, "Rōmānus": 68, "Rōma": 73, "casa": 100, "plūs": 205, "mēnsa": 276, "arō": 254, "mōs": 197, "cūna": 265, "dux": 163, "āra": 72, "dōnum": 298, "teneō": 266, "cārus": 128, "uxor": 79, "corpus": 134, "mora": 45, "purpureus": 250, "omnis": 165, "alligō": 35, "lūna": 247, "portō": 101, "multus": 87, "populus": 85, "pāx": 92, "magister": 156, "flexuōsus": 5, "obtemperō": 168, "habitō": 12, "lacrimō": 103, "ager": 224, "vester": 131, "habeō": 77, "dēlectō": 218, "lectus": 303, "familia": 274, "nārrō": 296, "Myrmidōn": 167, "medius": 14, "māgnitūdō": 217, "cibus": 256, "dō": 27, "amō": 53, "Tenedus": 189, "adōrō": 69, "saevus": 21, "oculus": 262, "faciō": 295, "apportō": 94, "mīrus": 34, "fleō": 293, "sōlus": 61, "noster": 114, "flōreō": 209, "aedificō": 4, "frūmentum": 223, "incitō": 102, "dīcō": 294, "valeō": 130, "rēgulus": 24, "vīnea": 252, "palla": 229, "Naxus": 50, "praesidium": 202, "sententia": 204, "exemplum": 215, "Hector": 194, "Graecus": 162, "laetus": 126, "jaceō": 133, "dēserō": 54, "captīvus": 17, "mandō": 192, "agricola": 246, "gaudium": 305, "clāmō": 98, "hūmānitās": 201, "eō": 135, "ingrātus": 56, "occupō": 190, "mōnstrō": 120, "clārus": 196, "pōmum": 251, "soror": 78, "Metanīra": 267, "laxō": 282, "campus": 132, "homō": 13, "māter": 104, "prīmus": 74, "vōx": 99, "prātum": 227, "rēx": 20, "deus": 67, "dēsīderō": 304, "īgnōtus": 278, "fīrmus": 136, "ōsculum": 270, "herba": 226, "clīvus": 244, "laudō": 142, "bonus": 141, "nōminō": 183, "benignus": 147, "jactō": 289, "taurus": 16, "terra": 107, "Homērus": 182, "maestus": 105, "fēmina": 83, "sapientia": 179, "miserandus": 23, "vīnum": 277, "Trōja": 185, "mūtō": 207, "altus": 243, "ōrnō": 175, "equus": 154, "fōrmōsus": 86, "genus": 211, "oppidum": 187, "saxum": 260, "fīlum": 29, "juvencus": 255, "fulgeō": 280, "hasta": 95, "ōrō": 125, "grātus": 232, "focus": 285, "humus": 288, "sedeō": 261, "armātus": 112, "dormītō": 272, "rēgnum": 302, "Thessalia": 171, }
単語にIDを振られましたね!
[gensim] corpus
corpus = [dictionary.doc2bow(text) for text in texts_in_baseform]
[(0, 1), (1, 1)]
[(2, 1), (3, 1), (4, 1), (5, 1), (6, 1), (7, 1), (8, 1), (9, 1), (10, 1)]
[(6, 1), (11, 1), (12, 1), (13, 1), (14, 1), (15, 1), (16, 1)]
[(2, 1), (15, 1), (17, 1), (18, 1), (19, 1), (20, 1), (21, 1)]
[(1, 1), (22, 1), (23, 1), (24, 1), (25, 1)]
[(0, 1), (8, 1), (20, 1), (26, 1), (27, 1), (28, 1), (29, 1), (30, 1), (31, 1), (32, 1), (33, 1), (34, 1)]
[(6, 1), (29, 1), (35, 1), (36, 1), (37, 1)]
[(9, 1), (28, 1), (31, 1), (38, 1), (39, 1), (40, 1), (41, 1), (42, 1), (43, 1)]
[(15, 1), (30, 1), (44, 1)]
[(32, 1), (45, 1)]
[(1, 1), (20, 1), (28, 1), (46, 1), (47, 1), (48, 1), (49, 1)]
[(10, 1), (50, 1), (51, 1), (52, 1)]
[(1, 1), (14, 1), (31, 1), (53, 1), (54, 1), (55, 1), (56, 1), (57, 1), (58, 1)]
[(59, 1), (60, 1), (61, 1)]
[(62, 1), (63, 1)]
[(19, 1), (62, 1), (64, 1)]
[(64, 1), (65, 1), (66, 1), (67, 1)]
[(25, 1), (64, 2), (68, 1), (69, 1), (70, 1), (71, 1), (72, 1)]
[(53, 1), (62, 1), (65, 1), (71, 1)]
[(20, 1), (73, 1), (74, 1), (75, 1)]
...
単語番号、ドキュメント番号?
tf-idf
後のLSIモデルの計算に使うので算出
tfidf = models.TfidfModel(corpus) corpus_tfidf = tfidf[corpus] print corpus_tfidf
[(0, 0.759979311356681), (1, 0.6499472642528967)]
[(2, 0.349247258791555), (3, 0.399812307413233), (4, 0.349247258791555), (5, 0.399812307413233), (6, 0.3196686015007314), (7, 0.23952489558822987), (8, 0.3196686015007314), (9, 0.3196686015007314), (10, 0.26910355287905346)]
[(6, 0.3461992731730052), (11, 0.43299444982170604), (12, 0.2792590357253333), (13, 0.43299444982170604), (14, 0.3461992731730052), (15, 0.3461992731730052), (16, 0.43299444982170604)]
[(2, 0.38796658767003595), (15, 0.3551086898680912), (17, 0.4441375349725326), (18, 0.4441375349725326), (19, 0.20552742247006728), (20, 0.2989377425655945), (21, 0.4441375349725326)]
[(1, 0.368218603290876), (22, 0.49289286205051125), (23, 0.49289286205051125), (24, 0.49289286205051125), (25, 0.368218603290876)]
[(0, 0.3187878242083675), (8, 0.2917888555310659), (20, 0.24563381372237472), (26, 0.3187878242083675), (27, 0.2917888555310659), (28, 0.17628584768767744), (29, 0.3187878242083675), (30, 0.2577741777207578), (31, 0.27263278239967625), (32, 0.2917888555310659), (33, 0.3649428660170587), (34, 0.27263278239967625)]
[(6, 0.3810682072086202), (29, 0.4163281165414001), (35, 0.4766053296778159), (36, 0.4766053296778159), (37, 0.4766053296778159)]
[(9, 0.29810272731926635), (28, 0.18010040817988143), (31, 0.2785321455888527), (38, 0.3728396805196427), (39, 0.3728396805196427), (40, 0.3728396805196427), (41, 0.3728396805196427), (42, 0.3256859130542477), (43, 0.3728396805196427)]
[(15, 0.5798623287391751), (30, 0.5122660860708251), (44, 0.6335164850032389)]
[(32, 0.6244791305754837), (45, 0.7810414940806205)]
[(1, 0.33804705001104585), (20, 0.30457007180479895), (28, 0.2185830707700934), (46, 0.36179934404870456), (47, 0.45250559449885713), (48, 0.45250559449885713), (49, 0.45250559449885713)]
[(10, 0.3827561256278554), (50, 0.5686681135443818), (51, 0.4546767000519178), (52, 0.5686681135443818)]
[(1, 0.2938249467268281), (14, 0.3144700508033967), (31, 0.2938249467268281), (53, 0.26472730680450285), (54, 0.39331043472461574), (55, 0.39331043472461574), (56, 0.39331043472461574), (57, 0.39331043472461574), (58, 0.19897097599557534)]
[(59, 0.4830489075256187), (60, 0.6838747554061647), (61, 0.5467897876300037)]
[(62, 0.7913997233890097), (63, 0.6112990085218517)]
[(19, 0.45683615463913874), (62, 0.5914290737845839), (64, 0.6644639783290243)]
[(64, 0.468030378767686), (65, 0.5194741818210247), (66, 0.5194741818210247), (67, 0.4911626140020535)]
[(25, 0.3226038837779386), (64, 0.5813125009879141), (68, 0.2238954841921341), (69, 0.37721872360886055), (70, 0.345271090324879), (71, 0.37721872360886055), (72, 0.3226038837779386)]
[(53, 0.4608494239343186), (62, 0.4101949192747195), (65, 0.5115039285939177), (71, 0.5980983762673172)]
[(20, 0.4181296204464963), (73, 0.49669693909331947), (74, 0.6212231929307444), (75, 0.43879552842471786)]
[(12, 0.46908130012221955), (61, 0.581523189534629), (75, 0.5137333354799144), (76, 0.4217482352373293)]
...
LSI (Latent Semantic Indexing)
単語の意味は前述の拙作ツールで辞書引きして表示している(のでここでは実際には print topics 以上のことをしています)
NUM_TOPICS = 80 # 小さめのコーパスなのでちょっと少なくしてるけど300〜1000ぐらいが良い? TOPICS_TO_TAKE = 10 lsi = models.LsiModel(corpus_tfidf, id2word=dictionary, num_topics=NUM_TOPICS) corpus_lsi = lsi[corpus_tfidf] topics = lsi.print_topics(TOPICS_TO_TAKE) print topics
ここから各トピックのイメージが掴める人はラテン語通?というかちょっとおかしい
1) 0.995*"pater" + 0.040*"valeō" + 0.040*"frāter" + 0.039*"stella" + 0.032*"Rōmulus" + 0.029*"fīlius" + 0.029*"caelum" + 0.023*"Mārs" + 0.020*"videō" + 0.019*"Sabīnus"
父 / 元気である / 兄弟 / 星 / ロムルス / 息子 / 天空 / マルス / 見る / サビーナの2) 0.993*"fīlius" + 0.053*"Metanīra" + 0.046*"Mārs" + 0.044*"Triptolemus" + 0.034*"Rōmulus" + -0.033*"pater" + 0.033*"meus" + 0.020*"caelum" + 0.020*"portō" + 0.019*"teneō"
息子 / メタニラ / マルス / トリプトレムス / ロムルス / 父 / 私の / 天空 / 運ぶ / (手に)持つ,とどめる3) 0.743*"Persephonē" + 0.593*"Cerēs" + 0.124*"dea" + 0.121*"fīlia" + 0.059*"exclāmō" + 0.058*"properō" + 0.056*"suus" + 0.056*"prātum" + 0.055*"cārus" + 0.052*"rēgīna"
ペルセポネー / ケレース / 女神 / 娘 / 叫ぶ / 急ぐ / 自分の / 牧場,草原,野原 / かわいい,大切な / 女王4) -0.565*"Sabīnus" + -0.384*"Rōmānus" + -0.292*"Rōmulus" + -0.186*"lūdus" + 0.163*"Persephonē" + -0.144*"habeō" + -0.144*"dea" + -0.139*"properō" + -0.137*"puella" + -0.134*"amō"
サビーナの / ローマの / ロムルス / 遊戯,競技会 / ペルセポネー / 持つ,所有する / 女神 / 急ぐ / 少女 / 愛する5) 0.340*"dea" + 0.336*"puella" + -0.321*"Sabīnus" + 0.297*"puer" + 0.264*"laetus" + 0.229*"agricola" + -0.209*"Rōmulus" + -0.203*"Persephonē" + -0.188*"Rōmānus" + 0.177*"Metanīra"
女神 / 少女 / サビーナの / 少年 / うれしい,愉快な / 農夫 / ロムルス / ペルセポネー / ローマの / メタニラ6) 0.669*"Rōmulus" + 0.428*"Mārs" + -0.245*"Rōmānus" + -0.161*"lūdus" + -0.154*"properō" + 0.153*"stella" + 0.146*"bellum" + 0.125*"armum" + 0.119*"Trōjānus" + -0.101*"māgnus"
ロムルス / マルス / ローマの / 遊戯,競技会 / 急ぐ / 星 / 戦争 / 道具,武器 / トロヤの / 大きな7) 0.386*"puer" + -0.286*"fīlia" + -0.282*"dea" + 0.203*"valeō" + 0.199*"laetus" + -0.195*"frūmentum" + -0.180*"flāvus" + 0.173*"Metanīra" + -0.158*"meus" + -0.157*"Trōjānus"
少年 / 娘 / 女神 / 元気である / うれしい,愉快な / 麦の粒,穀粒,穀物 / 黄色い,黄金色の / メタニラ / 私の / トロヤの8) -0.551*"Trōjānus" + -0.418*"bellum" + -0.251*"noscō" + -0.250*"dux" + 0.216*"dea" + 0.158*"fīlia" + -0.153*"properō" + 0.144*"Rōmulus" + -0.138*"vir" + -0.129*"Mercurius"
トロヤの / 戦争 / 教わる,知る,学ぶ,習得する / 指導者 / 女神 / 娘 / 急ぐ / ロムルス / 男,夫 / メルクリウス9) 0.340*"Mercurius" + 0.308*"properō" + -0.267*"Trōjānus" + 0.222*"rēgnum" + 0.220*"vir" + 0.191*"puella" + -0.181*"bellum" + -0.178*"puer" + 0.165*"tuus" + 0.157*"caelum"
メルクリウス / 急ぐ / トロヤの / 支配,王権,王国 / 男,夫 / 少女 / 戦争 / 少年 / あなたの / 天空10) 0.448*"vir" + 0.335*"māgnus" + 0.264*"fēmina" + -0.229*"puella" + -0.183*"properō" + -0.182*"Mercurius" + 0.173*"caelum" + -0.168*"Rōmānus" + -0.162*"laetus" + 0.134*"Triptolemus"
男,夫 / 大きな / 女性 / 少女 / 急ぐ / メルクリウス / 天空 / ローマの / うれしい,愉快な / トリプトレムス
LDA (Latent Dirichlet Allocation)
LSIと比べてどうよ
model = models.ldamodel.LdaModel(corpus, id2word=dictionary, num_topics=NUM_TOPICS) topics = model.show_topics(topics=TOPICS_TO_TAKE) print topics
1) 0.107*armum + 0.054*Rōmulus + 0.054*omnis + 0.054*dea + 0.054*dux + 0.054*amō + 0.054*Mārs + 0.054*bellum + 0.054*deus + 0.054*Agamemnōn
道具,武器 / ロムルス / すべての / 女神 / 指導者 / 愛する / マルス / 戦争 / 神 / アガメムノーン2) 0.169*pater + 0.057*Sabīnus + 0.057*habeō + 0.057*Cerēs + 0.057*frāter + 0.057*valeō + 0.057*hūmānus + 0.057*flōreō + 0.057*Persephonē + 0.057*vir
父 / サビーナの / 持つ,所有する / ケレース / 兄弟 / 元気である / 人間の,人間味のある / 花が咲く / ペルセポネー / 男,夫3) 0.239*pater + 0.120*mūtō + 0.060*rogō + 0.060*tempus + 0.060*stella + 0.060*lūna + 0.060*agricola + 0.027*tuus + 0.026*grātus + 0.024*memoria
父 / 変える,(移り)変わる / 尋ねる / 時 / 星 / 月 / 農夫 / あなたの / 楽しい,感謝の / 記憶4) 0.068*Hector + 0.068*sapientia + 0.068*superō + 0.068*Sabīnus + 0.068*mōs + 0.068*placeō + 0.068*properō + 0.068*Nestor + 0.068*Rōmānus + 0.068*Ulixēs
ヘクトル / 知識,良識,知恵 / 超える,上を行く,打ち勝つ / サビーナの / 意思,習慣,性格 / 良いと思う / 急ぐ / ネストル / ローマの / ウリクセス5) 0.097*fleō + 0.049*plaustra + 0.049*bellum + 0.049*cibus + 0.049*superō + 0.049*sapientia + 0.049*gremium + 0.049*Triptolemus + 0.049*Ulixēs + 0.049*dormītō
泣く,涙を流す / 荷車 / 戦争 / 食べ物 / 超える,上を行く,打ち勝つ / 知識,良識,知恵 / 胸,ひざ / トリプトレムス / ウリクセス / まどろむ,居眠りをする6) 0.085*armum + 0.085*incitō + 0.085*lacrimō + 0.085*māter + 0.085*vir + 0.039*fleō + 0.037*fīlia + 0.036*prātum + 0.034*herba + 0.034*ager
道具,武器 / 駆る / 泣く / 母 / 男,夫 / 泣く,涙を流す / 娘 / 牧場,草原,野原 / 草 / 畑7) 0.193*puella + 0.049*herbōsus + 0.049*medius + 0.049*grātus + 0.049*nox + 0.049*ingrātus + 0.049*fīdus + 0.049*juvenis + 0.049*dēserō + 0.049*amō
少女 / 草の生い茂った / 中間の / 楽しい,感謝の / * / 不愉快な,恩知らずな / 誠実な,忠実な,頼りになる / 若者 / 別れる,棄てる,見捨てる / 愛する8) 0.157*caelum + 0.157*gelidus + 0.079*prātum + 0.079*jūcundus + 0.079*ager + 0.079*veniō + 0.079*caeruleus + 0.001*laudō + 0.001*bonus + 0.001*properō
天空 / 凍った,氷の / 牧場,草原,野原 / 快適な / 畑 / 来る / 青い / 称賛する,ほめる / 良い / 急ぐ9) 0.046*stella + 0.046*Rōmānus + 0.046*pater + 0.046*juvenis + 0.046*Rōmulus + 0.046*vīnum + 0.046*īgnōtus + 0.046*campus + 0.046*saevus + 0.046*rēx
星 / ローマの / 父 / 若者 / ロムルス / ワイン / 未知の / 平野 / 激怒した,残酷な / 王,指導者10) 0.170*dea + 0.086*caeruleus + 0.086*Rōmulus + 0.086*Sabīnus + 0.086*maestus + 0.086*lacrimō + 0.086*palla + 0.001*terra + 0.001*revertō + 0.001*īrātus
女神 / 青い / ロムルス / サビーナの / 悲嘆に暮れた / 泣く / コート / 地,大地 / 引き返す,戻る / 怒った
num_topicsを変えると抽出トピックはどうなるか〈9/2追記〉
num_topicsを適当に変えて、LDAの上位5件のみ出して眺めてみる。
num_topicsを大きくすると同じのが複数回出てきてしまった。
NUM_TOPICS=30
1) 0.061*Sabīnus + 0.037*Persephonē + 0.031*Metanīra + 0.031*fēmina + 0.031*raptō + 0.031*Graecus + 0.031*mūtō + 0.031*longus + 0.031*Rōmulus + 0.016*Cerēs
サビーナの / ペルセポネー / メタニラ / 女性 / 連れ去る / ギリシアの / 変える,(移り)変わる / 長い,広い / ロムルス / ケレース2) 0.047*Cerēs + 0.047*agricola + 0.047*casa + 0.047*maneō + 0.047*pater + 0.024*dea + 0.024*fīlia + 0.024*parvus + 0.024*prātum + 0.024*ager
ケレース / 農夫 / あばら屋 / とどまる / 父 / 女神 / 娘 / 小さな / 牧場,草原,野原 / 畑3) 0.044*ūva + 0.044*bellum + 0.044*Trōjānus + 0.022*pater + 0.022*Cerēs + 0.022*Persephonē + 0.022*prātum + 0.022*flōreō + 0.022*fleō + 0.022*vīnea
ぶどうの実,ぶどうの房 / 戦争 / トロヤの / 父 / ケレース / ペルセポネー / 牧場,草原,野原 / 花が咲く / 泣く,涙を流す / ぶどうの木,ぶどう畑4) 0.052*templum + 0.052*dea + 0.052*victima + 0.026*fīlius + 0.026*Cerēs + 0.026*fīlia + 0.026*cārus + 0.026*ōsculum + 0.026*māgnus + 0.026*multus
神殿 / 女神 / 犠牲,いけにえ,被害者 / 息子 / ケレース / 娘 / かわいい,大切な / くちづけ / 大きな / 多くの5) 0.050*pater + 0.033*fīlia + 0.033*multus + 0.033*Trōjānus + 0.033*mīrus + 0.017*laetus + 0.017*agricola + 0.017*longus + 0.017*gladius + 0.017*fīlum
父 / 娘 / 多くの / トロヤの / 素晴らしい,驚くべき / うれしい,愉快な / 農夫 / 長い,広い / 剣 / 糸
NUM_TOPICS=50
1が風景っぽい。2はアリアドネの糸(と恩知らずな若者)。5はトロヤ戦争?
1) 0.091*caelum + 0.091*pater + 0.031*fulgeō + 0.031*vocō + 0.031*campus + 0.031*terra + 0.031*lūna + 0.031*silva + 0.031*clīvus + 0.031*altus
天空 / 父 / 照らす,光る,輝く / 呼ぶ,名付ける / 平野 / 地,大地 / 月 / 森 / 丘,坂 / 高い,深い2) 0.066*longus + 0.050*plēnus + 0.034*Ariadnē + 0.034*maneō + 0.034*mīrus + 0.034*misericordia + 0.034*juvenis + 0.034*gladius + 0.034*fīlum + 0.034*fīlia
長い,広い / 満ちた,沢山の / アリアドネー(ミノスの娘) / とどまる / 素晴らしい,驚くべき / 慈悲,憐憫 / 若者 / 剣 / 糸 / 娘3) 0.125*terra + 0.063*incola + 0.063*Persephonē + 0.063*Rōma + 0.063*via + 0.063*Myrmidōn + 0.063*Sabīnus + 0.063*longus + 0.063*Cerēs + 0.001*incitō
地,大地 / 住人 / ペルセポネー / ローマ / 道 / ミュルミドーン / サビーナの / 長い,広い / ケレース / 駆る4) 0.080*habeō + 0.041*timeō + 0.041*soror + 0.041*caeruleus + 0.041*Rōmānus + 0.041*raptō + 0.041*puella + 0.041*properō + 0.041*scūtum + 0.041*gladius
持つ,所有する / 恐れる / 姉,妹 / 青い / ローマの / 連れ去る / 少女 / 急ぐ / 盾 / 剣5) 0.143*Trōjānus + 0.072*multus + 0.072*dux + 0.072*Paris + 0.072*clārus + 0.072*Hector + 0.072*noscō + 0.001*clāmō + 0.001*vōx + 0.001*casa
トロヤの / 多くの / 指導者 / パリス / 明るい,明瞭な,有名な,素晴らしい / ヘクトル / 教わる,知る,学ぶ,習得する / 叫ぶ / 声 / あばら屋
NUM_TOPICS=80
1が戦争の事を言ってるっぽいのは何となく。
1) 0.107*armum + 0.054*Rōmulus + 0.054*omnis + 0.054*dea + 0.054*dux + 0.054*amō + 0.054*Mārs + 0.054*bellum + 0.054*deus + 0.054*Agamemnōn
道具,武器 / ロムルス / すべての / 女神 / 指導者 / 愛する / マルス / 戦争 / 神 / アガメムノーン2) 0.169*pater + 0.057*Sabīnus + 0.057*habeō + 0.057*Cerēs + 0.057*frāter + 0.057*valeō + 0.057*hūmānus + 0.057*flōreō + 0.057*Persephonē + 0.057*vir
父 / サビーナの / 持つ,所有する / ケレース / 兄弟 / 元気である / 人間の,人間味のある / 花が咲く / ペルセポネー / 男,夫3) 0.239*pater + 0.120*mūtō + 0.060*rogō + 0.060*tempus + 0.060*stella + 0.060*lūna + 0.060*agricola + 0.027*tuus + 0.026*grātus + 0.024*memoria
父 / 変える,(移り)変わる / 尋ねる / 時 / 星 / 月 / 農夫 / あなたの / 楽しい,感謝の / 記憶4) 0.068*Hector + 0.068*sapientia + 0.068*superō + 0.068*Sabīnus + 0.068*mōs + 0.068*placeō + 0.068*properō + 0.068*Nestor + 0.068*Rōmānus + 0.068*Ulixēs
ヘクトル / 知識,良識,知恵 / 超える,上を行く,打ち勝つ / サビーナの / 意思,習慣,性格 / 良いと思う / 急ぐ / ネストル / ローマの / ウリクセス5) 0.097*fleō + 0.049*plaustra + 0.049*bellum + 0.049*cibus + 0.049*superō + 0.049*sapientia + 0.049*gremium + 0.049*Triptolemus + 0.049*Ulixēs + 0.049*dormītō
泣く,涙を流す / 荷車 / 戦争 / 食べ物 / 超える,上を行く,打ち勝つ / 知識,良識,知恵 / 胸,ひざ / トリプトレムス / ウリクセス / まどろむ,居眠りをする
NUM_TOPICS=150
1はこないだのローマ人とサビナ人の戦いの話?「やめて!私(たち)のために戦わないで!」
4と5が同じ。
1) 0.143*habeō + 0.048*uxor + 0.048*dea + 0.048*cīvis + 0.048*populus + 0.048*puer + 0.048*Rōmulus + 0.048*Sabīnus + 0.048*parvus + 0.048*soror
持つ,所有する / 妻 / 女神 / 市民 / 人民,民衆 / 少年 / ロムルス / サビーナの / 小さな / 姉,妹2) 0.597*fīlius + 0.001*gaudium + 0.001*māter + 0.001*spectō + 0.001*clāmō + 0.001*vōx + 0.001*casa + 0.001*portō + 0.001*incitō + 0.001*lacrimō
息子 / 喜び / 母 / 見る / 叫ぶ / 声 / あばら屋 / 運ぶ / 駆る / 泣く3) 0.111*sōlus + 0.111*vir + 0.111*habitō + 0.111*dea + 0.111*lacrimō + 0.111*maestus + 0.111*urbs + 0.001*perterreō + 0.001*casa + 0.001*apportō
唯一の / 男,夫 / 住む / 女神 / 泣く / 悲嘆に暮れた / 都市 / おののかせる / あばら屋 / 連れて来る,運ぶ4) 0.003*gaudium + 0.003*māter + 0.003*spectō + 0.003*clāmō + 0.003*vōx + 0.003*casa + 0.003*portō + 0.003*incitō + 0.003*lacrimō + 0.003*maestus
喜び / 母 / 見る / 叫ぶ / 声 / あばら屋 / 運ぶ / 駆る / 泣く / 悲嘆に暮れた5) 0.003*gaudium + 0.003*māter + 0.003*spectō + 0.003*clāmō + 0.003*vōx + 0.003*casa + 0.003*portō + 0.003*incitō + 0.003*lacrimō + 0.003*maestus
喜び / 母 / 見る / 叫ぶ / 声 / あばら屋 / 運ぶ / 駆る / 泣く / 悲嘆に暮れた
NUM_TOPICS=200
3と5が同じ。1はローマvsサビナっぽいけど楽しそうだ。
1) 0.174*laetus + 0.092*puer + 0.092*Rōmānus + 0.092*invītō + 0.092*māgnus + 0.092*Sabīnus + 0.092*lūdus + 0.036*dea + 0.035*verbum + 0.034*vocō
うれしい,愉快な / 少年 / ローマの / 招く / 大きな / サビーナの / 遊戯,競技会 / 女神 / 言葉 / 呼ぶ,名付ける2) 0.182*vir + 0.182*tuus + 0.182*rēgnum + 0.182*dēsīderō + 0.001*Crēta + 0.001*scūtum + 0.001*clāmō + 0.001*vōx + 0.001*casa + 0.001*portō
男,夫 / あなたの / 支配,王権,王国 / 望む / クレタ / 盾 / 叫ぶ / 声 / あばら屋 / 運ぶ3) 0.003*gaudium + 0.003*māter + 0.003*spectō + 0.003*clāmō + 0.003*vōx + 0.003*casa + 0.003*portō + 0.003*incitō + 0.003*lacrimō + 0.003*maestus
喜び / 母 / 見る / 叫ぶ / 声 / あばら屋 / 運ぶ / 駆る / 泣く / 悲嘆に暮れた4) 0.222*Persephonē + 0.222*Cerēs + 0.222*exclāmō + 0.001*gaudium + 0.001*incitō + 0.001*scūtum + 0.001*spectō + 0.001*clāmō + 0.001*vōx + 0.001*casa
ペルセポネー / ケレース / 叫ぶ / 喜び / 駆る / 盾 / 見る / 叫ぶ / 声 / あばら屋5) 0.003*gaudium + 0.003*māter + 0.003*spectō + 0.003*clāmō + 0.003*vōx + 0.003*casa + 0.003*portō + 0.003*incitō + 0.003*lacrimō + 0.003*maestus
喜び / 母 / 見る / 叫ぶ / 声 / あばら屋 / 運ぶ / 駆る / 泣く / 悲嘆に暮れた
ICFPC2013参戦メモ
ぼっち参戦しました。
ICFP Programming Contest 2013
今年のホストはMicrosoft Researchさん。
チーム名「Я⦿Ж⦿R」でエントリしています。ケロン軍です。
ASCII文字列じゃない(見れば分かる)チーム名で、1人参加です。#icfpc2013
— naoya t (@naoya_t) 2013, 8月 12
総括
初日と3日目に数時間ずつコード書いた(その間はうだうだ考えたり諦めたり)。初期に無駄にeval/guessして数十問ロストした。 DBに突っ込む所まで行かずパターン生成器が適当な時間で帰ってきた8ノードまでの勝負で。foldはtfoldのみ。#icfpc2013
— naoya t (@naoya_t) 2013, 8月 12
問題自体は楽しめる要素が多かったと思うのだけれど
- MSなんとか
- leaderboardの不在
- (英文読解力の欠如なのだろうけれど)主催者の意図を掴みきれずにサーバ仕様をあちこち読み違えていて問題を難しくしていた
という3つの(主に心理的な)障壁を乗り越えるところまで行けませんでした。
(72時間のうち、合計参戦時間より合計睡眠時間の方がはるかに長かったです・・・)
kinabaさん他みなさんによるtogetterまとめ:ICFPC 2013 おつかれさまでしたー
PRML wednesday順調
週1回水曜開催で、順調に第3回まで来た。
狭い会議室で、2時間とちょっとで、ちびちび進んでいる。
第2回から2章に入り、1人2ページずつの担当制になったけれどまだ1周回ってない。
ディリクレ分布の紹介を済ませ、ガウス分布の話題に入ったところ。
みんなと少しずつ数式展開を噛み締めながら、個人的には演習問題コンプリートを目指しながら(時には解答を写経しながら)読み進めている。
PRML wednesdayキックオフ
今日から毎週水曜の夜に原宿で #prmlwednesday と称してPRMLを読むことになりました。
別名「PRML平日レーン」「わるぷるむるの夜」…
雨上がりの蒸し暑い夜でしたが、定員12人の会議室に13人入ってPRMLをまた1章から読み始めました。
今日は自己紹介と、今後の進め方の相談と、1章でここだけは読むべきという §1.2〜1.2.3 を読んだ(というか本レーン、社内勉強会、と時間遡行を繰り返し今ではPRML同人作家でもあるshuyoさんの有難いトークを1時間延長で聞いて帰りました)。
ポイントを押さえた非常に分かりやすい解説をどうもありがとうございました。
今日覚えて帰るべき(というか覚えてはいけない)大事なこと:「ベイズ公式は覚えちゃダメ」
PRML wednesday 終わってラーメン中。また誰とは言わないが一人でしゃべりまくってたな……。まあ今日はある意味「ベイズ公式は覚えちゃダメ」と言いたくて行ったので、それが言えて満足? このあと引っかかりそうなところもできる範囲でつぶせた、はず。
— Nakatani Shuyo (@shuyo) 2013, 7月 24
@sleepy_yoshi その心は (1) 乗法定理2回使うだけなので、導出の手間減ってない (2) 3変数以上や条件付きの場合に公式を正しく適用するのは難しい (3) ベイズ確率との混同製造器になっていて、むしろジャマw の3本です。
— Nakatani Shuyo (@shuyo) 2013, 7月 24
参加者の顔ぶれは
https://twitter.com/search/realtime?q=%23prmlwednesday
または
https://twitter.com/naoya_t/prmlwednesday
で見られます。
※定員いっぱい(というか超過)なので参加者公募はありません。超高校級PRMLer*1揃いなので、どなたかが卒業されて空席が発生した折には公募あるかもです。
あと、主催者権限で(半ば
講師ツッコミ役的な立ち位置の)スカウトはあるかもです。
平日PRML開催が決まってから、今度こそ演習問題をコンプリートするぞーとか思って1章から見なおしてみた(1章残りあと数問)のですが、分かった気になって先に進んでいた所を蒸し返して改めて苦悶しています…
・・・
というわけで、来週は2章でお会いしましょう!(発表全員回るかな?)
ホワイトボードが無いと(それも語り部がshuyoさんの時に!)致命的に困るので、来週からはホワイトボード(60x90)が来る予定です。
*1:高校で習った範囲の数学は分かっているものという前提です!