![]() |
ノート/テキストマイニング/Doc2Vecを試すhttps://pepper.is.sci.toho-u.ac.jp:443/pepper/index.php?%A5%CE%A1%BC%A5%C8%2F%A5%C6%A5%AD%A5%B9%A5%C8%A5%DE%A5%A4%A5%CB%A5%F3%A5%B0%2FDoc2Vec%A4%F2%BB%EE%A4%B9 |
![]() |
「。」で切るだけでは足りない。
0 [[ アンパサンド ]] CATEGORIES : 約 物 , ラテン語 の 語句 アンパサンド ([ tpl ] lang | en | ampersand [/ tpl ], &) と は 「 … と … 」 を 意味 する 記号 で ある 1 英語 の [ tpl ] lang | en |" and "[/ tpl ] に 相当 する ラテン語 の [ tpl ] lang | la |" et "[/ tpl ] の 合 字 で 、 [ tpl ] lang | en |" etc ."[/ tpl ] ( et cetera = and so forth ) を [ tpl ] lang | en |"& c ."[/ tpl ] と 記述 する こと が ある の は その ため 2 Trebuchet MS フォント で は 、 10 px と 表示 さ れ " et " の 合 字 で ある こ と が 容易 に わかる 3 == 歴史 == その 使用 は 1 世紀 に 遡る こと が でき ( 1 )、 5 世紀 中葉 ( 2 , 3 ) から 現代 ( 4 - 6 ) に 至る まで の 変遷 が わかる 4 Z に 続く ラテン 文字 アルファベット の 27 字 目 と さ れ た 時期 も ある 5 記号 名 の 「 アンパサンド 」 は 、 ラテン語 の 「 & は それ 自身 " and " を 表す 」 [ tpl ] lang | la |(& per se and )[/ tpl ] から き て いる 6 == 手書き == 日常 的 な 手書き の 場合 、 欧米 で アンパサンド は 「 ε 」 に 縦 線 を 引く 単純 化 さ れ た もの が 使わ れる こと が ある 7 また 同様 に 、 「 t 」 または 「+( プラス ) 」 に 輪 を 重ね た よう な 、 無声 歯茎 側面 摩擦音 を 示す 発音 記号 「[ tpl ] IPA | ? [/ tpl ]」 の よう な もの が 使わ れる こと も ある 8 == プログラミング 言語 == プログラミング 言語 で は 、 C など 多数 の 言語 で AND 演算 子 として 用い られる 9 以下 は C の 例 10 * X = A && B の よう に 2 個 重ね た もの は 論理 AND を 表す 11 この 場合 A , B が ともに 真 なら ば X も 真 、 それ 以外 は 偽 で ある 12 * 0 x 12345678 & 0 x 0 f 0 f 0 f 0 f の よう に 1 個 で あれ ば ビット AND を 表す 13 この 場合 の 結果 は 0 x 02040608 で ある 14 BASIC 系列 の 言語 で は 文字 列 の 連結 演算 子 として 使用 さ れる 15 " foo " & " bar " は " foobar " を 返す 16 また 、 主 に マイクロソフト 系 で は 整数 の 十 六 進 表記 に & h を 用い 、 & h 0 F ( 十 進 で 15 ) の よう に 表現 する 17 SGML 、 XML 、 HTML で は 、 アンパサンド を 使っ て SGML 実体 を 参照 する 18 == その他 == * & ( シングル )( アンド ) は 、 浜崎 あゆみ が 2003 年 に 発売 し た 4 曲 入 り マキシ シングル 19 * & ( 一 青 窈 の アルバム )( アンド ) は 、 一青 窈 が 2005 年 に 発売 し た アルバム 、 及び 同 アルバム に 収録 さ れ た 楽曲 20 *& ( 漫画 )( アンド ) は 、 お かざ き 真 里 による 漫画 作品 21 * アンパサンド は 、 日本 の 競走 馬 22 ⇒ アンパサンド ( 競走 馬 ) == 符号 位置 == [[ 言語 ]] CATEGORIES : 言語 , 言語 学 , 民族 言語 ( げん ご [ tpl ] lang - en - short | Language [/ tpl ]) と は 、 コミュ ニケーション の ため の 記号 の 体系 で ある 23 狭義 に は 人間 の 音声 による 音声 言語 を 指す が 、 広義 に は 身振り など 音声 以外 の 要素 も 含む 24 また 、 動物 間 の コミュニケーション や 、 コンピュータ に 指示 する ため の 記号 体系 を 指す 場合 も ある 25 英語 や 日本語 や 中国 語 の よう に 自然 発生 的 に 生まれ た 言語 を 自然 言語 と 呼び 、 これ に対して 人為 的 に 創作 さ れ た 言語 を 人工 言語 と 呼ぶ 26 後者 に は 、 もっぱら 人間 同士 による やりとり を 目的 と し た エスペラン ト 、 コンピュータ の 操作 を 目的 と し た プログラミング 言語 、 それから 人間 に も コンピュータ に も 適し た ロ ジバン といった もの が ある 27 自然 言語 は 、 母語 と する 人々 の 存在 を 失う と 使用 さ れ なく なり 死 語 ( 廃語 ) と 呼ば れる 28 == 定義 == 狭義 に は 、 人間 の コミュニケーション 、 相互 作用 を 統べる 規則 の 内 、 声 にまつわる 部分 、 あるいは その 声 の 代替 として の 文字 表記 など にまつわる 部分 を 指す 29 手話 、 トーキング ドラム など の 例 において も 、 おおよそ 声 による コミュニケーション と 対応 し て いる 30 ただし 、 かつて 日本 の 手話 言語 学者 は 手話 は 音声 語 と は 形態 におい て 異なる が ゆえに 、 音声 言語 学 と は まったく 異なる 言語 学 用語 、 文法 用語 によって 研究 さ れる べき で ある という 立場 を とっ て い た 31 しかし 、 近年 で は 手話 と いえ ども れっきとした 言語 で ある ゆえ に 音声 語 と 同様 の 言語 学 的 手法 、 用語 によって 説明 できる はず で ある という 立場 が 一般 的 と なっ て いる 32 近年 で は 言語 学 関連 の 学会 等 で 音声 言語 と共に 手話 言語 学者 の 研究 報告 が プログラム に のぼる こと も 珍しく ない 33 より 広義 に は 視覚 言語 、 身体 言語 など 声 による コミュニケーション に 還元 でき ない 場合 に も 、 コミュニケーション を 統べる 規則 が あれ ば 、 そ れ を 言語 と 呼ぶ こと が ある 34 また 、 動物 の 間 の 相互 作用 に も 言語 の 存在 を 認める 場合 が ある 35 例えば ミツバチ が 蜜 源 を 仲間 に 伝える ため の ダンス を 「 ミツバチ の 言語 」 と 呼ぶ こと も ある 36 ただし 、 人間 の 多く の 言語 と 比べ 、 動物 の 相互 作用 に は 、 往々 に し て 恣意 的 な 規則 ( 「 リンゴ 」 という 音 が リンゴ という 果物 の 種類 を 指す という 約束事 など ) が 乏しく 、 生息 環境 や 生 与 の 能力 に 根ざし た やや 必然 性 の 高い 表現 手段 が 関与 し て いる 場合 が 多い 37 ( 「 歯 を むき出す こと 」 が 「 相手 に対する 敵意 」 の 表現 と なる 、 など ) これ は 規則 で は なく 、 単なる 規則 性 で ある 点 で やや 趣 を 異に する 38 同じく 、 広義 の 言語 の 中 に 含ま れる こと が 多い の が コンピューター の プログラミング に際して 参照 さ れる 一連 の 規則 ( プログラミング 言語 ) で ある 39 プログラム の 機能 は 、 コミュニケーション の 一 種 で ある と 考える こと は 不可能 で は ない として も 、 典型 的 な 人間 の 会話 において 言語 が 果た す 機能 と 明らか に 異なっ て いる 40 また 、 規則 が 特定 少数 の 人間 によって 決定 さ れ て いる 点 で 狭義 の 言語 と 異なる 41 この ため 、 プログラミング 言語 の よう に 創作 さ れ た 言語 を 人工 言語 と 呼び 、 日本語 の よう な 自然 言語 と 区別 する 場合 も ある 42 == 自然 言語 == 厳密 に は 、 言語 の 定義 に は 多く の 困難 が 伴う 43 コミュニケーション の 「 規則 」 が どこ か に 明記 さ れ て おり 人々 が そ れ を 参照 し ながら コミュニケーション が 行わ れる わけ で は なく 、 実際 人 々 が 単一 の 規則 に 従っ て い ない と 考え させる 材料 も ある 44 方言 の よう な 地理 的 な バリエーション 、 新語 の 普及 の よう な 歴史 的 変化 、 言い 間違い や 言い かけ に 終わる 発言 など 、 文法 として 通常 考え られる 規則 に 反する 発話 など が 、 その 例 として 考え られる 45 また 、 「 声 」 を 基礎 と し 、 文字 を その 代替 と する 発想 に対する 批 判 を 投げかける 立場 ( 『 声 と 現象 』 ) も ある ( 言語 哲学 ) 46 自然 言語 は 母語 として 使用 する 人々 の 存在 を 前提 として 存在 し て い る ため 、 民族 の 滅亡 や 他 言語 による 吸収 によって 使用 さ れ なく なる こ と が ある 47 この よう な 言語 は 死語 と 呼ば れ 、 死語 が 再び 母語 として 使用 さ れる こと は ヘブライ 語 の 例 を 除け ば ほとんど ない 48 近年 、 話者 数 が 非常 に 少ない 言語 が 他 言語 に 飲み込ま れ て 消滅 し 、 新た に 死語 と 化す こと が 問題 視 さ れる よう に なり 、 消滅 の 危機 に ある 言語 を 危機 言語 と 呼ぶ よう に なっ た 49 これ は 、 世界 の 一体化 が 進み 、 交通 網 の 整備 や 流通 の 迅速 化 、 ラジオ ・ テレビ といった マスメディア の 発達 によって それ まで 孤立 を 保っ て い た 小さな 言語 が その コミュニティ を 維持 でき なく なる ため に 起こる と 考え られ て いる 50 より 大きな 視点 で は 英語 の 国際 語 として の 勢力 伸張 による 他 主要 言 語 の 勢力 縮小 、 いわゆる 英語 帝国 主義 も これ に 含ま れる と いえる が 、 すくなくとも 21 世紀 初頭 において は 英語 を 母語 と する 民族 が 多数 派 を 占める 国家 を 除い て は 英語 の グローバル 化 が 言語 の 危機 に 直結 し て いる わけ で は ない
ここまでで見る限り、二重改行は「。」がなくても文(というよりはタイトル等)の単位を示しており、切れ目になる。タイトルは(次の文へ続いてはいないという意味で)1つの文として扱うべきだろう。
また、リスト項目のヘッダーである「*」も、文の切れ目を表す。
更に、「== 歴史 ==」や、「[[ アンパサンド ]]」に見られる項目ヘッダーも、切れ目に当たる。
これを見分けるロジックとして
まず、行ごとに読む(改行符号で切る) 行の先頭が「=」か[]」の場合、==XXX==や[[YYY]]の行であると判定する ==/==や[[/]]を取り除いて、行末までを1行と見なす 行の先頭が「*」の場合、リストの項目「*XXXXXX」の行であると判定する 先頭の*を取り除いて、行末までを1行とみなす 上記3つ(=/[で始まるか、*で始まるか、それ以外)のいずれも、その1行の内容を「。」で分割して行にする。
としてみる。
プログラム案:
#!/usr/bin/env python # -*- coding: utf-8 -*- import sys, os import string, codecs import re sys.stdout = codecs.getwriter('utf_8')(sys.stdout) def nonnulstring(s): return s!="" def stripstring(s): return s.strip() out = [] dirname = "/home/yamanouc/src/gensim/wp2txt" fn = "wp2wakati100.txt" text = open(os.path.join(dirname, fn)).readlines() # Check if one line contains only one period for s in text: strips = unicode(s).strip() if strips != "": ch = strips[0] if ch=='=': u = strips.strip("\n").strip("=").rstrip("=") p = u.split(u"。") elif ch=='[': u = strips.strip("\n").strip("[").rstrip("]") p = u.split(u"。") elif ch=='*': u = strips.strip("\n").strip("*") p = u.split(u"。") else: p = strips.split(u"。") out.extend(filter(nonnulstring, map(stripstring, p))) # 最後のmapはstripstringをpのすべての要素にapplyしてからextendで結合するため for u in out: print "<"+u+">"
結果は
<アンパサンド> <CATEGORIES : 約 物 , ラテン語 の 語句> <アンパサンド ([ tpl ] lang | en | ampersand [/ tpl ], &) と は 「 … と … 」 を 意味 する 記号 で ある> <英語 の [ tpl ] lang | en |" and "[/ tpl ] に 相当 する ラテン語 の [ tpl ] lang | la |" et "[/ tpl ] の 合 字 で 、 [ tpl ] lang | en |" etc ."[/ tpl ] ( et cetera = and so forth ) を [ tpl ] lang | en |"& c ."[/ tpl ] と 記述 する こと が ある の は その ため> <Trebuchet MS フォント で は 、 10 px と 表示 さ れ " et " の 合 字 で ある こと が 容易 に わかる> <歴史> <その 使用 は 1 世紀 に 遡る こと が でき ( 1 )、 5 世紀 中葉 ( 2 , 3 ) から 現 代 ( 4 - 6 ) に 至る まで の 変遷 が わかる> <Z に 続く ラテン 文字 アルファベット の 27 字 目 と さ れ た 時期 も ある> <記号 名 の 「 アンパサンド 」 は 、 ラテン語 の 「 & は それ 自身 " and " を 表す 」 [ tpl ] lang | la |(& per se and )[/ tpl ] から き て いる> <手書き> <日常 的 な 手書き の 場合 、 欧米 で アンパサンド は 「 ε 」 に 縦 線 を 引く 単純 化 さ れ た もの が 使わ れる こと が ある> <また 同様 に 、 「 t 」 または 「+( プラス ) 」 に 輪 を 重ね た よう な 、 無声 歯茎 側面 摩擦音 を 示す 発音 記号 「[ tpl ] IPA | ? [/ tpl ]」 の よう な もの が 使わ れる こと も ある> <プログラミング 言語> <プログラミング 言語 で は 、 C など 多数 の 言語 で AND 演算 子 として 用い ら れる> <以下 は C の 例> <X = A && B の よう に 2 個 重ね た もの は 論理 AND を 表す> <この 場合 A , B が ともに 真 なら ば X も 真 、 それ 以外 は 偽 で ある> <0 x 12345678 & 0 x 0 f 0 f 0 f 0 f の よう に 1 個 で あれ ば ビット AND を 表 す> <この 場合 の 結果 は 0 x 02040608 で ある> <BASIC 系列 の 言語 で は 文字 列 の 連結 演算 子 として 使用 さ れる> <" foo " & " bar " は " foobar " を 返す> <また 、 主 に マイクロソフト 系 で は 整数 の 十 六 進 表記 に & h を 用い 、 & h 0 F ( 十 進 で 15 ) の よう に 表現 する> <SGML 、 XML 、 HTML で は 、 アンパサンド を 使っ て SGML 実体 を 参照 する> <その他> <& ( シングル )( アンド ) は 、 浜崎 あゆみ が 2003 年 に 発売 し た 4 曲 入り マキシ シングル> <& ( 一 青 窈 の アルバム )( アンド ) は 、 一青 窈 が 2005 年 に 発売 し た アルバム 、 及び 同 アルバム に 収録 さ れ た 楽曲> <& ( 漫画 )( アンド ) は 、 お かざ き 真 里 による 漫画 作品> <アンパサンド は 、 日本 の 競走 馬> <⇒ アンパサンド ( 競走 馬 )> <符号 位置>
さて、形式上は、文のタグ(番号でいいらしい)と、文を単語に分けたリスト、とのペアが、 文章全体でリストになっているものが欲しいらしいので、これならどうか?
#!/usr/bin/env python # -*- coding: utf-8 -*- import sys, os import string, codecs import re sys.stdout = codecs.getwriter('utf_8')(sys.stdout) def nonnulstring(s): return s!="" def stripstring(s): return s.strip() def splitstring(s): return s.split(" ") out = [] dirname = "/home/yamanouc/src/gensim/wp2txt" fn = "wp2wakati100.txt" #fn = "xx.txt" print os.path.join(dirname, fn) text = open(os.path.join(dirname, fn)).readlines() # Check if one line contains only one period for s in text: strips = unicode(s).strip() if strips != "": ch = strips[0] if ch=='=': u = strips.strip("\n").strip("=").rstrip("=") p = u.split(u"。") elif ch=='[': u = strips.strip("\n").strip("[").rstrip("]") p = u.split(u"。") elif ch=='*': u = strips.strip("\n").strip("*") p = u.split(u"。") else: p = strips.split(u"。") pp = map(stripstring, p) ppp = map(splitstring, filter(nonnulstring, pp)) out.extend(ppp) for i, u in enumerate(out): print i, print "[", for v in u: print v, print "]"
出力は、
0 [ アンパサンド ] 1 [ CATEGORIES : 約 物 , ラテン語 の 語句 ] 2 [ アンパサンド ([ tpl ] lang | en | ampersand [/ tpl ], &) と は 「 … と … 」 を 意味 する 記号 で ある ] 3 [ 英語 の [ tpl ] lang | en |" and "[/ tpl ] に 相当 する ラテン語 の [ tpl ] lang | la |" et "[/ tpl ] の 合 字 で 、 [ tpl ] lang | en |" etc ."[/ tpl ] ( et cetera = and so forth ) を [ tpl ] lang | en |"& c ."[/ tpl ] と 記述 する こ と が ある の は その ため ] 4 [ Trebuchet MS フォント で は 、 10 px と 表示 さ れ " et " の 合 字 で ある こと が 容易 に わかる ] 5 [ 歴史 ] 6 [ その 使用 は 1 世紀 に 遡る こと が でき ( 1 )、 5 世紀 中葉 ( 2 , 3 ) から 現代 ( 4 - 6 ) に 至る まで の 変遷 が わかる ] 7 [ Z に 続く ラテン 文字 アルファベット の 27 字 目 と さ れ た 時期 も ある ] 8 [ 記号 名 の 「 アンパサンド 」 は 、 ラテン語 の 「 & は それ 自身 " and " を 表す 」 [ tpl ] lang | la |(& per se and )[/ tpl ] から き て いる ] 9 [ 手書き ] 10 [ 日常 的 な 手書き の 場合 、 欧米 で アンパサンド は 「 ε 」 に 縦 線 を 引く 単純 化 さ れ た もの が 使わ れる こと が ある ] 11 [ また 同様 に 、 「 t 」 または 「+( プラス ) 」 に 輪 を 重ね た よう な 、 無声 歯茎 側面 摩擦音 を 示す 発音 記号 「[ tpl ] IPA | ? [/ tpl ]」 の よう な もの が 使わ れる こと も ある ] 12 [ プログラミング 言語 ] 13 [ プログラミング 言語 で は 、 C など 多数 の 言語 で AND 演算 子 として 用い られる ] 14 [ 以下 は C の 例 ] 15 [ X = A && B の よう に 2 個 重ね た もの は 論理 AND を 表す ] 16 [ この 場合 A , B が ともに 真 なら ば X も 真 、 それ 以外 は 偽 で ある ] 17 [ 0 x 12345678 & 0 x 0 f 0 f 0 f 0 f の よう に 1 個 で あれ ば ビット AND を 表す ] 18 [ この 場合 の 結果 は 0 x 02040608 で ある ] 19 [ BASIC 系列 の 言語 で は 文字 列 の 連結 演算 子 として 使用 さ れる ] 20 [ " foo " & " bar " は " foobar " を 返す ] 21 [ また 、 主 に マイクロソフト 系 で は 整数 の 十 六 進 表記 に & h を 用い 、 & h 0 F ( 十 進 で 15 ) の よう に 表現 する ] 22 [ SGML 、 XML 、 HTML で は 、 アンパサンド を 使っ て SGML 実体 を 参照 する ] 23 [ その他 ] 24 [ & ( シングル )( アンド ) は 、 浜崎 あゆみ が 2003 年 に 発売 し た 4 曲 入り マキシ シングル ] 25 [ & ( 一 青 窈 の アルバム )( アンド ) は 、 一青 窈 が 2005 年 に 発売 し た アルバム 、 及び 同 アルバム に 収録 さ れ た 楽曲 ] 26 [ & ( 漫画 )( アンド ) は 、 お かざ き 真 里 による 漫画 作品 ] 27 [ アンパサンド は 、 日本 の 競走 馬 ] 28 [ ⇒ アンパサンド ( 競走 馬 ) ] 29 [ 符号 位置 ] 30 [ 言語 ] 31 [ CATEGORIES : 言語 , 言語 学 , 民族 ] 32 [ 言語 ( げん ご [ tpl ] lang - en - short | Language [/ tpl ]) と は 、 コミュニケーション の ため の 記号 の 体系 で ある ] 33 [ 狭義 に は 人間 の 音声 による 音声 言語 を 指す が 、 広義 に は 身振り など 音声 以外 の 要素 も 含む ] 34 [ また 、 動物 間 の コミュニケーション や 、 コンピュータ に 指示 する ため の 記号 体系 を 指す 場合 も ある ] 35 [ 英語 や 日本語 や 中国 語 の よう に 自然 発生 的 に 生まれ た 言語 を 自然 言語 と 呼び 、 これ に対して 人為 的 に 創作 さ れ た 言語 を 人工 言語 と 呼 ぶ ] 36 [ 後者 に は 、 もっぱら 人間 同士 による やりとり を 目的 と し た エスペラ ント 、 コンピュータ の 操作 を 目的 と し た プログラミング 言語 、 それから 人間 に も コンピュータ に も 適し た ロ ジバン といった もの が ある ] 37 [ 自然 言語 は 、 母語 と する 人々 の 存在 を 失う と 使用 さ れ なく なり 死語 ( 廃語 ) と 呼ば れる ] 38 [ 定義 ] 39 [ 狭義 に は 、 人間 の コミュニケーション 、 相互 作用 を 統べる 規則 の 内 、 声 にまつわる 部分 、 あるいは その 声 の 代替 として の 文字 表記 など にま つわる 部分 を 指す ] 40 [ 手話 、 トーキング ドラム など の 例 において も 、 おおよそ 声 による コミュニケーション と 対応 し て いる ] 41 [ ただし 、 かつて 日本 の 手話 言語 学者 は 手話 は 音声 語 と は 形態 にお いて 異なる が ゆえに 、 音声 言語 学 と は まったく 異なる 言語 学 用語 、 文法 用語 によって 研究 さ れる べき で ある という 立場 を とっ て い た ] 42 [ しかし 、 近年 で は 手話 と いえ ども れっきとした 言語 で ある ゆえ に 音声 語 と 同様 の 言語 学 的 手法 、 用語 によって 説明 できる はず で ある とい う 立場 が 一般 的 と なっ て いる ] 43 [ 近年 で は 言語 学 関連 の 学会 等 で 音声 言語 と共に 手話 言語 学者 の 研究 報告 が プログラム に のぼる こと も 珍しく ない ] 44 [ より 広義 に は 視覚 言語 、 身体 言語 など 声 による コミュニケーション に 還元 でき ない 場合 に も 、 コミュニケーション を 統べる 規則 が あれ ば 、 それ を 言語 と 呼ぶ こと が ある ] 45 [ また 、 動物 の 間 の 相互 作用 に も 言語 の 存在 を 認める 場合 が ある ] 46 [ 例えば ミツバチ が 蜜 源 を 仲間 に 伝える ため の ダンス を 「 ミツバチ の 言語 」 と 呼ぶ こと も ある ] 47 [ ただし 、 人間 の 多く の 言語 と 比べ 、 動物 の 相互 作用 に は 、 往々 に し て 恣意 的 な 規則 ( 「 リンゴ 」 という 音 が リンゴ という 果物 の 種類 を 指す という 約束事 など ) が 乏しく 、 生息 環境 や 生 与 の 能力 に 根ざし た やや 必然 性 の 高い 表現 手段 が 関与 し て いる 場合 が 多い ] 48 [ ( 「 歯 を むき出す こと 」 が 「 相手 に対する 敵意 」 の 表現 と なる 、 など ) これ は 規則 で は なく 、 単なる 規則 性 で ある 点 で やや 趣 を 異に する ] 49 [ 同じく 、 広義 の 言語 の 中 に 含ま れる こと が 多い の が コンピューター の プログラミング に際して 参照 さ れる 一連 の 規則 ( プログラミング 言語 ) で ある ] 50 [ プログラム の 機能 は 、 コミュニケーション の 一 種 で ある と 考える こと は 不可能 で は ない として も 、 典型 的 な 人間 の 会話 において 言語 が 果たす 機能 と 明らか に 異なっ て いる ] 51 [ また 、 規則 が 特定 少数 の 人間 によって 決定 さ れ て いる 点 で 狭義 の 言語 と 異なる ] 52 [ この ため 、 プログラミング 言語 の よう に 創作 さ れ た 言語 を 人工 言語 と 呼び 、 日本語 の よう な 自然 言語 と 区別 する 場合 も ある ]
まず、分かち書きした本文のファイルを準備する。ただし、1行が1ドキュメント(1文) とする。
$ cat wiki2linedoc.py #!/usr/bin/env python # -*- coding: utf-8 -*- # d2v-learn import sys, os, codecs import string, re import gensim sys.stdout = codecs.getwriter('utf_8')(sys.stdout) def nonnulstring(s): return s!="" def stripstring(s): return s.strip() def splitstring(s): return s.split(" ") out = [] dirname = "/home/yamanouc/src/gensim/wp2txt" #fn = "wp2wakati100.txt" fn = "wp2wakati.txt" print os.path.join(dirname, fn) text = open(os.path.join(dirname, fn)).readlines() ''' ../wp2txt/wp2wakati.txtをきれいにすること 2016-02-29 1)タイトル([―――])は文になっていないので、消す。 2)CATEGORIES : ―――――― も消す 3)段落タイトル == ――――― == も消す 4)カッコに囲まれている部分を消す ( 1 )とか ([ tpl ] lang | en | ampersand [/ tpl ], &) 5)「、」は消す 6)『「』と『」』は消す(中身はそのまま残す) 7)*は(箇条書き)消す、本文は残す 8):は(注釈マーク)消す、本文は残す 最後に、1単語しか無い文は、消す。 ''' pat_tpls = re.compile(r'\[ tpl \].*?\[/ tpl \]') pat_parens = re.compile(r'\(.*?\)') pat_paren2s = re.compile(u'(.*?)') pat_sqbrackets = re.compile(r'\[.*?\]') for s in text: strips = unicode(s).strip() strips = re.sub(pat_tpls, '', strips) strips = re.sub(pat_parens, '', strips) strips = re.sub(pat_paren2s, '', strips) if strips != "": ch = strips[0] if ch=='=': u = strips.strip("\n").strip("=").rstrip("=") p = u.split(u"。") p = [] # ignore this line elif ch=='[': u = re.sub(pat_sqbrackets, '', (strips.strip("\n"))) p = u.split(u"。") p = [] # ignore this line elif ch=='C': if strips[0:12]=='CATEGORIES :': p = [] else: p = u.split(u"。") elif (ch=='*') or (ch==':') or (ch==';'): u = strips.strip("\n").strip("*") p = u.split(u"。") p = [] else: p = strips.split(u"。") p = filter(lambda a: a!=u"、", p) pp = map(stripstring, p) ppp = map(splitstring, filter(nonnulstring, pp)) out.extend(ppp) fout = open("wikiline.txt", "w") #fout = open("wikiline100.txt", "w") for u in out: for v in u: print >> fout, v, print >> fout fout.close()
次に、この出力ファイルを、次のプログラムに食わせてdoc2vecをトレーニングする。
# まずPlainLineDocumentフォーマットからTaggedLineDocumentフォーマットに変換 docsrc = gensim.models.doc2vec.TaggedLineDocument('wikiline.txt') # 次に、トレーニング m = gensim.models.doc2vec.Doc2Vec(docsrc, size=100, window=8, min_count=2, workers=4) # モデルmをセーブする m.save("mymodel")
モデルを使うメソッドの実験 ドキュメント参照
>>> m.similarity(u'また',u'も') 0.52648741466034554 >>> x = m.most_similar(u'また') >>> for u in x: ... for v in u: ... print v, ... さ 0.721945047379 点 0.68540096283 考え 0.682420969009 問題 0.6818805933 もの 0.675799548626 う 0.673263430595 基準 0.660309076309 例 0.648306429386 さらに 0.635699748993 なり 0.629096627235
これは、単語に対するsimilarityらしい。文(doc)については、
>>> sims = m.docvecs.most_similar(1) 文ラベル1に似ている文上位10個を出せ >>> sims [(96, 0.3002694249153137), (81, 0.29771459102630615), (115, 0.27464723587036133), (54, 0.24800336360931396), (112, 0.23777592182159424), (78, 0.2362814098596573), (16, 0.22363528609275818), (47, 0.21590390801429749), (30, 0.20214730501174927), (56, 0.19432753324508667)]
多分、ラベル96番が0.30で似ている…など。
ラベルは、今の場合は入力の行番号に相当するようにしているため(1から最後の行まで)、それを使えばいいらしい。
では、文番号を与えて、類似文を出力する、というプログラムを作ってみる。但し、doc2vecでは入力も出力もラベルで、読みにくいので、元の文を表示するようにする。リストインデックスが、doc2vecでは1からなのに、プログラム内では0からであることに注意。
#!/usr/bin/env python # -*- coding: utf-8 -*- # d2v-similar # モデルを読み込んで、キー入力した文にsimilarな文を探す import sys, os import string, codecs import logging import gensim sys.stdout = codecs.getwriter('utf_8')(sys.stdout) fn = 'wikiline' modelfile = fn + '.mdl ' textfile = fn + '.txt' logging.basicConfig(format='%(levelname)s:%(message)s', filename=fn +'.log', filemode='w', level=logging.INFO) logging.info("running %s" % ' '.join(sys.argv)) # まずfn.mdlからロード m = gensim.models.doc2vec.Doc2Vec.load(modelfile) logging.info("wikiline.mdl loaded") # テキストファイルもロード tx = open(textfile, 'r').readlines() ln = len(tx ) # 何回も使うので覚えておくことにする logging.info("wikiline.txt loaded") while True: str = raw_input('Enter docnumber (1..max): ') if str == 'q': quit() else: if str.isdigit(): snum = int(str) if snum in range(1, ln+1): print 'input', snum, tx[snum-1] else: print 'input', snum, 'out fo range', ln+1 break sims = m.docvecs.most_similar(snum, topn=3) for u in sims: print u id = u[0] if id in range(1, ln+1): print u[0], u[1], tx[id-1] else: print 'index', id, 'out of range', ln+1
試してみた結果は、次の通り。(文のラベルは現在のものと違うのでそのままは試せない) Enter docnumber (1..max): 600663
input 600663 空気 の 比重 と 比較 する と 1 . 5 倍 重く 、 プロパン が 漏洩 する と 床 面 に 滞留 する (9465258, 0.5497746467590332) 9465258 0.549774646759 内 視 鏡 等 で 病変 部 を ブラシ 等 で 擦り 取っ た 細胞 診 検体 について 病理 診断 を 行う (5064362, 0.5443246960639954) 5064362 0.544324696064 肺 動脈 カテーテル と は 、 カテーテル の 一つ (469203, 0.5255934000015259) 469203 0.525593400002 動作 温度 は 200 ℃ 程度 で 、 発電 効率 は 、 約 40 % LHV
Enter docnumber (1..max): 1584468 input 1584468 目的 物 を 溶解 し た 超 臨界 二酸化炭素 を 臨界 点 以下 に する と 、 二酸化炭素 は 気化 する ので 、 後 に は 溶質 のみ が 残る (3722888, 0.5738210678100586) 3722888 0.57382106781 太陽系 内 に 存在 する 塵 の うち 、 比較的 小さな サイズ の もの で ある と 考え られ て いる (2011342, 0.57314133644104) 2011342 0.573141336441 逆 に 高速 中性子 は ウラン 235 や プルトニウム の 核分裂 を 誘起 し にくい が 、 ウラン 238 に 捕獲 さ れ て プルトニウム 239 を 生成 する 確率 が 高い (8445795, 0.5617737770080566) 8445795 0.561773777008 その後 地質 学 と 古 生物 学 の 進歩 により 、 縞 状 鉄鉱 床 は 太古 の シアノバクテリア の 光合成 で 出来 た 酸素 が 当時 海中 に 大量 に 溶解 し て い た 鉄 イオン を 酸化 し て 不溶化 ・ 沈殿 し た もの と 考え られる よう に なっ た
Enter docnumber (1..max): 748308 input 748308 加え て 、 トルコ が キプロス を 独立 国 として 承認 する こと も トルコ の EU 加入 の 基本 的 前提 と 見なし て いる (3509839, 0.5045762658119202) 3509839 0.504576265812 「 しんみり やる の は 橋本 に 似合わ ない 、 明るく 楽しく 追悼 を やろ う 」 と し 、 過去 の 試合 映像 や 出演 者 による 橋本 がらみ の 爆笑 トーク 、 さらに は 橋本 が かつて 雑誌 に 掲載 し た 下 ネタ の 数々 を 大 暴露 など が 繰り広げ られ 、 涙 一つ 無い カラッ と し た 追悼 番組 と なっ た (825441, 0.49187928438186646) 825441 0.491879284382 リチャード ・ ブロディ の 考察 する 「 マインド ・ ウイル ス から の 治療 」 を 以下 に 述べる (11963480, 0.48931217193603516) 11963480 0.489312171936 この ため 、 アメリカ は 宇宙 技術 を ブラジル へ 移転 さ せる こと に 制限 を かけ 、 これ によって ブラジル の VLS 計画 と 弾道 ミサ イル の 研究 開発 を 遅らせる こと に 成功 し た
Enter docnumber (1..max): 13516381 input 13516381 菓子 戦争 は 、 1838 年 に 起き た フランス の メキシコ へ の 干渉 戦争 で ある (278310, 0.5964555740356445) 278310 0.596455574036 現代 (1196862, 0.5904451608657837) 1196862 0.590445160866 フランス へ の 接近 は 失敗 に 終わり 、 イギリス や オーストリア と は 強い 敵対 関係 から 脱却 する こと は なかっ た (5305407, 0.5466333627700806) 5305407 0.54663336277 この ニュース が 9 月 16 日 深夜 に ドローレス 村 に 伝わ る と 、 イダルゴ は 演説 を 行い 、 先住民 や 混血 民 を 中心 と する 周辺 住 民 を 率い て 武装 蜂起 を 起こし た
Enter docnumber (1..max): 748309 input 748309 トルコ が 現時点 で EU 加盟 交渉 を 申し出る なら ば 、 自動的 に その プロセス が 動き出す こと に キリスト教 民主 同盟 を 遺憾 な こと と 見なし て いる (6491171, 0.5381110906600952) 6491171 0.53811109066 龍徳 は 五 代 の 最初 の 王朝 で ある 後 梁 において 朱 友 貞 の 治世 で 用い られ た 元号 (10135542, 0.53679358959198) 10135542 0.536793589592 File : Albarracin - Vista 03 . jpg | アルバラシン 城 (883490, 0.5353686213493347) 883490 0.535368621349 2005 年 の 選挙 における 勢力 図 は 、 全 51 議席 中 15 議席 が 民主 統一 党 、 14 議席 が シン・フェイン 、 8 議席 が 社会民主労働党 、 7 議席 が アルスター 統一 党 、 4 議席 が 北アイルランド 同盟 党 、 2 議席 が 進 歩 統一 党 、 1 議席 が 無所属 と なっ て いる
では、コーパスに含まれない文を対象として、似ている文を探すとしたら、どうするか?含まれない文のベクトルを推定するのだそうである。
まず、対象とする文を分かち書きし、リストにしておく。
次に、ロードしておいたモデルmを使って、m.infer_vector(対象となる文)でベクトルを推定する。xがベクトル。
このベクトルxをリストにして、most_similarに食わせる。
m = gensim.models.doc2vec.Doc2Vec.load("wikiline-old/wikiline.mdl") t = open('input.txt', 'r').read() tt = t.split(' ') x = m.infer_vector(tt) m.docvecs.most_similar([x]) [(9676611, 0.5057333707809448), (12730130, 0.49067118763923645), (18446111, 0.4890895485877991), (19965216, 0.4889296889305115), (285058, 0.4787384867668152), (11928745, 0.4665689170360565), (9368967, 0.46571487188339233), (55053, 0.46511825919151306), (6633273, 0.4633559286594391), (3504017, 0.46202734112739563)]
プログラムとしては、
#!/usr/bin/env python # -*- coding: utf-8 -*- # d2v-infer # モデルを読み込んで、キー入力した文にsimilarな文を探す import sys, os import string, codecs import logging import MeCab import gensim sys.stdout = codecs.getwriter('utf_8')(sys.stdout) fn = '/wikiline' modelfile = fn + '.mdl' textfile = fn + '.txt' inputfile = 'input.txt' tagger = MeCab.Tagger("-Owakati") logging.basicConfig(format='%(levelname)s:%(message)s', filename=fn +'.log', filemode='w', level=logging.INFO) logging.info("running %s" % ' '.join(sys.argv)) # 対象となる文を入力 tinput = open(inputfile, 'r').read() res = tagger.parse(tinput).split(' ') # まずfn.mdlからロード m = gensim.models.doc2vec.Doc2Vec.load(modelfile) logging.info(modelfile + " loaded") # コーパステキストファイルもロード tx = open(textfile, 'r').readlines() ln = len(tx) logging.info(textfile + " loaded") x = m.infer_vector(res) sims = m.docvecs.most_similar([x], topn=3) #print tinput for u in sims: print u id = u[0] if id in range(1, ln+1): print u[0], u[1], tx[id-1] else: print 'index', id, 'out of range', ln+1
実行例としては
Enter document: 目的 物 を 溶解 し た 超 臨界 二酸化炭素 を 臨界 点 以下 に する と 、 二酸化炭素 は 気化 する ので 、 後 に は 溶質 のみ が 残る (9516399, 0.4778631925582886) 9516399 0.477863192558 マグマ が 均等 に 混ざり 合っ て い ない ため 、 肉眼 で 確認 できる 色 ムラ が 多い (7328463, 0.4674248695373535) 7328463 0.467424869537 車 部 は 、 漢字 を 部首 により 分類 し た グループ の 一つ (8847064, 0.46157771348953247) 8847064 0.46157771349 経済 的 な 豊か さ を 失い 、 また 刑務所 に 入ら ざる を 得 なく なっ た こと で 、 妻 の 気持ち が 離れ て いく の で は と 不安 を 感じ 、 婚姻 後 契約 に サイン さ せよ う と 躍起 に なる
Enter document: その後、前の文章を一定数加えて、深層学習ネットワークに与えるコンテクストを増やすことで、エラー率は12.8パーセントに低下した。
その後 、 前 の 文章 を 一 定数 加え て 、 深層 学習 ネットワーク に 与える コンテクスト を 増やす こと で 、 エラー 率 は 12 . 8 パーセント に 低下 し た 。
(11960894, 0.7057925462722778) 11960894 0.705792546272 0102030405060 __ 64 (12038157, 0.7037415504455566) 12038157 0.703741550446 カスケード 地震 と は 、 1700 年 に カスケード 沈み 込 み 帯 で 発生 し た プレート 間 地震 (9801953, 0.7021126747131348) 9801953 0.702112674713 また デュスポンテウス 、 レウキッポス という 子供 も い た パウサニアス 、 6 巻 22 ・ 4
Enter document: ギリシャ北部イドメニ近くで2月29日、隣国マケドニアへの入国を阻まれた難民らが、「国境を開けろ」と抗議し、国境を隔てるフェンスの一部を破壊した。
ギリシャ 北部 イドメニ 近く で 2月 2 9 日 、 隣国 マケドニア へ の 入国 を 阻ま れ た 難民 ら が 、 「 国境 を 開けろ 」 と 抗議 し 、 国境 を 隔てる フェン ス の 一部 を 破壊 し た 。
(13129958, 0.5039729475975037) 13129958 0.503972947598 この 頃 は 東京 駅 に 東北 ・ 高崎 ・ 常磐線 方面 の 優 等 列車 や 一部 普通 列車 が 乗り入れ て き て い た が 、 これ を 上野 で 打ち 切り と する ため に 上野 駅 の 信号 扱所 の 改良 や 上野 - 秋葉原 間 に 留置 線 の 設置 など を 行っ た (11366359, 0.48808348178863525) 11366359 0.488083481789 マンガ 大賞 2011 ノミネート 作品 (3920078, 0.48360785841941833) 3920078 0.483607858419 その 理由 は 非核 三 原則 に ある と いわ れ て いる
ちょっとひどいので、ベクトルを見てみよう。学修インプットの2829870番は
input 2829870 就職 協定 の 廃止 で 、 一 人 の 学生 が 好き な だけ 企業 を 受ける こと が 可能 に なり 、 メガ バンク や 大手 メーカー 、 総合 商社 、 航空 会 社 など 大手 企業 へ の 採用 希望 者 は 採用 枠 の 数 百 倍 に 及び 、 就職 活動 は 大変 な 競争 に なっ て いる
で、ベクトルはmodel mに対して
docvec = m.docvecs[2829870]
のようにして求められ、結果は
[ 2.70725712e-02 -1.09555796e-02 -1.43752876e-03 -1.73138492e-02 -3.11725382e-02 3.07186376e-02 8.30257777e-04 -7.10208248e-03 2.82094311e-02 5.56313084e-04 -4.91549901e-04 -1.49699105e-02 1.49976322e-02 6.49759686e-03 -4.62192530e-03 5.50931646e-03 -1.84843168e-02 1.47961592e-02 -3.40345018e-02 3.67669901e-03 -1.31875603e-03 6.53400784e-04 -1.91361122e-02 -2.94732898e-02 -1.57050993e-02 2.20924690e-02 -5.10963276e-02 6.66505471e-03 -6.70290971e-03 5.01292851e-03 -1.71229895e-02 -1.78080611e-02 3.64091154e-03 1.56630296e-02 -2.13953224e-03 -3.31232622e-02 1.10719074e-02 -1.10598300e-02 3.53100128e-03 1.71722821e-03 2.54796073e-02 -7.20596826e-03 -4.48142551e-03 2.07756902e-03 -1.88357048e-02 4.68995236e-03 1.74551867e-02 -8.45194235e-03 6.21951278e-03 -1.92035269e-02 2.99730226e-02 -5.51482243e-03 2.21268311e-02 -2.16611829e-02 1.08466372e-02 -6.93102414e-03 -1.67360883e-02 -1.73111577e-02 -1.97991785e-02 -2.50764303e-02 -1.47786206e-02 4.18037809e-02 1.23536540e-03 -1.21584460e-02 1.81635898e-02 2.74090264e-02 1.25256926e-02 -1.55170076e-03 -3.09601519e-02 -3.53862671e-03 4.18147966e-02 -2.22106222e-02 3.12998891e-05 -1.81499962e-02 -1.61217451e-02 -1.66588812e-03 -1.94112118e-02 1.94422137e-02 6.77700387e-03 5.77046769e-03 1.60953496e-02 -1.79610774e-02 7.01069366e-03 2.18397230e-02 -3.83354258e-03 1.38859674e-02 -2.25692503e-02 -2.30627637e-02 -3.08487210e-02 -1.30082304e-02 -4.02169116e-03 -5.35247587e-02 3.12663917e-03 1.69167053e-02 -1.45197921e-02 -5.25621045e-03 8.35896563e-03 -1.01675466e-03 2.11138129e-02 1.49480987e-03] ベクトル長 0.184573662718
である。
他方、inferを使った結果は、モデルmに対して
m.infer_vector(上記入力・分かち書き済み)
として求められ、得られたのは
[ -4.04663570e-03 4.29494074e-03 -4.69312072e-03 1.18081080e-04 -3.82805127e-03 -1.07163494e-03 -3.15546500e-03 3.22997267e-03 -2.77433312e-03 -2.10964098e-03 -2.73808278e-03 -1.40800537e-03 -4.07055393e-03 -3.35528958e-03 -2.91172694e-03 -2.02175230e-03 3.15722614e-03 1.77908025e-03 1.75582827e-04 4.56622016e-04 2.80669820e-03 -4.05332539e-03 3.68401199e-03 3.61603568e-03 -2.23542540e-03 -2.99533334e-04 -2.74013873e-04 -4.30325652e-03 -1.52190565e-03 4.05399455e-03 -1.94868329e-03 -2.70010484e-03 2.46516778e-03 -3.57269775e-03 -4.69692936e-03 3.89689300e-03 1.11687439e-03 -2.01787497e-03 3.13752773e-03 1.23704772e-03 -1.27735175e-03 2.64216005e-03 -3.49440123e-03 -3.83393629e-03 3.59861809e-03 -4.92782285e-03 2.91941618e-03 -2.28545466e-03 -2.87414005e-04 -5.27327240e-04 1.11788849e-03 1.22979563e-03 3.81763605e-03 1.15663395e-03 2.99760373e-03 3.87212704e-03 3.00246757e-03 -5.29913814e-04 -7.89989601e-04 -1.90835982e-03 -1.88713276e-03 1.63389719e-03 -2.14963639e-03 -4.54933802e-03 -3.49105569e-03 -1.07064249e-03 -2.08491320e-03 9.96704912e-04 -4.80279420e-03 -1.89775997e-03 1.69726240e-03 1.58828648e-03 -4.39950405e-03 3.21737956e-04 -1.75434037e-03 2.66395858e-03 -3.56595358e-03 3.45569383e-03 7.74049331e-05 -4.75325016e-03 2.77677947e-03 4.72891657e-03 4.84010158e-03 -3.66149331e-03 4.75656940e-03 4.60036146e-03 -9.08899878e-04 1.58582255e-03 4.38438402e-03 -2.34695361e-03 2.57047988e-03 4.19473829e-04 4.52254852e-03 -4.29722527e-03 -1.76773279e-03 -9.50096699e-04 -1.84802583e-03 1.88604766e-03 1.21229456e-03 -5.94382407e-04] ベクトル長 0.0290732863264
である。 ⇒⇒ つづきは ノート/テキストマイニング/Doc2Vecを試す・その2
もう少し、