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

訪問者数 &counter();      最終更新 &lastmod();~

**ツイートをMySQLへ貯める --- 2012/03/02 [#g39ce889]


***MySQLのインストール [#r9f0e458]
何と、oreganoを更新した時にMySQLを入れていなかったので、追加導入。~
割とまとまったメモが [[http://kajuhome.com/mysql.shtml]] にあったので
ほとんどそのまま借用。
 #yum install mysql
 インストールしました:
   mysql.x86_64 0:5.1.56-1.fc13
 依存性を更新しました:
   mysql-libs.x86_64 0:5.1.56-1.fc13
 
 #yum install mysql-server
 インストールしました:
   mysql-server.x86_64 0:5.1.56-1.fc13
 依存性関連をインストールしました:
   perl-DBD-MySQL.x86_64 0:4.017-1.fc13

 #yum install mysql-devel
 インストールしました:
   mysql-devel.x86_64 0:5.1.56-1.fc13
 依存性関連をインストールしました:
   keyutils-libs-devel.x86_64 0:1.2-6.fc12
   krb5-devel.x86_64 0:1.7.1-19.fc13
   libcom_err-devel.x86_64 0:1.41.10-7.fc13
   libselinux-devel.x86_64 0:2.0.94-2.fc13
   libsepol-devel.x86_64 0:2.0.41-3.fc13
   openssl-devel.x86_64 0:1.0.0d-1.fc13
 依存性を更新しました:
   krb5-libs.x86_64 0:1.7.1-19.fc13    krb5-workstation.x86_64 0:1.7.1-19.fc13
   openssl.x86_64 0:1.0.0d-1.fc13

 #chkconfig mysqld on
 #/etc/rc.d/init.d/mysqld start
  MySQL データベースを初期化中:  Installing MySQL system tables...
  OK
  (後略)

 #mysql -u root  〜〜 これからユーザrootにパスワード設定
 mysql> set password for root@localhost=PASSWORD('hogehoge');
  Query OK, 0 rows affected (0.02 sec)
 mysql> use mysql
 mysql> delete from user where user="";
  Query OK, 2 rows affected (0.00 sec)
 mysql> set password for 'root'@'oregano.yy.is.sci.toho-u.ac.jp' = PASSWORD('hogehoge');
  Query OK, 0 rows affected (0.00 sec)
 mysql> set password for 'root'@'127.0.0.1' = PASSWORD('chariot7');
  Query OK, 0 rows affected (0.00 sec)

これでユーザテーブルの設定は終わり。

***MySQL-Pythonの導入 [#td3afd38]
次いで、MySQL-Pythonの導入 ⇒ [[ノート/テキストマイニング/PubMed解析]] に記述あり。但し、バージョンは新しくなっている。
-cd /usr/local
-ダウンロード wget http://nchc.dl.sourceforge.net/sourceforge/mysql-python/MySQL-python-1.2.3.tar.gz
-展開 tar -zxvf MySQL-python-1.2.3.tar.gz
-mysql_configはパス上にある /usr/bin/mysql_config ので、lnは不要
-システムがスレッドセーフでないので、site.cfgを編集してthreadsafeをFalseにする
-python setup.py build
-python setup.py install (suで実行)
-libmysqlclient.soのコピーやリンクは不要

***データベースとユーザを作成 [#rd6f429c]
MySQL上に、pythonからアクセスするためのデータベースとユーザを作る。
 mysql> create database xxxx;
 mysql> grant all privileges on xxxx.* to 'yyyy'@'localhost' identified by 'yyyy_password';

***MySQL-PythonでPythonからDBをアクセスするテストプログラム [#ldf9070c]
あらかじめMySQL上にデータベースmydb、更にデータベースmydb内にテーブルmytestを作っておく
 mysql> create database mydb;
 mysql> use mydb;
 mysql> create table mytest (name CHAR(32), age INT(11));
 mysql> insert into mytest values ('Tanaka', 35);
 mysql> select * from mytest;
 +--------+------+
 | name   | age  |
 +--------+------+
 | Tanaka |   35 |
 +--------+------+
次に、下記のテストプログラムを用意する。
 import MySQLdb
 con = MySQLdb.connect(db="mydb", host="localhost", port=3306,
                       user="xxxxxx", passwd="******")
 cur = con.cursor()
 
 s = "SELECT * FROM mytest"
 cur.execute(s)
 
 r = cur.fetchone()
 while r != None:
   print "%-10s | %-40s" % r
   r = cur.fetchone()
 
 cur.close()
 con.close()
実行結果は、
 Tanaka     | 35
となる。また、insertするプログラムは、
 import MySQLdb
 con = MySQLdb.connect(db="mydb", host="localhost", port=3306,
                       user="xxxxxx", passwd="******")
 cur = con.cursor()
 name = "Yamada"
 age = "13"
 s = "INSERT INTO mytest values (\'" + name + "\', \'" + age + "\')"
 cur.execute(s)
 cur.close()
 con.close()

***TweepyからMySQLへツイートを貯める [#m62a9c05]
基本的には、TweepyアクセスとMySQLアクセスを組み合わせればよい。

注意点は、queryを作る時に、データ(特にツイートデータ)にとんでもない文字が入っていることがあることである。上記のように、INSERT文のvaluesの後に、たとえば一重引用符を使って入れるとすると、データ中に引用符があれば、引用符の対が崩れてしまうので、エスケープ \' をしなければならない。プログラムを書くのが面倒だったので、MySQLdb.escape_string関数を使ってみた。(http://mysql-python.sourceforge.net/MySQLdb.html#functions-and-attributes)

また、ストリームが永遠に続くとき(続くので?)、Control-Cで止めざるを得ないが、その時に、後処理である con.close() を実行できない。そのため、Control-Cを「例外」として try ... except で受け止めるようにする。このやり方は、http://www.python.jp/doc/2.5/tut/node10.html など参照。 また、Control-Cの例外は KeyboardInterrupt である。(http://docs.python.org/library/exceptions.html)

更に、tweepyから得たtextが、漢字を含むかどうかを判定し([[ノート/テキストマイニング/Unicode-UTF8文字列の扱い]] の最後の方に出てくる、関数 hasKanji を使う )、漢字の時だけMySQLに格納するようにする。

 #!/usr/bin/env python
 # -*- coding: utf-8 -*-
 import MySQLdb
 import tweepy
 def hasKanji(s):
   #Returns True if string s contains a Kanji, False if not.
   kanji = False
   for c in s:
    if (((ord(c)&0xff00) == 0x3000) or (0x4e00 <= ((ord(c)&0xff00) <=0x9f00))):
      kanji = True
      break
   return kanji
 
 class StreamListener(tweepy.StreamListener):
      def on_status(self, status):
           if hasKanji(status.text):
                print status.created_at, status.id, status.source,
                print status.user.name, status.user.id,
                print status.user.screen_name, status.user.followers_count,
                print status.user.friends_count, status.user.time_zone,
                print
                print status.text
 
                s = "INSERT INTO tw values (\'" + str(status.created_at) + \
                  "\', \'" + str(status.id) + "\', \'" + status.source +   \
                  "\', \'" + MySQLdb.escape_string(status.text) + \
                  "\', \'" + MySQLdb.escape_string(status.user.name) +     \
                  "\', \'" + str(status.user.id) +                         \
                  "\', \'" + MySQLdb.escape_string(status.user.screen_name) +  \
                  "\', \'" + str(status.user.followers_count) +            \
                  "\', \'" + str(status.user.friends_count) +              \
                  "\', \'" + str(status.user.time_zone) +                  \
                  "\')"
 #               print "s>> " + s
                cur = con.cursor()
                cur.execute(s.encode('utf_8'))
                cur.close()
 
 consumer_key="ほげほげ"
 consumer_secret="ほげほげ"
 access_token="ほげほげ"
 access_token_secret="ほげほげ"
 auth1 = tweepy.auth.OAuthHandler(consumer_key, consumer_secret)
 auth1.set_access_token(access_token, access_token_secret)
 
 con = MySQLdb.connect(db="twitter", host="localhost", port=3306,
                 user="twitter", passwd="chariot7")
                 user="ほげほげ", passwd="ほげほげ")
 
 try:
   #stream = tweepy.Stream(auth1, StreamListener(), timeout=None)
   stream = tweepy.Stream(auth1, StreamListener(), timeout=3)
   stream.sample()
   con.close()
 
 except KeyboardInterrupt:
   con.close()
   print "Ctrl-Cによって終了"


さて、次は得られたデータベース上のデータを読み出して、形態素解析に掛けよう。
 ⇒ [[ノート/テキストマイニング/twitter-DB-解析]]

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS