Rust 實(shí)現(xiàn)新世紀(jì)五筆反查詞庫(kù)

背景

新世紀(jì)版五筆字型輸入法,簡(jiǎn)稱新世紀(jì)五筆丛晌,是王永民教授于2008年1月28日推出的第三代五筆字型輸入法(第一代的86五筆和第二代的98五筆分別于1983年和1998年推出),該版本也被稱為標(biāo)準(zhǔn)版王碼五筆稚晚。新世紀(jì)五筆建立在新的字根鍵位體系绎巨,重碼實(shí)用頻度降低,取碼更加規(guī)范砾省,打字更加順手鸡岗,在規(guī)律性、易學(xué)性等方面有顯著的進(jìn)步编兄。

優(yōu)點(diǎn)非常多但目前很多輸入法軟件默認(rèn)還不支持新世紀(jì)五筆轩性,特別是mac系統(tǒng)上的支持更慢一些。我目前主要使用清歌輸入法狠鸳,這個(gè)默認(rèn)可以切換86和98的詞庫(kù)揣苏,也支持自定義詞庫(kù)悯嗓。網(wǎng)絡(luò)上找到的大部分新世紀(jì)詞庫(kù)只有主詞庫(kù),沒(méi)有反查功能卸察,新世紀(jì)中為了輸入的方便性很多字的拆分方式和按鍵都有變化不能反查真的很不方便脯厨。

鑒于此種尷尬情況,我們是否可以自己生成反查詞庫(kù)呢坑质?當(dāng)然是可以地合武!

ciku.jpg

思路

首先可以查看系統(tǒng)自帶的主詞庫(kù)是這樣的:

a 工
aaaa 工 恭恭敬敬
aaad 工期
aaae 黃花菜
aabg 草草了事
aahg 工卡
aahh 工頻 茞 茝
aaif 葡萄汁
aaii 落花流水
aaip 工黨
aais 葡萄酒 戒酒

一行一條數(shù)據(jù)前面是輸入碼后面是可以輸入的文字 空格分割。

然后可以查看系統(tǒng)自帶的反查詞庫(kù)如下:

?   rnu
?   nvyy
?   vnu
?   ncyy
?   nny
?   naht
?   nrry
?   nwvt
?   nfg

也是一行一條數(shù)據(jù)洪乍,但前面是文字結(jié)果后面對(duì)應(yīng)的碼眯杏。

那根據(jù)主詞庫(kù)生成反查詞庫(kù)是不是很清晰了:

  • 讀取主詞庫(kù)內(nèi)容
  • 根據(jù)換行符和空格符分割數(shù)據(jù)為數(shù)組
  • 遍歷數(shù)組生成一個(gè)文字對(duì)應(yīng)一個(gè)碼
  • 結(jié)果寫(xiě)入文本文件生成反查詞庫(kù)

功能實(shí)現(xiàn)

use std::fs::File;
use std::io::prelude::*;

// 源文件絕對(duì)路徑
const SOURCE_FILE: &'static str = "/Users/aqrun/xxx/新世紀(jì)五筆詞庫(kù).txt";
// 目標(biāo)文件絕對(duì)路徑
const DIST_FILE: &'static str = "/Users/aqrun/xxx/新世紀(jì)五筆反查詞庫(kù).txt";
// 測(cè)試用開(kāi)關(guān)控制待處理數(shù)據(jù)量
const TOTAL: i32 = 100;
// 是否開(kāi)啟控制開(kāi)關(guān)
const LIMIT: bool = false;

fn main() {
    // 獲取源文件句柄 file
    let mut file = File::open(SOURCE_FILE).expect("源文件打開(kāi)失敗,請(qǐng)檢查文件路徑");
    let mut source_data = String::new();
    // 讀取源文字內(nèi)容到 source_data
    file.read_to_string(&mut source_data).expect("源文件內(nèi)容讀取失敗");

    // 生成結(jié)構(gòu)化數(shù)據(jù)
    let res = generate_data(&source_data);
    // 根據(jù)結(jié)構(gòu)化數(shù)據(jù)轉(zhuǎn)為最終文件內(nèi)容
    let dist_data = generate_file_content(&res);

    // 獲取目標(biāo)文件句柄
    let mut dist_file = File::create(DIST_FILE).expect("目標(biāo)文件創(chuàng)建失敗壳澳,請(qǐng)檢查路徑");
    // 寫(xiě)入內(nèi)容
    dist_file.write_all(&dist_data.as_bytes()).expect("文件寫(xiě)入失敗");
    // println!("{:?}", dist_data);
    println!("轉(zhuǎn)換完成! 共處理{}條數(shù)據(jù)岂贩!", res.len());
}

/**
 * 將源數(shù)據(jù)字符串轉(zhuǎn)換為結(jié)構(gòu)化的數(shù)組數(shù)據(jù)
 */
fn generate_data(source: &str) -> Vec<Vec<String>> {
    // println!("{:?}", source);
    // 保存所有數(shù)據(jù) 按行分割原始內(nèi)容為數(shù)組
    let line_data_arr: Vec<&str> = source.split('\n').collect();
    // 保存最后的結(jié)果
    let mut res: Vec<Vec<String>> = Vec::new();

    let mut index = 0;
    for i in line_data_arr.iter() {
        index += 1;
        // 測(cè)試用控制開(kāi)關(guān)
        if LIMIT && index > TOTAL {
            break;
        }

        if i.is_empty() {
            continue;
        }
        // 按空格分割當(dāng)前行字符串為數(shù)組
        let all_arr: Vec<&str> = i.split(" ").collect();
        // 當(dāng)前行數(shù)據(jù)大小
        let len = all_arr.len();
        // 當(dāng)前行字符編碼
        let code = all_arr[0];
        
        for j in 1..len {
            // println!("{:?}, {}, {}, {}", all_arr, len, j, len-2);
            // 將當(dāng)前行生成為 [編碼, 文字] 數(shù)組格式 一行一個(gè)文字
            let mut res_line: Vec<String> = Vec::new();
            res_line.push(all_arr[j].to_string());
            res_line.push(code.to_string());
            res.push(res_line);
        }
    }
    
    res
}

/**
 * 將結(jié)構(gòu)化數(shù)據(jù)轉(zhuǎn)為最終文件內(nèi)容
 */
fn generate_file_content(source_arr: &Vec<Vec<String>>) -> String {
    let mut dist_arr: Vec<String> = Vec::new();
    // println!("res: {:?}", res);

    for i in source_arr {
        dist_arr.push(i.join(" ").to_string());
    }

    dist_arr.join("\n")
}

運(yùn)行程序

ζ cargo run --bin main                                                                                                             
   Compiling myrust v0.1.0 (/workspace/myrust)
    Finished dev [unoptimized + debuginfo] target(s) in 0.70s
     Running `target/debug/main`
轉(zhuǎn)換完成! 共處理89794條數(shù)據(jù)!

著不多9W條數(shù)據(jù)大概用了0.7秒巷波,還是很快的吧應(yīng)該萎津。

最終生成文件內(nèi)容類似:

工 a
恭恭敬敬 aaaa
工期 aaad
黃花菜 aaae
工巧 aaag
葡萄牙 aaah
花花世界 aaal
工藝 aaan
工匠 aaar
工區(qū) aaar
工薪 aaau
菚 aaau
斯蒂芬 aaaw

完結(jié)!!!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市抹镊,隨后出現(xiàn)的幾起案子锉屈,更是在濱河造成了極大的恐慌,老刑警劉巖垮耳,帶你破解...
    沈念sama閱讀 221,695評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件颈渊,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡终佛,警方通過(guò)查閱死者的電腦和手機(jī)俊嗽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)铃彰,“玉大人绍豁,你說(shuō)我怎么就攤上這事⊙雷剑” “怎么了竹揍?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,130評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)邪铲。 經(jīng)常有香客問(wèn)我芬位,道長(zhǎng),這世上最難降的妖魔是什么带到? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,648評(píng)論 1 297
  • 正文 為了忘掉前任晶衷,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘晌纫。我一直安慰自己税迷,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,655評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布锹漱。 她就那樣靜靜地躺著箭养,像睡著了一般。 火紅的嫁衣襯著肌膚如雪哥牍。 梳的紋絲不亂的頭發(fā)上毕泌,一...
    開(kāi)封第一講書(shū)人閱讀 52,268評(píng)論 1 309
  • 那天,我揣著相機(jī)與錄音嗅辣,去河邊找鬼撼泛。 笑死,一個(gè)胖子當(dāng)著我的面吹牛澡谭,可吹牛的內(nèi)容都是我干的愿题。 我是一名探鬼主播,決...
    沈念sama閱讀 40,835評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼蛙奖,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼潘酗!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起雁仲,我...
    開(kāi)封第一講書(shū)人閱讀 39,740評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤仔夺,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后攒砖,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體缸兔,經(jīng)...
    沈念sama閱讀 46,286評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,375評(píng)論 3 340
  • 正文 我和宋清朗相戀三年吹艇,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了惰蜜。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,505評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡掐暮,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出政钟,到底是詐尸還是另有隱情路克,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布养交,位于F島的核電站精算,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏碎连。R本人自食惡果不足惜灰羽,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,873評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧廉嚼,春花似錦玫镐、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,357評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至傍念,卻和暖如春矫夷,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背憋槐。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,466評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工双藕, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人阳仔。 一個(gè)月前我還...
    沈念sama閱讀 48,921評(píng)論 3 376
  • 正文 我出身青樓忧陪,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親驳概。 傳聞我的和親對(duì)象是個(gè)殘疾皇子赤嚼,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,515評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • 目錄 1. 輸入方案介紹1.1. 新世紀(jì)五筆1.2. 新世紀(jì)五筆·拼音1.3. 新世紀(jì)五筆·簡(jiǎn)入繁出 2. 依賴 ...
    科研者閱讀 9,866評(píng)論 1 5
  • 一、概述 聲筆飛碼顺又,簡(jiǎn)稱飛碼更卒,是在輸入法界影響最大的頂功輸入法,可以說(shuō)是它直接或者間接地激發(fā)了其它非聲筆系列頂功輸...
    聲筆系列閱讀 2,526評(píng)論 0 0
  • 前提:安裝 fcitx RIME安裝:$ sudo pacman -S fcitx-rime 注銷生效 一些快捷鍵...
    titvax閱讀 1,034評(píng)論 0 0
  • 一稚照、概述 聲筆快碼蹂空,簡(jiǎn)稱快碼,是一款類雙拼輸入法果录,它采用了一種特殊的雙拼加筆畫(huà)編碼上枕,同時(shí)又融合的 105 個(gè)高頻聲...
    聲筆系列閱讀 988評(píng)論 0 0
  • 雖然見(jiàn)解略有不同,但與 @曉覽 的基本觀點(diǎn)相同弱恒,新世紀(jì)五筆是一種比老86辨萍、98版都要更差的五筆版本。 與 @曉覽 ...
    Ubuntu_2017閱讀 10,035評(píng)論 7 7