2013年1月4日金曜日

[Python]MeCab バインディング - 出現した単語を DB に登録

test02.py
# -*- coding: utf-8 -*-
import optparse
import codecs
import sqlite3
import MeCab

### Table 作成
def createTable(con, name):
 print "Create table"

 # Table が作成済みか確認する
 c = con.cursor()
 sql = "SELECT NAME FROM sqlite_master WHERE type='table'"
# print sql
 c.execute(sql)
 for row in c:
# print row
 if row[0] == name:
 print "Table '%s' already exists." % (name)
 return

 # Table 新規作成
 sql = "CREATE TABLE %s(ID INTEGER NOT NULL PRIMARY KEY, STR TEXT NOT NULL, COUNT INTEGER NOT NULL);" % (name)
 con.execute(sql)

### DB に登録
def addData(con, table, str):
 print "Add data (%s)" % (str)

 # 文字列が DB に登録済みか確認
 c = con.cursor()
 sql = "SELECT * FROM %s WHERE STR='%s';" % (table, str)
# print sql
 c.execute(sql)
 for row in c:
 if row != None:
 # COUNT 更新
 print "'%s' already exists in Table '%s'." % (str, table)
# print row
# print "[%d] %s: COUNT=%d" % (row[0], row[1], row[2])
 id = row[0]
 cnt = row[2] + 1
 sql = "UPDATE %s SET COUNT=%d WHERE ID=%d;" % (table, cnt, id)
# print sql
 con.execute(sql)
 return

 # 新規データ追加
 sql = "INSERT INTO %s (ID, STR, COUNT) values (NULL, '%s', 1);" % (table, str)
# print sql
 con.execute(sql)

### 全レコード表示
def showAllRecords(con, table, order):
 print "Show all records"
 c = con.cursor()
 sql = "SELECT * FROM %s" % (table)
 if order == "DESC":
 sql += " ORDER BY COUNT DESC;"
 elif order == "ASC":
 sql += " ORDER BY COUNT ASC;"
 else:
 sql += ";"
 print sql
 c.execute(sql)
 for row in c:
 print "[%d] %s %d" % (row[0], row[1], row[2])

### Main function
parser = optparse.OptionParser()
parser.add_option("-i", "--input", dest="input", help="Input file name", metavar="[INPUT]")
parser.add_option("-d", "--database", dest="database", help="Database file name", metavar="[DATABASE]")
(options, args) = parser.parse_args()
print "Input file name : %s" % (options.input)
print "Database file name: %s" % (options.database)
if options.input == None:
 parser.print_help()
 exit()
if options.database == None:
 parser.print_help()
 exit()

fd = codecs.open(options.input, 'r', 'utf-8')

# Database を開く
con = sqlite3.connect(options.database, isolation_level=None) # Commit 不要
tableName = 'test'
createTable(con, tableName)

for line in fd:
 line = line.rstrip() # 行末の空白・改行コードを削除する
 print line
 t = MeCab.Tagger("")
 ret = t.parse(line.encode('utf-8'))
 print ret.decode('utf-8')

 # MeCab 内では UTF-8 で処理されるので utf-8 に変換して文字列を渡す
 m = t.parseToNode(line.encode('utf-8'))
 while m:
 # MeCab からの出力は UTF-8 になっているので unicode に decode して表示する
 str = m.surface.decode('utf-8')
 if str != "":
 print str
 # DB に単語の出現数を登録
 addData(con, tableName, str)
 m = m.next

fd.close()

# 結果表示
showAllRecords(con, tableName, 'DESC')

# Database を閉じる
con.close()
実行結果
> python test02.py -i sample.txt -d out.sqlite
Input file name : sample.txt
Database file name: out.sqlite
Create table
こんにちは、今日はいい天気ですね。
こんにちは 感動詞,*,*,*,*,*,こんにちは,コンニチハ,コンニチワ
 記号,読点,*,*,*,*,、,、,、
今日 名詞,副詞可能,*,*,*,*,今日,キョウ,キョー
 助詞,係助詞,*,*,*,*,は,ハ,ワ
