中式鍵盤排列的最優(yōu)化探究_第1頁
中式鍵盤排列的最優(yōu)化探究_第2頁
中式鍵盤排列的最優(yōu)化探究_第3頁
中式鍵盤排列的最優(yōu)化探究_第4頁
中式鍵盤排列的最優(yōu)化探究_第5頁
已閱讀5頁,還剩19頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、08016基于全拼輸入法的中式鍵盤排列的最優(yōu)化探究嘉定一中 王紫摘要 目前的美式鍵盤不論在英文打字輸入或中文輸入都有其不合理性1,據(jù)調(diào)查,國外許多國家的鍵盤都結(jié)合本國需要作出鍵盤排列修改,而我國仍使用美式鍵盤,中式鍵盤的探究是很有必要的。結(jié)合漢字單字出現(xiàn)頻度表,編程對拼音單個字母出現(xiàn)頻度及相鄰字母出現(xiàn)頻度進行加權(quán)統(tǒng)計,排行制表。為了科學(xué)設(shè)計鍵盤,通過多人多次間歇實驗的方式計算出鍵盤不同鍵位的敲擊速度,配合已有拼音字母頻率及相鄰拼音字母頻率,設(shè)計多種鍵盤排列,通過三個基于時間的最優(yōu)化標(biāo)準,嚴謹?shù)厍蟪鲎顑?yōu)化鍵盤排列,最終通過隨機測試檢驗?zāi)P?,驗證了重新設(shè)計的鍵盤的高效。這種設(shè)計鍵盤的方法,也可以適

2、用于手機等鍵盤的設(shè)計,從而可以提高我們交流信息的效率。關(guān)鍵詞 鍵盤排列 最優(yōu)化鍵盤 全拼前言作為計算機的重要輸入設(shè)備鍵盤,并非像我們想象中的,是發(fā)明鍵盤的人經(jīng)過嚴格推理,合理安排出的排列,反而,由于鍵盤在發(fā)明之初是為打字機服務(wù),為了防止“卡鍵”,便設(shè)計出現(xiàn)在這樣的最低效鍵盤。英國打字機博物館館長、打字機世紀一書的作者威爾弗雷德·a·比徹聲稱,“這種所謂科學(xué)安排以減少手指移動距離的說法,是徹頭徹尾的謊言?!?而對于中文打字,美式鍵盤排列的打字效率似乎變得更低了。事實上,在許多國家,為了適應(yīng)本國文字的需要,都會做出相應(yīng)的對鍵盤排列的改變2,而我國仍在使用美式鍵盤排列,對于中文鍵

3、盤,僅存在王永民先生的五筆輸入法;但是,據(jù)不完全統(tǒng)計,目前的上網(wǎng)人群中90%的人都熱衷于全拼輸入法3,因為它的重碼率較低,并且對人來說,全拼字母的反應(yīng)較快,會說便會打,而五筆輸入碼在人腦中的反應(yīng)速度較慢,很難在年輕人間流行開,未來在鍵盤輸入沒有被腦電波控制取代之前,全拼輸入法才是我們中國網(wǎng)民的主流。因此,我把研究的重心設(shè)為基于全拼輸入法的中式鍵盤排列的最優(yōu)化探究。首先,我通過多人多次間歇實驗的方式用測速軟件測試出鍵盤不同鍵位的平均敲擊速度;同時,我還需要對拼音單字母及相鄰字母的頻率進行統(tǒng)計,結(jié)合網(wǎng)上搜集到的用字頻度表,我自學(xué)了簡單的基礎(chǔ)c+課程,加權(quán)(原字出現(xiàn)頻度的權(quán))統(tǒng)計各字母在前五百個字中

