LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1557|回复: 10

终于将智能陈桥的词库给转过来了。for-fcitx

[复制链接]
发表于 2006-6-16 03:59:05 | 显示全部楼层 |阅读模式
用python写了一个程序,将智能陈桥的词库给转过来了:
Reading 256583 records.

ok,your new mb file is :chen.mb
time: 442.792327881

现在词库多了几千字,呵呵:
yetist@yetist_online:fcitx:511$ wc -l chen.txt
256590 chen.txt
yetist@yetist_online:fcitx:512$ wc -l wbx.txt
252548 wbx.txt
陈桥的词库没有编码,全是用";"分隔的词语,费了好大功夫,不过现在我可以随便增加词语了,呵呵。只要写一个文件,按照陈桥的方式用;分隔,然后运行程序就行了,爽啊。
./fc.py chen-utf8.txt chen.mb
发表于 2006-6-16 04:32:43 | 显示全部楼层
过程应该是很爽的了。。。
不过智能陈桥的词库嘛。。。这个我不需要用人格担保,都可以说那个词库应该鄙视。。。给我钱我都不用的说-_-#    高品质的词库推荐用极爽词库,如果是五笔高手的话,推荐用一剑词库,当然这些都是有版权的……如果楼主不在意这个的话。。。

当然即便楼主不在意版权的问题,我还是要推荐一下我的词库。已经在本版中发布,只要楼主肯花十分钟时间看一下我的简短介绍,并且愿意再花半个小时作一点小小的适应,我想我的词库应该是非常不错的:D
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-6-16 12:29:38 | 显示全部楼层
Post by kardinal
过程应该是很爽的了。。。
不过智能陈桥的词库嘛。。。这个我不需要用人格担保,都可以说那个词库应该鄙视。。。给我钱我都不用的说-_-#    高品质的词库推荐用极爽词库,如果是五笔高手的话,推荐用一剑词库,当然这些都是有版权的……如果楼主不在意这个的话。。。

当然即便楼主不在意版权的问题,我还是要推荐一下我的词库。已经在本版中发布,只要楼主肯花十分钟时间看一下我的简短介绍,并且愿意再花半个小时作一点小小的适应,我想我的词库应该是非常不错的:D

把你的词库给转了1.9兆。
运行:
$ ./mkmb.py wubi86.mb1 wb.mb
$ ls -lh
总用量 2.9M
-rwxr--r--  1 yetist yetist 1.2K 2006-06-16 12:13 mkmb.py
-rw-r--r--  1 yetist yetist 1.9M 2006-06-16 12:14 wb.mb
-rw-r--r--  1 yetist yetist 994K 2005-07-20 02:24 wubi86.mb1

mkmb.py脚本:
[PHP]
import os
import sys

def mb12list(file):
    fp=open(file)
    buf=fp.read()
    buf=unicode(buf,"gb18030".decode("utf8"))
    buf=buf.splitlines()
    fp.close()
    list=[]
    for i in buf:
        nlist=i.split()
        nlen=len(nlist)
        if nlen ==2:
            list.append(i+"\n")
        if nlen >2:
            for m in range(1,nlen-1):
                str=nlist[0]+" "+nlist[m]+"\n"

                list.append(str)
    return list

def write_bm_from_list(list,file):
    fp=open(file,"w")
    biaotou=u"键码=abcdefghijklmnopqrstuvwxy\n码长=4\n[组词规则]\ne2=p11+p12+p21+p22\ne3=p11+p21+p31+p32\na4=p11+p21+p31+ n11\n[数据]\n"
    fp.write(biaotou.encode("gb18030"))
    for i in list:
        fp.write(i.encode("gb18030"))
    fp.close()

if __name__ == "__main__":
    file=sys.argv[1]
    mbfile=sys.argv[2]
    tmpfile="tmp.txt"
    list=mb12list(file)
    write_bm_from_list(list,tmpfile)
    cmd="txt2mb %s %s" % (tmpfile,mbfile)
    if os.system(cmd) == 0:
        print "New mb file is :%s" % mbfile
    os.remove(tmpfile)


[/PHP]
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-6-16 12:39:31 | 显示全部楼层
试了一下,你这词库好是好,就是开始不太适应,又是98又是86,搞得不停要反查编码,而且如果把你的码表用久了,别人的计算机如果只装了98或86之一,那么可能有的字都不知道怎么打。
回复 支持 反对

