;; @module wordnet ;; @description Queries a local copy of Wordnet 3.0 English lexical database from wordnet.princeton.edu ;; @version 0.31 ;; @author Lutz Mueller, December 2007 ;; ;; WordNet® is a large lexical database of English, developed under the direction ;; of George A. Miller. Nouns, verbs, adjectives and adverbs are grouped into sets ;; of cognitive synonyms (synsets), each expressing a distinct concept. Synsets are ;; interlinked by means of conceptual-semantic and lexical relations. The resulting ;; network of meaningfully related words and concepts can be navigated with the ;; browser. WordNet is also freely and publicly available for download. WordNet's ;; structure makes it a useful tool for computational linguistics and natural language ;; processing. () ;; ;; This module has two interfaces to a local copy of WordNet-3.0. The simple interface ;; works via the command line utility: 'wn' part of the normal WordNet-3.0 installation. ;; The alternate interface is a shared library interface to a specially adapted ;; compilation of the 'wn' utility source code. Queries made with the shared library ;; interface are only about 25% faster than queries made through the simple ;; 'wn' commandline interface, but do not invoke a new process for every query. ;; This module can be switched to use the simpleinterface editing the 'wn:SHARED_LIB' ;; setting at the beginning of this file. ;; ;; Note that the function 'wn:morph' is only available in the shared library interface. ;; ;;

Requirements

;; For the simple 'wn' command line interface a standard installation of WordNet 3.0 ;; is necessary. Source code and binaries for Windows and Unix can be obtained at: ;; @link http://wordnet.princeton.edu/obtain http://wordnet.princeton.edu/obtain . ;; This module automatically adjusts to the standard Wordnet directory locations ;; on Windows and UNIX. If non-standard locations are used, the environment settings ;; at the beginning of this module file have to be adjusted. ;; ;; For the shared library interface the file 'libwn.c' needs to be compiled and ;; the resulting library be placed in '$WNHOME/lib' as either 'libwn.dylib' on ;; Mac OS X or 'libwn.so' on other UNIX. By default '$WNHOME is assumed to be ;; '/usr/local/WordNet-3.0>' on Unix or '%PROGRAMFILES%/WordNet-3.0/' on Win32. ;; ;; The source and a shell script to compile ;; the libaray is available from the author of this module at: ;; @link http://newlisp.org/code/wordnet-nl-03.tgz http://newlisp.org/code/wordnet-nl-03.tgz ;; The file 'libwn.c' is an adaptation of the 'wn.c' command line utility fromn ;; the WordNet-3.0 source distribution. ;; ;;

Functions in the API