4、的出現(xiàn)頻度。接下來根據(jù)逐步完善的三個優(yōu)化標(biāo)準,在設(shè)計出的多個鍵盤排列中進行比較篩選,計算得出最優(yōu)化的鍵盤排列。最后為了進一步驗證該鍵盤的高效性及合理性,我用軟件把大規(guī)模語料轉(zhuǎn)化為拼音,編程測試新鍵盤與美式鍵盤的最小輸入時間。根據(jù)模型檢驗,新鍵盤的全拼輸入效率較美式鍵盤提高了9.1%,而英文的輸入效率也提高了5%。這不僅驗證了新鍵盤的高效,也進一步說明了美式鍵盤的確在應(yīng)用于打字機時便是很低效的排列。普通鍵盤如果要轉(zhuǎn)變?yōu)槲覀冃碌牟季制鋵嵤呛芊奖愕氖?,只要用鍵盤修改器軟件把每個鍵位的輸入值改變,鍵盤就可以完全轉(zhuǎn)化,而不需要重新再買另一個鍵盤。個人認為,由于人的惰性關(guān)系,該鍵位布局恐怕無法得到大多普通

5、的電腦使用者的青睞,但對鍵盤要求更高的電腦達人們也許會在使用新鍵盤布局時,發(fā)現(xiàn)他們的打字效率有很大提升。這也是我的研究的價值所在。模型假設(shè) 1、除字母鍵以外的標(biāo)點符號等按鍵不考慮2、本文主要針對全拼輸入法,因為五筆輸入法本身按照最優(yōu)化鍵位排列,二者并不沖突。由于簡單易學(xué),目前大部分上網(wǎng)人群都使用全拼輸入法。并且假設(shè)用全拼打字時每輸入一個字做一次停頓。3、成人用字表4排行前500字累計頻率達到78.53%5,正文中統(tǒng)一使用前五百字的頻度為基礎(chǔ)進行運算。4、每個字母鍵的單指敲擊速度的計算:通過金山打字2006(kingsoft,北京金山軟件公司)對打字速度相差很大的若干人的各鍵敲擊速度最大值進行測

6、試,得到下表的平均近似值,速度數(shù)值保留到個位,速度單位kpm即keystrokes per minute,每分鐘敲擊鍵盤的次數(shù)。(其中a、b等表示美式標(biāo)準鍵盤上的a、b的位置。)letterabcdefghijklmspeed(kpm)350305311352353365351480455525468482375letternopqrstuvwxyzspeed(kpm)393400405345355354357410360333290404300表1可知,鍵盤上字母鍵的速度從大到小為j, l, h,k, i,u,p, y,o, n, m, f, v,t, r, s, e, d, g, a, q

7、, w, c,b, z, x由此對鍵盤各鍵位編號,依次對應(yīng)為k_1,k_2,k_3,k_26。另,根據(jù)隨機抽樣測試,當(dāng)雙手分別打字時,速度約增加至690kpm;當(dāng)單手不同手指打字時,左手平均速度約為450kpm,右手平均速度約為650kpm;當(dāng)單手指打字時,速度約減少至原來手指最大速度的70%。模型分析及求解拼音各字母頻度算法處理數(shù)據(jù)庫:首先將成人用字表前五百字轉(zhuǎn)化為拼音形式,再通過ultraedit-32(版本 12.20b)對拼音及其出現(xiàn)萬分比進行整理,以方便之后程序調(diào)用。算法:設(shè)任意字母a在排名前k個高頻字中每個字的出現(xiàn)次數(shù)為(i=1,2,k),這些高頻字的萬分比依次分別為 (i=1,2

8、,k)。則該字母頻度衡量值;同理算得所有字母的頻度衡量值,總和為;最終可得各字母加權(quán)頻度。通過microsoft visual c+ 6.0進行編程,對上述算法在電腦上模擬,取k=500,(具體程序見附錄)for(int i=0;i<strlen(pinyin);i+)char t2=0;t0=pinyini;/pinyin是分解出的字串wordt+=d_pinlv;/放入map表(word表示頻度衡量值,即w;d_pinlv是從數(shù)據(jù)庫中獲取的單字頻率,即p;這些字符在前面的程序中聲明)得到表2:表2_前500字拼音字母加權(quán)頻度排序表排行字母頻度衡量值加權(quán)頻度1i3289.211000

