使用ibus时间长了,常常突然发现有些本来常驻的首选或者常用字词突然掉到后面,甚至到了第二页,并不是被其他词挤掉,而是可能ibus的用户数据库出现错乱了。
不知道这是ibus程序的bug,还是ibus所用的SQLite数据库系统本身的问题,本来当用户输入一个拼音,ibus从用户数据库里面提出对应字的用户输入频数,决定字词的位置;如果用户第一次选择输入某个字,那么该字的记录就添加到用户数据库中,下次输入时便以此记录来提前该字的位置。理论上,在用户数据库里面一个词条的记录最多只能出现一次(多音字算多个字),然而,在实际的使用中,有时不知什么原因,某个本来常用的字被当作第一次输入再次加入到数据库当中,下次输入时,该字便作为低频字来排序,导致位置变得很后,带来不少不便。
这个Python脚本就是把这样的词条找出来,并把后来加入的记录删掉,把词条频数还原。
脚本下载:http://code.google.com/p/ptcoding/source/browse/trunk/ibus_fix
(svn目录内的ibux_db_fix.py,其他的两个是测试脚本)
程序功能:
- 自动备份用户词库
- 检出用户数据库中出现了两次,但不是多音字词的词条
- 将后加入的词条删除
检出错词的SQL:
SELECT * FROM py_phrase
WHERE phrase IN
(SELECT phrase
FROM py_phrase
GROUP BY phrase
HAVING COUNT(*) = 2)
尚存缺陷:
- 如果同一个词条的记录出现了3次或以上,程序不能鉴别(极少可能出现,可修改脚本内的SQL语句来查询出来)
- 如果一个字本身是多音字,其中一个音节出现了上述情况,程序不能鉴别(貌似概率也挺低的)
- 如果两个记录中的用户输入频数相同,两条记录都会被删掉(倒不是坏事,影响不大)
Python源码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | #!/usr/bin/python # -*- coding: utf-8 -*- import os import sqlite3 DB = os.getenv("HOME") + "/.ibus/pinyin/user.db" if not os.path.exists(DB): print "囧……似乎没有安装ibus……PT发来贺电……" exit(1) # ------ Backup database file -------- import time nowtime = time.strftime("_%Y-%m-%d-%H_%M_%S", time.localtime()) DB_BK = DB + nowtime execute = "cp -v %s %s" % (DB, DB_BK) os.system(execute) print "ibus用户数据库已备份到",DB_BK # ------ Connect to Database --------- con = sqlite3.connect(DB) c = con.cursor() c.execute("""SELECT * FROM py_phrase WHERE phrase IN (SELECT phrase FROM py_phrase GROUP BY phrase HAVING COUNT(*) = 2)""") rows = c.fetchall() badphrase = [] # ------ Detemine bad phrases ------- for i in range(0, len(rows), 2): flag = True phrase = rows[i:i+2] for j in range(1, 5): if phrase[0][j] != phrase[1][j]: flag = False if flag: badphrase.append(phrase[1]) if not len(badphrase): print "没有发现错误词条……PT发来贺电…… http://blog.ptsang.net" else: print "发现以下错误词条, 共%d个:" % len(badphrase) for row in badphrase: print "**[%s]**" % row[-3] print "\n执行优化清理……" # ------ Clean work to Database try: for row in badphrase: sql = "DELETE FROM py_phrase WHERE phrase = \"%s\" AND user_freq = %s" % (row[-3], row[-1]) #print sql c.execute(sql) con.commit() print "清理完成……PT发来贺电…… http://blog.ptsang.net" except sqlite3.OperationalError: print "清理无法完成,请先退出ibus..." con.close() |
不如你把这个东西提交到ibus的项目组去吧,呵呵!