スキップしてメイン コンテンツに移動

Ruby+MeCab+MySQLでスクリプト書いた

今日は夜勤前の調整日(徹夜して身体のリズムを変更する日)だったので、第5回北海道開発オフの熱気が冷めないうちにプログラムに打ち込んでみました。真剣にプログラムに打ち込むと時間の経つのは早いもので、あっという間に朝です。しかし久しぶりにSQLを弄ったのですが、忘れていることが多くてショックでした。やはり勉強は継続していかないとダメですね。

さて、今日はTwitterのArchiveをMeCabで形態素解析を行い、結果をMySQLのテーブルに保存するスクリプトを作りました。

(1)MySQL本体と、RubyからMySQLを使うためのlibmysql-rubyのインストール。

$ sudo aptitude install mysql-server mysql-client libmysql-ruby

(2)初期ユーザroot/パス無しで使ってみる。

$ mysql -uroot
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 10
Server version: 5.0.32-Debian_7etch6-log Debian etch distribution

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
+--------------------+
2 rows in set (0.00 sec)

(3)rootユーザのパスワードを設定する。

$ su -
# mysqladmin -u root password PASSWORD
# mysqladmin reload

(4)mysqlをUTF-8化する。
現在のキャラクターセットを確認。

mysql> SHOW VARIABLES LIKE 'character\_set\_%';
+--------------------------+--------+
| Variable_name | Value |
+--------------------------+--------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | latin1 |
| character_set_server | latin1 |
| character_set_system | utf8 |
+--------------------------+--------+
7 rows in set (0.00 sec)

my.cnfを修正.

$ sudo vi /etc/mysql/my.cnf
以下を各セクションに追加
[mysqld]
character-set-server = utf8
collation-server = utf8_general_ci
init-connect = SET NAMES utf8

[mysqldump]
default-character-set = utf8

[mysql]
default-character-set = utf8

mysqlを再起動。

$ sudo /etc/init.d/mysql restart

確認。

mysql> SHOW VARIABLES LIKE 'character\_set\_%';
+--------------------------+--------+
| Variable_name | Value |
+--------------------------+--------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
+--------------------------+--------+
7 rows in set (0.00 sec)

(5)プログラム用のDBを作ってみる。

mysql> create database DATABASENAME;
Query OK, 1 row affected (0.02 sec)

mysql> grant all privileges on DATABASENAME.* to USERNAME@localhost identified by 'PASSWORD' with grant option;
mysql>\q
$ mysql -uUSERNAME -pPASSWORD DATABASENAME
mysql>

(6)形態素解析したデータを投入するテーブルを作ってみる。

mysql>create table morpheme (
id int not null auto_increment primary key,
surface text not null,
segment1 text,
segment2 text,
segment3 text,
practical1 text,
practical2 text,
basic text,
reading text,
pronounce text);
Query OK, 0 rows affected (0.01 sec)

mysql> show fields from morpheme;
+------------+---------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+---------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| surface | text | NO | | | |
| segment1 | text | YES | | NULL | |
| segment2 | text | YES | | NULL | |
| segment3 | text | YES | | NULL | |
| practical1 | text | YES | | NULL | |
| practical2 | text | YES | | NULL | |
| basic | text | YES | | NULL | |
| reading | text | YES | | NULL | |
| pronounce | text | YES | | NULL | |
+------------+---------+------+-----+---------+----------------+
10 rows in set (0.00 sec)

(7)先日のこれで抽出したTwitterのArchiveから形態素解析してDBに投入するスクリプトを実行。

#!/usr/bin/ruby -Ku

require 'MeCab'
require 'mysql'

begin
c = MeCab::Tagger.new(ARGV.join(" "))
mysql = Mysql::new('localhost','USERNAME','PASSWORD','DATABASENAME')

dfile = open("data.txt",'r')
dfile.each do |sentence|
sentence.chop!
n = c.parseToNode(sentence)
n = n.next

while n do
res_surface = mysql.query("select id,surface from morpheme where surface='#{Mysql.quote n.surface}'")

if res_surface.num_rows == 0
seg1,seg2,seg3,prac1,prac2,basic,read,pron = n.feature.split(/,/)
if read == nil then read="*" end
if pron == nil then pron="*" end

res_insert = mysql.query("insert into morpheme values(NULL,'#{Mysql::quote n.surface}','#{Mysql::quote seg1}','#{Mysql::quote seg2}','#{Mysql::quote seg3}','#{Mysql::quote prac1}','#{Mysql::quote prac2}','#{Mysql::quote basic}','#{Mysql::quote read}','#{Mysql::quote pron}')")
end
n = n.next
end
end
mysql.close
dfile.close