9、0.1377692n2863.871000 0.1199533a2315.971000 0.0970054g1867.994000 0.0782415e1846.799000 0.0773536h1829.493000 0.0766287u1744.300000 0.0730608o1323.303000 0.0554279d877.017000 0.03673410z834.585000 0.03495711y758.036000 0.03175012s719.196000 0.03012413j658.932000 0.02759914x363.898000 0.01524215l363.

10、613000 0.01523016c359.336000 0.01505117b314.592000 0.01317718w266.502000 0.01116219t244.988000 0.01026120q244.078000 0.01022321r208.260000 0.00872322f204.657000 0.00857223m197.918000 0.00829024k113.707000 0.00476325p 47.437000 0.00198726v 17.174000 0.000719設(shè)鍵盤上任意兩鍵a,b,其中二者速度<,出現(xiàn)次數(shù)>。t表示打字時間。此時打

11、字時間若將兩鍵位置交換,使=,=則優(yōu)化標(biāo)準一:26個不同出現(xiàn)頻率的字母與速度不同的鍵位依次組合,滿足字母統(tǒng)計頻率的一篇文檔的打字時間的最小值是字母頻率從大到小與鍵位速度從大到小依次排列所得的組合。由此可得初步鍵盤排列順序,記為p1,下圖為p1的鍵盤圖:圖1_p1鍵盤圖但是,這個方案并未對使用頻度高的任意兩個相連字母做出合理安排。因此我采用與統(tǒng)計拼音單字母加權(quán)頻度相類似的算法,并且使ab與ba的計數(shù)效果相同(具體程序見附錄),從而得到表3。for(int i=0;i<strlen(pinyin);i+)char t3=0;char s3=0;t0=pinyini;if(pinyini+1=

12、0)break;t1=pinyini+1;s0=t1;s1=t0;if(word.find(t)!=word.end()wordt+=d_pinlv;else if(word.find(s)!=word.end()words+=d_pinlv; elsewordt+=d_pinlv;表3_前500字相鄰拼音字母加權(quán)頻度排序表(部分)排行相鄰字母頻度衡量值加權(quán)頻度1ng1356.1790000000 0.0848942an1273.2170000000 0.0797013ai938.8490000000 0.0587704sh629.5220000000 0.0394075ji604.96900

13、00000 0.0378706en570.0720000000 0.0356857zh543.4110000000 0.0340168ni540.9790000000 0.0338649uo518.3400000000 0.03244710hi457.1060000000 0.02861411he454.2890000000 0.02843712on419.0760000000 0.02623313de388.4570000000 0.02431714hu369.6530000000 0.02313915ao366.2070000000 0.02292416ha353.6930000000 0

14、.02214017ua309.1220000000 0.01935018xi307.7810000000 0.01926619yi282.0830000000 0.01765820ch275.7760000000 0.017263整理數(shù)據(jù),由于相同手指打字最慢,因此應(yīng)該把出現(xiàn)頻度高的相鄰字母放在不同手指鍵位處。根據(jù)以上表格中數(shù)據(jù)的分析,其中位于相同手指鍵位的相鄰字母有排行相鄰字母頻度衡量值加權(quán)頻度3ai938.84900000000.0587707zh543.41100000000.03401610hi457.10600000000.02861415ao366.20700000000.0229

15、2416ha353.69300000000.02214019yi282.08300000000.01765825ho194.75200000000. 01219129 yo135.81100000000.00850136ge105.11700000000.00658038za96.95400000000.00606939ya89.98500000000.00563352zi65.68600000000.00411273 zo24.86500000000.001556按照單字母加權(quán)頻度表,盡可能地將排序相鄰的字母鍵位交換,由上表可以看出矛盾主要出現(xiàn)在右手食指中指,這樣減小了調(diào)整范圍,可以在人力下

16、依照排行逐一解決。優(yōu)化標(biāo)準二:需要交換鍵位字母時應(yīng)選擇速度大于該字母速度70%的鍵位交換。若出現(xiàn)矛盾的k組相鄰字母中有m個不同的字母,其中的任意字母,在出現(xiàn)矛盾的k組相鄰字母中出現(xiàn)的次數(shù)為,且這k組相鄰字母的加權(quán)頻度為,使最小。p1中m=8,k=13,;初步調(diào)整:a與g交換,記為p2,則此時位于相同手指鍵位的相鄰字母有排行相鄰字母頻度衡量值加權(quán)頻度7zh543.41100000000.03401610hi457.10600000000.02861419yi282.08300000000.01765825ho194.75200000000.01219129 yo135.81100000000.0

17、0850135 go110.37900000000.00690952zi65.68600000000.00411273 zo24.86500000000.001556 p2中m=6,k=8,;現(xiàn)在只有右手食指鍵位出現(xiàn)矛盾,并且在這個字母中出現(xiàn)最多的為h(頻度和0.074821),所以應(yīng)該首先考慮h鍵位的調(diào)整。由于h在前500字拼音字母加權(quán)頻度排序表中位于第6位,所以首先應(yīng)考慮與位于k_5的e或k_7的u交換。由于he在前500字相鄰拼音字母加權(quán)頻度排序表中位于第11位,故不予考慮;而u與i,o等字母都有相鄰,故也不予考慮。同理,h也無法與k_1,2,3,4,8,10,11,13,14,15交換

18、。p3:交換h與k_9的d;則此時位于相同手指鍵位的相鄰字母有排行相鄰字母頻度衡量值加權(quán)頻度19yi282.08300000000.01765829 yo135.81100000000.00850130di133.65600000000.00836752zi65.68600000000.00411260do50.08900000000.00313573 zo24.86500000000.001556p3中m=5,k=6,p4:交換h與k_12的s;則此時位于相同手指鍵位的相鄰字母有排行相鄰字母頻度衡量值加權(quán)頻度19yi282.08300000000.01765829 yo135.8110000

19、0000.00850152zi65.68600000000.00411266si39.75200000000.00248873 zo24.86500000000.001556p4中m=5,k=5,p4的值與p3相比較小,但鍵位速度改變量較大,優(yōu)化標(biāo)準一、二無法判斷孰優(yōu)孰劣。優(yōu)化標(biāo)準三:出現(xiàn)矛盾的k組相鄰字母中有m個不同的字母,其中的任意字母,在出現(xiàn)矛盾的k組相鄰字母中出現(xiàn)的次數(shù)為,且這k組相鄰字母的加權(quán)頻度為,字母鍵位的速度為,原位于矛盾位置的交換鍵位的單字母x的頻率為,原速度,另一交換鍵位的單字母y的頻率為,原速度,使最小。p3:代入,p4:代入,又p4為更優(yōu)化方案。p4的5個字母中i的頻度

20、和最大,但i的單字母頻度也最大,可交換鍵位的范圍較小,因此優(yōu)先考慮交換y??梢耘cy交換的鍵位有k_16,k_18,k_21,k_22。p5:y與k_16的c交換,則此時位于相同手指鍵位的相鄰字母有排行相鄰字母頻度衡量值加權(quán)頻度52zi65.68600000000.00411266si39.75200000000.00248872 ci25.75000000000.00161273 zo24.86500000000.00155680 co17.03000000000.001066,p6:y與k_18的w交換,則此時位于相同手指鍵位的相鄰字母有排行相鄰字母頻度衡量值加權(quán)頻度52zi65.68600

21、000000.00411266si39.75200000000.00248869wo34.64600000000.00216973 zo24.86500000000.001556,p7:y與k_21的r交換,則此時位于相同手指鍵位的相鄰字母有排行相鄰字母頻度衡量值加權(quán)頻度52zi65.68600000000.00411266si39.75200000000.00248867 ri36.32700000000.00227473 zo24.86500000000.001556,p8:y與k_22的f交換,則此時位于相同手指鍵位的相鄰字母有排行相鄰字母頻度衡量值加權(quán)頻度52zi65.68600000

22、000.00411266si39.75200000000.00248873 zo24.86500000000.001556,且p8是較佳方案。p9:z與k_16的c交換,則此時位于相同手指鍵位的相鄰字母有排行相鄰字母頻度衡量值加權(quán)頻度66si39.75200000000.00248872 ci25.75000000000.00161280 co17.03000000000.001066,p10:z與k_18的w交換,則此時位于相同手指鍵位的相鄰字母有排行相鄰字母頻度衡量值加權(quán)頻度66si39.75200000000.00248869wo34.64600000000.002169,且p10是較佳

23、方案。圖2_p10的鍵盤圖同時,在同一手指鍵位或不在前500字相鄰拼音字母加權(quán)頻度排序表的字母范圍內(nèi)依照優(yōu)化標(biāo)準一,調(diào)整鍵位排序,記為p11,鍵盤示意圖如下:圖3_p11鍵盤圖中式鍵盤排列的最優(yōu)化方案即是從上往下第一排自左向右依次為qrljysoedu,第二排為tzchbgian,第三排為pvmxkwf。這種方案下只有0.93%的拼音字母在同一手指范圍內(nèi)。模型檢驗根據(jù)模型假設(shè)中的速度假設(shè)用microsoft visual c+ 6.0編程對之前所得的最優(yōu)鍵盤排列進行檢驗(詳細代碼見附錄)。核心代碼:for(int i=0;i<fsize;i+)cur_char = file_bufi;i

24、f(!isalpha(cur_char) )pre_char = cur_char;pre_pk = pk;continue;pk = find_key_seat(cur_char,method);if(pk = null)continue;/以下表示字母速度的選取(具體字符假設(shè)詳見附錄)if(pre_char =0)t = t+(double)1/pk->v;else if(!isalpha(pre_char) )t = t+(double)1/pk->v;else if(pk->line = pre_pk->line)t = t+(double)1/(0.7*pk-

25、>v);else if(pk->hand = 0 && pk->hand = pre_pk->hand)t = t+(double)1/450;else if(pk->hand = 1 && pk->hand = pre_pk->hand)t = t+(double)1/650;else if(pk->hand != pre_pk->hand)t = t+(double)1/690;count+;pre_char = cur_char;pre_pk = pk;檢測得到以下幾個表格,其中時間衡量值與真實時間值倍

26、數(shù)相差較大,但可以反應(yīng)真實時間值間的比例關(guān)系。我的名字叫紅88,021字 拼音字母227,608個鍵盤方案時間衡量值優(yōu)化方案378.445原鍵盤方案412.949萬物簡史115,058字 拼音字母306,115個鍵盤方案時間衡量值優(yōu)化方案502.58原鍵盤方案555.79比我老的老頭47,102字 拼音字母125,333個鍵盤方案時間衡量值優(yōu)化方案208.603原鍵盤方案226.264浮生六記35,309字 拼音89151鍵盤方案時間衡量值優(yōu)化方案173.652原鍵盤方案183.226綜合語料 拼音字母746131個鍵盤方案時間衡量值優(yōu)化方案1259.84原鍵盤方案1374.53harry p

27、otter 6字母739,516個鍵盤方案時間衡量值優(yōu)化方案1473.64原鍵盤方案1538.69百年孤獨(英文版)字母634,759個鍵盤方案時間衡量值優(yōu)化方案1252.75原鍵盤方案1317.19a short history of nearly everything字母766,012個鍵盤方案時間衡量值優(yōu)化方案1506.41原鍵盤方案1574.2中文打字平均效率提高約9.1%。英文打字平均效率提高5%。這說明,本鍵盤作為中文拼音最優(yōu)化的最優(yōu)化鍵盤的同時,在打英文上也不會比原來的美式鍵盤慢。模型實際應(yīng)用這個設(shè)計鍵盤的模型不僅可以適用于基本鍵盤的設(shè)計,還可以應(yīng)用在手機等鍵盤設(shè)計上。對于手機鍵

28、盤,我們只需要把原來電腦鍵盤上的八組按鍵通過小幅調(diào)整,賦給手機上的八個字母輸入鍵。此外,普通鍵盤如果要轉(zhuǎn)變?yōu)槲覀冃碌牟季制鋵嵤呛芊奖愕氖?,只要用鍵盤修改器軟件把每個鍵位的輸入值改變,鍵盤就可以完全轉(zhuǎn)化,而不需要重新再買另一個鍵盤。我覺得,由于人的惰性關(guān)系,該鍵位布局無法得到大多普通的電腦使用者的青睞,但對鍵盤要求更高的電腦達人們也許會在使用新鍵盤布局時,發(fā)現(xiàn)他們的打字效率有很大提升。討論本模型精確嚴謹,采用鍵盤各鍵位分離記錄速度參數(shù)的方法,使鍵盤設(shè)計更加確切,達到真正的最優(yōu)化效果,通過隨機測試可以看出,本鍵盤設(shè)計的速度達到了很好的水平,中文全拼打字平均節(jié)省時間9%左右,英文打字也可以節(jié)約5%左

29、右的時間,因此不論中英文打字都能節(jié)省時間,并且全拼打字時,節(jié)時達到最大。但是不足之處是該鍵盤與原有鍵盤差異較大,不易很快掌握,因此不易推廣。已有相關(guān)研究比較:電腦鍵盤字母的優(yōu)化排列6松坪學(xué)校中學(xué)部作者:馬曦宇 蒲金山 呂方 陳濤指導(dǎo)教師: 湯先君“我們在英國牛津大學(xué)出版社出版的書蟲love or money一書中統(tǒng)計了原文7607個字母(將近2000個英語單詞)中26個英語字母分別出現(xiàn)的次數(shù),計算出它們在字母總數(shù)中所占的頻率,并畫出了統(tǒng)計圖?!薄鞍凑兆帜傅念l率高低和食指優(yōu)先、右手優(yōu)先、中檔鍵優(yōu)先的原則,他們重新排列出鍵盤字母:從左至右上行q、k、c、s、g、m、r、l、b、j,中行v、w、n、

30、t、o、a、e、i、p,下行z、x、u、d、y、f、h。為了驗證新鍵盤的優(yōu)越性,四位中學(xué)生進行模擬操作,實驗證明按字母頻率高低重新排列后的新鍵盤優(yōu)越性十分明顯,手指移動次數(shù)減少了一半。他們的研究成果電腦鍵盤字母的優(yōu)化排列不久前獲得今年深圳市科技創(chuàng)新大賽一等獎,專家對中學(xué)生這種敢于挑戰(zhàn)傳統(tǒng)、追求真理的行為給予肯定?!?該研究語料相對涉及非常少,幾乎沒有代表性,并且沒有依據(jù)相鄰字母頻率高的字母鍵位分開排列的原則,缺乏嚴謹性,在模型檢驗上由于通過人工測試,也沒有普遍適用的基礎(chǔ)。而我的探究的漢字頻率源于網(wǎng)上可信大規(guī)模語料統(tǒng)計,統(tǒng)計語料總字數(shù)為 86405823 個,字種數(shù)為 6763 字,并且使用c+

31、編程,使大規(guī)模頻率統(tǒng)計數(shù)據(jù)庫轉(zhuǎn)化為拼音單字母頻率和相鄰拼音雙字母頻率整理,非常嚴密并具有代表性,之后用嚴謹?shù)臄?shù)學(xué)推理得出最優(yōu)化方案。在模型檢驗方面,我利用鍵位速度的測試進行編程,任何語料經(jīng)拼音轉(zhuǎn)化后都可以測試出打字時間衡量值,進行比較,效率提高且精確。文獻1、/wiki/typewriter#keyboard_layouts:_.22qwerty.22_and_others2、3、4、通過大規(guī)模語料統(tǒng)計得到的成人用字表(總表為 6763 個字,網(wǎng)上發(fā)布的字表為前 4400 字),該成人用字表由王良辰先生對 chenshuyuan 先生轉(zhuǎn)載清華大學(xué)統(tǒng)計

