漢語文本的中文姓名和地名識別與編程實(shí)現(xiàn)_第1頁
漢語文本的中文姓名和地名識別與編程實(shí)現(xiàn)_第2頁
漢語文本的中文姓名和地名識別與編程實(shí)現(xiàn)_第3頁
漢語文本的中文姓名和地名識別與編程實(shí)現(xiàn)_第4頁
漢語文本的中文姓名和地名識別與編程實(shí)現(xiàn)_第5頁
已閱讀5頁,還剩8頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、 漢語文本的中文姓名和地名識別與編程實(shí)現(xiàn)貴州大學(xué)信息與計(jì)算機(jī)科學(xué)學(xué)院計(jì)算機(jī)科學(xué)系一九九九級羅星漢學(xué)號: 指導(dǎo)老師: 陳笑蓉副教授摘要:本文介紹漢語文本的中文姓名和地名計(jì)算機(jī)自動(dòng)識別的方法,重點(diǎn)介紹普通漢語姓名的識別,并對實(shí)現(xiàn)計(jì)算機(jī)自動(dòng)識別使用的編程技術(shù)方法進(jìn)行分析說明,附有詳細(xì)注釋的程序核心源代碼。關(guān)鍵詞:中文信息計(jì)算機(jī)自動(dòng)處理,分詞,規(guī)則化姓名識別,常用姓用字與名用字頻率表,名人庫,地名庫。Abstract:This paper presents the automatic computer identifying methods of Chinese names and toponyms

2、in texts, and focus on common Chinese person names identification.t analyses the programming skills and techniques that use in the automaticcomputer identifying methods of Chinese texts, and presents the crucial C+ codes of the original program with documents in detail. 引言 中華民族五千年?duì)N爛的文明歷史,誕生無數(shù)文化瑰寶,漢語

3、就是其中之一。與印歐語言相比,漢字是象形文字,漢語有不同于印歐語言構(gòu)句方式與書寫方法。漢語從最早的甲骨文開始,歷經(jīng)數(shù)千年的,凝聚了的中華民族文化和歷史,發(fā)展到近現(xiàn)代,已經(jīng)從古代漢語演化為現(xiàn)代漢語,獨(dú)步于世界各民族語言之林。近百年來,現(xiàn)代科學(xué)飛速發(fā)展,知識信息爆炸式增長,技術(shù)日新月異,作為人類知識思想信息載體的文字更加突顯其重要作用。在我國,隨著計(jì)算機(jī)技術(shù)的發(fā)展,中文信息計(jì)算機(jī)自動(dòng)處理研究已成為現(xiàn)代漢語研究的前沿科學(xué)。漢語的自身特點(diǎn)決定了中文信息自動(dòng)處理首先要對待處理文本進(jìn)行自動(dòng)分詞。在分詞階段,漢語文本中的姓名和地名不像印歐語言那樣可以通過大寫字母來識別,文本中的姓名和地名等專有名詞大多被切分

4、成單字詞,若不能解決好文本中姓名和地名等專有名詞的識別問題,將對其后的漢語文本深入研究產(chǎn)生難以逾越的障礙。所以中文姓名和地名自動(dòng)識別是漢語自動(dòng)分詞的重點(diǎn),而難點(diǎn)在于普通中文姓名的識別,其結(jié)果直接影響到中文信息的深層次研究,因此本文將普通中文姓名的識別作為重點(diǎn),從識別方法上和編程技術(shù)上進(jìn)行分析研究。中文姓名的結(jié)構(gòu)特點(diǎn)與規(guī)律:中文姓名是以姓氏來驅(qū)動(dòng)的,姓氏是識別的首要條件。絕大多數(shù)姓名結(jié)構(gòu)是:姓氏+名字,其中姓氏絕大多數(shù)為單姓,也有少量復(fù)姓,名字則有單名和雙名。近年來由于有些家長為了減少孩子姓名與別人重名的機(jī)率,有起三字名的趨勢,所以現(xiàn)在名字也出現(xiàn)了三字,但僅屬極少部分情況。姓氏主要分為單姓和復(fù)姓

5、:單姓:“張,王,李,趙”。復(fù)姓:“歐陽,諸葛,司馬,萬俟,令狐”。復(fù)姓中還有極少量多字姓:“索綽絡(luò),愛新覺羅”,屬少數(shù)民族姓氏。單名結(jié)構(gòu):姓氏+單名用字雙名結(jié)構(gòu):姓氏+雙名首字+雙名末字三名結(jié)構(gòu):姓氏+三名首字+三名中字+三名末字普通中文名字具有任意性,多樣性的特點(diǎn),而且,中文中的姓和名在很多情況下又可以作為句子的其他成份參與句子的構(gòu)造和活動(dòng),因此除了少數(shù)著名人物的姓名可以作為名人名收錄到名人庫加以識別,對其他絕大多數(shù)普通中文姓名需要進(jìn)行專門識別。名人名與地名:名人名和地名確定和有限,選擇適當(dāng)尺度,收集最有代表性的名人名和地名建立數(shù)據(jù)庫,在普通姓名識別之前進(jìn)行直接匹配識別。分詞標(biāo)記后排除可減

