home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1992 March / Source_Code_CD-ROM_Walnut_Creek_March_1992.iso / usenet / altsrcs / 3 / 3584 < prev    next >
Text File  |  1991-07-02  |  9KB  |  215 lines

  1. Newsgroups: alt.sources
  2. From: goer@ellis.uchicago.edu (Richard L. Goerwitz)
  3. Subject: kjv browser, part 11 of 11
  4. Message-ID: <1991Jul3.065346.28525@midway.uchicago.edu>
  5. Date: Wed, 3 Jul 1991 06:53:46 GMT
  6.  
  7. ---- Cut Here and feed the following to sh ----
  8. #!/bin/sh
  9. # this is bibleref.11 (part 11 of a multipart archive)
  10. # do not concatenate these parts, unpack them in order with /bin/sh
  11. # file README.rtv continued
  12. #
  13. if test ! -r _shar_seq_.tmp; then
  14.     echo 'Please unpack part 1 first!'
  15.     exit 1
  16. fi
  17. (read Scheck
  18.  if test "$Scheck" != 11; then
  19.     echo Please unpack part "$Scheck" next!
  20.     exit 1
  21.  else
  22.     exit 0
  23.  fi
  24. ) < _shar_seq_.tmp || exit 1
  25. if test ! -f _shar_wnt_.tmp; then
  26.     echo 'x - still skipping README.rtv'
  27. else
  28. echo 'x - continuing file README.rtv'
  29. sed 's/^X//' << 'SHAR_EOF' >> 'README.rtv' &&
  30. Xvalues for.  In our hypothesized scenario, you would want makeind to
  31. Xstore the max value for the verse field for every chapter of every
  32. Xbook in the Bible.  The verse field (field #3), in other words, is
  33. Xyour "rollover" field, and would be passed to makeind using the -l
  34. Xoption.  Assuming "kjv" to be the name of your indexable biblical
  35. Xtext, this set of circumstances would imply the following invocation
  36. Xfor makeind:
  37. X
  38. X    makeind -f kjv -m 176 -n 3 -l 3
  39. X
  40. XIf you were to want a case-sensitive index (not a good idea), you
  41. Xwould add "-s" to the argument list above (the only disadvantage a
  42. Xcase-insensitive index would bring is that it would obscure the
  43. XLord/lord, and other similar, distinctions).
  44. X    Actual English Bible texts usually take up 4-5 megabytes.
  45. XIndexing one would require at over twice that much core memory, and
  46. Xwould take at least an hour on a fast machine.  The end result would
  47. Xbe a set of data files occupying about 2 megabytes plus the 4-5
  48. Xmegabytes of the original file.  The Bible is hardly a small book.
  49. XOnce these data files were created, they could be moved, along with
  50. Xthe original source file, to any platform you desired.
  51. X    Having indexed, and having moved the files to wherever you
  52. Xwanted them, you would then be ready for step 3.
  53. X
  54. X
  55. X--------
  56. X
  57. X
  58. XStep 3:  Writing a Program to Access Indexed Files
  59. X
  60. X    When accessing text files such as the Bible, the most useful
  61. Xunit for searches is normally the word.  Let us suppose you are a
  62. Xzealous lay-speaker preparing a talk on fire imagery and divine wrath
  63. Xin the Bible.  You would probably want to look for every passage in
  64. Xthe text that contained words like
  65. X
  66. X    fire, firy
  67. X    burn
  68. X    furnace
  69. X    etc.
  70. X
  71. XTo refine the search, let us say that you want every instance of one
  72. Xof these fire words that occurs within one verse of a biblical title
  73. Xfor God:
  74. X
  75. X    God
  76. X    LORD
  77. X    etc.
  78. X
  79. XThe searches for fire, firy, burn, etc. would be accomplished by
  80. Xcalling a routine called retrieve().  Retrieve takes three arguments:
  81. X
  82. X    retrieve(pattern, filename, invert_search)
  83. X
  84. XThe first argument should be a string containing a regular expression
  85. Xbased pattern, such as
  86. X
  87. X    fir(y|e|iness)|flam(e|ing)|burn.*?
  88. X
  89. XNote that the pattern must match words IN THEIR ENTIRETY.  So, for
  90. Xinstance, "fir[ie]" would not catch "firiness," but rather only
  91. X"fire."  Likewise, if you want every string beginning with the
  92. Xsequence "burn," the string "burn" will not work.  Use "burn.*"
  93. Xinstead.  The filename argument supplies retrieve() with the name of
  94. Xthe original text file.  The last argument, if nonnull, inverts the
  95. Xsense of the search (a la egrep -v).  In the case of the fire words
  96. Xmentioned above, one would invoke retrieve() as follows:
  97. X
  98. X    hits1 := retrieve("fir(y|e|iness)|flam(e|ing)|burn.*?", "kjv")
  99. X
  100. XFor the divine names, one would do something along these lines:
  101. X
  102. X    hits2 := retrieve("god|lord", "kjv")
  103. X
  104. X    Having finished the basic word searches, one would then
  105. Xperform a set intersection on them.  If we are looking for fire words
  106. Xwhich occur at most one verse away from a divine name, then we would
  107. Xspecify 1 as our range (as opposed to, say, zero), and the verse as
  108. Xour unit.  The utility you would use to carry out the search is
  109. Xr_and().  R_and() would be invoked as follows:
  110. X
  111. X    hits3 := r_and(hits1, hits2, "kjv", 3, 1)
  112. X
  113. XThe last two arguments, 3 and 1, specify field three (the "verse"
  114. Xfield) and field 1 (the range).
  115. X    To display the text for your "hit list" (hits3 above), you
  116. Xwould call bitmap_2_text():
  117. X
  118. X    every write(!bitmap_2_text(hits3, "kjv"))
  119. X
  120. XBitmap_2_text converts the location designators contained in hits3
  121. Xinto actual text.
  122. X    The three basic functions mentioned above - retrieve(),
  123. Xr_and(), and bitmap_2_text() - are contained in the three distinct
  124. Xfiles (retrieve.icn, retrops.icn, and bmp2text.icn, respectively).
  125. XOther useful routines are included in these files, and also in
  126. Xwhatnext.icn.  If you are planning on writing a retrieval engine for
  127. Xserious work of some kind, you would probably want to construct a mini
  128. Xinterpreter, which would convert strings typed in by the user at
  129. Xrun-time into internal search and retrieval operations.
  130. X    Note that I have included no routine to parse or expand
  131. Xhuman-readable input (the nature of which will naturally vary from
  132. Xtext to text).  Again, using the Bible as our hypothetical case, it
  133. Xwould be very useful to be able to ask for every passage in, say,
  134. XGenesis chapters 2 through 4, and to be able to print these to the
  135. Xscreen.  Doing this would require a parsing routine to break down the
  136. Xreferences, and map them to retrieve-internal format.  The routine
  137. Xwould then have to generate all valid locations from the minimum value
  138. Xin chapter 2 above to the max in chapter 4.  See the file whatnext.icn
  139. Xfor some aids in accomplishing this sort of task.
  140. X
  141. X
  142. X--------
  143. X
  144. X
  145. XStep 4:  Compiling and Running Your Program
  146. X
  147. X    Assuming you have written a search/retrieval program using the
  148. Xroutines contained in retrieve.icn, retrops.icn, bmp2text.icn, and
  149. Xwhatnext.icn, you would now be ready to compile it.  In order to
  150. Xfunction properly, these routines would need to be linked with
  151. Xinitfile.icn and indexutl.icn.  Specific dependencies are noted in the
  152. Xindividual files in case there is any confusion.
  153. X    If you have made significant use of this package, you probably
  154. Xshould not worry about the exact dependencies, though.  Just link
  155. Xeverything in together, and worry about what isn't needed after you
  156. Xhave fully tested your program:
  157. X
  158. X    icont -o yourprog yourprog.icn initfile.icn indexutl.icn \
  159. X        retrieve.icn retrops.icn bmp2text.icn binsrch.icn
  160. X
  161. X
  162. X--------
  163. X
  164. X
  165. XProblems, bugs:
  166. X
  167. X    This is really an early beta release of the retrieve package.
  168. XI use it for various things.  For instance, I recently retrieved a
  169. Xtext file containing informal reviews of a number of Science Fiction
  170. Xworks.  My father likes SciFi, and it was close to Fathers' Day, so I
  171. Xindexed the file, and performed cross-referenced searches for words
  172. Xlike "very good," "brilliant," and "excellent," omitting authors my
  173. Xfather has certainly read (e.g. Herbert, Azimov, etc.).  I also had
  174. Xoccasion to write a retrieval engine for the King James Bible (hence
  175. Xthe many examples from this text), and to construct a retrieval
  176. Xpackage for the Hebrew Bible, which I am now using to gather data for
  177. Xvarious chapters of my dissertation.  I'm happy, incidentally, to hand
  178. Xout copies of my KJV retrieval program.  It's a clean little program
  179. Xthat doubtless many would find useful.  The Hebrew Bible retrieval
  180. Xpackage I'll hand out as well, but only to fully competent Icon
  181. Xprogrammers who feel comfortable with Hebrew and Aramaic.  This latter
  182. Xretrieval package a much less finished product, and would almost
  183. Xcertainly need to be hacked to work on platforms other than what I
  184. Xhave here at home (a Xenix/386 setup with a VGA).
  185. X    In general, I hope that someone out there will find these
  186. Xroutines useful, if for no other reason than that it will mean that I
  187. Xget some offsite testing.  Obviously, the whole package could have
  188. Xbeen written/maintained in C or something that might offer much better
  189. Xperformance.  Doing so would, however, have entailed a considerable
  190. Xloss of flexibility, and would have required a lot more time on my
  191. Xpart.  Right now, the retrieve package occupies about 60k of basic
  192. Xsource files, probably half of which consists of comments.  When
  193. Xcompiled together with a moderate-size user interface, the total
  194. Xpackage typically comes to about 150k.  In-core size typically runs
  195. Xabout 350k on my home machine here (a Xenix/386 box), with the basic
  196. Xrun-time interpreter taking up a good chunk of that space all on its
  197. Xown.  It's not a small package, but I've found it a nice base for
  198. Xrapid prototyping and development of small to medium-size search and
  199. Xretrieval engines.
  200. X
  201. X   -Richard L. Goerwitz              goer%sophist@uchicago.bitnet
  202. X   goer@sophist.uchicago.edu         rutgers!oddjob!gide!sophist!goer
  203. SHAR_EOF
  204. echo 'File README.rtv is complete' &&
  205. true || echo 'restore of README.rtv failed'
  206. rm -f _shar_wnt_.tmp
  207. fi
  208. rm -f _shar_seq_.tmp
  209. echo You have unpacked the last part
  210. exit 0
  211. -- 
  212.  
  213.    -Richard L. Goerwitz              goer%sophist@uchicago.bitnet
  214.    goer@sophist.uchicago.edu         rutgers!oddjob!gide!sophist!goer
  215.