使用道具 举报

发表于 2006-6-16 14:03:24 | 显示全部楼层
。。。两个词库是分开的,呵呵,只要下载自己用的就可以了

九八的词库和王码的完全兼容
八六的只是一个一级简码和王码的习惯不太一样。如果你觉得不好的话,可以把那个改成王码风格的再用啊:)  反正是文本的码表,改一下是很简单的
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-6-17 03:22:00 | 显示全部楼层
搞定了几个86版五笔词库,给大家下载试用,都是for fcitx的:
基本词库:debian的fcitx3.2.060108-3

陈桥词库:基本词库+陈桥5.802词库
wbchen.mb
http://www.osprg.org/uploads/yetist/fcitx/wbchen.mb
酷极五笔:基本词库+酷极词库(kardinal兄帖子7楼)由wubi86.part1.rar系列:
wbkuji.mb
http://www.osprg.org/uploads/yetist/fcitx/wbkuji.mb
飞光五笔:基本词库+飞光词库(kardinal兄帖子2楼)由xaa.bz2系列:
wbfg.mb
http://www.osprg.org/uploads/yetist/fcitx/wbfg.mb
陈酷五笔:陈桥词库+酷极词库
wbchen_kuji.mb
http://www.osprg.org/uploads/yetist/fcitx/wbchen_kuji.mb
陈酷飞五笔:陈桥词库+酷极词库+飞光词库
wbckf.mb
http://www.osprg.org/uploads/yetist/fcitx/wbckf.mb

还有五笔98版的词库及万能五笔的词库,本来想都转换成fcitx的86版词库,但现在已经有这么多了,对我来说没有必要搞了。
不过万能五笔还是有些特点的,不知道转过来后能不能混合输入五笔和拼音?呵呵。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-6-17 03:57:43 | 显示全部楼层
工具也发一下喽。
用法:./fc.py /usr/share/fcitx/data/wbx.mb wbchen.txt  wbchen.mb
运行条件:
linux
python2.4
已安装fcitx
有mb2txt及txt2mb命令

说明:
第一个参数是已有码表文件,程序运行会在此文件中查找单字的五笔编码。
第二个参数是用“;”分隔的词语,所有文件只有一行,注意此文件中不能含有在第一参数中找不到编码的字,如“阿Q”,这里的“Q”是全角的,在默认的五笔型中没有对应的编码,另外此文件编码请转成utf8.
第三个参数就是根据提供的词语生成的新词库。

应用:
如果已经运行一次,如生成了wbchen.mb,而现在又有新词库(如new.txt)想加入,可以如下再运行一次:
./fc.py wbchen.mb new.txt new.mb

fc.py源代码:
[PHP]
#!/usr/bin/env python2.4
# -*- encoding: utf8 -*-

# Filename: fc.py
# Discripion:
# Author(s): yetist
# Version:

import sys
import os
import time
import string

def mb2txt(src,dst="wbx_tmp.txt"):
    """
    transfor wbx.mb to wbx_tmp.txt"""

    cmd="mb2txt %s > %s " %(src,dst)
    stat=os.system(cmd)
    if stat== 0:
        print "mb to txt \033[32mok \033[0m"
    fp=open(dst)
    buf=fp.readlines()
    fp.close()
    #os.remove(dst)
    bianmaindex=[]
    for i in buf:
        if i.find("=") >=0 or i.startswith("["):
            buf.remove(i)
            continue
        bianma=unicode(i,"gb18030".encode("utf-8"))
        #bianmaindex.append(bianma.split())
        bianmaindex.append(bianma)
    return bianmaindex

def get_danzi_mabian(allmabian):
    bianmaindex=[]
    for n in allmabian:
        i=n.split()
        if len(i[1]) ==1 and len(i[0]) >=2:
            bianmaindex.append(i)
    return bianmaindex

def split_chenhu(srcfile):
    cizu=[]
    fp=open(srcfile)
    buf=fp.read()
    cc=buf.split(";")
    fp.close()
    for i in cc:
        m=string.strip(i.decode("utf8"))
        if len(m) ==1:
            continue
        cizu.append(m)
    return cizu

def sub_cizu_from_mabiao(cizulist,dst="wbx_tmp.txt"):
    newcizu=[]
    fp=open(dst)
    buf=fp.read()
    fp.close()
    str=unicode(buf,"gb18030".encode("utf-8"))
    for i in cizulist:
        if str.find(i) <0:
            newcizu.append(i)
    return newcizu   