6、少下一步識別需處理的數(shù)據(jù)量和對普通姓名識別的干擾,有利于提高速度和準(zhǔn)確率。一.識別需求信息分析與信息庫準(zhǔn)備 對姓名和地名識別的前期準(zhǔn)備性研究發(fā)現(xiàn),普通中文姓名的判斷需要借助中文姓氏和上下文的相關(guān)信息,包括稱謂和成語,提示詞,特征字等。通過對這些上下文信息歸納總結(jié)分類,形成一組需要嚴(yán)格匹配的姓名識別規(guī)則,通過對待識別文本通過嚴(yán)格匹配可產(chǎn)生識別的姓名候選集,而進(jìn)一步的篩選識別確定則需要取得現(xiàn)實(shí)生活中的姓名用字的量化信息后進(jìn)行。名人名和地名的識別也需要建立相應(yīng)的數(shù)據(jù)庫。因此在對識別所需各種數(shù)據(jù)進(jìn)行分析總結(jié),分類收集后建立各種信息數(shù)據(jù)庫,以文本文檔豎排方式存儲(chǔ),為下一步編程實(shí)現(xiàn)提供識別信息庫。.姓氏庫

7、中文名字以姓氏來驅(qū)動(dòng),姓氏是中文姓名結(jié)構(gòu)中最重要的部分,是在自動(dòng)識別過程中發(fā)現(xiàn)單字且該單字為姓氏常用字后,以該字為姓氏用字來進(jìn)行判斷是否為中文姓名的觸發(fā)條件,對中文姓氏用字規(guī)律的研究對姓名的識別篩選有至關(guān)重要的作用。1977年史學(xué)家李棟明,在東方雜志上發(fā)表過一篇有關(guān)“姓”的論文,文中指出: 華人最大的十個(gè)姓是:張、王、李、趙、陳、楊、吳、劉、黃、周。這十個(gè)姓占華人人口40%,約四億人。 第二大的十個(gè)姓是:徐、朱、林、孫、馬、高、胡、鄭、郭、蕭。占華人人口10%。 第三大的十個(gè)姓是:謝、何、許、宋、沈、羅、韓、鄧、梁、葉。占華人人口10%。 接下來的15個(gè)大姓是:方、崔、程、潘、曹、馮、汪、蔡、

8、袁、盧、唐、錢、杜、彭、陸。加起來也占總?cè)丝诘?0%。 這就是說,在中國十億人口中,有七億人姓了這45個(gè)大姓。另外的三億多人的姓,都是比較少見的,像毛、江、白、文、關(guān)、廖、苗、池等等。因此,將收集到的常用1057個(gè)中文姓氏,包括常用和罕見的姓氏,按姓氏字?jǐn)?shù)和使用頻率,組成了中文姓氏庫。為了提高計(jì)算機(jī)處理速度,將單姓四十五個(gè)大姓放在姓氏庫最前面,雙字復(fù)姓庫,放在單姓后,以此類推。實(shí)際情況中一些極其罕見的姓氏用字,像“是,出,不,才,無”,是漢語最常用字,若將其歸為姓氏集誤判率極高,對識別干擾很大。適當(dāng)選擇后將一類字排除在姓氏集之外,可以大大降低誤判率,提高速度與準(zhǔn)確率。.稱謂庫漢語中各種對人的稱

9、謂為姓名的識別提供了上下文信息,在可能姓氏前后出現(xiàn)對人的稱謂,那該姓氏為姓名用字的可能性很大。漢語姓名識別的規(guī)則之一就是稱謂可能姓氏特征字,或可能姓氏稱謂,通過對可能姓氏前(后)稱謂的識別并結(jié)合相應(yīng)特征字信息,得到的可能姓名漢字字符串就作為規(guī)則化姓名識別的結(jié)果,納入姓名候選集。.前置稱謂信息:姓名的前端多冠有對人的職業(yè),職務(wù)以及與說話人的關(guān)系的稱謂。如:“孫伍空這一角色由著名猴戲演員六齡童的兒子六小齡童扮演”,“貴州大學(xué)計(jì)算機(jī)科學(xué)系教授張宗良在作學(xué)術(shù)報(bào)告”,“我的同事趙啟是貴陽人”,“我們排長孫峪凡是個(gè)幽默風(fēng)趣的人”,“聯(lián)合國秘書長安南就這一事件發(fā)表聲明”。在這些例子里,“演員,兒子,教授,同

10、事,排長,秘書長”,就是后面姓名的前置稱謂,也就是為姓名識別提供了前置稱謂信息。通過收集整理漢語常見前置稱謂信息,建立漢語前置稱謂庫。后置稱謂信息:姓名的后端多隨有對此人的職業(yè),職務(wù)以及同說話人的關(guān)系的稱謂?!按靼矠憣④娛强箲?zhàn)時(shí)期我國著名愛國抗日將領(lǐng)”,“國家衛(wèi)生廳高紀(jì)長廳長對這一事件表示關(guān)切”,“雷鋒同志是我們學(xué)習(xí)的好榜樣”,“香港企業(yè)家李嘉誠先生為貴州大學(xué)的教學(xué)設(shè)施基礎(chǔ)建設(shè)捐贈(zèng)了巨款”。在這些例子里,“將軍,廳長,同志,先生”,就是前面姓名的后置稱謂,也就是為姓名識別提供了后置稱謂信息。通過對漢語表達(dá)習(xí)慣的研究發(fā)現(xiàn)多數(shù)放在人名前的漢語稱謂不能放在人名之后,所以需將人名識別使用的前置稱謂信息

