日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

用拼音输入法字典库实现同音字模糊查询

發(fā)布時(shí)間:2023/12/9 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 用拼音输入法字典库实现同音字模糊查询 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
在開(kāi)發(fā)各類(lèi)應(yīng)用管理系統(tǒng)中,一般都要實(shí)現(xiàn)各種查詢功能,如何準(zhǔn)確、快速查找到符合條件的記錄,是實(shí)現(xiàn)各種查詢功能的重點(diǎn)。系統(tǒng)的實(shí)際開(kāi)發(fā)過(guò)程中,查詢功能一般都是通過(guò)對(duì)字符進(jìn)行比較、判斷等方法來(lái)實(shí)現(xiàn)。我們開(kāi)發(fā)一個(gè)人事管理系統(tǒng)中過(guò)程中,系統(tǒng)要具有新的查詢方式,即只要知道一個(gè)人姓名的讀音,并不知道每個(gè)字的具體寫(xiě)法,通過(guò)檢索數(shù)據(jù)庫(kù),就能把所有符合這個(gè)讀音的記錄內(nèi)容全部顯示出來(lái)。由于漢字存在著大量的同音字,采用常用的字符比較法,如查找一個(gè)名叫“李曉軍”的人,數(shù)據(jù)庫(kù)中存在的叫“李小君”的數(shù)據(jù)就不能查到,利用常用的查詢方法實(shí)現(xiàn)不了同音字的查詢功能。為了解決同音字的模糊查詢問(wèn)題,筆者借用WINDOWS系統(tǒng)下的輸入法生成器,將系統(tǒng)中的拼音輸入法字典庫(kù),生成了一個(gè)拼音查詢字典庫(kù),利用這個(gè)拼音查詢字典庫(kù),在使用VFP數(shù)據(jù)庫(kù)管理系統(tǒng)編寫(xiě)的人事管理系統(tǒng)中,輕松實(shí)現(xiàn)了按語(yǔ)音進(jìn)行模糊查詢功能,具體思路如下:

---- 一、首先要生成一個(gè)拼音字典查詢數(shù)據(jù)庫(kù)

---- 選擇WINDOWS系統(tǒng)的開(kāi)始—程序—附件—輸入法生成器,進(jìn)入輸入法生成器窗口,使用鼠標(biāo)點(diǎn)擊逆轉(zhuǎn)換的頁(yè)框,點(diǎn)擊打開(kāi)文件按鈕,選中硬盤(pán)WINDOWS/SYSTEM文件夾下的WINPY.MB文件,在碼表原文件中輸入C:/WINPY.TXT,輸入完畢后點(diǎn)擊逆轉(zhuǎn)換,此時(shí)系統(tǒng)對(duì)全拼字典庫(kù)進(jìn)行轉(zhuǎn)換,最后將生成一個(gè)純文本文件,利用這個(gè)純文本文件編寫(xiě)一段小程序即可生成一個(gè)拼音字典查詢數(shù)據(jù)庫(kù)。

---- 二、進(jìn)入VFP系統(tǒng),編寫(xiě)一段生成程序命令為ZH.PRG

---- 程序中的內(nèi)容如下所列:

---- CREA TABL B1 (NR C(60),HZ C(2),PY1 C(12),PY2 C(12))&&創(chuàng)建一個(gè)臨時(shí)數(shù)據(jù)庫(kù)

---- USE B1 &&打開(kāi)生成的數(shù)據(jù)庫(kù)

---- APPE FROM C:/WINPY.TXT SDF

---- &&將利用輸入法生成器生成的字典碼文件WINPY.TXT文件內(nèi)容追加到數(shù)據(jù)庫(kù)中

---- DELE FOR ASC(SUBS(NR,3,1)) >=128

---- &&在數(shù)據(jù)庫(kù)中刪除全部詞組內(nèi)容,只留下單字 DELE FOR RECN()< 13 &&在數(shù)據(jù)庫(kù)刪除編碼庫(kù)的頭文件

