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

訪問者数 760      最終更新 2012-03-02 (金) 16:33:23

ツイートをMySQLへ貯める --- 2012/03/02

MySQLのインストール

何と、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の導入

次いで、MySQL-Pythonの導入 ⇒ ノート/テキストマイニング/PubMed解析 に記述あり。但し、バージョンは新しくなっている。

データベースとユーザを作成

MySQL上に、pythonからアクセスするためのデータベースとユーザを作る。

mysql> create database xxxx;
mysql> grant all privileges on xxxx.* to 'yyyy'@'localhost' identified by 'yyyy_password';

MySQL-PythonでPythonからDBをアクセスするテストプログラム

あらかじめ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へツイートを貯める

基本的には、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="ほげほげ", 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
Last-modified: 2012-03-02 (金) 16:33:23 (2031d)