地平線まで行ってくる。

記録あるいは忘備録。時には検討事項。

マルコフ連鎖による文章自動生成 #5 つぶやいてみる。

 素材はできました。

 文章は多少チューニングしたけれども、集める文章や辞書の質も大事なので、まだまだ地道な作業は必要っぽい。

  

bwgift.hatenadiary.jp

 

 malkov_sentences.txtというファイルに生成文章を保存しているので、それを参照してつぶやくだけ。Twitterへのポストに必要なToken類は予め収得しておきます。

 

qiita.com

 この記事を参考に保存しておいた文章を呟きます。

 短い時間で同じ文章を呟くとエラーとなるのは、twitterの仕様。自分の書いたコードのエラーとの切り分けが必要なのでエラーメッセージを出すようにしていた方がいいかも・・・。

import random
import tweepy

n_post = 2

url = "https://api.twitter.com/1.1/statuses/update.json"

tweet_data = open("malkov_sentences.txt", 'r')
list_text = tweet_data.readlines()
list_text_sampled = random.sample(list_text, n_post)

def post_tweet(text):
try:
# put your keys
CONSUMER_KEY =
CONSUMER_SECRET =

ACCESS_TOKEN = 

ACCESS_TOKEN_SECRET =

auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
auth.set_access_token(ACCESS_TOKEN, ACCESS_TOKEN_SECRET)
api = tweepy.API(auth)
api.update_status(status = text)
except tweepy.TweepError as e:
print(e.reason)


if __name__ == '__main__':
post_tweet('自動生成つぶやきのテストします。')

for tweet in list_text_sampled:
tweet_message = tweet.rstrip("\n") + "(自動生成)"
print(tweet_message)
post_tweet(tweet_message)

  これで、呟きまで完成!

 

Raspberry pi 出張に持ち歩き

 出張先のホテル暮らし。

 出張で持ち歩く仕事のPCではプライベートなことが一切できないルールと仕組みになっている。情報管理の点から仕方ないことだ。だが・・・もう一台プライベート用にノートPCを運ぶのは重すぎる。

 というわけでラズパイを持ち歩いてみた。最近のビジネスホテルだとHDMI端子付きのTVは大抵あるし、いつものホテルだとそのあたりはしっかりチェック済みだからだ。

 準備としては、OSとしてRaspbianを入れたあとに、メディア再生のアプリケーションであるKodiをinstallしてyoutubeくらいは見れるように準備。手元のスマホにはKoreを入れてKodiをアプリから操作できるようにしておく。これで、ぼちぼち準備完了。マウスとキーボードはブルートゥース接続のものを荷物に入れておく。もちろん、HDMIケーブルは忘れずに。

 そして出張。仕事終わってホテルに移動。さくっと設置して、ベットに寝転がって遊ぶ。キーボードがしばらくすると入力できなくなる以外は順調。仮想キーボードをインストールして凌いだが、使い勝手は良くはない。キーボードは買い替え時かなぁ・・・。

 動画視聴という観点からは、Amazon primeのビデオが見れればいいのだが、Raspbianで見るにはちょっと工夫が必要らしい。

 とりあえず、狙いはそこそこ達成。さらに便利にしていきたい。

 

play.google.com

されど、部屋での普段使いヘッドフォン。

 密閉型のヘッドフォンは長くつけてると蒸れてくる。雑音が入らないのはいいところだけれども、開放型(オープンエア型)の外の音が自然に入ってきて圧迫感のない音の感じは好きだ。

 部屋で使う分は、音漏れなんて多少あっても問題がない。そんな大音量で聞いたら鼓膜の心配が先だろう。止めたほうがいい。

 だが、意外とお手軽なオープンエア型のヘッドフォンが少ない。

 以前はソニー制を使ってたけれども、このオーディオテクニカ製も悪くない。

 

audio-technica オープン型 オンイヤー ヘッドホン 楽器モニター用 ブラウン ATH-EP700 BW

audio-technica オープン型 オンイヤー ヘッドホン 楽器モニター用 ブラウン ATH-EP700 BW

 

  

 

