Re: Phonetic Lookups

Area:    Quik_Bas
  Msg:    #166
 Date:    05-25-92 08:23 (Public) 
 From:    Quinn Tyler Jackson      
 To:      Mike Kruppenbacher       
 Subject: Re: Phonetic Lookups     
 MK> hehe.. I never said mine was the BEST approach.. thats 
 MK> why I am on this echo, anything ONE programmer can 
 MK> think of, ANOTHER programmer can make better..  hehe..

Mine wasn't the BEST either.  Perhaps faster, but only an alternative.  BTW, 
I took the liberty of downloading a 240,000 word dictionary 
from a local BBS.  This I then converted into 18 random 
access files.  I then construed a program that can find 
words related to any 4 to 18 letter word, based on your 
algo.  It is quite fast on a 12 MHZ, with no one word 
taking more than a minute to be broken down.  It searches 
first ?ELLO, then H?LLO, then HEL?O, etc.

I shall post the code, which, as I said, requires dictionaries entitled:

OMNI.3 through OMNI.17 

(Omni.3 is a list of 3 letter words, omni.4 is a list of 
four letter words....)

Here is the full, functional code, which can be modified 
and improved upon, especially the WORD function, which has 
to use SELECT CASE in a horrible fashion, due to field 
length restrictions....  

----CUT HERE-----

' Phonetic Associative Search, as Inspired by Drask
DECLARE SUB assoc (key$)
DECLARE FUNCTION bisearch& (key$)
DECLARE FUNCTION word$ (ptr&, length&)

'DEFLNG is required only if any of the dictionary files has more than
' an INTeger number of entries.  Mine do....
DEFLNG A-Z


FOR q = 3 TO 17
file = q - 2
OPEN "c:\test\omni." + RTRIM$(LTRIM$(STR$(q))) FOR RANDOM AS (file) LEN = q
NEXT q

DO
CLS
INPUT key$
assoc key$
LOOP

SUB assoc (key$)
' This is the meat of it
' For every letter in HELLO, cycle through, change from AELLO to ZELLO
' then, next letter, from HALLO to HZLLO, etc....

FOR y = 1 TO LEN(key$)
test$ = key$
FOR x = 1 TO 26
MID$(test$, y) = CHR$(96 + x)
SELECT CASE test$
        CASE IS <> key$
                'we found a word, so print it out!
                IF (bisearch(test$)) <> 0 THEN PRINT test$
END SELECT
NEXT
NEXT
END SUB

FUNCTION bisearch (key$)
length = LEN(key$)
hi = LOF(length - 2) \ length
DO
ptr = (hi + lo) \ 2
comparator$ = (word(ptr, length))
SELECT CASE key$
        CASE IS < comparator$
        hi = ptr
        CASE IS > comparator$
        lo = ptr
        CASE IS = comparator$
        flag = 1
        EXIT DO
END SELECT
ctr = ctr + 1
LOOP UNTIL ctr = 30
IF flag = 1 THEN bisearch = ptr
END FUNCTION

FUNCTION word$ (ptr, length)
SELECT CASE length
        CASE 3
                DIM buf03 AS STRING * 3
                GET 1, ptr, buf03
                temp$ = buf03
        CASE 4
                DIM buf04 AS STRING * 4
                GET 2, ptr, buf04
                temp$ = buf04
        CASE 5
                DIM buf05 AS STRING * 5
                GET 3, ptr, buf05
                temp$ = buf05
        CASE 6
                DIM buf06 AS STRING * 6
                GET 4, ptr, buf06
                temp$ = buf06
        CASE 7
                DIM buf07 AS STRING * 7
                GET 5, ptr, buf07
                temp$ = buf07
        CASE 8
                DIM buf08 AS STRING * 8
                GET 6, ptr, buf08
                temp$ = buf08
        CASE 9
                DIM buf09 AS STRING * 9
                GET 7, ptr, buf09
                temp$ = buf09
        CASE 10
                DIM buf10 AS STRING * 10
                GET 8, ptr, buf10
                temp$ = buf10
        CASE 11
                DIM buf11 AS STRING * 11
                GET 9, ptr, buf11
                temp$ = buf11
        CASE 12
                DIM buf12 AS STRING * 12
                GET 10, ptr, buf12
                temp$ = buf12
        CASE 13
                DIM buf13 AS STRING * 13
                GET 11, ptr, buf13
                temp$ = buf13
        CASE 14
                DIM buf14 AS STRING * 14
                GET 12, ptr, buf14
                temp$ = buf14
        CASE 15
                DIM buf15 AS STRING * 15
                GET 13, ptr, buf15
                temp$ = buf15
        CASE 16
                DIM buf16 AS STRING * 16
                GET 14, ptr, buf16
                temp$ = buf16
        CASE 17
                DIM buf17 AS STRING * 17
                GET 15, ptr, buf17
                temp$ = buf17
        CASE 18
                DIM buf18 AS STRING * 18
                GET 16, ptr, buf18
                temp$ = buf18
        CASE 19
                DIM buf19 AS STRING * 19
                GET 17, ptr, buf19
                temp$ = buf19
        CASE 20
                DIM buf20 AS STRING * 20
                GET 18, ptr, buf20
                temp$ = buf20
END SELECT
word$ = temp$
END FUNCTION

---CUT HERE---

Though not perfect, this program gets the job done, and can 
be modified, I am sure....

Quinn


--- Maximus/2 2.01wb
 * Origin: The Nibble's Roost, Richmond BC Canada 604-244-8009 (1:153/918)

Outer Court
Echo Basic Postings

Books at Amazon:

Back to BASIC: The History, Corruption, and Future of the Language

Hackers: Heroes of the Computer Revolution (including Tiny BASIC)

Go to: The Story of the Math Majors, Bridge Players, Engineers, Chess Wizards, Scientists and Iconoclasts who were the Hero Programmers of the Software Revolution

The Advent of the Algorithm: The Idea that Rules the World

Moths in the Machine: The Power and Perils of Programming

Mastering Visual Basic .NET