11、和后置稱謂信息分開,后置稱謂信息單獨(dú)列出,通過收集整理漢語常見后置稱謂信息,建立漢語后置稱謂庫。.成語(副詞短語)庫成語是漢語語言的精髓之一,數(shù)量眾多的成語在漢語中用途極為廣泛。漢語成語在句中既可以作為修飾成份,又可言簡意賅地代替表語賓語等成份獨(dú)立完成句子功能。在姓名識別中,某些成語專用于人的成語可以作為識別信息,其識別的準(zhǔn)確性相當(dāng)高。可以將可能姓氏成語,作為漢語姓名識別規(guī)則之一,產(chǎn)生規(guī)則化姓名識別的結(jié)果,納入姓名候選集。漢語姓名后面接的動(dòng)詞經(jīng)常被由成語組成的副詞短語所修飾,這些副詞短語一般都是“成語地”的結(jié)構(gòu),如: “王力意味深長地對他說”,“夏雨興高采烈地捧走了獎(jiǎng)狀”,“由于出色的個(gè)人能力

12、以及在學(xué)生會(huì)組織工作方面的突出成績,張鵬無可非議地成為下屆學(xué)生會(huì)主席的第一候選人”,“瞟了她一眼,秦漢若無其事地走了”,“李小雙鎮(zhèn)定自若地走上了比賽場地”。其中“意味深長,興高采烈,無可非議,若無其事,鎮(zhèn)定自若”就是這一類與地搭配形成副詞短語的成語。成語還可以在句子里代替謂語賓語,既:姓名+成語,這樣的結(jié)構(gòu)就可以構(gòu)成完整句子,如“對此李浩然無動(dòng)于衷”,“他們說吳冬刁鉆古怪,愛發(fā)牢騷”,“劉胡蘭寧死不屈,大義上刑場”,“崔安達(dá)才識過人,好讀古書”。其中“無動(dòng)于衷,刁鉆古怪,寧死不屈,才識過人”就是一些專用于人的能表達(dá)完整意思的成語。根據(jù)前面恰當(dāng)位置處的中文姓氏,加上后面跟的這些絕大多數(shù)情況下只用

13、于形容和描述人的副詞短語和成語,基本可以判斷前面為姓名以及姓名字串的長度。通過收集整理這些專用于人的成語,建立成語(副詞短語)庫。.其它信息庫上面建立的稱謂庫與成語庫可以對在文本中出現(xiàn)有著明顯可識別特征的中文姓名進(jìn)行識別,但實(shí)際研究發(fā)現(xiàn)姓名前后出現(xiàn)稱謂與成語的情況不占多數(shù),在沒有這些明顯特征的情況下進(jìn)行識別正是漢語文本中普通姓名識別的難點(diǎn)所在。對此通過對研究大量實(shí)際文本中姓名的構(gòu)成規(guī)律和上下文信息,總結(jié)出姓名識別可以依賴的一些其它識別信息,不但為前置稱謂等提供邊界劃定信息,而且通過對信息的嚴(yán)格選擇建立數(shù)據(jù)庫,形成獨(dú)立的漢語姓名識別規(guī)則,同稱謂和成語識別一樣為姓名候選集提供規(guī)則化識別結(jié)果。.特征

14、字:有相當(dāng)一部分字,如:“是,吧,說,叫,嚷,卻,便,沒,不,只”,作為姓名最后一個(gè)字的機(jī)率非常小,而又經(jīng)常出現(xiàn)在姓名的后面,可以利用它們來判斷前面的字符串是否為姓名。嚴(yán)格篩選收集這一些字詞,建立特征字庫。.特征字前置信息:有了特征字庫,就有了除稱謂和成語外判斷漢語姓名的最主要依據(jù)。但如果單獨(dú)使用特征字庫,在實(shí)際編程識別時(shí)會(huì)因?yàn)檫^分放松姓名識別限制而導(dǎo)致大量的非姓名字串被誤判別為候選姓名串而造成誤判。所以在特征字庫的基礎(chǔ)上,需要在上文中尋找其他信息,對姓名的識別加以其他的限制,這樣能大大減少誤判率和提高召回率和準(zhǔn)確率。通過收集整理這樣一些與特征字庫相對應(yīng)的前置信息,建立特征字前置信息庫。.提示