---- PACK &&清除打了刪除標(biāo)記的記錄。

---- REPL HZ WITH SUBS(NR,1,2),PY1 WITH SUBS(NR,3,AT(' ',NR)-2),;

---- PY2 WITH SUBS(NR,AT(' ',NR)+1) ALL

---- &&將漢字與拼音存放在不同的字段里,這里拼音有兩個(gè)字段,其中有一個(gè)為同音字。

---- REPL NR1 WITH ‘s’+SUBS(NR1,3) FOR “sh”$NR1

---- &&為了照顧南方口音的人員使用,可將全部zh,ch,sh替換成z,c,s

---- REPL NR1 WITH ‘c’+SUBS(NR1,3) FOR “ch”$NR1

---- REPL NR1 WITH ‘z’+SUBS(NR1,3) FOR “zh”$NR1

---- REPL NR2 WITH ‘s’+SUBS(NR2,3) FOR “sh”$NR2

---- REPL NR2 WITH ‘c’+SUBS(NR2,3) FOR “ch”$NR2

---- REPL NR2 WITH ‘z’+SUBS(NR2,3) FOR “zh”$NR2

---- COPY TO PYZDK FIEL HZ,PY1,PY2 &&生成一個(gè)拼音查詢數(shù)據(jù)庫(kù)

---- USE &&關(guān)閉打開(kāi)的數(shù)據(jù)庫(kù)

---- ERASE 'B1.DBF' &&刪除生成的臨過(guò)數(shù)據(jù)庫(kù)

---- 在VFP中命令窗口中,執(zhí)行上面這段程序系統(tǒng)將自動(dòng)生成一個(gè)拼音查詢庫(kù),并將這個(gè)數(shù)據(jù)庫(kù)命名為PYZDK.DBF。

---- 三、新建一個(gè)表單

---- 在數(shù)據(jù)環(huán)境中加入“人員情況表”和“PYZDK”,兩個(gè)數(shù)據(jù)庫(kù),在人員情況表中存在需要有查詢的人員姓名字段,字段名為NAME,標(biāo)志位字段,字段名為BZW。

---- 在表單上新建一個(gè)LABEL1對(duì)象用來(lái)提示“請(qǐng)輸入要查詢的姓名”;一個(gè)文本框用來(lái)輸入要查詢的字符內(nèi)容;一個(gè)表格對(duì)像,用來(lái)顯示人員情況表數(shù)據(jù)庫(kù)中的內(nèi)容,兩個(gè)命令按鈕,COMMAND2用來(lái)執(zhí)行查詢過(guò)程文件,COMMAND1用來(lái)退出查詢窗口。

---- COMMAND1命令按鈕屬性設(shè)置如下:

COMMAND1.CAPTION=’退出’
在COMMAND1命令按鈕的.CLICK事件中寫(xiě)入代碼
THISFORM.RELEASE
COMMAND2命令按鈕屬性設(shè)置如下:
COMMAND2.CAPTION=’開(kāi)始查詢’
在COMMAND2命令按鈕的CLICK事件中寫(xiě)入代碼:
IF THIS.CAPTION='開(kāi)始查詢'
??? THIS.CAPTION='恢復(fù)數(shù)據(jù)'
??? SRNR=ALLT(THISFORM.TEXT1.VALUE)
??? ZDD=LEN(SRNR)/2
??? DIME HH(100)
??? HH=''
??? FOR I=1 TO LEN(SRNR)/2
?????? ABC=SUBS(SRNR,I*2-1,2)
?????? SELE PYZDK
?????? SET FILT TO
?????? LOCA FOR ABC$HZ
?????? PYNR1=PY1
?????? PYNR2=PY2
?????? IF PYNR2< >' '
????????? SET FILT TO PY1=PYNR1 OR PY2=PYNR2
?????? ELSE
????????? SET FILT TO PY1=PYNR1
?????? ENDIF
?????? GO TOP
?????? DO WHIL NOT EOF()
????????? HH(I)=HH(I)+HZ
????????? SKIP
?????? ENDDO
??? ENDFOR
??? SELE 人員情況表
??? SET FILT TO
??? REPL BZW WITH '' ALL
??? GO TOP
??? DO WHIL NOT EOF()
?????? JSQ=0
?????? FOR I=1 TO LEN(ALLT(NAME))/2
???????? IF SUBS(YXMM,I*2-1,2)$HH(I)
?????????? JSQ=JSQ+1
???????? ENDIF
?????? ENDFOR
?????? IF JSQ=LEN(ALLT(NAME))/2 OR JSQ >=ZDD
????????? REPL BZW WITH '*'
?????? ENDIF
?????? SKIP
??? ENDDO
??? SET FILT TO BZW="*"
??? THISFORM.REFRESH
ELSE
??? THIS.CAPTION='開(kāi)始查詢'
??? SELE 人員情況表
??? SET FILT TO
??? GO TOP
??? THISFORM.REFRESH
ENDIF
---- 全部設(shè)置完畢后,執(zhí)行這個(gè)程序,在文本框中輸入要查詢的關(guān)鍵字,點(diǎn)擊查詢命令按鈕,這時(shí)表格中顯示的將是符合查詢關(guān)鍵字的全部?jī)?nèi)容,再次點(diǎn)擊這個(gè)命令按鈕,表格中將恢復(fù)顯示全部數(shù)據(jù)內(nèi)容,點(diǎn)擊退出系統(tǒng)命令按鈕,將退出系統(tǒng)。

---- 四、查詢程序?qū)崿F(xiàn)的原理

---- 在系統(tǒng)中提供的編輯框中輸入要查詢的關(guān)鍵字,如果在一個(gè)人員數(shù)據(jù)庫(kù)中查詢一個(gè)姓名音為“李曉軍”的人員,首先在生成的拼音查詢數(shù)據(jù)庫(kù)中找輸入第一個(gè)漢字在字典庫(kù)中的位置,利用這個(gè)漢字的讀音,對(duì)字典庫(kù)記錄內(nèi)容進(jìn)行過(guò)濾,這樣字典庫(kù)中只有符合這個(gè)漢字讀音的全部漢字,利用一個(gè)循環(huán),將全部同音字相加生成一個(gè)字符串送到一個(gè)變量中,繼續(xù)對(duì)另外輸入的漢字進(jìn)行同樣的處理,最后根據(jù)輸入漢字的多少,生成多個(gè)字符串變量。生成字符串變量后,開(kāi)始檢索你要查詢的數(shù)據(jù)庫(kù),將數(shù)據(jù)庫(kù)中每人的姓名拆開(kāi)分別與生成的字符串進(jìn)行判斷,只有當(dāng)數(shù)據(jù)庫(kù)中一個(gè)人的姓名全部字符都能在相應(yīng)的字符串中查找到,那么這條記錄就符合查找的條件,打上一個(gè)標(biāo)識(shí),比較下一條記錄,循環(huán)到數(shù)據(jù)庫(kù)的結(jié)尾,這時(shí)就可以將所有做了查詢標(biāo)記的數(shù)據(jù)庫(kù)內(nèi)容顯示出來(lái),即實(shí)現(xiàn)了按語(yǔ)音模糊查詢的方法。

---- 上面簡(jiǎn)要介紹了在VFP系統(tǒng)中,實(shí)現(xiàn)按語(yǔ)音模糊查詢的一種方法,在程序中并沒(méi)有考慮容錯(cuò)性,在這里只是提供了一種思路,讀者根據(jù)以上實(shí)現(xiàn)語(yǔ)音查詢的原理,根據(jù)實(shí)際工作的需要實(shí)現(xiàn)不同形式的語(yǔ)音模糊查詢方式。

總結(jié)

以上是生活随笔為你收集整理的用拼音输入法字典库实现同音字模糊查询的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。