admin管理员组文章数量:1566652
最近需要解析下载得到的百度输入法词库,本来尝试利用深蓝词库转换解决,无奈深蓝词库不能对各个路径下的词库分别进行处理,只能进行合并操作,这就丧失了原来路径具有的分类信息。看来这个坑还得自己填。
声明:下述没有处理拼音,只是简单的提取词库中的中文词。 需要处理词库,前提条件是了解词库文件内部存放方式。根据深蓝词库转换源码,我们可以推出百度词库编码方式如下: 0x350 :词库存放开始位置 int len 词语的长度,int数 4字节 长度2*len字节,对应拼音信息 长度2*len字节,对应unicode编码的中文词 所以,取出词库中的中文词,只需首先将文件读指针移动到0x350位置,读取词的长度,然后跳过中间的拼音信息,直接取到中文词unicode编码的字符串,然后对其进行解码即可。取出文件中的所有词语,只需要循环这个过程,直至文件读指针到了文件末尾。在我的需求中,需要把转码的中文词写入到文件中。 思路说完了,下面上代码:using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.IO; namespace read_file { class Program { public static int ReadInt32(Stream fs) { var temp = new byte[4]; fs.Read(temp, 0, 4); int s = BitConverter.ToInt32(temp, 0); return s; } public static List<String> readWord(string path,List<String>list) { var fs = new FileStream(path, FileMode.Open, FileAccess.Read); fs.Seek(0, SeekOrigin.End); long endPosition = fs.Position; fs.Position = 0x350; do { int len = ReadInt32(fs); fs.Position += len * 2; var temp = new byte[len * 2]; fs.Read(temp, 0, len * 2); String word = Encoding.Unicode.GetString(temp); list.Add(word); } while (fs.Position <endPosition-1); fs.Close(); return list; } static void transform_txt(string path) { var files = Directory.GetFiles(path, "*.bdict"); List<String> list = new List<string>(); foreach (var file in files) { list = readWord(file, list); Console.WriteLine(file + "文件处理完毕!"); } FileStream fs = new FileStream(path + "dict.txt", FileMode.Append); StreamWriter writer = new StreamWriter(fs, Encoding.UTF8); foreach (String word in list) { writer.Write(word + "\n"); } writer.Close(); fs.Close(); } static void Main(string[] args) { string []paths = { "C:FileRecv\\安徽\\" }; foreach (string path in paths) transform_txt(path); } } }
转载于:https://wwwblogs/zhoudayang/p/5288165.html
版权声明:本文标题:解码百度输入法词库 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/xitong/1727528895a1119348.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论