いい 形容詞,自立,*,*,形容詞・イイ,基本形,いい,イイ,イイ
天気 名詞,一般,*,*,*,*,天気,テンキ,テンキ
です 助動詞,*,*,*,特殊・デス,基本形,です,デス,デス
 助詞,終助詞,*,*,*,*,ね,ネ,ネ
 記号,句点,*,*,*,*,。,。,。
EOS

こんにちは
Add data (こんにちは)

Add data (、)
今日
Add data (今日)

Add data (は)
いい
Add data (いい)
天気
Add data (天気)
です
Add data (です)

Add data (ね)

Add data (。)
一緒にお散歩に行きましょう。
一緒 名詞,サ変接続,*,*,*,*,一緒,イッショ,イッショ
 助詞,格助詞,一般,*,*,*,に,ニ,ニ
 接頭詞,名詞接続,*,*,*,*,お,オ,オ
散歩 名詞,サ変接続,*,*,*,*,散歩,サンポ,サンポ
 助詞,格助詞,一般,*,*,*,に,ニ,ニ
行き 動詞,自立,*,*,五段・カ行促音便,連用形,行く,イキ,イキ
ましょ 助動詞,*,*,*,特殊・マス,未然ウ接続,ます,マショ,マショ
 助動詞,*,*,*,不変化型,基本形,う,ウ,ウ
 記号,句点,*,*,*,*,。,。,。
EOS

一緒
Add data (一緒)

Add data (に)

Add data (お)
散歩
Add data (散歩)

Add data (に)
'に' already exists in Table 'test'.
行き
Add data (行き)
ましょ
Add data (ましょ)

Add data (う)

Add data (。)
'。' already exists in Table 'test'.
天気が悪くなってきたら急いで帰りましょう。
天気 名詞,一般,*,*,*,*,天気,テンキ,テンキ
 助詞,格助詞,一般,*,*,*,が,ガ,ガ
悪く 形容詞,自立,*,*,形容詞・アウオ段,連用テ接続,悪い,ワルク,ワルク
なっ 動詞,自立,*,*,五段・ラ行,連用タ接続,なる,ナッ,ナッ
 助詞,接続助詞,*,*,*,*,て,テ,テ
 動詞,非自立,*,*,カ変・クル,連用形,くる,キ,キ
たら 助動詞,*,*,*,特殊・タ,仮定形,た,タラ,タラ
急い 動詞,自立,*,*,五段・ガ行,連用タ接続,急ぐ,イソイ,イソイ
 助詞,接続助詞,*,*,*,*,で,デ,デ
帰り 動詞,自立,*,*,五段・ラ行,連用形,帰る,カエリ,カエリ
ましょ 助動詞,*,*,*,特殊・マス,未然ウ接続,ます,マショ,マショ
 助動詞,*,*,*,不変化型,基本形,う,ウ,ウ
 記号,句点,*,*,*,*,。,。,。
EOS

天気
Add data (天気)
'天気' already exists in Table 'test'.

Add data (が)
悪く
Add data (悪く)
なっ
Add data (なっ)

Add data (て)

Add data (き)
たら
Add data (たら)
急い
Add data (急い)

Add data (で)
帰り
Add data (帰り)
ましょ
Add data (ましょ)
'ましょ' already exists in Table 'test'.

Add data (う)
'う' already exists in Table 'test'.

Add data (。)
'。' already exists in Table 'test'.
Show all records
SELECT * FROM test ORDER BY COUNT DESC;
[9]  3
[6] 天気 2
[11]  2
[15] ましょ 2
[16]  2
[1] こんにちは 1
[2]  1
[3] 今日 1
[4]  1
[5] いい 1
[7] です 1
[8]  1
[10] 一緒 1
[12]  1
[13] 散歩 1
[14] 行き 1
[17]  1
[18] 悪く 1
[19] なっ 1
[20]  1
[21]  1
[22] たら 1
[23] 急い 1
[24]  1
[25] 帰り 1

0 件のコメント:

コメントを投稿