版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、<p><b> 漢字的結構特征</b></p><p> 【摘要】 本文作者通過點陣量化處理1000個常用漢字,統(tǒng)計分析了不同漢字、不同字體的結構上的異同,并用c++語言編寫了一個能識別字符是否為中文的簡單程序。</p><p> 【前言】 漢字作為中華文明的代表之一,擁有上千年的悠久歷史。經(jīng)過幾千年的發(fā)展演變,漢字在字形字體上也發(fā)生了許多的變化
2、。本文就是對漢字字形的研究。通過對漢字字形的研究,我們可以發(fā)現(xiàn)漢字內(nèi)在的一些規(guī)律,并對文字識別等現(xiàn)代技術提供一定程度上的幫助。</p><p><b> 【目錄】</b></p><p><b> 漢字字形的量化處理</b></p><p> 1000常用漢字點陣的頻數(shù)統(tǒng)計</p><p>
3、 不同字體間架結構的點陣的頻數(shù)分析</p><p> 不同字體間架結構的中心分析</p><p> 常用漢字的字體中心分析</p><p><b> 識別中文的程序設計</b></p><p><b> 【正文】</b></p><p> 一、漢字字形的量化處理&l
4、t;/p><p> 對漢字字形的處理的第一步工作就是將漢字字形量化。目前應用較廣的Truetype字體使用的方法是用點與函數(shù)描述一個字的輪廓曲線(圖1.1),這種方法的優(yōu)勢在于可以細致的描述漢字的字形,字號無論大小字體邊緣都光滑無鋸齒等。對于今天的研究,我們采取了更為簡單的處理方法———點陣字體。</p><p> 點陣字體(windows系統(tǒng)下其字庫擴展名.fon,區(qū)別于Truetype
5、的.ttf)即將漢字的圖形簡化為一個點陣(常見的有16*16或24*24),用每個點的虛實表示漢字的輪廓。同樣以漢字“人”為例,點陣量化的過程如圖1.2所示:</p><p> 其中的難點是將漢字轉化為點陣,我們在互聯(lián)網(wǎng)上搜索到一款將給定漢字轉化為點陣的文字的軟件(大鴻點陣字轉換器1.0.0.0),該軟件轉換出的文字由字符“▇”與空格構成,通過Microsoft Word的搜索替換可將文字轉換為0與1構成的點陣
6、,便于以后的數(shù)據(jù)處理。以后的數(shù)據(jù)處理均采用此方法。</p><p> 對于該軟件不支持的字體,我們采用手動的方法將其用點陣表示:</p><p> 二、漢字點陣的頻數(shù)統(tǒng)計</p><p> 下一步我們的目標是對常用漢字進行點陣的頻數(shù)統(tǒng)計。首先,我們通過查閱資料,選取了1000個常用漢字(使用覆蓋率達91%)進行同樣的處理。由于軟件的原因,生成漢字的點陣并不統(tǒng)一
7、(只能保證行或列的統(tǒng)一),因此完成這一工作給我們帶來了極大的難度。對此,我們決定對行(x軸方向)與列(y軸)分別分析。</p><p><b> 注:使用字體:楷體</b></p><p> 漢字點陣x軸方向頻數(shù)統(tǒng)計</p><p> 約1000個漢字(極少數(shù)字無法轉換,但數(shù)量較少可忽略不計),計28980行,65列。</p>
8、<p> 對于較大量的數(shù)據(jù),使用程序處理會比較方便。我使用C++語言編寫了一段分列累加求和的程序(算法簡單,程序框圖略),代碼如下:</p><p> #include<iostream> //1.cpp</p><p> #include<fstream></p><p> #include<
9、;string></p><p> #define maxl 28980//maxline</p><p> #define maxc 65 //maxcol</p><p> using namespace std;</p><p> int sum[maxc];</p><p> int mai
10、n()</p><p><b> {</b></p><p> ifstream fin("code.txt");</p><p> ofstream fout("sum.txt");</p><p><b> int i,j;</b></p&g
11、t;<p><b> string s;</b></p><p> for(j=0;j<maxc;j++) sum[j]=0;//初始化</p><p> for(i=0;i<maxl;i++)</p><p><b> {</b></p><p> getlin
12、e(fin,s);</p><p> for(j=0;j<maxc;j++)</p><p><b> {</b></p><p> if(s[j]=='1') sum[j]++; //累加</p><p><b> }</b></p><p>
13、<b> }</b></p><p> for(j=0;j<maxc;j++) fout<<sum[j]<<endl;//output</p><p><b> return 0;</b></p><p><b> }</b></p><p&g
14、t; 由此得出漢字x軸方向統(tǒng)計數(shù)據(jù):0 0 165 165 696 696 1493 1493 2550 2550 3665 3665 4680 4680 5924 5924 7235 7235 8092 8092 7896 7896 7022 7022 6500 6500 6510 6510 7266 7266 8590 8590 8655 8655 7711 7711 8047 8047 8258 8258 8325 8325 8
15、296 8296 7652 7652 6928 6928 6384 6384 5614 5614 4575 4575 3242 3242 2187 2187 1402 1402 666 666 0 0 </p><p> ?。ㄗⅲ何覀儗⒆址皑~”替換為00,所以相鄰組數(shù)據(jù)一樣十分正常)</p><p> 繪制出圖表如下(圖2.1.1):</p><p> 從中可
16、見其最大值出現(xiàn)在x=33,34處,值為8655.</p><p> 漢字點陣y軸方向頻數(shù)統(tǒng)計</p><p> Y軸方向的統(tǒng)計同樣復雜。由于軟件對橫向的數(shù)據(jù)處理乏力,因此我們用軟件自帶功能將字順時針旋轉90度,如圖2.2.1:</p><p> 以后的處理與前文相同(程序代碼與前文亦相同),得出統(tǒng)計數(shù)據(jù)如下:0 0 147 147 802 802 2167 2
17、167 4281 4281 6283 6283 6895 6895 6805 6805 6701 6701 6425 6425 6345 6345 6559 6559 7096 7096 7210 7210 7376 7376 7534 7534 7798 7798 7954 7954 7828 7828 7706 7706 7437 7437 6887 6887 6541 6541 6289 6289 6131 6131 6023 6
18、023 5560 5560 4363 4363 2880 2880 1471 1471 503 503 0 0 </p><p> 處理為圖表如圖2.2.2:</p><p> 由圖表可得,沿y軸方向漢字點陣頻數(shù)分布的極值在y=35,36處,值為7954.</p><p><b> 漢字點陣的頻數(shù)統(tǒng)計</b></p><
19、;p> 首先我們觀察一下極值的分布,64*64的數(shù)據(jù)中,極值出現(xiàn)在x=33,34;y=35,36處,由于實際上相鄰2個單位值相同,我們的工作等效于處理了一個32*32的點陣。</p><p> 圖2.3.1表示了極值點在點陣中的位置:</p><p> 但是僅僅用極值很難全面反映我們得到的數(shù)據(jù),所以我們將累加得到的橫縱坐標還原為點陣。這里我們又一次借助了C++程序:</p
20、><p> #include<iostream> //2.cpp</p><p> #include<fstream></p><p> using namespace std;</p><p> int mod(double x)</p><p><b> {</b
21、></p><p><b> int i;</b></p><p> for(i=0;x>100;i++) x-=100;//該函數(shù)用來取一個變量百位以上的整型值</p><p><b> return i;</b></p><p><b> }</b>&l
22、t;/p><p> int main()</p><p><b> {</b></p><p> ifstream fin("sum.txt");</p><p> ofstream fout("sum2.txt");</p><p> int i,j
23、,x[64],y[64];</p><p> for(i=0;i<32;i++)fin>>x[i]>>y[i];</p><p> for(j=31;j>=0;j--)</p><p><b> {</b></p><p> for(i=31;i>=0;i--)<
24、/p><p><b> {</b></p><p> double val=sqrt((double)(x[i]*y[j]));//s[i][j]=sqrt(x[i]*y[j])</p><p> fout<<mod(val)<<'\t';</p><p><b>
25、}</b></p><p> fout<<endl;</p><p><b> }</b></p><p><b> return 0;</b></p><p><b> }</b></p><p> 其中輸出時數(shù)據(jù)采用
26、制表符分開,便于在excel中進行下一步處理。為了減小數(shù)據(jù)范圍,我們將數(shù)據(jù)還原到實際的精度(32*32)</p><p> 將數(shù)據(jù)置于excel中,使用條件格式可以直觀地體現(xiàn)出我們得到的點陣。如圖2.3.2:</p><p> 從中我們可以初步得出一些結論:</p><p> 漢字的結構還是左右戰(zhàn)較大部分(無論是左右結構還是某些結構的左右部分)</p&g
27、t;<p> 大部分漢字左邊相對較密</p><p> 在常見漢字中,中部偏左和中部偏右上區(qū)域漢字圖形分布的頻數(shù)較大</p><p> 圖中最大值為82,分布位置與2.3章(上文)求得一致。</p><p> 三、不同字體間架結構的點陣的頻數(shù)分析</p><p> 在第二章,我們分析了1000個常見漢字的楷書的結構特點
28、。然而顯然,漢字的字體豐富多樣,我們有必要對其他字體進行分析。</p><p><b> 行楷</b></p><p> 行楷與楷書相比,其間架結構變化并不是很大。我們?yōu)榱撕唵翁幚?,隨機了100字進行與楷書一樣的處理。數(shù)據(jù)處理結果如圖3.1.1:</p><p> 從圖中我們可以看出:行楷與楷書的點陣頻數(shù)分布圖其實很像(由于數(shù)據(jù)較少與層次
29、劃分的差異,行書的圖顯得較為簡單)</p><p><b> 隸書</b></p><p> 按照同樣的處理方式,我們得出了隸書的圖樣(圖3.1.2)。從中觀察,可以發(fā)現(xiàn)隸書的點陣分布與楷書行楷有很大差別:排除軟件本身導致的部分區(qū)域無字引起的圖片上方大量空白,我們?nèi)匀豢梢钥偨Y出隸書的一些規(guī)律:</p><p> 隸書的字體顯得明顯扁平&l
30、t;/p><p> 頻數(shù)分布的極值點并不在字體的中央部位,而是在字體的上部</p><p> 整字的疏密區(qū)別更大程度在字的上下部分而非左右</p><p> 通過這些特點,我們猜想,以現(xiàn)有技術如果完成漢字字體識別的話,不同字體的差別對字的間架結構有較大影響。但是,我們使用的軟件(大鴻點陣字轉換器1.0.0.0)支持的字體有限,因此對于其他一些漢字常見書寫字體,我們
31、要使用其他方法進行研究。</p><p> 四、不同字體間架結構的中心分析</p><p> 對于軟件不支持的字體,我們并沒有辦法獲得較大量的數(shù)據(jù)。為了在現(xiàn)有條件下對不同字體的結構繼續(xù)進行分析,我們采用了另一種分析方法——研究字形的中心。以圖1.4中的行書為例,我們將其量化后點陣如圖4.1:</p><p> 注:字體:魚石行書,加粗</p>&
32、lt;p> 然后我們定義滿足條件的點A為一個圖形的中點:點A滿足到圖形上每一點距離之和最小。</p><p> 我們選取楷書、行楷、行書、隸書的“行”字作為范例對此進行研究。由于草書的書寫存在字與字之間的關系,單字研究較為困難且意義不太大,我們不研究草書的單字結構。</p><p> 為了確定一個字的中點,我編寫了如下的C++代碼:</p><p>
33、#include<fstream> //3.cpp</p><p> using namespace std;</p><p> int s[32][32];</p><p> double dis(double x,double y) //處理累計的距離</p><p><b> {</b&
34、gt;</p><p><b> int i,j;</b></p><p> double sum=0;</p><p> for(i=0;i<32;i++)</p><p> for(j=0;j<32;j++)</p><p> if(s[i][j]==1)</p&g
35、t;<p> sum+=sqrt((double)((x-i)*(x-i))+(double)((y-j)*(y-j)));</p><p> return sum;</p><p><b> }</b></p><p> int main()</p><p><b> {</b&
36、gt;</p><p> double min=100000,sum;</p><p> ifstream fin("code.txt");</p><p> ofstream fout("ans.txt");</p><p> int i,j,x,y;</p><p>
37、 for(j=32;j>=0;j--)</p><p> for(i=0;i<32;i++)</p><p> fin>>s[i][j];</p><p> for(i=0;i<32;i++)</p><p><b> {</b></p><p> for
38、(j=0;j<32;j++)</p><p><b> {</b></p><p> sum=dis(i,j); </p><p> if(min>sum)</p><p><b> {</b></p><p><b> min=sum;<
39、;/b></p><p><b> x=i;</b></p><p><b> y=j;</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }&l
40、t;/b></p><p> fout<<x<<' '<<y<<' '<<min;</p><p><b> return 0;</b></p><p><b> }</b></p><p>
41、思路:求出每個點與圖形上每個點的距離之和,然后比較取最小值</p><p> 代入楷書、行楷、行書、隸書的統(tǒng)計數(shù)據(jù)如下:</p><p> 通過這個我們不難發(fā)現(xiàn)盡管字體不同,圖形中點的位置仍然十分相近。由此我們發(fā)現(xiàn)字的重點位置受字體影響并不大。</p><p> 五、常用漢字的字體中心分析</p><p> 由于對較大量的漢字分別處理
42、有較大的難度,我們選用了圖2.3.2的點陣頻數(shù)統(tǒng)計圖進行處理。使用的程序與上文第四章所示幾乎相同,對其中dis()函數(shù)做出如下調(diào)整:</p><p> double dis(double x,double y) //處理累計的距離</p><p><b> {</b></p><p><b> int i,j;</b&g
43、t;</p><p> double sum=0;</p><p> for(i=0;i<32;i++)</p><p> for(j=0;j<32;j++)</p><p> sum+=sqrt((double)((x-i)*(x-i))+(double)((y-j)*(y-j)))* s[i][j];</p>
44、;<p> return sum;</p><p><b> }</b></p><p> 即對于每一點,對每一段距離乘以點對應的二維數(shù)組s[i][j]的值。同時,由于數(shù)據(jù)范圍擴大,我們適當調(diào)高了變量min的初值。</p><p><b> 求得結果如下:</b></p><p&g
45、t; 圖2.3.2的點陣頻數(shù)統(tǒng)計圖中點為x=15,y=17處,與第四章求得結果基本一致。</p><p> 六、識別中文的程序設計</p><p> 在以上章節(jié)中,我們分析了大量漢字的頻數(shù)、中心等特點,發(fā)現(xiàn)盡管漢字的字形、結構甚至字體存在較大的差異,其中一些特點卻是共通的(例如中點的位置),由此,我們想對于識別一個字符是否為中文做出討論。</p><p>
46、字符的光學識別是一個有前景的研究方向,其中我們關注的是能否通過光學識別等途徑判斷文字的語言。由于歷史文化的巨大差異,東西方文字存在顯著的不同,比如漢字就與英語等表音文字存在巨大的差異。因此,這一想法的實現(xiàn)并非不可能。</p><p> 在光學識別中,攝影、圖片處理甚至字符分割與量化處理等并不是我們研究的方向。我們因而把問題簡化:輸入一個點陣表示的字符,對其是否為中文進行評估。</p><p&
47、gt; 我們依舊參照圖2.3.2提出以下處理方案:</p><p> 以圖2.3.2的點陣為基礎,計算每一個有字符的點所對應標準點陣的值并得到其算數(shù)平均數(shù)。我們隨機取了5個漢字進行處理,得到如圖6.1所示數(shù)據(jù)。經(jīng)計算,其算數(shù)平均數(shù)為64.31。我們以此作為漢字的平均值。</p><p> 再結合第五章中圖形中點的研究,我們?nèi)≈悬c值13<=x<=17且15<=y<
48、;=19為漢字中點的合理取值。</p><p> 我們以3.cpp為基礎,以下截取部分為核心的代碼:(篇幅所限格式有調(diào)整)</p><p> for(i=0;i<32;i++)</p><p><b> {</b></p><p> for(j=0;j<32;j++)</p><p
49、><b> {</b></p><p> if(s[i][j]==1){</p><p><b> num++;</b></p><p> val+=standard[i][j];}</p><p> sum=dis(i,j);</p><p> if(mi
50、n>sum) {min=sum;x=i;y=j;}</p><p><b> }</b></p><p><b> }</b></p><p> if((double)val/(double)num>=60) value=1;</p><p> if(x>=13&&
51、amp;x<=17&&y>=15&&y<=19) point=1;</p><p> if(value==1&&point==1) cout<<"應該是漢字";</p><p> else if(value==1||point==1) cout<<"可能是漢字&quo
52、t;;</p><p> else cout<<"我賭5毛不是漢字,,";</p><p> 為了對程序的可靠性進行驗證,我們進行了如下的檢測:</p><p> 對拉丁字母a做同樣的處理,結果如下</p><p> 對日文“お“進行處理,結果如下:</p><p> 對中文“
53、許“字處理,結果如下:</p><p> 可見軟件的內(nèi)容雖然簡單,判斷的結果較為令人滿意。</p><p> 注:我們默認給出的點陣為字符,實際情況較為復雜,可能需要對點陣的整體化數(shù)據(jù)進行分析,舍去過于離散的數(shù)據(jù)(如散點)或過于集中的數(shù)據(jù)(如墨點)。另外,我們還可以對字符的粗細進行分析,以確定其是否可能為某種文字的筆畫。這也是我們以后努力的方向。</p><p>
54、; 【結語】 本文的探討向我們揭示了中華文化源遠流長、博大精深的一面,也加深了我們對統(tǒng)計分析的理解。在不久的將來,高精度的ocr文字識別技術將極大地改變?nèi)藗兊纳?。到了那時,我們的努力將被證明是有價值的。</p><p><b> 【參考資料】</b></p><p><b> 點陣字體,百度百科</b></p><p
55、> 常用漢字1000,百度文庫</p><p><b> 【使用軟件】</b></p><p> 大鴻點陣字轉換器1.0.0.0,來自互聯(lián)網(wǎng)</p><p> MinGW Studio,來自互聯(lián)網(wǎng)</p><p> Windows XP系統(tǒng)自帶軟件(Word 2003,Excel 2003,畫圖,記事本)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 基于筆畫結構特征的脫機手寫漢字識別
- 基于結構特征的手寫體漢字識別研究.pdf
- 基于筆畫結構特征的脫機手寫漢字識別.pdf
- 漢字的民族文化特征與漢字教學.pdf
- 漢字的文化特征與技術特征--漢字設計方法研究之一.pdf
- 基于四角結構特征的脫機手寫漢字識別.pdf
- 漢字的筆畫、筆順、結構
- 漢字結構理論的研究.pdf
- 漢字間架結構-課件
- 漢字的結構分析在中學漢字教學中的運用.pdf
- 漢字表征的地理環(huán)境特征.pdf
- 手寫漢字的筆劃特征與粗分類.pdf
- 基于漢字特征的文本水印算法研究.pdf
- 漢字特征提取及識別技術的研究.pdf
- 從漢字結構感悟公德修養(yǎng)
- 漢字圖形特征的設計學研究_11562.pdf
- 基于筆段特征與方向特征的聯(lián)機手寫漢字識別研究.pdf
- 手寫粗體漢字的細化與特征提取研究.pdf
- 漢字結構與硬筆書法口訣
- 基于漢字結構的在線筆跡驗證研究.pdf
評論
0/150
提交評論