車の発煙筒

  発煙筒は期限切れだと車検に通らない重要な保安部品。

 しかし、試したこともないし、ただただゴミになるだけ。本当は使ってみて、イザという時に使えるようにするというのがドライバーの鏡なのだろう。でも、後始末も面倒だし小火なんて誤解されると大変だ。

 ところが、LED仕様のものも車検対応らしい。

 

  こちらはライト付き。むしろライトの方が使う機会多かったりして・・・。

  ただし、発煙筒と比べてライト部分が大きいので、予め発煙筒の部分に装着して邪魔にならないかは確認したほうがいい。

持ち歩きキーボード

 長らく折りたたみキーボードを持ち歩いてきたけれども、相当長く使っているためか、押しっぱなしになったり、ペアリングはできているけど入力ができない状況が多々出てきた。

 500gもないなら、これでもいいかと選んだのがコレ。

 普段使いも出来たらいいのだけれども・・・。

 

 

英辞郎はパソコンのお供

 相当昔に購入したダウンロード版の英辞郎

 実はまだ現役だ。ネットに繋がってなくとも、サクサクと辞書が引けるので英語の文献なんか読むときは便利なのだ。厳密にというより大体の意味がわかればいいものだし、そもそも専門用語は分かっているからだ。

 その英辞郎。もう十版にもなり、いつの間にかテキストデータ自体は付属してないけれども、パソコンのお供的にはまだまだ使える。

 もともとはNiftyで活動していた翻訳関係者によるものだったと記憶している。もう、そういう時代てもなくなっているのだろうか。Webサイトには編集協力者募集のページが無くなっている。

 今だとGitHubとかで作業するのだろうけれども。当時の逸話はどこかに掲載されているのだろうか。

 

英辞郎 第十版 辞書データVer.151[2018年1月18日版] (DVD-ROM2枚付)

英辞郎 第十版 辞書データVer.151[2018年1月18日版] (DVD-ROM2枚付)

 

 

www.eijiro.jp

Raspberry pi SDカードの容量が・・・

 SDカードの容量がダウンロードしてきたRaspbianのイメージよりも微妙に小さい。さっき購入してきたTOSHIBA製の32GB。当然焼けない。メンドイなぁ。

 そうだ、NOOBSがあるじゃないか。

www.raspberrypi.org

 というわけで、フォーマットしたSDカードにダウンロードしたNOOBSのZipファイルを展開してコピー。それをRapberry Piにセットしてセットアップ。画面の指示に従って行くだけで終わり。

 実はNOOBSでインストールしたのは初めて。

 簡単だけれどもダウンロードに時間かかるのが難点。USBメモリとかにダウンロードしたものを簡単に使える仕組みがほしいところ。(もしかしたらあるのかもしれないけど・・・)

Tera Term Menu

 Tera Termは、ずっとお世話になっているターミナルエミュレータ。原作者が開発をやめたのちも、オープンソースで開発が続いている。そのTera Termに(今では)同梱されているランチャーTera Term Menu。登録しておけばさくっと所望のサーバーに接続できるので、長らく常用している。

 レンタルサーバーだったりラズパイで作業したりするときくらいの素人の趣味レベルなものだが、便利なものは便利なのだ。

 

 複数台のPCで使えるようにDropboxやOneDriveで同期させたフォルダで運用したい。ところが、Tera Term Menuの設定データはレジストリに収納されている。困ったなと思って調べていると・・・ttpmenu.iniの空ファイルを生成しておくと、そちらに保存されるようになる、とのこと。早速、試したら成功。

 

 ただし、気になるのがiniファイルに記載されている事項接続先は兎も角もポートとユーザー名はバレバレ。パスワードは平文じゃないけれども、これって暗号化されてるのかなぁ。

 

ttssh2.osdn.jp

 

 

ja.osdn.net

Nextcloud (sakura) のセキュリティ警告が大体解決

 NextcouldはDropboxのような(主にファイルの)クラウド環境を構築できる。とても便利なのだが、さくらではhttpヘッダに関するセキュリティが出て困っていた。

 動作自体には致命的でもないのだけれども、.htaccess にも記載してるし気持ち悪かった。

 と、なんとなく検索していると以下のサイトに遭遇。

www.yujakudo.com

 おぉ、、逆にコメントアウトすでばOKと!

 盲点でした。

 

