Python: gensimでdoc2vecを実行する - Fuwafuwa's memorandum

Fuwafuwa's memorandum

Data analysis, development, reading, daily feeling.
MENU

Python: gensimでdoc2vecを実行する

gensimモジュールでdoc2vecを行います。

##https://gist.github.com/balajikvijayan/9f7ab00f9bfd0bf56b14
from gensim import models

sentence0 = models.doc2vec.LabeledSentence(
    words=[u'IT', u'企業', u'エンジニア', u'統計学', u'機械学習'], tags=["sent_0"])
sentence1 = models.doc2vec.LabeledSentence(
    words=[u'大学', u'科学', u'研究', u'解析', '統計学'], tags=["sent_1"])
sentence2 = models.doc2vec.LabeledSentence(
    words=[u'エンジニア', u'データベース', u'解析'], tags=["sent_2"])
sentence3 = models.doc2vec.LabeledSentence(
    words=[u'社会', u'科学', u'心理', u'プログラミング'], tags=["sent_3"])
sentence4 = models.doc2vec.LabeledSentence(
    words=[u'アプリ', u'開発', u'エンジニア', 'プログラミング'], tags=["sent_4"])

sentences = [sentence0, sentence1, sentence2, sentence3, sentence4]

class LabeledLineSentence(object):
    def __init__(self, filename):
        self.filename = filename
    def __iter__(self):
        for uid, line in enumerate(open(filename)):
            yield LabeledSentence(words=line.split(), labels=['sent_%s' % uid])
            
model = models.Doc2Vec(alpha=.025, min_alpha=.025, min_count=1)
model.build_vocab(sentences)

for epoch in range(10):
    model.train(sentences)
    model.alpha -= 0.002 
    model.min_alpha = model.alpha  

model.save("my_model.doc2vec")
model_loaded = models.Doc2Vec.load('my_model.doc2vec')
下記で実行。
print(model.docvecs.most_similar(["SENT_0"]))
結果は下記。
In [17]: print(model_loaded.docvecs.most_similar(["sent_1"]))
[('sent_3', 0.6345847249031067), ('sent_4', -0.2628158926963806), ('sent_0', -0.42180296778678894), ('sent_2', -0.42976364493370056)]
とっても便利!

朝日新聞の投稿欄から100記事を選んで類似した記事を探しました↓
1行ごとに1投稿が格納されたtxtファイルをmecabで分かち書きしたものです。
article = open("asa2007.txt")

articles = []
for x in article:
	articles.append(x)
	
article_list = []
for item in articles:
	itemlist = item.split(' ')
	article_list.append(itemlist)

class LabeledLineSentence(object):
    def __init__(self, filename):
        self.filename = filename
    def __iter__(self):
        for uid, line in enumerate(open(filename)):
            yield LabeledSentence(words=line.split(), labels=['sent_%s' % uid])

article_tag = []
count = 0
for item in article_list:
	model = models.doc2vec.LabeledSentence(words=item, tags=['sent_%s' % count])
	article_tag.append(model)
	count += 1

model = models.Doc2Vec(alpha=.025, min_alpha=.025, min_count=1)
model.build_vocab(article_tag[0:999])
 
for epoch in range(10):
    model.train(article_tag[0:999])
    model.alpha -= 0.002
    model.min_alpha = model.alpha  
 
model.save("my_model.doc2vec")
model_loaded = models.Doc2Vec.load('my_model.doc2vec')

print(model.docvecs.most_similar(['sent_0']))
下記の記事と類似した記事を探します。
外国から帰ってきてほっとするのは、蛇口からほとばしる水を手に受ける瞬間であり、
レストランで出されるコップの水を躊躇(ちゅうちょ)なく口に含む時だ。
安心して飲める水の恩恵をいつ、どこでも受けられる幸せこそ、日本の国のありがたさだ。
清潔な水が十分に供給されるということは、とりもなおさず豊かな水源があるから。
源をたどると、それは大河の流れでもダムが造られているからでもない。
川へ水を注いでいる山、それも落葉樹の茂った緑の山々のお陰だ。
天の恵みの雨を落ち葉まじりの土が受け止めてくれ、静かに木の根に浸透していく。
そして、途方もない歳月を積み重ねて蓄え、土深く守る。
やがて山すそから、細い流れのわき水となり、さらに大きな流れに成長する。
まさに太古からの自然の営みによって私たちは安心して水が使えるのだ。
この仕組みを人間が崩すと、自然からしっぺ返しがくる。
目の前の便利さや都合のために、山の木をむやみに切ってはいけない。
安心して水の飲める国こそ美しい国である。
上記と最も類似度(0.2826824188232422)が高かったのが↓
美しい音楽、絵、花、詩などには感動と癒やされるものがある。それは心のごちそうだ。
2年前に調布市に転入してから、近所にある武者小路実篤公園に時折、夫婦で散歩に行く。
夕方など、武蔵野の面影をわずかに残す雑木林が、夕日に赤く照らされる。
枯れ葉を踏みしめる音、ちょろちょろ流れるわき水の音、遠くでカラスの鳴く声、何かホッとする静寂のひととき。
都会の一角に残された小さな自然、これも心のごちそう、心の栄養と思う。
旧友からお連れ合いの悲報が届く年頃になった。だから余計に夫婦の何げない散歩が大切に思えてくる。
仕事優先の生活を送っている私だが、最近、学習意欲のある視覚障害を持つ友人が何人も出来て良い刺激を受けている。
この友人たちと自然が織りなす芸術を楽しむなど、心のごちそうの共有を願っている。
もちろんおいしい食事は好きだが、いつも腹八分目を心がけている。
どちらも水や山などの自然の美しさに関するものであり
人間が読んでもかなり類似度が高い結果となっております。

Leave a reply






管理者にだけ表示を許可する

該当の記事は見つかりませんでした。