def make_mabiao(danzi_mabiao,cizulist):
    mabiaolist=[]
    for n in cizulist:
        ciy=[]
        for p in range(0,len(n)):
            for i in danzi_mabiao:
                if i[1] == n[p]:
                    ciy.append(i[0])
                    ciy.append(n[p])
                    break
        if len(n) == 2:
            strings=ciy[0][:2]+ciy[2][:2]+" "+ciy[1]+ciy[3]+"\n"
            mabiaolist.append(strings)

        if len(n) == 3:
            strings=ciy[0][:1]+ciy[2][:1]+ciy[4][:2]+" "+ciy[1]+ciy[3]+ciy[5]+"\n"
            mabiaolist.append(strings)

        if len(n) == 4:
            strings=ciy[0][:1]+ciy[2][:1]+ciy[4][:1]+ciy[6][:1]+" "+ciy[1]+ciy[3]+ciy[5]+ciy[7]+"\n"
            mabiaolist.append(strings)
        if len(n) > 4:
            length= len(n)
            mm=0
            zifu=''
            for mm in range(0,length):
                zifu+=ciy[2*mm+1]
            strings=ciy[0][:1]+ciy[2][:1]+ciy[4][:1]+ciy[2*length-2][:1]+" "+zifu+"\n"
            #mabiaolist.append(strings.split())
            mabiaolist.append(strings)
    return mabiaolist

if __name__ == "__main__":
    a=time.time()
    mbsource=sys.argv[1]
    src=sys.argv[2]
    dst=sys.argv[3]
    tmpfile="wbx_tmp.txt"

    allmabiao=mb2txt(mbsource,tmpfile)
    print "get all mabiao \033[32mok \033[0m"

    allcizu=split_chenhu(src)
    print "get cizulist from chenhu \033[32mok \033[0m"
    #sys.exit()

    cizulist=sub_cizu_from_mabiao(allcizu,tmpfile)
    #sys.exit()
   
    danzi=get_danzi_mabian(allmabiao)
    print "get danzi mabiao \033[32mok \033[0m"

    cizumabiao=make_mabiao(danzi,cizulist)
    print "get cizu mabiao \033[32mok \033[0m"
   
    allmabiao.extend(cizumabiao)
    allmabiao.sort()
    print len(allmabiao)

    fp=open(tmpfile,"w")
    str=u'键码=abcdefghijklmnopqrstuvwxy\n码长=4\n[组词规则]\ne2=p11+p12+p21+p22\ne3=p11+p21+p31+p32\na4=p11+p21+p31+n11\n[数据]\n'.encode("gb18030")
    fp.write(str)
    for i in allmabiao:
        fp.write(i.encode("gb18030"))
    fp.close()

    cmd="txt2mb %s %s " % (tmpfile, dst)
    if os.system(cmd) == 0:
        print "ok,your new mb file is :%s" % dst
    os.remove(tmpfile)
    b=time.time()
    print "time:",b-a


[/PHP]
回复 支持 反对

使用道具 举报

发表于 2006-6-17 04:15:32 | 显示全部楼层
非常感谢;)

不过,似乎有一点小小的问题。更换词库后不能是用:
FCITX -- Get Signal No.: 11
FCITX -- Exit Signal No.: 11

另:  wubi86.part1.rar 这个词库是98的,虽然名称是wubi86...现在也不是酷极的词库,酷极应该不提供98词库的吧?
其他的两个完全相同,只是格式有点不同而已
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-6-17 12:54:56 | 显示全部楼层
文本格式的码表发上来了:
地址是:
http://www.osprg.org/uploads/yetist/fcitx/
文件名为:
wbchen_kuji.mb.txt  wbchen.mb.txt  wbckf.mb.txt  wbfg.mb.txt  wbkuji.mb.txt
自己用txt2mb转换一下,应该能用。这些文件是gb18030编码的。
如:txt2mb wbfg.mb.txt fg.mb
Reading 252998 records.
回复 支持 反对

使用道具 举报

发表于 2006-6-18 18:54:11 | 显示全部楼层
怎样将 极点五笔 的符号也转成 FCITX的?
真的很不习惯FCITX的符号输入,特别是这个版本。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表