32、資料進行加工得來,統(tǒng)計語料總字數(shù)為 86405823 個,字種數(shù)為 6763 字(國標(biāo)字符集)。5、根據(jù)中國語言生活狀況報告(2007)(已由商務(wù)印書館出版發(fā)行, 47.86%;一至二字詞語在詞種上占了88.40%,在頻次上占了96.90%。說明在實際應(yīng)用中,主要以一至二字詞語為主。6、7、8、使用軟件1、microsoft visual c+ 6.02、金山打字2006(kingsoft,北京金山軟件公司)3、實用漢字轉(zhuǎn)拼音v4.2(版權(quán)所有:ken guong,4、ultraedit-32(版本 12.20b)致謝感謝我的指導(dǎo)老師王之勤老師、科學(xué)會堂青少年英才俱樂部的數(shù)學(xué)組專家丁頌康老師等

33、以及我校2010屆高三一班的許多同學(xué)們對本文的無私幫助!附錄#include<iostream> #include<string> #include<map> #include<vector> #include <algorithm> #include <functional> #include <stdio.h>using namespace std; #define max_input_key 3int model_analysis();int pinlv();int xianglin();int main

34、() while(1)char input_key;cout<<"nn"cout<<"單字拼音字母加權(quán)頻度統(tǒng)計1n"cout<<"單字拼音相鄰字母加權(quán)頻度統(tǒng)計2n" cout<<"模型檢驗3n" cout<<"退出4n"cout<<"選擇(1,2,3):"cin>>input_key;cout<<endl;int method = input_key - '0'if

35、(method=0| method > max_input_key) break;switch(method)case 1:pinlv();break;case 2:xianglin();break;case 3:model_analysis();break;return 0;#include<iostream> #include<string> #include<map> #include<vector> #include <algorithm> #include <functional> #include <

36、;stdio.h>using namespace std; class wordcount;class wordcount public: string word; double times; wordcount(string s,double t) word=s; times=t; int operator < (wordcount &w)return times<w.times; int operator > (wordcount &w)return times>w.times; ; int udgreater ( wordcount elem

37、1, wordcount elem2 ) return elem1 > elem2; void takein(char* filename);bool statistic_singleletter(char* filename);bool statistic_xianglin(char* filename);bool singlesplit(char* string,char* pinyin,char* begin,char* end);double pin_sum = 0;map<string,double> word; vector<wordcount> wo

38、rd_count; int pinlv() /string s; /while(cin>>s)/ctrl+z結(jié)束 /words+; pin_sum = 0;word.clear();word_count.clear();if (statistic_singleletter("e:常用字拼音前500字字母頻率前500拼音.txt")=false)return 0;for(map<string,double>:iterator itr=word.begin();itr!=word.end();itr+) wordcount w(itr->first

39、,itr->second); word_count.push_back(w); pin_sum += itr->second; sort(word_count.begin(),word_count.end(),udgreater); for(vector<wordcount>:size_type i=0;i<word_count.size();i+) cout<<word_counti.word<<" "<<word_counti.times<<endl; takein("e:常用字拼音

40、前500字字母頻率前500拼音字母頻率統(tǒng)計.txt");return 0; /加權(quán)統(tǒng)計拼音字母頻度bool statistic_singleletter(char* filename)file *sfp = null;if(sfp=fopen(filename,"r")=null) cout<<"open file "<<filename<<" error"<<endl; return false; while(!feof(sfp)char pinyin100=0;/將word

41、內(nèi)存初始化為0char pinlv100=0;char info1000=0;/將info內(nèi)存初始化為0fgets(info,1000,sfp);/獲得一行if(singlesplit(info,pinyin,",","") = true)/分解字串if(singlesplit(info,pinlv,"","'")=true)double d_pinlv=0;d_pinlv=atof(pinlv);for(int i=0;i<strlen(pinyin);i+)char t2=0;t0=pinyini

42、;wordt+=d_pinlv; /放入map表fclose(sfp);return true;int xianglin() pin_sum = 0;word.clear();word_count.clear();if (statistic_xianglin("e:常用字拼音前500字字母頻率前500拼音.txt")=false)return 0;for(map<string,double>:iterator itr=word.begin();itr!=word.end();itr+) wordcount w(itr->first,itr->seco

43、nd); word_count.push_back(w); pin_sum += itr->second; sort(word_count.begin(),word_count.end(),udgreater); for(vector<wordcount>:size_type i=0;i<word_count.size();i+) cout<<word_counti.word<<" "<<word_counti.times<<endl; takein("e:常用字拼音相鄰拼音排序qian500

44、.txt");return 0; /相鄰拼音字母加權(quán)頻率統(tǒng)計bool statistic_xianglin(char* filename)file *sfp = null;if(sfp=fopen(filename,"r")=null) cout<<"open file "<<filename<<" error"<<endl; return false; while(!feof(sfp)char pinyin100=0;/將word內(nèi)存初始化為0char pinlv100=0;

45、char info1000=0;/將info內(nèi)存初始化為0fgets(info,1000,sfp);/獲得一行if(singlesplit(info,pinyin,",","") = true)/分解字串if(singlesplit(info,pinlv,"","'")=true)double d_pinlv=0;d_pinlv=atof(pinlv);for(int i=0;i<strlen(pinyin);i+)char t3=0;char s3=0;t0=pinyini;if(pinyini+1

46、=0)break;t1=pinyini+1;s0=t1;s1=t0;if(word.find(t)!=word.end()wordt+=d_pinlv; /放入map表else if(word.find(s)!=word.end()words+=d_pinlv; /放入map表elsewordt+=d_pinlv;fclose(sfp);return true;/send info to a filevoid takein(char* filename)file *sfp = null;if(sfp=fopen(filename,"w")=null) cout<<

47、;"open file "<<filename<<" error"<<endl;return ;for(vector<wordcount>:size_type i=0;i<word_count.size();i+) char lineinfo500=0;if(pin_sum > 0)sprintf(lineinfo,"%d%s%10.10f%10.6frn",i+1,word_counti.word.c_str(),word_counti.times,(double)(wor

48、d_counti.times)/(double)pin_sum);elsesprintf(lineinfo,"%d%s%10.10frn",i+1,word_counti.word.c_str(),word_counti.times);fputs(lineinfo,sfp);/寫入一行 fclose(sfp);cout<<"已寫入文件:"<<filename<<endl; return;/分解字串bool splitstring(char* string,char* pinyin,char* begin,char* e

49、nd)char *two = strstr(string,begin);if (two=null)return false;char *three = strstr(string,end);if (three=null)return false;if (three-two-2>0) memcpy(pinyin,two+2,three - two-2);elseint i=0;return true;bool singlesplit(char* string,char* pinyin,char* begin,char* end)char *two = strstr(string,begin

50、);if (two=null)return false;char *three = strstr(string,end);if (three=null)return false;if (three-two-1>0) memcpy(pinyin,two+1,three - two-1);elseint i=0;return true;#include <iostream>#include<string> #include<map> #include<vector> #include <algorithm> #include <fu

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論