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 件のコメント:

コメントを投稿