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

下載本文檔

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

文檔簡介

1、 漢語文本的中文姓名和地名識別與編程實現(xiàn)貴州大學信息與計算機科學學院計算機科學系一九九九級羅星漢學號: 指導老師: 陳笑蓉副教授摘要:本文介紹漢語文本的中文姓名和地名計算機自動識別的方法,重點介紹普通漢語姓名的識別,并對實現(xiàn)計算機自動識別使用的編程技術(shù)方法進行分析說明,附有詳細注釋的程序核心源代碼。關(guān)鍵詞:中文信息計算機自動處理,分詞,規(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. 引言 中華民族五千年燦爛的文明歷史,誕生無數(shù)文化瑰寶,漢語

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

24、量就代表一個獨一無二的漢字。現(xiàn)利用這兩個三位整數(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);計算得到另一確定四位整數(shù)index對應該漢字,也就為每個漢字計算出一個獨一無二的索引號。每個姓氏用結(jié)構(gòu)struct FN CString fn; int s; ;用以該索引號為下標組成的FN數(shù)據(jù)類型的結(jié)構(gòu)數(shù)組fnlistindex來存儲。tring 類對象fn存儲單

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

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

27、;/特征字庫CString pvblist300;/成語庫CString vflist100; /特征字前置信息運用各種識別信息庫,在識別判斷時使用for循環(huán)進行直接匹配,實驗中發(fā)現(xiàn)速度較慢,但對數(shù)千字的文本,處理速度還可以接受。要提高識別速度,最好采用哈希表存儲信息庫,但該存儲結(jié)構(gòu)需要確定的信息庫,不能隨便修改和補充,這對經(jīng)常需要調(diào)整修改識別信息庫進行普通姓名識別的實驗不利。采用哈希表存儲信息庫可以在識別程序調(diào)試好以后,作為提高運行速度進行的優(yōu)化改進。.信息庫讀入:所有的信息庫都以文本文檔方式存儲在源代碼文件下,例如: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();實際程序運行中,在點擊對話框上“中文地名姓名識別”控鍵后,程序自動完成各種識別信息庫的讀入,作好識別信息庫的存儲準備,并轉(zhuǎn)向等待用戶選擇待處理文本的模式。.識別程序以上準備工作完成后,就可以讀入待識別文本進行識別處理。通過CstdioFile

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

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

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

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

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

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

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

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

37、程圖和程序。特征字搜索判斷后置信息搜索判斷后置成語搜索判斷前置信息搜索判斷姓名用字識別結(jié)束開始特征字前置信息搜索姓名串右邊界劃定單姓姓名規(guī)則化識別基本流程圖普通姓名候選集/單姓前置信息判斷if(i>=5) /若該可能姓氏的左邊漢字數(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;/如果找到提示動詞與特征字 /姓名右邊界判斷 if(f1!=-1) Tbuf=buf.Mid(i-1,f1+4);/取姓名串 else Tbuf=buf.Mid(i-1,6);/沒有找到 outFile.WriteString(Tbuf+"n");/則取三個字 confirm=true;/姓名串確認 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;/確認,輸出姓名串 /特征字庫與成語(副詞短語庫)判斷 if(!confirm) /特征字庫判斷 f1=-1;Tbuf=buf.Mid(i+3,4); /初始化,并取可能姓氏后面兩個字符 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)/如果可能姓名串后面還有四個字以上 /進行成語搜索判斷 f1=-1; Tbuf=buf.Mid(i+1,12);/初始化,取可能姓氏后面六個漢字串 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)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論