rescue
print "RuntimeError: ", $!, "\n";
end

(8)結果を確認。

mysql> select * from morpheme;
+------+--------------------------+--------------+--------------------------------------+--------------------+------------+--------------------------+-----------------------+--------------------+-----------------------------+
| id | surface | segment1 | segment2 | segment3 | practical1 | practical2 | basic | reading | pronounce |
+------+--------------------------+--------------+--------------------------------------+--------------------+------------+--------------------------+-----------------------+--------------------+-----------------------------+
| 9187 | ハッシュ | 名詞 | 一般 | * | * | * | * | ハッシュ | ハッシュ |
| 9188 | 配列 | 名詞 | サ変接続 | * | * | * | * | 配列 | ハイレツ |
| 9189 | から | 助詞 | 格助詞 | 一般 | * | * | * | から | カラ |
| 9190 | うまく | 形容詞 | 自立 | * | * | 形容詞・アウオ段 | 連用テ接続 | うまい | ウマク |
| 9191 | 値 | 名詞 | 一般 | * | * | * | * | 値 | ネ |
| 9192 | 取れ | 動詞 | 自立 | * | * | 一段 | 未然形 | 取れる | トレ |

ちゃんとDBに登録できてるっぽい。現在保持しているデータから54260レコードが抽出できました。

今度は文章の順序(単語Aの後に単語Bが続いてる)というのを蓄積するテーブルを作りたいです。その後は文章を再構成するスクリプト、そしてTwitterのタイムラインからリアルタイムにデータを取得するところ、ですね。

コメント

このブログの人気の投稿

リモートワークは仕組みじゃなくて文化です

ここ最近、コロナウイルス関連の報道が数多くあるが、その中でも多くの企業がリモートワークを推奨するという記事やプレスリリースが注目を浴びている。それ自体はもちろん大変望ましい。不要な対面での接点を減らすことで感染リスクを抑えることが出来るし、通勤ラッシュや首都圏への経済集中も抑制出来るからだ。

だがちょっと待ってほしい。リモートワークというのは社員が在宅で働くことだけを指すのではない。社員が在宅で働いても出社時と同じパフォーマンスが出ることをリモートワークというのだ。だからこの記事のタイトルで「リモートワークは仕組みじゃなくて文化です」と書いた。

弊社がリモートワークを導入したのは2011年の東日本大震災がきっかけだけれど、9年経った今、どのようにリモートワークを運用して、そしてパフォーマンスを維持しているかを共有したいと思う。以下のことが文化として根付けば、その会社のメンバーはリモートワークでもオフィスでも同じようなパフォーマンスが発揮出来るはずだ。

1.勤怠を厳密に管理しない え、だってダルくないすか。管理するの。何時に働き始めて何時に働き終わったかなんて関係ないっしょ。大事なのは働いた結果のアウトプットであり、働いた時間なんか問題じゃない。

