ノート/テキストマイニング

gensimのdoc2vecで文のベクトル表現を作り、その空間を試してみたい (2016-02-22)

gensimのdoc2vecのために、Wikipediaソースを文ごとに分解する

「。」で切るだけでは足りない。

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

もう少し、


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2016-03-03 (木) 12:59:40 (537d)