15、詞與特征字:在對姓名串前置稱謂等的判斷成功以后,需要對稱謂后面的姓名串進(jìn)行姓名右邊界的判斷,以取得正確長度的姓名串,這需要從下文中尋找其他信息以便劃定姓名的右邊界。這里的右邊界信息庫包括上面所有的特征字,但因?yàn)榍爸梅Q謂等的識別使得該字串是中文姓名的可能性很大,所以可放寬限制,在所有的特征字的基礎(chǔ)上再增加判斷字詞的數(shù)量,擴(kuò)充特征字庫,以適應(yīng)實(shí)際情況,提高判別率。根據(jù)研究,某些動(dòng)詞,介詞,副詞多跟在姓名和人稱代詞后,如:“是,吧,說,叫,嚷,卻,便,拿給,看,指出,告訴,通知”但同時(shí)又極少用于姓名串,如果在可能的姓名串后面出現(xiàn)這些字和詞,那絕大多數(shù)情況下它們都是姓名的右邊界,所以在對可能的姓名串進(jìn)

16、行初次判斷后,可以利用這些放在人名姓氏前或跟在人名或人稱代詞后的動(dòng)詞,介詞,副詞來判斷姓名串的右邊界。收集整理這一些字詞,建立提示詞與特征字庫。.常用姓用字和名用字頻率表對于給定的漢語文本,通過上面幾種不同的規(guī)則化姓名識別方法,可以粗略得到可能姓名的一個(gè)候選集。該集合中應(yīng)該已經(jīng)集中了絕大部分文本中的中文姓名,其包含中文姓名數(shù)量與文本中實(shí)際的姓名數(shù)量的比值就是姓名識別的召回率,最終的識別結(jié)果就從姓名候選集中篩選產(chǎn)生。作為姓名識別的最后一個(gè)環(huán)節(jié),要最大限度地排除姓名候選集中的誤判姓名串,在姓名識別中提高召回率和準(zhǔn)確率,需要為概率識別器建立一個(gè)中文姓名用字的量化信息庫,通過給定計(jì)算公式與閥值計(jì)算處理

17、候選集中的每個(gè)候選字符串,以量化的信息篩選候選集形成最終姓名識別結(jié)果。姓名用字的量化信息就是漢語姓名用字包括姓用字和名用字的使用頻率表,這樣的信息需要在現(xiàn)實(shí)生活中真實(shí)性的人名集中采集。為此收集整理本校在都學(xué)生名冊,共計(jì)7000余人,統(tǒng)計(jì)其中常用姓用字和名用字出現(xiàn)的頻率,生成一量化信息表,建立常用姓用字和名用字頻率表。今后還應(yīng)進(jìn)一步收集更多中文姓名進(jìn)行統(tǒng)計(jì)以更新該量化信息表,提高該數(shù)據(jù)庫的實(shí)用參考價(jià)值。.名人庫 在漢語文本中,名人姓名出現(xiàn)的頻率是很高的。如:“江澤民總書記昨天在戴維營會(huì)見了美國總統(tǒng)布什”,“醫(yī)學(xué)巨著本草綱目的作者是李時(shí)珍”,“哈姆雷特是沙士比亞的偉大劇作”,“農(nóng)民起義軍領(lǐng)袖洪秀全

18、建立了太平天國”“西班牙人塞戈維亞是二十世紀(jì)世界最偉大的吉他演奏家”,“納粹德國將軍隆美爾號稱沙漠之狐”,“卡斯特羅就巴美關(guān)系發(fā)表公眾演講”,“蘇聯(lián)宇航員加加林是人類首位太空人”,這里的“江澤民,布什,李時(shí)珍,沙士比亞,洪秀全,塞戈維亞,隆美爾,卡斯特羅,加加林”等等都是古今中外的名人。由于國外名人國內(nèi)已經(jīng)有統(tǒng)一的標(biāo)準(zhǔn)翻譯,所以國外名人姓名與國內(nèi)名人識別一樣,只要匹配就可以識別出來,相對于普通姓名識別來說較容易。此外,如果在識別出名人姓名后將該已識別姓名排除在普通姓名識別之外,可以減少對后面識別的干擾和處理數(shù)據(jù)量以提高后面處理速度與準(zhǔn)確率。因此,收集整理古今中外婦孺皆知的一千余位名人,建立名人

19、庫,作為資料庫對名人進(jìn)行直接匹配識別。.地名庫 地名識別與名人的識別類似,收集整理地名,建立地名庫,進(jìn)行直接匹配識別。對國外地名參照國內(nèi)統(tǒng)一的標(biāo)準(zhǔn)翻譯進(jìn)行收集。對地名的收集情況如下:區(qū)以上中國行政地名。包括:全國所有區(qū),縣,市,省,直轄市,自治區(qū),特別行政區(qū)。 中國著名地名集。包括:江,河,湖,海,名山,旅游景點(diǎn),歷史遺跡等著名地點(diǎn)地名。 世界著名地名集。包括:世界國名及首都集,世界著名城市集,世界名川大山,江河大海,世界名勝集。 地名的數(shù)量很龐大,在實(shí)際情況下,如果數(shù)據(jù)庫過大會(huì)嚴(yán)重影響識別速度,因此收集特別注意到收集最基本的最有名的和最有代表性的,以控制地名數(shù)量。在地名收集中側(cè)重于中國地名的

