ノート/テキストマイニング/Doc2Vecを試すでは、文(ドキュメント)に対応する ベクトルがなんとなく変だ。
他の人の例は?
英文を取った例でも、名詞のみを使っているようだ。
想像できることは、名詞以外、特に付属語(独立語でない語)を含めると、その文の内容が かなり薄まるだろうことである。名詞のみがいいのか、独立語(たとえば名詞・動詞・形容詞・ 形容動詞?)がいいのか、やってみないとわからない。
ただし、名詞のみにした場合、たとえばnotが消されたりするわけで、同じような分野でありながら、言っていることが真逆になる、という可能性もあるだろう。つまり、「似ている」を取り出すのに、何の意味で似ているのか、ということが問題になるだろう。
でも、何でもいいから、もう少し意味のある結果を出さないと、議論にならない。だから、名詞のみとか独立語のみをやってみよう。
https://www.codatlas.com/github.com/piskvorky/gensim/develop/
最近はいろいろな追加辞書ができているようだ。
それと、ちょっとした知識
実際使う時に
for i in range(140): # ツイートなのでMAX140文字 if node.surface != "": # ヘッダとフッタを除外 word_type = node.feature.split(",")[0] if word_type in ["名詞", "形容詞", "動詞"]: plain_word = node.feature.split(",")[6] if plain_word !="*": result_dict[word_type.decode('utf-8')].append(plain_word.decode('utf-8')) node = node.nextとか
for line in sys.stdin: node = mecab.parseToNode(line) node = node.next while node: if node.feature.startswith("名詞,"): if not node.surface.isdigit(): counter[node.surface] = counter.get(node.surface, 0) + 1 node = node.nextとか。
途中でrubyを使いたいので、rubyをインストール。 ⇒ CentOS に Ruby をインストールする - kzy52's blog
このとおりにやって、できた。
$ mecab 人工無能 人工 名詞,一般,*,*,*,*,人工,ジンコウ,ジンコー 無能 名詞,一般,*,*,*,*,無能,ムノウ,ムノー EOS $ mecab -u onomasticon.dic 人工無能 人工無能 名詞,一般,*,*,*,*,人工無能,*,* EOS
使うには、
#!/usr/bin/env python # -*- coding: utf-8 -*- # MeCabの使い方テスト import sys, os import string, codecs import MeCab sys.stdout = codecs.getwriter('utf_8')(sys.stdout) s = u"すもももももももものうち。クラウドは広く使われている技術である。" ''' tagger = MeCab.Tagger('-Ochasen -u /usr/local/lib/mecab/dic/wikihatena.dic') t = tagger.parse(s.encode('utf-8')) print t.decode('utf-8') ''' #tagger = MeCab.Tagger('-Ochasen') tagger = MeCab.Tagger('-Ochasen -u /usr/local/lib/mecab/dic/wikihatena.dic') tagger.parse('') # こっそりと必要らしい node = tagger.parseToNode(s.encode('utf-8')) while node: print (node.surface.decode('utf-8')), '\t', print (node.feature.decode('utf-8')) node = node.next
出力は
BOS/EOS,*,*,*,*,*,*,*,* すもももももも 名詞,一般,*,*,*,*,すもももももも,*,* もも 名詞,一般,*,*,*,*,もも,モモ,モモ の 助詞,連体化,*,*,*,*,の,ノ,ノ うち 名詞,非自立,副詞可能,*,*,*,うち,ウチ,ウチ 。 記号,句点,*,*,*,*,。,。,。 クラウド 名詞,一般,*,*,*,*,クラウド,*,* <-- クラウドが1語なのは追加辞書のおかげ は 助詞,係助詞,*,*,*,*,は,ハ,ワ 広く 形容詞,自立,*,*,形容詞・アウオ段,連用テ接続,広い,ヒロク,ヒロク 使わ 動詞,自立,*,*,五段・ワ行促音便,未然形,使う,ツカワ,ツカワ れ 動詞,接尾,*,*,一段,連用形,れる,レ,レ て 助詞,接続助詞,*,*,*,*,て,テ,テ いる 動詞,非自立,*,*,一段,基本形,いる,イル,イル 技術 名詞,一般,*,*,*,*,技術,ギジュツ,ギジュツ で 助動詞,*,*,*,特殊・ダ,連用形,だ,デ,デ ある 助動詞,*,*,*,五段・ラ行アル,基本形,ある,アル,アル 。 記号,句点,*,*,*,*,。,。,。 BOS/EOS,*,*,*,*,*,*,*,*
今までの蓄積を考えて、日本語Wikipediaのデータを使わせてもらう。下記のようなフィルタをかけて、分かち書きコーパス(名詞・動詞等のみ)にする。文(読点区切り)を単位にドキュメントとする。(コーパス上では1行にし、読込む時にline-to-docする)
Wikipediaのタグは基本的に外す。また、見出し等の、文になっていない行は、行ごと取り除くことにする。doc2vecの内部で短い文は取り除いているはずだが、前処理でも一応手当。
カッコ内も取り除いてしまう。
およそ次のようなプログラムで前処理する。
#!/usr/bin/env python # -*- coding: utf-8 -*- # wiki2linedoc.py version-2 Only Nouns, Verbs, Adjectives, Adverbs, on one line. Words are splitted by a whitespace, just like wakati. # import sys, os, codecs import string, re import gensim import MeCab sys.stdout = codecs.getwriter('utf_8')(sys.stdout) ''' ../wp2txt/wp2wakati.txtをきれいにすることのいくつかは不要になった 2016-03-03 この場合、Wikiの記法による記号等のクレンジングのいくつかは不要になる。 しかし、tplであるとか、[[見出し]]など文にならないものは取り除いた方が良い。名詞 の見出し語などが残る可能性があるからである。 1)タイトル([―――])は文になっていないので、消す。 2)CATEGORIES : ―――――― も消す 3)段落タイトル == ――――― == も消す 4)カッコに囲まれている部分を消す たとえば( 1 )とか ([ tpl ] lang | en | ampersand [/ tpl ], &) 形態素解析を噛ませて、その結果が名詞・形容詞・動詞・副詞以外なら取り除けばよい。 最後に、1単語しか無い文は、消す。 ''' pat_tpls = re.compile(r'\[ tpl \].*?\[/ tpl \]') pat_eqeq = re.compile(r'\=\=.*?\=\=') pat_eqeqeq = re.compile(r'\=\=\=.*?\=\=\=') pat_parens = re.compile(r'\(.*?\)') pat_paren2s = re.compile(u'(.*?)') pat_sqbrackets = re.compile(r'\[.*?\]') pat_tables= re.compile(r'\|.*?\|') def onlyKanji(s): #Returns True if string s contains only Kanji, False if not. kanji = True for c in s: if not (((ord(c)&0xff00) == 0x3000) or (0x4e00 <= (ord(c)&0xff00) <=0x9f00)) : kanji = False break return kanji def stripline(text): #strips = unicode(s).strip() strips = text.strip() strips = re.sub(pat_tpls, '', strips) strips = re.sub(pat_parens, '', strips) strips = re.sub(pat_paren2s, '', strips) strips = re.sub(pat_sqbrackets, '', strips) strips = re.sub(pat_tables, '', strips) strips = re.sub(pat_eqeq, '', strips) strips = re.sub(pat_eqeqeq, '', strips) return strips def mecab_analysis(sentence): tagger = MeCab.Tagger('-Ochasen -u /usr/local/lib/mecab/dic/wikihatena.dic') output = [] s= sentence.replace('\n', ' ').encode('utf-8') node = tagger.parseToNode(s) while node: if node.surface != "": # BOS/EOSを除外 ftlist = (node.feature.decode('utf-8')).split(',') if ((ftlist[0]==u"名詞" and (ftlist[1]==u"一般" or ftlist[1]==u"サ変接続" or ftlist[1]==u"固有名詞")) or (ftlist[0]==u"動詞" and ftlist[1]==u"自立") or ftlist[0]==u"形容詞" or ftlist[0]==u"形容動詞") : if ftlist[6]!='*': o = ftlist[6] else: # '*'が出てきたときは原型が登録されていないのでfeatureを入れ る o = node.surface.decode('utf-8') #print o.isalpha(), onlyKanji(o), o if (o.isalpha()) and ( onlyKanji(o) ): # もし文字列oが記号や半角数字 を含むときは出力しない output.append(o) node = node.next return output dirname = "/home/yamanouc/src/gensim/wp2txt" #fn = "wp2txt100.txt" fn = "wp2txtall.txt" fnbody = os.path.splitext(fn)[0] foutname = fnbody+'.noun' print os.path.join(dirname, fn) out = [] text = open(os.path.join(dirname, fn)).readlines() for l in text: for ll in l.split(u"。"): if ll.decode('utf-8').startswith("CATEGORIES"): continue x = mecab_analysis(stripline(ll)) if x: # if x is not empty ''' for u in x: print (u), print ''' out.append(x) fout = open(foutname, "w") for u in out: for v in u: fout.write(v+' ') fout.write('\n') fout.close()
出力例
アンパサンド 意味 する 記号 英語 相当 する ラテン語 合 字 記述 する ある フォント 表示 する 合 字 わかる 使用 世紀 遡る できる 世紀 中葉 現代 至る 変遷 わかる 続く ラテン文字 アルファベット する ある 記号 アンパサンド ラテン語 自身 表す くる 日常 手書き 欧米 アンパサンド 縦 引く する 使う ある 輪 重ねる 無声歯茎側面摩擦音 示す 発音記号 使う ある プログラミング言語 言語 演算 用いる
できていないこと: 名詞の接続が可能だと思うのだが、未だ処理していない。従って、
日常 名詞,一般,*,*,*,*,日常,ニチジョウ,ニチジョー 的 名詞,接尾,形容動詞語幹,*,*,*,的,テキ,テキ な 助動詞,*,*,*,特殊・ダ,体言接続,だ,ナ,ナ 習慣 名詞,一般,*,*,*,*,習慣,シュウカン,シューカン
の「日常的」は、結合した方が多分よいのだが、まだできていない。やり方としては、「的」が名詞で接尾と解析されているのだから、それを直前の名詞「日常」と結合すればよいはずである。面倒なのは、「日常」の段階で次の「的」を見て、接続だったら結合するという処理をかんがえること。
コーパス外の文の入力に対しても、コーパス処理と同様に、名詞等のみにしてやらなければならない。その為の変更は、
d2vsimilar.py Enter docnumber (1..max): 8000 input 8000 イラク クウェート侵攻 名目 クウェート国 革命 政権 建てる する 仮リン ク 要請 ある する 背景 石油 摩擦 ある (34216446, 0.758891761302948) 34216446 0.758891761303 イラク クウェート侵攻 名目 石油 (26064777, 0.5703217387199402) 26064777 0.57032173872 世界クラブ選手権 (28303845, 0.564146101474762) 28303845 0.564146101475 黒 鷲 旗 全日本 選抜
Enter document: 特に生物化学あるいは栄養学において、狭義には脂質の過酸化反応を抑制する物質を指し、広義にはさらに生体の酸化ストレスあるいは食品の変質の原因となる活性酸素種(酸素フリーラジカル、ヒドロキシルラジカル、スーパーオキシドアニオン、過酸化水素等)を捕捉することによって無害化する反応に寄与する物質を含む。 生物化学 栄養 狭義 脂質 酸化反応 抑制 する 物質 指す 広義 生体 酸化ストレス 食品 変質 原因 なる 活性酸素種 酸素 フリーラジカル ヒドロキシルラジカル スーパーオキシドアニオン 過酸化水素 捕捉 する する 反応 寄与 する 物質 含む (13944001, 0.6220544576644897) 13944001 0.622054457664 * 青森山田 1 - 0 秋田商 (16109636, 0.621261715888977) 16109636 0.621261715889 *智弁学園 12 - 2 尽誠学園 (14177676, 0.6203393936157227) 14177676 0.620339393616 * 山陽 0 - 5 前橋育英
Enter document: 機長は離陸前のタクシングを始める寸前に、提出済みの羽田空港から伊豆大島経由で香港に向かう計器飛行方式(IFR)によるコースではなく、富士山上空へ直行する有視界飛行方式(VFR)を要求し受理されていた
機長 離陸 タクシング 始める 寸前 提出 羽田空港 伊豆大島 経由 香港 向かう 計器飛行方式 コース 富士山 上空 直行 する 有視界飛行方式 要求 する 受理 する
(11221930, 0.6701182126998901) 11221930 0.6701182127 なお滑走路脇にはこの前日に濃霧のなか着陸に失敗して大破・炎上したカナダ太平洋航空のダグラスDC-8の残骸が散乱していた (24359090, 0.565266489982605) 24359090 0.565266489983 横浜市生まれ (20720333, 0.5627589225769043) 20720333 0.562758922577 これはI-94Wの情報は米国国勢調査局および米国商務省によっても使用されるが、国土安全保障省のオンラインシステムはテロリストや搭乗禁止リストおよびデータベースに掲載されている拒否対象者の入国に備えたVWP参加国渡航者の確認だけを目的に設計されているからであるArrival-Departure Record, CBP Form I-94W, for Visa Waiver Program Applicants 米国国土安全保障省・税関国境警備局、2008年2月25日
Enter document: 浅草神社は明治に入るまでは浅草寺と一体であり、この時代には浅草寺の祭りとして行なわれていた。神仏分離によって浅草寺と分離してからは浅草神社単体での祭りとなり発展したが、これは明治に入って以降のことである。 浅草神社 明治 入る 浅草寺 一体 時代 浅草寺 祭り 行なう 神仏分離 浅草寺 分離 する 浅草神社 単体 祭り なる 発展 する 明治 入る (11546009, 0.6925443410873413) 11546009 0.692544341087 *大道具:豊田哲夫 (25996963, 0.6834409832954407) 25996963 0.683440983295 *装飾:篠原直樹 (11274715, 0.6818701028823853) 11274715 0.681870102882 浅草神社は明治に入るまでは浅草寺と一体であり、この時代には浅草寺の祭りとして行なわれていた
上記で見られるように、長い分の場合は何となく似ているようにも思えるが、短い文の場合はほとんど類似度が意味がない。そこで、「。」までで切るのを止めて、複数の文から成るパラグラフ(空行を挟むか、タイトル等の独立した行)を単位にする。更に1語のみのような短いパラグラフを除外し、最低でも5語以上のパラグラフのみを取り上げることにする。
まず、wiki2linedoc.pyを改造して、wiki2paragraph.pyを作った
#!/usr/bin/env python # -*- coding: utf-8 -*- # wiki2paragraph.py Not sentences, but paragraphs. Only Nouns, Verbs, Adjectives, Adverbs, on one line. Words are splitted by a whitespace, just like wakati. # import sys, os, codecs import string, re import gensim import MeCab sys.stdout = codecs.getwriter('utf_8')(sys.stdout) ''' ../wp2txt/wp2wakati.txtをきれいにすることのいくつかは不要になった 2016-03-03 この場合、Wikiの記法による記号等のクレンジングのいくつかは不要になる。 しかし、tplであるとか、[[見出し]]など文にならないものは取り除いた方が良い。名詞 の見出し語などが残る可能性があるからである。 1)タイトル([―――])は文になっていないので、消す。 2)CATEGORIES : ―――――― も消す 3)段落タイトル == ――――― == も消す 4)カッコに囲まれている部分を消す たとえば( 1 )とか ([ tpl ] lang | en | ampersand [/ tpl ], &) 形態素解析を噛ませて、その結果が名詞・形容詞・動詞・副詞以外なら取り除けばよい。 最後に、1単語しか無い文は、消す。 ''' pat_tpls = re.compile(r'\[ tpl \].*?\[/ tpl \]') pat_eqeq = re.compile(r'\=\=.*?\=\=') pat_eqeqeq = re.compile(r'\=\=\=.*?\=\=\=') pat_parens = re.compile(r'\(.*?\)') pat_paren2s = re.compile(u'(.*?)') pat_sqbrackets = re.compile(r'\[.*?\]') pat_tables= re.compile(r'\|.*?\|') def onlyKanji(s): #Returns True if string s contains only Kanji, False if not. kanji = True for c in s: if not (((ord(c)&0xff00) == 0x3000) or (0x4e00 <= (ord(c)&0xff00) <=0x9f00)) : kanji = False break return kanji def stripline(text): #strips = unicode(s).strip() strips = text.strip() strips = re.sub(pat_tpls, '', strips) strips = re.sub(pat_parens, '', strips) strips = re.sub(pat_paren2s, '', strips) strips = re.sub(pat_sqbrackets, '', strips) strips = re.sub(pat_tables, '', strips) strips = re.sub(pat_eqeq, '', strips) strips = re.sub(pat_eqeqeq, '', strips) return strips def mecab_analysis(sentence): tagger = MeCab.Tagger('-Ochasen -u /usr/local/lib/mecab/dic/wikihatena.dic') output = [] s= sentence.replace('\n', ' ').encode('utf-8') node = tagger.parseToNode(s) while node: if node.surface != "": # BOS/EOSを除外 ftlist = (node.feature.decode('utf-8')).split(',') if ((ftlist[0]==u"名詞" and (ftlist[1]==u"一般" or ftlist[1]==u"サ変接続" or ftlist[1]==u"固有名詞")) or (ftlist[0]==u"動詞" and ftlist[1]==u"自立") or ftlist[0]==u"形容詞" or ftlist[0]==u"形容動詞") : if ftlist[6]!='*': o = ftlist[6] else: # '*'が出てきたときは原型が登録されていないのでfeatureを入れ る o = node.surface.decode('utf-8') #print o.isalpha(), onlyKanji(o), o if (o.isalpha()) and ( onlyKanji(o) ): # もし文字列oが記号や半角数字 を含むときは出力しない output.append(o) node = node.next return output dirname = "/home/yamanouc/src/gensim/wp2txt" #fn = "wp2txt100.txt" fn = "wp2txtall.txt" fnbody = os.path.splitext(fn)[0] foutname = fnbody+'.para' ftxtname = fnbody+'paraout.txt' print os.path.join(dirname, fn) out = [] outtxt = [] c = 0 text = open(os.path.join(dirname, fn)).readlines() for l in text: c = c + 1 if (c%10000)==0: print c sys.stdout.flush() if "CATEGORIES" in l.decode('utf-8'): continue # skip this line x = mecab_analysis(stripline(l)) #if (len(x) >= 2): # if x is not empty if (len(x) >= 5): # if x contains more than 5 words outtxt.append(stripline(l)) ''' for u in x: print (u), print ''' out.append(x) fout = open(foutname, "w") for u in out: for v in u: fout.write(v+' ') fout.write('\n') fout.close() ftext = open(ftxtname, "w") for u in outtxt: ftext.write(u) ftext.write('\n') ftext.close()
できたファイルのイメージは
アンパサンド とは「…と…」を意味する記号である。英語の lang"and" に相当するラ テン語の lang"et" の合字で、lang"etc." を lang"&c." と記述することがあるのはそのため。Trebuchet MSフォントでは、10pxと表示され "et" の合字であることが容易にわかる。 その使用は1世紀に遡ることができ 、5世紀中葉 から現代 に至るまでの変遷がわかる。 Z に続くラテン文字アルファベットの27字目とされた時期もある。 記号名の「アンパサンド」は、ラテン語の「& はそれ自身 "and" を表す」lang からきている。 日常的な手書きの場合、欧米でアンパサンドは「ε」に縦線を引く単純化されたものが使われることがある。 また同様に、「t」または「+(プラス)」に輪を重ねたような、無声歯茎側面摩擦音を示す発音記号「IPA|?」のようなものが使われることもある。 プログラミング言語では、C など多数の言語で AND 演算子として用いられる。以下は Cの例。 * X = A && B のように2個重ねたものは論理 AND を表す。この場合 A, B がともに真ならば X も真、それ以外は偽である。 * 0x12345678 & 0x0f0f0f0f のように1個であればビット AND を表す。この場合の結果は 0x02040608 である。 BASIC 系列の言語では文字列の連結演算子として使用される。"foo" & "bar" は "foobar" を返す。また、主にマイクロソフト系では整数の十六進表記に &h を用い、&h0F (十進で15)のように表現する。
ここから重要語(名詞その他)を抽出したでーたは、つぎのようになる
アンパサンド 意味 する 記号 英語 相当 する ラテン語 合 字 記述 する ある フォン ト 表示 する 合 字 わかる 使用 世紀 遡る できる 世紀 中葉 現代 至る 変遷 わかる 続く ラテン文字 アルファベット する ある 記号 アンパサンド ラテン語 自身 表す くる 日常 手書き 欧米 アンパサンド 縦 引く する 使う ある プラス 輪 重ねる 無声歯茎側面摩擦音 示す 発音記号 使う ある プログラミング言語 言語 演算 用いる 例 重ねる 論理 表す 真 真 偽 ビット 表す 系列 言語 文字 列 連結 演算 使用 する 返す マイクロソフト 整数 表記 用いる 表現 する
これを入力として、doc2vecに学習させる。
#!/usr/bin/env python # -*- coding: utf-8 -*- # d2v-learn import sys, os import string, codecs import logging import gensim sys.stdout = codecs.getwriter('utf_8')(sys.stdout) #inputfile = 'wikiline100.txt' #inputfile = 'wikiline.txt' #inputfile = 'wp2txtall.noun' inputfile = 'wp2txtall.para' (fn, ext) = os.path.splitext(inputfile) modelfile = fn + '.mdl' print modelfile logging.basicConfig(format='%(levelname)s:%(message)s', filename=fn +'.log', filemode='w', level=logging.INFO) logging.info("running %s" % ' '.join(sys.argv)) # まずPlainLineDocumentフォーマットからTaggedLineDocumentフォーマットに変換 docsrc = gensim.models.doc2vec.TaggedLineDocument(inputfile) # 次に、トレーニング m = gensim.models.doc2vec.Doc2Vec(docsrc, size=100, window=8, min_count=2, workers=32) # モデルmをセーブする m.save(modelfile) logging.info("finished. Saved = mymodel.mdl")
コーパス内類似パラグラフ表示は、d2vsimilar.pyによる
#!/usr/bin/env python # -*- coding: utf-8 -*- # d2v-similar # モデルを読み込んで、キー入力した文にsimilarな文を探す import sys, os import string, codecs, math import logging import gensim sys.stdout = codecs.getwriter('utf_8')(sys.stdout) fn = 'wp2txtall' modelfile = fn + '.mdl ' textfile = fn + 'paraout.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(modelfile + " loaded") # テキストファイルもロード tx = open(textfile, 'r').readlines() ln = len(tx) logging.info(textfile + " 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 continue ''' mv = m.docvecs[snum] print mv s = 0.0 for p in range(len(mv)): s = s + mv[p]*mv[p] print "ベクトル長", math.sqrt(s) ''' 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
コーパス内類似パラグラフの表示の実行結果は以下のようになった。大分「それらしい」(主題・話題が似ているというレベルの)類似性が見えるように思う。この類似性の評価は、どうやってよいかわからない。
例1
Enter docnumber (1..max): 3 input 3 Z に続くラテン文字アルファベットの27字目とされた時期もある。 (9076913, 0.5184535384178162) 9076913 0.518453538418 2009年に関しても様々言われた中、前述の通りドリームジャー ニー号の春秋グランプリ連覇に終わった。 そして実はこの日、西日本でも、関西テレビ放送など3社が18年余りにわたって制作・放送してきた中央競馬中継『DREAM競馬』の放送が終わり、 これとともに長く競馬中継に携わってきた杉本清と大坪元雄が競馬界でいうところの“70歳定年”により勇退した。 なおフジテレビでもほしのあきがフジ社内の“定期人事”、自らの問題などからこの日限りで『みんなのケイバ』を降板している。 (3253815, 0.5151615142822266) 3253815 0.515161514282 : 統和機構の合成人間。高速移動の能力を持つ。スケアクロウ に対して淡い恋心を抱いており、彼を殺害したモ・マーダーを憎んでいた。 そこを来生真希子につけ込まれ、来生を狙ったモ・マーダーの攻撃を引き受けるための壁として利用され死亡した。 普段は女子高生の姿をしていた。合成人間としての能力は恐らく高速移動、もしくは人の死角をつく能力と思われる。 (2946379, 0.5051189661026001) 2946379 0.505118966103 モチーフは前述の通り豚であるが、スタジオジブリが製作したCM用アニメーションの一つに、なんだろうが回転する途中で正面を向き、 ピンク色の大き な鼻を見せるものがあった。これは明らかに豚にしか見えないため、日本テレビ側がNGを出し、実際にCMで使用されることはなかった。 ただし、そのバージョンを含めた数パターンがDVD「ジブリがいっぱいSPECIAL ショートショート」に収録されている。
入力の文3が短いので、あまり特徴が出ないのに加え、類似度も最大のものが0.52程度であり、人間が見ても類似性が高くない。
例2
Enter docnumber (1..max): 6 input 6 また同様に、「t」または「+(プラス)」に輪を重ねたような、無声歯茎側面摩擦音を示す発音記号「IPA|?」のようなものが使われることもある。 (10998142, 0.5679857134819031) 10998142 0.567985713482 外場H′が次のように表現できるとする。 (6176553, 0.5626165866851807) 6176553 0.562616586685 端的に言うと、int型あるいはunsigned int型を使用できる式の中では、char,short,int,intビットフィールドの符号付き符号無しにかかわらず、 それらをint型で元の型の全ての値を表現できるならばint型に、それ以外はunsigned int型に変換するということである。 (5145247, 0.5555276870727539) 5145247 0.555527687073 条件演算子(en|conditional operator)は、プログラミング言語の演算子で、条件文と同様な意味があるが、文ではなく値を持つ式になる。 評価されると、条件式の値により異なる式が評価され、異なる値になる。
入力に「t」のような記号、「プラス」のような語が含まれるために、それに似ているものを探した感じがある。尚、類似度は第一位が0.568と、例1よりは高い。
例3
Enter docnumber (1..max): 55555 input 55555 :以降、記述の煩雑化を避けるため、正式名称「シンセサイザー」を適宜「 シンセ」と略記する。 (5429841, 0.5535159111022949) 5429841 0.553515911102 *トム(Tom 、1985年発売) - ドラムマシン。別売りのROMカ セットで音色の変更が可能。音色のリバース機能もある。 MIDI対応しているが、PHONE端 子でクロックを入れる必要がある。 (8376488, 0.5180567502975464) 8376488 0.518056750298 カーマックはルイジアナ州ShreveportのSoftdiskに雇用されて 、Softdisk G-S(Apple IIGSユーザのためのディスク付き雑誌)を作る仕事を することになった。そこでJohn Romero、Adrian Carmack(親類関係ではない)などのid Softwareの主要メンバーと出会った。 IBM PC(MS-DOS)向けの隔月刊のゲーム購読型プロダクトGamer's Edgeの仕事がチームにアサインされたが、このプロダクトは短命に終わった。 Softdisk在籍中の1990年に、CamackとRomeroたちは、Commander Keenを作成した。このシリーズはApogee Softwareから発売され、 1991年からはシェアウェアとして配布された。その後CarmackはSoftdiskを離れて、id Softwareを共同で設立、現在も在籍している。 (465678, 0.5151117444038391) 465678 0.515111744404 ** 米テキサス・インスツルメンツ のLSI「TMS-0105」を採用した電卓が登場した。 TMS-0105は、4ビットMPUとメモリであるRAMやプログラムを格納するROMをワンチップ化した製品であるTMS1000シリーズに電卓用のプログラムを搭載したもの で、 組み込みマイコンの祖先にあたる。キー入力処理から演算、表示制御までを1つのLSIでこなせる製品だった。 このため、ちょっとした製造技術があれば、キーと表示装置と電源をつけることで簡単に自作の電卓が作ることができるようになった。 ちょうど、自作パソコンを作るのと似たような感覚である。このLSIの登場で、電卓の組み立てと販売だけ を手がけるメーカーが乱立し、 電卓の価格は一気に半減し、電卓市場の価格破壊が進んだ。当時、立石電機(現在のオムロン)が5万円を下回る電卓を発売し「オムロンショック 」と 呼ばれた、という記述も見られる。
この例では、入力がシンセサイザーに関するもので、類似としてドラムマシン、初期のPC、電卓といった近い話題のパラグラフが選ばれている。類似度は0.55〜0.52とそれほど高くはない。
例4
Enter docnumber (1..max): 66666 input 66666 排気量では4ストロークが優遇された一方で、燃料タンク容量は2ストロークが32L、4ストロークが24Lと4ストロークの燃料タンク容量は大きく制限された。 (8608422, 0.5080378651618958) 8608422 0.508037865162 第6戦カナダGPでは、このレースでF1参戦200戦を迎えたアンド レア・デ・チェザリスを祝うスペシャルカラーリングで出走した。 (6964518, 0.5039354562759399) 6964518 0.503935456276 本田技研工業陣営は、2007年と同様にNSXを使用するが、2007年の他車との競争力から特別性能調整が行われ、 最低車重が開幕戦より1,150kgとされたが 、第3戦以降は1,140kgとなった。 (8567585, 0.4947466254234314) 8567585 0.494746625423 また、参戦予定台数が、2009年の20台から26台までに増加した ことを受け、ポイントシステムの見直しが行われた cite newstitle =ポイントシステムに大幅変更 date = 2009-12-11| accessdate = 2009-12-12。従来では8位までが入賞であったが、10位までポイントが与えられることになる。
この例では、入力文の話題と同じ話題の類似文が選ばれている。類似度は0.51〜0.49とそれほど高くない。
コーパス外からのパラグラフデータに対して、類似のパラグラフをコーパス内で探索してみる。プログラムd2vinfer.pyは、
#!/usr/bin/env python # -*- coding: utf-8 -*- # d2v-infer # モデルを読み込んで、キー入力した文にsimilarな文を探す import sys, os import string, codecs, math import logging import MeCab import gensim sys.stdout = codecs.getwriter('utf_8')(sys.stdout) def onlyKanji(s): #Returns True if string s contains only Kanji, False if not. kanji = True for c in s: if not (((ord(c)&0xff00) == 0x3000) or (0x4e00 <= (ord(c)&0xff00) <=0x9f00)) : kanji = False break return kanji def mecab_analysis(sentence): # キーインした入力をdoc2vecの形に変換する # 旧版:分かち書きするだけで、単語リストにして返す # 新版:wiki2linedoc.pyのように主要語のみを抽出してリストにする # tagger = MeCab.Tagger("-Owakati") # res = tagger.parse(tinput).split(' ') tagger = MeCab.Tagger('-Ochasen -u /usr/local/lib/mecab/dic/wikihatena.dic') output = [] s= sentence.replace('\n', ' ').encode('utf-8') node = tagger.parseToNode(s) while node: if node.surface != "": # BOS/EOSを除外 ftlist = (node.feature.decode('utf-8')).split(',') if ((ftlist[0]==u"名詞" and (ftlist[1]==u"一般" or ftlist[1]==u"サ変接続" or ftlist[1]==u"固有名詞")) or (ftlist[0]==u"動詞" and ftlist[1]==u"自立") or ftlist[0]==u"形容詞" or ftlist[0]==u"形容動詞") : if ftlist[6]!='*': o = ftlist[6] else: # '*'が出てきたときは原型が登録されていないのでfeatureを入れ>る o = node.surface.decode('utf-8') #print o.isalpha(), onlyKanji(o), o if (o.isalpha()) and ( onlyKanji(o) ): # もし文字列oが記号や半角数字>を含むときは出力しない output.append(o) node = node.next return output fn = 'wp2txtall' #fn = 'wikiline-old/wikiline' #fn = 'wikiline' modelfile = fn + '.mdl' textfile = fn + 'paraout.txt' inputfile = 'input.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(modelfile + " loaded") # コーパステキストファイルもロード tx = open(textfile, 'r').readlines() ln = len(tx) logging.info(textfile + " loaded") while True: tinput = raw_input('Enter document: ') if tinput == 'q': quit() else: # 対象となる文を入力 res = mecab_analysis(tinput) #res = tagger.parse(tinput).split(' ') for p in res: print p, print x = m.infer_vector(res) ''' print x s = 0.0 for p in range(len(x)): s = s + x[p]*x[p] print "ベクトル長", math.sqrt(s) ''' sims = m.docvecs.most_similar([x], 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
例1
Enter document: 談話は、米韓演習が金正恩(キムジョンウン)第1書記の居所などへの攻撃訓練を含んでいるとされることに言及。 「侵略的性格を露骨にさらけ出した危険千万な戦争行為だ」と非難。「戦争が起きる場合、朝鮮半島だけに限らず、通常兵器による戦争にとどまらない」と警告した。 談話 米 韓 演習 金 正 恩 キムジョンウン 書記 居所 攻撃 訓練 含む する 言及 侵略 性格 さらけ出す 戦争 行為 非難 戦争 起きる 朝鮮半島 限る 通常兵器 戦争 とどまる 警告 する (5540606, 0.5615129470825195) 5540606 0.561512947083 竹松駐屯地(たけまつちゅうとんち、JGSDF Camp Takematsu) とは、長崎県大村市富の原1丁目1000に所在し、 第7高射特科群等が駐屯する陸上自衛隊の駐屯地である。海上自衛隊大村航空基地が南側に隣接している。 (1058680, 0.5552001595497131) 1058680 0.55520015955 1995年には阪神・淡路大震災が発生した。この際、政府の立ち上がりが遅れた教訓から1996年(平成8年)5月11日に 内閣情報調査室組織規則(以下「規則」という)の一部改正により、内部体制に内閣情報集約センターが加えられた。 また、阪神大震災をきっかけに官邸が自衛隊機を飛ばすなどして積極的に情報収集を行ったり、民間との協力体制の確立、マスコミへの情報発信など 官邸の情報収集体制や危機管理体制の改革が行われた大森(2005):47-48ページ。 (7442846, 0.5487792491912842) 7442846 0.548779249191 *中川善之助と共著『相続法』(法律学全集24)(有斐閣、初版1964年・第四版2000年)
これは、コーパス外のパラグラフとしてニュース記事から選んだものであるが、軍事的な危機について述べているのに対し、類似文1は自衛隊関連の記述、2では(地震の)危機対応に関する記述(自衛隊へも触れている)、3はおよそ関係なさそうである。類似度は0.56〜0.55程度。
例2
Enter document: 参加者の多くが「なぜこの会社?」と思ったのがセーレンだ。福井県に本社があり、2005年に産業再生機構傘下で再建を進めた 旧カネボウから合繊事業を買収した。繊維産業が衰退する中でも業績は好調。シート用の素材も作り自動車部品メーカーの顔も持つ。 参加 会社 思う セーレン 福井 本社 ある 産業再生機構 傘下 再建 進める カネボウ 合繊 事業 買収 する 繊維産業 衰退 する 業績 シート 素材 作る 自動車 部品 メーカー 顔 持つ (6713298, 0.6099131107330322) 6713298 0.609913110733 *2006年06月 100%子会社であった株式会社DMESを吸収合併。純 粋持株会社から事業持株会社へ移行。 (2897297, 0.6025503277778625) 2897297 0.602550327778 アムステルダム大学で学び、1913年フローニンゲン大学(State University of Groningen)の助手になり、 1920年から1958年まで同大学の教授である。1930年に反射回折格子を使った実験で光の位相位置が観測できることを発見し それを応用した位相差顕微鏡を1936年に完成した。位相差顕微鏡は屈折率の部分的な違いを観察でき透明な試料、 生きたままの微生物や医学の分野に多くつかわれるようになった。 (10202391, 0.5961201786994934) 10202391 0.596120178699 *秋田城介=秋田城主兼出羽介の事。鎌倉時代は安達氏の事、 織田政権の時は織田信忠、 豊臣政権や江戸時代は秋田氏(秋田郡を領する安東氏が秋田城介と領地名に因んで改名)を指す。
この例では、経済(シャープの再建問題)を話題にしているが、類似文1は会社の合併、2は位相差顕微鏡、3は秋田城主が話題であり、いずれも類似度が0.61〜0.60程度で高い。つまり、システムは類似性が高いと判定しているが、我々にとってあまり類似性が見いだせないように思う。
例3
Enter document: 男子テニスの国別対抗戦、デ杯ワールドグループ(WG)1回戦、日本―英国最終日は6日、英国のバーミンガムでシングルスが行われ、 日本は世界ランキング6位の錦織圭(日清食品)が同2位のアンディ・マリーに5―7、6―7、6―3、6―4、3―6で競り負けて 通算1勝3敗となり、ベスト8進出を逃した。日本はWG残留が懸かる9月の入れ替え戦に回る。 男子 テニス 国 対抗 デ杯 ワールド グループ 日本 英国 最終 英国 バーミンガム シングルス 行う 日本 世界ランキング 錦織 圭 日清食品 競り 負ける 通算 なる ベスト 進出 逃す 日本 残留 懸かる 入れ替え戦 回る (6585907, 0.630174994468689) 6585907 0.630174994469 * 津田沼駅北口、南口(習志野市、船橋市) (9640897, 0.6085732579231262) 9640897 0.608573257923 * 16日 - 日本で開催された第10回ワールドカップ女子大会でイタリアが初優勝Cite webtitle=FIVB Women's World Cup 2007: gold medal for Italy. Italy, Brazil and U.S.A. qualified for Beijing Olympic Gamesdate=2007-11-16|accessdate=2010-08-29。日本は7位。 (9151204, 0.5833715200424194) 9151204 0.583371520042 *『日本と世界の愛犬図鑑2009』(辰巳出版)藤原尚太郎編・著
コーパス外の入力文はテニスの試合結果に関するものである。類似文1はそれ自身が非常に短く、何を記述したものか分からない。2はワールドカップであり、スポーツの試合であることは類似する。3は愛犬図鑑という本のタイトルのようで、何が類似するのか分からない。いずれも類似度は0.63〜0.58と高く、例2と同様に、よく分からない例である。
例4
Enter document: Snapdragonは、ARMアーキテクチャのCPUをベースとし、電力制御や各種センサー、通信機能などの周辺機器を統合した SoC(System-on-Chip)製品のシリーズ名 で、クアルコムが開発している。MSM8xxxは、Snapdragonの製品型番で、 下から3桁目が「2」はHSPA+対応、「6」はCDMA対応、「9」は4G LTE対応といった具合に、サポートする通信モデムによって番号が振られている。 ベース する 電力 制御 各種 センサー 通信 機能 周辺機器 統合 する 製品 シリーズ クアルコム 開発 する 製品 型番 下 対応 対応 対応 具合 サポート する 通信 モデム 番号 振る (2843739, 0.4990840256214142) 2843739 0.499084025621 * 鳥取県道21号鳥取鹿野倉吉線(鳥取市気高町下光元・上光交 差点) (7912720, 0.4984329342842102) 7912720 0.498432934284 Windows 9x系には、MS-DOS時代の周辺機器・アプリケーション との互換性のために「MS-DOSモード」が 搭載されている。これは、Windowsが使用するMS-DOSシステムを用いて、Windowsシステムを終了してMS-DOSそのもののみを起動するものである。 (8284497, 0.4859766960144043) 8284497 0.485976696014 :-q, クイックフォーマット。ログインしているユーザの名前と数だけを表示し、他のオプションは無効にする。usersコマンドと等価である。
コーパス外の入力文はCPUチップの記事である。類似文1は何が類似するのか分からない。2はWindowsの話題でコンピュータに関連する。3もコマンドの説明でありコンピュータに関連する。類似度は0.50〜0.49程度と、かなり低い。
例5 (コーパス内のパラグラフをコーパス外としてベクトル推定の上、類似抽出)
Enter document: SnapdragonのアーキテクチャはARM v7 命令セットに基づいている。ク アルコムは、Snapdragonをスマートフォン、 タブレット、スマートブックデバイス"プラ ットフォーム"と位置付けている。Snapdragonプラットフォームは、 一日のバッテリ動作 を可能とする低消費電力のリアルタイムユビキタスコンピューティングを狙って設計されている。 アーキテクチャ 命令セット 基づく クアルコム スマートフォン タブレット スマートブック デバイス プラットフォーム 位置付ける プラットフォーム バッテリ 動作 する 消費電力 リアルタイム ユビキタスコンピューティング 狙う 設計 する (3799064, 0.6359612941741943) 3799064 0.635961294174 1999年1月発売。ロジックボードはYosemite、筐体はEl Capitanという開発コードのシリーズ。 FireWireとUSB, ATA-4を搭載した最初のPower Macintosh 。ポリカーボネイトを外装に利用した、丸みをおびた半透明のデザイン。 ロジックボードの取り付けてある側面を簡単に展開することができる。そのため内部部品の盗難防止や、子どもがいたずらなどで開けないよう、 鍵が掛けられるようになっている。四隅にハンドルを配し、青緑色と半透明の乳白色のツートンカラーで、その形状と質感からポリタンクと呼ばれた。 これまでにないデザインながら冷却性能などは確実に向上しており、El Capitanが見掛けだけではないことがわかる。 この筐体は色や質感を変えながらPowerMac G4 でも採用されている。 (9812843, 0.6284807324409485) 9812843 0.628480732441 Snapdragon (スナップドラゴン)は、米・クアルコムによるモバイルSoCのシリーズである。CPUコアはクアルコムによる独自設計であり、 ARMのCortex-Aシリーズと同じ世代に相当する。 (5511042, 0.598574697971344) 5511042 0.598574697971 IEEE 1471は、公式にANSI/IEEE 1471-2000 「ソフトウエア集約システムのアーキテクチャ記述のための推奨指針」 として知られる標準の短縮名である。IEEE 用語で、これは、数あるIEEE標準の中でも最も少ない規範的標準の一つの「推奨 指針」 である。2007年、この標準は ISO/IEC JTC1/SC7 によって 仮リンクen|ISO/IEC 42010:2007 「システムとソフトウエア工学−−ソフトウエア集約システム のアーキテクチャ的記述のための推奨指針」 として採用されたISO/IEC 42010:2007, Systems and Software Engineering -- Architecture Description。
この例では、敢えてコーパスにあるままの文を入力として採り、コーパス外と同じ処理を行ったものである。入力文はプロセッサに関する記述で、類似文1、2、3ともコンピュータに関する記述になっている。具体的な内容は、2は入力文と非常に近い(スナップドラゴンに関する記述)だが、1はPower Macintoshの説明、3はソフト設計の推奨指針の説明であり、かなり異なる。類似度は、0.64, 0.63, 0.60と、かなり高い。
【更に、コーパス外の文書の長さを長くして見る。2つの長めのパラグラフを繋いで入力した例。】
例6
Enter document: 2016年3月3日(現地時間)、アップルの協業企業ら数十社は、FBIに対 する同社の立場を支持して法廷助言書を発表した。 まずグーグル、マイクロソフト、フェイスブックらが共同で、一方で、ツイッターやAirBnB、eBayらインターネット関連の著名企業らも、 これとは別の法廷助言書を提出した。アップルは、米サンバーナーディーノ銃乱射事件の犯人サイード・ファルクが所有していた iPhoneへのFBIの侵入を支援するソフ トウェアの作成を強制されるべきではない。そう主張する法廷助言書は、クパチーノにある同社の 訴訟事件への支援を意味する。インテルとAT&T(そう、NSAと秘密のスパイ協定 を結んでいるあのAT&Tだ)は、それぞれ単独で法廷助言書を 提出した(リンク先はPDF) 。ACLU、Access Now、Wickr財団、およびセキュリティー専門家のグループも同様に支持 を表明している。 現地 アップル 協業 企業 同社 立場 支持 する 法廷 助言 発表 する グーグル マイク ロソフト フェイスブック 共同 ツイッター インターネット 関連 企業 別 法廷 助言 提出 する アップル 米 サンバーナーディーノ銃乱射事件 犯人 サイード ファルク 所有 する 侵入 支援 する ソフトウェア 作成 強制 する 主張 する 法廷 助言 クパチーノ ある 同社 訴訟事件 支援 意味 する インテル 秘密 スパイ 協定 結ぶ 単独 法廷 助言 提出 する リンク 財団 セキュリティー 専門 グループ 支持 表明 する (10140494, 0.5298002362251282) 10140494 0.529800236225 ** THA:援助を表明。同国外務省は在日タイ人の安否確認などを行う対策本部を設置。プミポン国王夫妻は3月12日に、 「地震と津波で甚大な被害が出 たことを深く悲しんでいる。両陛下と全ての日本国民に心からの弔意を表す」と弔意を表する書簡を送った (6959335, 0.5249372720718384) 6959335 0.524937272072 ノックスはスコットランドに帰還し、スコットランド宗教改革 を導いた。彼は、スコットランドのプロテスタント貴族と 協力関係にあった。この宗教改革運動は、革命とも言い得る。 (5783147, 0.5064847469329834) 5783147 0.506484746933 日本共産党参議院議員の筆坂秀世は2回目の国会追求をする際に「共産党に国会で質問してもらいたい事柄に関する 外務省の秘密書類が、質問当日の朝、議員会館に届けられた」と証言しているCite bookauthor=鈴木宗男title=北方領土「特命交渉」 publisher=講談社language=日本語pages=199 。事実、佐々木代議士は、「国後島 緊急避難所兼宿泊施設」という外務省の秘密内部文書を質問に使用した。 さらにこの点については、鈴木本人や共に逮捕された佐藤優も、共著Cite bookauthor=鈴木宗男others= 筆坂秀世date=2007-06-15 location=東京isbn=4-7762-0435-5 の中で筆坂をゲストという形で招いて対談し、米国との同盟関係を強めていた小泉政権の下で、 ロシアとの独自のパイプを持って外交にイニシアティブを発揮していた鈴木を失脚させたい外務省が、鈴木の利権問題をとらえて、 日本共産党の質問に乗った疑惑があることに言及し、これを非難している。
コーパス外の入力文はIT関連の法廷に関わるやりとり(アップルのスマートホンロック解除の是非をめぐるFBIとの論争)であるが、類似文1と2は司法・法廷ともITとも関わらない。3は法廷と関わる点で共通項がある。類似度の指数は0.53〜0.51と低い。
例7
Enter document: IoTデータのマーケットプレースを展開する米エブリセンスは2016年3月2日、インフォコム、光電製作所、 ブロードバンドタワーの3社と共同で、IoT(Internet of Things)技術を用いて漁場や海洋の情報を収集・共有するシステムの 共同研究開発プ ロジェクトを始めると発表した。同プロジェクトではネットワーク対応分散型魚群探知機「EveryStampFF(Fish-Finder)」 を開発しているという。 エブリセンスによると、最 近の海洋関連事業分野では、効率よく漁場を確保したり、 海洋資源や環境を保護したりする目的から、魚群探知機による魚影・海底情報の他、水深、水質、水温、潮目、潮流、風向、風速、波高などの海洋環境情報を、 従来のような各海洋関連事業者が個別に取り扱うのではなく、多くの事業者でより広い地域の情報を共有することが求められているという データ マーケット プレース 展開 する 米 エブリセンス インフォコム 光 製作所 ブロードバンドタワー 共同 技術 用いる 漁場 海洋 情報 収集 共有 する システム 共同研 究 開発 プロジェクト 始める 発表 する プロジェクト ネットワーク 対応 分散 魚群探知機 開発 する いう エブリセンス よる 海洋 関連 事業 分野 効率 よい 漁場 確保 する 海洋資源 環境 保護 する する 目的 魚群探知機 魚 影 海底 情報 水深 水質 水温 潮目 潮流 風向 風速 波高 海洋 環境 情報 海洋 関連 事業 取り扱う 事業 広い 地域 情報 共有 する 求める (13020, 0.5602180361747742) 13020 0.560218036175 ウェブブラウザ(インターネットブラウザ、WWWブラウザ)とは World Wide Web の利用に供するブラウザであり、 ユーザエージェント である。具体的には、ウェブページを画面や印刷機に出力したり、ハイパーリンクをたどったりするなどの機能がある。 単にブラウザ(ブラウザー)と呼んだ場合、多くはウェブブラウザのことを指す。 (769009, 0.5554647445678711) 769009 0.555464744568 第二段階は、地理情報の管理段階である。第一段階で収集されたデータを業務分類することにより、 施設管理システム、カーナビゲーションシステム、オンライン地図等のシステムが実現される。この段階では、地理情報システムの 管理機能を利用でき、地理情報の流通も可能になり、業務の効率が向上し、サービスの質も改善される。 (8482408, 0.5315724015235901) 8482408 0.531572401524 **2012年6月27日 全体構想認定(認定第2号)※特定自然観光 資源の指定のある全体構想としては第1号
この例は、入力文が海洋関係の情報処理だが、類似文1は情報処理・ネット関連、2は知事情報の管理で、共通した話題を持つ程度には類似している。3は自然や観光資源というキーワードが共通する部分があるかも知れないが、話題としてはほとんど関連がない。類似度は0.56, 0.56, 0.53である。
やはりソースを読まなければならない???