用拼音输入法字典库实现同音字模糊查询
生活随笔
收集整理的這篇文章主要介紹了
用拼音输入法字典库实现同音字模糊查询
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在開發各類應用管理系統中,一般都要實現各種查詢功能,如何準確、快速查找到符合條件的記錄,是實現各種查詢功能的重點。系統的實際開發過程中,查詢功能一般都是通過對字符進行比較、判斷等方法來實現。我們開發一個人事管理系統中過程中,系統要具有新的查詢方式,即只要知道一個人姓名的讀音,并不知道每個字的具體寫法,通過檢索數據庫,就能把所有符合這個讀音的記錄內容全部顯示出來。由于漢字存在著大量的同音字,采用常用的字符比較法,如查找一個名叫“李曉軍”的人,數據庫中存在的叫“李小君”的數據就不能查到,利用常用的查詢方法實現不了同音字的查詢功能。為了解決同音字的模糊查詢問題,筆者借用WINDOWS系統下的輸入法生成器,將系統中的拼音輸入法字典庫,生成了一個拼音查詢字典庫,利用這個拼音查詢字典庫,在使用VFP數據庫管理系統編寫的人事管理系統中,輕松實現了按語音進行模糊查詢功能,具體思路如下:
---- 一、首先要生成一個拼音字典查詢數據庫
---- 選擇WINDOWS系統的開始—程序—附件—輸入法生成器,進入輸入法生成器窗口,使用鼠標點擊逆轉換的頁框,點擊打開文件按鈕,選中硬盤WINDOWS/SYSTEM文件夾下的WINPY.MB文件,在碼表原文件中輸入C:/WINPY.TXT,輸入完畢后點擊逆轉換,此時系統對全拼字典庫進行轉換,最后將生成一個純文本文件,利用這個純文本文件編寫一段小程序即可生成一個拼音字典查詢數據庫。
---- 二、進入VFP系統,編寫一段生成程序命令為ZH.PRG
---- 程序中的內容如下所列:
---- CREA TABL B1 (NR C(60),HZ C(2),PY1 C(12),PY2 C(12))&&創建一個臨時數據庫
---- USE B1 &&打開生成的數據庫
---- APPE FROM C:/WINPY.TXT SDF
---- &&將利用輸入法生成器生成的字典碼文件WINPY.TXT文件內容追加到數據庫中
---- DELE FOR ASC(SUBS(NR,3,1)) >=128
---- &&在數據庫中刪除全部詞組內容,只留下單字 DELE FOR RECN()< 13 &&在數據庫刪除編碼庫的頭文件
---- PACK &&清除打了刪除標記的記錄。
---- REPL HZ WITH SUBS(NR,1,2),PY1 WITH SUBS(NR,3,AT(' ',NR)-2),;
---- PY2 WITH SUBS(NR,AT(' ',NR)+1) ALL
---- &&將漢字與拼音存放在不同的字段里,這里拼音有兩個字段,其中有一個為同音字。
---- 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 &&生成一個拼音查詢數據庫
---- USE &&關閉打開的數據庫
---- ERASE 'B1.DBF' &&刪除生成的臨過數據庫
---- 在VFP中命令窗口中,執行上面這段程序系統將自動生成一個拼音查詢庫,并將這個數據庫命名為PYZDK.DBF。
---- 三、新建一個表單
---- 在數據環境中加入“人員情況表”和“PYZDK”,兩個數據庫,在人員情況表中存在需要有查詢的人員姓名字段,字段名為NAME,標志位字段,字段名為BZW。
---- 在表單上新建一個LABEL1對象用來提示“請輸入要查詢的姓名”;一個文本框用來輸入要查詢的字符內容;一個表格對像,用來顯示人員情況表數據庫中的內容,兩個命令按鈕,COMMAND2用來執行查詢過程文件,COMMAND1用來退出查詢窗口。
---- COMMAND1命令按鈕屬性設置如下:
COMMAND1.CAPTION=’退出’
在COMMAND1命令按鈕的.CLICK事件中寫入代碼
THISFORM.RELEASE
COMMAND2命令按鈕屬性設置如下:
COMMAND2.CAPTION=’開始查詢’
在COMMAND2命令按鈕的CLICK事件中寫入代碼:
IF THIS.CAPTION='開始查詢'
??? THIS.CAPTION='恢復數據'
??? 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='開始查詢'
??? SELE 人員情況表
??? SET FILT TO
??? GO TOP
??? THISFORM.REFRESH
ENDIF
---- 全部設置完畢后,執行這個程序,在文本框中輸入要查詢的關鍵字,點擊查詢命令按鈕,這時表格中顯示的將是符合查詢關鍵字的全部內容,再次點擊這個命令按鈕,表格中將恢復顯示全部數據內容,點擊退出系統命令按鈕,將退出系統。
---- 四、查詢程序實現的原理
---- 在系統中提供的編輯框中輸入要查詢的關鍵字,如果在一個人員數據庫中查詢一個姓名音為“李曉軍”的人員,首先在生成的拼音查詢數據庫中找輸入第一個漢字在字典庫中的位置,利用這個漢字的讀音,對字典庫記錄內容進行過濾,這樣字典庫中只有符合這個漢字讀音的全部漢字,利用一個循環,將全部同音字相加生成一個字符串送到一個變量中,繼續對另外輸入的漢字進行同樣的處理,最后根據輸入漢字的多少,生成多個字符串變量。生成字符串變量后,開始檢索你要查詢的數據庫,將數據庫中每人的姓名拆開分別與生成的字符串進行判斷,只有當數據庫中一個人的姓名全部字符都能在相應的字符串中查找到,那么這條記錄就符合查找的條件,打上一個標識,比較下一條記錄,循環到數據庫的結尾,這時就可以將所有做了查詢標記的數據庫內容顯示出來,即實現了按語音模糊查詢的方法。
---- 上面簡要介紹了在VFP系統中,實現按語音模糊查詢的一種方法,在程序中并沒有考慮容錯性,在這里只是提供了一種思路,讀者根據以上實現語音查詢的原理,根據實際工作的需要實現不同形式的語音模糊查詢方式。
---- 一、首先要生成一個拼音字典查詢數據庫
---- 選擇WINDOWS系統的開始—程序—附件—輸入法生成器,進入輸入法生成器窗口,使用鼠標點擊逆轉換的頁框,點擊打開文件按鈕,選中硬盤WINDOWS/SYSTEM文件夾下的WINPY.MB文件,在碼表原文件中輸入C:/WINPY.TXT,輸入完畢后點擊逆轉換,此時系統對全拼字典庫進行轉換,最后將生成一個純文本文件,利用這個純文本文件編寫一段小程序即可生成一個拼音字典查詢數據庫。
---- 二、進入VFP系統,編寫一段生成程序命令為ZH.PRG
---- 程序中的內容如下所列:
---- CREA TABL B1 (NR C(60),HZ C(2),PY1 C(12),PY2 C(12))&&創建一個臨時數據庫
---- USE B1 &&打開生成的數據庫
---- APPE FROM C:/WINPY.TXT SDF
---- &&將利用輸入法生成器生成的字典碼文件WINPY.TXT文件內容追加到數據庫中
---- DELE FOR ASC(SUBS(NR,3,1)) >=128
---- &&在數據庫中刪除全部詞組內容,只留下單字 DELE FOR RECN()< 13 &&在數據庫刪除編碼庫的頭文件
---- PACK &&清除打了刪除標記的記錄。
---- REPL HZ WITH SUBS(NR,1,2),PY1 WITH SUBS(NR,3,AT(' ',NR)-2),;
---- PY2 WITH SUBS(NR,AT(' ',NR)+1) ALL
---- &&將漢字與拼音存放在不同的字段里,這里拼音有兩個字段,其中有一個為同音字。
---- 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 &&生成一個拼音查詢數據庫
---- USE &&關閉打開的數據庫
---- ERASE 'B1.DBF' &&刪除生成的臨過數據庫
---- 在VFP中命令窗口中,執行上面這段程序系統將自動生成一個拼音查詢庫,并將這個數據庫命名為PYZDK.DBF。
---- 三、新建一個表單
---- 在數據環境中加入“人員情況表”和“PYZDK”,兩個數據庫,在人員情況表中存在需要有查詢的人員姓名字段,字段名為NAME,標志位字段,字段名為BZW。
---- 在表單上新建一個LABEL1對象用來提示“請輸入要查詢的姓名”;一個文本框用來輸入要查詢的字符內容;一個表格對像,用來顯示人員情況表數據庫中的內容,兩個命令按鈕,COMMAND2用來執行查詢過程文件,COMMAND1用來退出查詢窗口。
---- COMMAND1命令按鈕屬性設置如下:
COMMAND1.CAPTION=’退出’
在COMMAND1命令按鈕的.CLICK事件中寫入代碼
THISFORM.RELEASE
COMMAND2命令按鈕屬性設置如下:
COMMAND2.CAPTION=’開始查詢’
在COMMAND2命令按鈕的CLICK事件中寫入代碼:
IF THIS.CAPTION='開始查詢'
??? THIS.CAPTION='恢復數據'
??? 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='開始查詢'
??? SELE 人員情況表
??? SET FILT TO
??? GO TOP
??? THISFORM.REFRESH
ENDIF
---- 全部設置完畢后,執行這個程序,在文本框中輸入要查詢的關鍵字,點擊查詢命令按鈕,這時表格中顯示的將是符合查詢關鍵字的全部內容,再次點擊這個命令按鈕,表格中將恢復顯示全部數據內容,點擊退出系統命令按鈕,將退出系統。
---- 四、查詢程序實現的原理
---- 在系統中提供的編輯框中輸入要查詢的關鍵字,如果在一個人員數據庫中查詢一個姓名音為“李曉軍”的人員,首先在生成的拼音查詢數據庫中找輸入第一個漢字在字典庫中的位置,利用這個漢字的讀音,對字典庫記錄內容進行過濾,這樣字典庫中只有符合這個漢字讀音的全部漢字,利用一個循環,將全部同音字相加生成一個字符串送到一個變量中,繼續對另外輸入的漢字進行同樣的處理,最后根據輸入漢字的多少,生成多個字符串變量。生成字符串變量后,開始檢索你要查詢的數據庫,將數據庫中每人的姓名拆開分別與生成的字符串進行判斷,只有當數據庫中一個人的姓名全部字符都能在相應的字符串中查找到,那么這條記錄就符合查找的條件,打上一個標識,比較下一條記錄,循環到數據庫的結尾,這時就可以將所有做了查詢標記的數據庫內容顯示出來,即實現了按語音模糊查詢的方法。
---- 上面簡要介紹了在VFP系統中,實現按語音模糊查詢的一種方法,在程序中并沒有考慮容錯性,在這里只是提供了一種思路,讀者根據以上實現語音查詢的原理,根據實際工作的需要實現不同形式的語音模糊查詢方式。
總結
以上是生活随笔為你收集整理的用拼音输入法字典库实现同音字模糊查询的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [vue] 你知道nextTick的原理
- 下一篇: [css] 你对响应式设计的理解是什么