20、收集,對國外地名雖然已經(jīng)收集到近萬地名,一百四十多萬字的資料,但僅將最基本的和最有名的地名納入。由中國與世界地名集建立地名庫。二 程序開發(fā)工具與識別基本流程圖 .編程開發(fā)工具:使用 icrosoft 0 基于進(jìn)行編程開發(fā)。使用提供的ileDialog類和CstdioFile類來建立對話框形式的主程序框架,構(gòu)成輸入文檔,處理后輸出文檔的程序結(jié)構(gòu)。對漢語文本字符串進(jìn)行識別處理操作,主要使用功能強(qiáng)大的CString字符串處理類。運(yùn)用String類成員函數(shù)Find(),Mid(),Left(),Right(),Replace(),IsEmpty(),Empty()等對漢語文本字符串進(jìn)行操作處理。值得一

21、提的是,在各種信息庫收集整理過程中使用tring類制作許多文本處理小工具,大大提高了資料信息庫收集整理的速度。.基本文本處理方式:對待識別漢語文本逐行讀取處理。采取每行文本嫁接上一行文本末尾五個(gè)字的處理,以確保文本在自然換行的過程中不會(huì)丟失上下文信息和不會(huì)拆散需識別的姓名和地名。每行識別出來的名人名和地名直接輸出,而識別出來的普通姓名則納入姓名候選集,通過概率識別器進(jìn)行篩選識別,產(chǎn)生最終的識別結(jié)果。單行文本讀入.識別處理的基本流程圖:地名集地名庫地名識別處理名人名集名人庫名人名識別處理人名識別信息庫普通姓名候選集普通人名規(guī)則化識別化處理姓名用字頻率表概率識別篩選處理普通姓名集漢語文本姓名和地名

22、識別單行識別處理的基本流程圖本行識別完畢三.姓名與地名識別的編程實(shí)現(xiàn)Microsoft 公司的提供的類庫中的字符串處理ring類功能強(qiáng)大,為文本處理提供了數(shù)十個(gè)函數(shù),幾乎涵蓋了所有可能用到的對文本的處理操作。編寫程序?qū)h語文本的姓名識別等處理需要重視處理速度問題,處理速度快才有實(shí)用價(jià)值。如果全部使用提供的類成員函數(shù)來對文本進(jìn)行操作,必然減慢處理速度。因此,在實(shí)際編程開發(fā)中,通過對漢字存儲(chǔ)方法等方面的研究,采取類函數(shù)調(diào)用與優(yōu)化識別算法相結(jié)合的方式,在提高識別處理速度的方面取得了良好的效果。.識別準(zhǔn)備階段的程序.程序主框架的建立使用提供的ileDialog類和tdioFile類建立對話框形式的主程

23、序框架,用簡單的對話框構(gòu)成輸入待識別文檔TXT,處理后輸出識別姓名人名集TXT文檔的程序結(jié)構(gòu)。結(jié)束人名地名集合識別處理輸入輸出文本選擇識別信息庫讀入主程序框架建立開始.識別信息庫儲(chǔ)存方式與讀入.姓氏庫存儲(chǔ)與讀入:由于漢語姓氏是作為姓氏識別的觸發(fā)條件,在對每行文本的識別中,需逐一讀取單個(gè)漢字,然后再對之作是否為姓氏用字的判斷。若讀取一個(gè)單字之后使用循環(huán)查找法在姓氏庫中逐一查找匹配,對于一千字左右的姓氏庫,平均每個(gè)漢字的識別都需要數(shù)百次的查找匹配,其處理識別速度將慢到不能接受的程度。對漢字在計(jì)算機(jī)內(nèi)的存儲(chǔ)方式的研究發(fā)現(xiàn),每個(gè)漢字由兩個(gè)字節(jié)存儲(chǔ),每個(gè)字節(jié)以字符串方式存儲(chǔ)一個(gè)三位整數(shù),而兩個(gè)字節(jié)的信息

24、量就代表一個(gè)獨(dú)一無二的漢字。現(xiàn)利用這兩個(gè)三位整數(shù),在編程環(huán)境下利用tring類buf對象對漢字字節(jié)一級的操作,使用程序算法:tem1=unsigned char(Fbuf0);t1=int(tem1);tem2=unsigned char(Fbuf1);t2=int(tem2);index=(t1-176)*94+(t2-161);計(jì)算得到另一確定四位整數(shù)index對應(yīng)該漢字,也就為每個(gè)漢字計(jì)算出一個(gè)獨(dú)一無二的索引號。每個(gè)姓氏用結(jié)構(gòu)struct FN CString fn; int s; ;用以該索引號為下標(biāo)組成的FN數(shù)據(jù)類型的結(jié)構(gòu)數(shù)組fnlistindex來存儲(chǔ)。tring 類對象fn存儲(chǔ)單