2.休憩も厳密に管理しない え、だってダルくないすか。管理するの。何時に休憩し始め(ry

3.工数を厳密に管理しない え、だ(ry

4.目に見えるアウトプットを意識する 当然のことながら、仕事は結果が全てであり、結果が出なければどこで何時間働いたって意味がない。そして結果というのは目に見えなければ意味がない。 だからこそ、アウトプットを出すこと、アウトプットを評価することに徹底的にこだわる。それはドキュメントかもしれないし、お客様やパートナーとコミュニケーションするためのメールかもしれないし、社内の改善活動かもしれないし、メンバーへのフォローかもしれないし、ブログかもしれないし、Slackでの発言かもしれない。 とにかく目に見えないものは周りも認められない。目に見えるアウトプットしか評価されないし、そのために徹底的にアウトプットするんだ、という意識を社内でしっかりと作ることが重要。

5.コミュニケーションコストを意識する どんなに頑張っても、オンラインのコミュニケーションはオフラインのコミュニケーションの密度を越えられない…

41歳になりました

30代の頃は40歳になるまでの1年1年を意識しながら生きていたんだけど、40歳を越えてから自分の年齢にまるで興味が無くなり「あれ、今40歳だっけ、41歳だっけ」くらいの感じだったのですが、昨晩妻に確認したところ今日で41歳になりました。本厄ですが今の所は大きなトラブルもなく、もしかしたらコロナウイルスって僕が厄年のせいかな?くらいの気持ちでおります。

折角なので近況報告です。

コロナウイルス ... 現在弊社ではBCP体制として全オフィス閉鎖、全員在宅勤務、出張禁止となっています。僕も在宅勤務をしており、3月の出張を全てキャンセルしました。丸々一ヶ月自宅にいるのはなんと2015年8月以来4年7ヶ月ぶりです。ほぼ5年じゃん...この5年出張しかしてねえじゃん俺...おかげで毎朝6時起床で飲酒ゼロという健康的な生活を送っております。仕事 ... 2019年7月に弊社執行役員から取締役に変わったのですが、「使用人兼務役員だし大した変わらないだろ」と高をくくっていたところ、なんだかんだと自分の部署以外にも目を向ける必要が出てきたり、海外拠点のビジネスについても責任が伴ったりと、なんか結構変わっちゃったな、という感じです。41歳もまた新しいチャレンジをする一年になる予定なのでお楽しみに。家庭 ... 長女が大学進学して一人暮らしを始め、一安心していたところに長男が酒と煙草で停学2連チャンし自主退学、何とか私立高校に編入させて寮に引っ越しをさせ、結果的に妻と次男と3人暮らし、というのが現状です。この長男についてはまぁちょっと色々酷い時期があったものの、正直なところ僕も他人様に胸を晴れるほど立派な高校生だったわけでもないし、長男自体は編入後にすごく大人になったことから、コレ自体はまぁ長男にとって必要な経験だったんだろう、とポジティブに捉えています。彼も来年は高校卒業を迎えるので、ちゃんと手に職つけてくれると良いな。あと長女には2歳年上の彼氏が出来ました。うん、お父さん大丈夫。お父さん冷静。お父さんちょっとジム行ってくる。英語 ... 1日2時間の英語の勉強時間をキープし続けて、まぁとりあえず海外に独りで行っても困らないし、英語のミーティングは70%くらいは言ってることわかる、たまに返事も出来る、くらいが現状。今年も勉強頑張ります。大学 ... 僕は工業高校卒ですぐ就職しており大学…

贅沢に対する恐怖に怯えている

僕が小さい頃、我が家は貧乏だった。

とは言え、極端なほどではない。家もあったし、サッカーという習い事も出来ていたし、三食ちゃんと食べることが出来た。でも例えば外食はしないとか、ブランドものの服は着ないとか(今思い出せばジャージ以外着たことなかった)、旅行には行かないとか、ファミコンを買ってもらえないとか、そういうレベルでは裕福ではなかった。母子家庭だったので父親はおらず、慰謝料は一銭も入ってくることがなく、母はいつも頑張って働いてくれていた。

そんな母の姿を見ていたから、僕もとにかく金を稼がなくては生きていないという想いが強く、中学時代は知り合いの伝手でちょっとした日銭が稼げるアルバイトをしていて、中学卒業後にはすぐに手に職を得ることが出来そうな工業高校に進学した。高校時代は平日も土日もずっとアルバイトで、年末年始も休まず働いていた。その後進学したいと思うようになり、高度専門士の取得が可能な4年生の専門学校への入学が決まっていたものの、金銭的な事情から進学を諦めざるを得なかった。結果として、高校卒業にすぐ就職した。

その後21歳という若年で結婚し、長女が生まれたけど、もちろん高卒で21歳の若者の給与なんかたかだか知れており、必死に働いた。本業だけでは食って行けず、知人の紹介で副業を持ち、朝8時から夜中3時まで働いた。結婚後の幸せ太りで10kg増えた僕の体重は、一番過酷だった2ヶ月間であっという間に元に戻った。

そんながむしゃらに生きて、今の僕がある。

率直に言えば、今の僕は僕の人生の中で最も金銭的な余裕がある。40歳になり、ある程度の給与を貰えるようになり、幸いなことにボーナスまでもらえる(僕がボーナスをもらったのは今の会社が初めてだ。ボーナスを初めてもらった時、「あ、ボーナスって本当に存在するんだな」と思った)ような状況だ。すごく幸せなことだと思う。

しかし、だからこそ、僕は贅沢が怖い。贅沢をすること、それに慣れること、そして贅沢にスポイルされることが怖い。必死に働いて、節約して、誰もやらないような泥臭い仕事をして、それで何とか生きていた経験の積み重ねが、今の僕を作っている。僕が今仕事をさせてもらえているのは、その経験を買ってもらえているからだけれど、それも「たまたま」であり、仕事がなくなった時にまた同じように必死の努力をしなくてはならない。必死の努力をするのは…