;; The names of the functions are chosen corresponding to the options used in the WordNet ;; 'wn' command line utility. This facilitates usage by users familiar with WordNet. ;; ;; 'wn:morph -' stem, variations (only on the shared library interface)
;; 'wn:hypen -' verb hypernyms
;; 'wn:hypev -' noun hypernyms
;; 'wn:synsn -' noun synonyms ordered by estimated frequency
;; 'wn:synsv -' verb synonyms ordered by estimated frequency
;; 'wn:hypon -' noun hyponyms
;; 'wn:hypov -' verb hyponyms
;; 'wn:coorn -' noun coordinates
;; 'wn:coorv -' verb coordinates
;; 'wn:antsn -' nound antonymns
;; 'wn:antsv -' verb antonyms
;; 'wn:antsa -' adjective antonyms
;;
;; 'wn:query -' process iand returns an original 'wn' quer (used internally)
;; 'wn:get-words' -' extracts words from an original 'wn' query (used internally)
;; ;; Note that WordNet has many more possible queries, which easily can be entered using ;; the 'wn:query' and 'wn:get-words' functions. ; environment settings for standard WordNet installations (if (= ostype "Win32") ; Win32 (begin (env "WNHOME" (string (env "PROGRAMFILES") "/WordNet-3.0")) (env "WNSEARCHDIR" (string (env "PROGRAMFILES") "/WordNet-3.0/dict"))) ; all Unix like Linux, BSDs, Mac OS X, etc. (begin (env "WNHOME" "/usr/local/WordNet-3.0") (env "WNSEARCHDIR" "/usr/local/WordNet-3.0/dict")) ) (context 'wn) ; set to nil to use the simple 'wn' command line interface (define SHARED_LIB true) (when SHARED_LIB (if (= ostype "OSX") (set 'LIBNAME (string (env "WNHOME") "/lib/libwn.dylib")) (set 'LIBNAME (string (env "WNHOME") "/lib/libwn.so")) ) (import LIBNAME "initialize") (import LIBNAME "querywn") (import LIBNAME "querywn") (import LIBNAME "morphstr") (initialize) ) (constant 'NOUN 1) (constant 'VERB 2) (constant 'ADJ 3) (constant 'ADV 4) ;; @syntax (wn:morph []) ;; @param The word for which to seach the morph. ;; @param The optional part of speech for which to search, 'wn:NOUN', 'wn:VERB', 'wn:ADJ', 'an:ADV'. ;; @return The word variant for the part of speech given, or a list of found variants, if not is spceified. ;; ;; @example ;; (wn:morph "shot") => (("shoot" wn:VERB)) ;; ;; (wn:morph "shot" wn:VERB) => "shoot" ;; ;; (wn:morph "shot" wn:ADJ) => nil ;; ;; (wn:morph "forms") => (("form" wn:NOUN) ("form" wn:VERB)) (define (wn:morph word pos, result plist) (if pos (begin (set 'result (morphstr word pos)) (if (!= result 0) (get-string result)) ) ; else (begin (set 'plist '()) (for (p 4 1) (set 'result (morphstr word p)) (if (!= result 0) (push (list (get-string result) (nth p '(nil NOUN VERB ADJ ADV))) plist) ) ) plist ) ) ) ;; @syntax (wn:hypen ) ;; @param The word for which to search hypernym nouns. ;; @return List of words. ;; ;; This function does a '-hypen' query returning noun synonyms for the word entered. ;; ;; @example ;; (wn:hypen "motor") => ;; ;; ("machine" "device" "instrumentality" "instrumentation" "artifact" "artefact" "whole" ;; "unit" "object" "physical object" "physical entity" "entity" "agent" "causal agent" ;; "cause" "causal agency" "physical entity" "entity") (define (hypen word) (get-words (query (append word " -hypen"))) ) ;; @syntax (wn:hypev ) ;; @param The word for which to search hypernym verbs. ;; @return List of words. ;; ;; This function does a '-hypev' query returning verb synonyms for the word entered. ;; ;; @example ;; (wn:hypev "motor") => ("travel" "go" "move" "locomote") ;; (define (hypev word) (get-words (query (append word " -hypev"))) ) ;; @syntax (wn:synsn ) ;; @param The word for which to search synonym nouns. ;; @return List of words. ;; ;; This function does a '-synsn' query returning noun synonyms for the word entered. ;; ;; @example ;; (wn:synsn "program") ;; ;; => ("idea" "thought" "system" "system of rules" "show" "document" "written document" ;; "papers" "announcement" "promulgation" "information" "info" "software" "software program" ;; "computer software" "software system" "software package" "package" "performance") (define (synsn word) (get-words (query (append word " -synsn"))) ) ;; @syntax (wn:synsv ) ;; @param The word for which to search synonym verbs. ;; @return List of words. ;; ;; This function does a '-synsv' query returning verb synonyms for the word entered. ;; ;; @example ;; (wn:synsv "program") ;; ;; => ("schedule" "create by mental act" "create mentally") (define (synsv word) (get-words (query (append word " -synsv"))) ) ;; @syntax (wn:hypon ) ;; @param The word for which to search hyponym nouns. ;; @return List of words. ;; ;; This function does a '-hypon' query returning noun hyponyms for the word entered. ;; ;; @example ;; (wn:hypon "train") ;; ;; => ("boat train" "car train" "freight train" "rattler" "hospital train" "mail train" ;; "passenger train" "streamliner" "subway train" "epicyclic train" "epicyclic gear train" ;; "reduction gear") (define (hypon word) (get-words (query (append word " -hypon"))) ) ;; @syntax (wn:hypov ) ;; @param The word for which to search hyponym verbs. ;; @return List of words. ;; ;; This function does a '-hypov' query returning verb hyponyms for the word entered. ;; ;; @example ;; (wn:hypovv "program") ;; ;; => ("hack" "hack on") (define (hypov word) (get-words (query (append word " -hypov"))) ) ;; @syntax (wn:coorn ) ;; @param The word for which to search coordinate nouns.. ;; @return List of words. ;; ;; This function does a '-coorn' query returning noun coordinates for the word entered. ;; ;; @example ;; (wn:coorn "breakfast") ;; ;; => ("mess" "square meal" "potluck" "refection" "breakfast" "brunch" "lunch" "luncheon" ;; "tiffin" "dejeuner" "tea" "afternoon tea" "teatime" "dinner" "supper" "buffet" "picnic" ;; "bite" "collation" "snack" "nosh-up" "ploughman's lunch" "banquet" "feast" "spread") (define (coorn word) (get-words (query (append word " -coorn"))) ) ;; @syntax (wn:coorv ) ;; @param The word for which to search coordinate verbs. ;; @return List of words. ;; ;; This function does a '-coorv' query returning verb coordinates for the word entered. ;; ;; @example ;; (wn:synsv "sleep") ;; ;; => ("sleep" "kip" "slumber" "log Z's" "catch some Z's" "drowse" "sleep" "house" "seat") (define (coorv word) (get-words (query (append word " -coorv"))) ) ;; @syntax (wn:antsn ) ;; @param The word for which to search antonym nouns. ;; @return List of words. ;; ;; This function does a '-antsn' query returning noun antonyms for the word entered. ;; ;; @example ;; (wn:antsn "love") => ("love" "hatred") (define (antsn word) (get-words (query (append word " -antsn"))) ) ;; @syntax (wn:antsv ) ;; @param The word for which to search antonym nouns. ;; @return List of words. ;; ;; This function does a '-antsv' query returning verb antonyms for the word entered. ;; ;; @example ;; (wn:antsv "love") => ("hate" "detes")t (define (antsv word) (get-words (query (append word " -antsv"))) ) ;; @syntax (wn:antsa ) ;; @param The word for which to search antonym nouns. ;; @return List of words. ;; ;; This function does a '-antsa' query returning adjective antonyms for the word entered. ;; ;; @example ;; (wn:antsa "cool") => ("lukewarm" "tepid" "warmed" "warming" "hot" "cordial" "hearty") ;; (define (antsa word) (get-words (query (append word " -antsa"))) ) ; ------------------------------------- Utility functions ---------------------- ;;
- § -
;;

Utility Functions

;; @syntax (wn:query ) ;; @param A query string exactly as used for the WordNet 'wn' command. ;; ;; This command is normally only used internally by this module, but can also be used to ;; add new functions to this module or make queries not covered by the other functions. ;; ;; @example ;; (wn:query "book -synsn") ;; ;; => generates same output as 'wn book -synsn' on command line (if SHARED_LIB (define (query str-query) (parse (get-string (querywn str-query)) "\n")) ;else (define (query str-query) (exec (string (env "WNHOME") "/bin/wn " str-query))) ) ;; @syntax (wn:get-words ) ;; @param Parse out the wordsfrom a 'wn:query' results and return them in a list. ;; @return List of words. ;; ;; This command is normally only used internally by this module, but can also be used to ;; add new functions to this module or make queries not covered by the other functions. ;; @example ;; (wn:get-words (wn:query "old -synsn")) ;; ;; => ("past" "past times" "yesteryear") (define (wn:get-words str-result) (let (f (filter (fn (l) (starts-with (trim l) "=>")) str-result)) (map trim (flat (map (fn (l) (parse (2 (trim l)) ", ")) f))) ) ) ; eof ;