マルコフ連鎖による文章自動生成 #4 しっかり学習させると。

 pythonのお勉強とおもって「文章自動生成」にチャレンジ中。これまで分かち書きした文章の教師用データを作ってお試しでの文章自動生成に成功しました。今回は「猫」という言葉が入っている応答形式のツイートを一週間かけて集めたデータを使います。

 幾つかのテキストファイルにしちゃっているので、学習データのディレクトリに.txtファイルを置いておくと順に読み込んでくれるようにしました。トラブルで再開しやすいように、学習データは学習したら削除することにしました。

 

 ./corpus_data : 学習ファイル

 tweet_learned_data.json : 学習結果

 

#!/usr/bin/env python3
# -*- coding:utf-8 -*-
from glob import iglob
import re
import markovify
import os
import gc

def main():

learned_data = "tweet_learned_data.json"

if os.path.exists(learned_data):
with open(learned_data) as f:
combined_model = markovify.Text.from_json(f.read())
else:
print("no learned data.")
combined_model = None

#

for (dirpath, _, filenames) in os.walk('./corpus_data'):
for filename in filenames:
with open(os.path.join(dirpath, filename)) as f:
print(filename)
text_model = markovify.NewlineText(f, retain_original=False, state_size=2)

if combined_model:
combined_model = markovify.combine(models=[combined_model, text_model], weights=[1.0,1])
else:
combined_model = text_model

sentence = combined_model.make_sentence()
print(''.join(sentence.split()))
gc.collect()

with open(learned_data, 'w') as f:
f.write(combined_model.to_json())
print("saved")

#remove learned file.
os.remove(os.path.join(dirpath, filename))


if __name__ == '__main__':
main()

  Qiitaを中心に色々と参考にさせていただきました。ありがとうございます。

 

 これで学習させると・・・116Mの学習ファイルが出来上がり。

 

 文章を生成します。

 malkov_sentences.txt に200文例を表示します。単なる単語になりがちなので短い20文字以下は保存しません。

import os
import markovify

def main():

learned_data = "tweet_learned_data.json"

if os.path.exists(learned_data):
with open(learned_data) as f:
text_model = markovify.Text.from_json(f.read())
else:
print("no learned data.")
exit()

#
sentence = text_model.make_short_sentence(130, tries=10, max_overlap_ratio=0.7, max_overlap_total = 10)
print(str(len(sentence)) + ":" + ''.join(sentence.split()))

if len(sentence) > 20:
# save make sentences data
with open('malkov_sentences.txt', 'a', encoding = 'UTF-8') as f:
f.write(''.join(sentence.split()) + "\n")
else:
print("canceled")

if __name__ == '__main__':
for var in range(0,200):
main()

 で結果。

  • 猫を好きになる犬種分からんもんまで買っててドラズの中にはヒトのことなんだけど、野良猫でした。ガルボ食べるのにゃ!
  • 猫のやつをいつでもダンボールの可能性もありませんが可愛いので野良がいたので里親さん募集。Twitterログアウトしちゃった
  • 人慣れしてるんだけど最後らへんですね。️
  • そんで、これはたまらんですが、新猫が飼いたい。とても猫が、馬だけでも癒されます。
  • 1猫みたいにしてればあまり分からないが、神明かけてたら、次のゲーム。⁇何系男子高校生の頃から猫って毛玉ができて綺麗にするのよ。ボランティア減るぜ」→ちゅき。

 

 なんとなく、変な文書の生成に成功!しかし、ツイートの文章だからか、文章らしからないものが多い場合も。

 

 マルコフ連鎖の場合は、前後の言葉の関係性を学習するけれども、それが2つの言葉なのか3つなのか・・・で決定される。ツイートの場合は文書が短いためか、3つ以上にすると学習したデータが似かよることが多い。また、複数学習データをまとめて学習データにするという手法の場合は、それぞれのモデルの weights を調整することもできる。もうちょっと工夫できるところも多い。

 

 データが大きくなるとメモリーをあっという間に食い尽くして慌てたりと勉強しながらなんとか文章の自動生成ができるようになって、ほっとしました。 

 

 と、ここまでで、分かち書きまで前処理したデータを使って学習データを作成し、文章を生成するところまでてきました。初期目標はある程度達成。とりあえず、ツイートまではやってみたいと思います。

 

 つづく

 

 

bwgift.hatenadiary.jp