25、字姓氏,如果讀入的是復(fù)姓,整型變量s存儲(chǔ)復(fù)姓除首字外的其余漢字的存儲(chǔ)單元的首下標(biāo)(因?yàn)閺?fù)姓較少,只需分配數(shù)個(gè)CString類對象數(shù)組存儲(chǔ)就可以了,如公可作單姓,也可作復(fù)姓首字: 公冶,公孫,公叔,公西,公良,分配五個(gè)CString類對象數(shù)組存儲(chǔ)就可以了),實(shí)現(xiàn)同一單姓用首字的多復(fù)姓姓氏的存儲(chǔ)。用索引號方法存儲(chǔ)每個(gè)姓氏后,在讀入文本單字,僅須用上面的索引號轉(zhuǎn)化算法將其對應(yīng)索引號idx算出,然后用fnlistidx.fn.IsEmpty() 判斷該結(jié)構(gòu)數(shù)組是否為空,如果不是空那么就可以斷定該單字為姓氏用字,再看s是否為,不為零的話說明是復(fù)姓用首字,就讀取文本下一個(gè)字,組成雙字與對應(yīng)復(fù)姓數(shù)組用for

26、循環(huán)逐一匹配識別,由于數(shù)據(jù)量極小,少數(shù)復(fù)姓的匹配識別對速度沒有太大影響。運(yùn)用索引號識別的方法,以一千余的姓氏庫為基礎(chǔ),對萬字左右的文本姓氏用字識別實(shí)驗(yàn)結(jié)果表明,識別出所有的姓氏用字并輸出僅用時(shí)秒,滿足識別速度上的要求。.信息庫存儲(chǔ):包括除姓氏庫之外其它所有識別用信息庫用CString類對象數(shù)組存儲(chǔ)CString calfist1000; /中文前置稱謂庫Cstring calbist1000; /中文后置稱謂庫CString adslist2000;/地址庫CString clylist1500;/名人庫CString vblist300;/提示詞與特征字庫CString svblist200

27、;/特征字庫CString pvblist300;/成語庫CString vflist100; /特征字前置信息運(yùn)用各種識別信息庫,在識別判斷時(shí)使用for循環(huán)進(jìn)行直接匹配,實(shí)驗(yàn)中發(fā)現(xiàn)速度較慢,但對數(shù)千字的文本,處理速度還可以接受。要提高識別速度,最好采用哈希表存儲(chǔ)信息庫,但該存儲(chǔ)結(jié)構(gòu)需要確定的信息庫,不能隨便修改和補(bǔ)充,這對經(jīng)常需要調(diào)整修改識別信息庫進(jìn)行普通姓名識別的實(shí)驗(yàn)不利。采用哈希表存儲(chǔ)信息庫可以在識別程序調(diào)試好以后,作為提高運(yùn)行速度進(jìn)行的優(yōu)化改進(jìn)。.信息庫讀入:所有的信息庫都以文本文檔方式存儲(chǔ)在源代碼文件下,例如:ads.txt(地名庫)的讀取,使用tdioFile類對象in的Open成

28、員函數(shù), Ain.Open("ads.txt",CFile:modeRead)打開姓氏庫,基本讀入程序: Ain.Open("ads.txt",CFile:modeRead);int a=0;while(Ain.ReadString(Abuf)/地名庫讀入 adslista=Abuf; a+;Ain.Close();實(shí)際程序運(yùn)行中,在點(diǎn)擊對話框上“中文地名姓名識別”控鍵后,程序自動(dòng)完成各種識別信息庫的讀入,作好識別信息庫的存儲(chǔ)準(zhǔn)備,并轉(zhuǎn)向等待用戶選擇待處理文本的模式。.識別程序以上準(zhǔn)備工作完成后,就可以讀入待識別文本進(jìn)行識別處理。通過CstdioFile

29、類inFile對象讀取待識別文本while(inFile.ReadString(buf),直到讀到文本的盡頭,如果讀取的buf是空,使用continue語句直接跳到過這一行繼續(xù)讀取下一行。將讀取的每一行文本漢字字符串存于tring類buf對象內(nèi)。buf是上一行的末尾五個(gè)字符與新讀取的漢字字符串的組合,后面程序?qū)ξ谋镜淖R別處理都通過buf來完成。在每行識別完畢以后,為了防止文本在自然換行的過程中丟失上下文信息和拆散需識別的姓名和地名,將該行末尾五個(gè)字符保存在tring類buf對象內(nèi),在下一行讀取識別時(shí),將buf嫁接在讀取的下一行字符串前,再對組合成的新漢字字符串進(jìn)行識別處理。.名人名和地名的識別

30、在普通人名識別之前,先進(jìn)行名人名地名的識別。使用buf.ind在for循環(huán)下搜索對應(yīng)數(shù)據(jù)庫直接匹配名人庫與地名庫,匹配成功就輸出,并將buf中的該字符串替換為空,以利后面識別。例如,名人名識別匹配程序:for(c1=0;c1<c;c1+)/該行是否有名人 t=buf.Find(clylistc1);if(!(t=-1)/如果有outFile.WriteString(clylistc1+" 名人"+"n"); buf.Replace(clylistc1,"");/將該名人名從該行中刪除名人名與地名識別完成后,處理過的buf進(jìn)入普通

31、人名識別階段。2.單姓姓名規(guī)則化識別首先對待處理的漢語字符串取長度,L=buf.GetLength(),用整型數(shù)i為下標(biāo)在0到L-1的范圍內(nèi)利用tring類buf對象bufi,對字符串進(jìn)行字節(jié)級的操作,將每個(gè)字節(jié)對應(yīng)的三位字符用C+強(qiáng)制類型轉(zhuǎn)換成對應(yīng)三位整數(shù),如:tm1=unsigned char(bufi-1);tp1=int(tm1) .半角符號的過濾:由于半角符號在計(jì)算機(jī)中用一個(gè)字節(jié)存儲(chǔ),而漢字是兩個(gè)字節(jié)存儲(chǔ),如不加以識別在實(shí)際運(yùn)行時(shí)程序就要出錯(cuò)。半角符號一般是標(biāo)點(diǎn)符號,數(shù)字或特殊符號,在漢語姓名識別過程中需將其過濾。對計(jì)算機(jī)中文本半角符號存儲(chǔ)方式研究發(fā)現(xiàn),通過上面的強(qiáng)制類型轉(zhuǎn)換出來的三

32、位整數(shù),如果是半角符號則小于整數(shù)128,所以用程序if(tp1<128) continue; 即可實(shí)現(xiàn)對半角符號的過濾。值得一提的是,全角符號在計(jì)算機(jī)中同漢字一樣也占兩個(gè)字節(jié),其存在并不影響識別所以可以忽略其存在。 .姓氏用字的識別.復(fù)姓姓名識別:在姓氏庫的讀入中已經(jīng)介紹過姓名用字的識別方法,在實(shí)際編程序中,如果當(dāng)前讀取的單字可以作復(fù)姓首字,那就需要讀取文本中的下一個(gè)字,以識別是否與當(dāng)前字組成復(fù)姓。如果確認(rèn)是復(fù)姓,則下次識別時(shí)跳過這個(gè)復(fù)姓。如果是雙字姓: if (! fnlistidx.fn.IsEmpty()/如果是單姓氏if(fnlistidx.s=s1)/如果下一個(gè)字為復(fù)姓用字 i

33、+=2;/不用再判斷下一字,直接跳過去 如果文本中識別出了復(fù)姓,除了極少數(shù)像“東方”,“皇甫”,“公羊”,“西門”,“東門”,“羊舌”,“南門”,“百里”等可能是漢語詞或姓名的復(fù)姓,其他復(fù)姓如果在文本中出現(xiàn)則是姓名用字的可能性幾乎是百分之百。所以在識別出是復(fù)姓用字后,對其后漢字串進(jìn)行提示詞與特征字查找,劃定右邊界就可以將姓名識別出來。.單字姓: 對復(fù)姓識別的前提是當(dāng)前的字已經(jīng)是單姓用字。單字姓名的識別放在復(fù)姓姓名識別之后,是該識別程序的核心部分。對可能的姓名串首先進(jìn)行規(guī)則化識別,用一組需嚴(yán)格匹配的規(guī)則對識別到的姓氏用字進(jìn)行前后信息的搜索查找后產(chǎn)生姓名候選集。.姓氏的確認(rèn):對待處理文本進(jìn)行前后信

34、息的搜索查找,如果姓氏用字的前面是前置稱謂或該姓氏用字的后二詞中包含后置稱謂,如:“導(dǎo)演吳擎說,該劇主角孫凡沒有得到觀眾的認(rèn)可,但配角關(guān)瑩瑩卻很受觀眾喜愛”,“香港企業(yè)家李嘉誠先生為貴州大學(xué)的教學(xué)設(shè)施基礎(chǔ)建設(shè)捐贈(zèng)了巨款”,其中在姓氏用字“吳,孫,關(guān)”前面搜索到前置稱謂“導(dǎo)演,主角,配角”,姓氏用字“李”后面搜索到后置稱謂“先生”,那么確認(rèn)“吳,孫,關(guān),李”為確定姓氏。如果在后面六個(gè)漢字中匹配到了專用于人的成語,如:“王俊峰意味深長地對他說”,姓氏用字“王”后面搜索到專用于人的成語“意味深長”,那么確認(rèn)“王”為確定姓氏。如果姓氏的前面無前置稱謂或該姓氏的后面也沒有匹配到后置稱謂和成語,但匹配到了

35、特征字那么稱該姓氏為可能姓氏。.可能姓氏確認(rèn):對由特征字得到的可能姓氏前面漢字串進(jìn)行特征字前置信息庫搜索查找,如果找到特征字前置信息,那將可能姓氏轉(zhuǎn)為確定姓氏。.姓名候選集的產(chǎn)生由前置稱謂確定的姓氏需劃定姓名右邊界以得到正確長度的姓名串,取姓氏后面從第二個(gè)字開始(假設(shè)為雙字姓名)的三個(gè)字符串,使用for循環(huán)查找提示詞與特征字,找到則從提示詞或特征字處劃定姓名串邊界并截取姓名。如:“導(dǎo)演吳擎說,該劇主角孫凡沒有得到觀眾的認(rèn)可,但配角關(guān)瑩瑩卻很受觀眾喜愛”,對確定姓氏“吳”,從“擎”搜索后面的的漢字串,找到特征字“說”,就截取“說”前面的漢字串,得到正確的姓名“吳擎”,對確定姓氏“孫”,從“凡”搜

36、索后面的的漢字串,找到特征字“沒”,就截取“沒”前面的漢字串,得到正確的姓名“孫凡”,類似的由前置稱謂“配角”和特征字“卻”可以得到正確的姓名“關(guān)瑩瑩”。這些已劃定右邊界后截取的姓名串就可以放入姓名候選集中。用后置稱謂或成語以及特征字前置信息和特征字識別的確定姓氏,由于右邊界已分別由后置稱謂或成語或特征字確定,直接截取姓名串放入姓名候選集中。.規(guī)則化姓名候選集識別C+核心程序作為普通漢語姓名識別的核心,該程序在編寫時(shí)就很注重文檔和注釋,以便于編寫調(diào)試和他人閱讀理解。在本文中通過其詳細(xì)的注釋就直接可以說明對已識別的姓氏用字進(jìn)行姓氏確認(rèn)和產(chǎn)生姓名候選集的程序?qū)崿F(xiàn)過程。以下是單姓姓名規(guī)則化識別基本流

37、程圖和程序。特征字搜索判斷后置信息搜索判斷后置成語搜索判斷前置信息搜索判斷姓名用字識別結(jié)束開始特征字前置信息搜索姓名串右邊界劃定單姓姓名規(guī)則化識別基本流程圖普通姓名候選集/單姓前置信息判斷if(i>=5) /若該可能姓氏的左邊漢字?jǐn)?shù)不低于二 Tbuf=buf.Left(i-1);/取可能姓氏的左邊字符串 for(c1=0;c1<cf;c1+) f=Tbuf.Find(calfistc1);/搜索前面是否有前置稱謂 if(!(f=-1)/有前置稱謂 ls=calfistc1.GetLength();/取該稱謂長度 if(f+ls=i-1)/如果該稱謂在可能姓名串前面 Tbuf=buf

38、.Mid(i+3,4);/取姓氏后面字串 for(v1=0;v1<v;v1+) f1=Tbuf.Find(vblistv1); /搜索 if(f1!=-1) break;/如果找到提示動(dòng)詞與特征字 /姓名右邊界判斷 if(f1!=-1) Tbuf=buf.Mid(i-1,f1+4);/取姓名串 else Tbuf=buf.Mid(i-1,6);/沒有找到 outFile.WriteString(Tbuf+"n");/則取三個(gè)字 confirm=true;/姓名串確認(rèn) i+=5;/跳過已識別姓名 /前置稱謂判斷識別結(jié)束/單字姓前置信息判斷結(jié)束 if(confirm) c

39、ontinue;/若已識別,跳過/后置信息判斷if(i+5<L&&!confirm) /如果未識別 /且可能姓名串后面還有后置稱謂的位置 for(c1=0;c1<cb;c1+)/搜索后面是否有后置稱謂 f=buf.Find(calbistc1,i+3); /假設(shè)是單名if(!(f=-1)&&(f<=i+3|f<=i+5)/如果有 /且跟在可能姓名串的后面 Tbuf=buf.Mid(i-1,f-i+1); i=f+1;/跳過已識別的姓名 outFile.WriteString(Tbuf+"n"); confirm=tru

40、e;/確認(rèn),輸出姓名串 /特征字庫與成語(副詞短語庫)判斷 if(!confirm) /特征字庫判斷 f1=-1;Tbuf=buf.Mid(i+3,4); /初始化,并取可能姓氏后面兩個(gè)字符 for(sv1=0;sv1<sv;sv1+)/用后置特征字來判斷是否為姓名 /姓名右邊界判定 f1=Tbuf.Find(svblistsv1);if(f1!=-1) break;/如果找到特征字 /提前結(jié)束循環(huán)if(f1!=-1)/找到 Tbuf=buf.Left(i-1);/特征字前置信息搜索 for(vf1=0;vf1<vf;vf+) f2=Tbuf.Find(vflistvf1); if

41、(f2!=-1&&f2=i-3)/如果找到,且在可能姓名的前面 confirm=true; break;/姓名確定 if(confirm)/如果已識別 Tbuf=buf.Mid(i-1,f1+4);/取姓名串 outFile.WriteString(Tbuf+"n");i=i+2+f1;/跳過已識別姓名 /特征字判定結(jié)束 if(i+12<L&&!confirm)/如果可能姓名串后面還有四個(gè)字以上 /進(jìn)行成語搜索判斷 f1=-1; Tbuf=buf.Mid(i+1,12);/初始化,取可能姓氏后面六個(gè)漢字串 for(pv1=0;pv1<pv;pv1+)/用成語來判斷是否為姓名 f1=Tbuf.Find(pvblistpv1); if(f1!=-1) break;/如果找到成語,結(jié)束循環(huán)/姓名右邊界判斷 if(f1!=-1) Tbuf=buf.Mid

溫馨提示

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

評論

0/150

提交評論