link-grammar-4.7.4/0000755000175000017500000000000011531775730013122 5ustar bloombloomlink-grammar-4.7.4/ac-helpers/0000755000175000017500000000000011531775723015147 5ustar bloombloomlink-grammar-4.7.4/ac-helpers/binreloc.m40000644000175000017500000000502310256100375017172 0ustar bloombloom# Check for binary relocation support # Hongli Lai # http://autopackage.org/ AC_DEFUN([AM_BINRELOC], [ AC_ARG_ENABLE(binreloc, [ --enable-binreloc compile with binary relocation support (default=enable when available)], enable_binreloc=$enableval,enable_binreloc=auto) AC_ARG_ENABLE(binreloc-threads, [ --enable-binreloc-threads compile binary relocation with threads support (default=yes)], enable_binreloc_threads=$enableval,enable_binreloc_threads=yes) BINRELOC_CFLAGS= BINRELOC_LIBS= if test "x$enable_binreloc" = "xauto"; then AC_CHECK_FILE([/proc/self/maps]) AC_CACHE_CHECK([whether everything is installed to the same prefix], [br_cv_valid_prefixes], [ if test "$bindir" = '${exec_prefix}/bin' -a "$sbindir" = '${exec_prefix}/sbin' -a \ "$datadir" = '${prefix}/share' -a "$libdir" = '${exec_prefix}/lib' -a \ "$libexecdir" = '${exec_prefix}/libexec' -a "$sysconfdir" = '${prefix}/etc' then br_cv_valid_prefixes=yes else br_cv_valid_prefixes=no fi ]) fi AC_CACHE_CHECK([whether binary relocation support should be enabled], [br_cv_binreloc], [if test "x$enable_binreloc" = "xyes"; then br_cv_binreloc=yes elif test "x$enable_binreloc" = "xauto"; then if test "x$br_cv_valid_prefixes" = "xyes" -a \ "x$ac_cv_file__proc_self_maps" = "xyes"; then br_cv_binreloc=yes else br_cv_binreloc=no fi else br_cv_binreloc=no fi]) if test "x$br_cv_binreloc" = "xyes"; then BINRELOC_CFLAGS="-DENABLE_BINRELOC" AC_DEFINE(ENABLE_BINRELOC,,[Use binary relocation?]) if test "x$enable_binreloc_threads" = "xyes"; then AC_CHECK_LIB([pthread], [pthread_getspecific]) fi AC_CACHE_CHECK([whether binary relocation should use threads], [br_cv_binreloc_threads], [if test "x$enable_binreloc_threads" = "xyes"; then if test "x$ac_cv_lib_pthread_pthread_getspecific" = "xyes"; then br_cv_binreloc_threads=yes else br_cv_binreloc_threads=no fi else br_cv_binreloc_threads=no fi]) if test "x$br_cv_binreloc_threads" = "xyes"; then BINRELOC_LIBS="-lpthread" AC_DEFINE(BR_PTHREAD,1,[Include pthread support for binary relocation?]) else BINRELOC_CFLAGS="$BINRELOC_CFLAGS -DBR_PTHREADS=0" AC_DEFINE(BR_PTHREAD,0,[Include pthread support for binary relocation?]) fi fi AC_SUBST(BINRELOC_CFLAGS) AC_SUBST(BINRELOC_LIBS) ]) link-grammar-4.7.4/configure.in0000644000175000017500000003611211526022265015426 0ustar bloombloomAC_INIT(link-grammar/link-parser.c) dnl Set release number dnl This is derived from "Versioning" chapter of info libtool documentation. PACKAGE=link-grammar dnl 4a) Increment when removing or changing interfaces. LINK_MAJOR_VERSION=4 dnl 4a) 5) Increment when adding interfaces. dnl 6) Set to zero when removing or changing interfaces. LINK_MINOR_VERSION=7 dnl 3) Increment when interfaces not changed at all, dnl only bug fixes or internal changes made. dnl 4b) Set to zero when adding, removing or changing interfaces. LINK_MICRO_VERSION=4 dnl dnl Set this too MAJOR_VERSION_PLUS_MINOR_VERSION=`expr $LINK_MAJOR_VERSION + $LINK_MINOR_VERSION` dnl VERSION=$LINK_MAJOR_VERSION.$LINK_MINOR_VERSION.$LINK_MICRO_VERSION dnl Version info for libraries = CURRENT:REVISION:AGE VERSION_INFO=$MAJOR_VERSION_PLUS_MINOR_VERSION:$LINK_MICRO_VERSION:$LINK_MINOR_VERSION AC_SUBST(VERSION_INFO) AC_SUBST(LINK_MAJOR_VERSION) AC_SUBST(LINK_MINOR_VERSION) AC_SUBST(LINK_MICRO_VERSION) AM_INIT_AUTOMAKE($PACKAGE, $VERSION) AM_MAINTAINER_MODE AC_CONFIG_MACRO_DIR([m4]) dnl Checks for programs. AC_ISC_POSIX AC_PROG_CC AC_PROG_CXX AC_PROG_CPP AC_PROG_INSTALL AC_PROG_LN_S AC_PROG_MAKE_SET AC_STDC_HEADERS AC_LIBTOOL_WIN32_DLL AM_PROG_LIBTOOL AM_BINRELOC PKG_PROG_PKG_CONFIG AC_C_CONST AC_CHECK_FUNCS(towupper) dnl ==================================================================== AC_MSG_CHECKING([for native Win32]) case "$host" in *-*-mingw*) native_win32=yes ;; *) native_win32=no ;; esac AC_MSG_RESULT([$native_win32]) AM_CONDITIONAL(OS_WIN32, test "x$native_win32" = "xyes") dnl ==================================================================== # The std=c99 flag provides the proper float-pt math decls working, # e.g. fmaxf However, it also undefined _BSD_SOURCE, etc which is # needed to get fileno, strdup, etc. and so it needs to be manually # enabled again. # Setting -D_POSIX_SOURCE messes up compilation on FreeBSD by # hiding strdup, etc. again. # CFLAGS="${CFLAGS} -std=c99 -D_BSD_SOURCE -D_SVID_SOURCE -D_POSIX_C_SOURCE -D_GNU_SOURCE" # Final solution: enable std=c99, explitictly turn on BSD and SVID and # GNU, but do NOT turn on POSIX. # if test x${native_win32} = xyes; then # Vikas says that -std=gnu99 is needed on cygwin/mingw CFLAGS="${CFLAGS} -std=gnu99 -D_BSD_SOURCE -D_SVID_SOURCE -D_GNU_SOURCE" # Also -- Vikas sets MINGW explicitly, as well as assorted paths. # I'm unclear as to why these are not being set automatically, # by mingw itself .. but what the hey ... this can't hurt, right? # Oh yes it can hurt, do not set these at all. # Setting these screws up the remainder of the configure script. # CFLAGS="${CFLAGS} -I/usr/include/mingw -D__MINGW32__" # LDFLAGS="${LDFLAGS} -L/usr/lib/mingw -lmingwex -lcrtdll -lmsvcrt -lc -Wl,--allow-multiple-definition" else # Else standard Linux/*BSD environment. CFLAGS="${CFLAGS} -std=c99 -D_BSD_SOURCE -D_SVID_SOURCE -D_GNU_SOURCE" fi dnl ==================================================================== AM_CONDITIONAL(WITH_BINRELOC, test "x$br_cv_binreloc" = "xyes") AC_ARG_ENABLE( debug, [ --enable-debug compile with debugging flags set], CFLAGS="${CFLAGS} -g" LDFLAGS="${LDFLAGS} -g" AC_DEFINE(DEBUG_MEMORY,1), AC_DEFINE(DEBUG_MEMORY,0) ) AC_ARG_ENABLE( mudflap, [ --enable-mudflap compile with mudflap checking], CFLAGS="${CFLAGS} -fmudflap" LDFLAGS="${LDFLAGS} -fmudflap -lmudflap") AC_ARG_ENABLE( profile, [ --enable-profile compile with profiling set], CFLAGS="${CFLAGS} -pg" LDFLAGS="${LDFLAGS} -pg") do_pth=no AC_ARG_ENABLE( pthreads, [ --enable-pthreads compile with pthread support], CPPFLAGS="${CPPFLAGS} -DUSE_PTHREADS=1" do_pth=yes) AM_CONDITIONAL(WITH_PTHREADS, test x${do_pth} = xyes) do_java=yes AC_ARG_ENABLE( java-bindings, [ --disable-java-bindings disable build of java bindings], do_java="no") buildSAT=no AC_ARG_ENABLE( sat-solver, [ --enable-sat-solver use the boolean SAT solver], CPPFLAGS="${CPPFLAGS} -DUSE_SAT_SOLVER=1" buildSAT=yes) AM_CONDITIONAL(WITH_SAT_SOLVER, test x${buildSAT} = xyes) buildcorpus=no AC_ARG_ENABLE( corpus-stats, [ --enable-corpus-stats use corpus statistics], CPPFLAGS="${CPPFLAGS} -DUSE_CORPUS=1" buildcorpus=yes) AM_CONDITIONAL(WITH_CORPUS, test x${buildcorpus} = xyes) dnl ASpell Support is handled here do_aspell=yes AC_ARG_ENABLE([aspell], [AS_HELP_STRING([--disable-aspell], [Build without ASpell support (default is enabled)])], [do_aspell="${enableval}"]) AM_CONDITIONAL(WITH_ASPELL, test x${do_aspell} = xyes) dnl Hunspell Support is handled here do_hunspell=yes AC_ARG_ENABLE([hunspell], [AS_HELP_STRING([--disable-hunspell], [Build without HunSpell support (default is enabled)])], [do_hunspell="${enableval}"]) AM_CONDITIONAL(WITH_HUNSPELL, test x${do_hunspell} = xyes) AC_ARG_WITH([hunspell-dictdir], [AS_HELP_STRING([--with-hunspell-dictdir=DIR], [Use DIR to find HunSpell files (default=/usr/share/myspell/dicts])], [], with_hunspell_dictdir=) dnl ==================================================================== # If not asking for the statistics backend, then don't even # check for SQLite. if test x${buildcorpus} = xyes; then AC_CHECK_HEADER([sqlite3.h], [CPPFLAGS="${CPPFLAGS} -DHAVE_SQLITE=1" SQLiteFound=yes], SQLiteFound=no) AM_CONDITIONAL(HAVE_SQLITE, test x${SQLiteFound} = xyes) # If there are sqlite3 and pkgconfig on MacOS, then # recommend that user install MacPorts http://www.macports.org/ if test "x${SQLiteFound}" = "xyes"; then PKG_CHECK_MODULES(SQLITE3, sqlite3 >= 3.0.0) AC_SUBST(SQLITE3_LIBS) AC_SUBST(SQLITE3_CFLAGS) fi else AM_CONDITIONAL(HAVE_SQLITE, false) fi dnl Set Default Spell Checker settings dnl ==================================================================== ASpellFound=no if test "$do_aspell" = yes ; then PKG_CHECK_MODULES([ASPELL], [aspell], [ASpellFound=yes], [ASpellFound=no]) save_cpp_flags=${CPPFLAGS} CPPFLAGS="${CPPFLAGS} ${ASPELL_CFLAGS}" AC_CHECK_HEADER([aspell.h], [ASpellFound=yes], ASpellFound=no) AC_CHECK_LIB(aspell, new_aspell_config, [], [ASpellFound=no]) CPPFLAGS=$save_cpp_flags if test "x${ASpellFound}" = "xyes"; then AC_DEFINE(HAVE_ASPELL, 1, [Define for compilation]) AC_SUBST(ASPELL_LIBS) AC_SUBST(ASPELL_CFLAGS) # If aspell enabled and found, then do NOT do hunspell do_hunspell=no fi fi AM_CONDITIONAL(HAVE_ASPELL, test x${ASpellFound} = xyes) HunSpellDictDir= HunSpellFound=no if test x"$do_hunspell" = xyes; then HunSpellFound=no # First, look for the libraries. PKG_CHECK_MODULES([HUNSPELL], [hunspell], [HunSpellFound=yes], [HunSpellFound=no]) save_cpp_flags=${CPPFLAGS} CPPFLAGS="${CPPFLAGS} ${HUNSPELL_CFLAGS}" AC_CHECK_HEADER([hunspell.h], [HunSpellFound=yes], HunSpellFound=no) CPPFLAGS=$save_cpp_flags if test "x${HunSpellFound}" = "xyes"; then AC_DEFINE(HAVE_HUNSPELL, 1, [Define for compilation]) AC_SUBST(HUNSPELL_LIBS) AC_SUBST(HUNSPELL_CFLAGS) # Now, look for the dictionaries. HunSpellDictDir=/usr/share/myspell/dicts if test -n "$with_hunspell_dictdir"; then HunSpellDictDir=$with_hunspell_dictdir fi if ! test -d "$HunSpellDictDir" ; then echo "WARN HunSpell Dictionaries do not exist at \"$HunSpellDictDir\"" fi AC_DEFINE_UNQUOTED(HUNSPELL_DICT_DIR, "$HunSpellDictDir", [Defining the dictionary path]) fi fi AM_CONDITIONAL(HAVE_HUNSPELL, test x${HunSpellFound} = xyes) dnl ==================================================================== AC_DEFUN([GLIB_LC_MESSAGES], [AC_CHECK_HEADERS([locale.h]) if test $ac_cv_header_locale_h = yes; then AC_CACHE_CHECK([for LC_MESSAGES], am_cv_val_LC_MESSAGES, [AC_TRY_LINK([#include ], [return LC_MESSAGES], am_cv_val_LC_MESSAGES=yes, am_cv_val_LC_MESSAGES=no)]) if test $am_cv_val_LC_MESSAGES = yes; then AC_DEFINE(HAVE_LC_MESSAGES, 1, [Define if your file defines LC_MESSAGES.]) fi fi]) GLIB_LC_MESSAGES dnl ==================================================================== PKG_CHECK_MODULES([LIBEDIT], [libedit], [edlin=yes], [edlin=no]) if test "x${edlin}" = "xyes"; then AM_CONDITIONAL(HAVE_EDITLINE, true) AC_DEFINE(HAVE_EDITLINE, 1, [Define for compilation]) else AM_CONDITIONAL(HAVE_EDITLINE, false) fi dnl ==================================================================== AC_CHECK_HEADER([regex.h],,[AC_MSG_ERROR([No regex.h header found])]) AC_CHECK_FUNCS(regexec,,[AC_CHECK_LIB(regex,regexec, [REGEX_LIBS=-lregex], [AC_MSG_ERROR([No regex library found])])]) AC_SUBST(REGEX_LIBS) dnl ==================================================================== dnl check compiler flags AC_DEFUN([LINK_CC_TRY_FLAG], [ AC_MSG_CHECKING([whether $CC supports $1]) link_save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS $1" AC_COMPILE_IFELSE([ ], [link_cc_flag=yes], [link_cc_flag=no]) CFLAGS="$link_save_CFLAGS" if test "x$link_cc_flag" = "xyes"; then ifelse([$2], , :, [$2]) else ifelse([$3], , :, [$3]) fi AC_MSG_RESULT([$link_cc_flag]) ]) dnl Use lots of warning flags with with gcc and compatible compilers dnl Note: if you change the following variable, the cache is automatically dnl skipped and all flags rechecked. So there's no need to do anything dnl else. If for any reason you need to force a recheck, just change dnl MAYBE_WARN in an ignorable way (like adding whitespace) MAYBE_WARN="-Wall -Wextra \ -Wsign-compare -Werror-implicit-function-declaration \ -Wpointer-arith -Wwrite-strings -Wstrict-prototypes \ -Wmissing-prototypes -Wmissing-declarations -Wnested-externs \ -Wpacked -Wswitch-enum -Wmissing-format-attribute \ -Wstrict-aliasing=2 -Winit-self -Wunsafe-loop-optimizations \ -Wdeclaration-after-statement -Wold-style-definition \ -Wno-missing-field-initializers -Wno-unused-parameter \ -Wno-attributes -Wno-long-long -Winline" # invalidate cached value if MAYBE_WARN has changed if test "x$link_cv_warn_maybe" != "x$MAYBE_WARN"; then unset link_cv_warn_cflags fi AC_CACHE_CHECK([for supported warning flags], link_cv_warn_cflags, [ echo WARN_CFLAGS="" # Some warning options are not supported by all versions of # gcc, so test all desired options against the current # compiler. # # Note that there are some order dependencies # here. Specifically, an option that disables a warning will # have no net effect if a later option then enables that # warnings, (perhaps implicitly). So we put some grouped # options (-Wall and -Wextra) up front and the -Wno options # last. for W in $MAYBE_WARN; do LINK_CC_TRY_FLAG([$W], [WARN_CFLAGS="$WARN_CFLAGS $W"]) done link_cv_warn_cflags=$WARN_CFLAGS link_cv_warn_maybe=$MAYBE_WARN AC_MSG_CHECKING([which warning flags were supported])]) WARN_CFLAGS="$link_cv_warn_cflags" LINK_CFLAGS="$LINK_CFLAGS $WARN_CFLAGS" # # dnl Per email, -fnested-functions is needed on Macintosh OS/X # Except that the solitary case where there was an actual nested # function was fixed, so this is no longer needed ... right? # # LINK_CC_TRY_FLAG([-fnested-functions], # [LINK_CFLAGS="$LINK_CFLAGS -fnested-functions"]) LINK_CC_TRY_FLAG([-fno-strict-aliasing], [LINK_CFLAGS="$LINK_CFLAGS -fno-strict-aliasing"]) AC_SUBST(LINK_CFLAGS) dnl ===================================================================== dnl Try to guess location of the jni.h file. dnl Might be useful to look at env variables $JDK_HOME and $JAVA_HOME for these. dnl JNIfound=no if test "x$do_java" = "xyes"; then JNI_GUESS=" \ -I $JAVA_HOME/include \ -I $JAVA_HOME/include/freebsd \ -I $JAVA_HOME/include/linux \ -I $JAVA_HOME/include/win32 \ -I $JAVA_HOME/Headers \ -I $JDK_HOME/include \ -I $JDK_HOME/include/freebsd \ -I $JDK_HOME/include/linux \ -I $JDK_HOME/include/win32 \ -I $JDK_HOME/Headers \ -I/usr/include/classpath/ \ -I/usr/local/jdk1.6.0/include/\ -I/usr/local/jdk1.6.0/include/freebsd \ -I/usr/local/jdk1.6.0/include/linux \ -I/usr/lib/jvm/java-6-sun/include/ \ -I/usr/lib/jvm/java-6-sun/include/freebsd \ -I/usr/lib/jvm/java-6-sun/include/linux \ -I/usr/lib/j2sdk1.6-ibm/include \ -I/usr/lib/j2sdk1.6-ibm/include/freebsd \ -I/usr/lib/j2sdk1.6-ibm/include/linux \ -I/opt/jdk1.5/include/ \ -I/opt/jdk1.5/include/freebsd \ -I/opt/jdk1.5/include/linux \ -I/usr/lib/jvm/java-1.5.0-sun-1.5.0.15/include \ -I/usr/lib/jvm/java-1.5.0-sun-1.5.0.15/include/freebsd \ -I/usr/lib/jvm/java-1.5.0-sun-1.5.0.15/include/linux \ -I/c/java/jdk1.6.0/include/ \ -I/c/java/jdk1.6.0/include/win32/ \ -I/Developer/SDKs/MacOSX10.5.sdk/System/Library/Frameworks/JavaVM.framework/Headers/ \ -I/Developer/SDKs/MacOSX10.4u.sdk/System/Library/Frameworks/JavaVM.framework/Headers/ " AC_MSG_CHECKING(for jni.h) AC_TRY_CPP( [#include ], [AC_MSG_RESULT([yes, will build java libs]) JNIfound=yes], [ SAVE_CPPFLAGS=${CPPFLAGS} CPPFLAGS="${CPPFLAGS} ${JNI_GUESS}" AC_MSG_WARN([Can't find jni.h header in standard locations, trying again with ${CPPFLAGS}]) AC_TRY_CPP( [#include ], [AC_MSG_RESULT([yes, will build java libs]) JNIfound=yes], [ AC_MSG_WARN([cannot find jni.h header, needed for Java bindings support.]) CPPFLAGS=${SAVE_CPPFLAGS} JNIfound=no]) ]) AC_SUBST(CPPFLAGS) # Hmm .. there seems to be a missing pkgconfig for ordinary java ... # There's libgcj-4.2.pc and libgcj8.pc but nothing for ordinary java?? # PKG_CHECK_MODULES(LIBJDK, libjdk-1.5 >= $LIBJDK_REQUIRED) # AC_SUBST(LIBJDK_CFLAGS) # AC_SUBST(LIBJDK_LIBS) # For now, we assume that if the jni files are there, then the javac # ant, and jar compilers/builders are install as well. This is used # to build the jar file and install it. AM_CONDITIONAL(HAVE_JAVA, test x${JNIfound} = xyes) else AM_CONDITIONAL(HAVE_JAVA, false) fi dnl =================================================================== AC_OUTPUT([ Makefile build.xml link-grammar.pc link-grammar.spec link-grammar/Makefile link-grammar/corpus/Makefile link-grammar/minisat/Makefile link-grammar/sat-solver/Makefile link-grammar/link-features.h data/Makefile data/de/Makefile data/en/Makefile data/en/words/Makefile data/lt/Makefile man/Makefile autopackage/default.apspec link-grammar.xcode/Makefile msvc6/Makefile msvc6/link_grammar_dll/Makefile msvc6/link_grammar_exe/Makefile msvc6/link_grammar_java_dll/Makefile msvc9/Makefile ]) dnl ==================================================================== echo " $PACKAGE-$VERSION prefix: ${prefix} compiler: ${CC} ${CPPFLAGS} ${CFLAGS} autopackage: ${br_cv_binreloc} Posix threads: ${do_pth} Editline command-line history: ${edlin} Java interfaces: ${JNIfound} ASpell spell checker: ${ASpellFound} HunSpell spell checker: ${HunSpellFound} HunSpell dictionary location: ${HunSpellDictDir} Boolean SAT solver: ${buildSAT} Corpus statistics database: ${buildcorpus} " link-grammar-4.7.4/link-grammar.xcode/0000755000175000017500000000000011531775723016606 5ustar bloombloomlink-grammar-4.7.4/link-grammar.xcode/.cvsignore0000644000175000017500000000002510417224163020570 0ustar bloombloomMakefile.in Makefile link-grammar-4.7.4/link-grammar.xcode/Makefile.am0000644000175000017500000000003710417224163020627 0ustar bloombloom EXTRA_DIST = project.pbxproj link-grammar-4.7.4/link-grammar.xcode/project.pbxproj0000644000175000017500000011450710465207532021663 0ustar bloombloom// !$*UTF8*$! { archiveVersion = 1; classes = { }; objectVersion = 39; objects = { 014CEA520018CE5811CA2923 = { buildSettings = { COPY_PHASE_STRIP = NO; GCC_DYNAMIC_NO_PIC = NO; GCC_ENABLE_FIX_AND_CONTINUE = YES; GCC_GENERATE_DEBUGGING_SYMBOLS = YES; GCC_OPTIMIZATION_LEVEL = 0; ZERO_LINK = YES; }; isa = PBXBuildStyle; name = Development; }; 014CEA530018CE5811CA2923 = { buildSettings = { COPY_PHASE_STRIP = YES; GCC_ENABLE_FIX_AND_CONTINUE = NO; ZERO_LINK = NO; }; isa = PBXBuildStyle; name = Deployment; }; //010 //011 //012 //013 //014 //080 //081 //082 //083 //084 08FB7793FE84155DC02AAC07 = { buildSettings = { }; buildStyles = ( 014CEA520018CE5811CA2923, 014CEA530018CE5811CA2923, ); hasScannedForEncodings = 1; isa = PBXProject; mainGroup = 08FB7794FE84155DC02AAC07; projectDirPath = ""; targets = ( D2AAC0620554660B00DB518D, ); }; 08FB7794FE84155DC02AAC07 = { children = ( 08FB7795FE84155DC02AAC07, 3002DCE708A228360049B4B3, 1AB674ADFE9D54B511CA2CBB, ); isa = PBXGroup; name = "link-grammar"; refType = 4; sourceTree = ""; }; 08FB7795FE84155DC02AAC07 = { children = ( 3002DBB708A220010049B4B3, 3002DB7F08A21FF80049B4B3, 3002DB8008A21FF80049B4B3, 3002DB8108A21FF80049B4B3, 3002DB8208A21FF80049B4B3, 3002DB8308A21FF80049B4B3, 3002DB8408A21FF80049B4B3, 3002DB8508A21FF80049B4B3, 3002DB8608A21FF80049B4B3, 3002DB8708A21FF80049B4B3, 3002DB8808A21FF80049B4B3, 3002DB8908A21FF80049B4B3, 3002DB8A08A21FF80049B4B3, 3002DB8B08A21FF80049B4B3, 3002DB8C08A21FF80049B4B3, 3002DB8D08A21FF80049B4B3, 3002DB8E08A21FF80049B4B3, 3002DB8F08A21FF80049B4B3, 3002DB9008A21FF80049B4B3, 3002DB9108A21FF80049B4B3, 3002DB9208A21FF80049B4B3, 3002DB9308A21FF80049B4B3, 3002DB9408A21FF80049B4B3, 3002DB9508A21FF80049B4B3, 3002DB9608A21FF80049B4B3, 3002DB9708A21FF80049B4B3, 3002DB9808A21FF80049B4B3, 3002DB9908A21FF80049B4B3, 3002DB9A08A21FF80049B4B3, ); isa = PBXGroup; name = Source; refType = 4; sourceTree = ""; }; //080 //081 //082 //083 //084 //1A0 //1A1 //1A2 //1A3 //1A4 1AB674ADFE9D54B511CA2CBB = { children = ( D2AAC0630554660B00DB518D, ); isa = PBXGroup; name = Products; refType = 4; sourceTree = ""; }; //1A0 //1A1 //1A2 //1A3 //1A4 //300 //301 //302 //303 //304 3002DB7F08A21FF80049B4B3 = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = "analyze-linkage.c"; path = "link-grammar/analyze-linkage.c"; refType = 2; sourceTree = SOURCE_ROOT; }; 3002DB8008A21FF80049B4B3 = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = and.c; path = "link-grammar/and.c"; refType = 2; sourceTree = SOURCE_ROOT; }; 3002DB8108A21FF80049B4B3 = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = api.c; path = "link-grammar/api.c"; refType = 2; sourceTree = SOURCE_ROOT; }; 3002DB8208A21FF80049B4B3 = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = "build-disjuncts.c"; path = "link-grammar/build-disjuncts.c"; refType = 2; sourceTree = SOURCE_ROOT; }; 3002DB8308A21FF80049B4B3 = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = "command-line.c"; path = "link-grammar/command-line.c"; refType = 2; sourceTree = SOURCE_ROOT; }; 3002DB8408A21FF80049B4B3 = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = constituents.c; path = "link-grammar/constituents.c"; refType = 2; sourceTree = SOURCE_ROOT; }; 3002DB8508A21FF80049B4B3 = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = count.c; path = "link-grammar/count.c"; refType = 2; sourceTree = SOURCE_ROOT; }; 3002DB8608A21FF80049B4B3 = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = error.c; path = "link-grammar/error.c"; refType = 2; sourceTree = SOURCE_ROOT; }; 3002DB8708A21FF80049B4B3 = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = "extract-links.c"; path = "link-grammar/extract-links.c"; refType = 2; sourceTree = SOURCE_ROOT; }; 3002DB8808A21FF80049B4B3 = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = "fast-match.c"; path = "link-grammar/fast-match.c"; refType = 2; sourceTree = SOURCE_ROOT; }; 3002DB8908A21FF80049B4B3 = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = idiom.c; path = "link-grammar/idiom.c"; refType = 2; sourceTree = SOURCE_ROOT; }; 3002DB8A08A21FF80049B4B3 = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = linkset.c; path = "link-grammar/linkset.c"; refType = 2; sourceTree = SOURCE_ROOT; }; 3002DB8B08A21FF80049B4B3 = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = massage.c; path = "link-grammar/massage.c"; refType = 2; sourceTree = SOURCE_ROOT; }; 3002DB8C08A21FF80049B4B3 = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = "post-process.c"; path = "link-grammar/post-process.c"; refType = 2; sourceTree = SOURCE_ROOT; }; 3002DB8D08A21FF80049B4B3 = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = pp_knowledge.c; path = "link-grammar/pp_knowledge.c"; refType = 2; sourceTree = SOURCE_ROOT; }; 3002DB8E08A21FF80049B4B3 = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = pp_lexer.c; path = "link-grammar/pp_lexer.c"; refType = 2; sourceTree = SOURCE_ROOT; }; 3002DB8F08A21FF80049B4B3 = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = pp_linkset.c; path = "link-grammar/pp_linkset.c"; refType = 2; sourceTree = SOURCE_ROOT; }; 3002DB9008A21FF80049B4B3 = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = prefix.c; path = "link-grammar/prefix.c"; refType = 2; sourceTree = SOURCE_ROOT; }; 3002DB9108A21FF80049B4B3 = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = preparation.c; path = "link-grammar/preparation.c"; refType = 2; sourceTree = SOURCE_ROOT; }; 3002DB9208A21FF80049B4B3 = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = "print-util.c"; path = "link-grammar/print-util.c"; refType = 2; sourceTree = SOURCE_ROOT; }; 3002DB9308A21FF80049B4B3 = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = print.c; path = "link-grammar/print.c"; refType = 2; sourceTree = SOURCE_ROOT; }; 3002DB9408A21FF80049B4B3 = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = prune.c; path = "link-grammar/prune.c"; refType = 2; sourceTree = SOURCE_ROOT; }; 3002DB9508A21FF80049B4B3 = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = "read-dict.c"; path = "link-grammar/read-dict.c"; refType = 2; sourceTree = SOURCE_ROOT; }; 3002DB9608A21FF80049B4B3 = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = resources.c; path = "link-grammar/resources.c"; refType = 2; sourceTree = SOURCE_ROOT; }; 3002DB9708A21FF80049B4B3 = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = "string-set.c"; path = "link-grammar/string-set.c"; refType = 2; sourceTree = SOURCE_ROOT; }; 3002DB9808A21FF80049B4B3 = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = tokenize.c; path = "link-grammar/tokenize.c"; refType = 2; sourceTree = SOURCE_ROOT; }; 3002DB9908A21FF80049B4B3 = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = utilities.c; path = "link-grammar/utilities.c"; refType = 2; sourceTree = SOURCE_ROOT; }; 3002DB9A08A21FF80049B4B3 = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = "word-file.c"; path = "link-grammar/word-file.c"; refType = 2; sourceTree = SOURCE_ROOT; }; 3002DB9B08A21FF80049B4B3 = { fileRef = 3002DB7F08A21FF80049B4B3; isa = PBXBuildFile; settings = { }; }; 3002DB9C08A21FF80049B4B3 = { fileRef = 3002DB8008A21FF80049B4B3; isa = PBXBuildFile; settings = { }; }; 3002DB9D08A21FF80049B4B3 = { fileRef = 3002DB8108A21FF80049B4B3; isa = PBXBuildFile; settings = { }; }; 3002DB9E08A21FF80049B4B3 = { fileRef = 3002DB8208A21FF80049B4B3; isa = PBXBuildFile; settings = { }; }; 3002DB9F08A21FF80049B4B3 = { fileRef = 3002DB8308A21FF80049B4B3; isa = PBXBuildFile; settings = { }; }; 3002DBA008A21FF80049B4B3 = { fileRef = 3002DB8408A21FF80049B4B3; isa = PBXBuildFile; settings = { }; }; 3002DBA108A21FF80049B4B3 = { fileRef = 3002DB8508A21FF80049B4B3; isa = PBXBuildFile; settings = { }; }; 3002DBA208A21FF80049B4B3 = { fileRef = 3002DB8608A21FF80049B4B3; isa = PBXBuildFile; settings = { }; }; 3002DBA308A21FF80049B4B3 = { fileRef = 3002DB8708A21FF80049B4B3; isa = PBXBuildFile; settings = { }; }; 3002DBA408A21FF80049B4B3 = { fileRef = 3002DB8808A21FF80049B4B3; isa = PBXBuildFile; settings = { }; }; 3002DBA508A21FF80049B4B3 = { fileRef = 3002DB8908A21FF80049B4B3; isa = PBXBuildFile; settings = { }; }; 3002DBA608A21FF80049B4B3 = { fileRef = 3002DB8A08A21FF80049B4B3; isa = PBXBuildFile; settings = { }; }; 3002DBA708A21FF80049B4B3 = { fileRef = 3002DB8B08A21FF80049B4B3; isa = PBXBuildFile; settings = { }; }; 3002DBA808A21FF80049B4B3 = { fileRef = 3002DB8C08A21FF80049B4B3; isa = PBXBuildFile; settings = { }; }; 3002DBA908A21FF80049B4B3 = { fileRef = 3002DB8D08A21FF80049B4B3; isa = PBXBuildFile; settings = { }; }; 3002DBAA08A21FF80049B4B3 = { fileRef = 3002DB8E08A21FF80049B4B3; isa = PBXBuildFile; settings = { }; }; 3002DBAB08A21FF80049B4B3 = { fileRef = 3002DB8F08A21FF80049B4B3; isa = PBXBuildFile; settings = { }; }; 3002DBAC08A21FF80049B4B3 = { fileRef = 3002DB9008A21FF80049B4B3; isa = PBXBuildFile; settings = { }; }; 3002DBAD08A21FF80049B4B3 = { fileRef = 3002DB9108A21FF80049B4B3; isa = PBXBuildFile; settings = { }; }; 3002DBAE08A21FF80049B4B3 = { fileRef = 3002DB9208A21FF80049B4B3; isa = PBXBuildFile; settings = { }; }; 3002DBAF08A21FF80049B4B3 = { fileRef = 3002DB9308A21FF80049B4B3; isa = PBXBuildFile; settings = { }; }; 3002DBB008A21FF80049B4B3 = { fileRef = 3002DB9408A21FF80049B4B3; isa = PBXBuildFile; settings = { }; }; 3002DBB108A21FF80049B4B3 = { fileRef = 3002DB9508A21FF80049B4B3; isa = PBXBuildFile; settings = { }; }; 3002DBB208A21FF80049B4B3 = { fileRef = 3002DB9608A21FF80049B4B3; isa = PBXBuildFile; settings = { }; }; 3002DBB308A21FF80049B4B3 = { fileRef = 3002DB9708A21FF80049B4B3; isa = PBXBuildFile; settings = { }; }; 3002DBB408A21FF80049B4B3 = { fileRef = 3002DB9808A21FF80049B4B3; isa = PBXBuildFile; settings = { }; }; 3002DBB508A21FF80049B4B3 = { fileRef = 3002DB9908A21FF80049B4B3; isa = PBXBuildFile; settings = { }; }; 3002DBB608A21FF80049B4B3 = { fileRef = 3002DB9A08A21FF80049B4B3; isa = PBXBuildFile; settings = { }; }; 3002DBB708A220010049B4B3 = { children = ( 3002DBB808A220AD0049B4B3, 3002DBB908A220AD0049B4B3, 3002DBBA08A220AD0049B4B3, 3002DBBB08A220AD0049B4B3, 3002DBBC08A220AD0049B4B3, 3002DBBD08A220AD0049B4B3, 3002DBBE08A220AD0049B4B3, 3002DBBF08A220AD0049B4B3, 3002DBC008A220AD0049B4B3, 3002DBC108A220AD0049B4B3, 3002DBC208A220AD0049B4B3, 3002DBC308A220AD0049B4B3, 3002DBC408A220AD0049B4B3, 3002DBC508A220AD0049B4B3, 3002DBC608A220AD0049B4B3, 3002DBC708A220AD0049B4B3, 3002DBC808A220AD0049B4B3, 3002DBC908A220AD0049B4B3, 3002DBCA08A220AD0049B4B3, 3002DBCB08A220AD0049B4B3, 3002DBCC08A220AD0049B4B3, 3002DBCD08A220AD0049B4B3, 3002DBCE08A220AD0049B4B3, 3002DBCF08A220AD0049B4B3, 3002DBD008A220AD0049B4B3, 3002DBD108A220AD0049B4B3, 3002DBD208A220AD0049B4B3, 3002DBD308A220AD0049B4B3, ); isa = PBXGroup; name = Headers; refType = 4; sourceTree = ""; }; 3002DBB808A220AD0049B4B3 = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "analyze-linkage.h"; path = "link-grammar/analyze-linkage.h"; refType = 2; sourceTree = SOURCE_ROOT; }; 3002DBB908A220AD0049B4B3 = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = and.h; path = "link-grammar/and.h"; refType = 2; sourceTree = SOURCE_ROOT; }; 3002DBBA08A220AD0049B4B3 = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "api-structures.h"; path = "link-grammar/api-structures.h"; refType = 2; sourceTree = SOURCE_ROOT; }; 3002DBBB08A220AD0049B4B3 = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = api.h; path = "link-grammar/api.h"; refType = 2; sourceTree = SOURCE_ROOT; }; 3002DBBC08A220AD0049B4B3 = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = error.h; path = "link-grammar/error.h"; refType = 2; sourceTree = SOURCE_ROOT; }; 3002DBBD08A220AD0049B4B3 = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = externs.h; path = "link-grammar/externs.h"; refType = 2; sourceTree = SOURCE_ROOT; }; 3002DBBE08A220AD0049B4B3 = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "extract-links.h"; path = "link-grammar/extract-links.h"; refType = 2; sourceTree = SOURCE_ROOT; }; 3002DBBF08A220AD0049B4B3 = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "fast-match.h"; path = "link-grammar/fast-match.h"; refType = 2; sourceTree = SOURCE_ROOT; }; 3002DBC008A220AD0049B4B3 = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = idiom.h; path = "link-grammar/idiom.h"; refType = 2; sourceTree = SOURCE_ROOT; }; 3002DBC108A220AD0049B4B3 = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "link-includes.h"; path = "link-grammar/link-includes.h"; refType = 2; sourceTree = SOURCE_ROOT; }; 3002DBC208A220AD0049B4B3 = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = linkset.h; path = "link-grammar/linkset.h"; refType = 2; sourceTree = SOURCE_ROOT; }; 3002DBC308A220AD0049B4B3 = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = massage.h; path = "link-grammar/massage.h"; refType = 2; sourceTree = SOURCE_ROOT; }; 3002DBC408A220AD0049B4B3 = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "post-process.h"; path = "link-grammar/post-process.h"; refType = 2; sourceTree = SOURCE_ROOT; }; 3002DBC508A220AD0049B4B3 = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = pp_knowledge.h; path = "link-grammar/pp_knowledge.h"; refType = 2; sourceTree = SOURCE_ROOT; }; 3002DBC608A220AD0049B4B3 = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = pp_lexer.h; path = "link-grammar/pp_lexer.h"; refType = 2; sourceTree = SOURCE_ROOT; }; 3002DBC708A220AD0049B4B3 = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = pp_linkset.h; path = "link-grammar/pp_linkset.h"; refType = 2; sourceTree = SOURCE_ROOT; }; 3002DBC808A220AD0049B4B3 = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = prefix.h; path = "link-grammar/prefix.h"; refType = 2; sourceTree = SOURCE_ROOT; }; 3002DBC908A220AD0049B4B3 = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = preparation.h; path = "link-grammar/preparation.h"; refType = 2; sourceTree = SOURCE_ROOT; }; 3002DBCA08A220AD0049B4B3 = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "print-util.h"; path = "link-grammar/print-util.h"; refType = 2; sourceTree = SOURCE_ROOT; }; 3002DBCB08A220AD0049B4B3 = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = print.h; path = "link-grammar/print.h"; refType = 2; sourceTree = SOURCE_ROOT; }; 3002DBCC08A220AD0049B4B3 = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = prune.h; path = "link-grammar/prune.h"; refType = 2; sourceTree = SOURCE_ROOT; }; 3002DBCD08A220AD0049B4B3 = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "read-dict.h"; path = "link-grammar/read-dict.h"; refType = 2; sourceTree = SOURCE_ROOT; }; 3002DBCE08A220AD0049B4B3 = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = resources.h; path = "link-grammar/resources.h"; refType = 2; sourceTree = SOURCE_ROOT; }; 3002DBCF08A220AD0049B4B3 = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "string-set.h"; path = "link-grammar/string-set.h"; refType = 2; sourceTree = SOURCE_ROOT; }; 3002DBD008A220AD0049B4B3 = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = structures.h; path = "link-grammar/structures.h"; refType = 2; sourceTree = SOURCE_ROOT; }; 3002DBD108A220AD0049B4B3 = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = tokenize.h; path = "link-grammar/tokenize.h"; refType = 2; sourceTree = SOURCE_ROOT; }; 3002DBD208A220AD0049B4B3 = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = utilities.h; path = "link-grammar/utilities.h"; refType = 2; sourceTree = SOURCE_ROOT; }; 3002DBD308A220AD0049B4B3 = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "word-file.h"; path = "link-grammar/word-file.h"; refType = 2; sourceTree = SOURCE_ROOT; }; 3002DBD408A220AD0049B4B3 = { fileRef = 3002DBB808A220AD0049B4B3; isa = PBXBuildFile; settings = { ATTRIBUTES = ( ); }; }; 3002DBD508A220AD0049B4B3 = { fileRef = 3002DBB908A220AD0049B4B3; isa = PBXBuildFile; settings = { }; }; 3002DBD608A220AD0049B4B3 = { fileRef = 3002DBBA08A220AD0049B4B3; isa = PBXBuildFile; settings = { }; }; 3002DBD708A220AD0049B4B3 = { fileRef = 3002DBBB08A220AD0049B4B3; isa = PBXBuildFile; settings = { }; }; 3002DBD808A220AD0049B4B3 = { fileRef = 3002DBBC08A220AD0049B4B3; isa = PBXBuildFile; settings = { }; }; 3002DBD908A220AD0049B4B3 = { fileRef = 3002DBBD08A220AD0049B4B3; isa = PBXBuildFile; settings = { }; }; 3002DBDA08A220AD0049B4B3 = { fileRef = 3002DBBE08A220AD0049B4B3; isa = PBXBuildFile; settings = { }; }; 3002DBDB08A220AD0049B4B3 = { fileRef = 3002DBBF08A220AD0049B4B3; isa = PBXBuildFile; settings = { }; }; 3002DBDC08A220AD0049B4B3 = { fileRef = 3002DBC008A220AD0049B4B3; isa = PBXBuildFile; settings = { }; }; 3002DBDD08A220AD0049B4B3 = { fileRef = 3002DBC108A220AD0049B4B3; isa = PBXBuildFile; settings = { }; }; 3002DBDE08A220AD0049B4B3 = { fileRef = 3002DBC208A220AD0049B4B3; isa = PBXBuildFile; settings = { }; }; 3002DBDF08A220AD0049B4B3 = { fileRef = 3002DBC308A220AD0049B4B3; isa = PBXBuildFile; settings = { }; }; 3002DBE008A220AD0049B4B3 = { fileRef = 3002DBC408A220AD0049B4B3; isa = PBXBuildFile; settings = { }; }; 3002DBE108A220AD0049B4B3 = { fileRef = 3002DBC508A220AD0049B4B3; isa = PBXBuildFile; settings = { }; }; 3002DBE208A220AD0049B4B3 = { fileRef = 3002DBC608A220AD0049B4B3; isa = PBXBuildFile; settings = { }; }; 3002DBE308A220AD0049B4B3 = { fileRef = 3002DBC708A220AD0049B4B3; isa = PBXBuildFile; settings = { }; }; 3002DBE408A220AD0049B4B3 = { fileRef = 3002DBC808A220AD0049B4B3; isa = PBXBuildFile; settings = { }; }; 3002DBE508A220AD0049B4B3 = { fileRef = 3002DBC908A220AD0049B4B3; isa = PBXBuildFile; settings = { }; }; 3002DBE608A220AD0049B4B3 = { fileRef = 3002DBCA08A220AD0049B4B3; isa = PBXBuildFile; settings = { }; }; 3002DBE708A220AD0049B4B3 = { fileRef = 3002DBCB08A220AD0049B4B3; isa = PBXBuildFile; settings = { }; }; 3002DBE808A220AD0049B4B3 = { fileRef = 3002DBCC08A220AD0049B4B3; isa = PBXBuildFile; settings = { }; }; 3002DBE908A220AD0049B4B3 = { fileRef = 3002DBCD08A220AD0049B4B3; isa = PBXBuildFile; settings = { }; }; 3002DBEA08A220AD0049B4B3 = { fileRef = 3002DBCE08A220AD0049B4B3; isa = PBXBuildFile; settings = { }; }; 3002DBEB08A220AD0049B4B3 = { fileRef = 3002DBCF08A220AD0049B4B3; isa = PBXBuildFile; settings = { }; }; 3002DBEC08A220AD0049B4B3 = { fileRef = 3002DBD008A220AD0049B4B3; isa = PBXBuildFile; settings = { }; }; 3002DBED08A220AD0049B4B3 = { fileRef = 3002DBD108A220AD0049B4B3; isa = PBXBuildFile; settings = { }; }; 3002DBEE08A220AD0049B4B3 = { fileRef = 3002DBD208A220AD0049B4B3; isa = PBXBuildFile; settings = { }; }; 3002DBEF08A220AD0049B4B3 = { fileRef = 3002DBD308A220AD0049B4B3; isa = PBXBuildFile; settings = { }; }; 3002DBF008A225310049B4B3 = { children = ( 3002DC9F08A2261D0049B4B3, ); isa = PBXGroup; name = Data; path = ""; refType = 2; sourceTree = SOURCE_ROOT; }; 3002DC9F08A2261D0049B4B3 = { children = ( 3002DCA008A2263F0049B4B3, ); isa = PBXGroup; name = "link-grammar"; path = ""; refType = 2; sourceTree = SOURCE_ROOT; }; 3002DCA008A2263F0049B4B3 = { children = ( 3002DCA208A2263F0049B4B3, 3002DCA308A2263F0049B4B3, 3002DCA408A2263F0049B4B3, 3002DCA508A2263F0049B4B3, 3002DCA608A2263F0049B4B3, 3002DCA808A2263F0049B4B3, 3002DCA908A2263F0049B4B3, ); isa = PBXGroup; name = en; path = data/en; refType = 2; sourceTree = SOURCE_ROOT; }; 3002DCA208A2263F0049B4B3 = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = text; path = 4.0.affix; refType = 4; sourceTree = ""; }; 3002DCA308A2263F0049B4B3 = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = text; path = 4.0.batch; refType = 4; sourceTree = ""; }; 3002DCA408A2263F0049B4B3 = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = text; path = "4.0.constituent-knowledge"; refType = 4; sourceTree = ""; }; 3002DCA508A2263F0049B4B3 = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = text; path = 4.0.dict; refType = 4; sourceTree = ""; }; 3002DCA608A2263F0049B4B3 = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = text; path = 4.0.knowledge; refType = 4; sourceTree = ""; }; 3002DCA808A2263F0049B4B3 = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = text; path = tiny.dict; refType = 4; sourceTree = ""; }; 3002DCA908A2263F0049B4B3 = { children = ( 3002DCAC08A2263F0049B4B3, 3002DCAD08A2263F0049B4B3, 3002DCAE08A2263F0049B4B3, 3002DCAF08A2263F0049B4B3, 3002DCB008A2263F0049B4B3, 3002DCB108A2263F0049B4B3, 3002DCB208A2263F0049B4B3, 3002DCB308A2263F0049B4B3, 3002DCB408A2263F0049B4B3, 3002DCB508A2263F0049B4B3, 3002DCB608A2263F0049B4B3, 3002DCB708A2263F0049B4B3, 3002DCB808A2263F0049B4B3, 3002DCB908A2263F0049B4B3, 3002DCBA08A2263F0049B4B3, 3002DCBB08A2263F0049B4B3, 3002DCBC08A2263F0049B4B3, 3002DCBD08A2263F0049B4B3, 3002DCBE08A2263F0049B4B3, 3002DCBF08A2263F0049B4B3, 3002DCC008A2263F0049B4B3, 3002DCC108A2263F0049B4B3, 3002DCC208A2263F0049B4B3, 3002DCC308A2263F0049B4B3, 3002DCC408A2263F0049B4B3, 3002DCC508A2263F0049B4B3, 3002DCC608A2263F0049B4B3, 3002DCC708A2263F0049B4B3, 3002DCC808A2263F0049B4B3, 3002DCC908A2263F0049B4B3, 3002DCCA08A2263F0049B4B3, 3002DCCB08A2263F0049B4B3, 3002DCCC08A2263F0049B4B3, 3002DCCD08A2263F0049B4B3, 3002DCCE08A2263F0049B4B3, 3002DCCF08A2263F0049B4B3, 3002DCD008A2263F0049B4B3, 3002DCD108A2263F0049B4B3, 3002DCD208A2263F0049B4B3, 3002DCD308A2263F0049B4B3, 3002DCD408A2263F0049B4B3, 3002DCD508A2263F0049B4B3, 3002DCD608A2263F0049B4B3, 3002DCD708A2263F0049B4B3, 3002DCD808A2263F0049B4B3, 3002DCD908A2263F0049B4B3, 3002DCDA08A2263F0049B4B3, 3002DCDB08A2263F0049B4B3, 3002DCDC08A2263F0049B4B3, 3002DCDD08A2263F0049B4B3, ); isa = PBXGroup; path = words; refType = 4; sourceTree = ""; }; 3002DCAC08A2263F0049B4B3 = { explicitFileType = text; fileEncoding = 30; isa = PBXFileReference; path = words.adj.1; refType = 4; sourceTree = ""; }; 3002DCAD08A2263F0049B4B3 = { explicitFileType = text; fileEncoding = 30; isa = PBXFileReference; path = words.adj.2; refType = 4; sourceTree = ""; }; 3002DCAE08A2263F0049B4B3 = { explicitFileType = text; fileEncoding = 30; isa = PBXFileReference; path = words.adj.3; refType = 4; sourceTree = ""; }; 3002DCAF08A2263F0049B4B3 = { explicitFileType = text; fileEncoding = 30; isa = PBXFileReference; path = words.adv.1; refType = 4; sourceTree = ""; }; 3002DCB008A2263F0049B4B3 = { explicitFileType = text; fileEncoding = 30; isa = PBXFileReference; path = words.adv.2; refType = 4; sourceTree = ""; }; 3002DCB108A2263F0049B4B3 = { explicitFileType = text; fileEncoding = 30; isa = PBXFileReference; path = words.adv.3; refType = 4; sourceTree = ""; }; 3002DCB208A2263F0049B4B3 = { explicitFileType = text; fileEncoding = 30; isa = PBXFileReference; path = words.n.1; refType = 4; sourceTree = ""; }; 3002DCB308A2263F0049B4B3 = { explicitFileType = text; fileEncoding = 30; isa = PBXFileReference; path = words.n.2.s; refType = 4; sourceTree = ""; }; 3002DCB408A2263F0049B4B3 = { explicitFileType = text; fileEncoding = 30; isa = PBXFileReference; path = words.n.2.x; refType = 4; sourceTree = ""; }; 3002DCB508A2263F0049B4B3 = { explicitFileType = text; fileEncoding = 30; isa = PBXFileReference; path = words.n.3; refType = 4; sourceTree = ""; }; 3002DCB608A2263F0049B4B3 = { explicitFileType = text; fileEncoding = 30; isa = PBXFileReference; path = words.n.4; refType = 4; sourceTree = ""; }; 3002DCB708A2263F0049B4B3 = { explicitFileType = text; fileEncoding = 30; isa = PBXFileReference; path = words.n.c.1; refType = 4; sourceTree = ""; }; 3002DCB808A2263F0049B4B3 = { explicitFileType = text; fileEncoding = 30; isa = PBXFileReference; path = words.n.c.2; refType = 4; sourceTree = ""; }; 3002DCB908A2263F0049B4B3 = { explicitFileType = text; fileEncoding = 30; isa = PBXFileReference; path = words.n.p; refType = 4; sourceTree = ""; }; 3002DCBA08A2263F0049B4B3 = { explicitFileType = text; fileEncoding = 30; isa = PBXFileReference; path = words.n.t; refType = 4; sourceTree = ""; }; 3002DCBB08A2263F0049B4B3 = { explicitFileType = text; fileEncoding = 30; isa = PBXFileReference; path = words.s; refType = 4; sourceTree = ""; }; 3002DCBC08A2263F0049B4B3 = { explicitFileType = text; fileEncoding = 30; isa = PBXFileReference; path = words.v.1.1; refType = 4; sourceTree = ""; }; 3002DCBD08A2263F0049B4B3 = { explicitFileType = text; fileEncoding = 30; isa = PBXFileReference; path = words.v.1.2; refType = 4; sourceTree = ""; }; 3002DCBE08A2263F0049B4B3 = { explicitFileType = text; fileEncoding = 30; isa = PBXFileReference; path = words.v.1.3; refType = 4; sourceTree = ""; }; 3002DCBF08A2263F0049B4B3 = { explicitFileType = text; fileEncoding = 30; isa = PBXFileReference; path = words.v.1.4; refType = 4; sourceTree = ""; }; 3002DCC008A2263F0049B4B3 = { explicitFileType = text; fileEncoding = 30; isa = PBXFileReference; path = words.v.1.p; refType = 4; sourceTree = ""; }; 3002DCC108A2263F0049B4B3 = { explicitFileType = text; fileEncoding = 30; isa = PBXFileReference; path = words.v.10.1; refType = 4; sourceTree = ""; }; 3002DCC208A2263F0049B4B3 = { explicitFileType = text; fileEncoding = 30; isa = PBXFileReference; path = words.v.10.2; refType = 4; sourceTree = ""; }; 3002DCC308A2263F0049B4B3 = { explicitFileType = text; fileEncoding = 30; isa = PBXFileReference; path = words.v.10.3; refType = 4; sourceTree = ""; }; 3002DCC408A2263F0049B4B3 = { explicitFileType = text; fileEncoding = 30; isa = PBXFileReference; path = words.v.10.4; refType = 4; sourceTree = ""; }; 3002DCC508A2263F0049B4B3 = { explicitFileType = text; fileEncoding = 30; isa = PBXFileReference; path = words.v.2.1; refType = 4; sourceTree = ""; }; 3002DCC608A2263F0049B4B3 = { explicitFileType = text; fileEncoding = 30; isa = PBXFileReference; path = words.v.2.2; refType = 4; sourceTree = ""; }; 3002DCC708A2263F0049B4B3 = { explicitFileType = text; fileEncoding = 30; isa = PBXFileReference; path = words.v.2.3; refType = 4; sourceTree = ""; }; 3002DCC808A2263F0049B4B3 = { explicitFileType = text; fileEncoding = 30; isa = PBXFileReference; path = words.v.2.4; refType = 4; sourceTree = ""; }; 3002DCC908A2263F0049B4B3 = { explicitFileType = text; fileEncoding = 30; isa = PBXFileReference; path = words.v.2.5; refType = 4; sourceTree = ""; }; 3002DCCA08A2263F0049B4B3 = { explicitFileType = text; fileEncoding = 30; isa = PBXFileReference; path = words.v.4.1; refType = 4; sourceTree = ""; }; 3002DCCB08A2263F0049B4B3 = { explicitFileType = text; fileEncoding = 30; isa = PBXFileReference; path = words.v.4.2; refType = 4; sourceTree = ""; }; 3002DCCC08A2263F0049B4B3 = { explicitFileType = text; fileEncoding = 30; isa = PBXFileReference; path = words.v.4.3; refType = 4; sourceTree = ""; }; 3002DCCD08A2263F0049B4B3 = { explicitFileType = text; fileEncoding = 30; isa = PBXFileReference; path = words.v.4.4; refType = 4; sourceTree = ""; }; 3002DCCE08A2263F0049B4B3 = { explicitFileType = text; fileEncoding = 30; isa = PBXFileReference; path = words.v.4.5; refType = 4; sourceTree = ""; }; 3002DCCF08A2263F0049B4B3 = { explicitFileType = text; fileEncoding = 30; isa = PBXFileReference; path = words.v.5.1; refType = 4; sourceTree = ""; }; 3002DCD008A2263F0049B4B3 = { explicitFileType = text; fileEncoding = 30; isa = PBXFileReference; path = words.v.5.2; refType = 4; sourceTree = ""; }; 3002DCD108A2263F0049B4B3 = { explicitFileType = text; fileEncoding = 30; isa = PBXFileReference; path = words.v.5.3; refType = 4; sourceTree = ""; }; 3002DCD208A2263F0049B4B3 = { explicitFileType = text; fileEncoding = 30; isa = PBXFileReference; path = words.v.5.4; refType = 4; sourceTree = ""; }; 3002DCD308A2263F0049B4B3 = { explicitFileType = text; fileEncoding = 30; isa = PBXFileReference; path = words.v.6.1; refType = 4; sourceTree = ""; }; 3002DCD408A2263F0049B4B3 = { explicitFileType = text; fileEncoding = 30; isa = PBXFileReference; path = words.v.6.2; refType = 4; sourceTree = ""; }; 3002DCD508A2263F0049B4B3 = { explicitFileType = text; fileEncoding = 30; isa = PBXFileReference; path = words.v.6.3; refType = 4; sourceTree = ""; }; 3002DCD608A2263F0049B4B3 = { explicitFileType = text; fileEncoding = 30; isa = PBXFileReference; path = words.v.6.4; refType = 4; sourceTree = ""; }; 3002DCD708A2263F0049B4B3 = { explicitFileType = text; fileEncoding = 30; isa = PBXFileReference; path = words.v.6.5; refType = 4; sourceTree = ""; }; 3002DCD808A2263F0049B4B3 = { explicitFileType = text; fileEncoding = 30; isa = PBXFileReference; path = words.v.8.1; refType = 4; sourceTree = ""; }; 3002DCD908A2263F0049B4B3 = { explicitFileType = text; fileEncoding = 30; isa = PBXFileReference; path = words.v.8.2; refType = 4; sourceTree = ""; }; 3002DCDA08A2263F0049B4B3 = { explicitFileType = text; fileEncoding = 30; isa = PBXFileReference; path = words.v.8.3; refType = 4; sourceTree = ""; }; 3002DCDB08A2263F0049B4B3 = { explicitFileType = text; fileEncoding = 30; isa = PBXFileReference; path = words.v.8.4; refType = 4; sourceTree = ""; }; 3002DCDC08A2263F0049B4B3 = { explicitFileType = text; fileEncoding = 30; isa = PBXFileReference; path = words.v.8.5; refType = 4; sourceTree = ""; }; 3002DCDD08A2263F0049B4B3 = { explicitFileType = text; fileEncoding = 30; isa = PBXFileReference; path = words.y; refType = 4; sourceTree = ""; }; 3002DCE708A228360049B4B3 = { children = ( 3002DBF008A225310049B4B3, ); isa = PBXGroup; name = Resources; path = ""; refType = 2; sourceTree = SOURCE_ROOT; }; //300 //301 //302 //303 //304 //D20 //D21 //D22 //D23 //D24 D289988505E68E00004EDB86 = { buildActionMask = 2147483647; files = ( ); isa = PBXFrameworksBuildPhase; runOnlyForDeploymentPostprocessing = 0; }; D2AAC0600554660B00DB518D = { buildActionMask = 2147483647; files = ( 3002DBD408A220AD0049B4B3, 3002DBD508A220AD0049B4B3, 3002DBD608A220AD0049B4B3, 3002DBD708A220AD0049B4B3, 3002DBD808A220AD0049B4B3, 3002DBD908A220AD0049B4B3, 3002DBDA08A220AD0049B4B3, 3002DBDB08A220AD0049B4B3, 3002DBDC08A220AD0049B4B3, 3002DBDD08A220AD0049B4B3, 3002DBDE08A220AD0049B4B3, 3002DBDF08A220AD0049B4B3, 3002DBE008A220AD0049B4B3, 3002DBE108A220AD0049B4B3, 3002DBE208A220AD0049B4B3, 3002DBE308A220AD0049B4B3, 3002DBE408A220AD0049B4B3, 3002DBE508A220AD0049B4B3, 3002DBE608A220AD0049B4B3, 3002DBE708A220AD0049B4B3, 3002DBE808A220AD0049B4B3, 3002DBE908A220AD0049B4B3, 3002DBEA08A220AD0049B4B3, 3002DBEB08A220AD0049B4B3, 3002DBEC08A220AD0049B4B3, 3002DBED08A220AD0049B4B3, 3002DBEE08A220AD0049B4B3, 3002DBEF08A220AD0049B4B3, ); isa = PBXHeadersBuildPhase; runOnlyForDeploymentPostprocessing = 0; }; D2AAC0610554660B00DB518D = { buildActionMask = 2147483647; files = ( 3002DB9B08A21FF80049B4B3, 3002DB9C08A21FF80049B4B3, 3002DB9D08A21FF80049B4B3, 3002DB9E08A21FF80049B4B3, 3002DB9F08A21FF80049B4B3, 3002DBA008A21FF80049B4B3, 3002DBA108A21FF80049B4B3, 3002DBA208A21FF80049B4B3, 3002DBA308A21FF80049B4B3, 3002DBA408A21FF80049B4B3, 3002DBA508A21FF80049B4B3, 3002DBA608A21FF80049B4B3, 3002DBA708A21FF80049B4B3, 3002DBA808A21FF80049B4B3, 3002DBA908A21FF80049B4B3, 3002DBAA08A21FF80049B4B3, 3002DBAB08A21FF80049B4B3, 3002DBAC08A21FF80049B4B3, 3002DBAD08A21FF80049B4B3, 3002DBAE08A21FF80049B4B3, 3002DBAF08A21FF80049B4B3, 3002DBB008A21FF80049B4B3, 3002DBB108A21FF80049B4B3, 3002DBB208A21FF80049B4B3, 3002DBB308A21FF80049B4B3, 3002DBB408A21FF80049B4B3, 3002DBB508A21FF80049B4B3, 3002DBB608A21FF80049B4B3, ); isa = PBXSourcesBuildPhase; runOnlyForDeploymentPostprocessing = 0; }; D2AAC0620554660B00DB518D = { buildPhases = ( D2AAC0600554660B00DB518D, D2AAC0610554660B00DB518D, D289988505E68E00004EDB86, ); buildRules = ( ); buildSettings = { DYLIB_COMPATIBILITY_VERSION = 6; DYLIB_CURRENT_VERSION = 6.3; GCC_GENERATE_DEBUGGING_SYMBOLS = NO; GCC_PREPROCESSOR_DEFINITIONS = "PACKAGE=\"link-grammar\" VERSION=\"4.2.3\" DICTIONARY_DIR=\\\"\\\" HAVE_DLFCN_H=1 HAVE_UNISTD_H=1 HAVE_STDINT_H=1 HAVE_INTTYPES_H=1 HAVE_STRINGS_H=1 HAVE_MEMORY_H=1 HAVE_STRING_H=1 HAVE_STDLIB_H=1 HAVE_SYS_STAT_H=1 HAVE_SYS_TYPES_H=1 STDC_HEADERS=1"; HEADER_SEARCH_PATHS = "$(SRCROOT)"; INSTALL_PATH = "@executable_path/../Frameworks"; LIBRARY_STYLE = DYNAMIC; MACOSX_DEPLOYMENT_TARGET = 10.2; PRODUCT_NAME = "liblink-grammar"; VERSIONING_SYSTEM = ""; }; dependencies = ( ); isa = PBXNativeTarget; name = "liblink-grammar"; productName = "link-grammar"; productReference = D2AAC0630554660B00DB518D; productType = "com.apple.product-type.library.dynamic"; }; D2AAC0630554660B00DB518D = { explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; isa = PBXFileReference; path = "liblink-grammar.dylib"; refType = 3; sourceTree = BUILT_PRODUCTS_DIR; }; }; rootObject = 08FB7793FE84155DC02AAC07; } link-grammar-4.7.4/link-grammar.pc.in0000644000175000017500000000036610750641767016445 0ustar bloombloomprefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ Name: link-grammar Description: A natural language parser based on link grammar theory Version: @VERSION@ Libs: -L${libdir} -llink-grammar Cflags: -I${includedir} link-grammar-4.7.4/link-grammar/0000755000175000017500000000000011531775723015505 5ustar bloombloomlink-grammar-4.7.4/link-grammar/and.c0000644000175000017500000014220511526022265016405 0ustar bloombloom/*************************************************************************/ /* Copyright (c) 2004 */ /* Daniel Sleator, David Temperley, and John Lafferty */ /* All rights reserved */ /* */ /* Use of the link grammar parsing system is subject to the terms of the */ /* license set forth in the LICENSE file included with this software, */ /* and also available at http://www.link.cs.cmu.edu/link/license.html */ /* This license allows free redistribution and use in source and binary */ /* forms, with or without modification, subject to certain conditions. */ /* */ /*************************************************************************/ #include #include "disjunct-utils.h" /* Notes about AND A large fraction of the code of this parser seems to deal with handling conjunctions. This comment (combined with reading the paper) should give an idea of how it works. First of all, we need a more detailed discussion of strings, what they match, etc. (This entire discussion ignores the labels, which are semantically the same as the leading upper case letters of the connector.) We'll deal with infinite strings from an alphabet of three types of characters: "*". "^" and ordinary characters (denoted "a" and "b"). (The end of a string should be thought of as an infinite sequence of "*"s). Let match(s) be the set of strings that will match the string s. This is defined as follows. A string t is in match(s) if (1) its leading upper case letters exactly match those of s. (2) traversing through both strings, from left to right in step, no missmatch is found between corresponding letters. A missmatch is a pair of differing ordinary characters, or a "^" and any ordinary letter or two "^"s. In other words, a match is exactly a "*" and anything, or two identical ordinary letters. Alternative definition of the set match(s): {t | t is obtained from s by replacing each "^" and any other characters by "*"s, and replacing any original "*" in s by any other character (or "^").} Theorem: if t in match(s) then s in match(t). It is also a theorem that given any two strings s and t, there exists a unique new string u with the property that: match(u) = match(s) intersect match(t) This string is called the GCD of s and t. Here are some examples. GCD(N*a,Nb) = Nba GCD(Na, Nb) = N^ GCD(Nab,Nb) = N^b GCD(N^,N*a) = N^a GCD(N^, N) = N^ GCD(N^^,N^) = N^^ We need an algorithm for computing the GCD of two strings. Here is one. First get by the upper case letters (which must be equal, otherwise there is no intersection), issuing them. Traverse the rest of the characters of s and t in lockstep until there is nothing left but "*"s. If the two characters are: "a" and "a", issue "a" "a" and "b", issue "^" "a" and "*", issue "a" "*" and "*", issue "*" "*" and "^", issue "^" "a" and "^", issue "^" "^" and "^", issue "^" A simple case analysis suffices to show that any string that matches the right side, must match both of the left sides, and any string not matching the right side must not match at least one of the left sides. This proves that the GCD operator is associative and commutative. (There must be a name for a mathematical structure with these properties.) To elaborate further on this theory, define the notion of two strings matching in the dual sense as follows: s and t dual-match if match(s) is contained in match(t) or vice versa--- Full development of this theory could lead to a more efficient algorithm for this problem. I'll defer this until such time as it appears necessary. We need a data structure that stores a set of fat links. Each fat link has a number (called its label). The fat link operates in liu of a collection of links. The particular stuff it is a substitute for is defined by a disjunct. This disjunct is stored in the data structure. The type of a disjunct is defined by the sequence of connector types (defined by their upper case letters) that comprises it. Each entry of the label_table[] points to a list of disjuncts that have the same type (a hash table is uses so that, given a disjunct, we can efficiently compute the element of the label table in which it belongs). We begin by loading up the label table with all of the possible fat links that occur through the words of the sentence. These are obtained by taking every sub-range of the connectors of each disjunct (containing the center). We also compute the closure (under the GCD operator) of these disjuncts and store also store these in the label_table. Each disjunct in this table has a string which represents the subscripts of all of its connectors (and their multi-connector bits). It is possible to generate a fat connector for any one of the disjuncts in the label_table. This connector's label field is given the label from the disjunct from which it arose. It's string field is taken from the string of the disjunct (mentioned above). It will be given a priority with a value of UP_priority or DOWN_priority (depending on how it will be used). A connector of UP_priority can match one of DOWN_priority, but neither of these can match any other priority. (Of course, a fat connector can match only another fat connector with the same label.) The paper describes in some detail how disjuncts are given to words and to "and" and ",", etc. Each word in the sentence gets many more new disjuncts. For each contiguous set of connectors containing (or adjacent to) the center of the disjunct, we generate a fat link, and replace these connector in the word by a fat link. (Actually we do this twice. Once pointing to the right, once to the left.) These fat links have priority UP_priority. What do we generate for ","? For each type of fat link (each label) we make a disjunct that has two down connectors (to the right and left) and one up connector (to the right). There will be a unique way of hooking together a comma-separated and-list. The disjuncts on "and" are more complicated. Here we have to do just what we did for comma (but also include the up link to the left), then we also have to allow the process to terminate. So, there is a disjunct with two down fat links, and between them are the original thin links. These are said to "blossom" out. However, this is not all that is necessary. It's possible for an and-list to be part of another and list with a different labeled fat connector. To make this possible, we regroup the just blossomed disjuncts (in all possible ways about the center) and install them as fat links. If this sounds like a lot of disjuncts -- it is! The program is currently fairly slow on long sentence with and. It is slightly non-obvious that the fat-links in a linkage constructed from disjuncts defined in this way form a binary tree. Naturally, connectors with UP_priority point up the tree, and those with DOWN_priority point down the tree. Think of the string x on the connector as representing a set X of strings. X = match(x). So, for example, if x="S^" then match(x) = {"S", "S*a", "S*b", etc}. The matching rules for UP and DOWN priority connectors are such that as you go up (the tree of ands) the X sets get no larger. So, for example, a "Sb" pointing up can match an "S^" pointing down. (Because more stuff can match "Sb" than can match "S^".) This guarantees that whatever connector ultimately gets used after the fat connector blossoms out (see below), it is a powerful enough connector to be able to match to any of the connectors associated with it. One problem with the scheme just descibed is that it sometimes generates essentially the same linkage several times. This happens if there is a gap in the connective power, and the mismatch can be moved around in different ways. Here is an example of how this happens. (Left is DOWN, right is UP) Sa <---> S^ <---> S or Sa <---> Sa <---> S fat thin fat thin Here two of the disjunct types are given by "S^" and "Sa". Notice that the criterion of shrinking the matching set is satisfied by the the fat link (traversing from left to right). How do I eliminate one of these? I use the technique of canonization. I generate all the linkages. There is then a procedure that can check to see of a linkage is canonical. If it is, it's used, otherwise it's ignored. It's claimed that exactly one canonical one of each equivalence class will be generated. We basically insist that the intermediate fat disjuncts (ones that have a fat link pointing down) are all minimal -- that is, that they cannot be replaced by by another (with a strictly) smaller match set. If one is not minimal, then the linkage is rejected. Here's a proof that this is correct. Consider the set of equivalent linkages that are generated. These Pick a disjunct that is the root of its tree. Consider the set of all disjuncts which occur in that positon among the equivalent linkages. The GCD of all of these can fit in that position (it matches down the tree, since its match set has gotten smaller, and it also matches to the THIN links.) Since the GCD is put on "and" this particular one will be generated. Therefore rejecting a linkage in which a root fat disjunct can be replaced by a smaller one is ok (since the smaller one will be generated separately). What about a fat disjunct that is not the root. We consider the set of linkages in which the root is minimal (the ones for which it's not have already been eliminated). Now, consider one of the children of the root in precisely the way we just considered the root. The same argument holds. The only difference is that the root node gives another constraint on how small you can make the disjunct -- so, within these constraints, if we can go smaller, we reject. The code to do all of this is fairly ugly, but I think it works. Problems with this stuff: 1) There is obviously a combinatorial explosion that takes place. As the number of disjuncts (and the number of their subscripts increase) the number of disjuncts that get put onto "and" will increase tremendously. When we made the transcript for the tech report (Around August 1991) most of the sentence were processed in well under 10 seconds. Now (Jan 1992), some of these sentences take ten times longer. As of this writing I don't really know the reason, other than just the fact that the dictionary entries are more complex than they used to be. The number of linkages has also increased significantly. 2) Each element of an and list must be attached through only one word. This disallows "there is time enough and space enough for both of us", and many other reasonable sounding things. The combinatorial explosion that would occur if you allowed two different connection points would be tremendous, and the number of solutions would also probably go up by another order of magnitude. Perhaps if there were strong constraints on the type of connectors in which this would be allowed, then this would be a conceivable prospect. 3) A multi-connector must be either all "outside" or all "inside" the and. For example, "the big black dog and cat ran" has only two ways to linkages (instead of three). Possible bug: It seems that the following two linkages should be the same under the canonical linkage test. Could this have to do with the pluralization system? > I am big and the bike and the car were broken Accepted (4 linkages, 4 with no P.P. violations) at stage 1 Linkage 1, cost vector = (0, 0, 18) +------Spx-----+ +-----CC-----+------Wd------+-d^^*i^-+ | +-Wd-+Spi+-Pa+ | +--Ds-+d^^*+ +-Ds-+ +--Pv-+ | | | | | | | | | | | | ///// I.p am big.a and the bike.n and the car.n were broken ///// RW <---RW----> RW ///// ///// Wd <---Wd----> Wd I.p I.p CC <---CC----> CC and I.p Sp*i <---Spii--> Spi am am Pa <---Pa----> Pa big.a and Wd <---Wd----> Wd and bike.n d^s** 6<---d^^*i-> d^^*i 6 and the D <---Ds----> Ds bike.n and Sp <---Spx---> Spx were and d^^*i 6<---d^^*i-> d^s** 6 car.n the D <---Ds----> Ds car.n were Pv <---Pv----> Pv broken (press return for another) > Linkage 2, cost vector = (0, 0, 18) +------Spx-----+ +-----CC-----+------Wd------+-d^s**^-+ | +-Wd-+Spi+-Pa+ | +--Ds-+d^s*+ +-Ds-+ +--Pv-+ | | | | | | | | | | | | ///// I.p am big.a and the bike.n and the car.n were broken ///// RW <---RW----> RW ///// ///// Wd <---Wd----> Wd I.p I.p CC <---CC----> CC and I.p Sp*i <---Spii--> Spi am am Pa <---Pa----> Pa big.a and Wd <---Wd----> Wd and bike.n d^s** 6<---d^s**-> d^s** 6 and the D <---Ds----> Ds bike.n and Sp <---Spx---> Spx were and d^s** 6<---d^s**-> d^s** 6 car.n the D <---Ds----> Ds car.n were Pv <---Pv----> Pv broken */ static void init_LT(Sentence sent) { sent->and_data.LT_bound = 20; sent->and_data.LT_size = 0; sent->and_data.label_table = (Disjunct **) xalloc(sent->and_data.LT_bound * sizeof(Disjunct *)); } static void grow_LT(Sentence sent) { size_t oldsize = sent->and_data.LT_bound * sizeof(Disjunct *); sent->and_data.LT_bound = (3*sent->and_data.LT_bound)/2; sent->and_data.label_table = (Disjunct **) xrealloc(sent->and_data.label_table, oldsize, sent->and_data.LT_bound * sizeof(Disjunct *)); } static void init_HT(Sentence sent) { memset(sent->and_data.hash_table, 0, HT_SIZE*sizeof(Label_node *)); } static void free_HT(Sentence sent) { int i; Label_node * la, * la1; for (i=0; iand_data.hash_table[i]; la != NULL; la = la1) { la1 = la->next; xfree((char *)la, sizeof(Label_node)); } sent->and_data.hash_table[i] = NULL; } } static void free_LT(Sentence sent) { int i; for (i=0; iand_data.LT_size; i++) { free_disjuncts(sent->and_data.label_table[i]); } xfree((char *) sent->and_data.label_table, sent->and_data.LT_bound * sizeof(Disjunct*)); sent->and_data.LT_bound = 0; sent->and_data.LT_size = 0; sent->and_data.label_table = NULL; } void free_AND_tables(Sentence sent) { free_LT(sent); free_HT(sent); } void initialize_conjunction_tables(Sentence sent) { int i; sent->and_data.LT_bound = 0; sent->and_data.LT_size = 0; sent->and_data.label_table = NULL; for (i=0; iand_data.hash_table[i] = NULL; } } /** * This is a hash function for disjuncts */ static inline int and_hash_disjunct(Disjunct *d) { unsigned int i; Connector *e; i = 0; for (e = d->left ; e != NULL; e = e->next) { i += connector_hash(e); } i += (i<<5); for (e = d->right ; e != NULL; e = e->next) { i += connector_hash(e); } return (i & (HT_SIZE-1)); } /** * Returns TRUE if the disjunct is appropriate to be made into fat links. * Check here that the connectors are from some small set. * This will disallow, for example "the and their dog ran". */ static int is_appropriate(Sentence sent, Disjunct * d) { Connector * c; if (sent->dict->andable_connector_set == NULL) return TRUE; /* if no set, then everything is considered andable */ for (c = d->right; c!=NULL; c=c->next) { if (!match_in_connector_set(sent, sent->dict->andable_connector_set, c, '+')) return FALSE; } for (c = d->left; c!=NULL; c=c->next) { if (!match_in_connector_set(sent, sent->dict->andable_connector_set, c, '-')) return FALSE; } return TRUE; } /** * Two connectors are said to be of the same type if they have * the same label, and the initial upper case letters of their * strings match. */ static int connector_types_equal(Connector * c1, Connector * c2) { if (c1->label != c2->label) return FALSE; return utf8_upper_match(c1->string, c2->string); } /** * Two disjuncts are said to be the same type if they're the same * ignoring the multi fields, the priority fields, and the subscripts * of the connectors (and the string field of the disjunct of course). * Disjuncts of the same type are located in the same label_table list. * * This returns TRUE if they are of the same type. */ static int disjunct_types_equal(Disjunct * d1, Disjunct * d2) { Connector *e1, *e2; e1 = d1->left; e2 = d2->left; while((e1!=NULL) && (e2!=NULL)) { if (!connector_types_equal(e1,e2)) break; e1 = e1->next; e2 = e2->next; } if ((e1!=NULL) || (e2!=NULL)) return FALSE; e1 = d1->right; e2 = d2->right; while((e1!=NULL) && (e2!=NULL)) { if (!connector_types_equal(e1,e2)) break; e1 = e1->next; e2 = e2->next; } if ((e1!=NULL) || (e2!=NULL)) return FALSE; return TRUE; } /** * This returns a string that is the the GCD of the two given strings. * If the GCD is equal to one of them, a pointer to it is returned. * Otherwise a new string for the GCD is xalloced and put on the * "free later" list. */ const char * intersect_strings(Sentence sent, const char * s, const char * t) { int len, i, j, d; const char *w, *s0; char u0[MAX_TOKEN_LENGTH]; /* Links are *always* less than 10 chars long */ char *u; if (strcmp(s,t)==0) return s; /* would work without this */ i = strlen(s); j = strlen(t); if (j > i) { w = s; s = t; t = w; len = j; } else { len = i; } /* s is now the longer (at least not the shorter) string */ /* and len is its length */ u = u0; d = 0; s0 = s; while (*t != '\0') { if ((*s == *t) || (*t == '*')) { *u = *s; } else { d++; if (*s == '*') *u = *t; else *u = '^'; } s++; t++; u++; } if (d==0) { return s0; } else { strcpy(u, s); /* get the remainder of s */ return string_set_add(u0, sent->string_set); } } /** * Two connectors are said to be equal if they are of the same type * (defined above), they have the same multi field, and they have * exactly the same connectors (including lower case chars). * (priorities ignored). */ static int connectors_equal_AND(Connector *c1, Connector *c2) { return (c1->label == c2->label) && (c1->multi == c2->multi) && (strcmp(c1->string, c2->string) == 0); } /** * Return true if the disjuncts are equal (ignoring priority fields) * and the string of the disjunct. */ static int disjuncts_equal_AND(Sentence sent, Disjunct * d1, Disjunct * d2) { Connector *e1, *e2; sent->and_data.STAT_calls_to_equality_test++; e1 = d1->left; e2 = d2->left; while((e1!=NULL) && (e2!=NULL)) { if (!connectors_equal_AND(e1, e2)) break; e1 = e1->next; e2 = e2->next; } if ((e1!=NULL) || (e2!=NULL)) return FALSE; e1 = d1->right; e2 = d2->right; while((e1!=NULL) && (e2!=NULL)) { if (!connectors_equal_AND(e1, e2)) break; e1 = e1->next; e2 = e2->next; } if ((e1!=NULL) || (e2!=NULL)) return FALSE; return TRUE; } /** * Create a new disjunct that is the GCD of d1 and d2. * It assumes that the disjuncts are of the same type, so the * GCD will not be empty. */ static Disjunct * intersect_disjuncts(Sentence sent, Disjunct * d1, Disjunct * d2) { Disjunct * d; Connector *c1, *c2, *c; d = copy_disjunct(d1); c = d->left; c1 = d1->left; c2 = d2->left; while (c1!=NULL) { connector_set_string (c, intersect_strings(sent, c1->string, c2->string)); c->multi = (c1->multi) && (c2->multi); c = c->next; c1 = c1->next; c2 = c2->next; } c = d->right; c1 = d1->right; c2 = d2->right; while (c1!=NULL) { connector_set_string (c, intersect_strings(sent, c1->string, c2->string)); c->multi = (c1->multi) && (c2->multi); c = c->next; c1 = c1->next; c2 = c2->next; } return d; } /** * (1) look for the given disjunct in the table structures * if it's already in the table structures, do nothing * (2) otherwise make a copy of it, and put it into the table structures * (3) also put all of the GCDs of this disjunct with all of the * other matching disjuncts into the table. * * The costs are set to zero. * Note that this has no effect on disjunct d. */ static void put_disjunct_into_table(Sentence sent, Disjunct *d) { Disjunct *d1=NULL, *d2, *di, *d_copy; Label_node * lp; int h, k; h = and_hash_disjunct(d); for (lp = sent->and_data.hash_table[h]; lp != NULL; lp = lp->next) { d1 = sent->and_data.label_table[lp->label]; if (disjunct_types_equal(d,d1)) break; } if (lp != NULL) { /* there is already a label for disjuncts of this type */ /* d1 points to the list of disjuncts of this type already there */ while(d1 != NULL) { if (disjuncts_equal_AND(sent, d1, d)) return; d1 = d1->next; } /* now we must put the d disjunct in there, and all of the GCDs of it with the ones already there. This is done as follows. We scan through the list of disjuncts computing the gcd of the new one with each of the others, putting the resulting disjuncts onto another list rooted at d2. Now insert d into the the list already there. Now for each one on the d2 list, put it in if it isn't already there. Here we're making use of the following theorem: Given a collection of sets s1, s2 ... sn closed under intersection, to if we add a new set s to the collection and also add all the intersections between s and s1...sn to the collection, then the collection is still closed under intersection. Use a Venn diagram to prove this theorem. */ d_copy = copy_disjunct(d); d_copy->cost = 0; k = lp->label; d2 = NULL; for (d1=sent->and_data.label_table[k]; d1!=NULL; d1 = d1->next) { di = intersect_disjuncts(sent, d_copy, d1); di->next = d2; d2 = di; } d_copy->next = sent->and_data.label_table[k]; sent->and_data.label_table[k] = d_copy; for (;d2 != NULL; d2 = di) { di = d2->next; for (d1 = sent->and_data.label_table[k]; d1 != NULL; d1 = d1->next) { if (disjuncts_equal_AND(sent, d1, d2)) break; } if (d1 == NULL) { sent->and_data.STAT_N_disjuncts++; d2->next = sent->and_data.label_table[k]; sent->and_data.label_table[k] = d2; } else { d2->next = NULL; free_disjuncts(d2); } } } else { /* create a new label for disjuncts of this type */ d_copy = copy_disjunct(d); d_copy->cost = 0; d_copy->next = NULL; if (sent->and_data.LT_size == sent->and_data.LT_bound) grow_LT(sent); lp = (Label_node *) xalloc(sizeof(Label_node)); lp->next = sent->and_data.hash_table[h]; sent->and_data.hash_table[h] = lp; lp->label = sent->and_data.LT_size; sent->and_data.label_table[sent->and_data.LT_size] = d_copy; sent->and_data.LT_size++; sent->and_data.STAT_N_disjuncts++; } } /** * A sub disjuct of d is any disjunct obtained by killing the tail * of either connector list at any point. * Here we go through each sub-disjunct of d, and put it into our * table data structure. * * The function has no side effects on d. */ static void extract_all_fat_links(Sentence sent, Disjunct * d) { Connector * cl, * cr, *tl, *tr; tl = d->left; d->left = NULL; for (cr = d->right; cr!=NULL; cr = cr->next) { tr = cr->next; cr->next = NULL; if (is_appropriate(sent, d)) put_disjunct_into_table(sent, d); cr->next = tr; } d->left = tl; tr = d->right; d->right = NULL; for (cl = d->left; cl!=NULL; cl = cl->next) { tl = cl->next; cl->next = NULL; if (is_appropriate(sent, d)) put_disjunct_into_table(sent, d); cl->next = tl; } d->right = tr; for (cl = d->left; cl!=NULL; cl = cl->next) { for (cr = d->right; cr!=NULL; cr = cr->next) { tl = cl->next; tr = cr->next; cl->next = cr->next = NULL; if (is_appropriate(sent, d)) put_disjunct_into_table(sent, d); cl->next = tl; cr->next = tr; } } } /** * put the next len characters from c->string (skipping upper * case ones) into s. If there are fewer than this, pad with '*'s. * Then put in a character for the multi match bit of c. * Then put in a '\0', and return a pointer to this place. */ static char * stick_in_one_connector(char *s, Connector *c, int len) { const char * t; t = skip_utf8_upper(c->string); while (*t != '\0') { *s++ = *t++; len--; } while (len > 0) { *s++ = '*'; len--; } if (c->multi) *s++ = '*'; else *s++ = '^'; /* check this sometime */ *s = '\0'; return s; } /** * This takes a label k, modifies the list of disjuncts with that * label. For each such disjunct, it computes the string that * will be used in the fat connector that represents it. * * The only hard part is finding the length of each of the strings * so that "*" can be put in. A better explanation will have to wait. */ static void compute_matchers_for_a_label(Sentence sent, int k) { char buff[2*MAX_WORD]; int lengths[MAX_LINKS]; int N_connectors, i, j; Connector * c; Disjunct * d; const char *cs; char *s; d = sent->and_data.label_table[k]; N_connectors = 0; for (c=d->left; c != NULL; c = c->next) N_connectors ++; for (c=d->right; c != NULL; c = c->next) N_connectors ++; for (i=0; ileft; c != NULL; c = c->next) { cs = skip_utf8_upper(c->string); j = strlen(cs); if (j > lengths[i]) lengths[i] = j; i++; } for (c=d->right; c != NULL; c = c->next) { cs = c->string; cs = skip_utf8_upper(cs); j = strlen(cs); if (j > lengths[i]) lengths[i] = j; i++; } d = d->next; } for (d = sent->and_data.label_table[k]; d!= NULL; d = d->next) { i=0; s = buff; for (c=d->left; c != NULL; c = c->next) { s = stick_in_one_connector(s, c, lengths[i]); i++; } for (c=d->right; c != NULL; c = c->next) { s = stick_in_one_connector(s, c, lengths[i]); i++; } d->string = string_set_add(buff, sent->string_set); } } /** * Goes through the entire sentence and builds the fat link tables * for all the disjuncts of all the words. */ void build_conjunction_tables(Sentence sent) { int w; int k; Disjunct * d; init_HT(sent); init_LT(sent); sent->and_data.STAT_N_disjuncts = 0; sent->and_data.STAT_calls_to_equality_test = 0; for (w=0; wlength; w++) { for (d=sent->word[w].d; d!=NULL; d=d->next) { extract_all_fat_links(sent, d); } } for (k=0; kand_data.LT_size; k++) { compute_matchers_for_a_label(sent, k); } } void print_AND_statistics(Sentence sent) { printf("Number of disjunct types (labels): %d\n", sent->and_data.LT_size); printf("Number of disjuncts in the table: %d\n", sent->and_data.STAT_N_disjuncts); if (sent->and_data.LT_size != 0) { printf("average list length: %f\n", (float)sent->and_data.STAT_N_disjuncts/sent->and_data.LT_size); } printf("Number of equality tests: %d\n", sent->and_data.STAT_calls_to_equality_test); } /** * Fill in the fields of c for the disjunct. This must be in * the table data structures. The label field and the string field * are filled in appropriately. Priority is set to UP_priority. */ static void connector_for_disjunct(Sentence sent, Disjunct * d, Connector * c) { int h; Disjunct * d1 = NULL; Label_node * lp; h = and_hash_disjunct(d); for (lp = sent->and_data.hash_table[h]; lp != NULL; lp = lp->next) { d1 = sent->and_data.label_table[lp->label]; if (disjunct_types_equal(d,d1)) break; } assert(lp != NULL, "A disjunct I inserted was not there. (1)"); while(d1 != NULL) { if (disjuncts_equal_AND(sent, d1, d)) break; d1 = d1->next; } assert(d1 != NULL, "A disjunct I inserted was not there. (2)"); c->label = lp->label; connector_set_string(c, d1->string); c->priority = UP_priority; c->multi = FALSE; } /** * This function allocates and returns a list of disjuncts. * This is the one obtained by substituting each contiguous * non-empty subrange of d (incident on the center) by an appropriate * fat link, in two possible positions. Does not effect d. * The cost of d is inherited by all of the disjuncts in the result. */ static Disjunct * build_fat_link_substitutions(Sentence sent, Disjunct *d) { Connector * cl, * cr, *tl, *tr, *wc, work_connector; Disjunct *d1, *wd, work_disjunct, *d_list; if (d==NULL) return NULL; wd = &work_disjunct; wc = init_connector(&work_connector); d_list = NULL; *wd = *d; tl = d->left; d->left = NULL; for (cr = d->right; cr!=NULL; cr = cr->next) { tr = cr->next; cr->next = NULL; if (is_appropriate(sent, d)) { connector_for_disjunct(sent, d, wc); wd->left = tl; wd->right = wc; wc->next = tr; d1 = copy_disjunct(wd); d1->next = d_list; d_list = d1; wd->left = wc; wc->next = tl; wd->right = tr; d1 = copy_disjunct(wd); d1->next = d_list; d_list = d1; } cr->next = tr; } d->left = tl; tr = d->right; d->right = NULL; for (cl = d->left; cl!=NULL; cl = cl->next) { tl = cl->next; cl->next = NULL; if (is_appropriate(sent, d)) { connector_for_disjunct(sent, d, wc); wd->left = tl; wd->right = wc; wc->next = tr; d1 = copy_disjunct(wd); d1->next = d_list; d_list = d1; wd->left = wc; wc->next = tl; wd->right = tr; d1 = copy_disjunct(wd); d1->next = d_list; d_list = d1; } cl->next = tl; } d->right = tr; for (cl = d->left; cl!=NULL; cl = cl->next) { for (cr = d->right; cr!=NULL; cr = cr->next) { tl = cl->next; tr = cr->next; cl->next = cr->next = NULL; if (is_appropriate(sent, d)) { connector_for_disjunct(sent, d, wc); wd->left = tl; wd->right = wc; wc->next = tr; d1 = copy_disjunct(wd); d1->next = d_list; d_list = d1; wd->left = wc; wc->next = tl; wd->right = tr; d1 = copy_disjunct(wd); d1->next = d_list; d_list = d1; } cl->next = tl; cr->next = tr; } } return d_list; } /** * This is basically a "map" function for build_fat_link_substitutions. * It's applied to the disjuncts for all regular words of the sentence. */ Disjunct * explode_disjunct_list(Sentence sent, Disjunct *d) { Disjunct *d1; d1 = NULL; for (; d!=NULL; d = d->next) { d1 = catenate_disjuncts(d1, build_fat_link_substitutions(sent, d)); } return d1; } /** * Builds and returns a disjunct list for the comma. These are the * disjuncts that are used when "," operates in conjunction with "and". * Does not deal with the ", and" issue, nor the other uses * of comma. */ Disjunct * build_COMMA_disjunct_list(Sentence sent) { int lab; Disjunct *d1, *d2, *d, work_disjunct, *wd; Connector work_connector1, work_connector2, *c1, *c2; Connector work_connector3, *c3; c1 = init_connector(&work_connector1); c2 = init_connector(&work_connector2); c3 = init_connector(&work_connector3); wd = &work_disjunct; d1 = NULL; /* where we put the list we're building */ c1->next = NULL; c2->next = c3; c3->next = NULL; c1->priority = c3->priority = DOWN_priority; c2->priority = UP_priority; c1->multi = c2->multi = c3->multi = FALSE; wd->left = c1; wd->right = c2; wd->string = ","; /* *** fix this later?? */ wd->next = NULL; wd->cost = 0; for (lab = 0; lab < sent->and_data.LT_size; lab++) { for (d = sent->and_data.label_table[lab]; d!=NULL; d=d->next) { c1->string = c2->string = c3->string = d->string; c1->label = c2->label = c3->label = lab; d2 = copy_disjunct(wd); d2->next = d1; d1 = d2; } } return d1; } /** * Builds and returns a disjunct list for "and", "or" and "nor" * for each disjunct in the label_table, we build three disjuncts * this means that "Danny and Tycho and Billy" will be parsable in * two ways. I don't know an easy way to avoid this * the string is either "and", or "or", or "nor" at the moment. */ Disjunct * build_AND_disjunct_list(Sentence sent, char * s) { int lab; Disjunct *d_list, *d1, *d3, *d, *d_copy; Connector *c1, *c2, *c3; d_list = NULL; /* where we put the list we're building */ for (lab = 0; lab < sent->and_data.LT_size; lab++) { for (d = sent->and_data.label_table[lab]; d!=NULL; d=d->next) { d1 = build_fat_link_substitutions(sent, d); d_copy = copy_disjunct(d); /* also include the thing itself! */ d_copy->next = d1; d1 = d_copy; for(;d1 != NULL; d1 = d3) { d3 = d1->next; c1 = connector_new(); c2 = connector_new(); c1->priority = c2->priority = DOWN_priority; connector_set_string(c1, d->string); connector_set_string(c2, d->string); c1->label = c2->label = lab; d1->string = s; if (d1->right == NULL) { d1->right = c2; } else { for (c3=d1->right; c3->next != NULL; c3 = c3->next) ; c3->next = c2; } if (d1->left == NULL) { d1->left = c1; } else { for (c3=d1->left; c3->next != NULL; c3 = c3->next) ; c3->next = c1; } d1->next = d_list; d_list = d1; } } } #if defined(PLURALIZATION) /* here is where "and" makes singular into plural. */ /* must accommodate "he and I are good", "Davy and I are good" "Danny and Davy are good", and reject all of these with "is" instead of "are". The SI connectors must also be modified to accommodate "are John and Dave here", but kill "is John and Dave here" */ if (strcmp(s, "and") == 0) { for (d1 = d_list; d1 != NULL; d1 = d1->next) { for (c1 = d1->right; c1 != NULL; c1 = c1->next) { if ((c1->string[0] == 'S') && ((c1->string[1] == '^') || (c1->string[1] == 's') || (c1->string[1] == 'p') || (c1->string[1] == '\0'))) { connector_set_string(c1, "Sp"); } } for (c1 = d1->left; c1 != NULL; c1 = c1->next) { if ((c1->string[0] == 'S') && (c1->string[1] == 'I') && ((c1->string[2] == '^') || (c1->string[2] == 's') || (c1->string[2] == 'p') || (c1->string[2] == '\0'))) { connector_set_string(c1, "SIp"); } } } } /* "a cat or a dog is here" vs "a cat or a dog are here" The first seems right, the second seems wrong. I'll stick with this. That is, "or" has the property that if both parts are the same in number, we use that but if they differ, we use plural. The connectors on "I" must be handled specially. We accept "I or the dogs are here" but reject "I or the dogs is here" */ /* the code here still does now work "right", rejecting "is John or I invited" and accepting "I or my friend know what happened" The more generous code for "nor" has been used instead */ /* else if (strcmp(s, "or") == 0) { for (d1 = d_list; d1!=NULL; d1=d1->next) { for (c1=d1->right; c1!=NULL; c1=c1->next) { if (c1->string[0] == 'S') { if (c1->string[1]=='^') { if (c1->string[2]=='a') { connector_set_string(c1, "Ss"); } else { connector_set_string(c1, "Sp"); } } else if ((c1->string[1]=='p') && (c1->string[2]=='a')){ connector_set_string(c1, "Sp"); } } } for (c1=d1->left; c1!=NULL; c1=c1->next) { if ((c1->string[0] == 'S') && (c1->string[1] == 'I')) { if (c1->string[2]=='^') { if (c1->string[3]=='a') { connector_set_string(c1, "Ss"); } else { connector_set_string(c1, "Sp"); } } else if ((c1->string[2]=='p') && (c1->string[3]=='a')){ connector_set_string(c1, "Sp"); } } } } } */ /* It appears that the "nor" of two things can be either singular or plural. "neither she nor John likes dogs" "neither she nor John like dogs" */ else if ((strcmp(s,"nor")==0) || (strcmp(s,"or")==0)) { for (d1 = d_list; d1!=NULL; d1=d1->next) { for (c1=d1->right; c1!=NULL; c1=c1->next) { if ((c1->string[0] == 'S') && ((c1->string[1]=='^') || (c1->string[1]=='s') || (c1->string[1]=='p'))) { connector_set_string(c1, "S"); } } for (c1=d1->left; c1!=NULL; c1=c1->next) { if ((c1->string[0] == 'S') && (c1->string[1] == 'I') && ((c1->string[2]=='^') || (c1->string[2]=='s') || (c1->string[2]=='p'))) { connector_set_string(c1, "SI"); } } } } #endif return d_list; } /* The following routines' purpose is to eliminate all but the canonical linkage (of a collection of linkages that are identical except for fat links). An example of the problem is "I went to a talk and ate lunch". Without the canonical checker this has two linkages with identical structure. We restrict our attention to a collection of linkages that are all isomorphic. Consider the set of all disjuncts that are used on one word (over the collection of linkages). This set is closed under GCD, since two linkages could both be used in that position, then so could their GCD. The GCD has been constructed and put in the label table. The canonical linkage is the one in which the minimal disjunct that ever occurrs in a position is used in that position. It is easy to prove that a disjunct is not canonical -- just find one of it's fat disjuncts that can be replaced by a smaller one. If this can not be done, then the linkage is canonical. The algorithm uses link_array[] and chosen_disjuncts[] as input to describe the linkage, and also uses the label_table. (1) find all the words with fat disjuncts (2) scan all links and build, for each fat disjucnt used, an "image" structure that contains what this disjunct must connect to in the rest of the linkage. (3) For each fat disjunct, run through the label_table for disjuncts with the same label, considering only those with strictly more restricted match sets (this uses the string fields of the disjuncts from the table). (4) For each that passes this test, we see if it can replace the chosen disjunct. This is performed by examining how this disjunct compares with the image structure for this word. */ struct Image_node_struct { Image_node * next; Connector * c; /* the connector the place on the disjunct must match */ int place; /* Indicates the place in the fat disjunct where this connector must connect. If 0 then this is a fat connector. If >0 then go place to the right, if <0 then go -place to the left. */ }; /** * Fill in the has_fat_down array. Uses link_array[]. * Returns TRUE if there exists at least one word with a * fat down label. */ int set_has_fat_down(Sentence sent) { int link, w, N_fat; Parse_info pi = sent->parse_info; N_fat = 0; for (w = 0; w < pi->N_words; w++) { pi->has_fat_down[w] = FALSE; } for (link = 0; link < pi->N_links; link++) { if (pi->link_array[link].lc->priority == DOWN_priority) { N_fat ++; pi->has_fat_down[pi->link_array[link].l] = TRUE; } else if (pi->link_array[link].rc->priority == DOWN_priority) { N_fat ++; pi->has_fat_down[pi->link_array[link].r] = TRUE; } } return (N_fat > 0); } static void free_image_array(Parse_info pi) { int w; Image_node * in, * inx; for (w = 0; w < pi->N_words; w++) { for (in = pi->image_array[w]; in != NULL; in = inx) { inx = in->next; xfree((char *)in, sizeof(Image_node)); } pi->image_array[w] = NULL; } } /** * Uses link_array, chosen_disjuncts, and down_label to construct * image_array */ static void build_image_array(Sentence sent) { int link, end, word; Connector * this_end_con, *other_end_con, * upcon, * updiscon, *clist; Disjunct * dis, * updis; Image_node * in; Parse_info pi = sent->parse_info; for (word=0; wordN_words; word++) { pi->image_array[word] = NULL; } for (end = -1; end <= 1; end += 2) { for (link = 0; link < pi->N_links; link++) { if (end < 0) { word = pi->link_array[link].l; if (!pi->has_fat_down[word]) continue; this_end_con = pi->link_array[link].lc; other_end_con = pi->link_array[link].rc; dis = pi->chosen_disjuncts[word]; clist = dis->right; } else { word = pi->link_array[link].r; if (!pi->has_fat_down[word]) continue; this_end_con = pi->link_array[link].rc; other_end_con = pi->link_array[link].lc; dis = pi->chosen_disjuncts[word]; clist = dis->left; } if (this_end_con->priority == DOWN_priority) continue; if ((this_end_con->label != NORMAL_LABEL) && (this_end_con->label < 0)) continue; /* no need to construct an image node for down links, or commas links or either/neither links */ in = (Image_node *) xalloc(sizeof(Image_node)); in->next = pi->image_array[word]; pi->image_array[word] = in; in->c = other_end_con; /* the rest of this code is for computing in->place */ if (this_end_con->priority == UP_priority) { in->place = 0; } else { in->place = 1; if ((dis->left != NULL) && (dis->left->priority == UP_priority)) { upcon = dis->left; } else if ((dis->right != NULL) && (dis->right->priority == UP_priority)) { upcon = dis->right; } else { upcon = NULL; } if (upcon != NULL) { /* add on extra for a fat up link */ updis = sent->and_data.label_table[upcon->label]; if (end > 0) { updiscon = updis->left; } else { updiscon = updis->right; } for (;updiscon != NULL; updiscon = updiscon->next) { in->place ++; } } for (; clist != this_end_con; clist = clist->next) { if (clist->label < 0) in->place++; } in->place = in->place * (-end); } } } } /** * returns TRUE if string s represents a strictly smaller match set * than does t */ static int strictly_smaller(const char * s, const char * t) { int strictness; strictness = 0; for (;(*s!='\0') && (*t!='\0'); s++,t++) { if (*s == *t) continue; if ((*t == '*') || (*s == '^')) { strictness++; } else { return FALSE; } } assert(! ((*s!='\0') || (*t!='\0')), "s and t should be the same length!"); return (strictness > 0); } /** * dis points to a disjunct in the label_table. label is the label * of a different set of disjuncts. These can be derived from the label * of dis. Find the specific disjunct of in label_table[label] * which corresponds to dis. */ static Disjunct * find_subdisjunct(Sentence sent, Disjunct * dis, int label) { Disjunct * d; Connector * cx, *cy; for (d=sent->and_data.label_table[label]; d!=NULL; d=d->next) { for (cx=d->left, cy=dis->left; cx!=NULL; cx=cx->next,cy=cy->next) { /* if ((cx->string != cy->string) || */ if ((strcmp(connector_get_string(cx), connector_get_string(cy)) != 0) || (cx->multi != cy->multi)) break;/* have to check multi? */ } if (cx!=NULL) continue; for (cx=d->right, cy=dis->right; cx!=NULL; cx=cx->next,cy=cy->next) { /* if ((cx->string != cy->string) || */ if ((strcmp(connector_get_string(cx), connector_get_string(cy)) != 0) || (cx->multi != cy->multi)) break; } if (cx==NULL) break; } assert(d!=NULL, "Never found subdisjunct"); return d; } /** * is_canonical_linkage -- * This uses link_array[], chosen_disjuncts[], has_fat_down[]. * It assumes that there is a fat link in the current linkage. * See the comments above for more information about how it works */ int is_canonical_linkage(Sentence sent) { int w, d_label=0, place; Connector *d_c, *c, dummy_connector, *upcon; Disjunct *dis, *chosen_d; Image_node * in; Parse_info pi = sent->parse_info; init_connector(&dummy_connector); dummy_connector.priority = UP_priority; build_image_array(sent); for (w=0; wN_words; w++) { if (!pi->has_fat_down[w]) continue; chosen_d = pi->chosen_disjuncts[w]; /* there must be a down connector in both the left and right list */ for (d_c = chosen_d->left; d_c!=NULL; d_c=d_c->next) { if (d_c->priority == DOWN_priority) { d_label = d_c->label; break; } } assert(d_c != NULL, "Should have found the down link."); if ((chosen_d->left != NULL) && (chosen_d->left->priority == UP_priority)) { upcon = chosen_d->left; } else if ((chosen_d->right != NULL) && (chosen_d->right->priority == UP_priority)) { upcon = chosen_d->right; } else { upcon = NULL; } /* check that the disjunct on w is minimal (canonical) */ for (dis=sent->and_data.label_table[d_label]; dis!=NULL; dis=dis->next) { /* now, reject a disjunct if it's not strictly below the old */ if(!strictly_smaller(dis->string, connector_get_string(d_c))) continue; /* Now, it has to match the image connectors */ for (in = pi->image_array[w]; in != NULL; in = in->next) { place = in->place; if (place == 0) { assert(upcon != NULL, "Should have found an up link"); dummy_connector.label = upcon->label; /* now we have to compute the string of the disjunct with upcon->label that corresponds to dis */ if (upcon->label == d_label) { connector_set_string(&dummy_connector, dis->string); } else { connector_set_string(&dummy_connector, find_subdisjunct(sent, dis, upcon->label)->string); } /* I hope using x_match here is right */ if (!x_match(sent, &dummy_connector, in->c)) break; } else if (place > 0) { for (c=dis->right; place > 1; place--) { c = c->next; } if (!x_match(sent, c, in->c)) break; /* Ditto above comment --DS 07/97*/ } else { for (c=dis->left; place < -1; place++) { c = c->next; } if (!x_match(sent, c, in->c)) break; /* Ditto Ditto */ } } if (in == NULL) break; } if (dis != NULL) break; /* there is a better disjunct that the one we're using, so this word is bad, so we're done */ } free_image_array(pi); return (w == pi->N_words); } /** * This takes as input link_array[], sublinkage->link[]->l and * sublinkage->link[]->r (and also has_fat_down[word], which has been * computed in a prior call to is_canonical()), and from these * computes sublinkage->link[].lc and .rc. We assume these have * been initialized with the values from link_array. We also assume * that there are fat links. */ void compute_pp_link_array_connectors(Sentence sent, Sublinkage *sublinkage) { int link, end, word, place; Connector * this_end_con, * upcon, * updiscon, *clist, *con, *mycon; Disjunct * dis, * updis, *mydis; Parse_info pi = sent->parse_info; for (end = -1; end <= 1; end += 2) { for (link=0; linkN_links; link++) { if (sublinkage->link[link]->l == -1) continue; if (end < 0) { word = pi->link_array[link].l; if (!pi->has_fat_down[word]) continue; this_end_con = pi->link_array[link].lc; dis = pi->chosen_disjuncts[word]; mydis = pi->chosen_disjuncts[sublinkage->link[link]->l]; clist = dis->right; } else { word = pi->link_array[link].r; if (!pi->has_fat_down[word]) continue; this_end_con = pi->link_array[link].rc; dis = pi->chosen_disjuncts[word]; mydis = pi->chosen_disjuncts[sublinkage->link[link]->r]; clist = dis->left; } if (this_end_con->label != NORMAL_LABEL) continue; /* no need to construct a connector for up links, or commas links or either/neither links */ /* Now compute the place */ place = 0; if ((dis->left != NULL) && (dis->left->priority == UP_priority)) { upcon = dis->left; } else if ((dis->right != NULL) && (dis->right->priority == UP_priority)) { upcon = dis->right; } else { upcon = NULL; } if (upcon != NULL) { /* add on extra for a fat up link */ updis = sent->and_data.label_table[upcon->label]; if (end > 0) { updiscon = updis->left; } else { updiscon = updis->right; } for (;updiscon != NULL; updiscon = updiscon->next) { place ++; } } for (; clist != this_end_con; clist = clist->next) { if (clist->label < 0) place++; } /* place has just been computed */ /* now find the right disjunct in the table */ if ((mydis->left != NULL) && (mydis->left->priority == UP_priority)) { mycon = mydis->left; } else if ((mydis->right != NULL) && (mydis->right->priority == UP_priority)) { mycon = mydis->right; } else { printf("word = %d\n", word); printf("fat link: [%d, %d]\n", pi->link_array[link].l, pi->link_array[link].r); printf("thin link: [%d, %d]\n", sublinkage->link[link]->l, sublinkage->link[link]->r); assert(FALSE, "There should be a fat UP link here"); } for (dis=sent->and_data.label_table[mycon->label]; dis != NULL; dis=dis->next) { if (dis->string == connector_get_string(mycon)) break; } assert(dis!=NULL, "Should have found this connector string"); /* the disjunct in the table has just been found */ if (end < 0) { for (con = dis->right; place > 0; place--, con=con->next) {} /* sublinkage->link[link]->lc = con; OLD CODE */ exfree_connectors(sublinkage->link[link]->lc); sublinkage->link[link]->lc = excopy_connectors(con); } else { for (con = dis->left; place > 0; place--, con=con->next) {} /* sublinkage->link[link]->rc = con; OLD CODE */ exfree_connectors(sublinkage->link[link]->rc); sublinkage->link[link]->rc = excopy_connectors(con); } } } } link-grammar-4.7.4/link-grammar/java/0000755000175000017500000000000011531775723016426 5ustar bloombloomlink-grammar-4.7.4/link-grammar/java/org/0000755000175000017500000000000011531775722017214 5ustar bloombloomlink-grammar-4.7.4/link-grammar/java/org/linkgrammar/0000755000175000017500000000000011531775723021521 5ustar bloombloomlink-grammar-4.7.4/link-grammar/java/org/linkgrammar/Link.java0000644000175000017500000000320611133204637023247 0ustar bloombloom /*************************************************************************/ /* */ /* Use of the link grammar parsing system is subject to the terms of the */ /* license set forth in the LICENSE file included with this software. */ /* This license allows free redistribution and use in source and binary */ /* forms, with or without modification, subject to certain conditions. */ /* */ /*************************************************************************/ package org.linkgrammar; /** * Represents a Link Grammar link as part of a parse result. * Link objects contain the indices of the word they link to as well * as an identifier of the type of link and label for the left and * right connectors. * * @author Borislav Iordanov * */ public class Link { private int left, right; private String label, leftLabel, rightLabel; public int getLeft() { return left; } public void setLeft(int left) { this.left = left; } public int getRight() { return right; } public void setRight(int right) { this.right = right; } public String getLabel() { return label; } public void setLabel(String label) { this.label = label; } public String getLeftLabel() { return leftLabel; } public void setLeftLabel(String leftLabel) { this.leftLabel = leftLabel; } public String getRightLabel() { return rightLabel; } public void setRightLabel(String rightLabel) { this.rightLabel = rightLabel; } } link-grammar-4.7.4/link-grammar/java/org/linkgrammar/LinkGrammar.java0000644000175000017500000000761411350565473024576 0ustar bloombloom/*************************************************************************/ /* */ /* Use of the link grammar parsing system is subject to the terms of the */ /* license set forth in the LICENSE file included with this software. */ /* This license allows free redistribution and use in source and binary */ /* forms, with or without modification, subject to certain conditions. */ /* */ /*************************************************************************/ package org.linkgrammar; /** * This class serves as a wrapper to the C Link Grammar Parser library. * It provides a simple public Java API to the equivalent public C API. * * Unfortunately, this class is not at all OOP in style; it operates on * the single, current sentence and linkage. This could be improved. */ public class LinkGrammar { static { // On a Linux system, the actual name of the library // is prefixed with "lib" and suffixed with ".so" // -- e.g. "liblink-grammar-java.so" // Windows looks for "link-grammar-java.dll" // MacOS looks for "liblink-grammar-java.dylib" // // On a Windows system, we also need to load the prequisite // libraries first. (Linux loaders do this automatically). // Actually, I guess Windows does this too, unless the user // failed to add the working directory to %PATH // String osname = System.getProperty("os.name"); if (osname.indexOf("win") > -1 || osname.indexOf("Win") > -1) { System.loadLibrary("link-grammar"); } // if (osname.indexOf("Mac OS X") > -1) {} System.loadLibrary("link-grammar-java"); } //! Get the version string for the parser. public static native String getVersion(); //! Get the version string for the dictionary. public static native String getDictVersion(); // C functions for changing linkparser options public static native void setMaxParseSeconds(int maxParseSeconds); public static native void setMaxCost(int maxCost); // Defaults to /usr/local/share/link-grammar/ public static native void setDictionariesPath(String path); // C functions in the linkparser API public static native void init(); public static native void parse(String sent); public static native void close(); // C sentence access functions public static native int getNumWords(); public static native String getWord(int i); // Get the inflected form of the word. public static native String getLinkageWord(int i); // Get string representing the disjunct actually used. public static native String getLinkageDisjunct(int i); public static native int getNumSkippedWords(); // C linkage access functions public static native int getNumLinkages(); public static native void makeLinkage(int index); public static native int getLinkageNumViolations(); public static native int getLinkageAndCost(); public static native int getLinkageDisjunctCost(); public static native int getLinkageLinkCost(); public static native int getNumLinks(); public static native int getLinkLWord(int link); public static native int getLinkRWord(int link); public static native String getLinkLLabel(int link); public static native String getLinkRLabel(int link); public static native String getLinkLabel(int link); public static native String getConstituentString(); public static native String getLinkString(); public static native String getLinkageSense(int word, int sense); public static native double getLinkageSenseScore(int word, int sense); // OTHER UTILITY C FUNCTIONS public static native boolean isPastTenseForm(String word); public static native boolean isEntity(String word); } link-grammar-4.7.4/link-grammar/java/org/linkgrammar/JSONReader.java0000644000175000017500000002422611222431335024247 0ustar bloombloom/* * Copyright 2009 Borislav Iordanov * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or * implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.linkgrammar; import java.math.BigDecimal; import java.math.BigInteger; import java.text.CharacterIterator; import java.text.StringCharacterIterator; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class JSONReader { private static final Object OBJECT_END = new Object(); private static final Object ARRAY_END = new Object(); private static final Object COLON = new Object(); private static final Object COMMA = new Object(); public static final int FIRST = 0; public static final int CURRENT = 1; public static final int NEXT = 2; private static Map escapes = new HashMap(); static { escapes.put(new Character('"'), new Character('"')); escapes.put(new Character('\\'), new Character('\\')); escapes.put(new Character('/'), new Character('/')); escapes.put(new Character('b'), new Character('\b')); escapes.put(new Character('f'), new Character('\f')); escapes.put(new Character('n'), new Character('\n')); escapes.put(new Character('r'), new Character('\r')); escapes.put(new Character('t'), new Character('\t')); } private CharacterIterator it; private char c; // private Object token; private StringBuffer buf = new StringBuffer(); private void error(String msg) { throw new RuntimeException("JSON parse error near position " + it.getIndex() + ":" + msg); } private char next() { c = it.next(); return c; } private char previous() { c = it.previous(); return c; } private void skipWhiteSpace() { do { if (Character.isWhitespace(c)) ; else if (c == '/') { next(); if (c == '*') { // skip multiline comments while (c != CharacterIterator.DONE) if (next() == '*' && next() == '/') break; if (c == CharacterIterator.DONE) throw new RuntimeException( "Unterminated comment while parsing JSON string."); } else if (c == '/') while (c != '\n' && c != CharacterIterator.DONE) next(); else { previous(); break; } } else break; } while (next() != CharacterIterator.DONE); } public Object read(CharacterIterator ci, int start) { it = ci; switch (start) { case FIRST: c = it.first(); break; case CURRENT: c = it.current(); break; case NEXT: c = it.next(); break; } return read(); } public Object read(CharacterIterator it) { return read(it, NEXT); } public Object read(String string) { return read(new StringCharacterIterator(string), FIRST); } private Object read() { skipWhiteSpace(); char ch = c; next(); Object value = null; switch (ch) { case '"': value = string(); break; case '[': value = array(); break; case ']': value = ARRAY_END; break; case ',': value = COMMA; break; case '{': value = object(); break; case '}': value = OBJECT_END; break; case ':': value = COLON; break; case 't': if (c != 'r' || next() != 'u' || next() != 'e') error("Invalid JSON token: expected 'true' keyword."); next(); value = Boolean.TRUE; break; case 'f': if (c != 'a' || next() != 'l' || next() != 's' || next() != 'e') error( "Invalid JSON token: expected 'false' keyword."); next(); value = Boolean.FALSE; break; case 'n': if (c != 'u' || next() != 'l' || next() != 'l') error("Invalid JSON token: expected 'null' keyword."); next(); value = null; break; default: c = it.previous(); if (Character.isDigit(c) || c == '-') value = number(); else error("Invalid character '" + c + "', expecting a JSON token."); } return value; } private boolean isValue(Object x) { return x == null || x instanceof Boolean || x instanceof String || x instanceof Number || x instanceof Map || x instanceof List; } private Object object() { Map ret = new HashMap(); Object key = read(); while (key != OBJECT_END) { if (! (key instanceof String)) error("Expecting a string as key in object, but got '" + key + "'"); Object colon = read(); if (colon != COLON) error("Expecting a colon, but found '" + colon + "' after object key '" + key + "'"); Object value = read(); if (!isValue(value)) error("Unexpected value in object with key '" + key + "' -- '" + value + "', expecting boolean, number string, array or object."); ret.put(key, value); key = read(); if (key == COMMA) key = read(); else if (key != OBJECT_END) error("Unexpected token in object '" + key + "', expecting comma or }."); } return ret; } private Object array() { List ret = new ArrayList(); Object value = read(); while (value != ARRAY_END) { if (!isValue(value)) error("Unexpected value in array '" + value + "', expecting boolean, number string, array or object."); ret.add(value); value = read(); if (value == COMMA) value = read(); else if (value != ARRAY_END) error("Unexpected token in array '" + value + "', expecting comma or ]."); } return ret; } private Object number() { int length = 0; boolean isFloatingPoint = false; buf.setLength(0); if (c == '-') { add(c); } length += addDigits(); if (c == '.') { add(c); length += addDigits(); isFloatingPoint = true; } if (c == 'e' || c == 'E') { add(c); if (c == '+' || c == '-') { add(c); } addDigits(); isFloatingPoint = true; } String s = buf.toString(); return isFloatingPoint ? (length < 17) ? (Object) Double.valueOf(s) : new BigDecimal(s) : (length < 20) ? (Object) Long.valueOf(s) : new BigInteger(s); } private int addDigits() { int ret; for (ret = 0; Character.isDigit(c); ++ret) { add(c); } return ret; } private Object string() { buf.setLength(0); while (c != '"') { if (c == '\\') { next(); if (c == 'u') { add(unicode()); } else { Character value = escapes.get(new Character(c)); if (value != null) add(value); else add(c); } } else { add(c); } } next(); return buf.toString(); } private void add(char cc) { buf.append(cc); next(); } private char unicode() { int value = 0; for (int i = 0; i < 4; ++i) { switch (next()) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': value = (value << 4) + c - '0'; break; case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': value = (value << 4) + (c - 'a') + 10; break; case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': value = (value << 4) + (c - 'A') + 10; break; } } return (char) value; } } link-grammar-4.7.4/link-grammar/java/org/linkgrammar/LGConfig.java0000644000175000017500000000456711205573725024024 0ustar bloombloom/*************************************************************************/ /* */ /* Use of the link grammar parsing system is subject to the terms of the */ /* license set forth in the LICENSE file included with this software. */ /* This license allows free redistribution and use in source and binary */ /* forms, with or without modification, subject to certain conditions. */ /* */ /*************************************************************************/ package org.linkgrammar; /** * A plain Java bean to hold configuration of the Link Grammar parser. * Some configuration parameters are not really passed onto the parser, * but applied only when constructing a ParseResult. Those * are maxLinkages and allowSkippedWords. * * @author Borislav Iordanov */ public class LGConfig { private int maxLinkages = 25; private int maxParseSeconds = 60; private int maxCost = -1; private boolean allowSkippedWords = true; private String dictionaryLocation = null; // mis-named; if flag is set, then a load is done, // not a store. private boolean storeConstituentString = true; private boolean loadSense = false; public int getMaxLinkages() { return maxLinkages; } public void setMaxLinkages(int m) { maxLinkages = m; } public int getMaxParseSeconds() { return maxParseSeconds; } public void setMaxParseSeconds(int m) { maxParseSeconds = m; } public int getMaxCost() { return maxCost; } public void setMaxCost(int m) { maxCost = m; } public boolean isAllowSkippedWords() { return allowSkippedWords; } public void setAllowSkippedWords(boolean a) { allowSkippedWords = a; } public String getDictionaryLocation() { return dictionaryLocation; } public void setDictionaryLocation(String d) { dictionaryLocation = d; } // mis-named; if flag is set, then a load is done, // not a store. public boolean isStoreConstituentString() { return storeConstituentString; } public void setStoreConstituentString(boolean s) { storeConstituentString = s; } public boolean isLoadSense() { return loadSense; } public void setLoadSense(boolean s) { loadSense = s; } } link-grammar-4.7.4/link-grammar/java/org/linkgrammar/Linkage.java0000644000175000017500000000557611133204637023740 0ustar bloombloom/*************************************************************************/ /* */ /* Use of the link grammar parsing system is subject to the terms of the */ /* license set forth in the LICENSE file included with this software. */ /* This license allows free redistribution and use in source and binary */ /* forms, with or without modification, subject to certain conditions. */ /* */ /*************************************************************************/ package org.linkgrammar; import java.util.ArrayList; import java.util.Iterator; import java.util.List; /** * A Linkage represents one of possibly many parses * returned by the Link Grammar parser. Each Linkage * is defined by a list of Links between the tokens * in a sentence. A Linkage also has some metadata * associated with it, e.g. for various cost measures. * * @author Borislav Iordanov */ public class Linkage implements Iterable { private List links = new ArrayList(); private String [] disjuncts; private String [] words; private String constituentString; private int linkedWordCount; private int andCost; private int disjunctCost; private int linkCost; private int numViolations; public List getLinks() { return links; } public Iterator iterator() { return links.iterator(); } public String disjunctAt(int i) { return disjuncts[i]; } public String[] getDisjuncts() { return disjuncts; } public void setDisjuncts(String[] disjuncts) { this.disjuncts = disjuncts; } public String wordAt(int i) { return words[i]; } public String[] getWords() { return words; } public void setWords(String[] words) { this.words = words; } public int getAndCost() { return andCost; } public void setAndCost(int andCost) { this.andCost = andCost; } public int getDisjunctCost() { return disjunctCost; } public void setDisjunctCost(int disjunctCost) { this.disjunctCost = disjunctCost; } public int getLinkCost() { return linkCost; } public void setLinkCost(int linkCost) { this.linkCost = linkCost; } public int getNumViolations() { return numViolations; } public void setNumViolations(int numViolations) { this.numViolations = numViolations; } public int getLinkedWordCount() { return linkedWordCount; } public void setLinkedWordCount(int linkedWordCount) { this.linkedWordCount = linkedWordCount; } public String getConstituentString() { return constituentString; } public void setConstituentString(String constituentString) { this.constituentString = constituentString; } } link-grammar-4.7.4/link-grammar/java/org/linkgrammar/ParseResult.java0000644000175000017500000000651111350565473024636 0ustar bloombloom/*************************************************************************/ /* */ /* Use of the link grammar parsing system is subject to the terms of the */ /* license set forth in the LICENSE file included with this software. */ /* This license allows free redistribution and use in source and binary */ /* forms, with or without modification, subject to certain conditions. */ /* */ /*************************************************************************/ package org.linkgrammar; import java.util.ArrayList; import java.util.Iterator; import java.util.List; /** * *

* Represents the result of parsing a piece of text. The result * consists of some global meta information about the whole parse * and a list of Linkages returned by the parser. The * original parsed text is available as the text attribute * and a tokenized version as the String[] words attribute. *

* * @author Borislav Iordanov * */ public class ParseResult implements Iterable { String parserVersion; String dictVersion; String text; String [] words; boolean [] entityFlags; boolean [] pastTenseFlags; List linkages = new ArrayList(); int numSkippedWords; public String wordAt(int i) { return words[i]; } /** * past-tense verbs have a usbscript of .v-d, .w-d or .q-d * look at the subscript instead, to see if a verb is past-tense. * @deprecated */ @Deprecated public boolean isPastTenseForm(int i) { return pastTenseFlags[i]; } public boolean isEntity(int i) { return entityFlags[i]; } public Iterator iterator() { return linkages.iterator(); } public List getLinkages() { return linkages; } public String getText() { return text; } public void setText(String text) { this.text = text; } public String[] getWords() { return words; } public void setWords(String[] words) { this.words = words; } public boolean[] getEntityFlags() { return entityFlags; } public void setEntityFlags(boolean[] entityFlags) { this.entityFlags = entityFlags; } /** * past-tense verbs have a usbscript of .v-d, .w-d or .q-d * look at the subscript instead, to see if a verb is past-tense. * @deprecated */ @Deprecated public boolean[] getPastTenseFlags() { return pastTenseFlags; } /** * past-tense verbs have a usbscript of .v-d, .w-d or .q-d * look at the subscript instead, to see if a verb is past-tense. * @deprecated */ @Deprecated public void setPastTenseFlags(boolean[] pastTenseFlags) { this.pastTenseFlags = pastTenseFlags; } public int getNumSkippedWords() { return numSkippedWords; } public void setNumSkippedWords(int numSkippedWords) { this.numSkippedWords = numSkippedWords; } public String getParserVersion() { return parserVersion; } public void setParserVersion(String parserVersion) { this.parserVersion = parserVersion; } public String getDictVersion() { return dictVersion; } public void setDictVersion(String dictVersion) { this.dictVersion = dictVersion; } } link-grammar-4.7.4/link-grammar/java/org/linkgrammar/LGService.java0000644000175000017500000005033311526022265024201 0ustar bloombloom/*************************************************************************/ /* */ /* Use of the link grammar parsing system is subject to the terms of the */ /* license set forth in the LICENSE file included with this software. */ /* This license allows free redistribution and use in source and binary */ /* forms, with or without modification, subject to certain conditions. */ /* */ /*************************************************************************/ package org.linkgrammar; import java.io.File; import java.io.InputStreamReader; import java.io.PrintWriter; import java.io.Reader; import java.net.ServerSocket; import java.net.Socket; import java.text.CharacterIterator; import java.text.SimpleDateFormat; import java.text.StringCharacterIterator; import java.util.HashMap; import java.util.Map; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; /** * A simple server implementation for running Link Grammar as a * standalone server. The server accepts parsing requests and returns * the result as a JSON formatted string (see this * JSON website for more information). * There is no session maintained between client and server, it's a * simple, stateless, single round-trip, request-response protocol. * * Requests consist of a bag of parameters separated by the null '\0' * character. Each request must be terminated with the newline '\n' * character. Each parameter has the form name:value\0 where * name and value can contain any character except * '\0' and '\n'. The following parameters are recognized: * *
    *
  • maxCost - ??
  • *
  • storeConstituentString - whether to return the constituent * string for each Linkage as part of the result.
  • *
  • maxLinkages - maximum number of parses to return in the * result. Note that this does not affect the parser behavior which * computes all parses anyway.
  • *
  • maxParseSeconds - ??
  • *
  • text - The text to parse. Note that it must be stripped * from newlines.
  • *
* * The server maintains incoming requests in an unbounded queue and * handles them in thread pool whose size can be specified at the * command line. A thread pool of size > 1 will only work if the Link * Grammar version used is thread-safe. * * Execute this class as a main program to view a list of options. * * @author Borislav Iordanov * */ public class LGService { private static boolean verbose = false; private static SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); // // The current Java bindings require each concurrent thread to // initialize separately. This means that each thread has a // separate copy of the dictionaries, which in unfortunate design. // Nevertheless, we want to avoid initializing before every parse // activity so we maintain a thread local flag and initialize on // demand only. // // The C library itself does not have this restriction; one // dictionary can be shared by many threads. However, the java // bindings do have this restriction; the java bindings were // never designed to be run multi-threaded. XXX This needs to be // fixed. // // The main problem is to detect when a thread completes its work // and therefore LinkGrammar.close should be called to free // allocated memory. We leave that to the use of this class. // private static ThreadLocal initialized = new ThreadLocal() { protected Boolean initialValue() { return Boolean.FALSE; } }; /** *

Return true if LinkGrammar is initialized for the current thread * and false otherwise. */ public static boolean isInitialized() { return initialized.get(); } /** *

* Initialize LinkGrammar for the current is this is not already done. Note that * this method is called by all other methods in this class that invoke LinkGrammar * so there's no really need to call it yourself. It is safe to call the method repeatedly. *

*/ public static void init() { if (!initialized.get()) { LinkGrammar.init(); initialized.set(Boolean.TRUE); } } /** *

* Cleanup allocated memory for use of LinkGrammar in the current thread. *

*/ public static void close() { LinkGrammar.close(); initialized.set(Boolean.FALSE); } private static void trace(String s) { if (verbose) System.out.println("LG " + dateFormatter.format(new java.util.Date()) + " " + s); } private static boolean getBool(String name, Map msg, boolean def) { String x = msg.get(name); return x == null ? def : Boolean.valueOf(x); } private static int getInt(String name, Map msg, int def) { String x = msg.get(name); return x == null ? def : Integer.parseInt(x); } /** *

* Apply configuration parameters to the parser. *

*/ public static void configure(LGConfig config) { init(); if (config.getMaxCost() > -1) LinkGrammar.setMaxCost(config.getMaxCost()); if (config.getMaxParseSeconds() > -1) LinkGrammar.setMaxParseSeconds(config.getMaxParseSeconds()); if (config.getDictionaryLocation() != null) LinkGrammar.setDictionariesPath(config.getDictionaryLocation()); } /** * Assuming LinkGrammar.parse has already been called, * construct a full ParseResult given the passed in * configuration. For example, no more that * config.getMaxLinkages are returned, etc. * * @param config * @return */ public static ParseResult getAsParseResult(LGConfig config) { LinkGrammar.makeLinkage(0); // need to call at least once, otherwise it crashes ParseResult parseResult = new ParseResult(); parseResult.setParserVersion(LinkGrammar.getVersion()); parseResult.setDictVersion(LinkGrammar.getDictVersion()); parseResult.numSkippedWords = LinkGrammar.getNumSkippedWords(); parseResult.words = new String[LinkGrammar.getNumWords()]; parseResult.entityFlags = new boolean[LinkGrammar.getNumWords()]; parseResult.pastTenseFlags = new boolean[LinkGrammar.getNumWords()]; for (int i = 0; i < parseResult.words.length; i++) { String word = parseResult.words[i] = LinkGrammar.getWord(i); parseResult.entityFlags[i] = LinkGrammar.isEntity(word); parseResult.pastTenseFlags[i] = LinkGrammar.isPastTenseForm(word); } int maxLinkages = Math.min(config.getMaxLinkages(), LinkGrammar.getNumLinkages()); for (int li = 0; li < maxLinkages; li++) { LinkGrammar.makeLinkage(li); Linkage linkage = new Linkage(); linkage.setAndCost(LinkGrammar.getLinkageAndCost()); linkage.setDisjunctCost(LinkGrammar.getLinkageDisjunctCost()); linkage.setLinkCost(LinkGrammar.getLinkageLinkCost()); linkage.setLinkedWordCount(LinkGrammar.getNumWords()); linkage.setNumViolations(LinkGrammar.getLinkageNumViolations()); String [] disjuncts = new String[LinkGrammar.getNumWords()]; String [] words = new String[LinkGrammar.getNumWords()]; for (int i = 0; i < words.length; i++) { disjuncts[i] = LinkGrammar.getLinkageDisjunct(i); words[i] = LinkGrammar.getLinkageWord(i); } linkage.setWords(words); linkage.setDisjuncts(disjuncts); int numLinks = LinkGrammar.getNumLinks(); for (int i = 0; i < numLinks; i++) { Link link = new Link(); link.setLabel(LinkGrammar.getLinkLabel(i)); link.setLeft(LinkGrammar.getLinkLWord(i)); link.setRight(LinkGrammar.getLinkRWord(i)); link.setLeftLabel(LinkGrammar.getLinkLLabel(i)); link.setRightLabel(LinkGrammar.getLinkRLabel(i)); linkage.getLinks().add(link); } if (config.isStoreConstituentString()) linkage.setConstituentString(LinkGrammar.getConstituentString()); parseResult.linkages.add(linkage); } return parseResult; } /** * Construct a JSON formatted result for a parse which yielded 0 linkages. */ public static String getEmptyJSONResult(LGConfig config) { StringBuffer buf = new StringBuffer(); buf.append("{\"tokens\":[],"); buf.append("\"numSkippedWords\":0,"); buf.append("\"entity\":[],"); buf.append("\"pastTense\":[],"); buf.append("\"linkages\":[],"); buf.append("\"version\":\"" + LinkGrammar.getVersion() + "\","); buf.append("\"dictVersion\":\"" + LinkGrammar.getDictVersion() + "\"}"); return buf.toString(); } static char[] hex = "0123456789ABCDEF".toCharArray(); private static String jsonString(String s) { if (s == null) return null; StringBuffer b = new StringBuffer(); b.append("\""); CharacterIterator it = new StringCharacterIterator(s); for (char c = it.first(); c != CharacterIterator.DONE; c = it.next()) { if (c == '"') b.append("\\\""); else if (c == '\\') b.append("\\\\"); else if (c == '/') b.append("\\/"); else if (c == '\b') b.append("\\b"); else if (c == '\f') b.append("\\f"); else if (c == '\n') b.append("\\n"); else if (c == '\r') b.append("\\r"); else if (c == '\t') b.append("\\t"); else if (Character.isISOControl(c)) { int n = c; for (int i = 0; i < 4; ++i) { int digit = (n & 0xf000) >> 12; b.append(hex[digit]); n <<= 4; } } else { b.append(c); } } b.append("\""); return b.toString(); } /** * Format the current parsing result as a JSON string. This method * assume that LinkGrammar.parse has been called before. */ public static String getAsJSONFormat(LGConfig config) { LinkGrammar.makeLinkage(0); // need to call at least once, otherwise it crashes int numWords = LinkGrammar.getNumWords(); int maxLinkages = Math.min(config.getMaxLinkages(), LinkGrammar.getNumLinkages()); StringBuffer buf = new StringBuffer(); buf.append("{\"tokens\":["); for (int i = 0; i < numWords; i++) { buf.append(jsonString(LinkGrammar.getWord(i))); if (i + 1 < numWords) buf.append(","); } buf.append("],\"numSkippedWords\":" + LinkGrammar.getNumSkippedWords()); buf.append(",\"entity\":["); boolean first = true; for (int i = 0; i < numWords; i++) if (LinkGrammar.isEntity(LinkGrammar.getWord(i))) { if (!first) buf.append(","); first = false; buf.append(Integer.toString(i)); } buf.append("],\"pastTense\":["); first = true; for (int i = 0; i < numWords; i++) if (LinkGrammar.isPastTenseForm(LinkGrammar.getWord(i).toLowerCase())) { if (!first) buf.append(","); first = false; buf.append(Integer.toString(i)); } buf.append("],\"linkages\":["); for (int li = 0; li < maxLinkages; li++) { LinkGrammar.makeLinkage(li); buf.append("{\"words\":["); for (int i = 0; i < numWords; i++) { buf.append(jsonString(LinkGrammar.getLinkageWord(i))); if (i + 1 < numWords) buf.append(","); } buf.append("], \"disjuncts\":["); for (int i = 0; i < numWords; i++) { buf.append(jsonString(LinkGrammar.getLinkageDisjunct(i))); if (i + 1 < numWords) buf.append(","); } buf.append("], \"andCost\":"); buf.append(Integer.toString(LinkGrammar.getLinkageAndCost())); buf.append(", \"disjunctCost\":"); buf.append(Integer.toString(LinkGrammar.getLinkageDisjunctCost())); buf.append(", \"linkageCost\":"); buf.append(Integer.toString(LinkGrammar.getLinkageLinkCost())); buf.append(", \"numViolations\":"); buf.append(Integer.toString(LinkGrammar.getLinkageNumViolations())); if (config.isStoreConstituentString()) { buf.append(", \"constituentString\":"); buf.append(jsonString(LinkGrammar.getConstituentString())); } buf.append(", \"links\":["); int numLinks = LinkGrammar.getNumLinks(); for (int i = 0; i < numLinks; i++) { buf.append("{\"label\":" + jsonString(LinkGrammar.getLinkLabel(i)) + ","); buf.append("\"left\":" + LinkGrammar.getLinkLWord(i) + ","); buf.append("\"right\":" + LinkGrammar.getLinkRWord(i) + ","); buf.append("\"leftLabel\":" + jsonString(LinkGrammar.getLinkLLabel(i)) + ","); buf.append("\"rightLabel\":" + jsonString(LinkGrammar.getLinkRLabel(i)) + "}"); if (i + 1 < numLinks) buf.append(","); } buf.append("]"); buf.append("}"); if (li < maxLinkages - 1) buf.append(","); } buf.append("],\"version\":\"" + LinkGrammar.getVersion() + "\""); buf.append(",\"dictVersion\":\"" + LinkGrammar.getDictVersion() + "\""); buf.append("}"); return buf.toString(); } /** * A stub method for now for implementing a compact binary format * for parse results. * * @param config * @return */ public static byte [] getAsBinary(LGConfig config) { int size = 0; byte [] buf = new byte[1024]; // TODO ..... grow buf as needed byte [] result = new byte[size]; System.arraycopy(buf, 0, result, 0, size); return result; } private static Map readMsg(Reader in) throws java.io.IOException { int length = 0; char [] buf = new char[1024]; for (int count = in.read(buf, length, buf.length - length); count > -1; count = in.read(buf, length, buf.length - length)) { length += count; if (length == buf.length) { char [] nbuf = new char[buf.length + 512]; System.arraycopy(buf, 0, nbuf, 0, buf.length); buf = nbuf; } if (buf[length-1] == '\n') break; } Map result = new HashMap(); int start = -1; int column = -1; for (int offset = 0; offset < length - 1; offset++) { char c = buf[offset]; if (start == -1) start = offset; else if (c == ':' && column == -1) column = offset; else if (c == '\0') { if (start == -1 || column == -1) throw new RuntimeException("Malformat message:" + new String(buf, 0, length)); String name = new String(buf, start, column - start); String value = new String(buf, column + 1, offset - column - 1); result.put(name, value); start = column = -1; } } if (start != -1 || column != -1) throw new RuntimeException("Malformat message:" + new String(buf, 0, length)); return result; } private static void handleClient(Socket clientSocket) { init(); Reader in = null; PrintWriter out = null; try { trace("Connection accepted from : " + clientSocket.getInetAddress()); in = new InputStreamReader(clientSocket.getInputStream()); Map msg = readMsg(in); if (verbose) trace("Received msg '" + msg + "' from " + clientSocket.getInetAddress()); String json = "{}"; if ("version".equals(msg.get("get"))) // special case msg 'get:version' json = "{\"version\":\"" + LinkGrammar.getVersion() + "\"}"; else { LGConfig config = new LGConfig(); config.setStoreConstituentString(getBool("storeConstituentString", msg, config.isStoreConstituentString())); config.setMaxCost(getInt("maxCost", msg, config.getMaxCost())); config.setMaxLinkages(getInt("maxLinkages", msg, config.getMaxLinkages())); config.setMaxParseSeconds(getInt("maxParseSeconds", msg, config.getMaxParseSeconds())); configure(config); String text = msg.get("text"); if (text != null && text.trim().length() > 0) { LinkGrammar.parse(text); if (LinkGrammar.getNumLinkages() > 0) json = getAsJSONFormat(config); else json = getEmptyJSONResult(config); } else json = getEmptyJSONResult(config); } out = new PrintWriter(clientSocket.getOutputStream(), true); out.print(json.length() + 1); out.print('\n'); out.print(json); out.print('\n'); out.flush(); trace("Response written to " + clientSocket.getInetAddress() + ", closing client connection..."); } catch (Throwable t) { t.printStackTrace(System.err); } finally { if (out != null) try { out.close(); } catch (Throwable t) { } if (in != null) try { in.close(); } catch (Throwable t) { } if (clientSocket != null) try { clientSocket.close(); } catch (Throwable t) { } } } /** *

* Parse a piece of text with the given configuration and return the ParseResult. *

* * @param config The configuration to be used. If this is the first time the parse * method is called within the current thread, the dictionary location (if not null) * of this parameter will be used to initialize the parser. Otherwise the dictionary location is * ignored. * @param text The text to parse, normally a single sentence. * @return The ParseResult. Note that null is never returned. If parsing * failed, there will be 0 linkages in the result. */ public static ParseResult parse(LGConfig config, String text) { if (!isInitialized() && config.getDictionaryLocation() != null && config.getDictionaryLocation().trim().length() > 0) LinkGrammar.setDictionariesPath(config.getDictionaryLocation()); configure(config); LinkGrammar.parse(text); return getAsParseResult(config); } public static void main(String [] argv) { int threads = 1; int port = 0; String dictionaryPath = null; try { int argIdx = 0; if (argv[argIdx].equals("-verbose")) { verbose = true; argIdx++; } if (argv[argIdx].equals("-threads")) { threads = Integer.parseInt(argv[++argIdx]); argIdx++; } port = Integer.parseInt(argv[argIdx++]); if (argv.length > argIdx) dictionaryPath = argv[argIdx]; } catch (Throwable ex) { if (argv.length > 0) ex.printStackTrace(System.err); System.out.println("Syntax: java org.linkgrammar.LGService [-verbose] [-threads n] port [dictionaryPath]"); System.out.println("\t where 'port' is the TCP port the service should listen to and"); System.out.println("\t -verbose forces tracing of every message received and"); System.out.println("\t -threads specifies the number of concurrent threads/clients allowed (default 1) and "); System.out.println("\t 'dictionaryPath' full path to the Link Grammar dictionaries (optional)."); System.exit(-1); } if (dictionaryPath != null) { File f = new File(dictionaryPath); if (!f.exists()) { System.err.println("Dictionary path " + dictionaryPath + " not found."); System.exit(-1); } else if (!f.isDirectory()) { System.err.println("Dictionary path " + dictionaryPath + " not a directory."); System.exit(-1); } } System.out.println("Starting Link Grammar Server at port " + port + ", with " + threads + " available processing threads and " + ((dictionaryPath == null) ? " with default dictionary location." : "with dictionary location '" + dictionaryPath + "'.")); ThreadPoolExecutor threadPool = new ThreadPoolExecutor(threads, threads, Long.MAX_VALUE, TimeUnit.SECONDS, new LinkedBlockingQueue()); try { if (dictionaryPath != null) LinkGrammar.setDictionariesPath(dictionaryPath); ServerSocket serverSocket = new ServerSocket(port); while (true) { trace("Waiting for client connections..."); final Socket clientSocket = serverSocket.accept(); threadPool.submit(new Runnable() { public void run() { handleClient(clientSocket); } }); } } catch (Throwable t) { t.printStackTrace(System.err); System.exit(-1); } } } link-grammar-4.7.4/link-grammar/java/org/linkgrammar/LGRemoteClient.java0000644000175000017500000002174311222431335025171 0ustar bloombloompackage org.linkgrammar; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Socket; import java.net.UnknownHostException; import java.util.List; import java.util.Map; /** *

* A client of the {@link LGService} when it is run in server mode. The main * method to call is {@link parse} which produces a {@link ParseResult}. At * a minimum, the hostname and port properties * must be set beforehand. Configuration settings of the remote parser itself * are specified with the config property. *

* *

* This client is persistent in its attempts to perform a parse. By default * it will keep trying to connect to a server indefinitely (unless the host is * unknown). To change that, * set the connectRetryCount property. Also, if call to the server * fails for whatever reason, it will retry at least once. The increase the number * of retries, set the parseRetryCount property. *

* * @author Borislav Iordanov * */ public class LGRemoteClient { private LGConfig config = new LGConfig(); private String parserVersion; private String hostname = "localhost"; private int port = 9000; private int parseRetryCount = 2; private int connectRetryCount = Integer.MAX_VALUE; private long connectRetryWait = 1000l; @SuppressWarnings("unchecked") private ParseResult jsonToParseResult(String json) { JSONReader reader = new JSONReader(); Map top = (Map)reader.read(json); ParseResult result = new ParseResult(); result.setParserVersion((String)top.get("version")); result.setWords(((List)(top.get("tokens"))).toArray(new String[0])); boolean [] A = new boolean[result.getWords().length]; for (Long idx : ((List)top.get("entity"))) A[idx.intValue()] = true; result.setEntityFlags(A); A = new boolean[result.getWords().length]; for (Long idx : ((List)top.get("pastTense"))) A[idx.intValue()] = true; result.setPastTenseFlags(A); result.setNumSkippedWords(((Number)top.get("numSkippedWords")).intValue()); for (Map x : (List)top.get("linkages")) { Linkage linkage = new Linkage(); linkage.setAndCost(((Number)x.get("andCost")).intValue()); linkage.setDisjunctCost(((Number)x.get("disjunctCost")).intValue()); linkage.setLinkCost(((Number)x.get("linkageCost")).intValue()); linkage.setNumViolations(((Number)x.get("numViolations")).intValue()); linkage.setWords(((List)(x.get("words"))).toArray(new String[0])); linkage.setDisjuncts(((List)(x.get("disjuncts"))).toArray(new String[0])); linkage.setLinkedWordCount(linkage.getWords().length); // TODO?? is this right? for (Map y : (List)x.get("links")) { Link link = new Link(); link.setLabel((String)y.get("label")); link.setLeftLabel((String)y.get("leftLabel")); link.setRightLabel((String)y.get("rightLabel")); link.setLeft(((Number)y.get("left")).intValue()); link.setRight(((Number)y.get("right")).intValue()); linkage.getLinks().add(link); } if (config.isStoreConstituentString()) linkage.setConstituentString((String)x.get("constituentString")); result.getLinkages().add(linkage); } return result; } private String makeLGRequest(String text) { if (config != null) return "storeConstituentString:" + config.isStoreConstituentString() + "\0" + "maxCost:" + config.getMaxCost() + "\0" + "maxLinkages:" + config.getMaxLinkages() + "\0" + "maxParseSeconds:" + config.getMaxParseSeconds() + "\0" + "text:" + text + "\0"; else return "text:" + text + "\0"; } private String readResponse(BufferedReader in, int size) throws IOException { char [] buf = new char[size]; for (int count = 0; count < size; ) count += in.read(buf, count, size-count); return new String(buf, 0, size); } private String callParser(String request) throws InterruptedException, IOException { if (hostname == null || hostname.length() == 0 || port <= 1024) throw new RuntimeException("No hostname for remote parser or invalid port number < 1024"); // // Connect: // Socket socket = null; for (int i = 0; i < connectRetryCount && socket == null; i++) { try { socket = new Socket(hostname, port); } catch (UnknownHostException ex) { throw new RuntimeException("Host '" + hostname + "' not found."); } catch (IOException ex) { // ignore, retry... } if (socket == null) Thread.sleep(connectRetryWait); } if (socket == null) throw new RuntimeException("Failed to connect to " + hostname + ":" + port); // // Call parser: // PrintWriter out = null; BufferedReader in = null; try { out = new PrintWriter(socket.getOutputStream(), true); in = new BufferedReader(new InputStreamReader(socket.getInputStream())); out.print(request); out.print('\n'); out.flush(); String size = in.readLine(); if (size == null) throw new RuntimeException("Parser returned no response."); return readResponse(in, Integer.parseInt(size)); } finally { if (out != null) try { out.close(); } catch (Throwable t) { } if (in != null) try { in.close(); } catch (Throwable t) { } try { socket.close(); } catch (Throwable t) { } } } /** *

Return the link grammar version. A call to the server is made to * obtain the version which is henceforth cached.

*/ @SuppressWarnings("unchecked") public String getVersion() { if (parserVersion == null) { try { String json = callParser("get:version\0"); JSONReader reader = new JSONReader(); Map top = (Map)reader.read(json); parserVersion = (String)top.get("version"); } catch (IOException ex) { parserVersion = "unavailable"; } catch (InterruptedException ex) { throw new RuntimeException("Thread interrupted.", ex); } } return parserVersion; } public ParseResult parse(String sentence) throws InterruptedException { String parserResponse = null; for (int i = 0; i < parseRetryCount && parserResponse == null; i++) try { parserResponse = callParser(makeLGRequest(sentence)); } catch (IOException ex) { if (i == 0) // Trace exception only on the first failure. { System.err.println("Link grammar called failed on '" + sentence + "'" + ", will retry " + Integer.toString(parseRetryCount - 1) + " more time."); ex.printStackTrace(); } } if (parserResponse == null) return null; ParseResult parseResult = jsonToParseResult(parserResponse); parseResult.setText(sentence); return parseResult; } public LGConfig getConfig() { return config; } public void setConfig(LGConfig config) { this.config = config; } public String getHostname() { return hostname; } public void setHostname(String hostname) { this.hostname = hostname; } public int getPort() { return port; } public void setPort(int port) { this.port = port; } public int getParseRetryCount() { return parseRetryCount; } public void setParseRetryCount(int parseRetryCount) { this.parseRetryCount = parseRetryCount; } public int getConnectRetryCount() { return connectRetryCount; } public void setConnectRetryCount(int connectRetryCount) { this.connectRetryCount = connectRetryCount; } public long getConnectRetryWait() { return connectRetryWait; } public void setConnectRetryWait(long connectRetryWait) { this.connectRetryWait = connectRetryWait; } } link-grammar-4.7.4/link-grammar/java/.cvsignore0000644000175000017500000000000410772523445020416 0ustar bloombloombin link-grammar-4.7.4/link-grammar/java/README0000644000175000017500000000060011526022265017270 0ustar bloombloom Java Bindings for Link Grammar ------------------------------ These files implement Java language bindings for Link Grammar. They do not extend the parsing algorithms already present in Link-Grammar in any way. They do, however, allow certain types of remote/server operation, and, in particular, are needed for use by the RelEx dependency parser. link-grammar-4.7.4/link-grammar/fast-match.c0000644000175000017500000001727711524630772017712 0ustar bloombloom/**************************************************************************/ /* Copyright (c) 2004 */ /* Daniel Sleator, David Temperley, and John Lafferty */ /* All rights reserved */ /* */ /* Use of the link grammar parsing system is subject to the terms of the */ /* license set forth in the LICENSE file included with this software, */ /* and also available at http://www.link.cs.cmu.edu/link/license.html */ /* This license allows free redistribution and use in source and binary */ /* forms, with or without modification, subject to certain conditions. */ /* */ /**************************************************************************/ #include #include "fast-match.h" /** * returns the number of disjuncts in the list that have non-null * left connector lists. */ static int left_disjunct_list_length(Disjunct * d) { int i; for (i=0; d!=NULL; d=d->next) { if (d->left != NULL) i++; } return i; } static int right_disjunct_list_length(Disjunct * d) { int i; for (i=0; d!=NULL; d=d->next) { if (d->right != NULL) i++; } return i; } struct match_context_s { int match_cost; int l_table_size[MAX_SENTENCE]; /* the sizes of the hash tables */ int r_table_size[MAX_SENTENCE]; /* the beginnings of the hash tables */ Match_node ** l_table[MAX_SENTENCE]; Match_node ** r_table[MAX_SENTENCE]; /* I'll pedantically maintain my own list of these cells */ Match_node * mn_free_list; }; /** * Return a match node to be used by the caller */ static Match_node * get_match_node(match_context_t *ctxt) { Match_node * m; if (ctxt->mn_free_list != NULL) { m = ctxt->mn_free_list; ctxt->mn_free_list = m->next; } else { m = (Match_node *) xalloc(sizeof(Match_node)); } return m; } /** * Put these nodes back onto my free list */ void put_match_list(Sentence sent, Match_node *m) { Match_node * xm; match_context_t *ctxt = sent->match_ctxt; for (; m != NULL; m = xm) { xm = m->next; m->next = ctxt->mn_free_list; ctxt->mn_free_list = m; } } static void free_match_list(Match_node * t) { Match_node *xt; for (; t!=NULL; t=xt) { xt = t->next; xfree((char *)t, sizeof(Match_node)); } } /** * Free all of the hash tables and Match_nodes */ void free_fast_matcher(Sentence sent) { int w; int i; match_context_t *ctxt = sent->match_ctxt; if (verbosity > 1) printf("%d Match cost\n", ctxt->match_cost); for (w = 0; w < sent->length; w++) { for (i = 0; i < ctxt->l_table_size[w]; i++) { free_match_list(ctxt->l_table[w][i]); } xfree((char *)ctxt->l_table[w], ctxt->l_table_size[w] * sizeof (Match_node *)); for (i = 0; i < ctxt->r_table_size[w]; i++) { free_match_list(ctxt->r_table[w][i]); } xfree((char *)ctxt->r_table[w], ctxt->r_table_size[w] * sizeof (Match_node *)); } free_match_list(ctxt->mn_free_list); ctxt->mn_free_list = NULL; free(ctxt); sent->match_ctxt = NULL; } /** * Adds the match node m to the sorted list of match nodes l. * The parameter dir determines the order of the sorting to be used. * Makes the list sorted from smallest to largest. */ static Match_node * add_to_right_table_list(Match_node * m, Match_node * l) { if (l == NULL) return m; if ((m->d->right->word) <= (l->d->right->word)) { m->next = l; return m; } else { l->next = add_to_right_table_list(m, l->next); return l; } } /** * Adds the match node m to the sorted list of match nodes l. * The parameter dir determines the order of the sorting to be used. * Makes the list sorted from largest to smallest */ static Match_node * add_to_left_table_list(Match_node * m, Match_node * l) { if (l==NULL) return m; if ((m->d->left->word) >= (l->d->left->word)) { m->next = l; return m; } else { l->next = add_to_left_table_list(m, l->next); return l; } } /** * The disjunct d (whose left or right pointer points to c) is put * into the appropriate hash table * dir = 1, we're putting this into a right table. * dir = -1, we're putting this into a left table. */ static void put_into_match_table(int size, Match_node ** t, Disjunct * d, Connector * c, int dir ) { int h; Match_node * m; h = connector_hash(c) & (size-1); m = (Match_node *) xalloc (sizeof(Match_node)); m->next = NULL; m->d = d; if (dir == 1) { t[h] = add_to_right_table_list(m, t[h]); } else { t[h] = add_to_left_table_list(m, t[h]); } } void init_fast_matcher(Sentence sent) { int w, len, size, i; Match_node ** t; Disjunct * d; match_context_t *ctxt; ctxt = (match_context_t *) malloc(sizeof(match_context_t)); sent->match_ctxt = ctxt; ctxt->match_cost = 0; ctxt->mn_free_list = NULL; for (w=0; wlength; w++) { len = left_disjunct_list_length(sent->word[w].d); size = next_power_of_two_up(len); ctxt->l_table_size[w] = size; t = ctxt->l_table[w] = (Match_node **) xalloc(size * sizeof(Match_node *)); for (i = 0; i < size; i++) t[i] = NULL; for (d = sent->word[w].d; d != NULL; d = d->next) { if (d->left != NULL) { put_into_match_table(size, t, d, d->left, -1); } } len = right_disjunct_list_length(sent->word[w].d); size = next_power_of_two_up(len); ctxt->r_table_size[w] = size; t = ctxt->r_table[w] = (Match_node **) xalloc(size * sizeof(Match_node *)); for (i = 0; i < size; i++) t[i] = NULL; for (d = sent->word[w].d; d != NULL; d = d->next) { if (d->right != NULL) { put_into_match_table(size, t, d, d->right, 1); } } } } /** * Forms and returns a list of disjuncts that might match lc or rc or both. * lw and rw are the words from which lc and rc came respectively. * The list is formed by the link pointers of Match_nodes. * The list contains no duplicates. A quadratic algorithm is used to * eliminate duplicates. In practice the match_cost is less than the * parse_cost (and the loop is tiny), so there's no reason to bother * to fix this. */ Match_node * form_match_list(Sentence sent, int w, Connector *lc, int lw, Connector *rc, int rw) { Match_node *ml, *mr, *mx, *my, * mz, *front, *free_later; match_context_t *ctxt = sent->match_ctxt; if (lc != NULL) { ml = ctxt->l_table[w][connector_hash(lc) & (ctxt->l_table_size[w]-1)]; } else { ml = NULL; } if (rc != NULL) { mr = ctxt->r_table[w][connector_hash(rc) & (ctxt->r_table_size[w]-1)]; } else { mr = NULL; } front = NULL; for (mx = ml; mx != NULL; mx = mx->next) { if (mx->d->left->word < lw) break; my = get_match_node(ctxt); my->d = mx->d; my->next = front; front = my; } ml = front; /* ml is now the list of things that could match the left */ front = NULL; for (mx = mr; mx != NULL; mx = mx->next) { if (mx->d->right->word > rw) break; my = get_match_node(ctxt); my->d = mx->d; my->next = front; front = my; } mr = front; /* mr is now the list of things that could match the right */ /* now we want to eliminate duplicates from the lists */ free_later = NULL; front = NULL; for (mx = mr; mx != NULL; mx = mz) { /* see if mx in first list, put it in if its not */ mz = mx->next; ctxt->match_cost++; for (my=ml; my!=NULL; my=my->next) { ctxt->match_cost++; if (mx->d == my->d) break; } if (my != NULL) { /* mx was in the l list */ mx->next = free_later; free_later = mx; } if (my==NULL) { /* it was not there */ mx->next = front; front = mx; } } mr = front; /* mr is now the abbreviated right list */ put_match_list(sent, free_later); /* now catenate the two lists */ if (mr == NULL) return ml; for (mx = mr; mx->next != NULL; mx = mx->next) ; mx->next = ml; return mr; } link-grammar-4.7.4/link-grammar/link-includes.h0000644000175000017500000004154211526022265020413 0ustar bloombloom/*************************************************************************/ /* Copyright (c) 2004 */ /* Daniel Sleator, David Temperley, and John Lafferty */ /* All rights reserved */ /* */ /* Use of the link grammar parsing system is subject to the terms of the */ /* license set forth in the LICENSE file included with this software, */ /* and also available at http://www.link.cs.cmu.edu/link/license.html */ /* This license allows free redistribution and use in source and binary */ /* forms, with or without modification, subject to certain conditions. */ /* */ /*************************************************************************/ #ifndef _LINKINCLUDESH_ #define _LINKINCLUDESH_ #include LINK_BEGIN_DECLS /********************************************************************** * * System initialization * ***********************************************************************/ typedef struct Dictionary_s * Dictionary; link_public_api(const char *) linkgrammar_get_version(void); link_public_api(const char *) linkgrammar_get_dict_version(Dictionary); /********************************************************************** * * Functions to manipulate Dictionaries * ***********************************************************************/ link_public_api(Dictionary) dictionary_create(const char * dict_name, const char * pp_name, const char * cons_name, const char * affix_name); link_public_api(Dictionary) dictionary_create_lang(const char * lang); link_public_api(Dictionary) dictionary_create_default_lang(void); link_public_api(int) dictionary_delete(Dictionary dict); link_public_api(int) dictionary_get_max_cost(Dictionary dict); link_public_api(void) dictionary_set_data_dir(const char * path); link_public_api(char *) dictionary_get_data_dir(void); link_public_api(int) dictionary_is_past_tense_form(Dictionary dict, const char * str); link_public_api(int) dictionary_is_entity(Dictionary dict, const char * str); /********************************************************************** * * Functions to manipulate Parse Options * ***********************************************************************/ typedef struct Parse_Options_s * Parse_Options; link_public_api(Parse_Options) parse_options_create(void); link_public_api(int) parse_options_delete(Parse_Options opts); link_public_api(void) parse_options_set_verbosity(Parse_Options opts, int verbosity); link_public_api(int) parse_options_get_verbosity(Parse_Options opts); link_public_api(void) parse_options_set_linkage_limit(Parse_Options opts, int linkage_limit); link_public_api(int) parse_options_get_linkage_limit(Parse_Options opts); link_public_api(void) parse_options_set_disjunct_cost(Parse_Options opts, int disjunct_cost); link_public_api(void) parse_options_set_disjunct_costf(Parse_Options opts, float disjunct_cost); link_public_api(int) parse_options_get_disjunct_cost(Parse_Options opts); link_public_api(float) parse_options_get_disjunct_costf(Parse_Options opts); link_public_api(void) parse_options_set_min_null_count(Parse_Options opts, int null_count); link_public_api(int) parse_options_get_min_null_count(Parse_Options opts); link_public_api(void) parse_options_set_max_null_count(Parse_Options opts, int null_count); link_public_api(int) parse_options_get_max_null_count(Parse_Options opts); link_public_api(void) parse_options_set_null_block(Parse_Options opts, int null_block); link_public_api(int) parse_options_get_null_block(Parse_Options opts); link_public_api(void) parse_options_set_islands_ok(Parse_Options opts, int islands_ok); link_public_api(int) parse_options_get_islands_ok(Parse_Options opts); link_public_api(void) parse_options_set_spell_guess(Parse_Options opts, int spell_guess); link_public_api(int) parse_options_get_spell_guess(Parse_Options opts); link_public_api(void) parse_options_set_short_length(Parse_Options opts, int short_length); link_public_api(int) parse_options_get_short_length(Parse_Options opts); link_public_api(void) parse_options_set_max_memory(Parse_Options opts, int mem); link_public_api(int) parse_options_get_max_memory(Parse_Options opts); link_public_api(void) parse_options_set_max_sentence_length(Parse_Options opts, int len); link_public_api(int) parse_options_get_max_sentence_length(Parse_Options opts); link_public_api(void) parse_options_set_max_parse_time(Parse_Options opts, int secs); link_public_api(int) parse_options_get_max_parse_time(Parse_Options opts); link_public_api(void) parse_options_set_cost_model_type(Parse_Options opts, int cm); link_public_api(int) parse_options_get_cost_model_type(Parse_Options opts); link_public_api(void) parse_options_set_use_fat_links(Parse_Options opts, int use_fat_links); link_public_api(int) parse_options_get_use_fat_links(Parse_Options opts); link_public_api(void) parse_options_set_use_sat_parser(Parse_Options opts, int use_sat_solver); link_public_api(int) parse_options_get_use_sat_parser(Parse_Options opts); link_public_api(int) parse_options_timer_expired(Parse_Options opts); link_public_api(int) parse_options_memory_exhausted(Parse_Options opts); link_public_api(int) parse_options_resources_exhausted(Parse_Options opts); link_public_api(void) parse_options_set_screen_width(Parse_Options opts, int val); link_public_api(int) parse_options_get_screen_width(Parse_Options opts); link_public_api(void) parse_options_set_allow_null(Parse_Options opts, int val); link_public_api(int) parse_options_get_allow_null(Parse_Options opts); link_public_api(void) parse_options_set_use_cluster_disjuncts(Parse_Options opts, int val); link_public_api(int) parse_options_get_use_cluster_disjuncts(Parse_Options opts); link_public_api(void) parse_options_set_display_walls(Parse_Options opts, int val); link_public_api(int) parse_options_get_display_walls(Parse_Options opts); link_public_api(void) parse_options_set_all_short_connectors(Parse_Options opts, int val); link_public_api(int) parse_options_get_all_short_connectors(Parse_Options opts); link_public_api(void) parse_options_reset_resources(Parse_Options opts); /********************************************************************** * * The following Parse_Options functions do not directly affect the * operation of the parser, but they can be useful for organizing the * search, or displaying the results. They were included as switches for * convenience in implementing the "standard" version of the link parser * using the API. * ***********************************************************************/ link_public_api(void) parse_options_set_batch_mode(Parse_Options opts, int val); link_public_api(int) parse_options_get_batch_mode(Parse_Options opts); link_public_api(void) parse_options_set_panic_mode(Parse_Options opts, int val); link_public_api(int) parse_options_get_panic_mode(Parse_Options opts); link_public_api(void) parse_options_set_display_on(Parse_Options opts, int val); link_public_api(int) parse_options_get_display_on(Parse_Options opts); link_public_api(void) parse_options_set_display_postscript(Parse_Options opts, int val); link_public_api(int) parse_options_get_display_postscript(Parse_Options opts); link_public_api(void) parse_options_set_display_constituents(Parse_Options opts, int val); link_public_api(int) parse_options_get_display_constituents(Parse_Options opts); link_public_api(void) parse_options_set_display_bad(Parse_Options opts, int val); link_public_api(int) parse_options_get_display_bad(Parse_Options opts); link_public_api(void) parse_options_set_display_disjuncts(Parse_Options opts, int val); link_public_api(int) parse_options_get_display_disjuncts(Parse_Options opts); link_public_api(void) parse_options_set_display_links(Parse_Options opts, int val); link_public_api(int) parse_options_get_display_links(Parse_Options opts); link_public_api(void) parse_options_set_display_senses(Parse_Options opts, int val); link_public_api(int) parse_options_get_display_senses(Parse_Options opts); link_public_api(void) parse_options_set_display_union(Parse_Options opts, int val); link_public_api(int) parse_options_get_display_union(Parse_Options opts); link_public_api(void) parse_options_set_echo_on(Parse_Options opts, int val); link_public_api(int) parse_options_get_echo_on(Parse_Options opts); /********************************************************************** * * Functions to manipulate Sentences * ***********************************************************************/ typedef struct Sentence_s * Sentence; link_public_api(Sentence) sentence_create(const char *input_string, Dictionary dict); link_public_api(void) sentence_delete(Sentence sent); link_public_api(int) sentence_split(Sentence sent, Parse_Options opts); link_public_api(int) sentence_parse(Sentence sent, Parse_Options opts); link_public_api(int) sentence_length(Sentence sent); link_public_api(const char *) sentence_get_word(Sentence sent, int wordnum); link_public_api(int) sentence_null_count(Sentence sent); link_public_api(int) sentence_num_linkages_found(Sentence sent); link_public_api(int) sentence_num_valid_linkages(Sentence sent); link_public_api(int) sentence_num_linkages_post_processed(Sentence sent); link_public_api(int) sentence_num_thin_linkages(Sentence sent); link_public_api(int) sentence_num_violations(Sentence sent, int i); link_public_api(int) sentence_and_cost(Sentence sent, int i); link_public_api(int) sentence_disjunct_cost(Sentence sent, int i); link_public_api(int) sentence_link_cost(Sentence sent, int i); link_public_api(int) sentence_contains_conjunction(Sentence sent); /********************************************************************** * * Functions that create and manipulate Linkages. * When a Linkage is requested, the user is given a * copy of all of the necessary information, and is responsible * for freeing up the storage when he/she is finished, using * the routines provided below. * ***********************************************************************/ typedef struct Linkage_s * Linkage; link_public_api(Linkage) linkage_create(int index, Sentence sent, Parse_Options opts); link_public_api(int) linkage_get_current_sublinkage(Linkage linkage); link_public_api(int) linkage_set_current_sublinkage(Linkage linkage, int index); link_public_api(void) linkage_delete(Linkage linkage); link_public_api(Sentence) linkage_get_sentence(Linkage linkage); link_public_api(int) linkage_get_num_sublinkages(Linkage linkage); link_public_api(int) linkage_get_num_words(Linkage linkage); link_public_api(int) linkage_get_num_links(Linkage linkage); link_public_api(int) linkage_get_link_lword(Linkage linkage, int index); link_public_api(int) linkage_get_link_rword(Linkage linkage, int index); link_public_api(int) linkage_get_link_length(Linkage linkage, int index); link_public_api(const char *) linkage_get_link_label(Linkage linkage, int index); link_public_api(const char *) linkage_get_link_llabel(Linkage linkage, int index); link_public_api(const char *) linkage_get_link_rlabel(Linkage linkage, int index); link_public_api(int) linkage_get_link_num_domains(Linkage linkage, int index); link_public_api(const char **) linkage_get_link_domain_names(Linkage linkage, int index); link_public_api(const char **) linkage_get_words(Linkage linkage); link_public_api(const char *) linkage_get_disjunct_str(Linkage linkage, int w); link_public_api(double) linkage_get_disjunct_cost(Linkage linkage, int w); link_public_api(double) linkage_get_disjunct_corpus_score(Linkage linkage, int w); link_public_api(const char *) linkage_get_word(Linkage linkage, int w); link_public_api(char *) linkage_print_disjuncts(Linkage linkage); link_public_api(void) linkage_free_disjuncts(char *str); link_public_api(char *) linkage_print_links_and_domains(Linkage linkage); link_public_api(void) linkage_free_links_and_domains(char *str); link_public_api(char *) linkage_print_senses(Linkage linkage); link_public_api(void) linkage_free_senses(char *str); link_public_api(char *) linkage_print_constituent_tree(Linkage linkage, int mode); link_public_api(void) linkage_free_constituent_tree_str(char *str); link_public_api(char *) linkage_print_postscript(Linkage linkage, int mode); link_public_api(void) linkage_free_postscript(char * str); link_public_api(char *) linkage_print_diagram(Linkage linkage); link_public_api(void) linkage_free_diagram(char * str); link_public_api(int) linkage_compute_union(Linkage linkage); link_public_api(int) linkage_is_fat(Linkage linkage); link_public_api(int) linkage_unused_word_cost(Linkage linkage); link_public_api(int) linkage_disjunct_cost(Linkage linkage); link_public_api(int) linkage_and_cost(Linkage linkage); link_public_api(int) linkage_link_cost(Linkage linkage); link_public_api(double) linkage_corpus_cost(Linkage linkage); link_public_api(int) linkage_is_canonical(Linkage linkage); link_public_api(int) linkage_is_improper(Linkage linkage); link_public_api(int) linkage_has_inconsistent_domains(Linkage linkage); link_public_api(const char *) linkage_get_violation_name(Linkage linkage); /********************************************************************** * * Functions that allow special-purpose post-processing of linkages * ***********************************************************************/ typedef struct Postprocessor_s PostProcessor; link_public_api(PostProcessor *) post_process_open(const char *path); link_public_api(void) post_process_close(PostProcessor *); link_public_api(void) linkage_post_process(Linkage, PostProcessor *); /********************************************************************** * * Constituent node * ***********************************************************************/ typedef struct CNode_s CNode; link_public_api(CNode *) linkage_constituent_tree(Linkage linkage); link_public_api(void) linkage_free_constituent_tree(CNode * n); link_public_api(const char *) linkage_constituent_node_get_label(const CNode *n); link_public_api(CNode *) linkage_constituent_node_get_child(const CNode *n); link_public_api(CNode *) linkage_constituent_node_get_next(const CNode *n); link_public_api(int) linkage_constituent_node_get_start(const CNode *n); link_public_api(int) linkage_constituent_node_get_end(const CNode *n); /********************************************************************** * * Internal functions -- do not use these in new code! * These are not intended for general public use, but are required to * work around certain Micorsoft Windows linking oddities * (specifically, to be callable from the JNI bindings library.) * ***********************************************************************/ link_public_api(void) parse_options_print_total_time(Parse_Options opts); #if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ > 4) #define GNUC_PRINTF( format_idx, arg_idx ) \ __attribute__((__format__ (__printf__, format_idx, arg_idx))) #else #define GNUC_PRINTF( format_idx, arg_idx ) #endif link_public_api(void) prt_error(const char *fmt, ...) GNUC_PRINTF(1,2); /******************************************************* * * Obsolete functions -- do not use these in new code! * XXX TBD: These will all go away in Version 5.0. * ********************************************************/ /* Identical to sentence_get_word() * XXX TBD: make this go away in Version 5.0. */ link_public_api(const char *) sentence_get_nth_word(Sentence sent, int i); /* Who uses this function, anyway? How did this get exported? * XXX TBD: make this go away in Version 5.0. */ link_public_api(int) sentence_nth_word_has_disjunction(Sentence sent, int i); /* This is not intended for general use; its specific to the internals * of the command-line client. It was exported by accident. * XXX TBD: make this go away in Version 5.0. */ link_public_api(int) issue_special_command(const char * line, Parse_Options opts, Dictionary dict); /* These are obsolete, and do nothing. * XXX TBD: make these go away in Version 5.0. */ link_public_api(void) lperror_clear(void); extern link_public_api(int) lperrno; extern link_public_api(char) lperrmsg[]; LINK_END_DECLS #endif link-grammar-4.7.4/link-grammar/jni-client.c0000644000175000017500000004723511526022265017706 0ustar bloombloom/* * Java JNI interfaces. * * This implements a very simple, low-brow, non-OOP interface. * It could be improved. */ #include #include #include #include #ifdef USE_PTHREADS #include #endif #include "api.h" #include "corpus/corpus.h" #include "error.h" #include "jni-client.h" #include "utilities.h" typedef struct { Dictionary dict; Parse_Options opts, panic_parse_opts; Sentence sent; Linkage linkage; int num_linkages, cur_linkage; #if DO_PHRASE_TREE CNode* tree; #endif } per_thread_data; /* XXX FIXME * The per_thread_data struct should ideally be somehow * fetched from JNIEnv, or as an opaque pointer in the class. * Not clear how to do this .. perhaps use NewDirectByteBuffer() * and the java.nio.ByteBuffer class ? */ #ifdef USE_PTHREADS static pthread_key_t java_key; static pthread_once_t java_key_once = PTHREAD_ONCE_INIT; static void java_key_alloc(void) { pthread_key_create(&java_key, free); } #else static per_thread_data * global_ptd = NULL; #endif static per_thread_data * get_ptd(JNIEnv *env, jclass cls) { #ifdef USE_PTHREADS per_thread_data *ptd = pthread_getspecific(java_key); #else per_thread_data *ptd = global_ptd; #endif if (!ptd) Java_org_linkgrammar_LinkGrammar_init(env, cls); #ifdef USE_PTHREADS ptd = pthread_getspecific(java_key); #else ptd = global_ptd; #endif return ptd; } static void setup_panic_parse_options(Parse_Options opts) { parse_options_set_disjunct_costf(opts, 3.0f); parse_options_set_min_null_count(opts, 1); parse_options_set_max_null_count(opts, MAX_SENTENCE); parse_options_set_max_parse_time(opts, 60); parse_options_set_use_fat_links(opts, FALSE); parse_options_set_islands_ok(opts, TRUE); parse_options_set_short_length(opts, 6); parse_options_set_all_short_connectors(opts, TRUE); parse_options_set_linkage_limit(opts, 100); parse_options_set_verbosity(opts, 0); parse_options_set_spell_guess(opts, FALSE); } static inline void test(void) { #ifdef DEBUG printf("%d\n",word_contains("said",PAST_TENSE_FORM_MARKER,dict)); printf("%d\n",word_contains("gave.v",PAST_TENSE_FORM_MARKER,dict)); printf("%d\n",word_contains("have",PAST_TENSE_FORM_MARKER,dict)); printf("%d\n",word_contains("had",PAST_TENSE_FORM_MARKER,dict)); #endif } /* message: The string is encoded in modified UTF-8, per JNI 1.5 spec. */ static void throwException(JNIEnv *env, const char* message) { char *msg; jclass exceptionClazz; if ((*env)->ExceptionOccurred(env) != NULL) return; msg = (char *) malloc(50+strlen(message)); strcpy(msg, "link-grammar JNI:\n"); strcat(msg, message); exceptionClazz = (*env)->FindClass(env, "java/lang/RuntimeException"); if ((*env)->ThrowNew(env, exceptionClazz, msg) != 0) (*env)->FatalError(env, "Fatal: link-grammar JNI: Cannot throw"); } static per_thread_data * init(JNIEnv *env, jclass cls) { const char *codeset, *dict_version; per_thread_data *ptd; /* Get the locale from the environment... * perhaps we should someday get it from the dictionary ?? */ setlocale(LC_ALL, ""); /* Everything breaks if the locale is not UTF-8; check for this, * and force the issue ! */ codeset = nl_langinfo(CODESET); if (!strstr(codeset, "UTF") && !strstr(codeset, "utf")) { prt_error("Warning: JNI: locale %s was not UTF-8; force-setting to en_US.UTF-8\n", codeset); setlocale(LC_CTYPE, "en_US.UTF-8"); } ptd = (per_thread_data *) malloc(sizeof(per_thread_data)); memset(ptd, 0, sizeof(per_thread_data)); ptd->panic_parse_opts = parse_options_create(); setup_panic_parse_options(ptd->panic_parse_opts); ptd->opts = parse_options_create(); parse_options_set_disjunct_costf(ptd->opts, 3.0f); parse_options_set_max_sentence_length(ptd->opts, 170); parse_options_set_max_parse_time(ptd->opts, 30); parse_options_set_linkage_limit(ptd->opts, 1000); parse_options_set_short_length(ptd->opts, 10); parse_options_set_verbosity(ptd->opts,0); parse_options_set_spell_guess(ptd->opts, FALSE); /* Default to the english language; will need to fix * this if/when more languages are supported. */ ptd->dict = dictionary_create_lang("en"); if (!ptd->dict) throwException(env, "Error: unable to open dictionary"); else test(); dict_version = linkgrammar_get_dict_version(ptd->dict); prt_error("Info: JNI: dictionary version %s\n", dict_version); return ptd; } static void finish(per_thread_data *ptd) { if (ptd->sent) sentence_delete(ptd->sent); ptd->sent = NULL; #if DO_PHRASE_TREE if (tree) linkage_free_constituent_tree(tree); tree = NULL; #endif if (ptd->linkage) linkage_delete(ptd->linkage); ptd->linkage = NULL; dictionary_delete(ptd->dict); ptd->dict = NULL; parse_options_delete(ptd->opts); ptd->opts = NULL; parse_options_delete(ptd->panic_parse_opts); ptd->panic_parse_opts = NULL; #ifdef USE_PTHREADS pthread_setspecific(java_key, NULL); #else global_ptd = NULL; #endif free(ptd); } /* ================================================================= */ /* Misc utilities */ #ifdef DEBUG_DO_PHRASE_TREE static void r_printTree(CNode* cn, int level) { int i; CNode* c; if (cn == NULL) return; /* print label */ if (cn->label != NULL) { printf("(%s ", cn->label); } else { printf("NULL\n"); } /* Recurse on children. */ for (c = cn->child; c!=NULL; c=c->next) { if (c->child) r_printTree(c, level+1); else printf("%s ", c->label); } printf(")\n"); for (i=0; i<=level; i++) printf (" "); } static void printTree(CNode* cn) { r_printTree(cn,0); printf("\n"); } #endif /* DEBUG */ static void jParse(JNIEnv *env, per_thread_data *ptd, char* inputString) { int maxlen; Parse_Options opts = ptd->opts; int jverbosity = parse_options_get_verbosity(opts); if (ptd->sent) sentence_delete(ptd->sent); if (ptd->dict == NULL) throwException(env, "jParse: dictionary not open\n"); if (inputString == NULL) throwException(env, "jParse: no input sentence!\n"); ptd->sent = sentence_create(inputString, ptd->dict); ptd->num_linkages = 0; if (ptd->sent == NULL) return; maxlen = parse_options_get_max_sentence_length(ptd->opts); if (maxlen < sentence_length(ptd->sent)) { if (jverbosity > 0) { prt_error("Error: JNI: Sentence length (%d words) exceeds maximum allowable (%d words)\n", sentence_length(ptd->sent), maxlen); } sentence_delete(ptd->sent); ptd->sent = NULL; return; } /* First parse with cost 0 or 1 and no null links or fat links */ parse_options_set_disjunct_costf(opts, 2.0f); parse_options_set_min_null_count(opts, 0); parse_options_set_max_null_count(opts, 0); parse_options_set_use_fat_links(opts, FALSE); parse_options_reset_resources(opts); ptd->num_linkages = sentence_parse(ptd->sent, ptd->opts); /* If failed, try with fat links ... */ if ((0 == ptd->num_linkages) && sentence_contains_conjunction(ptd->sent)) { parse_options_set_use_fat_links(opts, TRUE); ptd->num_linkages = sentence_parse(ptd->sent, ptd->opts); } /* If still failed, try again with null links */ if (0 == ptd->num_linkages) { if (jverbosity > 0) prt_error("Warning: JNI: No complete linkages found.\n"); if (parse_options_get_allow_null(opts)) { parse_options_set_min_null_count(opts, 1); parse_options_set_max_null_count(opts, sentence_length(ptd->sent)); ptd->num_linkages = sentence_parse(ptd->sent, opts); } } if (parse_options_timer_expired(opts)) { if (jverbosity > 0) prt_error("Warning: JNI: Timer is expired!\n"); } if (parse_options_memory_exhausted(opts)) { if (jverbosity > 0) prt_error("Warning: JNI: Memory is exhausted!\n"); } if ((ptd->num_linkages == 0) && parse_options_resources_exhausted(opts)) { parse_options_print_total_time(opts); if (jverbosity > 0) prt_error("Warning: JNI: Entering \"panic\" mode...\n"); parse_options_reset_resources(ptd->panic_parse_opts); parse_options_set_verbosity(ptd->panic_parse_opts, jverbosity); ptd->num_linkages = sentence_parse(ptd->sent, ptd->panic_parse_opts); if (parse_options_timer_expired(ptd->panic_parse_opts)) { if (jverbosity > 0) prt_error("Error: JNI: Timer is expired!\n"); } } } static void makeLinkage(per_thread_data *ptd) { if (ptd->cur_linkage < ptd->num_linkages) { if (ptd->linkage) linkage_delete(ptd->linkage); ptd->linkage = linkage_create(ptd->cur_linkage,ptd->sent,ptd->opts); linkage_compute_union(ptd->linkage); linkage_set_current_sublinkage(ptd->linkage, linkage_get_num_sublinkages(ptd->linkage)-1); #if DO_PHRASE_TREE if (tree) linkage_free_constituent_tree(tree); tree = linkage_constituent_tree(linkage); printTree(tree); #endif } } /* ================================================================ */ /* Java JNI wrappers */ /* * Class: LinkGrammar * Method: getVersion * Signature: (I)Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_org_linkgrammar_LinkGrammar_getVersion(JNIEnv *env, jclass cls) { const char *s = linkgrammar_get_version(); jstring j = (*env)->NewStringUTF(env, s); return j; } JNIEXPORT jstring JNICALL Java_org_linkgrammar_LinkGrammar_getDictVersion(JNIEnv *env, jclass cls) { per_thread_data *ptd = get_ptd(env, cls); const char *s = linkgrammar_get_dict_version(ptd->dict); jstring j = (*env)->NewStringUTF(env, s); return j; } JNIEXPORT void JNICALL Java_org_linkgrammar_LinkGrammar_setMaxParseSeconds(JNIEnv *env, jclass cls, jint maxParseSeconds) { per_thread_data *ptd = get_ptd(env, cls);; parse_options_set_max_parse_time(ptd->opts, maxParseSeconds); } JNIEXPORT void JNICALL Java_org_linkgrammar_LinkGrammar_setMaxCost(JNIEnv *env, jclass cls, jint maxCost) { per_thread_data *ptd = get_ptd(env, cls);; parse_options_set_disjunct_cost(ptd->opts, maxCost); } JNIEXPORT void JNICALL Java_org_linkgrammar_LinkGrammar_setDictionariesPath(JNIEnv *env, jclass cls, jstring path) { const char *nativePath = (*env)->GetStringUTFChars(env,path, 0); // Java passes null pointers as the string "null" if (nativePath && strcmp(nativePath, "null")) { dictionary_set_data_dir(nativePath); } (*env)->ReleaseStringUTFChars(env,path, nativePath); } /* * Class: LinkGrammar * Method: init * Signature: ()V */ JNIEXPORT void JNICALL Java_org_linkgrammar_LinkGrammar_init(JNIEnv *env, jclass cls) { #ifdef USE_PTHREADS per_thread_data *ptd; pthread_once(&java_key_once, java_key_alloc); ptd = pthread_getspecific(java_key); if (ptd) return; ptd = init(env, cls); pthread_setspecific(java_key, ptd); #else if (global_ptd) return; global_ptd = init(env, cls); #endif } /* * Class: LinkGrammar * Method: parse * Signature: (Ljava/lang/String;)V */ JNIEXPORT void JNICALL Java_org_linkgrammar_LinkGrammar_parse(JNIEnv *env, jclass cls, jstring str) { const char *cStr; char * tmp; per_thread_data *ptd = get_ptd(env, cls);; cStr = (*env)->GetStringUTFChars(env,str,0); tmp = strdup(cStr); jParse(env, ptd, tmp); free(tmp); (*env)->ReleaseStringUTFChars(env,str,cStr); } /* * Class: LinkGrammar * Method: close * Signature: ()V */ JNIEXPORT void JNICALL Java_org_linkgrammar_LinkGrammar_close(JNIEnv *env, jclass cls) { per_thread_data *ptd = get_ptd(env, cls);; finish(ptd); } /* * Class: LinkGrammar * Method: numWords * Signature: ()I */ JNIEXPORT jint JNICALL Java_org_linkgrammar_LinkGrammar_getNumWords(JNIEnv *env, jclass cls) { per_thread_data *ptd = get_ptd(env, cls);; return linkage_get_num_words(ptd->linkage); } /* * Class: LinkGrammar * Method: getWord * Signature: (I)Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_org_linkgrammar_LinkGrammar_getWord(JNIEnv *env, jclass cls, jint i) { per_thread_data *ptd = get_ptd(env, cls); /* Does not need to be freed, points into sentence */ const char * w = sentence_get_word(ptd->sent, i); /* FWIW, j will be null if w is utf8-encoded Japanese or Chinese. * I guess my JVM is not capable of handling Chinese/Japanese ?? * Maybe some special java thing needs to be installed? */ jstring j = (*env)->NewStringUTF(env, w); return j; } JNIEXPORT jstring JNICALL Java_org_linkgrammar_LinkGrammar_getLinkageWord(JNIEnv *env, jclass cls, jint i) { per_thread_data *ptd = get_ptd(env, cls); /* Does not need to be freed, points into data structures */ /* Returns the inflected word. */ const char * w = linkage_get_word(ptd->linkage, i); jstring j = (*env)->NewStringUTF(env, w); return j; } JNIEXPORT jstring JNICALL Java_org_linkgrammar_LinkGrammar_getLinkageDisjunct(JNIEnv *env, jclass cls, jint i) { jstring j; per_thread_data *ptd = get_ptd(env, cls); /* does not need to be freed, points into data structures */ /* returns the inflected word. */ const char * w = linkage_get_disjunct_str(ptd->linkage, i); if (NULL == w) j = NULL; else j = (*env)->NewStringUTF(env, w); return j; } JNIEXPORT jstring JNICALL Java_org_linkgrammar_LinkGrammar_getLinkageSense(JNIEnv *env, jclass cls, jint i, jint j) { per_thread_data *ptd = get_ptd(env, cls); Linkage lkg = ptd->linkage; Linkage_info *lifo = lkg->info; Sense *sns; const char * w = NULL; jstring js; lg_corpus_linkage_senses(lkg); sns = lg_get_word_sense(lifo, i); while ((0 < j) && sns) { sns = lg_sense_next(sns); j--; } /* does not need to be freed, points into data structures */ if (sns) w = lg_sense_get_sense(sns); if (w) js = (*env)->NewStringUTF(env, w); else js = NULL; return js; } JNIEXPORT jdouble JNICALL Java_org_linkgrammar_LinkGrammar_getLinkageSenseScore(JNIEnv *env, jclass cls, jint i, jint j) { per_thread_data *ptd = get_ptd(env, cls); Linkage lkg = ptd->linkage; Linkage_info *lifo = lkg->info; Sense *sns; double score = 0.0; sns = lg_get_word_sense(lifo, i); while ((0 < j) && sns) { sns = lg_sense_next(sns); j--; } if (sns) score = lg_sense_get_score(sns); return score; } /* * Class: LinkGrammar * Method: numSkippedWords * Signature: ()I */ JNIEXPORT jint JNICALL Java_org_linkgrammar_LinkGrammar_getNumSkippedWords(JNIEnv *env, jclass cls) { per_thread_data *ptd = get_ptd(env, cls); return sentence_null_count(ptd->sent); } /* * Class: LinkGrammar * Method: numLinkages * Signature: ()I */ JNIEXPORT jint JNICALL Java_org_linkgrammar_LinkGrammar_getNumLinkages(JNIEnv *env, jclass cls) { per_thread_data *ptd = get_ptd(env, cls); return sentence_num_valid_linkages(ptd->sent); } /* * Class: LinkGrammar * Method: makeLinkage * Signature: (I)I */ JNIEXPORT void JNICALL Java_org_linkgrammar_LinkGrammar_makeLinkage(JNIEnv *env, jclass cls, jint i) { per_thread_data *ptd = get_ptd(env, cls); ptd->cur_linkage = i; makeLinkage(ptd); } /* * Class: LinkGrammar * Method: linkageNumViolations * Signature: ()I */ JNIEXPORT jint JNICALL Java_org_linkgrammar_LinkGrammar_getLinkageNumViolations(JNIEnv *env, jclass cls) { per_thread_data *ptd = get_ptd(env, cls); return sentence_num_violations(ptd->sent, ptd->cur_linkage); } /* * Class: LinkGrammar * Method: linkageAndCost * Signature: ()I */ JNIEXPORT jint JNICALL Java_org_linkgrammar_LinkGrammar_getLinkageAndCost(JNIEnv *env, jclass cls) { per_thread_data *ptd = get_ptd(env, cls); return sentence_and_cost(ptd->sent, ptd->cur_linkage); } /* * Class: LinkGrammar * Method: linkageDisjunctCost * Signature: ()I */ JNIEXPORT jint JNICALL Java_org_linkgrammar_LinkGrammar_getLinkageDisjunctCost(JNIEnv *env, jclass cls) { per_thread_data *ptd = get_ptd(env, cls); return sentence_disjunct_cost(ptd->sent, ptd->cur_linkage); } /* * Class: LinkGrammar * Method: linkageLinkCost * Signature: ()I */ JNIEXPORT jint JNICALL Java_org_linkgrammar_LinkGrammar_getLinkageLinkCost(JNIEnv *env, jclass cls) { per_thread_data *ptd = get_ptd(env, cls); return sentence_link_cost(ptd->sent, ptd->cur_linkage); } /* * Class: LinkGrammar * Method: getNumLinks * Signature: ()I */ JNIEXPORT jint JNICALL Java_org_linkgrammar_LinkGrammar_getNumLinks(JNIEnv *env, jclass cls) { per_thread_data *ptd = get_ptd(env, cls); return linkage_get_num_links(ptd->linkage); } /* * Class: LinkGrammar * Method: getLinkLWord * Signature: (I)I */ JNIEXPORT jint JNICALL Java_org_linkgrammar_LinkGrammar_getLinkLWord(JNIEnv *env, jclass cls, jint i) { per_thread_data *ptd = get_ptd(env, cls); return linkage_get_link_lword(ptd->linkage, i); } /* * Class: LinkGrammar * Method: getLinkRWord * Signature: (I)I */ JNIEXPORT jint JNICALL Java_org_linkgrammar_LinkGrammar_getLinkRWord(JNIEnv *env, jclass cls, jint i) { per_thread_data *ptd = get_ptd(env, cls); return linkage_get_link_rword(ptd->linkage, i); } /* * Class: LinkGrammar * Method: getLinkLLabel * Signature: (I)Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_org_linkgrammar_LinkGrammar_getLinkLLabel(JNIEnv *env, jclass cls, jint i) { per_thread_data *ptd = get_ptd(env, cls); /* Does not need to be freed, points into linkage */ const char *s = linkage_get_link_llabel(ptd->linkage, i); jstring j = (*env)->NewStringUTF(env, s); return j; } /* * Class: LinkGrammar * Method: getLinkRLabel * Signature: (I)Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_org_linkgrammar_LinkGrammar_getLinkRLabel(JNIEnv *env, jclass cls, jint i) { per_thread_data *ptd = get_ptd(env, cls); /* Does not need to be freed, points into linkage */ const char *s = linkage_get_link_rlabel(ptd->linkage, i); jstring j = (*env)->NewStringUTF(env, s); return j; } /* * Class: LinkGrammar * Method: getLinkLabel * Signature: (I)Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_org_linkgrammar_LinkGrammar_getLinkLabel(JNIEnv *env, jclass cls, jint i) { per_thread_data *ptd = get_ptd(env, cls); /* Does not need to be freed, points into linkage */ const char *s = linkage_get_link_label(ptd->linkage, i); jstring j = (*env)->NewStringUTF(env, s); return j; } /* * Class: LinkGrammar * Method: constituentString * Signature: ()Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_org_linkgrammar_LinkGrammar_getConstituentString(JNIEnv *env, jclass cls) { per_thread_data *ptd = get_ptd(env, cls); /* mode 1 prints a lisp-style string, nicely indented. * mode 2 prints a lisp-style string, but with square brackets. * mode 3 prints a lisp-style string, one one single line. */ /* char *s = linkage_print_constituent_tree(linkage, 1); */ char *s = linkage_print_constituent_tree(ptd->linkage, 3); jstring j = (*env)->NewStringUTF(env, s); linkage_free_constituent_tree_str(s); return j; } /* * Class: LinkGrammar * Method: linkString * Signature: ()Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_org_linkgrammar_LinkGrammar_getLinkString(JNIEnv *env, jclass cls) { per_thread_data *ptd = get_ptd(env, cls); char *s = linkage_print_diagram(ptd->linkage); jstring j = (*env)->NewStringUTF(env, s); linkage_free_diagram(s); return j; } /* * Class: LinkParser * Method: isPastTenseForm * Signature: (Ljava/lang/String;)Z * * @deprecated -- past-tense verbs are tagged with .v-d or .w-d or .q-d * subscripts. use those instead to figure out if a verb is past tense. */ JNIEXPORT jboolean JNICALL Java_org_linkgrammar_LinkGrammar_isPastTenseForm(JNIEnv *env, jclass cls, jstring str) { jboolean rv = FALSE; per_thread_data *ptd = get_ptd(env, cls); const char *cStr = (*env)->GetStringUTFChars(env,str,0); if (dictionary_is_past_tense_form(ptd->dict, cStr) == 1) rv = TRUE; (*env)->ReleaseStringUTFChars(env,str,cStr); return rv; } /* * Class: LinkParser * Method: isEntity * Signature: (Ljava/lang/String;)Z */ JNIEXPORT jboolean JNICALL Java_org_linkgrammar_LinkGrammar_isEntity(JNIEnv *env, jclass cls, jstring str) { jboolean rv = FALSE; per_thread_data *ptd = get_ptd(env, cls); const char *cStr = (*env)->GetStringUTFChars(env,str,0); if (dictionary_is_entity(ptd->dict, cStr) == 1) rv = TRUE; (*env)->ReleaseStringUTFChars(env,str,cStr); return rv; } link-grammar-4.7.4/link-grammar/string-set.c0000644000175000017500000001203111145400370017725 0ustar bloombloom/*************************************************************************/ /* Copyright (c) 2004 */ /* Daniel Sleator, David Temperley, and John Lafferty */ /* All rights reserved */ /* */ /* Use of the link grammar parsing system is subject to the terms of the */ /* license set forth in the LICENSE file included with this software, */ /* and also available at http://www.link.cs.cmu.edu/link/license.html */ /* This license allows free redistribution and use in source and binary */ /* forms, with or without modification, subject to certain conditions. */ /* */ /*************************************************************************/ #include /** * Suppose you have a program that generates strings and keeps pointers to them. The program never needs to change these strings once they're generated. If it generates the same string again, then it can reuse the one it generated before. This is what this package supports. String_set is the object. The functions are: char * string_set_add(char * source_string, String_set * ss); This function returns a pointer to a string with the same contents as the source_string. If that string is already in the table, then it uses that copy, otherwise it generates and inserts a new one. char * string_set_lookup(char * source_string, String_set * ss); This function returns a pointer to a string with the same contents as the source_string. If that string is not already in the table, returns NULL; String_set * string_set_create(void); Create a new empty String_set. string_set_delete(String_set *ss); Free all the space associated with this string set. The implementation uses probed hashing (i.e. not bucket). */ static int hash_string(const char *sa, const String_set *ss) { unsigned char *str = (unsigned char *) sa; unsigned int accum = 0; for (;*str != '\0'; str++) accum = ((256*accum) + (*str)) % (ss->size); return accum; } static int stride_hash_string(const char *sa, const String_set *ss) { unsigned char *str = (unsigned char *) sa; /* This is the stride used, so we have to make sure that its value is not 0 */ unsigned int accum = 0; for (;*str != '\0'; str++) accum = ((17*accum) + (*str)) % (ss->size); if (accum == 0) accum = 1; return accum; } /* return the next prime up from start */ static int next_prime_up(int start) { int i; start = start | 1; /* make it odd */ for (;;) { for (i=3; (i <= (start/i)); i += 2) { if (start % i == 0) break; } if (start % i == 0) { start += 2; } else { return start; } } } String_set * string_set_create(void) { String_set *ss; int i; ss = (String_set *) xalloc(sizeof(String_set)); ss->size = next_prime_up(100); ss->table = (char **) xalloc(ss->size * sizeof(char *)); ss->count = 0; for (i=0; isize; i++) ss->table[i] = NULL; return ss; } /** * lookup the given string in the table. Return a pointer * to the place it is, or the place where it should be. */ static int find_place(const char * str, String_set *ss) { int h, s, i; h = hash_string(str, ss); s = stride_hash_string(str, ss); for (i=h; 1; i = (i + s)%(ss->size)) { if ((ss->table[i] == NULL) || (strcmp(ss->table[i], str) == 0)) return i; } } static void grow_table(String_set *ss) { String_set old; int i, p; old = *ss; ss->size = next_prime_up(2 * old.size); /* at least double the size */ ss->table = (char **) xalloc(ss->size * sizeof(char *)); ss->count = 0; for (i=0; isize; i++) ss->table[i] = NULL; for (i=0; itable[p] = old.table[i]; ss->count++; } } /*printf("growing from %d to %d\n", old.size, ss->size);*/ fflush(stdout); xfree((char *) old.table, old.size * sizeof(char *)); } const char * string_set_add(const char * source_string, String_set * ss) { char * str; int len, p; assert(source_string != NULL, "STRING_SET: Can't insert a null string"); p = find_place(source_string, ss); if (ss->table[p] != NULL) return ss->table[p]; len = strlen(source_string); str = (char *) xalloc(len+1); strcpy(str, source_string); ss->table[p] = str; ss->count++; /* We just added it to the table. If the table got too big, we grow it. Too big is defined as being more than 3/4 full */ if ((4 * ss->count) > (3 * ss->size)) grow_table(ss); return str; } const char * string_set_lookup(const char * source_string, String_set * ss) { int p; p = find_place(source_string, ss); return ss->table[p]; } void string_set_delete(String_set *ss) { int i; if (ss == NULL) return; for (i=0; isize; i++) { if (ss->table[i] != NULL) xfree(ss->table[i], strlen(ss->table[i]) + 1); } xfree((char *) ss->table, ss->size * sizeof(char *)); xfree((char *) ss, sizeof(String_set)); } link-grammar-4.7.4/link-grammar/pp_lexer.h0000644000175000017500000000247211145376005017470 0ustar bloombloom/*************************************************************************/ /* Copyright (c) 2004 */ /* Daniel Sleator, David Temperley, and John Lafferty */ /* All rights reserved */ /* */ /* Use of the link grammar parsing system is subject to the terms of the */ /* license set forth in the LICENSE file included with this software, */ /* and also available at http://www.link.cs.cmu.edu/link/license.html */ /* This license allows free redistribution and use in source and binary */ /* forms, with or without modification, subject to certain conditions. */ /* */ /*************************************************************************/ PPLexTable *pp_lexer_open(FILE *f); void pp_lexer_close (PPLexTable *lt); int pp_lexer_set_label (PPLexTable *lt, const char *label); int pp_lexer_count_tokens_of_label (PPLexTable *lt); const char *pp_lexer_get_next_token_of_label(PPLexTable *lt); int pp_lexer_count_commas_of_label (PPLexTable *lt); const char **pp_lexer_get_next_group_of_tokens_of_label(PPLexTable *lt,int *n_toks); link-grammar-4.7.4/link-grammar/read-regex.c0000644000175000017500000000765511241155242017673 0ustar bloombloom/*************************************************************************/ /* Copyright (c) 2005 Sampo Pyysalo */ /* */ /* Use of the link grammar parsing system is subject to the terms of the */ /* license set forth in the LICENSE file included with this software, */ /* and also available at http://www.link.cs.cmu.edu/link/license.html */ /* This license allows free redistribution and use in source and binary */ /* forms, with or without modification, subject to certain conditions. */ /* */ /*************************************************************************/ #include #include "link-includes.h" #include "api-structures.h" #include "structures.h" #include "read-regex.h" /* Function for reading regular expression name:pattern combinations into the Dictionary from a given file. The format of the regex file is as follows: Lines starting with "%" are comments and are ignored. All other nonempty lines must follow the following format: REGEX_NAME: /pattern/ here REGEX_NAME is an identifying unique name for the regex. This name is used to determine the disjuncts that will be assigned to tokens matching the pattern, so in the dictionary file (e.g. 4.0.dict) you must have something like REGEX_NAME: (({@MX+} & (JG- or )) or YS+)) or AN+ or G+); using the same name. The pattern itself must be surrounded by slashes. Extra whitespace is ignored. */ #define MAX_REGEX_NAME_LENGTH 50 #define MAX_REGEX_LENGTH 255 int read_regex_file(Dictionary dict, const char *file_name) { Regex_node **tail = &dict->regex_root; /* Last Regex_node * in list */ Regex_node *new_re; char name[MAX_REGEX_NAME_LENGTH]; char regex[MAX_REGEX_LENGTH]; int c,prev,i,line=1; FILE *fp; fp = dictopen(file_name, "r"); if (fp == NULL) { prt_error("Error: cannot open regex file %s\n", file_name); return 1; } /* read in regexs. loop broken on EOF. */ while (1) { /* skip whitespace and comments. */ do { do { c = fgetc(fp); if (c == '\n') { line++; } } while(isspace(c)); if (c == '%') { while ((c != EOF) && (c != '\n')) { c = fgetc(fp); } line++; } } while(isspace(c)); if (c == EOF) { break; } /* done. */ /* read in the name of the regex. */ i = 0; do { if (i > MAX_REGEX_NAME_LENGTH-1) { prt_error("Error: Regex name too long on line %d\n", line); goto failure; } name[i++] = c; c = fgetc(fp); } while ((!isspace(c)) && (c != ':') && (c != EOF)); name[i] = '\0'; /* Skip possible whitespace after name, expect colon. */ while (isspace(c)) { if (c == '\n') { line++; } c = fgetc(fp); } if (c != ':') { prt_error("Error: Regex missing colon on line %d\n", line); goto failure; } /* Skip whitespace after colon, expect slash. */ do { if (c == '\n') { line++; } c = fgetc(fp); } while (isspace(c)); if (c != '/') { prt_error("Error: Regex missing leading slash on line %d\n", line); goto failure; } /* Read in the regex. */ prev = 0; i = 0; do { if (i > MAX_REGEX_LENGTH-1) { prt_error("Error: Regex too long on line %d\n", line); goto failure; } prev = c; c = fgetc(fp); regex[i++] = c; } while ((c != '/' || prev == '\\') && (c != EOF)); regex[i-1] = '\0'; /* Expect termination by a slash. */ if (c != '/') { prt_error("Error: Regex missing trailing slash on line %d\n", line); goto failure; } /* Create new Regex_node and add to dict list. */ new_re = (Regex_node *) malloc(sizeof(Regex_node)); new_re->name = strdup(name); new_re->pattern = strdup(regex); new_re->re = NULL; new_re->next = NULL; *tail = new_re; tail = &new_re->next; } fclose(fp); return 0; failure: fclose(fp); return 1; } link-grammar-4.7.4/link-grammar/prefix.h0000644000175000017500000001224510256100375017143 0ustar bloombloom/* * BinReloc - a library for creating relocatable executables * Written by: Mike Hearn * Hongli Lai * http://autopackage.org/ * * This source code is public domain. You can relicense this code * under whatever license you want. * * See http://autopackage.org/docs/binreloc/ for * more information and how to use this. * * NOTE: if you're using C++ and are getting "undefined reference * to br_*", try renaming prefix.c to prefix.cpp */ #ifndef _PREFIX_H_ #define _PREFIX_H_ #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ /* WARNING, BEFORE YOU MODIFY PREFIX.C: * * If you make changes to any of the functions in prefix.c, you MUST * change the BR_NAMESPACE macro. * This way you can avoid symbol table conflicts with other libraries * that also happen to use BinReloc. * * Example: * #define BR_NAMESPACE(funcName) foobar_ ## funcName * --> expands br_locate to foobar_br_locate */ #undef BR_NAMESPACE #define BR_NAMESPACE(funcName) funcName #ifdef ENABLE_BINRELOC #define br_thread_local_store BR_NAMESPACE(br_thread_local_store) #define br_locate BR_NAMESPACE(br_locate) #define br_locate_prefix BR_NAMESPACE(br_locate_prefix) #define br_prepend_prefix BR_NAMESPACE(br_prepend_prefix) #ifndef BR_NO_MACROS /* These are convience macros that replace the ones usually used in Autoconf/Automake projects */ #undef SELFPATH #undef PREFIX #undef PREFIXDIR #undef BINDIR #undef SBINDIR #undef DATADIR #undef LIBDIR #undef LIBEXECDIR #undef ETCDIR #undef SYSCONFDIR #undef CONFDIR #undef LOCALEDIR #define SELFPATH (br_thread_local_store (br_locate ((void *) ""))) #define PREFIX (br_thread_local_store (br_locate_prefix ((void *) ""))) #define PREFIXDIR (br_thread_local_store (br_locate_prefix ((void *) ""))) #define BINDIR (br_thread_local_store (br_prepend_prefix ((void *) "", "/bin"))) #define SBINDIR (br_thread_local_store (br_prepend_prefix ((void *) "", "/sbin"))) #define DATADIR (br_thread_local_store (br_prepend_prefix ((void *) "", "/share"))) #define LIBDIR (br_thread_local_store (br_prepend_prefix ((void *) "", "/lib"))) #define LIBEXECDIR (br_thread_local_store (br_prepend_prefix ((void *) "", "/libexec"))) #define ETCDIR (br_thread_local_store (br_prepend_prefix ((void *) "", "/etc"))) #define SYSCONFDIR (br_thread_local_store (br_prepend_prefix ((void *) "", "/etc"))) #define CONFDIR (br_thread_local_store (br_prepend_prefix ((void *) "", "/etc"))) #define LOCALEDIR (br_thread_local_store (br_prepend_prefix ((void *) "", "/share/locale"))) #endif /* BR_NO_MACROS */ /* The following functions are used internally by BinReloc and shouldn't be used directly in applications. */ char *br_locate (void *symbol); char *br_locate_prefix (void *symbol); char *br_prepend_prefix (void *symbol, char *path); #endif /* ENABLE_BINRELOC */ const char *br_thread_local_store (char *str); /* These macros and functions are not guarded by the ENABLE_BINRELOC * macro because they are portable. You can use these functions. */ #define br_strcat BR_NAMESPACE(br_strcat) #define br_extract_dir BR_NAMESPACE(br_extract_dir) #define br_extract_prefix BR_NAMESPACE(br_extract_prefix) #define br_set_locate_fallback_func BR_NAMESPACE(br_set_locate_fallback_func) #ifndef BR_NO_MACROS #ifndef ENABLE_BINRELOC #define BR_SELFPATH(suffix) SELFPATH suffix #define BR_PREFIX(suffix) PREFIX suffix #define BR_PREFIXDIR(suffix) BR_PREFIX suffix #define BR_BINDIR(suffix) BINDIR suffix #define BR_SBINDIR(suffix) SBINDIR suffix #define BR_DATADIR(suffix) DATADIR suffix #define BR_LIBDIR(suffix) LIBDIR suffix #define BR_LIBEXECDIR(suffix) LIBEXECDIR suffix #define BR_ETCDIR(suffix) ETCDIR suffix #define BR_SYSCONFDIR(suffix) SYSCONFDIR suffix #define BR_CONFDIR(suffix) CONFDIR suffix #define BR_LOCALEDIR(suffix) LOCALEDIR suffix #else #define BR_SELFPATH(suffix) (br_thread_local_store (br_strcat (SELFPATH, suffix))) #define BR_PREFIX(suffix) (br_thread_local_store (br_strcat (PREFIX, suffix))) #define BR_PREFIXDIR(suffix) (br_thread_local_store (br_strcat (BR_PREFIX, suffix))) #define BR_BINDIR(suffix) (br_thread_local_store (br_strcat (BINDIR, suffix))) #define BR_SBINDIR(suffix) (br_thread_local_store (br_strcat (SBINDIR, suffix))) #define BR_DATADIR(suffix) (br_thread_local_store (br_strcat (DATADIR, suffix))) #define BR_LIBDIR(suffix) (br_thread_local_store (br_strcat (LIBDIR, suffix))) #define BR_LIBEXECDIR(suffix) (br_thread_local_store (br_strcat (LIBEXECDIR, suffix))) #define BR_ETCDIR(suffix) (br_thread_local_store (br_strcat (ETCDIR, suffix))) #define BR_SYSCONFDIR(suffix) (br_thread_local_store (br_strcat (SYSCONFDIR, suffix))) #define BR_CONFDIR(suffix) (br_thread_local_store (br_strcat (CONFDIR, suffix))) #define BR_LOCALEDIR(suffix) (br_thread_local_store (br_strcat (LOCALEDIR, suffix))) #endif #endif char *br_strcat (const char *str1, const char *str2); char *br_extract_dir (const char *path); char *br_extract_prefix(const char *path); typedef char *(*br_locate_fallback_func) (void *symbol, void *data); void br_set_locate_fallback_func (br_locate_fallback_func func, void *data); #ifdef __cplusplus } #endif /* __cplusplus */ #endif /* _PREFIX_H_ */ link-grammar-4.7.4/link-grammar/idiom.c0000644000175000017500000002135611172431532016745 0ustar bloombloom/*************************************************************************/ /* Copyright (c) 2004 */ /* Daniel Sleator, David Temperley, and John Lafferty */ /* All rights reserved */ /* */ /* Use of the link grammar parsing system is subject to the terms of the */ /* license set forth in the LICENSE file included with this software, */ /* and also available at http://www.link.cs.cmu.edu/link/license.html */ /* This license allows free redistribution and use in source and binary */ /* forms, with or without modification, subject to certain conditions. */ /* */ /*************************************************************************/ #include #include "error.h" /** * Returns TRUE if the string contains an underbar character. */ int contains_underbar(const char * s) { while(*s != '\0') { if (*s == '_') return TRUE; s++; } return FALSE; } /** * Returns FALSE if it is not a correctly formed idiom string. * Such a string is correct if it: * () contains no "." * () non-empty strings separated by _ */ static int is_idiom_string(const char * s) { size_t len; const char * t; for (t = s; *t != '\0'; t++) { if (*t == '.') return FALSE; } len = strlen(s); if ((s[0] == '_') || (s[len-1] == '_')) { return FALSE; } for (t = s; *t != '\0'; t++) { if ((*t == '_') && (*(t+1) == '_')) return FALSE; } return TRUE; } /** * return TRUE if the string s is a sequence of digits. */ static int is_number(const char *s) { int nb; while(*s != '\0') { nb = is_utf8_digit(s); if (!nb) return FALSE; s += nb; } return TRUE; } /** * If the string contains a single ".", and ends in ".Ix" where * x is a number, return x. Return -1 if not of this form. */ static int numberfy(const char * s) { for (; (*s != '\0') && (*s != '.'); s++) ; if (*s++ != '.') return -1; if (*s++ != 'I') return -1; if (!is_number(s)) return -1; return atoi(s); } /** * Look for words that end in ".Ix" where x is a number. * Return the largest x found. */ static int max_postfix_found(Dict_node * d) { int i, j; i = 0; while(d != NULL) { j = numberfy(d->string); if (j > i) i = j; d = d->right; } return i; } /** * build_idiom_word_name() -- return idiomized name of given string. * * Allocates string space and returns a pointer to it. * In this string is placed the idiomized name of the given string s. * This is the same as s, but with a postfix of ".Ix", where x is an * appropriate number. x is the minimum number that distinguishes * this word from others in the dictionary. */ static const char * build_idiom_word_name(Dictionary dict, const char * s) { char buff[2*MAX_WORD]; char *x; int count; Dict_node *dn = dictionary_lookup_list(dict, s); count = max_postfix_found(dn)+1; free_lookup_list(dn); x = buff; while((*s != '\0') && (*s != '.')) { *x = *s; x++; s++; } sprintf(x, ".I%d",count); return string_set_add(buff, dict->string_set); } /** * Tear the idiom string apart. * Put the parts into a list of Dict_nodes (connected by their right pointers) * Sets the string fields of these Dict_nodes pointing to the * fragments of the string s. Later these will be replaced by * correct names (with .Ix suffixes). * The list is reversed from the way they occur in the string. * A pointer to this list is returned. */ static Dict_node * make_idiom_Dict_nodes(Dictionary dict, const char * string) { Dict_node * dn, * dn_new; char * t, *s, *p; int more, sz; dn = NULL; sz = strlen(string)+1; p = s = (char *) xalloc(sz); strcpy(s, string); while (*s != '\0') { t = s; while((*s != '\0') && (*s != '_')) s++; if (*s == '_') { more = TRUE; *s = '\0'; } else { more = FALSE; } dn_new = (Dict_node *) xalloc(sizeof (Dict_node)); dn_new->right = dn; dn = dn_new; dn->string = string_set_add(t, dict->string_set); dn->file = NULL; if (more) s++; } xfree(p, sz); return dn; } static char current_name[] = "AAAAAAAA"; #define CN_size (sizeof(current_name)-1) static void increment_current_name(void) { int i, carry; i = CN_size-1; carry = 1; while (carry == 1) { current_name[i]++; if (current_name[i] == 'Z'+1) { current_name[i] = 'A'; carry = 1; } else { carry = 0; } i--; } } /** * Generate a new connector name obtained from the current_name. * allocate string space for it. * @return a pointer to connector name. */ static const char * generate_id_connector(Dictionary dict) { char buff[2*MAX_WORD]; unsigned int i; char * t; for (i=0; current_name[i] == 'A'; i++) ; /* i is now the number of characters of current_name to skip */ t = buff; /* All idiom connector names start with the two letters "ID" */ *t++ = 'I'; *t++ = 'D'; for (; i < CN_size; i++ ) { *t++ = current_name[i] ; } *t++ = '\0'; return string_set_add(buff, dict->string_set); } /** * Takes as input a pointer to a Dict_node. * The string of this Dict_node is an idiom string. * This string is torn apart, and its components are inserted into the * dictionary as special idiom words (ending in .I*, where * is a number). * The expression of this Dict_node (its node field) has already been * read and constructed. This will be used to construct the special idiom * expressions. * The given dict node is freed. The string is also freed. */ void insert_idiom(Dictionary dict, Dict_node * dn) { Exp * nc, * no, * n1; E_list *ell, *elr; const char * s; int s_length; Dict_node * dn_list, * xdn, * start_dn_list; no = dn->exp; s = dn->string; s_length = strlen(s); if (!is_idiom_string(s)) { prt_error("Warning: Word \"%s\" on line %d " "is not a correctly formed idiom string.\n" "\tThis word will be ignored\n", s, dict->line_number); xfree((char *)dn, sizeof (Dict_node)); return; } dn_list = start_dn_list = make_idiom_Dict_nodes(dict, s); xfree((char *)dn, sizeof (Dict_node)); if (dn_list->right == NULL) { prt_error("Fatal Error: Idiom string with only one connector -- should have been caught"); exit(1); } /* first make the nodes for the base word of the idiom (last word) */ /* note that the last word of the idiom is first in our list */ /* ----- this code just sets up the node fields of the dn_list ----*/ nc = Exp_create(dict); nc->u.string = generate_id_connector(dict); nc->dir = '-'; nc->multi = FALSE; nc->type = CONNECTOR_type; nc->cost = 0; n1 = Exp_create(dict); n1->u.l = ell = (E_list *) xalloc(sizeof(E_list)); ell->next = elr = (E_list *) xalloc(sizeof(E_list)); elr->next = NULL; ell->e = nc; elr->e = no; n1->type = AND_type; n1->cost = 0; dn_list->exp = n1; dn_list = dn_list->right; while(dn_list->right != NULL) { /* generate the expression for a middle idiom word */ n1 = Exp_create(dict); n1->u.string = NULL; n1->type = AND_type; n1->cost = 0; n1->u.l = ell = (E_list *) xalloc(sizeof(E_list)); ell->next = elr = (E_list *) xalloc(sizeof(E_list)); elr->next = NULL; nc = Exp_create(dict); nc->u.string = generate_id_connector(dict); nc->dir = '+'; nc->multi = FALSE; nc->type = CONNECTOR_type; nc->cost = 0; elr->e = nc; increment_current_name(); nc = Exp_create(dict); nc->u.string = generate_id_connector(dict); nc->dir = '-'; nc->multi = FALSE; nc->type = CONNECTOR_type; nc->cost = 0; ell->e = nc; dn_list->exp = n1; dn_list = dn_list->right; } /* now generate the last one */ nc = Exp_create(dict); nc->u.string = generate_id_connector(dict); nc->dir = '+'; nc->multi = FALSE; nc->type = CONNECTOR_type; nc->cost = 0; dn_list->exp = nc; increment_current_name(); /* ---- end of the code alluded to above ---- */ /* now its time to insert them into the dictionary */ dn_list = start_dn_list; while (dn_list != NULL) { xdn = dn_list->right; dn_list->left = dn_list->right = NULL; dn_list->string = build_idiom_word_name(dict, dn_list->string); dict->root = insert_dict(dict, dict->root, dn_list); dict->num_entries++; dn_list = xdn; } /* xfree((char *)s, s_length+1); strings are handled by string_set */ } /** * returns TRUE if this is a word ending in ".Ix", where x is a number. */ int is_idiom_word(const char * s) { return (numberfy(s) != -1) ; } #ifdef THIS_IS_NOT_USED /* returns TRUE if the list of words contains only words that are idiom words. This is useful, because under this condition you want to be able to insert the word anyway, as long as it doesn't match exactly. */ int only_idiom_words(Dict_node * dn) { while(dn != NULL) { if (!is_idiom_word(dn->string)) return FALSE; dn = dn->right; } return TRUE; } #endif link-grammar-4.7.4/link-grammar/read-dict.h0000644000175000017500000000317011117053046017476 0ustar bloombloom/*************************************************************************/ /* Copyright (c) 2004 */ /* Daniel Sleator, David Temperley, and John Lafferty */ /* All rights reserved */ /* */ /* Use of the link grammar parsing system is subject to the terms of the */ /* license set forth in the LICENSE file included with this software, */ /* and also available at http://www.link.cs.cmu.edu/link/license.html */ /* This license allows free redistribution and use in source and binary */ /* forms, with or without modification, subject to certain conditions. */ /* */ /*************************************************************************/ int read_dictionary(Dictionary dict); void dict_display_word_info(Dictionary dict, const char * s); void dict_display_word_expr(Dictionary dict, const char * s); void print_dictionary_data(Dictionary dict); void print_dictionary_words(Dictionary dict); void print_expression(Exp *); int boolean_dictionary_lookup(Dictionary dict, const char *); int delete_dictionary_words(Dictionary dict, const char *); Dict_node * dictionary_lookup_list(Dictionary dict, const char *); Dict_node * abridged_lookup_list(Dictionary dict, const char *); void free_lookup_list(Dict_node *); Dict_node * insert_dict(Dictionary dict, Dict_node * n, Dict_node * newnode); void free_dictionary(Dictionary dict); Exp * Exp_create(Dictionary dict); link-grammar-4.7.4/link-grammar/build-disjuncts.c0000644000175000017500000002520211526022265020743 0ustar bloombloom/*************************************************************************/ /* Copyright (c) 2004 */ /* Daniel Sleator, David Temperley, and John Lafferty */ /* All rights reserved */ /* */ /* Use of the link grammar parsing system is subject to the terms of the */ /* license set forth in the LICENSE file included with this software, */ /* and also available at http://www.link.cs.cmu.edu/link/license.html */ /* This license allows free redistribution and use in source and binary */ /* forms, with or without modification, subject to certain conditions. */ /* */ /*************************************************************************/ /* stuff for transforming a dictionary entry into a disjunct list */ #include #include #include "disjunct-utils.h" #include "utilities.h" /* For Win32 compatibility features */ /* Temporary connectors used while converting expressions into disjunct lists */ typedef struct Tconnector_struct Tconnector; struct Tconnector_struct { char multi; /* TRUE if this is a multi-connector */ char dir; /* '-' for left and '+' for right */ Tconnector * next; const char * string; }; typedef struct clause_struct Clause; struct clause_struct { Clause * next; float cost; float maxcost; Tconnector * c; }; static void free_Tconnectors(Tconnector *e) { Tconnector * n; for(;e != NULL; e=n) { n = e->next; xfree((char *)e, sizeof(Tconnector)); } } static void free_clause_list(Clause *c) { Clause *c1; while (c != NULL) { c1 = c->next; free_Tconnectors(c->c); xfree((char *)c, sizeof(Clause)); c = c1; } } #ifdef UNUSED_FUNCTION /** * This builds a new copy of the connector list pointed to by c. * Strings, as usual, are not copied. */ static Tconnector * copy_Tconnectors(Tconnector * c) { Tconnector *c1; if (c == NULL) return NULL; c1 = (Tconnector *) xalloc(sizeof(Tconnector)); *c1 = *c; c1->next = copy_Tconnectors(c->next); return c1; } /** * This builds a new copy of the clause pointed to by d (except for the * next field which is set to NULL). Strings, as usual, are not copied. */ static Clause * copy_clause(Clause * d) { Clause * d1; if (d == NULL) return NULL; d1 = (Clause *) xalloc(sizeof(Clause)); *d1 = *d; d1->next = NULL; d1->c = copy_Tconnectors(d->c); return d1; } #endif /* UNUSED_FUNCTION */ /** * reverse the order of the list e. destructive */ static Tconnector * Treverse(Tconnector *e) { Tconnector * head, *x; head = NULL; while (e != NULL) { x = e->next; e->next = head; head = e; e = x; } return head; } /** * reverse the order of the list e. destructive */ static Connector * reverse(Connector *e) { Connector * head, *x; head = NULL; while (e != NULL) { x = e->next; e->next = head; head = e; e = x; } return head; } /** * Builds a new list of connectors that is the catenation of e1 with e2. * does not effect lists e1 or e2. Order is maintained. */ static Tconnector * catenate(Tconnector * e1, Tconnector * e2) { Tconnector * e, * head; head = NULL; for (;e1 != NULL; e1 = e1->next) { e = (Tconnector *) xalloc(sizeof(Tconnector)); *e = *e1; e->next = head; head = e; } for (;e2 != NULL; e2 = e2->next) { e = (Tconnector *) xalloc(sizeof(Tconnector)); *e = *e2; e->next = head; head = e; } return Treverse(head); } /** * build the connector for the terminal node n */ static Tconnector * build_terminal(Exp * e) { Tconnector * c; c = (Tconnector *) xalloc(sizeof(Tconnector)); c->string = e->u.string; c->multi = e->multi; c->dir = e->dir; c->next = NULL; return c; } #ifdef UNUSED_FUNCTION static xxxfloat-int maxcost_of_expression(Exp *e) { E_list * e_list; int m, m1; m = 0; if ((e->type == AND_type) || (e->type == OR_type)) { for (e_list = e->u.l; e_list != NULL; e_list = e_list->next) { m1 = maxcost_of_expression(e_list->e); m = MAX(m, m1); } } return (m + e->cost); } /** * This returns the maximum maxcost of any disjunct in the sentence * Assumes the sentence expressions have been constructed */ static xxx-float-int maxcost_of_sentence(Sentence sent) { X_node * x; int w, m, m1; m = 0; for (w = 0; w < sent->length; w++) { for (x = sent->word[w].x; x != NULL; x = x->next) { m1 = maxcost_of_expression(x->exp), m = MAX(m, m1); } } return m; } #endif /* UNUSED_FUNCTION */ /** * Build the clause for the expression e. Does not change e */ static Clause * build_clause(Exp *e) { Clause *c = NULL, *c1, *c2, *c3, *c4, *c_head; E_list * e_list; assert(e != NULL, "build_clause called with null parameter"); if (e->type == AND_type) { c1 = (Clause *) xalloc(sizeof (Clause)); c1->c = NULL; c1->next = NULL; c1->cost = 0.0f; c1->maxcost = 0.0f ; for (e_list = e->u.l; e_list != NULL; e_list = e_list->next) { c2 = build_clause(e_list->e); c_head = NULL; for (c3 = c1; c3 != NULL; c3 = c3->next) { for (c4 = c2; c4 != NULL; c4 = c4->next) { c = (Clause *) xalloc(sizeof (Clause)); c->cost = c3->cost + c4->cost; c->maxcost = fmaxf(c3->maxcost,c4->maxcost); c->c = catenate(c3->c, c4->c); c->next = c_head; c_head = c; } } free_clause_list(c1); free_clause_list(c2); c1 = c_head; } c = c1; } else if (e->type == OR_type) { /* we'll catenate the lists of clauses */ c = NULL; for (e_list = e->u.l; e_list != NULL; e_list = e_list->next) { c1 = build_clause(e_list->e); while(c1 != NULL) { c3 = c1->next; c1->next = c; c = c1; c1 = c3; } } } else if (e->type == CONNECTOR_type) { c = (Clause *) xalloc(sizeof(Clause)); c->c = build_terminal(e); c->cost = 0.0f; c->maxcost = 0.0f; c->next = NULL; } else { assert(FALSE, "an expression node with no type"); } /* c now points to the list of clauses */ for (c1 = c; c1 != NULL; c1 = c1->next) { c1->cost += e->cost; /* c1->maxcost = MAX(c1->maxcost,e->cost); */ /* Above is how Dennis had it. Someone changed it to below. * However, this can sometimes lead to a maxcost that is less * than the cost ! -- which seems wrong to me ... seems Dennis * had it right!? */ c1->maxcost += e->cost; } return c; } /* #define DEBUG */ #ifdef DEBUG /* Misc printing functions, useful for debugging */ static void print_Tconnector_list(Tconnector * e) { for (;e != NULL; e=e->next) { if (e->multi) printf("@"); printf("%s",e->string); printf("%c", e->dir); if (e->next != NULL) printf(" "); } } static void print_clause_list(Clause * c) { for (;c != NULL; c=c->next) { printf(" Clause: "); printf("(%4.2f, %4.2f) ", c->cost, c->maxcost); print_Tconnector_list(c->c); printf("\n"); } } static void print_connector_list(Connector * e) { for (;e != NULL; e=e->next) { printf("%s",e->string); if (e->label != NORMAL_LABEL) { printf("%3d", e->label); } else { printf(" "); } if (e->next != NULL) printf(" "); } } static void print_disjunct_list(Disjunct * c) { for (;c != NULL; c=c->next) { printf("%10s: ", c->string); printf("(%f) ", c->cost); print_connector_list(c->left); printf(" <--> "); print_connector_list(c->right); printf("\n"); } } #endif /* DEBUG */ /** * Build a new list of connectors starting from the Tconnectors * in the list pointed to by e. Keep only those whose strings whose * direction has the value c. */ static Connector * extract_connectors(Tconnector *e, int c) { Connector *e1; if (e == NULL) return NULL; if (e->dir == c) { e1 = connector_new(); e1->next = extract_connectors(e->next,c); e1->multi = e->multi; e1->string = e->string; e1->word = 0; return e1; } else { return extract_connectors(e->next,c); } } /** * Build a disjunct list out of the clause list c. * string is the print name of word that generated this disjunct. */ static Disjunct * build_disjunct(Clause * cl, const char * string, float cost_cutoff) { Disjunct *dis, *ndis; dis = NULL; for (; cl != NULL; cl = cl->next) { if (cl->maxcost <= cost_cutoff) { ndis = (Disjunct *) xalloc(sizeof(Disjunct)); ndis->left = reverse(extract_connectors(cl->c, '-')); ndis->right = reverse(extract_connectors(cl->c, '+')); ndis->string = string; ndis->cost = cl->cost; ndis->next = dis; dis = ndis; } } return dis; } Disjunct * build_disjuncts_for_X_node(X_node * x, float cost_cutoff) { Clause *c ; Disjunct * dis; /* print_expression(x->exp); printf("\n"); */ c = build_clause(x->exp); /* print_clause_list(c); */ dis = build_disjunct(c, x->string, cost_cutoff); /* print_disjunct_list(dis); */ free_clause_list(c); return dis; } #if DEBUG /* There is a much better print_expression elsewhere * This one is for low-level debug. */ void prt_exp(Exp *e, int i) { if (e == NULL) return; for(int j =0; jtype, e->dir, e->multi, e->cost); if (e->type != CONNECTOR_type) { E_list *l = e->u.l; while(l) { prt_exp(l->e, i+2); l = l->next; } } else { for(int j =0; ju.string); } } #endif /** * Build a list of disjuncts. * * This is mostly used only for counting the number of disjuncts * (but is otherwise "almost" obsolete ??) */ Disjunct * build_disjuncts_for_dict_node(Dict_node *dn) { Disjunct *dj; X_node x; x.exp = dn->exp; x.string = dn->string; dj = build_disjuncts_for_X_node(&x, MAX_CONNECTOR_COST); /* print_disjunct_list(dj); */ return dj; } /** * build_word_expressions() -- build list of expressions for a word * * Looks up the word s in the dictionary. Returns NULL if it's not there. * If there, it builds the list of expressions for the word, and returns * a pointer to it. */ X_node * build_word_expressions(Dictionary dict, const char * s) { Dict_node * dn, *dn_head; X_node * x, * y; dn_head = dictionary_lookup_list(dict, s); dn = dn_head; x = NULL; while (dn != NULL) { y = (X_node *) xalloc(sizeof(X_node)); y->next = x; x = y; x->exp = copy_Exp(dn->exp); x->string = dn->string; dn = dn->right; } free_lookup_list (dn_head); return x; } /** * Turn sentence expressions into disjuncts. * Sentence expressions must have been built, before calling this routine. */ void build_sentence_disjuncts(Sentence sent, float cost_cutoff) { Disjunct * d; X_node * x; int w; for (w = 0; w < sent->length; w++) { d = NULL; for (x = sent->word[w].x; x != NULL; x = x->next) { Disjunct *dx = build_disjuncts_for_X_node(x, cost_cutoff); d = catenate_disjuncts(dx, d); } sent->word[w].d = d; } } link-grammar-4.7.4/link-grammar/utilities.c0000644000175000017500000004630011526022265017655 0ustar bloombloom/*************************************************************************/ /* Copyright (c) 2004 */ /* Daniel Sleator, David Temperley, and John Lafferty */ /* Copyright 2008, 2009 Linas Vepstas */ /* All rights reserved */ /* */ /* Use of the link grammar parsing system is subject to the terms of the */ /* license set forth in the LICENSE file included with this software, */ /* and also available at http://www.link.cs.cmu.edu/link/license.html */ /* This license allows free redistribution and use in source and binary */ /* forms, with or without modification, subject to certain conditions. */ /* */ /*************************************************************************/ #include #include #include #include #include #include #ifdef USE_PTHREADS #include #endif #ifdef ENABLE_BINRELOC #include "prefix.h" #endif /* BINRELOC */ #ifdef _WIN32 # include # define DIR_SEPARATOR '\\' # define PATH_SEPARATOR ';' #else # define DIR_SEPARATOR '/' # define PATH_SEPARATOR ':' #endif #define IS_DIR_SEPARATOR(ch) (DIR_SEPARATOR == (ch)) #ifdef _MSC_VER #define DICTIONARY_DIR "." #endif #define DEFAULTPATH DICTIONARY_DIR /* This file contains certain general utilities. */ int verbosity; /* ============================================================= */ /* String utilities */ char *safe_strdup(const char *u) { if(u) return strdup(u); return NULL; } /** * Copies as much of v into u as it can assuming u is of size usize * guaranteed to terminate u with a '\0'. */ void safe_strcpy(char *u, const char * v, size_t usize) { strncpy(u, v, usize-1); u[usize-1] = '\0'; } /** * A version of strlcpy, for those systems that don't have it. */ size_t lg_strlcpy(char * dest, const char *src, size_t size) { size_t i=0; while ((imax_space_used = 0; s->space_in_use = 0; s->max_external_space_used = 0; s->external_space_in_use = 0; return s; } void init_memusage(void) { #ifdef USE_PTHREADS pthread_once(&space_key_once, space_key_alloc); #else static int mem_inited = FALSE; if (mem_inited) return; mem_inited = TRUE; #endif do_init_memusage(); } static inline space_t *getspace(void) { #ifdef USE_PTHREADS space_t *s = pthread_getspecific(space_key); if (s) return s; return do_init_memusage(); #else return &space; #endif } /** * space used but not yet freed during parse */ size_t get_space_in_use(void) { return getspace()->space_in_use; } /** * maximum space used during the parse */ size_t get_max_space_used(void) { return getspace()->max_space_used; } #else /* TRACK_SPACE_USAGE */ void init_memusage(void) {} size_t get_space_in_use(void) { return 0; } size_t get_max_space_used(void) { return 0; } #endif /* TRACK_SPACE_USAGE */ /** * alloc some memory, and keep track of the space allocated. */ void * xalloc(size_t size) { void * p = malloc(size); #ifdef TRACK_SPACE_USAGE space_t *s = getspace(); s->space_in_use += size; if (s->max_space_used < s->space_in_use) s->max_space_used = s->space_in_use; #endif /* TRACK_SPACE_USAGE */ if ((p == NULL) && (size != 0)) { prt_error("Fatal Error: Ran out of space.\n"); abort(); exit(1); } return p; } void * xrealloc(void *p, size_t oldsize, size_t newsize) { #ifdef TRACK_SPACE_USAGE space_t *s = getspace(); s->space_in_use -= oldsize; #endif /* TRACK_SPACE_USAGE */ p = realloc(p, newsize); if ((p == NULL) && (newsize != 0)) { prt_error("Fatal Error: Ran out of space on realloc.\n"); abort(); exit(1); } #ifdef TRACK_SPACE_USAGE s->space_in_use += newsize; if (s->max_space_used < s->space_in_use) s->max_space_used = s->space_in_use; #endif /* TRACK_SPACE_USAGE */ return p; } #ifdef TRACK_SPACE_USAGE void xfree(void * p, size_t size) { getspace()->space_in_use -= size; free(p); } #endif /* TRACK_SPACE_USAGE */ void * exalloc(size_t size) { void * p = malloc(size); #ifdef TRACK_SPACE_USAGE space_t *s = getspace(); s->external_space_in_use += size; if (s->max_external_space_used < s->external_space_in_use) s->max_external_space_used = s->external_space_in_use; #endif /* TRACK_SPACE_USAGE */ if ((p == NULL) && (size != 0)) { prt_error("Fatal Error: Ran out of space.\n"); abort(); exit(1); } return p; } #ifdef TRACK_SPACE_USAGE void exfree(void * p, size_t size) { getspace()->external_space_in_use -= size; free(p); } #endif /* TRACK_SPACE_USAGE */ /* =========================================================== */ /* File path and dictionary open routines below */ char * join_path(const char * prefix, const char * suffix) { char * path; int path_len; path_len = strlen(prefix) + 1 /* len(DIR_SEPARATOR) */ + strlen(suffix); path = (char *) malloc(path_len + 1); strcpy(path, prefix); path[strlen(path)+1] = '\0'; path[strlen(path)] = DIR_SEPARATOR; strcat(path, suffix); return path; } #ifdef _WIN32 /* borrowed from glib */ /* Used only for Windows builds */ static char* path_get_dirname (const char *file_name) { register char *base; register int len; base = strrchr (file_name, DIR_SEPARATOR); #ifdef _WIN32 { char *q = strrchr (file_name, '/'); if (base == NULL || (q != NULL && q > base)) base = q; } #endif if (!base) { #ifdef _WIN32 if (is_utf8_alpha (file_name) && file_name[1] == ':') { char drive_colon_dot[4]; drive_colon_dot[0] = file_name[0]; drive_colon_dot[1] = ':'; drive_colon_dot[2] = '.'; drive_colon_dot[3] = '\0'; return safe_strdup (drive_colon_dot); } #endif return safe_strdup ("."); } while (base > file_name && IS_DIR_SEPARATOR (*base)) base--; #ifdef _WIN32 /* base points to the char before the last slash. * * In case file_name is the root of a drive (X:\) or a child of the * root of a drive (X:\foo), include the slash. * * In case file_name is the root share of an UNC path * (\\server\share), add a slash, returning \\server\share\ . * * In case file_name is a direct child of a share in an UNC path * (\\server\share\foo), include the slash after the share name, * returning \\server\share\ . */ if (base == file_name + 1 && is_utf8_alpha (file_name) && file_name[1] == ':') base++; else if (IS_DIR_SEPARATOR (file_name[0]) && IS_DIR_SEPARATOR (file_name[1]) && file_name[2] && !IS_DIR_SEPARATOR (file_name[2]) && base >= file_name + 2) { const char *p = file_name + 2; while (*p && !IS_DIR_SEPARATOR (*p)) p++; if (p == base + 1) { len = (int) strlen (file_name) + 1; base = (char *)malloc(len + 1); strcpy (base, file_name); base[len-1] = DIR_SEPARATOR; base[len] = 0; return base; } if (IS_DIR_SEPARATOR (*p)) { p++; while (*p && !IS_DIR_SEPARATOR (*p)) p++; if (p == base + 1) base++; } } #endif len = (int) 1 + base - file_name; base = (char *)malloc(len + 1); memmove (base, file_name, len); base[len] = 0; return base; } #endif /* _WIN32 */ /* global - but thats OK, since this is set only during initialization, * and is is thenceforth a read-only item. So it doesn't need to be * locked. */ static char * custom_data_dir = NULL; void dictionary_set_data_dir(const char * path) { if (custom_data_dir) free (custom_data_dir); custom_data_dir = safe_strdup(path); } char * dictionary_get_data_dir(void) { #ifdef _WIN32 HINSTANCE hInstance; #endif char * data_dir = NULL; if (custom_data_dir != NULL) { data_dir = safe_strdup(custom_data_dir); return data_dir; } #ifdef ENABLE_BINRELOC data_dir = safe_strdup (BR_DATADIR("/link-grammar")); #elif defined(_WIN32) /* Dynamically locate library and return containing directory */ hInstance = GetModuleHandle("link-grammar.dll"); if(hInstance != NULL) { char dll_path[MAX_PATH]; if(GetModuleFileName(hInstance,dll_path,MAX_PATH)) { #ifdef _DEBUG prt_error("Info: GetModuleFileName=%s\n", (dll_path?dll_path:"NULL")); #endif data_dir = path_get_dirname(dll_path); } } #endif return data_dir; } /** * object_open() -- dictopen() - open a dictionary * * This function is used to open a dictionary file or a word file, * or any associated data file (like a post process knowledge file). * * It works as follows. If the file name begins with a "/", then * it's assumed to be an absolute file name and it tries to open * that exact file. * * If the filename does not begin with a "/", then it uses the * dictpath mechanism to find the right file to open. This looks * for the file in a sequence of directories until it finds it. The * sequence of directories is specified in a dictpath string, in * which each directory is followed by a ":". */ void * object_open(const char *filename, void * (*opencb)(const char *, void *), void * user_data) { char completename[MAX_PATH_NAME+1]; char fulldictpath[MAX_PATH_NAME+1]; static char prevpath[MAX_PATH_NAME+1] = ""; static int first_time_ever = 1; char *pos, *oldpos; int filenamelen, len; void *fp; /* Record the first path ever used, so that we can recycle it */ if (first_time_ever) { strncpy (prevpath, filename, MAX_PATH_NAME); prevpath[MAX_PATH_NAME] = 0; pos = strrchr(prevpath, DIR_SEPARATOR); if (pos) *pos = 0; pos = strrchr(prevpath, DIR_SEPARATOR); if (pos) *(pos+1) = 0; first_time_ever = 0; } /* Look for absolute filename. * Unix: starts with leading slash. * Windows: starts with C:\ except that the drive letter may differ. */ if ((filename[0] == '/') || ((filename[1] == ':') && (filename[2] == '\\'))) { /* fopen returns NULL if the file does not exist. */ fp = opencb(filename, user_data); if (fp) return fp; } { char * data_dir = dictionary_get_data_dir(); #ifdef _DEBUG prt_error("Info: data_dir=%s\n", (data_dir?data_dir:"NULL")); #endif if (data_dir) { snprintf(fulldictpath, MAX_PATH_NAME, "%s%c%s%c", data_dir, PATH_SEPARATOR, DEFAULTPATH, PATH_SEPARATOR); free(data_dir); } else { /* Always make sure that it ends with a path * separator char for the below while() loop. * For unix, this should look like: * /usr/share/link-grammar:.:data:..:../data: * For windows: * C:\SOMWHERE;.;data;..;..\data; */ snprintf(fulldictpath, MAX_PATH_NAME, "%s%c%s%c%s%c%s%c%s%c%s%c%s%c", prevpath, PATH_SEPARATOR, DEFAULTPATH, PATH_SEPARATOR, ".", PATH_SEPARATOR, "data", PATH_SEPARATOR, "..", PATH_SEPARATOR, "..", DIR_SEPARATOR, "data", PATH_SEPARATOR); } } /* Now fulldictpath is our dictpath, where each entry is * followed by a ":" including the last one */ filenamelen = strlen(filename); len = strlen(fulldictpath)+ filenamelen + 1 + 1; oldpos = fulldictpath; while ((pos = strchr(oldpos, PATH_SEPARATOR)) != NULL) { strncpy(completename, oldpos, (pos-oldpos)); *(completename+(pos-oldpos)) = DIR_SEPARATOR; strcpy(completename+(pos-oldpos)+1,filename); #ifdef _DEBUG prt_error("Info: object_open() trying %s\n", completename); #endif if ((fp = opencb(completename, user_data)) != NULL) { return fp; } oldpos = pos+1; } return NULL; } /* XXX static global variable used during dictionary open */ static char *path_found = NULL; static void * dict_file_open(const char * fullname, void * user_data) { const char * how = (const char *) user_data; FILE * fh = fopen(fullname, how); if (fh && NULL == path_found) { path_found = strdup (fullname); prt_error("Info: Dictionary found at %s\n", fullname); } return (void *) fh; } FILE *dictopen(const char *filename, const char *how) { FILE * fh = NULL; void * ud = (void *) how; /* If not the first time through, look for the other dictionaries * in the *same* directory in which the first one was found. * (The first one is typcailly "en/4.0.dict") * The global "path_found" records where the first dict was found. * The goal here is to avoid fractured install insanity. */ if (path_found) { size_t sz = strlen (path_found) + strlen(filename) + 1; char * fullname = (char *) malloc (sz); strcpy(fullname, path_found); strcat(fullname, filename); fh = (FILE *) object_open(fullname, dict_file_open, ud); free(fullname); } else { fh = (FILE *) object_open(filename, dict_file_open, ud); if (path_found) { char * root = strstr(path_found, filename); *root = 0; } } return fh; } /* ======================================================== */ /* Locale routines */ #ifdef _WIN32 static char * win32_getlocale (void) { LCID lcid; LANGID langid; char *ev; int primary, sub; char bfr[64]; char iso639[10]; char iso3166[10]; const char *script = NULL; /* Let the user override the system settings through environment * variables, as on POSIX systems. Note that in GTK+ applications * since GTK+ 2.10.7 setting either LC_ALL or LANG also sets the * Win32 locale and C library locale through code in gtkmain.c. */ if (((ev = getenv ("LC_ALL")) != NULL && ev[0] != '\0') || ((ev = getenv ("LC_MESSAGES")) != NULL && ev[0] != '\0') || ((ev = getenv ("LANG")) != NULL && ev[0] != '\0')) return safe_strdup (ev); lcid = GetThreadLocale (); if (!GetLocaleInfo (lcid, LOCALE_SISO639LANGNAME, iso639, sizeof (iso639)) || !GetLocaleInfo (lcid, LOCALE_SISO3166CTRYNAME, iso3166, sizeof (iso3166))) return safe_strdup ("C"); /* Strip off the sorting rules, keep only the language part. */ langid = LANGIDFROMLCID (lcid); /* Split into language and territory part. */ primary = PRIMARYLANGID (langid); sub = SUBLANGID (langid); /* Handle special cases */ switch (primary) { case LANG_AZERI: switch (sub) { case SUBLANG_AZERI_LATIN: script = "@Latn"; break; case SUBLANG_AZERI_CYRILLIC: script = "@Cyrl"; break; } break; case LANG_SERBIAN: /* LANG_CROATIAN == LANG_SERBIAN */ switch (sub) { case SUBLANG_SERBIAN_LATIN: case 0x06: /* Serbian (Latin) - Bosnia and Herzegovina */ script = "@Latn"; break; } break; case LANG_UZBEK: switch (sub) { case SUBLANG_UZBEK_LATIN: script = "@Latn"; break; case SUBLANG_UZBEK_CYRILLIC: script = "@Cyrl"; break; } break; } strcat (bfr, iso639); strcat (bfr, "_"); strcat (bfr, iso3166); if (script) strcat (bfr, script); return safe_strdup (bfr); } #endif char * get_default_locale(void) { char * locale, * needle; locale = NULL; #ifdef _WIN32 if(!locale) locale = win32_getlocale (); #endif if(!locale) locale = safe_strdup (getenv ("LANG")); #if defined(HAVE_LC_MESSAGES) if(!locale) locale = safe_strdup (setlocale (LC_MESSAGES, NULL)); #endif if(!locale) locale = safe_strdup (setlocale (LC_ALL, NULL)); if(!locale || strcmp(locale, "C") == 0) { free(locale); locale = safe_strdup("en"); } /* strip off "@euro" from en_GB@euro */ if ((needle = strchr (locale, '@')) != NULL) *needle = '\0'; /* strip off ".UTF-8" from en_GB.UTF-8 */ if ((needle = strchr (locale, '.')) != NULL) *needle = '\0'; /* strip off "_GB" from en_GB */ if ((needle = strchr (locale, '_')) != NULL) *needle = '\0'; return locale; } /* ========================== END OF FILE =================== */ link-grammar-4.7.4/link-grammar/link-grammar-java.def0000644000175000017500000000270411350565473021466 0ustar bloombloomJava_org_linkgrammar_LinkGrammar_close Java_org_linkgrammar_LinkGrammar_getConstituentString Java_org_linkgrammar_LinkGrammar_getVersion Java_org_linkgrammar_LinkGrammar_getDictVersion Java_org_linkgrammar_LinkGrammar_getWord Java_org_linkgrammar_LinkGrammar_init Java_org_linkgrammar_LinkGrammar_isEntity Java_org_linkgrammar_LinkGrammar_isPastTenseForm Java_org_linkgrammar_LinkGrammar_getLinkLLabel Java_org_linkgrammar_LinkGrammar_getLinkLWord Java_org_linkgrammar_LinkGrammar_getLinkLabel Java_org_linkgrammar_LinkGrammar_getLinkRLabel Java_org_linkgrammar_LinkGrammar_getLinkRWord Java_org_linkgrammar_LinkGrammar_getLinkString Java_org_linkgrammar_LinkGrammar_getLinkageAndCost Java_org_linkgrammar_LinkGrammar_getLinkageDisjunctCost Java_org_linkgrammar_LinkGrammar_getLinkageLinkCost Java_org_linkgrammar_LinkGrammar_getLinkageNumViolations Java_org_linkgrammar_LinkGrammar_getLinkageDisjunct Java_org_linkgrammar_LinkGrammar_getLinkageWord Java_org_linkgrammar_LinkGrammar_getLinkageSense Java_org_linkgrammar_LinkGrammar_getLinkageSenseScore Java_org_linkgrammar_LinkGrammar_makeLinkage Java_org_linkgrammar_LinkGrammar_getNumLinkages Java_org_linkgrammar_LinkGrammar_getNumLinks Java_org_linkgrammar_LinkGrammar_getNumSkippedWords Java_org_linkgrammar_LinkGrammar_getNumWords Java_org_linkgrammar_LinkGrammar_parse Java_org_linkgrammar_LinkGrammar_setMaxCost Java_org_linkgrammar_LinkGrammar_setMaxParseSeconds Java_org_linkgrammar_LinkGrammar_setDictionariesPath link-grammar-4.7.4/link-grammar/count.c0000644000175000017500000006124211526022265016774 0ustar bloombloom/*************************************************************************/ /* Copyright (c) 2004 */ /* Daniel Sleator, David Temperley, and John Lafferty */ /* All rights reserved */ /* */ /* Use of the link grammar parsing system is subject to the terms of the */ /* license set forth in the LICENSE file included with this software, */ /* and also available at http://www.link.cs.cmu.edu/link/license.html */ /* This license allows free redistribution and use in source and binary */ /* forms, with or without modification, subject to certain conditions. */ /* */ /*************************************************************************/ #include #include "disjunct-utils.h" /* This file contains the exhaustive search algorithm. */ typedef struct Table_connector_s Table_connector; struct Table_connector_s { short lw, rw; Connector *le, *re; short cost; s64 count; Table_connector *next; }; struct count_context_s { char ** deletable; char ** effective_dist; Word * local_sent; int null_block; int islands_ok; int null_links; int table_size; int log2_table_size; Table_connector ** table; Resources current_resources; }; static void free_table(count_context_t *ctxt) { int i; Table_connector *t, *x; for (i=0; itable_size; i++) { for(t = ctxt->table[i]; t!= NULL; t=x) { x = t->next; xfree((void *) t, sizeof(Table_connector)); } } xfree(ctxt->table, ctxt->table_size * sizeof(Table_connector*)); ctxt->table = NULL; ctxt->table_size = 0; } static void init_table(Sentence sent) { int shift; /* A piecewise exponential function determines the size of the * hash table. Probably should make use of the actual number of * disjuncts, rather than just the number of words. */ count_context_t *ctxt = sent->count_ctxt; if (ctxt->table) free_table(ctxt); if (sent->length >= 10) { shift = 12 + (sent->length) / 6 ; } else { shift = 12; } /* Clamp at max 4*(1<<24) == 64 MBytes */ if (24 < shift) shift = 24; ctxt->table_size = (1 << shift); ctxt->log2_table_size = shift; ctxt->table = (Table_connector**) xalloc(ctxt->table_size * sizeof(Table_connector*)); memset(ctxt->table, 0, ctxt->table_size*sizeof(Table_connector*)); } int x_match(Sentence sent, Connector *a, Connector *b) { return do_match(sent, a, b, 0, 0); } void count_set_effective_distance(Sentence sent) { sent->count_ctxt->effective_dist = sent->effective_dist; } void count_unset_effective_distance(Sentence sent) { sent->count_ctxt->effective_dist = NULL; } /* * Returns TRUE if s and t match according to the connector matching * rules. The connector strings must be properly formed, starting with * zero or more upper case letters, followed by some other letters, and * The algorithm is symmetric with respect to a and b. * * It works as follows: The labels must match. The priorities must be * compatible (both THIN_priority, or one UP_priority and one DOWN_priority). * The sequence of upper case letters must match exactly. After these comes * a sequence of lower case letters "*"s or "^"s. The matching algorithm * is different depending on which of the two priority cases is being * considered. See the comments below. */ int do_match(Sentence sent, Connector *a, Connector *b, int aw, int bw) { const char *s, *t; int x, y, dist; count_context_t *ctxt; if (a->label != b->label) return FALSE; s = a->string; t = b->string; while(isupper((int)*s) || isupper((int)*t)) { if (*s != *t) return FALSE; s++; t++; } ctxt = sent->count_ctxt; x = a->priority; y = b->priority; /* Probably not necessary, as long as * effective_dist[0][0]=0 and is defined */ if (aw == 0 && bw == 0) { dist = 0; } else { assert(aw < bw, "match() did not receive params in the natural order."); dist = ctxt->effective_dist[aw][bw]; } /* printf("M: a=%4s b=%4s ap=%d bp=%d aw=%d bw=%d a->ll=%d b->ll=%d dist=%d\n", s, t, x, y, aw, bw, a->length_limit, b->length_limit, dist); */ if (dist > a->length_limit || dist > b->length_limit) return FALSE; if ((x == THIN_priority) && (y == THIN_priority)) { /* Remember that "*" matches anything, and "^" matches nothing (except "*"). Otherwise two characters match if and only if they're equal. ("^" can be used in the dictionary just like any other connector.) */ while ((*s!='\0') && (*t!='\0')) { if ((*s == '*') || (*t == '*') || ((*s == *t) && (*s != '^'))) { s++; t++; } else return FALSE; } return TRUE; } else if ((x==UP_priority) && (y==DOWN_priority)) { /* As you go up (namely from x to y) the set of strings that match (in the normal THIN sense above) should get no larger. Read the comment in and.c to understand this. In other words, the y string (t) must be weaker (or at least no stronger) that the x string (s). This code is only correct if the strings are the same length. This is currently true, but perhaps for safty this assumption should be removed. */ while ((*s!='\0') && (*t!='\0')) { if ((*s == *t) || (*s == '*') || (*t == '^')) { s++; t++; } else return FALSE; } return TRUE; } else if ((y == UP_priority) && (x == DOWN_priority)) { while ((*s!='\0') && (*t!='\0')) { if ((*s == *t) || (*t == '*') || (*s == '^')) { s++; t++; } else return FALSE; } return TRUE; } else return FALSE; } /** * Stores the value in the table. Assumes it's not already there. */ static Table_connector * table_store(count_context_t *ctxt, int lw, int rw, Connector *le, Connector *re, int cost, s64 count) { Table_connector *t, *n; int h; n = (Table_connector *) xalloc(sizeof(Table_connector)); n->count = count; n->lw = lw; n->rw = rw; n->le = le; n->re = re; n->cost = cost; h = pair_hash(ctxt->log2_table_size,lw, rw, le, re, cost); t = ctxt->table[h]; n->next = t; ctxt->table[h] = n; return n; } /** returns the pointer to this info, NULL if not there */ static Table_connector * find_table_pointer(count_context_t *ctxt, int lw, int rw, Connector *le, Connector *re, int cost) { Table_connector *t; int h = pair_hash(ctxt->log2_table_size,lw, rw, le, re, cost); t = ctxt->table[h]; for (; t != NULL; t = t->next) { if ((t->lw == lw) && (t->rw == rw) && (t->le == le) && (t->re == re) && (t->cost == cost)) return t; } /* Create a new connector only if resources are exhausted. * (???) Huh? I guess we're in panic parse mode in that case. */ if ((ctxt->current_resources != NULL) && resources_exhausted(ctxt->current_resources)) { return table_store(ctxt, lw, rw, le, re, cost, 0); } else return NULL; } /** returns the count for this quintuple if there, -1 otherwise */ s64 table_lookup(Sentence sent, int lw, int rw, Connector *le, Connector *re, int cost) { Table_connector *t = find_table_pointer(sent->count_ctxt, lw, rw, le, re, cost); if (t == NULL) return -1; else return t->count; } /** * Stores the value in the table. Unlike table_store, it assumes * it's already there */ static void table_update(count_context_t *ctxt, int lw, int rw, Connector *le, Connector *re, int cost, s64 count) { Table_connector *t = find_table_pointer(ctxt, lw, rw, le, re, cost); assert(t != NULL, "This entry is supposed to be in the table."); t->count = count; } /** * Returns 0 if and only if this entry is in the hash table * with a count value of 0. */ static s64 pseudocount(Sentence sent, int lw, int rw, Connector *le, Connector *re, int cost) { s64 count; count = table_lookup(sent, lw, rw, le, re, cost); if (count == 0) return 0; else return 1; } static s64 do_count(Sentence sent, int lw, int rw, Connector *le, Connector *re, int null_count) { Disjunct * d; s64 total, pseudototal; int start_word, end_word, w; s64 leftcount, rightcount; int lcost, rcost, Lmatch, Rmatch; Match_node * m, *m1; Table_connector *t; count_context_t *ctxt = sent->count_ctxt; if (null_count < 0) return 0; /* can this ever happen?? */ t = find_table_pointer(ctxt, lw, rw, le, re, null_count); if (t == NULL) { /* Create the table entry with a tentative null count of 0. * This count must be updated before we return. */ t = table_store(ctxt, lw, rw, le, re, null_count, 0); } else { return t->count; } if (rw == 1+lw) { /* lw and rw are neighboring words */ /* You can't have a linkage here with null_count > 0 */ if ((le == NULL) && (re == NULL) && (null_count == 0)) { t->count = 1; } else { t->count = 0; } return t->count; } if ((le == NULL) && (re == NULL)) { if (!ctxt->islands_ok && (lw != -1)) { /* If we don't allow islands (a set of words linked together * but separate from the rest of the sentence) then the * null_count of skipping n words is just n */ if (null_count == ((rw-lw-1) + ctxt->null_block-1)/ctxt->null_block) { /* If null_block=4 then the null_count of 1,2,3,4 nulls is 1; and 5,6,7,8 is 2 etc. */ t->count = 1; } else { t->count = 0; } return t->count; } if (null_count == 0) { /* There is no solution without nulls in this case. There is * a slight efficiency hack to separate this null_count==0 * case out, but not necessary for correctness */ t->count = 0; } else { total = 0; w = lw+1; for (d = ctxt->local_sent[w].d; d != NULL; d = d->next) { if (d->left == NULL) { total += do_count(sent, w, rw, d->right, NULL, null_count-1); } } total += do_count(sent, w, rw, NULL, NULL, null_count-1); t->count = total; } return t->count; } if (le == NULL) { start_word = lw+1; } else { start_word = le->word; } if (re == NULL) { end_word = rw; } else { end_word = re->word +1; } total = 0; for (w = start_word; w < end_word; w++) { m1 = m = form_match_list(sent, w, le, lw, re, rw); for (; m!=NULL; m=m->next) { d = m->d; for (lcost = 0; lcost <= null_count; lcost++) { rcost = null_count - lcost; /* Now lcost and rcost are the costs we're assigning * to those parts respectively */ /* Now, we determine if (based on table only) we can see that the current range is not parsable. */ Lmatch = (le != NULL) && (d->left != NULL) && do_match(sent, le, d->left, lw, w); Rmatch = (d->right != NULL) && (re != NULL) && do_match(sent, d->right, re, w, rw); rightcount = leftcount = 0; if (Lmatch) { leftcount = pseudocount(sent, lw, w, le->next, d->left->next, lcost); if (le->multi) leftcount += pseudocount(sent, lw, w, le, d->left->next, lcost); if (d->left->multi) leftcount += pseudocount(sent, lw, w, le->next, d->left, lcost); if (le->multi && d->left->multi) leftcount += pseudocount(sent, lw, w, le, d->left, lcost); } if (Rmatch) { rightcount = pseudocount(sent, w, rw, d->right->next, re->next, rcost); if (d->right->multi) rightcount += pseudocount(sent, w,rw,d->right,re->next, rcost); if (re->multi) rightcount += pseudocount(sent, w, rw, d->right->next, re, rcost); if (d->right->multi && re->multi) rightcount += pseudocount(sent, w, rw, d->right, re, rcost); } /* total number where links are used on both sides */ pseudototal = leftcount*rightcount; if (leftcount > 0) { /* evaluate using the left match, but not the right */ pseudototal += leftcount * pseudocount(sent, w, rw, d->right, re, rcost); } if ((le == NULL) && (rightcount > 0)) { /* evaluate using the right match, but not the left */ pseudototal += rightcount * pseudocount(sent, lw, w, le, d->left, lcost); } /* now pseudototal is 0 implies that we know that the true total is 0 */ if (pseudototal != 0) { rightcount = leftcount = 0; if (Lmatch) { leftcount = do_count(sent, lw, w, le->next, d->left->next, lcost); if (le->multi) leftcount += do_count(sent, lw, w, le, d->left->next, lcost); if (d->left->multi) leftcount += do_count(sent, lw, w, le->next, d->left, lcost); if (le->multi && d->left->multi) leftcount += do_count(sent, lw, w, le, d->left, lcost); } if (Rmatch) { rightcount = do_count(sent, w, rw, d->right->next, re->next, rcost); if (d->right->multi) rightcount += do_count(sent, w,rw,d->right,re->next, rcost); if (re->multi) rightcount += do_count(sent, w, rw, d->right->next, re, rcost); if (d->right->multi && re->multi) rightcount += do_count(sent, w, rw, d->right, re, rcost); } total += leftcount*rightcount; /* total number where links are used on both sides */ if (leftcount > 0) { /* evaluate using the left match, but not the right */ total += leftcount * do_count(sent, w, rw, d->right, re, rcost); } if ((le == NULL) && (rightcount > 0)) { /* evaluate using the right match, but not the left */ total += rightcount * do_count(sent, lw, w, le, d->left, lcost); } } } } put_match_list(sent, m1); } t->count = total; return total; } /** * Returns the number of ways the sentence can be parsed with the * specified null count. Assumes that the hash table has already been * initialized, and is freed later. The "null_count" here is the * number of words that are allowed to have no links to them. */ s64 do_parse(Sentence sent, int null_count, Parse_Options opts) { s64 total; count_context_t *ctxt = sent->count_ctxt; count_set_effective_distance(sent); ctxt->current_resources = opts->resources; ctxt->local_sent = sent->word; ctxt->deletable = sent->deletable; ctxt->null_block = opts->null_block; ctxt->islands_ok = opts->islands_ok; total = do_count(sent, -1, sent->length, NULL, NULL, null_count+1); ctxt->local_sent = NULL; ctxt->current_resources = NULL; return total; } /** CONJUNCTION PRUNING. The basic idea is this. Before creating the fat disjuncts, we run a modified version of the exhaustive search procedure. Its purpose is to mark the disjuncts that can be used in any linkage. It's just like the normal exhaustive search, except that if a subrange of words are deletable, then we treat them as though they were not even there. So, if we call the function in the situation where the set of words between the left and right one are deletable, and the left and right connector pointers are NULL, then that range is considered to have a solution. There are actually two procedures to implement this. One is mark_region() and the other is region_valid(). The latter just checks to see if the given region can be completed (within it). The former actually marks those disjuncts that can be used in any valid linkage of the given region. As in the standard search procedure, we make use of the fast-match data structure (which requires power pruning to have been done), and we also use a hash table. The table is used differently in this case. The meaning of values stored in the table are as follows: -1 Nothing known (Actually, this is not stored. It's returned by table_lookup when nothing is known.) 0 This region can't be completed (marking is therefore irrelevant) 1 This region can be completed, but it's not yet marked 2 This region can be completed, and it's been marked. */ static int x_prune_match(count_context_t *ctxt, Connector *le, Connector *re, int lw, int rw) { int dist; assert(lw < rw, "prune_match() did not receive params in the natural order."); dist = ctxt->effective_dist[lw][rw]; return prune_match(dist, le, re); } /** * Returns 0 if this range cannot be successfully filled in with * links. Returns 1 if it can, and it's not been marked, and returns * 2 if it can and it has been marked. */ static int region_valid(Sentence sent, int lw, int rw, Connector *le, Connector *re) { Disjunct * d; int left_valid, right_valid, found; int i, start_word, end_word; int w; Match_node * m, *m1; count_context_t *ctxt = sent->count_ctxt; i = table_lookup(sent, lw, rw, le, re, 0); if (i >= 0) return i; if ((le == NULL) && (re == NULL) && ctxt->deletable[lw][rw]) { table_store(ctxt, lw, rw, le, re, 0, 1); return 1; } if (le == NULL) { start_word = lw+1; } else { start_word = le->word; } if (re == NULL) { end_word = rw; } else { end_word = re->word + 1; } found = 0; for (w=start_word; w < end_word; w++) { m1 = m = form_match_list(sent, w, le, lw, re, rw); for (; m!=NULL; m=m->next) { d = m->d; /* mark_cost++;*/ /* in the following expressions we use the fact that 0=FALSE. Could eliminate by always saying "region_valid(...) != 0" */ left_valid = (((le != NULL) && (d->left != NULL) && x_prune_match(ctxt, le, d->left, lw, w)) && ((region_valid(sent, lw, w, le->next, d->left->next)) || ((le->multi) && region_valid(sent, lw, w, le, d->left->next)) || ((d->left->multi) && region_valid(sent, lw, w, le->next, d->left)) || ((le->multi && d->left->multi) && region_valid(sent, lw, w, le, d->left)))); if (left_valid && region_valid(sent, w, rw, d->right, re)) { found = 1; break; } right_valid = (((d->right != NULL) && (re != NULL) && x_prune_match(ctxt, d->right, re, w, rw)) && ((region_valid(sent, w, rw, d->right->next,re->next)) || ((d->right->multi) && region_valid(sent, w,rw,d->right,re->next)) || ((re->multi) && region_valid(sent, w, rw, d->right->next, re)) || ((d->right->multi && re->multi) && region_valid(sent, w, rw, d->right, re)))); if ((left_valid && right_valid) || (right_valid && region_valid(sent, lw, w, le, d->left))) { found = 1; break; } } put_match_list(sent, m1); if (found != 0) break; } table_store(ctxt, lw, rw, le, re, 0, found); return found; } /** * Mark as useful all disjuncts involved in some way to complete the * structure within the current region. Note that only disjuncts * strictly between lw and rw will be marked. If it so happens that * this region itself is not valid, then this fact will be recorded * in the table, and nothing else happens. */ static void mark_region(Sentence sent, int lw, int rw, Connector *le, Connector *re) { Disjunct * d; int left_valid, right_valid, i; int start_word, end_word; int w; Match_node * m, *m1; count_context_t *ctxt = sent->count_ctxt; i = region_valid(sent, lw, rw, le, re); if ((i==0) || (i==2)) return; /* we only reach this point if it's a valid unmarked region, i=1 */ table_update(ctxt, lw, rw, le, re, 0, 2); if ((le == NULL) && (re == NULL) && (ctxt->null_links) && (rw != 1+lw)) { w = lw+1; for (d = ctxt->local_sent[w].d; d != NULL; d = d->next) { if ((d->left == NULL) && region_valid(sent, w, rw, d->right, NULL)) { d->marked = TRUE; mark_region(sent, w, rw, d->right, NULL); } } mark_region(sent, w, rw, NULL, NULL); return; } if (le == NULL) { start_word = lw+1; } else { start_word = le->word; } if (re == NULL) { end_word = rw; } else { end_word = re->word + 1; } for (w=start_word; w < end_word; w++) { m1 = m = form_match_list(sent, w, le, lw, re, rw); for (; m!=NULL; m=m->next) { d = m->d; /* mark_cost++;*/ left_valid = (((le != NULL) && (d->left != NULL) && x_prune_match(ctxt, le, d->left, lw, w)) && ((region_valid(sent, lw, w, le->next, d->left->next)) || ((le->multi) && region_valid(sent, lw, w, le, d->left->next)) || ((d->left->multi) && region_valid(sent, lw, w, le->next, d->left)) || ((le->multi && d->left->multi) && region_valid(sent, lw, w, le, d->left)))); right_valid = (((d->right != NULL) && (re != NULL) && x_prune_match(ctxt, d->right, re, w, rw)) && ((region_valid(sent, w, rw, d->right->next,re->next)) || ((d->right->multi) && region_valid(sent, w,rw,d->right,re->next)) || ((re->multi) && region_valid(sent, w, rw, d->right->next, re)) || ((d->right->multi && re->multi) && region_valid(sent, w, rw, d->right, re)))); /* The following if statements could be restructured to avoid superfluous calls to mark_region. It didn't seem a high priority, so I didn't optimize this. */ if (left_valid && region_valid(sent, w, rw, d->right, re)) { d->marked = TRUE; mark_region(sent, w, rw, d->right, re); mark_region(sent, lw, w, le->next, d->left->next); if (le->multi) mark_region(sent, lw, w, le, d->left->next); if (d->left->multi) mark_region(sent, lw, w, le->next, d->left); if (le->multi && d->left->multi) mark_region(sent, lw, w, le, d->left); } if (right_valid && region_valid(sent, lw, w, le, d->left)) { d->marked = TRUE; mark_region(sent, lw, w, le, d->left); mark_region(sent, w, rw, d->right->next,re->next); if (d->right->multi) mark_region(sent, w,rw,d->right,re->next); if (re->multi) mark_region(sent, w, rw, d->right->next, re); if (d->right->multi && re->multi) mark_region(sent, w, rw, d->right, re); } if (left_valid && right_valid) { d->marked = TRUE; mark_region(sent, lw, w, le->next, d->left->next); if (le->multi) mark_region(sent, lw, w, le, d->left->next); if (d->left->multi) mark_region(sent, lw, w, le->next, d->left); if (le->multi && d->left->multi) mark_region(sent, lw, w, le, d->left); mark_region(sent, w, rw, d->right->next,re->next); if (d->right->multi) mark_region(sent, w,rw,d->right,re->next); if (re->multi) mark_region(sent, w, rw, d->right->next, re); if (d->right->multi && re->multi) mark_region(sent, w, rw, d->right, re); } } put_match_list(sent, m1); } } void delete_unmarked_disjuncts(Sentence sent) { int w; Disjunct *d_head, *d, *dx; for (w=0; wlength; w++) { d_head = NULL; for (d=sent->word[w].d; d != NULL; d=dx) { dx = d->next; if (d->marked) { d->next = d_head; d_head = d; } else { d->next = NULL; free_disjuncts(d); } } sent->word[w].d = d_head; } } /** * We've already built the sentence disjuncts, and we've pruned them * and power_pruned(GENTLE) them also. The sentence contains a * conjunction. deletable[][] has been initialized to indicate the * ranges which may be deleted in the final linkage. * * This routine deletes irrelevant disjuncts. It finds them by first * marking them all as irrelevant, and then marking the ones that * might be useable. Finally, the unmarked ones are removed. */ void conjunction_prune(Sentence sent, Parse_Options opts) { Disjunct * d; int w; count_context_t *ctxt = sent->count_ctxt; ctxt->current_resources = opts->resources; ctxt->deletable = sent->deletable; count_set_effective_distance(sent); /* We begin by unmarking all disjuncts. This would not be necessary if whenever we created a disjunct we cleared its marked field. I didn't want to search the program for all such places, so I did this way. XXX FIXME, someday ... */ for (w=0; wlength; w++) { for (d=sent->word[w].d; d != NULL; d=d->next) { d->marked = FALSE; } } init_fast_matcher(sent); ctxt->local_sent = sent->word; ctxt->null_links = (opts->min_null_count > 0); /* for (d = sent->word[0].d; d != NULL; d = d->next) { if ((d->left == NULL) && region_valid(sent, 0, sent->length, d->right, NULL)) { mark_region(sent, 0, sent->length, d->right, NULL); d->marked = TRUE; } } mark_region(sent, 0, sent->length, NULL, NULL); */ if (ctxt->null_links) { mark_region(sent, -1, sent->length, NULL, NULL); } else { for (w=0; wlength; w++) { /* consider removing the words [0,w-1] from the beginning of the sentence */ if (ctxt->deletable[-1][w]) { for (d = sent->word[w].d; d != NULL; d = d->next) { if ((d->left == NULL) && region_valid(sent, w, sent->length, d->right, NULL)) { mark_region(sent, w, sent->length, d->right, NULL); d->marked = TRUE; } } } } } delete_unmarked_disjuncts(sent); free_fast_matcher(sent); ctxt->local_sent = NULL; ctxt->current_resources = NULL; ctxt->deletable = NULL; count_unset_effective_distance(sent); } void init_count(Sentence sent) { if (NULL == sent->count_ctxt) sent->count_ctxt = (count_context_t *) malloc (sizeof(count_context_t)); memset(sent->count_ctxt, 0, sizeof(count_context_t)); init_table(sent); } void free_count(Sentence sent) { if (NULL == sent->count_ctxt) return; free_table(sent->count_ctxt); free(sent->count_ctxt); sent->count_ctxt = NULL; } link-grammar-4.7.4/link-grammar/pp_knowledge.h0000644000175000017500000000176511155517234020336 0ustar bloombloom/*************************************************************************/ /* Copyright (c) 2004 */ /* Daniel Sleator, David Temperley, and John Lafferty */ /* All rights reserved */ /* */ /* Use of the link grammar parsing system is subject to the terms of the */ /* license set forth in the LICENSE file included with this software, */ /* and also available at http://www.link.cs.cmu.edu/link/license.html */ /* This license allows free redistribution and use in source and binary */ /* forms, with or without modification, subject to certain conditions. */ /* */ /*************************************************************************/ pp_knowledge *pp_knowledge_open(const char *path); void pp_knowledge_close(pp_knowledge *knowledge); link-grammar-4.7.4/link-grammar/analyze-linkage.c0000644000175000017500000010057611502046452020721 0ustar bloombloom/*************************************************************************/ /* Copyright (c) 2004 */ /* Daniel Sleator, David Temperley, and John Lafferty */ /* All rights reserved */ /* */ /* Use of the link grammar parsing system is subject to the terms of the */ /* license set forth in the LICENSE file included with this software, */ /* and also available at http://www.link.cs.cmu.edu/link/license.html */ /* This license allows free redistribution and use in source and binary */ /* forms, with or without modification, subject to certain conditions. */ /* */ /*************************************************************************/ #include #include /** * The functions in this file do several things: () take a linkage * involving fat links and expand it into a sequence of linkages * (involving a subset of the given words), one for each way of * eliminating the conjunctions. () determine if a linkage involving * fat links has a structural violation. () make sure each of the expanded * linkages has a consistent post-processing behavior. () compute the * cost of the linkage. */ typedef struct patch_element_struct Patch_element; struct patch_element_struct { char used; /* TRUE if this link is used, else FALSE */ char changed;/* TRUE if this link changed, else FALSE */ int newl; /* the new value of the left end */ int newr; /* the new value of the right end */ }; struct analyze_context_s { List_o_links *word_links[MAX_SENTENCE]; /* ptr to l.o.l. out of word */ int structure_violation; int dfs_root_word[MAX_SENTENCE]; /* for the depth-first search */ int dfs_height[MAX_SENTENCE]; /* to determine the order to do the root word dfs */ int height_perm[MAX_SENTENCE]; /* permute the vertices from highest to lowest */ /* The following are all for computing the cost of and lists */ int visited[MAX_SENTENCE]; int and_element_sizes[MAX_SENTENCE]; int and_element[MAX_SENTENCE]; int N_and_elements; int outside_word[MAX_SENTENCE]; int N_outside_words; Patch_element patch_array[MAX_LINKS]; }; typedef struct CON_node_struct CON_node; typedef struct CON_list_struct CON_list; typedef struct DIS_list_struct DIS_list; typedef struct Links_to_patch_struct Links_to_patch; struct DIS_node_struct { CON_list * cl; /* the list of children */ List_o_links * lol;/* the links that comprise this region of the graph */ int word; /* the word defining this node */ }; struct CON_node_struct { DIS_list * dl; /* the list of children */ DIS_list * current;/* defines the current child */ int word; /* the word defining this node */ }; struct DIS_list_struct { DIS_list * next; DIS_node * dn; }; struct CON_list_struct { CON_list * next; CON_node * cn; }; struct Links_to_patch_struct { Links_to_patch * next; int link; char dir; /* this is 'r' or 'l' depending on which end of the link is to be patched. */ }; void zero_sublinkage(Sublinkage *s) { int i; s->pp_info = NULL; s->violation = NULL; for (i=0; inum_links; i++) s->link[i] = NULL; memset(&s->pp_data, 0, sizeof(PP_data)); } static Sublinkage * x_create_sublinkage(Parse_info pi) { Sublinkage *s = (Sublinkage *) xalloc (sizeof(Sublinkage)); s->link = (Link **) xalloc(MAX_LINKS*sizeof(Link *)); s->num_links = MAX_LINKS; zero_sublinkage(s); s->num_links = pi->N_links; assert(pi->N_links < MAX_LINKS, "Too many links"); return s; } static Sublinkage * ex_create_sublinkage(Parse_info pi) { Sublinkage *s = (Sublinkage *) exalloc (sizeof(Sublinkage)); s->link = (Link **) exalloc(pi->N_links*sizeof(Link *)); s->num_links = pi->N_links; zero_sublinkage(s); assert(pi->N_links < MAX_LINKS, "Too many links"); return s; } static void free_sublinkage(Sublinkage *s) { int i; for (i=0; ilink[i]!=NULL) exfree_link(s->link[i]); } xfree(s->link, MAX_LINKS*sizeof(Link)); xfree(s, sizeof(Sublinkage)); } static void replace_link_name(Link *l, const char *s) { /* XXX can get some perf improvement by avoiding strlen! */ char * t; exfree((char *) l->name, sizeof(char)*(strlen(l->name)+1)); t = (char *) exalloc(sizeof(char)*(strlen(s)+1)); strcpy(t, s); l->name = t; } static void copy_full_link(Link **dest, Link *src) { if (*dest != NULL) exfree_link(*dest); *dest = excopy_link(src); } /* end new code 9/97 ALB */ /** * Constructs a graph in the wordlinks array based on the contents of * the global link_array. Makes the wordlinks array point to a list of * words neighboring each word (actually a list of links). This is a * directed graph, constructed for dealing with "and". For a link in * which the priorities are UP or DOWN_priority, the edge goes from the * one labeled DOWN to the one labeled UP. * Don't generate links edges for the bogus comma connectors. */ static void build_digraph(analyze_context_t *actx, Parse_info pi) { int i, link, N_fat; Link *lp; List_o_links * lol; N_fat = 0; for (i = 0; i < pi->N_words; i++) { actx->word_links[i] = NULL; } for (link = 0; link < pi->N_links; link++) { lp = &(pi->link_array[link]); i = lp->lc->label; if (i < NORMAL_LABEL) { /* one of those special links for either-or, etc */ continue; } lol = (List_o_links *) xalloc(sizeof(List_o_links)); lol->next = actx->word_links[lp->l]; actx->word_links[lp->l] = lol; lol->link = link; lol->word = lp->r; i = lp->lc->priority; if (i == THIN_priority) { lol->dir = 0; } else if (i == DOWN_priority) { lol->dir = 1; } else { lol->dir = -1; } lol = (List_o_links *) xalloc(sizeof(List_o_links)); lol->next = actx->word_links[lp->r]; actx->word_links[lp->r] = lol; lol->link = link; lol->word = lp->l; i = lp->rc->priority; if (i == THIN_priority) { lol->dir = 0; } else if (i == DOWN_priority) { lol->dir = 1; } else { lol->dir = -1; } } } /** * Returns TRUE if there is at least one fat link pointing out of this word. */ static int is_CON_word(int w, List_o_links **wordlinks) { List_o_links * lol; for (lol = wordlinks[w]; lol != NULL; lol = lol->next) { if (lol->dir == 1) return TRUE; } return FALSE; } static DIS_node * build_DIS_node(analyze_context_t*, int); /** * This word is a CON word (has fat links down). Build the tree for it. */ static CON_node * build_CON_node(analyze_context_t *actx, int w) { List_o_links * lol; CON_node * a; DIS_list * d, *dx; d = NULL; for (lol = actx->word_links[w]; lol != NULL; lol = lol->next) { if (lol->dir == 1) { dx = (DIS_list *) xalloc (sizeof (DIS_list)); dx->next = d; d = dx; d->dn = build_DIS_node(actx, lol->word); } } a = (CON_node *) xalloc(sizeof (CON_node)); a->dl = a->current = d; a->word = w; return a; } /** * Does a depth-first-search starting from w. Puts on the front of the * list pointed to by c all of the CON nodes it finds, and returns the * result. Also construct the list of all edges reached as part of this * DIS_node search and append it to the lol list of start_dn. * * Both of the structure violations actually occur, and represent * linkages that have improper structure. Fortunately, they * seem to be rather rare. */ static CON_list * c_dfs(analyze_context_t *actx, int w, DIS_node * start_dn, CON_list * c) { CON_list *cx; List_o_links * lol, *lolx; if (actx->dfs_root_word[w] != -1) { if (actx->dfs_root_word[w] != start_dn->word) { actx->structure_violation = TRUE; } return c; } actx->dfs_root_word[w] = start_dn->word; for (lol = actx->word_links[w]; lol != NULL; lol = lol->next) { if (lol->dir < 0) /* a backwards link */ { if (actx->dfs_root_word[lol->word] == -1) { actx->structure_violation = TRUE; } } else if (lol->dir == 0) { /* Make a copy of the link */ lolx = (List_o_links *) xalloc(sizeof(List_o_links)); lolx->word = lol->word; lolx->dir = lol->dir; lolx->link = lol->link; /* Chain it into place */ lolx->next = start_dn->lol; start_dn->lol = lolx; c = c_dfs(actx, lol->word, start_dn, c); } } /* if the current node is CON, put it first */ if (is_CON_word(w, actx->word_links)) { cx = (CON_list *) xalloc(sizeof(CON_list)); cx->next = c; c = cx; c->cn = build_CON_node(actx, w); } return c; } /** * This node is connected to its parent via a fat link. Search the * region reachable via thin links, and put all reachable nodes with fat * links out of them in its list of children. */ static DIS_node * build_DIS_node(analyze_context_t *actx, int w) { DIS_node * dn; dn = (DIS_node *) xalloc(sizeof (DIS_node)); dn->word = w; /* must do this before dfs so it knows the start word */ dn->lol = NULL; dn->cl = c_dfs(actx, w, dn, NULL); return dn; } static void height_dfs(analyze_context_t *actx, int w, int height) { List_o_links * lol; if (actx->dfs_height[w] != 0) return; actx->dfs_height[w] = height; for (lol = actx->word_links[w]; lol != NULL; lol = lol->next) { /* The dir is 1 for a down link. */ height_dfs(actx, lol->word, height - lol->dir); } } /** * Simple insertion sort; should be plenty fast enough, since sentences * are almost always shorter than 30 words or so. In fact, this is * almost surely faster than qsort for such small arrays. */ static void insort (analyze_context_t *actx, int nwords) { int i, j; for (i=1; idfs_height[i]; int perm = actx->height_perm[i]; j = i; while (j>0 && (heig > actx->dfs_height[j-1])) { actx->dfs_height[j] = actx->dfs_height[j-1]; actx->height_perm[j] = actx->height_perm[j-1]; j--; } actx->dfs_height[j] = heig; actx->height_perm[j] = perm; } } static DIS_node * build_DIS_CON_tree(analyze_context_t *actx, Parse_info pi) { int xw, w; DIS_node * dnroot, * dn; CON_list * child, * xchild; List_o_links * lol, * xlol; /* The algorithm used here to build the DIS_CON tree depends on * the search percolating down from the "top" of the tree. The * original version of this started its search at the wall. This * was fine because doing a DFS from the wall explores the tree in * the right order. * * However, in order to handle null links correctly, a more careful * ordering process must be used to explore the tree. We use * dfs_height[] for this, and sort in height order. * * XXX Is the sort order correct here? This is not obvious; I think * we want highest to lowest ... XXX is the height being calculated * correctly? Looks weird to me ... XXX */ for (w=0; w < pi->N_words; w++) actx->dfs_height[w] = 0; for (w=0; w < pi->N_words; w++) height_dfs(actx, w, MAX_SENTENCE); for (w=0; w < pi->N_words; w++) actx->height_perm[w] = w; /* Sort the heights, keeping only the permuted order. */ insort (actx, pi->N_words); for (w=0; wN_words; w++) actx->dfs_root_word[w] = -1; dnroot = NULL; for (xw = 0; xw < pi->N_words; xw++) { w = actx->height_perm[xw]; if (actx->dfs_root_word[w] == -1) { dn = build_DIS_node(actx, w); if (dnroot == NULL) { dnroot = dn; } else { for (child = dn->cl; child != NULL; child = xchild) { xchild = child->next; child->next = dnroot->cl; dnroot->cl = child; } for (lol = dn->lol; lol != NULL; lol = xlol) { xlol = lol->next; lol->next = dnroot->lol; dnroot->lol = lol; } xfree((void *) dn, sizeof(DIS_node)); } } } return dnroot; } static int advance_CON(CON_node *); /** * Cyclically advance the current state of this DIS node. * If it's now at the beginning of its cycle, return FALSE; * otherwise return TRUE. Together with the advance_CON() * function, this can be used to iterate over the entire * DIS_CON tree. */ static int advance_DIS(DIS_node * dn) { CON_list * cl; for (cl = dn->cl; cl != NULL; cl = cl->next) { if (advance_CON(cl->cn)) return TRUE; } return FALSE; } /** * Cyclically advance the current state of this CON node. * If it's now at the beginning of its cycle return FALSE, * otherwise return TRUE. Together with the advance_CON() * function, this can be used to iterate over the entire * DIS_CON tree. */ static int advance_CON(CON_node * cn) { if (advance_DIS(cn->current->dn)) { return TRUE; } else { if (cn->current->next == NULL) { cn->current = cn->dl; return FALSE; } else { cn->current = cn->current->next; return TRUE; } } } static void fill_patch_array_CON(analyze_context_t *, CON_node *, Links_to_patch *); /** * Patches up appropriate links in the patch_array for this DIS_node * and this patch list. */ static void fill_patch_array_DIS(analyze_context_t *actx, DIS_node * dn, Links_to_patch * ltp) { CON_list * cl; List_o_links * lol; Links_to_patch * ltpx; for (lol = dn->lol; lol != NULL; lol = lol->next) { actx->patch_array[lol->link].used = TRUE; } if ((dn->cl == NULL) || (dn->cl->cn->word != dn->word)) { for (; ltp != NULL; ltp = ltpx) { ltpx = ltp->next; actx->patch_array[ltp->link].changed = TRUE; if (ltp->dir == 'l') { actx->patch_array[ltp->link].newl = dn->word; } else { actx->patch_array[ltp->link].newr = dn->word; } xfree((void *) ltp, sizeof(Links_to_patch)); } } /* ltp != NULL at this point means that dn has child which is a cn which is the same word */ for (cl = dn->cl; cl != NULL; cl = cl->next) { fill_patch_array_CON(actx, cl->cn, ltp); ltp = NULL; } } static void fill_patch_array_CON(analyze_context_t *actx, CON_node * cn, Links_to_patch * ltp) { List_o_links * lol; Links_to_patch *ltpx; for (lol = actx->word_links[cn->word]; lol != NULL; lol = lol->next) { if (lol->dir == 0) { ltpx = (Links_to_patch *) xalloc(sizeof(Links_to_patch)); ltpx->next = ltp; ltp = ltpx; ltp->link = lol->link; if (lol->word > cn->word) { ltp->dir = 'l'; } else { ltp->dir = 'r'; } } } fill_patch_array_DIS(actx, cn->current->dn, ltp); } static void free_digraph(analyze_context_t *actx, Parse_info pi) { List_o_links * lol, *lolx; int i; for (i = 0; i < pi->N_words; i++) { for (lol = actx->word_links[i]; lol != NULL; lol = lolx) { lolx = lol->next; xfree((void *) lol, sizeof(List_o_links)); } } } static void free_CON_tree(CON_node *); void free_DIS_tree(DIS_node * dn) { List_o_links * lol, *lolx; CON_list *cl, *clx; for (lol = dn->lol; lol != NULL; lol = lolx) { lolx = lol->next; xfree((void *) lol, sizeof(List_o_links)); } for (cl = dn->cl; cl != NULL; cl = clx) { clx = cl->next; free_CON_tree(cl->cn); xfree((void *) cl, sizeof(CON_list)); } xfree((void *) dn, sizeof(DIS_node)); } static void free_CON_tree(CON_node * cn) { DIS_list *dl, *dlx; for (dl = cn->dl; dl != NULL; dl = dlx) { dlx = dl->next; free_DIS_tree(dl->dn); xfree((void *) dl, sizeof(DIS_list)); } xfree((void *) cn, sizeof(CON_node)); } /** scope out this and element */ static void and_dfs_full(analyze_context_t *actx, int w) { List_o_links *lol; if (actx->visited[w]) return; actx->visited[w] = TRUE; actx->and_element_sizes[actx->N_and_elements]++; for (lol = actx->word_links[w]; lol != NULL; lol = lol->next) { if (lol->dir >= 0) { and_dfs_full(actx, lol->word); } } } /** get down the tree past all the commas */ static void and_dfs_commas(analyze_context_t *actx, Sentence sent, int w) { List_o_links *lol; if (actx->visited[w]) return; actx->visited[w] = TRUE; for (lol = actx->word_links[w]; lol != NULL; lol = lol->next) { /* we only consider UP or DOWN priority links here */ if (lol->dir == 1) { if (strcmp(sent->word[lol->word].string, ",") == 0) { /* pointing to a comma */ and_dfs_commas(actx, sent, lol->word); } else { actx->and_element[actx->N_and_elements] = lol->word; and_dfs_full(actx, lol->word); actx->N_and_elements++; } } if (lol->dir == 0) { actx->outside_word[actx->N_outside_words] = lol->word; actx->N_outside_words++; } } } /** * This function computes the "and cost", resulting from inequalities * in the length of and-list elements. It also computes other * information used to construct the "andlist" structure of linkage_info. */ static Andlist * build_andlist(analyze_context_t *actx, Sentence sent) { int w, i, min, max, j, cost; char * s; Andlist * new_andlist, * old_andlist; Parse_info pi = sent->parse_info; old_andlist = NULL; cost = 0; for(w = 0; wN_words; w++) { s = sent->word[w].string; if (sent->is_conjunction[w]) { actx->N_and_elements = 0; actx->N_outside_words = 0; for(i=0; iN_words; i++) { actx->visited[i] = FALSE; actx->and_element_sizes[i] = 0; } if (sent->dict->left_wall_defined) actx->visited[0] = TRUE; and_dfs_commas(actx, sent, w); if (actx->N_and_elements == 0) continue; new_andlist = (Andlist *) xalloc(sizeof(Andlist)); new_andlist->num_elements = actx->N_and_elements; new_andlist->num_outside_words = actx->N_outside_words; for (i=0; i < actx->N_and_elements; i++) { new_andlist->element[i] = actx->and_element[i]; } for (i=0; i < actx->N_outside_words; i++) { new_andlist->outside_word[i] = actx->outside_word[i]; } new_andlist->conjunction = w; new_andlist->next = old_andlist; old_andlist = new_andlist; if (actx->N_and_elements > 0) { min = MAX_SENTENCE; max = 0; for (i=0; i < actx->N_and_elements; i++) { j = actx->and_element_sizes[i]; if (j < min) min = j; if (j > max) max = j; } cost += max-min; } } } if (old_andlist) old_andlist->cost = cost; return old_andlist; } /** * This function defines the cost of a link as a function of its length. */ static inline int cost_for_length(int length) { return length-1; } /** * Computes the cost of the current parse of the current sentence, * due to the length of the links. */ static int link_cost(Parse_info pi) { int lcost, i; lcost = 0; for (i = 0; i < pi->N_links; i++) { lcost += cost_for_length(pi->link_array[i].r - pi->link_array[i].l); } return lcost; } static int null_cost(Parse_info pi) { /* computes the number of null links in the linkage */ /* No one seems to care about this -- ALB */ return 0; } static int unused_word_cost(Parse_info pi) { int lcost, i; lcost = 0; for (i = 0; i < pi->N_words; i++) lcost += (pi->chosen_disjuncts[i] == NULL); return lcost; } /** * Computes the cost of the current parse of the current sentence * due to the cost of the chosen disjuncts. */ static float disjunct_cost(Parse_info pi) { int i; float lcost; lcost = 0.0; for (i = 0; i < pi->N_words; i++) { if (pi->chosen_disjuncts[i] != NULL) lcost += pi->chosen_disjuncts[i]->cost; } return lcost; } /** * Returns TRUE if string s represents a strictly smaller match set * than does t. An almost identical function appears in and.c. * The difference is that here we don't require s and t to be the * same length. */ static int strictly_smaller_name(const char * s, const char * t) { int strictness, ss, tt; strictness = 0; while ((*s!='\0') || (*t!='\0')) { if (*s == '\0') { ss = '*'; } else { ss = *s; s++; } if (*t == '\0') { tt = '*'; } else { tt = *t; t++; } if (ss == tt) continue; if ((tt == '*') || (ss == '^')) { strictness++; } else { return FALSE; } } return (strictness > 0); } /** * The name of the link is set to be the GCD of the names of * its two endpoints. Must be called after each extract_links(), * etc. since that call issues a brand-new set of links into * parse_info. */ static void compute_link_names(Sentence sent) { int i; Parse_info pi = sent->parse_info; for (i = 0; i < pi->N_links; i++) { pi->link_array[i].name = intersect_strings(sent, connector_get_string(pi->link_array[i].lc), connector_get_string(pi->link_array[i].rc)); } } /** * This fills in the sublinkage->link[].name field. We assume that * link_array[].name have already been filled in. As above, in the * standard case, the name is just the GCD of the two end points. * If pluralization has occurred, then we want to use the name * already in link_array[].name. We detect this in two ways. * If the endpoints don't match, then we know pluralization * has occured. If they do, but the name in link_array[].name * is *less* restrictive, then pluralization must have occured. */ static void compute_pp_link_names(Sentence sent, Sublinkage *sublinkage) { int i; const char * s; Parse_info pi = sent->parse_info; for (i = 0; i < pi->N_links; i++) { if (sublinkage->link[i]->l == -1) continue; /* NULL's here are quite unexpected -- I think there's a bug * elsewhere in the code. But for now, punt. Here's a sentence * that triggers a NULL -- "His convalescence was relatively brief * and he was able to return and fight at The Wilderness, * Spotsylvania and Cold Harbor." */ if (NULL == sublinkage->link[i]->lc) continue; if (NULL == sublinkage->link[i]->rc) continue; if (!x_match(sent, sublinkage->link[i]->lc, sublinkage->link[i]->rc)) { replace_link_name(sublinkage->link[i], pi->link_array[i].name); } else { s = intersect_strings(sent, connector_get_string(sublinkage->link[i]->lc), connector_get_string(sublinkage->link[i]->rc)); if (strictly_smaller_name(s, pi->link_array[i].name)) replace_link_name(sublinkage->link[i], pi->link_array[i].name); else replace_link_name(sublinkage->link[i], s); } } } /********************** exported functions *****************************/ void init_analyze(Sentence s) { analyze_context_t *actx = s->analyze_ctxt; if (NULL == actx) { actx = (analyze_context_t *) malloc (sizeof(analyze_context_t)); s->analyze_ctxt = actx; } actx->structure_violation = FALSE; } void free_analyze(Sentence s) { if (s->analyze_ctxt != NULL) free(s->analyze_ctxt); s->analyze_ctxt = NULL; } /** * This uses link_array. It enumerates and post-processes * all the linkages represented by this one. We know this contains * at least one fat link. */ Linkage_info analyze_fat_linkage(Sentence sent, Parse_Options opts, int analyze_pass) { int i; Linkage_info li; DIS_node *d_root; PP_node *pp; Postprocessor *postprocessor; Sublinkage *sublinkage; Parse_info pi = sent->parse_info; PP_node accum; /* for domain ancestry check */ D_type_list * dtl0, * dtl1; /* for domain ancestry check */ analyze_context_t *actx = sent->analyze_ctxt; sublinkage = x_create_sublinkage(pi); postprocessor = sent->dict->postprocessor; build_digraph(actx, pi); actx->structure_violation = FALSE; d_root = build_DIS_CON_tree(actx, pi); /* may set structure_violation to TRUE */ memset(&li, 0, sizeof(li)); li.N_violations = 0; li.improper_fat_linkage = actx->structure_violation; li.inconsistent_domains = FALSE; li.unused_word_cost = unused_word_cost(sent->parse_info); if (opts->use_sat_solver) { li.disjunct_cost = 0.0; } else { li.disjunct_cost = disjunct_cost(pi); } li.null_cost = null_cost(pi); li.link_cost = link_cost(pi); li.corpus_cost = -1.0f; li.and_cost = 0; li.andlist = NULL; if (actx->structure_violation) { li.N_violations++; free_sublinkage(sublinkage); free_digraph(actx, pi); free_DIS_tree(d_root); for (i = 0; i < pi->N_links; i++) { pi->link_array[i].name = ""; } return li; } if (analyze_pass == PP_SECOND_PASS) { li.andlist = build_andlist(actx, sent); li.and_cost = 0; if (li.andlist) li.and_cost = li.andlist->cost; } else li.and_cost = 0; compute_link_names(sent); for (i=0; iN_links; i++) accum.d_type_array[i] = NULL; /* loop through all the sub linkages */ for (;;) { for (i=0; iN_links; i++) { actx->patch_array[i].used = actx->patch_array[i].changed = FALSE; actx->patch_array[i].newl = pi->link_array[i].l; actx->patch_array[i].newr = pi->link_array[i].r; copy_full_link(&sublinkage->link[i], &(pi->link_array[i])); } fill_patch_array_DIS(actx, d_root, NULL); for (i=0; iN_links; i++) { if (actx->patch_array[i].changed || actx->patch_array[i].used) { sublinkage->link[i]->l = actx->patch_array[i].newl; sublinkage->link[i]->r = actx->patch_array[i].newr; } else if ((actx->dfs_root_word[pi->link_array[i].l] != -1) && (actx->dfs_root_word[pi->link_array[i].r] != -1)) { sublinkage->link[i]->l = -1; } } if (0 == opts->use_sat_solver) { compute_pp_link_array_connectors(sent, sublinkage); compute_pp_link_names(sent, sublinkage); } /* 'analyze_pass' logic added ALB 1/97 */ if (analyze_pass==PP_FIRST_PASS) { post_process_scan_linkage(postprocessor,opts,sent,sublinkage); if (!advance_DIS(d_root)) break; else continue; } pp = post_process(postprocessor, opts, sent, sublinkage, TRUE); if (pp==NULL) { if (postprocessor != NULL) li.N_violations = 1; } else if (pp->violation == NULL) { /* the purpose of this stuff is to make sure the domain ancestry for a link in each of its sentences is consistent. */ for (i=0; iN_links; i++) { if (sublinkage->link[i]->l == -1) continue; if (accum.d_type_array[i] == NULL) { accum.d_type_array[i] = copy_d_type(pp->d_type_array[i]); } else { dtl0 = pp->d_type_array[i]; dtl1 = accum.d_type_array[i]; while((dtl0 != NULL) && (dtl1 != NULL) && (dtl0->type == dtl1->type)) { dtl0 = dtl0->next; dtl1 = dtl1->next; } if ((dtl0 != NULL) || (dtl1 != NULL)) break; } } if (i != pi->N_links) { li.N_violations++; li.inconsistent_domains = TRUE; } } else if (pp->violation!=NULL) { li.N_violations++; } if (!advance_DIS(d_root)) break; } for (i=0; iN_links; ++i) { free_d_type(accum.d_type_array[i]); } /* if (display_on && (li.N_violations != 0) && (verbosity > 3) && should_print_messages) printf("P.P. violation in one part of conjunction.\n"); */ free_sublinkage(sublinkage); free_digraph(actx, pi); free_DIS_tree(d_root); return li; } /** * This uses link_array. It post-processes * this linkage, and prints the appropriate thing. There are no fat * links in it. */ Linkage_info analyze_thin_linkage(Sentence sent, Parse_Options opts, int analyze_pass) { int i; Linkage_info li; PP_node * pp; Postprocessor * postprocessor; Sublinkage *sublinkage; Parse_info pi = sent->parse_info; analyze_context_t *actx = sent->analyze_ctxt; sublinkage = x_create_sublinkage(pi); postprocessor = sent->dict->postprocessor; compute_link_names(sent); for (i=0; iN_links; i++) { copy_full_link(&(sublinkage->link[i]), &(pi->link_array[i])); } if (analyze_pass == PP_FIRST_PASS) { post_process_scan_linkage(postprocessor, opts, sent, sublinkage); free_sublinkage(sublinkage); memset(&li, 0, sizeof(li)); return li; } build_digraph(actx, pi); /* The code below can be used to generate the "islands" array. * For this to work, however, you have to call "build_digraph" * first (as in analyze_fat_linkage). and then "free_digraph". */ pp = post_process(postprocessor, opts, sent, sublinkage, TRUE); memset(&li, 0, sizeof(li)); li.N_violations = 0; li.and_cost = 0; li.unused_word_cost = unused_word_cost(sent->parse_info); li.improper_fat_linkage = FALSE; li.inconsistent_domains = FALSE; if (opts->use_sat_solver) { li.disjunct_cost = 0.0; } else { li.disjunct_cost = disjunct_cost(pi); } li.null_cost = null_cost(pi); li.link_cost = link_cost(pi); li.corpus_cost = -1.0f; li.andlist = NULL; if (pp == NULL) { if (postprocessor != NULL) li.N_violations = 1; } else if (pp->violation != NULL) { li.N_violations++; } free_sublinkage(sublinkage); free_digraph(actx, pi); return li; } void extract_thin_linkage(Sentence sent, Parse_Options opts, Linkage linkage) { int i; Parse_info pi = sent->parse_info; linkage->num_sublinkages = 1; linkage->sublinkage = ex_create_sublinkage(pi); compute_link_names(sent); for (i=0; iN_links; ++i) { linkage->sublinkage->link[i] = excopy_link(&(pi->link_array[i])); } } #ifdef DBG static void prt_lol(Sentence sent , List_o_links *lol) { /* It appears that the list of links is always even in length: * The head word first, followed by a modifier. */ while (lol) { // printf ("%d ", lol->link); printf ("%s ", sent->word[lol->word].string); lol = lol->next; } } static void prt_con_list(Sentence, CON_list *); static void prt_dis_list(Sentence sent, DIS_list *dis) { while(dis) { /* There are three possibilities: * Either there's another conjunction (and we should print it) * Or there's a head word, with its modifiers in its list-o-links, * Or there's just the bare, naked word by itself. */ if (dis->dn->cl) { prt_con_list(sent, dis->dn->cl); } else if (dis->dn->lol) { printf("["); prt_lol(sent, dis->dn->lol); printf("]"); } else { int wd = dis->dn->word; printf("%s ", sent->word[wd].string); } dis = dis->next; } } static void prt_con_list(Sentence sent, CON_list *con) { while(con) { int wd = con->cn->word; printf("(%s ", sent->word[wd].string); prt_dis_list(sent, con->cn->dl); printf(") "); con = con->next; } } static void prt_dis_con_tree(Sentence sent, DIS_node *dis) { prt_con_list(sent, dis->cl); printf ("\n"); } #else static inline void prt_dis_con_tree(Sentence sent, DIS_node *dis) {} #endif /** * This procedure mimics analyze_fat_linkage in order to * extract the sublinkages and copy them to the Linkage * data structure passed in. */ void extract_fat_linkage(Sentence sent, Parse_Options opts, Linkage linkage) { int i, j, N_thin_links; DIS_node *d_root; int num_sublinkages; Sublinkage * sublinkage; Parse_info pi = sent->parse_info; analyze_context_t *actx = sent->analyze_ctxt; build_digraph(actx, pi); actx->structure_violation = FALSE; d_root = build_DIS_CON_tree(actx, pi); if (actx->structure_violation) { compute_link_names(sent); linkage->num_sublinkages=1; linkage->sublinkage = ex_create_sublinkage(pi); /* This will have fat links! */ for (i=0; iN_links; ++i) { linkage->sublinkage->link[i] = excopy_link(&(pi->link_array[i])); } free_digraph(actx, pi); free_DIS_tree(d_root); return; } /* first get number of sublinkages and allocate space */ num_sublinkages = 0; for (;;) { num_sublinkages++; if (!advance_DIS(d_root)) break; } linkage->num_sublinkages = num_sublinkages; linkage->sublinkage = (Sublinkage *) exalloc(sizeof(Sublinkage)*num_sublinkages); for (i=0; isublinkage[i].link = NULL; linkage->sublinkage[i].pp_info = NULL; linkage->sublinkage[i].violation = NULL; } /* now fill out the sublinkage arrays */ compute_link_names(sent); sublinkage = x_create_sublinkage(pi); num_sublinkages = 0; for (;;) { for (i = 0; i < pi->N_links; i++) { actx->patch_array[i].used = actx->patch_array[i].changed = FALSE; actx->patch_array[i].newl = pi->link_array[i].l; actx->patch_array[i].newr = pi->link_array[i].r; copy_full_link(&sublinkage->link[i], &(pi->link_array[i])); } fill_patch_array_DIS(actx, d_root, NULL); for (i = 0; i < pi->N_links; i++) { if (actx->patch_array[i].changed || actx->patch_array[i].used) { sublinkage->link[i]->l = actx->patch_array[i].newl; sublinkage->link[i]->r = actx->patch_array[i].newr; } else if ((actx->dfs_root_word[pi->link_array[i].l] != -1) && (actx->dfs_root_word[pi->link_array[i].r] != -1)) { sublinkage->link[i]->l = -1; } } if (0 == opts->use_sat_solver) { compute_pp_link_array_connectors(sent, sublinkage); compute_pp_link_names(sent, sublinkage); } /* Don't copy the fat links into the linkage */ N_thin_links = 0; for (i = 0; i < pi->N_links; ++i) { if (sublinkage->link[i]->l == -1) continue; N_thin_links++; } linkage->sublinkage[num_sublinkages].num_links = N_thin_links; linkage->sublinkage[num_sublinkages].link = (Link **) exalloc(sizeof(Link *)*N_thin_links); linkage->sublinkage[num_sublinkages].pp_info = NULL; linkage->sublinkage[num_sublinkages].violation = NULL; for (i = 0, j = 0; i < pi->N_links; ++i) { if (sublinkage->link[i]->l == -1) continue; linkage->sublinkage[num_sublinkages].link[j++] = excopy_link(sublinkage->link[i]); } num_sublinkages++; if (!advance_DIS(d_root)) break; } free_sublinkage(sublinkage); free_digraph(actx, pi); if (linkage->dis_con_tree) free_DIS_tree(linkage->dis_con_tree); linkage->dis_con_tree = d_root; prt_dis_con_tree(sent, d_root); } link-grammar-4.7.4/link-grammar/word-utils.h0000644000175000017500000001072211526022265017757 0ustar bloombloom/*************************************************************************/ /* Copyright (c) 2004 */ /* Daniel Sleator, David Temperley, and John Lafferty */ /* All rights reserved */ /* */ /* Use of the link grammar parsing system is subject to the terms of the */ /* license set forth in the LICENSE file included with this software, */ /* and also available at http://www.link.cs.cmu.edu/link/license.html */ /* This license allows free redistribution and use in source and binary */ /* forms, with or without modification, subject to certain conditions. */ /* */ /*************************************************************************/ #ifndef _LINK_GRAMMAR_WORD_UTILS_H_ #define _LINK_GRAMMAR_WORD_UTILS_H_ #include /* Exp utilities ... */ void free_Exp(Exp *); void free_E_list(E_list *); int size_of_expression(Exp *); Exp * copy_Exp(Exp *); /* int exp_compare(Exp * e1, Exp * e2); */ /* int exp_contains(Exp * super, Exp * sub); */ /* X_node utilities ... */ X_node * catenate_X_nodes(X_node *, X_node *); void free_X_nodes(X_node *); /* Connector utilities ... */ Connector * connector_new(void); Connector * init_connector(Connector *c); void free_connectors(Connector *); void exfree_connectors(Connector *); Connector * copy_connectors(Connector *); Connector * excopy_connectors(Connector * c); /* Link utilities ... */ Link * excopy_link(Link *); void exfree_link(Link *); /* Connector-set utilities ... */ Connector_set * connector_set_create(Exp *e); void connector_set_delete(Connector_set * conset); int match_in_connector_set(Sentence, Connector_set *conset, Connector * c, int d); int word_has_connector(Dict_node *, const char *, int); /* Dictionary utilities ... */ int word_contains(Dictionary dict, const char * word, const char * macro); Dict_node * list_whole_dictionary(Dict_node *, Dict_node *); static inline int string_hash(const char *s) { unsigned int i; /* djb2 hash */ i = 5381; while (*s) { i = ((i << 5) + i) + *s; s++; } return i; } /** * This hash function only looks at the leading upper case letters of * the connector string, and the label fields. This ensures that if two * strings match (formally), then they must hash to the same place. */ static inline int connector_hash(Connector * c) { const char *s; unsigned int i; if (-1 != c->hash) return c->hash; /* For most situations, both hashes are very nearly equal; * sdbm seems to be about 5% faster than djb2, hard to say. * In either case, realize that the connector string is * very very short - usually one or two letters, so we have * probably only 8 or 10 bits total entropy coming in! */ #if 0 /* djb2 hash */ i = 5381; i = ((i << 5) + i) + (0xff & c->label); s = c->string; while (isupper((int) *s)) /* connector tables cannot contain UTF8, yet */ { i = ((i << 5) + i) + *s; s++; } i += i>>14; #else /* sdbm hash */ i = (0xff & c->label); s = c->string; while (isupper((int) *s)) /* connector tables cannot contain UTF8, yet */ { i = *s + (i << 6) + (i << 16) - i; s++; } #endif c->prune_string = s; c->hash = i; return i; } /** * hash function. Based on some tests, this seems to be an almost * "perfect" hash, in that almost all hash buckets have the same size! */ static inline int pair_hash(int log2_table_size, int lw, int rw, const Connector *le, const Connector *re, int cost) { int table_size = (1 << log2_table_size); unsigned int i = 0; #if 0 /* hash function. Based on some tests, this seems to be * an almost "perfect" hash, in that almost all hash buckets * have the same size! */ i += 1 << cost; i += 1 << (lw % (log2_table_size-1)); i += 1 << (rw % (log2_table_size-1)); i += ((unsigned int) le) >> 2; i += ((unsigned int) le) >> log2_table_size; i += ((unsigned int) re) >> 2; i += ((unsigned int) re) >> log2_table_size; i += i >> log2_table_size; #else /* sdbm-based hash */ i = cost; i = lw + (i << 6) + (i << 16) - i; i = rw + (i << 6) + (i << 16) - i; i = ((unsigned long) le) + (i << 6) + (i << 16) - i; i = ((unsigned long) re) + (i << 6) + (i << 16) - i; #endif return i & (table_size-1); } #endif /* _LINK_GRAMMAR_WORD_UTILS_H_ */ link-grammar-4.7.4/link-grammar/structures.h0000644000175000017500000003727111402773541020104 0ustar bloombloom/*************************************************************************/ /* Copyright (c) 2004 */ /* Daniel Sleator, David Temperley, and John Lafferty */ /* All rights reserved */ /* */ /* Use of the link grammar parsing system is subject to the terms of the */ /* license set forth in the LICENSE file included with this software, */ /* and also available at http://www.link.cs.cmu.edu/link/license.html */ /* This license allows free redistribution and use in source and binary */ /* forms, with or without modification, subject to certain conditions. */ /* */ /*************************************************************************/ #ifndef _STRUCTURES_H_ #define _STRUCTURES_H_ #include "api-types.h" #include "utilities.h" /* Needed for inline defn in Windows */ /* Global variable descriptions -- Most of these global variables have been eliminated. I've left this comment here for historical purposes --DS 4/98 N_words: The number of words in the current sentence. Computed by separate_sentence(). N_links: The number of links in the current linkage. Computed by extract_linkage(). sentence[].string: Contains a slightly modified form of the words typed by the user. Computed by separate_sentence(). sentence[].x: Contains, for each word, a pointer to a list of expressions from the dictionary that match the word in sentence[].string. Computed by build_sentence_expressions(). sentence[].d Contains for each word, a pointer to a list of disjuncts for this word. Computed by: parepare_to_parse(), but modified by pruning and power pruning. link_array[] This is an array of links. These links define the current linkage. It is computed by extract_links(). It is used by analyze_linkage() to compute pp_linkage[]. It may contain fat links. pp_link_array[] ** eliminated (ALB) Another array of links. Here all fat links have been expunged. It is computed by analyze_linkage(), and used by post_process() and by print_links(); chosen_disjuncts[] This is an array pointers to disjuncts, one for each word, that is computed by extract_links(). It represents the chosen disjuncts for the current linkage. It is used to compute the cost of the linkage, and also by compute_chosen_words() to compute the chosen_words[]. chosen_words[] An array of pointers to strings. These are the words to be displayed when printing the solution, the links, etc. Computed as a function of chosen_disjuncts[] by compute_chosen_words(). This differs from sentence[].string because it contains the suffixes. It differs from chosen_disjunct[].string in that the idiom symbols have been removed. has_fat_down[] An array of chars, one for each word. TRUE if there is a fat link down from this word, FALSE otherwise. (Only set if there is at least one fat link.) Set by set_has_fat_down_array() and used by analyze_linkage() and is_canonical(). is_conjunction[] An array of chars, one for each word. TRUE if the word is a conjunction ("and", "or", "nor", or "but" at the moment). False otherwise. */ #define NEGATIVECOST -1000000 /* This is a hack that allows one to discard disjuncts containing connectors whose cost is greater than given a bound. This number plus the cost of any connectors on a disjunct must remain negative, and this number multiplied times the number of costly connectors on any disjunct must fit into an integer. */ /* Upper bound on the cost of any connector. */ #define MAX_CONNECTOR_COST 1000.0f #define LEFT_WALL_DISPLAY ("LEFT-WALL") /* the string to use to show the wall */ #define LEFT_WALL_SUPPRESS ("Wd") /* If this connector is used on the wall, */ /* then suppress the display of the wall */ /* bogus name to prevent ever suppressing */ #define RIGHT_WALL_DISPLAY ("RIGHT-WALL") /* the string to use to show the wall */ #define RIGHT_WALL_SUPPRESS ("RW") /* If this connector is used on the wall, */ /* The following define the names of the special strings in the dictionary. */ #define LEFT_WALL_WORD ("LEFT-WALL") #define RIGHT_WALL_WORD ("RIGHT-WALL") #define POSTPROCESS_WORD ("POSTPROCESS") #define ANDABLE_CONNECTORS_WORD ("ANDABLE-CONNECTORS") #define UNLIMITED_CONNECTORS_WORD ("UNLIMITED-CONNECTORS") #if DONT_USE_REGEX_GUESSING /* English-language-specific morphology guessing */ /* Obsolete, replaced by regex-based morphology handler */ #define PROPER_WORD ("CAPITALIZED-WORDS") #define PL_PROPER_WORD ("PL-CAPITALIZED-WORDS") #define HYPHENATED_WORD ("HYPHENATED-WORDS") #define NUMBER_WORD ("NUMBERS") #define ING_WORD ("ING-WORDS") #define S_WORD ("S-WORDS") #define ED_WORD ("ED-WORDS") #define LY_WORD ("LY-WORDS") #endif /* DONT_USE_REGEX_GUESSING */ #define UNKNOWN_WORD ("UNKNOWN-WORD") #define MAX_PATH_NAME 200 /* file names (including paths) should not be longer than this */ /* Some size definitions. Reduce these for small machines */ #define MAX_WORD 60 /* maximum number of chars in a word */ #define MAX_LINE 1500 /* maximum number of chars in a sentence */ #define MAX_DISJUNCT_COST 10000 /* conditional compiling flags */ #define PLURALIZATION /* If defined, Turns on the pluralization operation in */ /* "and", "or" and "nor" */ #define INFIX_NOTATION /* If defined, then we're using infix notation for the dictionary */ /* otherwise we're using prefix notation */ #define DOWN_priority 2 #define UP_priority 1 #define THIN_priority 0 #define NORMAL_LABEL (-1) /* used for normal connectors */ /* the labels >= 0 are used by fat links */ #define UNLIMITED_LEN 255 #define SHORT_LEN 6 #define NO_WORD 255 #ifndef _MSC_VER typedef long long s64; /* signed 64-bit integer, even on 32-bit cpus */ #define PARSE_NUM_OVERFLOW (1LL<<24) #else /* Microsoft Visual C Version 6 doesn't support long long. */ typedef signed __int64 s64; /* signed 64-bit integer, even on 32-bit cpus */ #define PARSE_NUM_OVERFLOW (((s64)1)<<24) #endif struct Connector_struct { short label; short hash; unsigned char word; /* The nearest word to my left (or right) that this could connect to. Computed by power pruning */ unsigned char length_limit; /* If this is a length limited connector, this gives the limit of the length of the link that can be used on this connector. Since this is strictly a funcion of the connector name, efficiency is the only reason to store this. If no limit, the value is set to 255. */ char priority;/* one of the three priorities above */ char multi; /* TRUE if this is a multi-connector */ Connector * next; const char * string; /* Hash table next pointer, used only during pruning. */ Connector * tableNext; const char * prune_string; }; static inline void connector_set_string(Connector *c, const char *s) { c->string = s; c->hash = -1; } static inline const char * connector_get_string(Connector *c) { return c->string; } struct Disjunct_struct { Disjunct *next; const char * string; Connector *left, *right; float cost; char marked; }; typedef struct Match_node_struct Match_node; struct Match_node_struct { Match_node * next; Disjunct * d; }; typedef struct X_node_struct X_node; struct X_node_struct { const char * string; /* the word itself */ Exp * exp; X_node *next; }; struct Word_struct { char string[MAX_WORD+1]; X_node * x; /* sentence starts out with these */ Disjunct * d; /* eventually these get generated */ int firstupper; }; /** * Types of Exp_struct structures */ #define OR_type 0 #define AND_type 1 #define CONNECTOR_type 2 /** * The E_list and Exp structures defined below comprise the expression * trees that are stored in the dictionary. The expression has a type * (AND, OR or TERMINAL). If it is not a terminal it has a list * (an E_list) of children. */ struct Exp_struct { Exp * next; /* Used only for mem management,for freeing */ char type; /* One of three types, see above */ char dir; /* '-' means to the left, '+' means to right (for connector) */ char multi; /* TRUE if a multi-connector (for connector) */ union { E_list * l; /* only needed for non-terminals */ const char * string; /* only needed if it's a connector */ } u; float cost; /* The cost of using this expression. Only used for non-terminals */ }; struct E_list_struct { E_list * next; Exp * e; }; /* The structure below stores a list of dictionary word files. */ struct Word_file_struct { char file[MAX_PATH_NAME+1]; /* the file name */ int changed; /* TRUE if this file has been changed */ Word_file * next; }; /** * The dictionary is stored as a binary tree comprised of the following * nodes. A list of these (via right pointers) is used to return * the result of a dictionary lookup. */ struct Dict_node_struct { const char * string; /* the word itself */ Word_file * file; /* the file the word came from (NULL if dict file) */ Exp * exp; Dict_node *left, *right; }; /* The regexs are stored as a linked list of the following nodes. */ struct Regex_node_s { char *name; /* The identifying name of the regex */ char *pattern; /* The regular expression pattern */ void *re; /* The compiled regex. void * to avoid * having re library details invading the * rest of the LG system; regex-morph.c * takes care of all matching. */ Regex_node *next; }; /* The following three structs comprise what is returned by post_process(). */ typedef struct D_type_list_struct D_type_list; struct D_type_list_struct { D_type_list * next; int type; }; typedef struct PP_node_struct PP_node; struct PP_node_struct { D_type_list *d_type_array[MAX_LINKS]; const char *violation; }; /* Davy added these */ typedef struct Andlist_struct Andlist; struct Andlist_struct { Andlist * next; int conjunction; int num_elements; int element[MAX_SENTENCE]; int num_outside_words; int outside_word[MAX_SENTENCE]; int cost; }; /** * This is for building the graphs of links in post-processing and * fat link extraction. */ struct Linkage_info_struct { int index; Boolean fat; Boolean canonical; Boolean improper_fat_linkage; Boolean inconsistent_domains; short N_violations; short null_cost, unused_word_cost, and_cost, link_cost; float disjunct_cost; double corpus_cost; Andlist * andlist; int island[MAX_SENTENCE]; size_t nwords; char **disjunct_list_str; #ifdef USE_CORPUS Sense **sense_list; #endif }; struct List_o_links_struct { int link; /* the link number */ int word; /* the word at the other end of this link */ int dir; /* 0: undirected, 1: away from me, -1: toward me */ List_o_links * next; }; /* These parameters tell power_pruning, to tell whether this is before * or after generating and disjuncts. GENTLE is before RUTHLESS is * after. */ #define GENTLE 1 #define RUTHLESS 0 typedef struct string_node_struct String_node; struct string_node_struct { char * string; int size; String_node * next; }; typedef struct Parse_choice_struct Parse_choice; struct Link_s { int l, r; Connector * lc, * rc; const char * name; /* spelling of full link name */ }; struct Parse_choice_struct { Parse_choice * next; Parse_set * set[2]; Link link[2]; /* the lc fields of these is NULL if there is no link used */ Disjunct *ld, *md, *rd; /* the chosen disjuncts for the relevant three words */ }; struct Parse_set_struct { s64 count; /* the number of ways */ Parse_choice * first; Parse_choice * current; /* used to enumerate linkages */ }; struct X_table_connector_struct { short lw, rw; short cost; Parse_set *set; Connector *le, *re; X_table_connector *next; }; /* from string-set.c */ struct String_set_s { int size; /* the current size of the table */ int count; /* number of things currently in the table */ char ** table; /* the table itself */ }; /* from pp_linkset.c */ typedef struct pp_linkset_node_s { const char *str; struct pp_linkset_node_s *next; } pp_linkset_node; typedef struct pp_linkset_s { int hash_table_size; int population; pp_linkset_node **hash_table; /* data actually lives here */ } pp_linkset; /* from pp_lexer.c */ #define PP_LEXER_MAX_LABELS 512 typedef struct pp_label_node_s { /* linked list of strings associated with a label in the table */ const char *str; struct pp_label_node_s *next; } pp_label_node; /* next=NULL: end of list */ typedef struct PPLexTable_s { String_set *string_set; const char *labels[PP_LEXER_MAX_LABELS]; /* array of labels */ pp_label_node *nodes_of_label[PP_LEXER_MAX_LABELS]; /*str. for each label*/ pp_label_node *last_node_of_label[PP_LEXER_MAX_LABELS]; /* efficiency */ pp_label_node *current_node_of_active_label;/* state: curr node of label */ int idx_of_active_label; /* read state: current label */ } PPLexTable; /* from pp_knowledge.c */ typedef struct StartingLinkAndDomain_s { const char *starting_link; int domain; /* domain which the link belongs to (-1: terminator)*/ } StartingLinkAndDomain; typedef struct pp_rule_s { /* Holds a single post-processing rule. Since rules come in many flavors, not all fields of the following are always relevant */ const char *selector; /* name of link to which rule applies */ int domain; /* type of domain to which rule applies */ pp_linkset *link_set; /* handle to set of links relevant to rule */ int link_set_size; /* size of this set */ const char **link_array; /* array holding the spelled-out names */ const char *msg; /* explanation (NULL=end sentinel in array)*/ } pp_rule; struct pp_knowledge_s { PPLexTable *lt; /* Internal rep'n of sets of strings from knowledge file */ const char *path; /* Name of file we loaded from */ /* handles to sets of links specified in knowledge file. These constitute auxiliary data, necessary to implement the rules, below. See comments in post-process.c for a description of these. */ pp_linkset *domain_starter_links; pp_linkset *urfl_domain_starter_links; pp_linkset *urfl_only_domain_starter_links; pp_linkset *domain_contains_links; pp_linkset *must_form_a_cycle_links; pp_linkset *restricted_links; pp_linkset *ignore_these_links; pp_linkset *left_domain_starter_links; /* arrays of rules specified in knowledge file */ pp_rule *connected_rules, *form_a_cycle_rules; pp_rule *contains_one_rules, *contains_none_rules; pp_rule *bounded_rules; int n_connected_rules, n_form_a_cycle_rules; int n_contains_one_rules, n_contains_none_rules; int n_bounded_rules; pp_linkset *set_of_links_starting_bounded_domain; StartingLinkAndDomain *starting_link_lookup_table; int nStartingLinks; String_set *string_set; }; #endif link-grammar-4.7.4/link-grammar/api.c0000644000175000017500000013642011526022265016416 0ustar bloombloom/*************************************************************************/ /* Copyright (c) 2004 */ /* Daniel Sleator, David Temperley, and John Lafferty */ /* Copyright 2008, 2009 Linas Vepstas */ /* All rights reserved */ /* */ /* Use of the link grammar parsing system is subject to the terms of the */ /* license set forth in the LICENSE file included with this software, */ /* and also available at http://www.link.cs.cmu.edu/link/license.html */ /* This license allows free redistribution and use in source and binary */ /* forms, with or without modification, subject to certain conditions. */ /* */ /*************************************************************************/ #include #include #include #include #include "disjuncts.h" #include "error.h" #include "preparation.h" #include "read-regex.h" #include "regex-morph.h" #include "sat-solver/sat-encoder.h" #include "corpus/corpus.h" #include "spellcheck.h" /*************************************************************** * * Routines for setting Parse_Options * ****************************************************************/ static int VDAL_compare_parse(Linkage_info * p1, Linkage_info * p2) { /* for sorting the linkages in postprocessing */ if (p1->N_violations != p2->N_violations) { return (p1->N_violations - p2->N_violations); } else if (p1->unused_word_cost != p2->unused_word_cost) { return (p1->unused_word_cost - p2->unused_word_cost); } else if (p1->fat != p2->fat) { return (p1->fat - p2->fat); } else if (p1->disjunct_cost != p2->disjunct_cost) { return (p1->disjunct_cost - p2->disjunct_cost); } else if (p1->and_cost != p2->and_cost) { return (p1->and_cost - p2->and_cost); } else { return (p1->link_cost - p2->link_cost); } } #ifdef USE_CORPUS static int CORP_compare_parse(Linkage_info * p1, Linkage_info * p2) { double diff = p1->corpus_cost - p2->corpus_cost; if (fabs(diff) < 1.0e-5) return VDAL_compare_parse(p1, p2); if (diff < 0.0f) return -1; return 1; } #endif /** * Create and initialize a Parse_Options object */ Parse_Options parse_options_create(void) { Parse_Options po; init_memusage(); po = (Parse_Options) xalloc(sizeof(struct Parse_Options_s)); /* Here's where the values are initialized */ po->verbosity = 1; po->linkage_limit = 100; po->disjunct_cost = MAX_DISJUNCT_COST; po->use_fat_links = FALSE; po->min_null_count = 0; po->max_null_count = 0; po->null_block = 1; po->islands_ok = FALSE; po->use_spell_guess = TRUE; po->use_sat_solver = FALSE; #ifdef XXX_USE_CORPUS /* Use the corpus cost model, if available. * It really does a better job at parse ranking. * Err .. sometimes ... */ po->cost_model.compare_fn = &CORP_compare_parse; po->cost_model.type = CORPUS; #else /* USE_CORPUS */ po->cost_model.compare_fn = &VDAL_compare_parse; po->cost_model.type = VDAL; #endif /* USE_CORPUS */ po->short_length = 6; po->all_short = FALSE; po->twopass_length = 30; po->max_sentence_length = 170; po->resources = resources_create(); po->display_short = TRUE; po->display_word_subscripts = TRUE; po->display_link_subscripts = TRUE; po->display_walls = FALSE; po->display_union = FALSE; po->allow_null = TRUE; po->use_cluster_disjuncts = FALSE; po->echo_on = FALSE; po->batch_mode = FALSE; po->panic_mode = FALSE; po->screen_width = 79; po->display_on = TRUE; po->display_postscript = FALSE; po->display_constituents = 0; po->display_bad = FALSE; po->display_disjuncts = FALSE; po->display_links = FALSE; po->display_senses = FALSE; return po; } int parse_options_delete(Parse_Options opts) { resources_delete(opts->resources); xfree(opts, sizeof(struct Parse_Options_s)); return 0; } void parse_options_set_cost_model_type(Parse_Options opts, int cm) { switch(cm) { case VDAL: opts->cost_model.type = VDAL; opts->cost_model.compare_fn = &VDAL_compare_parse; break; case CORPUS: #ifdef USE_CORPUS opts->cost_model.type = CORPUS; opts->cost_model.compare_fn = &CORP_compare_parse; #else prt_error("Error: Source code compiled with cost model 'CORPUS' disabled.\n"); #endif break; default: prt_error("Error: Illegal cost model: %d\n", cm); } } int parse_options_get_cost_model_type(Parse_Options opts) { return opts->cost_model.type; } void parse_options_set_verbosity(Parse_Options opts, int dummy) { opts->verbosity = dummy; verbosity = opts->verbosity; /* this is one of the only global variables. */ } int parse_options_get_verbosity(Parse_Options opts) { return opts->verbosity; } void parse_options_set_use_sat_parser(Parse_Options opts, int dummy) { #ifdef USE_SAT_SOLVER opts->use_sat_solver = dummy; #else prt_error("Error: cannot enable the Boolean SAT parser; this " " library was built without SAT solver support.\n"); #endif } int parse_options_get_use_sat_parser(Parse_Options opts) { return opts->use_sat_solver; } void parse_options_set_use_fat_links(Parse_Options opts, int dummy) { opts->use_fat_links = dummy; } int parse_options_get_use_fat_links(Parse_Options opts) { return opts->use_fat_links; } void parse_options_set_linkage_limit(Parse_Options opts, int dummy) { opts->linkage_limit = dummy; } int parse_options_get_linkage_limit(Parse_Options opts) { return opts->linkage_limit; } void parse_options_set_disjunct_cost(Parse_Options opts, int dummy) { opts->disjunct_cost = dummy; } void parse_options_set_disjunct_costf(Parse_Options opts, float dummy) { opts->disjunct_cost = dummy; } int parse_options_get_disjunct_cost(Parse_Options opts) { return opts->disjunct_cost; } float parse_options_get_disjunct_costf(Parse_Options opts) { return opts->disjunct_cost; } void parse_options_set_min_null_count(Parse_Options opts, int val) { opts->min_null_count = val; } int parse_options_get_min_null_count(Parse_Options opts) { return opts->min_null_count; } void parse_options_set_max_null_count(Parse_Options opts, int val) { opts->max_null_count = val; } int parse_options_get_max_null_count(Parse_Options opts) { return opts->max_null_count; } void parse_options_set_null_block(Parse_Options opts, int dummy) { opts->null_block = dummy; } int parse_options_get_null_block(Parse_Options opts) { return opts->null_block; } void parse_options_set_islands_ok(Parse_Options opts, int dummy) { opts->islands_ok = dummy; } int parse_options_get_islands_ok(Parse_Options opts) { return opts->islands_ok; } void parse_options_set_spell_guess(Parse_Options opts, int dummy) { opts->use_spell_guess = dummy; } int parse_options_get_spell_guess(Parse_Options opts) { return opts->use_spell_guess; } void parse_options_set_short_length(Parse_Options opts, int short_length) { opts->short_length = short_length; } int parse_options_get_short_length(Parse_Options opts) { return opts->short_length; } void parse_options_set_all_short_connectors(Parse_Options opts, int val) { opts->all_short = val; } int parse_options_get_all_short_connectors(Parse_Options opts) { return opts->all_short; } void parse_options_set_max_parse_time(Parse_Options opts, int dummy) { opts->resources->max_parse_time = dummy; } int parse_options_get_max_parse_time(Parse_Options opts) { return opts->resources->max_parse_time; } void parse_options_set_max_memory(Parse_Options opts, int dummy) { opts->resources->max_memory = dummy; } int parse_options_get_max_memory(Parse_Options opts) { return opts->resources->max_memory; } void parse_options_set_max_sentence_length(Parse_Options opts, int dummy) { opts->max_sentence_length = dummy; } int parse_options_get_max_sentence_length(Parse_Options opts) { return opts->max_sentence_length; } void parse_options_set_echo_on(Parse_Options opts, int dummy) { opts->echo_on = dummy; } int parse_options_get_echo_on(Parse_Options opts) { return opts->echo_on; } void parse_options_set_batch_mode(Parse_Options opts, int dummy) { opts->batch_mode = dummy; } int parse_options_get_batch_mode(Parse_Options opts) { return opts->batch_mode; } void parse_options_set_panic_mode(Parse_Options opts, int dummy) { opts->panic_mode = dummy; } int parse_options_get_panic_mode(Parse_Options opts) { return opts->panic_mode; } void parse_options_set_allow_null(Parse_Options opts, int dummy) { opts->allow_null = dummy; } int parse_options_get_allow_null(Parse_Options opts) { return opts->allow_null; } void parse_options_set_use_cluster_disjuncts(Parse_Options opts, int dummy) { opts->use_cluster_disjuncts = dummy; } int parse_options_get_use_cluster_disjuncts(Parse_Options opts) { return opts->use_cluster_disjuncts; } void parse_options_set_screen_width(Parse_Options opts, int dummy) { opts->screen_width = dummy; } int parse_options_get_screen_width(Parse_Options opts) { return opts->screen_width; } void parse_options_set_display_on(Parse_Options opts, int dummy) { opts->display_on = dummy; } int parse_options_get_display_on(Parse_Options opts) { return opts->display_on; } void parse_options_set_display_postscript(Parse_Options opts, int dummy) { opts->display_postscript = dummy; } int parse_options_get_display_postscript(Parse_Options opts) { return opts->display_postscript; } void parse_options_set_display_constituents(Parse_Options opts, int dummy) { if ((dummy < 0) || (dummy > 3)) { prt_error("Possible values for constituents: \n" " 0 (no display)\n" " 1 (treebank style, multi-line indented)\n" " 2 (flat tree, square brackets)\n" " 3 (flat treebank style)\n"); opts->display_constituents = 0; } else opts->display_constituents = dummy; } int parse_options_get_display_constituents(Parse_Options opts) { return opts->display_constituents; } void parse_options_set_display_bad(Parse_Options opts, int dummy) { opts->display_bad = dummy; } int parse_options_get_display_bad(Parse_Options opts) { return opts->display_bad; } void parse_options_set_display_disjuncts(Parse_Options opts, int dummy) { opts->display_disjuncts = dummy; } int parse_options_get_display_disjuncts(Parse_Options opts) { return opts->display_disjuncts; } void parse_options_set_display_links(Parse_Options opts, int dummy) { opts->display_links = dummy; } int parse_options_get_display_links(Parse_Options opts) { return opts->display_links; } void parse_options_set_display_senses(Parse_Options opts, int dummy) { opts->display_senses = dummy; } int parse_options_get_display_senses(Parse_Options opts) { return opts->display_senses; } void parse_options_set_display_walls(Parse_Options opts, int dummy) { opts->display_walls = dummy; } int parse_options_get_display_walls(Parse_Options opts) { return opts->display_walls; } int parse_options_get_display_union(Parse_Options opts) { return opts->display_union; } void parse_options_set_display_union(Parse_Options opts, int dummy) { opts->display_union = dummy; } int parse_options_timer_expired(Parse_Options opts) { return resources_timer_expired(opts->resources); } int parse_options_memory_exhausted(Parse_Options opts) { return resources_memory_exhausted(opts->resources); } int parse_options_resources_exhausted(Parse_Options opts) { return (resources_timer_expired(opts->resources) || resources_memory_exhausted(opts->resources)); } void parse_options_reset_resources(Parse_Options opts) { resources_reset(opts->resources); } /*************************************************************** * * Routines for manipulating Dictionary * ****************************************************************/ /* Units will typically have a ".u" at the end. Get * rid of it, as otherwise stipping is messed up. */ static inline char * deinflect(const char * str) { char * s = strdup(str); char * p = strchr(s, '.'); if (p && p != s) *p = 0x0; return s; } static void affix_list_create(Dictionary dict) { int i, j, k, l, m; int r_strippable=0, l_strippable=0, u_strippable=0; int s_strippable=0, p_strippable=0; Dict_node * dn, * dn2, * start_dn; const char * rpunc_con = "RPUNC"; const char * lpunc_con = "LPUNC"; const char * units_con = "UNITS"; /* Hmm SUF and PRE do not seem to be used at this time ... */ const char * suf_con = "SUF"; const char * pre_con = "PRE"; dict->strip_left = NULL; dict->strip_right = NULL; dict->strip_units = NULL; dict->prefix = NULL; dict->suffix = NULL; /* Load affixes from the affix table. */ start_dn = list_whole_dictionary(dict->root, NULL); for (dn = start_dn; dn != NULL; dn = dn->right) { if (word_has_connector(dn, rpunc_con, 0)) r_strippable++; if (word_has_connector(dn, lpunc_con, 0)) l_strippable++; if (word_has_connector(dn, units_con, 0)) u_strippable++; if (word_has_connector(dn, suf_con, 0)) s_strippable++; if (word_has_connector(dn, pre_con, 0)) p_strippable++; } dict->strip_right = (const char **) xalloc(r_strippable * sizeof(char *)); dict->strip_left = (const char **) xalloc(l_strippable * sizeof(char *)); dict->strip_units = (const char **) xalloc(u_strippable * sizeof(char *)); dict->suffix = (const char **) xalloc(s_strippable * sizeof(char *)); dict->prefix = (const char **) xalloc(p_strippable * sizeof(char *)); dict->r_strippable = r_strippable; dict->l_strippable = l_strippable; dict->u_strippable = u_strippable; dict->p_strippable = p_strippable; dict->s_strippable = s_strippable; i = 0; j = 0; k = 0; l = 0; m = 0; dn = start_dn; while (dn != NULL) { if (word_has_connector(dn, rpunc_con, 0)) { dict->strip_right[i] = deinflect(dn->string); i++; } if (word_has_connector(dn, lpunc_con, 0)) { dict->strip_left[j] = deinflect(dn->string); j++; } if (word_has_connector(dn, units_con, 0)) { dict->strip_units[m] = deinflect(dn->string); m++; } if (word_has_connector(dn, suf_con, 0)) { dict->suffix[k] = dn->string; k++; } if (word_has_connector(dn, pre_con, 0)) { dict->prefix[l] = dn->string; l++; } dn2 = dn->right; dn->right = NULL; xfree(dn, sizeof(Dict_node)); dn = dn2; } } static void affix_list_delete(Dictionary dict) { int i; for (i=0; il_strippable; i++) { free((char *)dict->strip_left[i]); } for (i=0; ir_strippable; i++) { free((char *)dict->strip_right[i]); } for (i=0; iu_strippable; i++) { free((char *)dict->strip_units[i]); } xfree(dict->strip_right, dict->r_strippable * sizeof(char *)); xfree(dict->strip_left, dict->l_strippable * sizeof(char *)); xfree(dict->strip_units, dict->u_strippable * sizeof(char *)); xfree(dict->suffix, dict->s_strippable * sizeof(char *)); xfree(dict->prefix, dict->p_strippable * sizeof(char *)); } /** * The following function is dictionary_create with an extra * paramater called "path". If this is non-null, then the path * used to find the file is taken from that path. Otherwise, * the path is taken from the dict_name. This is only needed * because an affix_file is opened by a recursive call to this * function. */ static Dictionary dictionary_six(const char * lang, const char * dict_name, const char * pp_name, const char * cons_name, const char * affix_name, const char * regex_name) { const char * t; Dictionary dict; Dict_node *dict_node; init_memusage(); dict = (Dictionary) xalloc(sizeof(struct Dictionary_s)); memset(dict, 0, sizeof(struct Dictionary_s)); dict->string_set = string_set_create(); dict->lang = lang; t = strrchr (lang, '/'); if (t) dict->lang = string_set_add(t+1, dict->string_set); dict->name = string_set_add(dict_name, dict->string_set); dict->max_cost = 1000; dict->num_entries = 0; dict->is_special = FALSE; dict->already_got_it = '\0'; dict->line_number = 1; dict->root = NULL; dict->word_file_header = NULL; dict->exp_list = NULL; dict->affix_table = NULL; dict->recursive_error = FALSE; /* To disable spell-checking, just set the cheker to NULL */ dict->spell_checker = spellcheck_create(dict->lang); dict->fp = dictopen(dict->name, "r"); if (dict->fp == NULL) { prt_error("Error: Could not open dictionary %s\n", dict_name); goto failure; } if (!read_dictionary(dict)) { fclose(dict->fp); goto failure; } fclose(dict->fp); dict->affix_table = NULL; if (affix_name != NULL) { dict->affix_table = dictionary_six(lang, affix_name, NULL, NULL, NULL, NULL); if (dict->affix_table == NULL) { goto failure; } affix_list_create(dict->affix_table); } dict->regex_root = NULL; if (regex_name != NULL) { int rc; rc = read_regex_file(dict, regex_name); if (rc) goto failure; rc = compile_regexs(dict); if (rc) goto failure; } #if USE_CORPUS dict->corpus = NULL; if (affix_name != NULL) /* Don't do this for the second time */ { dict->corpus = lg_corpus_new(); } #endif dict->left_wall_defined = boolean_dictionary_lookup(dict, LEFT_WALL_WORD); dict->right_wall_defined = boolean_dictionary_lookup(dict, RIGHT_WALL_WORD); dict->postprocessor = post_process_open(pp_name); dict->constituent_pp = post_process_open(cons_name); dict->unknown_word_defined = boolean_dictionary_lookup(dict, UNKNOWN_WORD); dict->use_unknown_word = TRUE; #if DONT_USE_REGEX_GUESSING dict->capitalized_word_defined = boolean_dictionary_lookup(dict, PROPER_WORD); dict->pl_capitalized_word_defined = boolean_dictionary_lookup(dict, PL_PROPER_WORD); dict->hyphenated_word_defined = boolean_dictionary_lookup(dict, HYPHENATED_WORD); dict->number_word_defined = boolean_dictionary_lookup(dict, NUMBER_WORD); dict->ing_word_defined = boolean_dictionary_lookup(dict, ING_WORD); dict->s_word_defined = boolean_dictionary_lookup(dict, S_WORD); dict->ed_word_defined = boolean_dictionary_lookup(dict, ED_WORD); dict->ly_word_defined = boolean_dictionary_lookup(dict, LY_WORD); #endif /* DONT_USE_REGEX_GUESSING */ if ((dict_node = dictionary_lookup_list(dict, ANDABLE_CONNECTORS_WORD)) != NULL) { dict->andable_connector_set = connector_set_create(dict_node->exp); } else { dict->andable_connector_set = NULL; } free_lookup_list(dict_node); if ((dict_node = dictionary_lookup_list(dict, UNLIMITED_CONNECTORS_WORD)) != NULL) { dict->unlimited_connector_set = connector_set_create(dict_node->exp); } else { dict->unlimited_connector_set = NULL; } free_lookup_list(dict_node); return dict; failure: string_set_delete(dict->string_set); xfree(dict, sizeof(struct Dictionary_s)); return NULL; } Dictionary dictionary_create(const char * dict_name, const char * pp_name, const char * cons_name, const char * affix_name) { return dictionary_six("en", dict_name, pp_name, cons_name, affix_name, NULL); } Dictionary dictionary_create_lang(const char * lang) { Dictionary dictionary; if(lang && *lang) { char * dict_name; char * pp_name; char * cons_name; char * affix_name; char * regex_name; dict_name = join_path(lang, "4.0.dict"); pp_name = join_path(lang, "4.0.knowledge"); cons_name = join_path(lang, "4.0.constituent-knowledge"); affix_name = join_path(lang, "4.0.affix"); regex_name = join_path(lang, "4.0.regex"); dictionary = dictionary_six(lang, dict_name, pp_name, cons_name, affix_name, regex_name); free(regex_name); free(affix_name); free(cons_name); free(pp_name); free(dict_name); } else { prt_error("Error: No language specified!\n"); dictionary = NULL; } return dictionary; } Dictionary dictionary_create_default_lang(void) { Dictionary dictionary; char * lang; lang = get_default_locale(); if(lang && *lang) { dictionary = dictionary_create_lang(lang); free(lang); } else { /* Default to en when locales are broken (e.g. WIN32) */ dictionary = dictionary_create_lang("en"); } return dictionary; } int dictionary_delete(Dictionary dict) { if (verbosity > 0) { prt_error("Info: Freeing dictionary %s\n", dict->name); } #if USE_CORPUS lg_corpus_delete(dict->corpus); #endif if (dict->affix_table != NULL) { affix_list_delete(dict->affix_table); dictionary_delete(dict->affix_table); } spellcheck_destroy(dict->spell_checker); connector_set_delete(dict->andable_connector_set); connector_set_delete(dict->unlimited_connector_set); post_process_close(dict->postprocessor); post_process_close(dict->constituent_pp); string_set_delete(dict->string_set); free_regexs(dict); free_dictionary(dict); xfree(dict, sizeof(struct Dictionary_s)); return 0; } int dictionary_get_max_cost(Dictionary dict) { return dict->max_cost; } /*************************************************************** * * Routines for postprocessing * ****************************************************************/ static Linkage_info * linkage_info_new(int num_to_alloc) { Linkage_info *link_info; link_info = (Linkage_info *) xalloc(num_to_alloc * sizeof(Linkage_info)); memset(link_info, 0, num_to_alloc * sizeof(Linkage_info)); return link_info; } static void linkage_info_delete(Linkage_info *link_info, int sz) { int i,j; for (i=0; inwords; for (j=0; jdisjunct_list_str[j]) free(lifo->disjunct_list_str[j]); } free(lifo->disjunct_list_str); #ifdef USE_CORPUS lg_sense_delete(lifo); #endif } xfree(link_info, sz); } static void free_andlists(Sentence sent) { int L; Andlist * andlist, * next; for(L=0; Lnum_linkages_post_processed; L++) { /* printf("%d ", sent->link_info[L].canonical); */ /* if (sent->link_info[L].canonical==0) continue; */ andlist = sent->link_info[L].andlist; while(1) { if(andlist == NULL) break; next = andlist->next; xfree((char *) andlist, sizeof(Andlist)); andlist = next; } } /* printf("\n"); */ } static void free_post_processing(Sentence sent) { if (sent->link_info != NULL) { /* postprocessing must have been done */ free_andlists(sent); linkage_info_delete(sent->link_info, sent->num_linkages_alloced); sent->link_info = NULL; } } static void post_process_linkages(Sentence sent, Parse_Options opts) { int *indices; int in, block_bottom, block_top; int N_linkages_found, N_linkages_alloced; int N_linkages_post_processed, N_valid_linkages; int N_thin_linkages; int overflowed, only_canonical_allowed; Linkage_info *link_info; int canonical; free_post_processing(sent); overflowed = build_parse_set(sent, sent->null_count, opts); print_time(opts, "Built parse set"); if (overflowed && (1 < opts->verbosity)) { err_ctxt ec; ec.sent = sent; err_msg(&ec, Warn, "Warning: Count overflow.\n" "Considering a random subset of %d of an unknown and large number of linkages\n", opts->linkage_limit); } N_linkages_found = sent->num_linkages_found; if (sent->num_linkages_found == 0) { sent->num_linkages_alloced = 0; sent->num_linkages_post_processed = 0; sent->num_valid_linkages = 0; sent->num_thin_linkages = 0; sent->link_info = NULL; return; } if (N_linkages_found > opts->linkage_limit) { N_linkages_alloced = opts->linkage_limit; if (opts->verbosity > 1) { err_ctxt ec; ec.sent = sent; err_msg(&ec, Warn, "Warning: Considering a random subset of %d of %d linkages\n", N_linkages_alloced, N_linkages_found); } } else { N_linkages_alloced = N_linkages_found; } link_info = linkage_info_new(N_linkages_alloced); N_valid_linkages = 0; /* Generate an array of linkage indices to examine */ indices = (int *) xalloc(N_linkages_alloced * sizeof(int)); if (overflowed) { for (in=0; in < N_linkages_alloced; in++) { indices[in] = -(in+1); } } else { sent->rand_state = N_linkages_found + sent->length; for (in=0; inrand_state) % (block_top-block_bottom)); } } only_canonical_allowed = !(overflowed || (N_linkages_found > 2*opts->linkage_limit)); /* When we're processing only a small subset of the linkages, * don't worry about restricting the set we consider to be * canonical ones. In the extreme case where we are only * generating 1 in a million linkages, it's very unlikely * that we'll hit two symmetric variants of the same linkage * anyway. */ /* (optional) first pass: just visit the linkages */ /* The purpose of these two passes is to make the post-processing * more efficient. Because (hopefully) by the time you do the * real work in the 2nd pass you've pruned the relevant rule set * in the first pass. */ if (sent->length >= opts->twopass_length) { for (in=0; (in < N_linkages_alloced) && (!resources_exhausted(opts->resources)); in++) { extract_links(indices[in], sent->null_count, sent->parse_info); if (set_has_fat_down(sent)) { if (only_canonical_allowed && !is_canonical_linkage(sent)) continue; analyze_fat_linkage(sent, opts, PP_FIRST_PASS); } else { analyze_thin_linkage(sent, opts, PP_FIRST_PASS); } } } /* second pass: actually perform post-processing */ N_linkages_post_processed = 0; N_thin_linkages = 0; for (in=0; (in < N_linkages_alloced) && (!resources_exhausted(opts->resources)); in++) { Linkage_info *lifo = &link_info[N_linkages_post_processed]; extract_links(indices[in], sent->null_count, sent->parse_info); if (set_has_fat_down(sent)) { canonical = is_canonical_linkage(sent); if (only_canonical_allowed && !canonical) continue; *lifo = analyze_fat_linkage(sent, opts, PP_SECOND_PASS); lifo->fat = TRUE; lifo->canonical = canonical; } else { *lifo = analyze_thin_linkage(sent, opts, PP_SECOND_PASS); lifo->fat = FALSE; lifo->canonical = TRUE; } if (0 == lifo->N_violations) { N_valid_linkages++; if (FALSE == lifo->fat) N_thin_linkages++; } lifo->index = indices[in]; lg_corpus_score(sent, lifo); N_linkages_post_processed++; } print_time(opts, "Postprocessed all linkages"); qsort((void *)link_info, N_linkages_post_processed, sizeof(Linkage_info), (int (*)(const void *, const void *)) opts->cost_model.compare_fn); if (!resources_exhausted(opts->resources)) { if ((N_linkages_post_processed == 0) && (N_linkages_found > 0) && (N_linkages_found < opts->linkage_limit)) { /* With the current parser, the following sentence will elicit * this error: * * Well, say, Joe, you can be Friar Tuck or Much the miller's * son, and lam me with a quarter-staff; or I'll be the Sheriff * of Nottingham and you be Robin Hood a little while and kill * me. */ err_ctxt ec; ec.sent = sent; err_msg(&ec, Error, "Error: None of the linkages is canonical\n" "\tN_linkages_post_processed=%d " "N_linkages_found=%d\n", N_linkages_post_processed, N_linkages_found); } } if (opts->verbosity > 1) { err_ctxt ec; ec.sent = sent; err_msg(&ec, Info, "Info: %d of %d linkages with no P.P. violations\n", N_valid_linkages, N_linkages_post_processed); } print_time(opts, "Sorted all linkages"); sent->num_linkages_alloced = N_linkages_alloced; sent->num_linkages_post_processed = N_linkages_post_processed; sent->num_valid_linkages = N_valid_linkages; sent->num_thin_linkages = N_thin_linkages; sent->link_info = link_info; xfree(indices, N_linkages_alloced * sizeof(int)); /*if(N_valid_linkages == 0) free_andlists(sent); */ } /*************************************************************** * * Routines for creating and destroying processing Sentences * ****************************************************************/ Sentence sentence_create(const char *input_string, Dictionary dict) { Sentence sent; sent = (Sentence) xalloc(sizeof(struct Sentence_s)); memset(sent, 0, sizeof(struct Sentence_s)); sent->dict = dict; sent->length = 0; sent->num_linkages_found = 0; sent->num_linkages_alloced = 0; sent->num_linkages_post_processed = 0; sent->num_valid_linkages = 0; sent->link_info = NULL; sent->deletable = NULL; sent->effective_dist = NULL; sent->num_valid_linkages = 0; sent->null_count = 0; sent->parse_info = NULL; sent->string_set = string_set_create(); sent->q_pruned_rules = FALSE; sent->is_conjunction = NULL; sent->dptr = NULL; sent->deletable = NULL; /* Make a copy of the input */ sent->orig_sentence = string_set_add (input_string, sent->string_set); return sent; } /* XXX Extreme hack alert -- English-language words are used * completely naked in the C source code!!! FIXME !!!! */ static void set_is_conjunction(Sentence sent) { int w; char * s; for (w=0; wlength; w++) { s = sent->word[w].string; sent->is_conjunction[w] = (strcmp(s, "and")==0) || (strcmp(s, "or" )==0) || (strcmp(s, "but")==0) || (strcmp(s, "nor")==0); } } int sentence_split(Sentence sent, Parse_Options opts) { int i; Dictionary dict = sent->dict; /* Cleanup stuff previously allocated. This is because some free * routines depend on sent-length, which might change in different * parse-opts settings. */ free_deletable(sent); /* Tokenize */ if (!separate_sentence(sent, opts)) { return -1; } sent->q_pruned_rules = FALSE; /* for post processing */ sent->is_conjunction = (char *) xalloc(sizeof(char)*sent->length); set_is_conjunction(sent); initialize_conjunction_tables(sent); for (i=0; ilength; i++) { /* in case we free these before they set to anything else */ sent->word[i].x = NULL; sent->word[i].d = NULL; } if (!(dict->unknown_word_defined && dict->use_unknown_word)) { if (!sentence_in_dictionary(sent)) { return -2; } } /* Look up each word in the dictionary, collect up all * plausible disjunct expressions for each word. */ if (!build_sentence_expressions(sent, opts)) { sent->num_valid_linkages = 0; return -3; } return 0; } void sentence_delete(Sentence sent) { if (!sent) return; sat_sentence_delete(sent); /* free_andlists(sent); */ free_sentence_disjuncts(sent); free_sentence_expressions(sent); string_set_delete(sent->string_set); if (sent->parse_info) free_parse_info(sent->parse_info); free_post_processing(sent); post_process_close_sentence(sent->dict->postprocessor); free_deletable(sent); free_effective_dist(sent); free_count(sent); free_analyze(sent); if (sent->is_conjunction) xfree(sent->is_conjunction, sizeof(char)*sent->length); xfree((char *) sent, sizeof(struct Sentence_s)); } int sentence_length(Sentence sent) { if (!sent) return 0; return sent->length; } const char * sentence_get_word(Sentence sent, int index) { if (!sent) return NULL; return sent->word[index].string; } const char * sentence_get_nth_word(Sentence sent, int index) { if (!sent) return NULL; return sent->word[index].string; } int sentence_null_count(Sentence sent) { if (!sent) return 0; return sent->null_count; } int sentence_num_thin_linkages(Sentence sent) { if (!sent) return 0; return sent->num_thin_linkages; } int sentence_num_linkages_found(Sentence sent) { if (!sent) return 0; return sent->num_linkages_found; } int sentence_num_valid_linkages(Sentence sent) { if (!sent) return 0; return sent->num_valid_linkages; } int sentence_num_linkages_post_processed(Sentence sent) { if (!sent) return 0; return sent->num_linkages_post_processed; } int sentence_num_violations(Sentence sent, int i) { if (!sent) return 0; /* The sat solver (currently) fails to fill in link_info */ if (!sent->link_info) return 0; return sent->link_info[i].N_violations; } int sentence_and_cost(Sentence sent, int i) { if (!sent) return 0; /* The sat solver (currently) fails to fill in link_info */ if (!sent->link_info) return 0; return sent->link_info[i].and_cost; } int sentence_disjunct_cost(Sentence sent, int i) { if (!sent) return 0; /* The sat solver (currently) fails to fill in link_info */ if (!sent->link_info) return 0; return sent->link_info[i].disjunct_cost; } int sentence_link_cost(Sentence sent, int i) { if (!sent) return 0; /* The sat solver (currently) fails to fill in link_info */ if (!sent->link_info) return 0; return sent->link_info[i].link_cost; } int sentence_nth_word_has_disjunction(Sentence sent, int i) { if (!sent) return 0; prt_error("Warning: sentence_nth_word_has_disjunction() is deprecated!\n"); return (sent->parse_info->chosen_disjuncts[i] != NULL); } static void chart_parse(Sentence sent, Parse_Options opts) { int nl; /* Build lists of disjuncts */ prepare_to_parse(sent, opts); init_fast_matcher(sent); init_count(sent); /* A parse set may have been already been built for this sentence, * if it was previously parsed. If so we free it up before * building another. */ if (sent->parse_info) free_parse_info(sent->parse_info); sent->parse_info = parse_info_new(sent->length); for (nl = opts->min_null_count; nl<=opts->max_null_count ; ++nl) { s64 total; if (resources_exhausted(opts->resources)) break; sent->null_count = nl; total = do_parse(sent, sent->null_count, opts); if (verbosity > 1) { prt_error("Info: Total count with %d null links: %lld\n", sent->null_count, total); } /* Give up if the parse count is overflowing */ if (PARSE_NUM_OVERFLOW < total) { if (verbosity > 0) { prt_error("WARNING: Combinatorial explosion! nulls=%d cnt=%lld\n" "Consider retrying the parse with the max allowed disjunct cost set lower.\n", sent->null_count, total); } total = (total>INT_MAX) ? INT_MAX : total; } sent->num_linkages_found = (int) total; print_time(opts, "Counted parses"); post_process_linkages(sent, opts); if (sent->num_valid_linkages > 0) break; /* If we are here, then no valid linakges were found. * If there was a parse overflow, give up now. */ if (PARSE_NUM_OVERFLOW < total) break; } free_count(sent); free_fast_matcher(sent); } int sentence_parse(Sentence sent, Parse_Options opts) { int rc; verbosity = opts->verbosity; /* If the sentence has not yet been split, do so now. * This is for backwards compatibility, for existing programs * that do not explicitly call the splitter. */ if (0 == sent->length) { rc = sentence_split(sent, opts); if (rc) return -1; } /* Check for bad sentence length */ if (MAX_SENTENCE <= sent->length) { prt_error("Error: sentence too long, contains more than %d words\n", MAX_SENTENCE); return -2; } /* Initialize/free any leftover garbage */ free_sentence_disjuncts(sent); resources_reset_space(opts->resources); if (resources_exhausted(opts->resources)) { sent->num_valid_linkages = 0; return 0; } init_analyze(sent); /* Expressions were previously set up during the tokenize stage. */ expression_prune(sent); print_time(opts, "Finished expression pruning"); if (opts->use_sat_solver) { sat_parse(sent, opts); } else { chart_parse(sent, opts); } print_time(opts, "Finished parse"); return sent->num_valid_linkages; } /*************************************************************** * * Routines which allow user access to Linkages. * ****************************************************************/ Linkage linkage_create(int k, Sentence sent, Parse_Options opts) { Linkage linkage; if (opts->use_sat_solver) { return sat_create_linkage(k, sent, opts); } if ((k >= sent->num_linkages_post_processed) || (k < 0)) return NULL; /* Using exalloc since this is external to the parser itself. */ linkage = (Linkage) exalloc(sizeof(struct Linkage_s)); linkage->num_words = sent->length; linkage->word = (const char **) exalloc(linkage->num_words*sizeof(char *)); linkage->current = 0; linkage->num_sublinkages=0; linkage->sublinkage = NULL; linkage->unionized = FALSE; linkage->sent = sent; linkage->opts = opts; linkage->info = &sent->link_info[k]; linkage->dis_con_tree = NULL; extract_links(sent->link_info[k].index, sent->null_count, sent->parse_info); compute_chosen_words(sent, linkage); if (set_has_fat_down(sent)) { extract_fat_linkage(sent, opts, linkage); } else { extract_thin_linkage(sent, opts, linkage); } if (sent->dict->postprocessor != NULL) { linkage_post_process(linkage, sent->dict->postprocessor); } return linkage; } int linkage_get_current_sublinkage(Linkage linkage) { return linkage->current; } int linkage_set_current_sublinkage(Linkage linkage, int index) { if ((index < 0) || (index >= linkage->num_sublinkages)) { return 0; } linkage->current = index; return 1; } static void exfree_pp_info(PP_info *ppi) { if (ppi->num_domains > 0) exfree(ppi->domain_name, sizeof(const char *)*ppi->num_domains); ppi->domain_name = NULL; ppi->num_domains = 0; } void linkage_delete(Linkage linkage) { int i, j; Sublinkage *s; /* Can happen on panic timeout or user error */ if (NULL == linkage) return; for (i=0; inum_words; ++i) { exfree((void *) linkage->word[i], strlen(linkage->word[i])+1); } exfree(linkage->word, sizeof(char *)*linkage->num_words); for (i=0; inum_sublinkages; ++i) { s = &(linkage->sublinkage[i]); for (j=0; jnum_links; ++j) { exfree_link(s->link[j]); } exfree(s->link, sizeof(Link)*s->num_links); if (s->pp_info != NULL) { for (j=0; jnum_links; ++j) { exfree_pp_info(&s->pp_info[j]); } exfree(s->pp_info, sizeof(PP_info)*s->num_links); s->pp_info = NULL; post_process_free_data(&s->pp_data); } if (s->violation != NULL) { exfree((void *) s->violation, sizeof(char)*(strlen(s->violation)+1)); } } exfree(linkage->sublinkage, sizeof(Sublinkage)*linkage->num_sublinkages); if (linkage->dis_con_tree) free_DIS_tree(linkage->dis_con_tree); exfree(linkage, sizeof(struct Linkage_s)); } static int links_are_equal(Link *l, Link *m) { return ((l->l == m->l) && (l->r == m->r) && (strcmp(l->name, m->name)==0)); } static int link_already_appears(Linkage linkage, Link *link, int a) { int i, j; for (i=0; isublinkage[i].num_links; ++j) { if (links_are_equal(linkage->sublinkage[i].link[j], link)) return TRUE; } } return FALSE; } static PP_info excopy_pp_info(PP_info ppi) { PP_info newppi; int i; newppi.num_domains = ppi.num_domains; newppi.domain_name = (const char **) exalloc(sizeof(const char *)*ppi.num_domains); for (i=0; inum_sublinkages; ++i) { for (j=0; jsublinkage[i].num_links; ++j) { link = linkage->sublinkage[i].link[j]; if (!link_already_appears(linkage, link, i)) num_in_union++; } } u.link = (Link **) exalloc(sizeof(Link *)*num_in_union); u.num_links = num_in_union; zero_sublinkage(&u); u.pp_info = (PP_info *) exalloc(sizeof(PP_info)*num_in_union); u.violation = NULL; u.num_links = num_in_union; num_in_union = 0; for (i=0; inum_sublinkages; ++i) { for (j=0; jsublinkage[i].num_links; ++j) { link = linkage->sublinkage[i].link[j]; if (!link_already_appears(linkage, link, i)) { u.link[num_in_union] = excopy_link(link); u.pp_info[num_in_union] = excopy_pp_info(linkage->sublinkage[i].pp_info[j]); if (((p=linkage->sublinkage[i].violation) != NULL) && (u.violation == NULL)) { char *s = (char *) exalloc((strlen(p)+1)*sizeof(char)); strcpy(s, p); u.violation = s; } num_in_union++; } } } return u; } int linkage_compute_union(Linkage linkage) { int i, num_subs=linkage->num_sublinkages; Sublinkage * new_sublinkage, *s; if (linkage->unionized) { linkage->current = linkage->num_sublinkages-1; return 0; } if (num_subs == 1) { linkage->unionized = TRUE; return 1; } new_sublinkage = (Sublinkage *) exalloc(sizeof(Sublinkage)*(num_subs+1)); for (i=0; isublinkage[i]; } exfree(linkage->sublinkage, sizeof(Sublinkage)*num_subs); linkage->sublinkage = new_sublinkage; /* Zero out the new sublinkage, then unionize it. */ s = &new_sublinkage[num_subs]; s->link = NULL; s->num_links = 0; zero_sublinkage(s); linkage->sublinkage[num_subs] = unionize_linkage(linkage); linkage->num_sublinkages++; linkage->unionized = TRUE; linkage->current = linkage->num_sublinkages-1; return 1; } int linkage_get_num_sublinkages(Linkage linkage) { return linkage->num_sublinkages; } int linkage_get_num_words(Linkage linkage) { return linkage->num_words; } int linkage_get_num_links(Linkage linkage) { int current = linkage->current; return linkage->sublinkage[current].num_links; } static inline int verify_link_index(Linkage linkage, int index) { if ((index < 0) || (index >= linkage->sublinkage[linkage->current].num_links)) { return 0; } return 1; } int linkage_get_link_length(Linkage linkage, int index) { Link *link; int word_has_link[MAX_SENTENCE]; int i, length; int current = linkage->current; if (!verify_link_index(linkage, index)) return -1; for (i=0; inum_words+1; ++i) { word_has_link[i] = FALSE; } for (i=0; isublinkage[current].num_links; ++i) { link = linkage->sublinkage[current].link[i]; word_has_link[link->l] = TRUE; word_has_link[link->r] = TRUE; } link = linkage->sublinkage[current].link[index]; length = link->r - link->l; for (i= link->l+1; i < link->r; ++i) { if (!word_has_link[i]) length--; } return length; } int linkage_get_link_lword(Linkage linkage, int index) { Link *link; if (!verify_link_index(linkage, index)) return -1; link = linkage->sublinkage[linkage->current].link[index]; return link->l; } int linkage_get_link_rword(Linkage linkage, int index) { Link *link; if (!verify_link_index(linkage, index)) return -1; link = linkage->sublinkage[linkage->current].link[index]; return link->r; } const char * linkage_get_link_label(Linkage linkage, int index) { Link *link; if (!verify_link_index(linkage, index)) return NULL; link = linkage->sublinkage[linkage->current].link[index]; return link->name; } const char * linkage_get_link_llabel(Linkage linkage, int index) { Link *link; if (!verify_link_index(linkage, index)) return NULL; link = linkage->sublinkage[linkage->current].link[index]; return link->lc->string; } const char * linkage_get_link_rlabel(Linkage linkage, int index) { Link *link; if (!verify_link_index(linkage, index)) return NULL; link = linkage->sublinkage[linkage->current].link[index]; return link->rc->string; } const char ** linkage_get_words(Linkage linkage) { return linkage->word; } Sentence linkage_get_sentence(Linkage linkage) { return linkage->sent; } const char * linkage_get_disjunct_str(Linkage linkage, int w) { Disjunct *dj; if (NULL == linkage->info->disjunct_list_str) { lg_compute_disjunct_strings(linkage->sent, linkage->info); } /* dj will be null if the word wasn't used in the parse. */ dj = linkage->sent->parse_info->chosen_disjuncts[w]; if (NULL == dj) return ""; return linkage->info->disjunct_list_str[w]; } double linkage_get_disjunct_cost(Linkage linkage, int w) { Disjunct *dj = linkage->sent->parse_info->chosen_disjuncts[w]; /* dj may be null, if the word didn't participate in the parse. */ if (dj) return dj->cost; return 0.0; } double linkage_get_disjunct_corpus_score(Linkage linkage, int w) { Disjunct *dj = linkage->sent->parse_info->chosen_disjuncts[w]; /* dj may be null, if the word didn't participate in the parse. */ if (NULL == dj) return 99.999; return lg_corpus_disjunct_score(linkage, w); } const char * linkage_get_word(Linkage linkage, int w) { return linkage->word[w]; } int linkage_unused_word_cost(Linkage linkage) { /* The sat solver (currently) fails to fill in info */ if (!linkage->info) return 0; return linkage->info->unused_word_cost; } int linkage_disjunct_cost(Linkage linkage) { /* The sat solver (currently) fails to fill in info */ if (!linkage->info) return 0; return (int) floorf(linkage->info->disjunct_cost); } int linkage_is_fat(Linkage linkage) { /* The sat solver (currently) fails to fill in info */ if (!linkage->info) return 0; return linkage->info->fat; } int linkage_and_cost(Linkage linkage) { /* The sat solver (currently) fails to fill in info */ if (!linkage->info) return 0; return linkage->info->and_cost; } int linkage_link_cost(Linkage linkage) { /* The sat solver (currently) fails to fill in info */ if (!linkage->info) return 0; return linkage->info->link_cost; } double linkage_corpus_cost(Linkage linkage) { /* The sat solver (currently) fails to fill in info */ if (!linkage->info) return 0.0; return linkage->info->corpus_cost; } int linkage_get_link_num_domains(Linkage linkage, int index) { PP_info *pp_info; if (!verify_link_index(linkage, index)) return -1; pp_info = &linkage->sublinkage[linkage->current].pp_info[index]; return pp_info->num_domains; } const char ** linkage_get_link_domain_names(Linkage linkage, int index) { PP_info *pp_info; if (!verify_link_index(linkage, index)) return NULL; pp_info = &linkage->sublinkage[linkage->current].pp_info[index]; return pp_info->domain_name; } const char * linkage_get_violation_name(Linkage linkage) { return linkage->sublinkage[linkage->current].violation; } int linkage_is_canonical(Linkage linkage) { /* The sat solver (currently) fails to fill in info */ if (!linkage->info) return TRUE; return linkage->info->canonical; } int linkage_is_improper(Linkage linkage) { /* The sat solver (currently) fails to fill in info */ if (!linkage->info) return FALSE; return linkage->info->improper_fat_linkage; } int linkage_has_inconsistent_domains(Linkage linkage) { /* The sat solver (currently) fails to fill in info */ if (!linkage->info) return FALSE; return linkage->info->inconsistent_domains; } void linkage_post_process(Linkage linkage, Postprocessor * postprocessor) { int N_sublinkages = linkage_get_num_sublinkages(linkage); Parse_Options opts = linkage->opts; Sentence sent = linkage->sent; Sublinkage * subl; PP_node * pp; int i, j, k; D_type_list * d; for (i = 0; i < N_sublinkages; ++i) { subl = &linkage->sublinkage[i]; if (subl->pp_info != NULL) { for (j = 0; j < subl->num_links; ++j) { exfree_pp_info(&subl->pp_info[j]); } post_process_free_data(&subl->pp_data); exfree(subl->pp_info, sizeof(PP_info)*subl->num_links); } subl->pp_info = (PP_info *) exalloc(sizeof(PP_info)*subl->num_links); for (j = 0; j < subl->num_links; ++j) { subl->pp_info[j].num_domains = 0; subl->pp_info[j].domain_name = NULL; } if (subl->violation != NULL) { exfree((void *)subl->violation, sizeof(char)*(strlen(subl->violation)+1)); subl->violation = NULL; } if (linkage->info->improper_fat_linkage) { pp = NULL; } else { pp = post_process(postprocessor, opts, sent, subl, FALSE); /* This can return NULL, for example if there is no post-processor */ } if (pp == NULL) { for (j = 0; j < subl->num_links; ++j) { subl->pp_info[j].num_domains = 0; subl->pp_info[j].domain_name = NULL; } } else { for (j = 0; j < subl->num_links; ++j) { k = 0; for (d = pp->d_type_array[j]; d != NULL; d = d->next) k++; subl->pp_info[j].num_domains = k; if (k > 0) { subl->pp_info[j].domain_name = (const char **) exalloc(sizeof(const char *)*k); } k = 0; for (d = pp->d_type_array[j]; d != NULL; d = d->next) { char buff[5]; sprintf(buff, "%c", d->type); subl->pp_info[j].domain_name[k] = string_set_add (buff, sent->string_set); k++; } } subl->pp_data = postprocessor->pp_data; if (pp->violation != NULL) { char * s = (char *) exalloc(sizeof(char)*(strlen(pp->violation)+1)); strcpy(s, pp->violation); subl->violation = s; } } } post_process_close_sentence(postprocessor); } link-grammar-4.7.4/link-grammar/word-utils.c0000644000175000017500000003121411526022265017751 0ustar bloombloom/*************************************************************************/ /* Copyright (c) 2004 */ /* Daniel Sleator, David Temperley, and John Lafferty */ /* All rights reserved */ /* */ /* Use of the link grammar parsing system is subject to the terms of the */ /* license set forth in the LICENSE file included with this software, */ /* and also available at http://www.link.cs.cmu.edu/link/license.html */ /* This license allows free redistribution and use in source and binary */ /* forms, with or without modification, subject to certain conditions. */ /* */ /*************************************************************************/ /* * Miscellaneous utilities for dealing with word types. */ #include #include #include #include "disjunct-utils.h" #include "word-utils.h" /* ======================================================== */ /* Exp utilities ... */ void free_E_list(E_list *); void free_Exp(Exp * e) { if (e->type != CONNECTOR_type) { free_E_list(e->u.l); } xfree((char *)e, sizeof(Exp)); } void free_E_list(E_list * l) { if (l == NULL) return; free_E_list(l->next); free_Exp(l->e); xfree((char *)l, sizeof(E_list)); } /* Returns the number of connectors in the expression e */ int size_of_expression(Exp * e) { int size; E_list * l; if (e->type == CONNECTOR_type) return 1; size = 0; for (l=e->u.l; l!=NULL; l=l->next) { size += size_of_expression(l->e); } return size; } /** * Build a copy of the given expression (don't copy strings, of course) */ static E_list * copy_E_list(E_list * l); Exp * copy_Exp(Exp * e) { Exp * n; if (e == NULL) return NULL; n = (Exp *) xalloc(sizeof(Exp)); *n = *e; if (e->type != CONNECTOR_type) { n->u.l = copy_E_list(e->u.l); } return n; } static E_list * copy_E_list(E_list * l) { E_list * nl; if (l == NULL) return NULL; nl = (E_list *) xalloc(sizeof(E_list)); nl->next = copy_E_list(l->next); nl->e = copy_Exp(l->e); return nl; } /** * Compare two expressions, return 1 for equal, 0 for unequal */ static int exp_compare(Exp * e1, Exp * e2) { E_list *el1, *el2; if ((e1 == NULL) && (e2 == NULL)) return 1; /* they are equal */ if ((e1 == NULL) || (e2 == NULL)) return 0; /* they are not equal */ if (e1->type != e2->type) return 0; if (fabs (e1->cost - e2->cost) > 0.001) return 0; if (e1->type == CONNECTOR_type) { if (e1->dir != e2->dir) return 0; /* printf("%s %s\n",e1->u.string,e2->u.string); */ if (strcmp(e1->u.string,e2->u.string)!=0) return 0; } else { el1 = e1->u.l; el2 = e2->u.l; /* while at least 1 is non-null */ for (;(el1!=NULL)||(el2!=NULL);) { /*fail if 1 is null */ if ((el1==NULL)||(el2==NULL)) return 0; /* fail if they are not compared */ if (exp_compare(el1->e, el2->e) == 0) return 0; if (el1!=NULL) el1 = el1->next; if (el2!=NULL) el2 = el2->next; } } return 1; /* if never returned 0, return 1 */ } /** * Sub-expression matcher -- return 1 if sub is non-NULL and * contained in super, 0 otherwise. */ static int exp_contains(Exp * super, Exp * sub) { E_list * el; #ifdef DEBUG printf("SUP: "); if (super) print_expression(super); printf("\n"); #endif if (sub==NULL || super==NULL) return 0; if (exp_compare(sub,super)==1) return 1; if (super->type==CONNECTOR_type) return 0; /* super is a leaf */ /* proceed through supers children and return 1 if sub is contained in any of them */ for(el = super->u.l; el!=NULL; el=el->next) { if (exp_contains(el->e, sub)==1) return 1; } return 0; } /* ======================================================== */ /* X_node utilities ... */ /** * frees the list of X_nodes pointed to by x, and all of the expressions */ void free_X_nodes(X_node * x) { X_node * y; for (; x!= NULL; x = y) { y = x->next; free_Exp(x->exp); xfree((char *)x, sizeof(X_node)); } } /** * Destructively catenates the two disjunct lists d1 followed by d2. * Doesn't change the contents of the disjuncts. * Traverses the first list, but not the second. */ X_node * catenate_X_nodes(X_node *d1, X_node *d2) { X_node * dis = d1; if (d1 == NULL) return d2; if (d2 == NULL) return d1; while (dis->next != NULL) dis = dis->next; dis->next = d2; return d1; } /* ======================================================== */ /* Connector utilities ... */ /** * free_connectors() -- free the list of connectors pointed to by e * (does not free any strings) */ void free_connectors(Connector *e) { Connector * n; for (; e != NULL; e = n) { n = e->next; xfree((char *)e, sizeof(Connector)); } } void exfree_connectors(Connector *e) { Connector * n; for(;e != NULL; e = n) { n = e->next; exfree((void *) e->string, sizeof(char)*(strlen(e->string)+1)); exfree(e, sizeof(Connector)); } } Connector * connector_new(void) { Connector *c = (Connector *) xalloc(sizeof(Connector)); c->length_limit = UNLIMITED_LEN; c->string = ""; c->label = NORMAL_LABEL; c->hash = -1; c->priority = THIN_priority; c->multi = FALSE; c->next = NULL; c->tableNext = NULL; return c; } Connector * init_connector(Connector *c) { c->hash = -1; c->length_limit = UNLIMITED_LEN; return c; } /** * This builds a new copy of the connector list pointed to by c. * Strings, as usual, are not copied. */ Connector * copy_connectors(Connector * c) { Connector *c1; if (c == NULL) return NULL; c1 = connector_new(); *c1 = *c; c1->next = copy_connectors(c->next); return c1; } Connector * excopy_connectors(Connector * c) { char * s; Connector *c1; if (c == NULL) return NULL; c1 = connector_new(); *c1 = *c; s = (char *) exalloc(sizeof(char)*(strlen(c->string)+1)); strcpy(s, c->string); c1->string = s; c1->next = excopy_connectors(c->next); return c1; } /* ======================================================== */ /* Link utilities ... */ Link * excopy_link(Link * l) { char * s; Link * newl; if (l == NULL) return NULL; newl = (Link *) exalloc(sizeof(Link)); s = (char *) exalloc(sizeof(char)*(strlen(l->name)+1)); strcpy(s, l->name); newl->name = s; newl->l = l->l; newl->r = l->r; newl->lc = excopy_connectors(l->lc); newl->rc = excopy_connectors(l->rc); return newl; } void exfree_link(Link * l) { exfree_connectors(l->rc); exfree_connectors(l->lc); exfree((void *)l->name, sizeof(char)*(strlen(l->name)+1)); exfree(l, sizeof(Link)); } /* ======================================================== */ /* Connector-set utilities ... */ /** * This hash function only looks at the leading upper case letters of * the string, and the direction, '+' or '-'. */ static int connector_set_hash(Connector_set *conset, const char * s, int d) { unsigned int i; /* djb2 hash */ i = 5381; i = ((i << 5) + i) + d; while (isupper((int) *s)) /* connector tables cannot contain UTF8, yet */ { i = ((i << 5) + i) + *s; s++; } return (i & (conset->table_size-1)); } static void build_connector_set_from_expression(Connector_set * conset, Exp * e) { E_list * l; Connector * c; int h; if (e->type == CONNECTOR_type) { c = connector_new(); c->string = e->u.string; c->word = e->dir; /* just use the word field to give the dir */ h = connector_set_hash(conset, c->string, c->word); c->next = conset->hash_table[h]; conset->hash_table[h] = c; } else { for (l=e->u.l; l!=NULL; l=l->next) { build_connector_set_from_expression(conset, l->e); } } } Connector_set * connector_set_create(Exp *e) { int i; Connector_set *conset; conset = (Connector_set *) xalloc(sizeof(Connector_set)); conset->table_size = next_power_of_two_up(size_of_expression(e)); conset->hash_table = (Connector **) xalloc(conset->table_size * sizeof(Connector *)); for (i=0; itable_size; i++) conset->hash_table[i] = NULL; build_connector_set_from_expression(conset, e); return conset; } void connector_set_delete(Connector_set * conset) { int i; if (conset == NULL) return; for (i=0; itable_size; i++) free_connectors(conset->hash_table[i]); xfree(conset->hash_table, conset->table_size * sizeof(Connector *)); xfree(conset, sizeof(Connector_set)); } /** * Returns TRUE the given connector is in this conset. FALSE otherwise. * d='+' means this connector is on the right side of the disjunct. * d='-' means this connector is on the left side of the disjunct. */ int match_in_connector_set(Sentence sent, Connector_set *conset, Connector * c, int d) { int h; Connector * c1; if (conset == NULL) return FALSE; h = connector_set_hash(conset, c->string, d); for (c1 = conset->hash_table[h]; c1 != NULL; c1 = c1->next) { if (x_match(sent, c1, c) && (d == c1->word)) return TRUE; } return FALSE; } /* ======================================================== */ /* More connector utilities ... */ /** * This is like the basic "match" function in count.c - the basic * connector-matching function used in parsing - except it ignores * "priority" (used to handle fat links) */ static int easy_match(const char * s, const char * t) { while(isupper((int)*s) || isupper((int)*t)) { if (*s != *t) return FALSE; s++; t++; } while ((*s!='\0') && (*t!='\0')) { if ((*s == '*') || (*t == '*') || ((*s == *t) && (*s != '^'))) { s++; t++; } else return FALSE; } return TRUE; } /** * word_has_connector() -- return TRUE if dictionary expression has connector * This function takes a dict_node (corresponding to an entry in a * given dictionary), a string (representing a connector), and a * direction (0 = right-pointing, 1 = left-pointing); it returns 1 * if the dictionary expression for the word includes the connector, * 0 otherwise. This can be used to see if a word is in a certain * category (checking for a category connector in a table), or to see * if a word has a connector in a normal dictionary. The connector * check uses a "smart-match", the same kind used by the parser. */ int word_has_connector(Dict_node * dn, const char * cs, int direction) { Connector * c2=NULL; Disjunct * d, *d0; if(dn == NULL) return -1; d0 = d = build_disjuncts_for_dict_node(dn); if(d == NULL) return 0; for(; d!=NULL; d=d->next) { if(direction==0) c2 = d->right; if(direction==1) c2 = d->left; for(; c2!=NULL; c2=c2->next) { if(easy_match(c2->string, cs)==1) { free_disjuncts(d0); return 1; } } } free_disjuncts(d0); return 0; } /* ======================================================== */ /* Dictionary utilities ... */ static int dn_word_contains(Dictionary dict, Dict_node * w_dn, const char * macro) { Exp * m_exp; Dict_node *m_dn; if (w_dn == NULL) return 0; m_dn = dictionary_lookup_list(dict, macro); if (m_dn == NULL) return 0; m_exp = m_dn->exp; free_lookup_list(m_dn); #ifdef DEBUG printf("\nWORD: "); print_expression(w_dn->exp); printf("\nMACR: "); print_expression(m_exp); printf("\n"); #endif for (;w_dn != NULL; w_dn = w_dn->right) { if (1 == exp_contains(w_dn->exp, m_exp)) return 1; } return 0; } /** * word_contains: return true if the word may involve application of * a rule. * * @return: true if word's expression contains macro's expression, * false otherwise. */ int word_contains(Dictionary dict, const char * word, const char * macro) { Dict_node *w_dn; int ret; w_dn = abridged_lookup_list(dict, word); ret = dn_word_contains(dict, w_dn, macro); free_lookup_list(w_dn); return ret; } Dict_node * list_whole_dictionary(Dict_node *root, Dict_node *dn) { Dict_node *c, *d; if (root == NULL) return dn; c = (Dict_node *) xalloc(sizeof(Dict_node)); *c = *root; d = list_whole_dictionary(root->left, dn); c->right = list_whole_dictionary(root->right, d); return c; } #define PAST_TENSE_FORM_MARKER "" #define ENTITY_MARKER "" #define COMMON_ENTITY_MARKER "" /* This is exported to public API (for Java) * @deprecated -- past-tense verbs are tagged with .v-d or .w-d or .q-d * subscripts. use those instead to figure out if a verb is past tense. */ int dictionary_is_past_tense_form(Dictionary dict, const char * str) { if (word_contains(dict, str, PAST_TENSE_FORM_MARKER) == 1) return 1; return 0; } /** * dictionary_is_entity - Return true if word is entity. * Entities are proper names (geographical names, * names of people), street addresses, phone numbers, * etc. */ /* This is exported to public API (for Java) */ int dictionary_is_entity(Dictionary dict, const char * str) { if (word_contains(dict, str, ENTITY_MARKER) == 1) return 1; return 0; } /* ========================= END OF FILE ============================== */ link-grammar-4.7.4/link-grammar/analyze-linkage.h0000644000175000017500000000246711050675446020737 0ustar bloombloom/*************************************************************************/ /* Copyright (c) 2004 */ /* Daniel Sleator, David Temperley, and John Lafferty */ /* All rights reserved */ /* */ /* Use of the link grammar parsing system is subject to the terms of the */ /* license set forth in the LICENSE file included with this software, */ /* and also available at http://www.link.cs.cmu.edu/link/license.html */ /* This license allows free redistribution and use in source and binary */ /* forms, with or without modification, subject to certain conditions. */ /* */ /*************************************************************************/ void init_analyze(Sentence); void free_analyze(Sentence); void extract_thin_linkage(Sentence, Parse_Options, Linkage); void extract_fat_linkage (Sentence, Parse_Options, Linkage); Linkage_info analyze_fat_linkage (Sentence, Parse_Options, int pass); Linkage_info analyze_thin_linkage(Sentence, Parse_Options, int pass); void free_DIS_tree(DIS_node *); void zero_sublinkage(Sublinkage *s); link-grammar-4.7.4/link-grammar/disjuncts.c0000644000175000017500000001033311245057777017663 0ustar bloombloom/*************************************************************************/ /* Copyright (c) 2008, 2009 Linas Vepstas */ /* All rights reserved */ /* */ /* Use of the link grammar parsing system is subject to the terms of the */ /* license set forth in the LICENSE file included with this software, */ /* and also available at http://www.link.cs.cmu.edu/link/license.html */ /* This license allows free redistribution and use in source and binary */ /* forms, with or without modification, subject to certain conditions. */ /* */ /*************************************************************************/ /* * disjuncts.c * * Miscellaneous utilities for returning the list of disjuncts that * were acutally used in a given parse of a sentence. */ #include #include #include "api-structures.h" #include "disjuncts.h" #include "utilities.h" /* ========================================================= */ /** * lg_compute_disjunct_strings -- Given sentence, compute disjuncts. * * This routine will compute the string representation of the disjunct * used for each word in parsing the given sentence. A string * representation of the disjunct is needed for most of the corpus * statistics functions: this string, together with the "inflected" * word, is used as a key to index the statistics information in the * database. * * XXX This implementation works, but I don't think its the simplest * one. I think that a better implementation would have used * sent->parse_info->chosen_disjuncts[w] to get the one that was used, * and then print_disjuncts() to print it. */ void lg_compute_disjunct_strings(Sentence sent, Linkage_info *lifo) { char djstr[MAX_TOKEN_LENGTH*20]; /* no word will have more than 20 links */ size_t copied, left; int i, w; int nwords = sent->length; Parse_info pi = sent->parse_info; int nlinks = pi->N_links; int *djlist, *djloco, *djcount; if (lifo->disjunct_list_str) return; lifo->nwords = nwords; lifo->disjunct_list_str = (char **) malloc(nwords * sizeof(char *)); memset(lifo->disjunct_list_str, 0, nwords * sizeof(char *)); djcount = (int *) malloc (sizeof(int) * (nwords + 2*nwords*nlinks)); djlist = djcount + nwords; djloco = djlist + nwords*nlinks; /* Decrement nwords, so as to ignore the RIGHT-WALL */ nwords --; for (w=0; wlink_array[i].l; int rword = pi->link_array[i].r; int slot = djcount[lword]; /* Skip over RW link to the right wall */ if (nwords <= rword) continue; djlist[lword*nlinks + slot] = i; djloco[lword*nlinks + slot] = rword; djcount[lword] ++; slot = djcount[rword]; djlist[rword*nlinks + slot] = i; djloco[rword*nlinks + slot] = lword; djcount[rword] ++; #ifdef DEBUG printf("Link: %d is %s--%s--%s\n", i, sent->word[lword].string, pi->link_array[i].name, sent->word[rword].string); #endif } /* Process each word in the sentence (skipping LEFT-WALL, which is * word 0. */ for (w=1; w djloco[w*nlinks + j]) { int tmp = djloco[w*nlinks + i]; djloco[w*nlinks + i] = djloco[w*nlinks + j]; djloco[w*nlinks + j] = tmp; tmp = djlist[w*nlinks + i]; djlist[w*nlinks + i] = djlist[w*nlinks + j]; djlist[w*nlinks + j] = tmp; } } } /* Create the disjunct string */ left = sizeof(djstr); copied = 0; for (i=0; ilink_array[dj].name, left); left = sizeof(djstr) - copied; if (djloco[w*nlinks + i] < w) copied += lg_strlcpy(djstr+copied, "-", left--); else copied += lg_strlcpy(djstr+copied, "+", left--); copied += lg_strlcpy(djstr+copied, " ", left--); } lifo->disjunct_list_str[w] = strdup(djstr); } free (djcount); } link-grammar-4.7.4/link-grammar/preparation.c0000644000175000017500000002731211524553507020176 0ustar bloombloom/*************************************************************************/ /* Copyright (c) 2004 */ /* Daniel Sleator, David Temperley, and John Lafferty */ /* All rights reserved */ /* */ /* Use of the link grammar parsing system is subject to the terms of the */ /* license set forth in the LICENSE file included with this software, */ /* and also available at http://www.link.cs.cmu.edu/link/license.html */ /* This license allows free redistribution and use in source and binary */ /* forms, with or without modification, subject to certain conditions. */ /* */ /*************************************************************************/ #include #include "disjunct-utils.h" void free_deletable(Sentence sent) { int w; if (sent->dptr != NULL) { for (w = 0; w <= sent->length; w++) { xfree((char *)sent->dptr[w], sizeof(char) * (sent->length + 1)); } xfree((char *) sent->dptr, (sent->length + 1)*sizeof(char *)); sent->dptr = NULL; sent->deletable = NULL; } } /** * Returns true if the range lw...rw inclusive contains a conjunction */ static int conj_in_range(Sentence sent, int lw, int rw) { for (;lw < rw+1; lw++) { if (sent->is_conjunction[lw]) return TRUE; } return FALSE; } /** * Initialize the array deletable[i][j] to indicate if the words * i+1...j-1 could be non existant in one of the multiple linkages. This * array is used in conjunction_prune and power_prune. Regions of length * 0 are always deletable. A region of length two with a conjunction at * one end is always deletable. Another observation is that for the * comma to form the right end of a deletable region, it must be the case * that there is a conjunction to the right of the comma. Also, when * considering deletable regions with a comma on their left sides, there * must be a conjunction inside the region to be deleted. Finally, the * words "either", "neither", "both", "not" and "not only" are all * deletable. */ void build_deletable(Sentence sent, int has_conjunction) { int i,j,k; free_deletable(sent); sent->dptr = (char **) xalloc((sent->length + 1) * sizeof(char *)); sent->deletable = sent->dptr + 1; /* we need to be able to access the [-1] position in this array */ for (i = -1; ilength; i++) { sent->deletable[i] = (char *) xalloc((sent->length+1) * sizeof(char)); /* the +1 is to allow us to have the info for the last word read the comment above */ for (j=0; j<= sent->length; j++) { if (j == i+1) { sent->deletable[i][j] = TRUE; } else if (sent->null_links) { sent->deletable[i][j] = TRUE; } else if (!has_conjunction) { sent->deletable[i][j] = FALSE; } else if ((j > i + 2) && (sent->is_conjunction[i+1] || sent->is_conjunction[j-1] || (strcmp(",", sent->word[i+1].string) == 0 && conj_in_range(sent, i+2, j-1)) || (strcmp(",",sent->word[j-1].string) == 0 && conj_in_range(sent, j, sent->length - 1)))) { sent->deletable[i][j] = TRUE; } else if (j > i) { for (k=i+1; kword[k].string) == 0) || (strcmp("neither", sent->word[k].string) == 0) || (strcmp("both", sent->word[k].string) == 0) || (strcmp("not", sent->word[k].string) == 0)) continue; if ((strcmp("only", sent->word[k].string)==0) && (k > i+1) && (strcmp("not", sent->word[k-1].string)==0)) continue; break; } sent->deletable[i][j] = (k == j); } else { sent->deletable[i][j] = FALSE; } } } } void free_effective_dist(Sentence sent) { int w; if (sent->effective_dist != NULL) { for (w=0; wlength; w++) { xfree((char *)sent->effective_dist[w],sizeof(char)*(sent->length+1)); } xfree((char *) sent->effective_dist, sizeof(char *)*(sent->length)); sent->effective_dist = NULL; } } /** * The "effective distance" between two words is the actual distance minus * the largest deletable region strictly between the two words. If the * effective distance between two words is greater than a connector's max * link length, then that connector cannot be satisfied by linking these * two words. * * [Note: The effective distance is not monotically increasing as you move * away from a word.] * * This function creates effective_dist[][]. It assumes that deleteble[][] * has already been computed. * * Dynamic programming is used to compute this. The order used is smallest * region to largest. * * Just as deletable[i][j] is constructed for j=N_words (which is one * off the end of the sentence) we do that for effective_dist[][]. */ void build_effective_dist(Sentence sent, int has_conjunction) { int i, j, diff; free_effective_dist(sent); sent->effective_dist = (char **) xalloc((sent->length)*sizeof(char *)); for (i=0; ilength; i++) { sent->effective_dist[i] = (char *) xalloc(sent->length+1); } for (i=0; ilength; i++) { /* Fill in the silly part */ for (j=0; j<=i; j++) { sent->effective_dist[i][j] = j-i; } } /* what is the rationale for ignoring the effective_dist if null links are allowed? */ if (sent->null_links) { for (i=0; ilength; i++) { for (j=0; j<=sent->length; j++) { sent->effective_dist[i][j] = j-i; } } } else { for (diff = 1; diff < sent->length; diff++) { for (i=0; i+diff <= sent->length; i++) { j = i+diff; if (sent->deletable[i][j]) { /* note that deletable[x][x+1] is TRUE */ sent->effective_dist[i][j] = 1; } else { sent->effective_dist[i][j] = 1 + MIN(sent->effective_dist[i][j-1],sent->effective_dist[i+1][j]); } } } /* now when you link to a conjunction, your effective length is 1 */ for (i=0; ilength; i++) { for (j=i+1; jlength; j++) { if (sent->is_conjunction[i] || sent->is_conjunction[j]) sent->effective_dist[i][j] = 1; } } } /* sent->effective_dist[i][i] should be 0 */ /* for (j=0; j<=sent->length; j++) { printf("%4d", j); } printf("\n"); for (i=0; ilength; i++) { for (j=0; j<=sent->length; j++) { printf("%4d", sent->effective_dist[i][j]); } printf("\n"); } */ } /** * Installs all the special fat disjuncts on all of the words of the * sentence */ void install_fat_connectors(Sentence sent) { int i; for (i=0; ilength; i++) { if (sent->is_conjunction[i]) { sent->word[i].d = catenate_disjuncts(sent->word[i].d, build_AND_disjunct_list(sent, sent->word[i].string)); } else { sent->word[i].d = catenate_disjuncts(sent->word[i].d, explode_disjunct_list(sent, sent->word[i].d)); if (strcmp(sent->word[i].string, ",") == 0) { sent->word[i].d = catenate_disjuncts(sent->word[i].d, build_COMMA_disjunct_list(sent)); } } } } static void set_connector_list_length_limit(Sentence sent, Connector *c, Connector_set *conset, int short_len, Parse_Options opts) { for (; c!=NULL; c=c->next) { if (parse_options_get_all_short_connectors(opts)) { c->length_limit = short_len; } else if (conset == NULL || match_in_connector_set(sent, conset, c, '+')) { c->length_limit = UNLIMITED_LEN; } else { c->length_limit = short_len; } } } static void set_connector_length_limits(Sentence sent, Parse_Options opts) { int i; int len; Disjunct *d; len = opts->short_length; if (len > UNLIMITED_LEN) len = UNLIMITED_LEN; for (i=0; ilength; i++) { for (d = sent->word[i].d; d != NULL; d = d->next) { set_connector_list_length_limit(sent, d->left, sent->dict->unlimited_connector_set, len, opts); set_connector_list_length_limit(sent, d->right, sent->dict->unlimited_connector_set, len, opts); } } } void free_sentence_expressions(Sentence sent) { int i; for (i=0; ilength; i++) { free_X_nodes(sent->word[i].x); } } /** * Return true if the sentence contains a conjunction. Assumes * is_conjunction[] has been initialized. * * This routine has been added to the public API as of version 4.7.0, * as it is required to determine whether a fat linkage might restult * during parsing. This is needed to optimize the optioanl use of fat * links. The goal is to eventually deprecate fat linkages entirely; * this routine is needed in the transition phase. */ int sentence_contains_conjunction(Sentence sent) { int w; if (NULL == sent->is_conjunction) return FALSE; for (w=0; wlength; w++) { if (sent->is_conjunction[w]) return TRUE; } return FALSE; } void free_sentence_disjuncts(Sentence sent) { int i; for (i=0; ilength; ++i) { free_disjuncts(sent->word[i].d); sent->word[i].d = NULL; } if (sentence_contains_conjunction(sent)) free_AND_tables(sent); } /** * Assumes that the sentence expression lists have been generated. * This does all the necessary pruning and building of fat-link structures. */ void prepare_to_parse(Sentence sent, Parse_Options opts) { int i, has_conjunction; build_sentence_disjuncts(sent, opts->disjunct_cost); if (verbosity > 2) { printf("After expanding expressions into disjuncts:"); print_disjunct_counts(sent); } print_time(opts, "Built disjuncts"); for (i=0; ilength; i++) { sent->word[i].d = eliminate_duplicate_disjuncts(sent->word[i].d); } print_time(opts, "Eliminated duplicate disjuncts"); if (verbosity > 2) { printf("\nAfter expression pruning and duplicate elimination:\n"); print_disjunct_counts(sent); } sent->null_links = (opts->min_null_count > 0); if (opts->use_fat_links) { has_conjunction = sentence_contains_conjunction(sent); } else { has_conjunction = FALSE; } /* The deletable region depends on whether null links are in use; * with null_links everything is deletable. Thus, this processing * cannot be done earlier than here. */ set_connector_length_limits(sent, opts); build_deletable(sent, has_conjunction); build_effective_dist(sent, has_conjunction); init_count(sent); if (!has_conjunction) { pp_and_power_prune(sent, RUTHLESS, opts); } else { pp_and_power_prune(sent, GENTLE, opts); /* if (verbosity > 2) { printf("\nAfter Gentle power pruning:\n"); print_disjunct_counts(sent); } */ /* already reported -- print_time(opts, "Finished gentle power pruning"); */ conjunction_prune(sent, opts); if (verbosity > 2) { printf("\nAfter conjunction pruning:\n"); print_disjunct_counts(sent); } print_time(opts, "Done conjunction pruning"); build_conjunction_tables(sent); install_fat_connectors(sent); install_special_conjunctive_connectors(sent); if (verbosity > 2) { printf("After conjunctions, disjuncts counts:\n"); print_disjunct_counts(sent); } set_connector_length_limits(sent, opts); /* have to do this again cause of the * new fat connectors and disjuncts */ print_time(opts, "Constructed fat disjuncts"); prune(sent); print_time(opts, "Pruned fat disjuncts"); for (i=0; ilength; i++) { sent->word[i].d = eliminate_duplicate_disjuncts(sent->word[i].d); } if (verbosity > 2) { printf("After pruning and duplicate elimination:\n"); print_disjunct_counts(sent); } print_time(opts, "Eliminated duplicate disjuncts (again)"); if (verbosity > 2) print_AND_statistics(sent); power_prune(sent, RUTHLESS, opts); } free_count(sent); /* if (verbosity > 2) { printf("\nAfter RUTHLESS power-pruning:\n"); print_disjunct_counts(sent); } */ /* print time for power pruning used to be here */ /* now done in power_prune itself */ print_time(opts, "Initialized fast matcher and hash table"); } link-grammar-4.7.4/link-grammar/and.h0000644000175000017500000000347411170672732016423 0ustar bloombloom/*************************************************************************/ /* Copyright (c) 2004 */ /* Daniel Sleator, David Temperley, and John Lafferty */ /* All rights reserved */ /* */ /* Use of the link grammar parsing system is subject to the terms of the */ /* license set forth in the LICENSE file included with this software, */ /* and also available at http://www.link.cs.cmu.edu/link/license.html */ /* This license allows free redistribution and use in source and binary */ /* forms, with or without modification, subject to certain conditions. */ /* */ /*************************************************************************/ link_private void free_AND_tables(Sentence sent); link_private void print_AND_statistics(Sentence sent); link_private void init_andable_hash_table(Dictionary dict); link_private void free_andable_hash_table(Dictionary dict); link_private void initialize_conjunction_tables(Sentence sent); link_private int is_canonical_linkage(Sentence sent); link_private Disjunct * build_AND_disjunct_list(Sentence sent, char *); link_private Disjunct * build_COMMA_disjunct_list(Sentence sent); link_private Disjunct * explode_disjunct_list(Sentence sent, Disjunct *); link_private void build_conjunction_tables(Sentence); link_private void compute_pp_link_array_connectors(Sentence sent, Sublinkage *sublinkage); /* Following need to be visible to sat solver, can't be private */ int set_has_fat_down(Sentence sent); const char * intersect_strings(Sentence sent, const char * s, const char * t); link-grammar-4.7.4/link-grammar/expand.h0000644000175000017500000000156111241556431017127 0ustar bloombloom/*************************************************************************/ /* Copyright (c) 2009 Linas Vepstas */ /* All rights reserved */ /* */ /* Use of the link grammar parsing system is subject to the terms of the */ /* license set forth in the LICENSE file included with this software, */ /* and also available at http://www.link.cs.cmu.edu/link/license.html */ /* This license allows free redistribution and use in source and binary */ /* forms, with or without modification, subject to certain conditions. */ /* */ /*************************************************************************/ int lg_expand_disjunct_list(Sentence sent); link-grammar-4.7.4/link-grammar/print.c0000644000175000017500000007550111240430647017003 0ustar bloombloom/*************************************************************************/ /* Copyright (c) 2004 */ /* Daniel Sleator, David Temperley, and John Lafferty */ /* All rights reserved */ /* */ /* Use of the link grammar parsing system is subject to the terms of the */ /* license set forth in the LICENSE file included with this software, */ /* and also available at http://www.link.cs.cmu.edu/link/license.html */ /* This license allows free redistribution and use in source and binary */ /* forms, with or without modification, subject to certain conditions. */ /* */ /*************************************************************************/ #include #include #include "corpus/corpus.h" const char * trailer(int mode); const char * header(int mode); static void set_centers(Linkage linkage, int center[], int print_word_0, int N_words_to_print) { mbstate_t mbss; int i, len, tot; memset(&mbss, 0, sizeof(mbss)); tot = 0; if (print_word_0) i=0; else i=1; for (; i < N_words_to_print; i++) { /* Centers obtained by counting the characters, * not the bytes in the string. * len = strlen(linkage->word[i]); */ len = mbsrtowcs(NULL, &linkage->word[i], 0, &mbss); center[i] = tot + (len/2); tot += len+1; } } /* the following are all for generating postscript */ typedef struct { int N_rows; /* N_rows -- the number of rows */ /* tells the height of the links above the sentence */ int link_heights[MAX_LINKS]; /* the word beginning each row of the display */ int row_starts[MAX_SENTENCE]; } ps_ctxt_t; /** * prints s then prints the last |t|-|s| characters of t. * if s is longer than t, it truncates s. */ static void left_append_string(String * string, const char * s, const char * t) { int i, j, k; j = strlen(t); k = strlen(s); for (i=0; idict; int l, r; const char *label, *llabel, *rlabel; l = linkage_get_link_lword(linkage, link); r = linkage_get_link_rword(linkage, link); label = linkage_get_link_label(linkage, link); llabel = linkage_get_link_llabel(linkage, link); rlabel = linkage_get_link_rlabel(linkage, link); if ((l == 0) && dict->left_wall_defined) { left_append_string(s, LEFT_WALL_DISPLAY," "); } else if ((l == (linkage_get_num_words(linkage)-1)) && dict->right_wall_defined) { left_append_string(s, RIGHT_WALL_DISPLAY," "); } else { left_append_string(s, linkage_get_word(linkage, l), " "); } left_append_string(s, llabel, " "); append_string(s, " <---"); left_append_string(s, label, "-----"); append_string(s, "-> "); left_append_string(s, rlabel, " "); append_string(s, " %s\n", linkage_get_word(linkage, r)); } /** * To the left of each link, print the sequence of domains it is in. * Printing a domain means printing its type. * Takes info from pp_link_array and pp and chosen_words. */ char * linkage_print_links_and_domains(Linkage linkage) { int link, longest, j; int N_links = linkage_get_num_links(linkage); String * s = string_new(); char * links_string; const char ** dname; longest = 0; for (link=0; link longest) longest = linkage_get_link_num_domains(linkage, link); } for (link=0; linkinfo; Sense *sns; size_t w, nwords; lg_corpus_linkage_senses(linkage); nwords = lifo->nwords; for (w=0; wsent; int nwords = sent->length; /* Decrement nwords, so as to ignore the RIGHT-WALL */ nwords --; /* Loop over each word in the sentence (skipping LEFT-WALL, which is * word 0. */ for (w=1; wsent->parse_info->chosen_disjuncts[w]; if (NULL == disj) continue; infword = disj->string; dj = linkage_get_disjunct_str(linkage, w); cost = linkage_get_disjunct_cost(linkage, w); #if USE_CORPUS score = linkage_get_disjunct_corpus_score(linkage, w); append_string(s, "%21s %5.1f %6.3f %s\n", infword, cost, score, dj); #else append_string(s, "%21s %5.1f %s\n", infword, cost, dj); #endif } djs = string_copy(s); string_delete(s); return djs; } /** */ static char * build_linkage_postscript_string(Linkage linkage, ps_ctxt_t *pctx) { int link, i,j; int d; int print_word_0 = 0, print_word_N = 0, N_wall_connectors, suppressor_used; Sublinkage *sublinkage = &(linkage->sublinkage[linkage->current]); int N_links = sublinkage->num_links; Link **ppla = sublinkage->link; String * string; char * ps_string; Dictionary dict = linkage->sent->dict; Parse_Options opts = linkage->opts; int N_words_to_print; string = string_new(); N_wall_connectors = 0; if (dict->left_wall_defined) { suppressor_used = FALSE; if (!opts->display_walls) for (j=0; jl == 0) { if (ppla[j]->r == linkage->num_words-1) continue; N_wall_connectors ++; if (strcmp(ppla[j]->lc->string, LEFT_WALL_SUPPRESS)==0) { suppressor_used = TRUE; } } } print_word_0 = (((!suppressor_used) && (N_wall_connectors != 0)) || (N_wall_connectors > 1) || opts->display_walls); } else { print_word_0 = TRUE; } N_wall_connectors = 0; if (dict->right_wall_defined) { suppressor_used = FALSE; for (j=0; jr == linkage->num_words-1) { N_wall_connectors ++; if (strcmp(ppla[j]->lc->string, RIGHT_WALL_SUPPRESS)==0){ suppressor_used = TRUE; } } } print_word_N = (((!suppressor_used) && (N_wall_connectors != 0)) || (N_wall_connectors > 1) || opts->display_walls); } else { print_word_N = TRUE; } if (print_word_0) d=0; else d=1; i = 0; N_words_to_print = linkage->num_words; if (!print_word_N) N_words_to_print--; append_string(string, "["); for (j=d; j0)) append_string(string, "\n"); i++; append_string(string, "(%s)", linkage->word[j]); } append_string(string,"]"); append_string(string,"\n"); append_string(string,"["); j = 0; for (link=0; linkl == 0)) continue; if (!print_word_N && (ppla[link]->r == linkage->num_words-1)) continue; if (ppla[link]->l == -1) continue; if ((j%7 == 0) && (j>0)) append_string(string,"\n"); j++; append_string(string,"[%d %d %d", ppla[link]->l-d, ppla[link]->r-d, pctx->link_heights[link]); if (ppla[link]->lc->label < 0) { append_string(string," (%s)]", ppla[link]->name); } else { append_string(string," ()]"); } } append_string(string,"]"); append_string(string,"\n"); append_string(string,"["); for (j=0; j < pctx->N_rows; j++ ) { if (j>0) append_string(string, " %d", pctx->row_starts[j]); else append_string(string,"%d", pctx->row_starts[j]); } append_string(string,"]\n"); ps_string = string_copy(string); string_delete(string); return ps_string; } /** * This takes the current chosen_disjuncts array and uses it to * compute the chosen_words array. "I.xx" suffixes are eliminated. */ void compute_chosen_words(Sentence sent, Linkage linkage) { int i, l; const char *t; char * s, *u; Parse_info pi = sent->parse_info; const char * chosen_words[MAX_SENTENCE]; Parse_Options opts = linkage->opts; for (i=0; ilength; i++) { /* get rid of those ugly ".Ixx" */ chosen_words[i] = sent->word[i].string; if (pi->chosen_disjuncts[i] == NULL) { /* no disjunct is used on this word because of null-links */ t = chosen_words[i]; l = strlen(t) + 2; s = (char *) xalloc(l+1); sprintf(s, "[%s]", t); t = string_set_add(s, sent->string_set); xfree(s, l+1); chosen_words[i] = t; } else if (opts->display_word_subscripts) { t = pi->chosen_disjuncts[i]->string; if (is_idiom_word(t)) { l = strlen(t); s = (char *) xalloc(l+1); strcpy(s,t); for (u=s; *u != '.'; u++) ; *u = '\0'; t = string_set_add(s, sent->string_set); xfree(s, l+1); chosen_words[i] = t; } else { chosen_words[i] = t; } } } if (sent->dict->left_wall_defined) { chosen_words[0] = LEFT_WALL_DISPLAY; } if (sent->dict->right_wall_defined) { chosen_words[sent->length-1] = RIGHT_WALL_DISPLAY; } for (i=0; inum_words; ++i) { s = (char *) exalloc(strlen(chosen_words[i])+1); strcpy(s, chosen_words[i]); linkage->word[i] = s; } } #define MAX_HEIGHT 30 /** * String allocated with exalloc. * Needs to be freed with linkage_free_diagram() */ static char * linkage_print_diagram_ctxt(Linkage linkage, ps_ctxt_t *pctx) { int i, j, k, cl, cr, row, top_row, width, flag; const char *s; char *t; int print_word_0 = 0, print_word_N = 0, N_wall_connectors, suppressor_used; int center[MAX_SENTENCE]; char connector[MAX_TOKEN_LENGTH]; int line_len, link_length; Sublinkage *sublinkage=&(linkage->sublinkage[linkage->current]); int N_links = sublinkage->num_links; Link **ppla = sublinkage->link; String * string; char * gr_string; Dictionary dict = linkage->sent->dict; Parse_Options opts = linkage->opts; int x_screen_width = parse_options_get_screen_width(opts); int N_words_to_print; char picture[MAX_HEIGHT][MAX_LINE]; char xpicture[MAX_HEIGHT][MAX_LINE]; string = string_new(); N_wall_connectors = 0; if (dict->left_wall_defined) { suppressor_used = FALSE; if (!opts->display_walls) { for (j=0; jl == 0)) { if (ppla[j]->r == linkage->num_words-1) continue; N_wall_connectors ++; if (strcmp(ppla[j]->lc->string, LEFT_WALL_SUPPRESS)==0) { suppressor_used = TRUE; } } } } print_word_0 = (((!suppressor_used) && (N_wall_connectors != 0)) || (N_wall_connectors > 1) || opts->display_walls); } else { print_word_0 = TRUE; } N_wall_connectors = 0; if (dict->right_wall_defined) { suppressor_used = FALSE; for (j=0; jr == linkage->num_words-1) { N_wall_connectors ++; if (strcmp(ppla[j]->lc->string, RIGHT_WALL_SUPPRESS)==0) { suppressor_used = TRUE; } } } print_word_N = (((!suppressor_used) && (N_wall_connectors != 0)) || (N_wall_connectors > 1) || opts->display_walls); } else { print_word_N = TRUE; } N_words_to_print = linkage->num_words; if (!print_word_N) N_words_to_print--; set_centers(linkage, center, print_word_0, N_words_to_print); line_len = center[N_words_to_print-1]+1; for (k=0; kl == -1) continue; if ((ppla[j]->r - ppla[j]->l) != link_length) continue; if (!print_word_0 && (ppla[j]->l == 0)) continue; /* gets rid of the irrelevant link to the left wall */ if (!print_word_N && (ppla[j]->r == linkage->num_words-1)) continue; /* gets rid of the irrelevant link to the right wall */ /* put it into the lowest position */ cl = center[ppla[j]->l]; cr = center[ppla[j]->r]; for (row=0; row < MAX_HEIGHT; row++) { for (k=cl+1; klink_heights[j] = row; if (2*row+2 > MAX_HEIGHT-1) { append_string(string, "The diagram is too high.\n"); gr_string = string_copy(string); string_delete(string); return gr_string; } if (row > top_row) top_row = row; picture[row][cl] = '+'; picture[row][cr] = '+'; for (k=cl+1; kname; if (opts->display_link_subscripts) { if (!is_utf8_alpha(s)) s = ""; } else { if (!is_utf8_upper(s)) { s = ""; /* Don't print fat link connector name */ } } strncpy(connector, s, MAX_TOKEN_LENGTH-1); connector[MAX_TOKEN_LENGTH-1] = '\0'; k=0; if (opts->display_link_subscripts) k = strlen(connector); else for (t=connector; isupper((int)*t); t++) k++; /* uppercase len of conn*/ if ((cl+cr-k)/2 + 1 <= cl) { t = picture[row] + cl + 1; } else { t = picture[row] + (cl+cr-k)/2 + 1; } s = connector; if (opts->display_link_subscripts) while((*s != '\0') && (*t == '-')) *t++ = *s++; else while(isupper((int)*s) && (*t == '-')) *t++ = *s++; /* now put in the | below this one, where needed */ for (k=0; kword[k]; i=0; while(*s != '\0') { *t++ = *s++; i++; } *t++ = ' '; } *t = '\0'; if (opts->display_short) { for (k=0; picture[0][k] != '\0'; k++) { if ((picture[0][k] == '+') || (picture[0][k] == '|')) { xpicture[1][k] = '|'; } else { xpicture[1][k] = ' '; } } xpicture[1][k] = '\0'; for (row=0; row < top_row+1; row++) { strcpy(xpicture[row+2],picture[row]); } top_row = top_row+2; } else { for (row=0; row < top_row+1; row++) { strcpy(xpicture[2*row+2],picture[row]); for (k=0; picture[row][k] != '\0'; k++) { if ((picture[row][k] == '+') || (picture[row][k] == '|')) { xpicture[2*row+1][k] = '|'; } else { xpicture[2*row+1][k] = ' '; } } xpicture[2*row+1][k] = '\0'; } top_row = 2*top_row + 2; } /* we've built the picture, now print it out */ if (print_word_0) i = 0; else i = 1; k = 0; pctx->N_rows = 0; pctx->row_starts[pctx->N_rows] = 0; pctx->N_rows++; while(i < N_words_to_print) { append_string(string, "\n"); width = 0; do { width += strlen(linkage->word[i])+1; i++; } while((iword[i]))+1 < x_screen_width)); pctx->row_starts[pctx->N_rows] = i - (!print_word_0); /* PS junk */ if (iN_rows++; /* same */ for (row = top_row; row >= 0; row--) { flag = TRUE; for (j=k;flag&&(jlength; i++) { c = 0; for (d=sent->word[i].d; d != NULL; d = d->next) { c++; } printf("%s(%d) ",sent->word[i].string, c); } printf("\n\n"); } void print_expression_sizes(Sentence sent) { X_node * x; int w, size; for (w=0; wlength; w++) { size = 0; for (x=sent->word[w].x; x!=NULL; x = x->next) { size += size_of_expression(x->exp); } printf("%s[%d] ",sent->word[w].string, size); } printf("\n\n"); } /** * this version just prints it on one line. */ void print_sentence(FILE *fp, Sentence sent, int w) { int i; if (sent->dict->left_wall_defined) i=1; else i=0; for (; ilength - sent->dict->right_wall_defined; i++) { fprintf(fp, "%s ", sent->word[i].string); } fprintf(fp, "\n"); } const char * trailer(int mode) { static const char * trailer_string= "diagram\n" "\n" "%%EndDocument\n" ; if (mode==1) return trailer_string; else return ""; } const char * header(int mode) { static const char * header_string= "%!PS-Adobe-2.0 EPSF-1.2\n" "%%Pages: 1\n" "%%BoundingBox: 0 -20 500 200\n" "%%EndComments\n" "%%BeginDocument: \n" "\n" "% compute size of diagram by adding\n" "% #rows x 8.5\n" "% (#rows -1) x 10\n" "% \\sum maxheight x 10\n" "/nulllink () def % The symbol of a null link\n" "/wordfontsize 11 def % the size of the word font\n" "/labelfontsize 9 def % the size of the connector label font\n" "/ex 10 def % the horizontal radius of all the links\n" "/ey 10 def % the height of the level 0 links\n" "/ed 10 def % amount to add to this height per level\n" "/radius 10 def % radius for rounded arcs\n" "/row-spacing 10 def % the space between successive rows of the diagram\n" "\n" "/gap wordfontsize .5 mul def % the gap between words\n" "/top-of-words wordfontsize .85 mul def\n" " % the delta y above where the text is written where\n" " % the major axis of the ellipse is located\n" "/label-gap labelfontsize .1 mul def\n" "\n" "/xwordfontsize 10 def % the size of the word font\n" "/xlabelfontsize 10 def % the size of the connector label font\n" "/xex 10 def % the horizontal radius of all the links\n" "/xey 10 def % the height of the level 0 links\n" "/xed 10 def % amount to add to this height per level\n" "/xradius 10 def % radius for rounded arcs\n" "/xrow-spacing 10 def % the space between successive rows of the diagram\n" "/xgap wordfontsize .5 mul def % the gap between words\n" "\n" "/centerpage 6.5 72 mul 2 div def\n" " % this number of points from the left margin is the center of page\n" "\n" "/rightpage 6.5 72 mul def\n" " % number of points from the left margin is the the right margin\n" "\n" "/show-string-centered-dict 5 dict def\n" "\n" "/show-string-centered {\n" " show-string-centered-dict begin\n" " /string exch def\n" " /ycenter exch def\n" " /xcenter exch def\n" " xcenter string stringwidth pop 2 div sub\n" " ycenter labelfontsize .3 mul sub\n" " moveto\n" " string show\n" " end\n" "} def\n" "\n" "/clear-word-box {\n" " show-string-centered-dict begin\n" " /string exch def\n" " /ycenter exch def\n" " /xcenter exch def\n" " newpath\n" " /urx string stringwidth pop 2 div def\n" " /ury labelfontsize .3 mul def\n" " xcenter urx sub ycenter ury sub moveto\n" " xcenter urx add ycenter ury sub lineto\n" " xcenter urx add ycenter ury add lineto\n" " xcenter urx sub ycenter ury add lineto\n" " closepath\n" " 1 setgray fill\n" " 0 setgray\n" " end\n" "} def\n" "\n" "/diagram-sentence-dict 20 dict def\n" "\n" "/diagram-sentence-circle\n" "{diagram-sentence-dict begin \n" " /links exch def\n" " /words exch def\n" " /n words length def\n" " /Times-Roman findfont wordfontsize scalefont setfont\n" " /x 0 def\n" " /y 0 def\n" "\n" " /left-ends [x dup words {stringwidth pop add gap add dup}\n" " forall pop pop] def\n" " /right-ends [x words {stringwidth pop add dup gap add} forall pop] def\n" " /centers [0 1 n 1 sub {/i exch def\n" " left-ends i get\n" " right-ends i get\n" " add 2 div\n" " } for ] def\n" "\n" " x y moveto\n" " words {show gap 0 rmoveto} forall\n" "\n" " .5 setlinewidth \n" "\n" " links {dup 0 get /leftword exch def\n" " dup 1 get /rightword exch def\n" " dup 2 get /level exch def\n" " 3 get /string exch def\n" " newpath\n" " string nulllink eq {[2] 1 setdash}{[] 0 setdash} ifelse\n" "% string nulllink eq {.8 setgray}{0 setgray} ifelse\n" " centers leftword get\n" " y top-of-words add\n" " moveto\n" " \n" " centers rightword get\n" " centers leftword get\n" " sub 2 div dup\n" " radius \n" " lt {/radiusx exch def}{pop /radiusx radius def} ifelse\n" " \n" " \n" " \n" " centers leftword get\n" " y top-of-words add ey ed level mul add add\n" " centers rightword get\n" " y top-of-words add ey ed level mul add add\n" " radiusx\n" " arcto\n" " 4 {pop} repeat\n" " centers rightword get\n" " y top-of-words add ey ed level mul add add\n" " centers rightword get\n" " y top-of-words add\n" " radiusx\n" " arcto\n" " 4 {pop} repeat\n" " centers rightword get\n" " y top-of-words add\n" " lineto\n" "\n" " stroke\n" "\n" " /radius-y ey ed level mul add def\n" "\n" " /center-arc-x\n" " centers leftword get centers rightword get add 2 div\n" " def\n" " \n" " /center-arc-y\n" " y top-of-words radius-y add add\n" " def\n" "\n" " /Courier-Bold findfont labelfontsize scalefont setfont \n" " center-arc-x center-arc-y string clear-word-box\n" " center-arc-x center-arc-y string show-string-centered\n" " } forall\n" " end\n" " } def\n" "\n" "/diagramdict 20 dict def\n" "\n" "/diagram\n" "{diagramdict begin\n" " /break-words exch def\n" " /links exch def\n" " /words exch def\n" " /n words length def\n" " /n-rows break-words length def\n" " /Times-Roman findfont wordfontsize scalefont setfont\n" "\n" " /left-ends [0 dup words {stringwidth pop add gap add dup}\n" " forall pop pop] def\n" " /right-ends [0 words {stringwidth pop add dup gap add} forall pop] def\n" "\n" " /lwindows [ break-words {left-ends exch get gap 2 div sub } forall ] def\n" " /rwindows [1 1 n-rows 1 sub {/i exch def\n" " lwindows i get } for\n" " right-ends n 1 sub get gap 2 div add\n" " ] def\n" "\n" "\n" " /max 0 def\n" " 0 1 links length 1 sub {\n" " /i exch def\n" " /t links i get 2 get def\n" " t max gt {/max t def} if\n" " } for\n" "\n" " /max-height ed max mul ey add top-of-words add row-spacing add def\n" " /total-height n-rows max-height mul row-spacing sub def\n" "\n" " /max-width 0 def % compute the widest window\n" " 0 1 n-rows 1 sub {\n" " /i exch def\n" " /t rwindows i get lwindows i get sub def\n" " t max-width gt {/max-width t def} if\n" " } for\n" "\n" " centerpage max-width 2 div sub 0 translate % centers it\n" " % rightpage max-width sub 0 translate % right justified\n" " % Delete both of these to make it left justified\n" "\n" " n-rows 1 sub -1 0\n" " {/i exch def\n" " gsave\n" " newpath\n" " %/centering centerpage rwindows i get lwindows i get sub 2 div sub def\n" " % this line causes each row to be centered\n" " /centering 0 def\n" " % set centering to 0 to prevent centering of each row \n" "\n" " centering -100 moveto % -100 because some letters go below zero\n" " centering max-height n-rows mul lineto\n" " rwindows i get lwindows i get sub centering add\n" " max-height n-rows mul lineto\n" " rwindows i get lwindows i get sub centering add\n" " -100 lineto\n" " closepath\n" " clip\n" " lwindows i get neg n-rows i sub 1 sub max-height mul translate\n" " centerpage centering 0 translate\n" " words links diagram-sentence-circle\n" " grestore\n" " } for\n" " end\n" "} def \n" "\n" "/diagramx\n" "{diagramdict begin\n" " /break-words exch def\n" " /links exch def\n" " /words exch def\n" " /n words length def\n" " /n-rows break-words length def\n" " /Times-Roman findfont xwordfontsize scalefont setfont\n" "\n" " /left-ends [0 dup words {stringwidth pop add gap add dup}\n" " forall pop pop] def\n" " /right-ends [0 words {stringwidth pop add dup gap add} forall pop] def\n" "\n" " /lwindows [ break-words {left-ends exch get gap 2 div sub } forall ] def\n" " /rwindows [1 1 n-rows 1 sub {/i exch def\n" " lwindows i get } for\n" " right-ends n 1 sub get xgap 2 div add\n" " ] def\n" "\n" "\n" " /max 0 def\n" " 0 1 links length 1 sub {\n" " /i exch def\n" " /t links i get 2 get def\n" " t max gt {/max t def} if\n" " } for\n" "\n" " /max-height xed max mul xey add top-of-words add xrow-spacing add def\n" " /total-height n-rows max-height mul xrow-spacing sub def\n" "\n" " /max-width 0 def % compute the widest window\n" " 0 1 n-rows 1 sub {\n" " /i exch def\n" " /t rwindows i get lwindows i get sub def\n" " t max-width gt {/max-width t def} if\n" " } for\n" "\n" " centerpage max-width 2 div sub 0 translate % centers it\n" " % rightpage max-width sub 0 translate % right justified\n" " % Delete both of these to make it left justified\n" "\n" " n-rows 1 sub -1 0\n" " {/i exch def\n" " gsave\n" " newpath\n" " %/centering centerpage rwindows i get lwindows i get sub 2 div sub def\n" " % this line causes each row to be centered\n" " /centering 0 def\n" " % set centering to 0 to prevent centering of each row \n" "\n" " centering -100 moveto % -100 because some letters go below zero\n" " centering max-height n-rows mul lineto\n" " rwindows i get lwindows i get sub centering add\n" " max-height n-rows mul lineto\n" " rwindows i get lwindows i get sub centering add\n" " -100 lineto\n" " closepath\n" " clip\n" " lwindows i get neg n-rows i sub 1 sub max-height mul translate\n" " centerpage centering 0 translate\n" " words links diagram-sentence-circle\n" " grestore\n" " } for\n" " end\n" "} def \n" "\n" "/ldiagram\n" "{diagramdict begin\n" " /break-words exch def\n" " /links exch def\n" " /words exch def\n" " /n words length def\n" " /n-rows break-words length def\n" " /Times-Roman findfont wordfontsize scalefont setfont\n" "\n" " /left-ends [0 dup words {stringwidth pop add gap add dup}\n" " forall pop pop] def\n" " /right-ends [0 words {stringwidth pop add dup gap add} forall pop] def\n" "\n" " /lwindows [ break-words {left-ends exch get gap 2 div sub } forall ] def\n" " /rwindows [1 1 n-rows 1 sub {/i exch def\n" " lwindows i get } for\n" " right-ends n 1 sub get gap 2 div add\n" " ] def\n" "\n" "\n" " /max 0 def\n" " 0 1 links length 1 sub {\n" " /i exch def\n" " /t links i get 2 get def\n" " t max gt {/max t def} if\n" " } for\n" "\n" " /max-height ed max mul ey add top-of-words add row-spacing add def\n" " /total-height n-rows max-height mul row-spacing sub def\n" "\n" " /max-width 0 def % compute the widest window\n" " 0 1 n-rows 1 sub {\n" " /i exch def\n" " /t rwindows i get lwindows i get sub def\n" " t max-width gt {/max-width t def} if\n" " } for\n" "\n" " % centerpage max-width 2 div sub 0 translate % centers it\n" " % rightpage max-width sub 0 translate % right justified\n" " % Delete both of these to make it left justified\n" "\n" " n-rows 1 sub -1 0\n" " {/i exch def\n" " gsave\n" " newpath\n" " %/centering centerpage rwindows i get lwindows i get sub 2 div sub def\n" " % this line causes each row to be centered\n" " /centering 0 def\n" " % set centering to 0 to prevent centering of each row \n" "\n" " centering -100 moveto % -100 because some letters go below zero\n" " centering max-height n-rows mul lineto\n" " rwindows i get lwindows i get sub centering add\n" " max-height n-rows mul lineto\n" " rwindows i get lwindows i get sub centering add\n" " -100 lineto\n" " closepath\n" " clip\n" " lwindows i get neg n-rows i sub 1 sub max-height mul translate\n" " centerpage centering 0 translate\n" " words links diagram-sentence-circle\n" " grestore\n" " } for\n" " end\n" "} def \n" ; if (mode==1) return header_string; else return ""; } link-grammar-4.7.4/link-grammar/idiom.h0000644000175000017500000000213610764107267016760 0ustar bloombloom/********************************************************************************/ /* Copyright (c) 2004 */ /* Daniel Sleator, David Temperley, and John Lafferty */ /* All rights reserved */ /* */ /* Use of the link grammar parsing system is subject to the terms of the */ /* license set forth in the LICENSE file included with this software, */ /* and also available at http://www.link.cs.cmu.edu/link/license.html */ /* This license allows free redistribution and use in source and binary */ /* forms, with or without modification, subject to certain conditions. */ /* */ /********************************************************************************/ void insert_idiom(Dictionary dict, Dict_node *); int contains_underbar(const char *); int is_idiom_word(const char *); link-grammar-4.7.4/link-grammar/expand.c0000644000175000017500000000403711241601455017120 0ustar bloombloom/*************************************************************************/ /* Copyright (c) 2009 Linas Vepstas */ /* All rights reserved */ /* */ /* Use of the link grammar parsing system is subject to the terms of the */ /* license set forth in the LICENSE file included with this software, */ /* and also available at http://www.link.cs.cmu.edu/link/license.html */ /* This license allows free redistribution and use in source and binary */ /* forms, with or without modification, subject to certain conditions. */ /* */ /*************************************************************************/ /* * expand.c * * Enlarge the range of possible disjunct to consider while parsing. */ #include "api-structures.h" #include "expand.h" #include "disjunct-utils.h" #include "word-utils.h" #include "corpus/cluster.h" /* ========================================================= */ static Disjunct * build_expansion_disjuncts(Cluster *clu, X_node *x) { Disjunct *dj; dj = lg_cluster_get_disjuncts(clu, x->string); if (dj) printf("Expanded %s \n", x->string); return dj; } /** * Increase the number of disjuncts associated to each word in the * sentence by working with word-clusters. Return true if the number * of disjuncts were expanded, else return false. */ int lg_expand_disjunct_list(Sentence sent) { int w; Cluster *clu = lg_cluster_new(); int expanded = FALSE; for (w = 0; w < sent->length; w++) { X_node * x; Disjunct * d = sent->word[w].d; for (x = sent->word[w].x; x != NULL; x = x->next) { Disjunct *dx = build_expansion_disjuncts(clu, x); if (dx) { int cnt = count_disjuncts(d); d = catenate_disjuncts(dx, d); d = eliminate_duplicate_disjuncts(d); if (cnt < count_disjuncts(d)) expanded = TRUE; } } sent->word[w].d = d; } lg_cluster_delete(clu); return expanded; } link-grammar-4.7.4/link-grammar/print-util.h0000644000175000017500000000256011035451355017757 0ustar bloombloom/*************************************************************************/ /* Copyright (c) 2004 */ /* Daniel Sleator, David Temperley, and John Lafferty */ /* All rights reserved */ /* */ /* Use of the link grammar parsing system is subject to the terms of the */ /* license set forth in the LICENSE file included with this software, */ /* and also available at http://www.link.cs.cmu.edu/link/license.html */ /* This license allows free redistribution and use in source and binary */ /* forms, with or without modification, subject to certain conditions. */ /* */ /*************************************************************************/ #ifndef _PRINTUTILH_ #define _PRINTUTILH_ #if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ > 4) #define GNUC_PRINTF( format_idx, arg_idx ) \ __attribute__((__format__ (__printf__, format_idx, arg_idx))) #else #define GNUC_PRINTF( format_idx, arg_idx ) #endif typedef struct String_s String; String * string_new(void); void string_delete(String *); char * string_copy(String *); void append_string(String * string, const char *fmt, ...) GNUC_PRINTF(2,3); #endif link-grammar-4.7.4/link-grammar/post-process.h0000644000175000017500000000433610755732004020315 0ustar bloombloom/********************************************************************************/ /* Copyright (c) 2004 */ /* Daniel Sleator, David Temperley, and John Lafferty */ /* All rights reserved */ /* */ /* Use of the link grammar parsing system is subject to the terms of the */ /* license set forth in the LICENSE file included with this software, */ /* and also available at http://www.link.cs.cmu.edu/link/license.html */ /* This license allows free redistribution and use in source and binary */ /* forms, with or without modification, subject to certain conditions. */ /* */ /********************************************************************************/ /********************************************************************** Calling paradigm: . call post_process_open() with the name of a knowledge file. This returns a handle, used for all subsequent calls to post-process. . Do for each sentence: - Do for each generated linkage of sentence: + call post_process_scan_linkage() - Do for each generated linkage of sentence: + call post_process() - Call post_process_close_sentence() ***********************************************************************/ #ifndef _POSTPROCESSH_ #define _POSTPROCESSH_ #define PP_FIRST_PASS 1 #define PP_SECOND_PASS 2 /* Postprocessor * post_process_open(char *path); this is in api-prototypes.h */ void post_process_free_data(PP_data * ppd); void post_process_close_sentence(Postprocessor *); void post_process_scan_linkage(Postprocessor * pp, Parse_Options opts, Sentence sent , Sublinkage * sublinkage); PP_node *post_process(Postprocessor * pp, Parse_Options opts, Sentence sent, Sublinkage *, int cleanup); int post_process_match(const char *s, const char *t); /* utility function */ void free_d_type(D_type_list * dtl); D_type_list * copy_d_type(D_type_list * dtl); #endif link-grammar-4.7.4/link-grammar/fast-match.h0000644000175000017500000000213511032233412017662 0ustar bloombloom/*************************************************************************/ /* Copyright (c) 2004 */ /* Daniel Sleator, David Temperley, and John Lafferty */ /* All rights reserved */ /* */ /* Use of the link grammar parsing system is subject to the terms of the */ /* license set forth in the LICENSE file included with this software, */ /* and also available at http://www.link.cs.cmu.edu/link/license.html */ /* This license allows free redistribution and use in source and binary */ /* forms, with or without modification, subject to certain conditions. */ /* */ /*************************************************************************/ void init_fast_matcher(Sentence sent); void free_fast_matcher(Sentence sent); void put_match_list(Sentence, Match_node *); Match_node * form_match_list(Sentence, int, Connector *, int, Connector *, int); link-grammar-4.7.4/link-grammar/utilities.h0000644000175000017500000001656011524652373017676 0ustar bloombloom/*************************************************************************/ /* Copyright (c) 2004 */ /* Daniel Sleator, David Temperley, and John Lafferty */ /* All rights reserved */ /* */ /* Use of the link grammar parsing system is subject to the terms of the */ /* license set forth in the LICENSE file included with this software, */ /* and also available at http://www.link.cs.cmu.edu/link/license.html */ /* This license allows free redistribution and use in source and binary */ /* forms, with or without modification, subject to certain conditions. */ /* */ /*************************************************************************/ #ifndef _LINK_GRAMMAR_UTILITIES_H_ #define _LINK_GRAMMAR_UTILITIES_H_ #ifdef __CYGWIN__ #define _WIN32 1 #endif /* __CYGWIN__ */ #ifndef _WIN32 #include #endif #include #include #include #include #ifndef __CYGWIN__ /* I was told that cygwin does not have these files. */ #include #include #endif #if defined(__CYGWIN__) && defined(__MINGW32__) /* Some users have CygWin and MinGW installed! * In this case, use the MinGW versions of UTF-8 support. */ #include #include #endif #include "error.h" #ifdef _WIN32 #include #ifdef _MSC_VER /* The Microsoft Visual C compiler doesn't support the "inline" keyword. */ #define inline /* MS Visual C does not have any function normally found in strings.h */ /* In particular, be careful to avoid including strings.h */ /* MS Visual C uses non-standard string function names */ #define snprintf _snprintf #define vsnprintf _vsnprintf #define strcasecmp _stricmp #define strdup _strdup #define strncasecmp(a,b,s) strnicmp((a),(b),(s)) /* MS Visual C does not support some C99 standard floating-point functions */ #define fmaxf(a,b) ((a) > (b) ? (a) : (b)) #endif /* _MSC_VER */ /* Appearently, MinGW is also missing a variety of standard fuctions. * Not surprising, since MinGW is intended for compiling Windows * programs on Windows. * MINGW is also known as MSYS */ #if defined(_MSC_VER) || defined(__MINGW32__) /* No langinfo in Windows or MinGW */ #define nl_langinfo(X) "" /* strtok_r is missing in Windows */ char * strtok_r (char *s, const char *delim, char **saveptr); /* Windows doesn't have a thread-safe rand (???) */ /* Surely not, there must be something */ /* XXX FIXME -- this breaks thread safety on windows */ #define rand_r(seedp) rand() #endif /* _MSC_VER || __MINGW32__ */ /* * CYGWIN on Windows doesn't have UTF8 support, or wide chars ... * However, MS Visual C appearently does, as does MinGW. Since * some users have both cygwin and MinGW installed, crap out the * UTF8 code only when MinGW is missing. */ #if defined (__CYGWIN__) && !defined(__MINGW32__) #define mbstate_t char #define mbrtowc(w,s,n,x) ({*((char *)(w)) = *(s); 1;}) #define wcrtomb(s,w,x) ({*((char *)(s)) = ((char)(w)); 1;}) #define iswupper isupper #define iswalpha isalpha #define iswdigit isdigit #define iswspace isspace #define wchar_t char #define wint_t int #define fgetwc fgetc #define WEOF EOF #define towlower tolower #define towupper toupper #endif /* __CYGWIN__ and not __MINGW32__ */ #endif /* _WIN32 */ #if defined(__sun__) int strncasecmp(const char *s1, const char *s2, size_t n); /* This does not appear to be in string.h header file in sunos (Or in linux when I compile with -ansi) */ #endif #ifndef FALSE #define FALSE 0 #endif #ifndef TRUE #define TRUE 1 #endif #define assert(ex,string) { \ if (!(ex)) { \ prt_error("Assertion failed: %s\n", string); \ exit(1); \ } \ } #if !defined(MIN) #define MIN(X,Y) ( ((X) < (Y)) ? (X) : (Y)) #endif #if !defined(MAX) #define MAX(X,Y) ( ((X) > (Y)) ? (X) : (Y)) #endif static inline int wctomb_check(char *s, wchar_t wc, mbstate_t *ps) { int nr = wcrtomb(s, wc, ps); if (nr < 0) { prt_error("Fatal Error: unknown character set %s\n", nl_langinfo(CODESET)); exit(1); } return nr; } static inline int is_utf8_upper(const char *s) { mbstate_t mbs; wchar_t c; int nbytes; memset(&mbs, 0, sizeof(mbs)); nbytes = mbrtowc(&c, s, MB_CUR_MAX, &mbs); if (iswupper(c)) return nbytes; return 0; } static inline int is_utf8_alpha(const char *s) { mbstate_t mbs; wchar_t c; int nbytes; memset(&mbs, 0, sizeof(mbs)); nbytes = mbrtowc(&c, s, MB_CUR_MAX, &mbs); if (iswalpha(c)) return nbytes; return 0; } static inline int is_utf8_digit(const char *s) { mbstate_t mbs; wchar_t c; int nbytes; memset(&mbs, 0, sizeof(mbs)); nbytes = mbrtowc(&c, s, MB_CUR_MAX, &mbs); if (iswdigit(c)) return nbytes; return 0; } static inline int is_utf8_space(const char *s) { mbstate_t mbs; wchar_t c; int nbytes; memset(&mbs, 0, sizeof(mbs)); nbytes = mbrtowc(&c, s, MB_CUR_MAX, &mbs); if (iswspace(c)) return nbytes; return 0; } static inline const char * skip_utf8_upper(const char * s) { int nb = is_utf8_upper(s); while (nb) { s += nb; nb = is_utf8_upper(s); } return s; } /** * Return true if the intial upper-case letters of the * two input strings match. Comparison stops when * both srings descend to lowercase. */ static inline int utf8_upper_match(const char * s, const char * t) { mbstate_t mbs, mbt; wchar_t ws, wt; int ns, nt; memset(&mbs, 0, sizeof(mbs)); memset(&mbt, 0, sizeof(mbt)); ns = mbrtowc(&ws, s, MB_CUR_MAX, &mbs); nt = mbrtowc(&wt, t, MB_CUR_MAX, &mbt); while (iswupper(ws) || iswupper(wt)) { if (ws != wt) return FALSE; s += ns; t += nt; ns = mbrtowc(&ws, s, MB_CUR_MAX, &mbs); nt = mbrtowc(&wt, t, MB_CUR_MAX, &mbt); } return TRUE; } void downcase_utf8_str(char *to, const char * from, size_t usize); void upcase_utf8_str(char *to, const char * from, size_t usize); size_t lg_strlcpy(char * dest, const char *src, size_t size); void safe_strcpy(char *u, const char * v, size_t usize); void safe_strcat(char *u, const char *v, size_t usize); char *safe_strdup(const char *u); void left_print_string(FILE* fp, const char *, const char *); /* routines for allocating basic objects */ void init_memusage(void); void * xalloc(size_t); void * xrealloc(void *, size_t oldsize, size_t newsize); void * exalloc(size_t); #define TRACK_SPACE_USAGE #ifdef TRACK_SPACE_USAGE void xfree(void *, size_t); void exfree(void *, size_t); #else /* TRACK_SPACE_USAGE */ static inline void xfree(void *p, size_t sz) { free(p); } static inline void exfree(void *p, size_t sz) { free(p); }; #endif /* TRACK_SPACE_USAGE */ size_t get_space_in_use(void); size_t get_max_space_used(void); char * get_default_locale(void); char * join_path(const char * prefix, const char * suffix); FILE * dictopen(const char *filename, const char *how); void * object_open(const char *filename, void * (*opencb)(const char *, void *), void * user_data); /** * Returns the smallest power of two that is at least i and at least 1 */ static inline int next_power_of_two_up(int i) { int j=1; while(j #include #include #include #if (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3)) && defined(__ELF__) #define link_private __attribute__((__visibility__("hidden"))) #else #define link_private #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #endif link-grammar-4.7.4/link-grammar/link-grammar.def0000644000175000017500000001155311526022265020541 0ustar bloombloomlinkgrammar_get_version linkgrammar_get_dict_version dictionary_create dictionary_create_lang dictionary_create_default_lang dictionary_delete dictionary_get_max_cost dictionary_get_data_dir dictionary_set_data_dir dictionary_is_entity dictionary_is_past_tense_form parse_options_create parse_options_delete parse_options_set_verbosity parse_options_get_verbosity parse_options_set_linkage_limit parse_options_get_linkage_limit parse_options_set_disjunct_cost parse_options_set_disjunct_costf parse_options_get_disjunct_cost parse_options_get_disjunct_costf parse_options_set_min_null_count parse_options_get_min_null_count parse_options_set_max_null_count parse_options_get_max_null_count parse_options_set_null_block parse_options_get_null_block parse_options_set_islands_ok parse_options_get_islands_ok parse_options_set_spell_guess parse_options_get_spell_guess parse_options_set_short_length parse_options_get_short_length parse_options_set_max_memory parse_options_get_max_memory parse_options_set_max_sentence_length parse_options_get_max_sentence_length parse_options_set_max_parse_time parse_options_get_max_parse_time parse_options_set_cost_model_type parse_options_get_cost_model_type parse_options_set_use_fat_links parse_options_get_use_fat_links parse_options_set_use_sat_parser parse_options_get_use_sat_parser parse_options_timer_expired parse_options_memory_exhausted parse_options_resources_exhausted parse_options_set_screen_width parse_options_get_screen_width parse_options_set_allow_null parse_options_get_allow_null parse_options_set_use_cluster_disjuncts parse_options_get_use_cluster_disjuncts parse_options_set_display_walls parse_options_get_display_walls parse_options_set_all_short_connectors parse_options_get_all_short_connectors parse_options_reset_resources parse_options_set_batch_mode parse_options_get_batch_mode parse_options_set_panic_mode parse_options_get_panic_mode parse_options_set_display_on parse_options_get_display_on parse_options_set_display_postscript parse_options_get_display_postscript parse_options_set_display_constituents parse_options_get_display_constituents parse_options_set_display_bad parse_options_get_display_bad parse_options_set_display_disjuncts parse_options_get_display_disjuncts parse_options_set_display_links parse_options_get_display_links parse_options_set_display_senses parse_options_get_display_senses parse_options_set_display_union parse_options_get_display_union parse_options_set_echo_on parse_options_get_echo_on sentence_create sentence_delete sentence_split sentence_parse sentence_length sentence_get_word sentence_null_count sentence_num_linkages_found sentence_num_valid_linkages sentence_num_linkages_post_processed sentence_num_thin_linkages sentence_num_violations sentence_and_cost sentence_disjunct_cost sentence_link_cost sentence_get_nth_word sentence_nth_word_has_disjunction sentence_contains_conjunction linkage_create linkage_get_current_sublinkage linkage_set_current_sublinkage linkage_delete linkage_get_sentence linkage_get_num_sublinkages linkage_get_num_words linkage_get_num_links linkage_get_link_lword linkage_get_link_rword linkage_get_link_length linkage_get_link_label linkage_get_link_llabel linkage_get_link_rlabel linkage_get_link_num_domains linkage_get_link_domain_names linkage_get_words linkage_get_disjunct_str linkage_get_disjunct_cost linkage_get_disjunct_corpus_score linkage_get_word linkage_is_fat linkage_print_disjuncts linkage_free_disjuncts linkage_print_links_and_domains linkage_free_links_and_domains linkage_print_senses linkage_free_senses linkage_print_constituent_tree linkage_free_constituent_tree_str linkage_print_postscript linkage_free_postscript linkage_print_diagram linkage_free_diagram linkage_compute_union linkage_unused_word_cost linkage_disjunct_cost linkage_and_cost linkage_corpus_cost linkage_link_cost linkage_is_canonical linkage_is_improper linkage_has_inconsistent_domains linkage_get_violation_name post_process_open post_process_close linkage_post_process linkage_constituent_tree linkage_free_constituent_tree linkage_constituent_node_get_label linkage_constituent_node_get_child linkage_constituent_node_get_next linkage_constituent_node_get_start linkage_constituent_node_get_end issue_special_command lperrno lperrmsg lperror_clear prt_error parse_options_print_total_time extract_thin_linkage xfree count_set_effective_distance intersect_strings xalloc post_process_match match_in_connector_set build_deletable exalloc analyze_fat_linkage init_connector set_has_fat_down extract_fat_linkage analyze_thin_linkage build_effective_dist prune_match lg_strlcpy lg_compute_disjunct_strings lg_expand_disjunct_list object_open do_match dictionary_lookup_list build_disjuncts_for_dict_node free_disjuncts eliminate_duplicate_disjuncts catenate_disjuncts count_disjuncts print_one_disjunct build_disjuncts_for_X_node sentence_contains_conjunction init_count parse_info_new free_parse_info connector_new free_connectors link-grammar-4.7.4/link-grammar/regex-morph.h0000644000175000017500000000173011256532132020101 0ustar bloombloom/*************************************************************************/ /* Copyright (c) 2005 Sampo Pyysalo */ /* All rights reserved */ /* */ /* Use of the link grammar parsing system is subject to the terms of the */ /* license set forth in the LICENSE file included with this software, */ /* and also available at http://www.link.cs.cmu.edu/link/license.html */ /* This license allows free redistribution and use in source and binary */ /* forms, with or without modification, subject to certain conditions. */ /* */ /*************************************************************************/ #include "api-structures.h" int compile_regexs(Dictionary); const char *match_regex(Dictionary, const char *); void free_regexs(Dictionary dict); link-grammar-4.7.4/link-grammar/constituents.c0000644000175000017500000014756611511243520020415 0ustar bloombloom/*************************************************************************/ /* Copyright (c) 2004 */ /* Daniel Sleator, David Temperley, and John Lafferty */ /* All rights reserved */ /* */ /* Use of the link grammar parsing system is subject to the terms of the */ /* license set forth in the LICENSE file included with this software, */ /* and also available at http://www.link.cs.cmu.edu/link/license.html */ /* This license allows free redistribution and use in source and binary */ /* forms, with or without modification, subject to certain conditions. */ /* */ /*************************************************************************/ #include #include #include #include "error.h" #include "constituents.h" #define MAXCONSTITUENTS 8192 #define MAXSUBL 16 #define OPEN_BRACKET '[' #define CLOSE_BRACKET ']' typedef enum {OPEN_TOK, CLOSE_TOK, WORD_TOK} CType; typedef enum {NONE, STYPE, PTYPE, QTYPE, QDTYPE} WType; typedef struct { int left; int right; const char * type; char domain_type; const char * start_link; int start_num; int subl; int canon; int valid; #ifdef AUX_CODE_IS_DEAD /* The only code that actually sets aux to a non-zero value is code * followed by code that zets it to zero. -- its dead code, and so * aux is never actually used. Comment this code out. */ int aux; /* 0: it's an ordinary VP (or other type); * 1: it's an AUX, don't print it; * 2: it's an AUX, and print it */ #endif /* AUX_CODE_IS_DEAD */ } constituent_t; /* XXX it seems like the old code worked fine with MAX_ELTS=10 */ #define MAX_ELTS 100 typedef struct { int num; int e[MAX_ELTS]; int valid; } andlist_t; /* * Context used to store assorted intermediate data * when the constituent string is being generated. */ #define MAX_ANDS 1024 typedef struct { String_set * phrase_ss; WType wordtype[MAX_SENTENCE]; int word_used[MAXSUBL][MAX_SENTENCE]; int templist[MAX_ELTS]; constituent_t constituent[MAXCONSTITUENTS]; andlist_t andlist[MAX_ANDS]; } con_context_t; /* ================================================================ */ static inline int uppercompare(const char * s, const char * t) { return (FALSE == utf8_upper_match(s,t)); } /** * If a constituent c has a comma at either end, we exclude the * comma. (We continue to shift the boundary until we get to * something inside the current sublinkage) */ static void adjust_for_left_comma(con_context_t * ctxt, Linkage linkage, int c) { int w; w = ctxt->constituent[c].left; if (strcmp(linkage->word[w], ",") == 0) { w++; while (1) { if (ctxt->word_used[linkage->current][w] == 1) break; w++; } } ctxt->constituent[c].left = w; } static void adjust_for_right_comma(con_context_t *ctxt, Linkage linkage, int c) { int w; w = ctxt->constituent[c].right; if ((strcmp(linkage->word[w], ",") == 0) || (strcmp(linkage->word[w], "RIGHT-WALL") == 0)) { w--; while (1) { if (ctxt->word_used[linkage->current][w]==1) break; w--; } } ctxt->constituent[c].right = w; } static void print_constituent(con_context_t *ctxt, Linkage linkage, int c) { int w; if (verbosity < 2) return; printf(" c %2d %4s [%c] (%2d-%2d): ", c, ctxt->constituent[c].type, ctxt->constituent[c].domain_type, ctxt->constituent[c].left, ctxt->constituent[c].right); for (w = ctxt->constituent[c].left; w <= ctxt->constituent[c].right; w++) { printf("%s ", linkage->word[w]); /**PV**/ } printf("\n"); } /****************************************************** * These functions do the bulk of the actual * constituent-generating; they're called once for each * sublinkage *********************************************************/ /** * This function looks for constituents of type ctype1. Say it finds * one, call it c1. It searches for the next larger constituent of * type ctype2, call it c2. It then generates a new constituent of * ctype3, containing all the words in c2 but not c1. */ static int gen_comp(con_context_t *ctxt, Linkage linkage, int numcon_total, int numcon_subl, const char * ctype1, const char * ctype2, const char * ctype3, int x) { int w, w2, w3, c, c1, c2, done; c = numcon_total + numcon_subl; for (c1=numcon_total; c1constituent[c1].start_link)==0)) continue; /* If ctype1 is X, and domain_type is t, it's an infinitive - skip it */ if ((x==2) && (ctxt->constituent[c1].domain_type=='t')) continue; /* If it's domain-type z, it's a subject-relative clause; the VP doesn't need an NP */ if (ctxt->constituent[c1].domain_type=='z') continue; /* If ctype1 is X or VP, and it's not started by an S, don't generate an NP (Neither of the two previous checks are necessary now, right?) */ if ((x==1 || x==2) && (((post_process_match("S", ctxt->constituent[c1].start_link) == 0) && (post_process_match("SX", ctxt->constituent[c1].start_link) == 0) && (post_process_match("SF", ctxt->constituent[c1].start_link) == 0)) || (post_process_match("S##w", ctxt->constituent[c1].start_link) != 0))) continue; /* If it's an SBAR (relative clause case), it has to be a relative clause */ if ((x==3) && ((post_process_match("Rn", ctxt->constituent[c1].start_link) == 0) && (post_process_match("R*", ctxt->constituent[c1].start_link) == 0) && (post_process_match("MX#r", ctxt->constituent[c1].start_link) == 0) && (post_process_match("Mr", ctxt->constituent[c1].start_link) == 0) && (post_process_match("MX#d", ctxt->constituent[c1].start_link) == 0))) continue; /* If ctype1 is SBAR (clause opener case), it has to be an f domain */ if ((x==5) && (ctxt->constituent[c1].domain_type!='f')) continue; /* If ctype1 is SBAR (pp opener case), it has to be a g domain */ if ((x==6) && (ctxt->constituent[c1].domain_type!='g')) continue; /* If ctype1 is NP (paraphrase case), it has to be started by an SI */ if ((x==7) && (post_process_match("SI", ctxt->constituent[c1].start_link)==0)) continue; /* If ctype1 is VP (participle modifier case), it has to be started by an Mv or Mg */ if ((x==8) && (post_process_match("M", ctxt->constituent[c1].start_link)==0)) continue; /* If ctype1 is VP (participle opener case), it has to be started by a COp */ if ((x==9) && (post_process_match("COp", ctxt->constituent[c1].start_link)==0)) continue; /* Now start at the bounds of c1, and work outwards until you find a larger constituent of type ctype2 */ if (!(strcmp(ctxt->constituent[c1].type, ctype1)==0)) continue; if (verbosity >= 2) printf("Generating complement constituent for c %d of type %s\n", c1, ctype1); done = 0; for (w2=ctxt->constituent[c1].left; (done==0) && (w2>=0); w2--) { for (w3=ctxt->constituent[c1].right; w3num_words; w3++) { for (c2=numcon_total; (done==0) && (c2 < numcon_total + numcon_subl); c2++) { if (!((ctxt->constituent[c2].left==w2) && (ctxt->constituent[c2].right==w3)) || (c2==c1)) continue; if (!(strcmp(ctxt->constituent[c2].type, ctype2)==0)) continue; /* if the new constituent (c) is to the left of c1, its right edge should be adjacent to the left edge of c1 - or as close as possible without going outside the current sublinkage. (Or substituting right and left as necessary.) */ if ((x==5) || (x==6) || (x==9)) { /* This is the case where c is to the RIGHT of c1 */ w = ctxt->constituent[c1].right+1; while(1) { if (ctxt->word_used[linkage->current][w]==1) break; w++; } if (w > ctxt->constituent[c2].right) { done=1; continue; } ctxt->constituent[c].left = w; ctxt->constituent[c].right = ctxt->constituent[c2].right; } else { w = ctxt->constituent[c1].left-1; while(1) { if (ctxt->word_used[linkage->current][w] == 1) break; w--; } if (w < ctxt->constituent[c2].left) { done=1; continue; } ctxt->constituent[c].right = w; ctxt->constituent[c].left = ctxt->constituent[c2].left; } adjust_for_left_comma(ctxt, linkage, c1); adjust_for_right_comma(ctxt, linkage, c1); ctxt->constituent[c].type = string_set_add(ctype3, ctxt->phrase_ss); ctxt->constituent[c].domain_type = 'x'; ctxt->constituent[c].start_link = string_set_add("XX", ctxt->phrase_ss); ctxt->constituent[c].start_num = ctxt->constituent[c1].start_num; /* bogus */ if (verbosity >= 2) { printf("Larger c found: c %d (%s); ", c2, ctype2); printf("Adding constituent:\n"); print_constituent(ctxt, linkage, c); } c++; if (MAXCONSTITUENTS <= c) { err_ctxt ec; ec.sent = linkage->sent; err_msg(&ec, Error, "Error: Too many constituents (a).\n"); c--; } done = 1; } } } if (verbosity >= 2) { if (done == 0) printf("No constituent added, because no larger %s " \ " was found\n", ctype2); } } numcon_subl = c - numcon_total; return numcon_subl; } /** * Look for a constituent started by an MVs or MVg. * Find any VP's or ADJP's that contain it (without going * beyond a larger S or NP). Adjust them so that * they end right before the m domain starts. */ static void adjust_subordinate_clauses(con_context_t *ctxt, Linkage linkage, int numcon_total, int numcon_subl) { int c, w, c2, w2, done; for (c=numcon_total; cconstituent[c].start_link) == 1) || (post_process_match("MVg", ctxt->constituent[c].start_link)==1)) { done=0; for (w2=ctxt->constituent[c].left-1; (done==0) && w2>=0; w2--) { for (c2=numcon_total; c2constituent[c2].left==w2) && (ctxt->constituent[c2].right >= ctxt->constituent[c].right))) continue; if ((strcmp(ctxt->constituent[c2].type, "S") == 0) || (strcmp(ctxt->constituent[c2].type, "NP") == 0)) { done=1; break; } if ((ctxt->constituent[c2].domain_type == 'v') || (ctxt->constituent[c2].domain_type == 'a')) { w = ctxt->constituent[c].left-1; while (1) { if (ctxt->word_used[linkage->current][w] == 1) break; w--; } ctxt->constituent[c2].right = w; if (verbosity >= 2) printf("Adjusting constituent %d:\n", c2); print_constituent(ctxt, linkage, c2); } } } if (strcmp(linkage->word[ctxt->constituent[c].left], ",") == 0) ctxt->constituent[c].left++; } } } /****************************************************** * These functions are called once, after constituents * for each sublinkage have been generated, to merge them * together and fix up some other things. * ********************************************************/ /** * Here we're looking for the next andlist element to add on * to a conjectural andlist, stored in the array templist. * We go through the constituents, starting at "start". */ static int find_next_element(con_context_t *ctxt, Linkage linkage, int start, int numcon_total, int num_elements, int num_lists) { int c, a, ok, c2, c3, addedone=0, n; assert(num_elements <= MAX_ELTS, "Constutent element array overflow!\n"); n = num_lists; for (c=start+1; cconstituent[c]; if (cc->valid == 0) continue; if (strcmp(ctxt->constituent[ctxt->templist[0]].type, cc->type)!=0) continue; ok = 1; /* We're considering adding constituent c to the andlist. If c is in the same sublinkage as one of the other andlist elements, don't add it. If it overlaps with one of the other constituents, don't add it. If there's a constituent identical to c that occurs in a sublinkage in which one of the other elements occurs, don't add it. */ for (a=0; atemplist[a]; constituent_t *ct = &ctxt->constituent[t]; if (cc->subl == ct->subl) ok=0; if (((cc->left < ct->left) && (cc->right > ct->left)) || ((cc->right > ct->right) && (cc->left < ct->right)) || ((cc->right > ct->right) && (cc->left < ct->right)) || ((cc->left > ct->left) && (cc->right < ct->right))) ok=0; for (c2=0; c2constituent[c2].canon != cc->canon) continue; for (c3=0; c3constituent[c3].canon == ct->canon) && (ctxt->constituent[c3].subl == ctxt->constituent[c2].subl)) ok=0; } } } if (ok == 0) continue; ctxt->templist[num_elements] = c; addedone = 1; num_lists = find_next_element(ctxt, linkage, c, numcon_total, num_elements+1, num_lists); /* Test for overlow of the and-list. * With the current parser, the following will cause an * overflow: * * I have not seen the grysbok, or the suni, or the dibitag, or * the lechwi, or the aoul, or the gerenuk, or the blaauwbok, * or the chevrotain, or lots of others, but who in the world * could guess what they were or what they looked like, judging * only from the names? */ if (MAX_ANDS <= num_lists) { err_ctxt ec; ec.sent = linkage->sent; err_msg(&ec, Error, "Error: Constituent overflowed andlist!\n"); return MAX_ANDS; } } if (addedone == 0 && num_elements > 1) { for (a=0; aandlist[num_lists].e[a] = ctxt->templist[a]; ctxt->andlist[num_lists].num = num_elements; } num_lists++; } return num_lists; } static int merge_constituents(con_context_t *ctxt, Linkage linkage, int numcon_total) { int c1, c2=0, c3, ok, a, n, a2, n2, match, listmatch, a3; int num_lists, num_elements; int leftend, rightend; for (c1=0; c1constituent[c1].valid = 1; /* Find and invalidate any constituents with negative length */ if(ctxt->constituent[c1].right < ctxt->constituent[c1].left) { if(verbosity >= 2) { err_ctxt ec; ec.sent = linkage->sent; err_msg(&ec, Warn, "Warning: Constituent %d has negative length. Deleting it.\n", c1); } ctxt->constituent[c1].valid = 0; } ctxt->constituent[c1].canon = c1; } /* First go through and give each constituent a canonical number (the index number of the lowest-numbered constituent identical to it) */ for (c1 = 0; c1 < numcon_total; c1++) { if (ctxt->constituent[c1].canon != c1) continue; for (c2 = c1 + 1; c2 < numcon_total; c2++) { if ((ctxt->constituent[c1].left == ctxt->constituent[c2].left) && (ctxt->constituent[c1].right == ctxt->constituent[c2].right) && (strcmp(ctxt->constituent[c1].type, ctxt->constituent[c2].type) == 0)) { ctxt->constituent[c2].canon = c1; } } } /* If constituents A and B in different sublinkages X and Y * have one endpoint in common, but A is larger at the other end, * and B has no duplicate in X, then declare B invalid. (Example: * " [A [B We saw the cat B] and the dog A] " */ for (c1 = 0; c1 < numcon_total; c1++) { if (ctxt->constituent[c1].valid == 0) continue; for (c2 = 0; c2 < numcon_total; c2++) { if (ctxt->constituent[c2].subl == ctxt->constituent[c1].subl) continue; ok = 1; /* Does c2 have a duplicate in the sublinkage containing c1? If so, bag it */ for (c3 = 0; c3 < numcon_total; c3++) { if ((ctxt->constituent[c2].canon == ctxt->constituent[c3].canon) && (ctxt->constituent[c3].subl == ctxt->constituent[c1].subl)) ok = 0; } for (c3 = 0; c3 < numcon_total; c3++) { if ((ctxt->constituent[c1].canon == ctxt->constituent[c3].canon) && (ctxt->constituent[c3].subl == ctxt->constituent[c2].subl)) ok = 0; } if (ok == 0) continue; if ((ctxt->constituent[c1].left == ctxt->constituent[c2].left) && (ctxt->constituent[c1].right > ctxt->constituent[c2].right) && (strcmp(ctxt->constituent[c1].type, ctxt->constituent[c2].type) == 0)) { ctxt->constituent[c2].valid = 0; } if ((ctxt->constituent[c1].left < ctxt->constituent[c2].left) && (ctxt->constituent[c1].right == ctxt->constituent[c2].right) && (strcmp(ctxt->constituent[c1].type, ctxt->constituent[c2].type) == 0)) { ctxt->constituent[c2].valid = 0; } } } /* Now go through and find duplicates; if a pair is found, * mark one as invalid. (It doesn't matter if they're in the * same sublinkage or not) */ for (c1 = 0; c1 < numcon_total; c1++) { if (ctxt->constituent[c1].valid == 0) continue; for (c2 = c1 + 1; c2 < numcon_total; c2++) { if (ctxt->constituent[c2].canon == ctxt->constituent[c1].canon) ctxt->constituent[c2].valid = 0; } } /* Now we generate the and-lists. An and-list is a set of mutually * exclusive constituents. Each constituent in the list may not * be present in the same sublinkage as any of the others. */ num_lists = 0; for (c1 = 0; c1 < numcon_total; c1++) { if (ctxt->constituent[c1].valid == 0) continue; num_elements = 1; ctxt->templist[0] = c1; num_lists = find_next_element(ctxt, linkage, c1, numcon_total, num_elements, num_lists); /* If we're overflowing, then punt */ if (MAX_ANDS <= num_lists) break; } if (verbosity >= 2) { printf("And-lists:\n"); for (n=0; nandlist[n].num; a++) { printf("%d ", ctxt->andlist[n].e[a]); } printf("\n"); } } /* Now we prune out any andlists that are subsumed by other * andlists--e.g. if andlist X contains constituents A and B, * and Y contains A B and C, we throw out X */ for (n = 0; n < num_lists; n++) { ctxt->andlist[n].valid = 1; for (n2 = 0; n2 < num_lists; n2++) { if (n2 == n) continue; if (ctxt->andlist[n2].num < ctxt->andlist[n].num) continue; listmatch = 1; for (a = 0; a < ctxt->andlist[n].num; a++) { match = 0; for (a2 = 0; a2 < ctxt->andlist[n2].num; a2++) { if (ctxt->andlist[n2].e[a2] == ctxt->andlist[n].e[a]) match = 1; } if (match == 0) listmatch = 0; /* At least one element was not matched by n2 */ } if (listmatch == 1) ctxt->andlist[n].valid = 0; } } /* If an element of an andlist contains an element of another * andlist, it must contain the entire andlist. */ for (n = 0; n < num_lists; n++) { if (ctxt->andlist[n].valid == 0) continue; for (a = 0; (a < ctxt->andlist[n].num) && (ctxt->andlist[n].valid); a++) { for (n2 = 0; (n2 < num_lists) && (ctxt->andlist[n].valid); n2++) { if ((n2 == n) || (ctxt->andlist[n2].valid == 0)) continue; for (a2 = 0; (a2 < ctxt->andlist[n2].num) && (ctxt->andlist[n].valid); a2++) { c1 = ctxt->andlist[n].e[a]; c2 = ctxt->andlist[n2].e[a2]; if (c1 == c2) continue; if (!((ctxt->constituent[c2].left <= ctxt->constituent[c1].left) && (ctxt->constituent[c2].right >= ctxt->constituent[c1].right))) continue; if (verbosity >= 2) printf("Found that c%d in list %d is bigger " \ "than c%d in list %d\n", c2, n2, c1, n); ok = 1; /* An element of n2 contains an element of n. * Now, we check to see if that element of n2 * contains ALL the elements of n. * If not, n is invalid. */ for (a3 = 0; a3 < ctxt->andlist[n].num; a3++) { c3 = ctxt->andlist[n].e[a3]; if ((ctxt->constituent[c2].left>ctxt->constituent[c3].left) || (ctxt->constituent[c2].rightconstituent[c3].right)) ok = 0; } if (ok != 0) continue; ctxt->andlist[n].valid = 0; if (verbosity >= 2) { printf("Eliminating andlist, " \ "n=%d, a=%d, n2=%d, a2=%d: ", n, a, n2, a2); for (a3 = 0; a3 < ctxt->andlist[n].num; a3++) { printf("%d ", ctxt->andlist[n].e[a3]); } printf("\n"); } } } } } if (verbosity >= 2) { printf("And-lists after pruning:\n"); for (n=0; nandlist[n].valid==0) continue; printf(" %d: ", n); for (a=0; aandlist[n].num; a++) { printf("%d ", ctxt->andlist[n].e[a]); } printf("\n"); } } c1 = numcon_total; for (n = 0; n < num_lists; n++) { if (ctxt->andlist[n].valid == 0) continue; leftend = 256; rightend = -1; for (a = 0; a < ctxt->andlist[n].num; a++) { c2 = ctxt->andlist[n].e[a]; if (ctxt->constituent[c2].left < leftend) { leftend = ctxt->constituent[c2].left; } if (ctxt->constituent[c2].right > rightend) { rightend=ctxt->constituent[c2].right; } } ctxt->constituent[c1].left = leftend; ctxt->constituent[c1].right = rightend; ctxt->constituent[c1].type = ctxt->constituent[c2].type; ctxt->constituent[c1].domain_type = 'x'; ctxt->constituent[c1].valid = 1; ctxt->constituent[c1].start_link = ctxt->constituent[c2].start_link; /* bogus */ ctxt->constituent[c1].start_num = ctxt->constituent[c2].start_num; /* bogus */ #ifdef AUX_CODE_IS_DEAD /* See comments above */ /* If a constituent within the andlist is an aux (aux==1), * set aux for the whole-list constituent to 2, also set * aux for the smaller constituent to 2, meaning they'll both * be printed (as an "X"). (If aux is 2 for the smaller * constituent going in, the same thing should be done, * though I doubt this ever happens.) */ for (a = 0; a < ctxt->andlist[n].num; a++) { c2 = ctxt->andlist[n].e[a]; if ((ctxt->constituent[c2].aux == 1) || (ctxt->constituent[c2].aux == 2)) { ctxt->constituent[c1].aux = 2; ctxt->constituent[c2].aux = 2; } } #endif /* AUX_CODE_IS_DEAD */ if (verbosity >= 2) printf("Adding constituent:\n"); print_constituent(ctxt, linkage, c1); c1++; } numcon_total = c1; return numcon_total; } /** * Go through all the words. If a word is on the right end of * an S (or SF or SX), wordtype[w]=STYPE. If it's also on the left end of a * Pg*b, I, PP, or Pv, wordtype[w]=PTYPE. If it's a question-word * used in an indirect question, wordtype[w]=QTYPE. If it's a * question-word determiner, wordtype[w]=QDTYPE. Else wordtype[w]=NONE. * (This function is called once for each sublinkage.) */ static void generate_misc_word_info(con_context_t * ctxt, Linkage linkage) { int l1, l2, w1, w2; const char * label1, * label2; for (w1=0; w1num_words; w1++) ctxt->wordtype[w1]=NONE; for (l1=0; l1wordtype[w1] = STYPE; for (l2=0; l2wordtype[w1] = PTYPE; } } } if (post_process_match("QI#d", label1)==1) { ctxt->wordtype[w1] = QTYPE; for (l2=0; l2wordtype[w1] = QDTYPE; } } } if (post_process_match("Mr", label1)==1) ctxt->wordtype[w1] = QDTYPE; if (post_process_match("MX#d", label1)==1) ctxt->wordtype[w1] = QDTYPE; } } static int last_minute_fixes(con_context_t *ctxt, Linkage linkage, int numcon_total) { int c, c2, global_leftend_found, adjustment_made, global_rightend_found, lastword, newcon_total = 0; Sentence sent; sent = linkage_get_sentence(linkage); for (c = 0; c < numcon_total; c++) { /* In a paraphrase construction ("John ran, he said"), the paraphrasing clause doesn't get an S. (This is true in Treebank II, not Treebank I) */ if (uppercompare(ctxt->constituent[c].start_link, "CP") == 0) { ctxt->constituent[c].valid = 0; } /* If it's a possessive with an "'s", the NP on the left should be extended to include the "'s". */ if ((uppercompare(ctxt->constituent[c].start_link, "YS") == 0) || (uppercompare(ctxt->constituent[c].start_link, "YP") == 0)) { ctxt->constituent[c].right++; } /* If a constituent has starting link MVpn, it's a time expression like "last week"; label it as a noun phrase (incorrectly) */ if (strcmp(ctxt->constituent[c].start_link, "MVpn") == 0) { ctxt->constituent[c].type = string_set_add("NP", ctxt->phrase_ss); } if (strcmp(ctxt->constituent[c].start_link, "COn") == 0) { ctxt->constituent[c].type = string_set_add("NP", ctxt->phrase_ss); } if (strcmp(ctxt->constituent[c].start_link, "Mpn") == 0) { ctxt->constituent[c].type = string_set_add("NP", ctxt->phrase_ss); } /* If the constituent is an S started by "but" or "and" at the beginning of the sentence, it should be ignored. */ if ((strcmp(ctxt->constituent[c].start_link, "Wdc") == 0) && (ctxt->constituent[c].left == 2)) { ctxt->constituent[c].valid = 0; } /* For prenominal adjectives, an ADJP constituent is assigned if it's a hyphenated (Ah) or comparative (Am) adjective; otherwise no ADJP is assigned, unless the phrase is more than one word long (e.g. "very big"). The same with certain types of adverbs. */ /* That was for Treebank I. For Treebank II, the rule only seems to apply to prenominal adjectives (of all kinds). However, it also applies to number expressions ("QP"). */ if ((post_process_match("A", ctxt->constituent[c].start_link) == 1) || (ctxt->constituent[c].domain_type == 'd') || (ctxt->constituent[c].domain_type == 'h')) { if (ctxt->constituent[c].right-ctxt->constituent[c].left == 0) { ctxt->constituent[c].valid = 0; } } if ((ctxt->constituent[c].domain_type == 'h') && (strcmp(linkage->word[ctxt->constituent[c].left - 1], "$") == 0)) { ctxt->constituent[c].left--; } #ifdef AUX_CODE_IS_DEAD /* See comments at top */ /* If a constituent has type VP and its aux value is 2, this means it's an aux that should be printed; change its type to "X". If its aux value is 1, set "valid" to 0. (This applies to Treebank I only) */ if (ctxt->constituent[c].aux == 2) { ctxt->constituent[c].type = string_set_add("X", ctxt->phrase_ss); } if (ctxt->constituent[c].aux == 1) { ctxt->constituent[c].valid = 0; } #endif /* AUX_CODE_IS_DEAD */ } numcon_total = numcon_total + newcon_total; /* If there's a global S constituent that includes everything except a final period or question mark, extend it by one word */ for (c = 0; c < numcon_total; c++) { if ((ctxt->constituent[c].right == linkage->num_words -3) && (ctxt->constituent[c].left == 1) && (strcmp(ctxt->constituent[c].type, "S") == 0) && (strcmp(sent->word[linkage->num_words -2].string, ".") == 0)) ctxt->constituent[c].right++; } /* If there's no S boundary at the very left end of the sentence, or the very right end, create a new S spanning the entire sentence */ lastword = linkage->num_words - 2; global_leftend_found = 0; global_rightend_found = 0; for (c = 0; c < numcon_total; c++) { if ((ctxt->constituent[c].left == 1) && (strcmp(ctxt->constituent[c].type, "S") == 0) && (ctxt->constituent[c].valid == 1)) { global_leftend_found = 1; } } for (c = 0; c < numcon_total; c++) { if ((ctxt->constituent[c].right >= lastword) && (strcmp(ctxt->constituent[c].type, "S") == 0) && (ctxt->constituent[c].valid == 1)) { global_rightend_found = 1; } } if ((global_leftend_found == 0) || (global_rightend_found == 0)) { c = numcon_total; ctxt->constituent[c].left = 1; ctxt->constituent[c].right = linkage->num_words-1; ctxt->constituent[c].type = string_set_add("S", ctxt->phrase_ss); ctxt->constituent[c].valid = 1; ctxt->constituent[c].domain_type = 'x'; numcon_total++; if (verbosity >= 2) printf("Adding global sentence constituent:\n"); print_constituent(ctxt, linkage, c); } /* Check once more to see if constituents are nested (checking BETWEEN sublinkages this time) */ while (1) { adjustment_made=0; for (c = 0; c < numcon_total; c++) { if(ctxt->constituent[c].valid == 0) continue; for (c2 = 0; c2 < numcon_total; c2++) { if(ctxt->constituent[c2].valid == 0) continue; if ((ctxt->constituent[c].left < ctxt->constituent[c2].left) && (ctxt->constituent[c].right < ctxt->constituent[c2].right) && (ctxt->constituent[c].right >= ctxt->constituent[c2].left)) { if (verbosity >= 2) { err_ctxt ec; ec.sent = linkage->sent; err_msg(&ec, Warn, "Warning: the constituents aren't nested! " "Adjusting them. (%d, %d)\n", c, c2); } ctxt->constituent[c].left = ctxt->constituent[c2].left; } } } if (adjustment_made == 0) break; } return numcon_total; } /** * This function generates a table, word_used[i][w], showing * whether each word w is used in each sublinkage i; if so, * the value for that cell of the table is 1. */ static void count_words_used(con_context_t *ctxt, Linkage linkage) { int i, w, link, num_subl; num_subl = linkage->num_sublinkages; if(linkage->unionized == 1 && num_subl > 1) num_subl--; if (verbosity >= 2) printf("Number of sublinkages = %d\n", num_subl); for (i=0; inum_words; w++) ctxt->word_used[i][w] = 0; linkage->current = i; for (link = 0; link < linkage_get_num_links(linkage); link++) { ctxt->word_used[i][linkage_get_link_lword(linkage, link)] = 1; ctxt->word_used[i][linkage_get_link_rword(linkage, link)] = 1; } if (verbosity >= 2) { printf("Sublinkage %d: ", i); for (w = 0; w < linkage->num_words; w++) { if (ctxt->word_used[i][w] == 0) printf("0 "); if (ctxt->word_used[i][w] == 1) printf("1 "); } printf("\n"); } } } static int add_constituent(con_context_t *ctxt, int c, Linkage linkage, Domain domain, int l, int r, const char * name) { int nwords = linkage->num_words-2; c++; /* Avoid running off end, to walls. */ if (l < 1) l=1; if (r > nwords) r = nwords; if (l > nwords) l = nwords; assert(l <= r, "negative constituent length!" ); ctxt->constituent[c].left = l; ctxt->constituent[c].right = r; ctxt->constituent[c].domain_type = domain.type; ctxt->constituent[c].start_link = linkage_get_link_label(linkage, domain.start_link); ctxt->constituent[c].start_num = domain.start_link; ctxt->constituent[c].type = string_set_add(name, ctxt->phrase_ss); return c; } static const char * cons_of_domain(Linkage linkage, char domain_type) { switch (domain_type) { case 'a': return "ADJP"; case 'b': return "SBAR"; case 'c': return "VP"; case 'd': return "QP"; case 'e': return "ADVP"; case 'f': return "SBAR"; case 'g': return "PP"; case 'h': return "QP"; case 'i': return "ADVP"; case 'k': return "PRT"; case 'n': return "NP"; case 'p': return "PP"; case 'q': return "SINV"; case 's': return "S"; case 't': return "VP"; case 'u': return "ADJP"; case 'v': return "VP"; case 'y': return "NP"; case 'z': return "VP"; default: { err_ctxt ec; ec.sent = linkage->sent; err_msg(&ec, Error, "Error: Illegal domain: %c\n", domain_type); return ""; } } } static int read_constituents_from_domains(con_context_t *ctxt, Linkage linkage, int numcon_total, int s) { int d, c, leftlimit, l, leftmost, rightmost, w, c2, numcon_subl = 0, w2; List_o_links * dlink; int rootright, rootleft, adjustment_made; Sublinkage * subl; const char * name; Domain domain; subl = &linkage->sublinkage[s]; for (d = 0, c = numcon_total; d < subl->pp_data.N_domains; d++, c++) { domain = subl->pp_data.domain_array[d]; rootright = linkage_get_link_rword(linkage, domain.start_link); rootleft = linkage_get_link_lword(linkage, domain.start_link); if ((domain.type=='c') || (domain.type=='d') || (domain.type=='e') || (domain.type=='f') || (domain.type=='g') || (domain.type=='u') || (domain.type=='y')) { leftlimit = 0; leftmost = linkage_get_link_lword(linkage, domain.start_link); rightmost = linkage_get_link_lword(linkage, domain.start_link); } else { leftlimit = linkage_get_link_lword(linkage, domain.start_link) + 1; leftmost = linkage_get_link_rword(linkage, domain.start_link); rightmost = linkage_get_link_rword(linkage, domain.start_link); } /* Start by assigning both left and right limits to the * right word of the start link. This will always be contained * in the constituent. This will also handle the case * where the domain contains no links. */ for (dlink = domain.lol; dlink != NULL; dlink = dlink->next) { l = dlink->link; if ((linkage_get_link_lword(linkage, l) < leftmost) && (linkage_get_link_lword(linkage, l) >= leftlimit)) { leftmost = linkage_get_link_lword(linkage, l); } if (linkage_get_link_rword(linkage, l) > rightmost) { rightmost = linkage_get_link_rword(linkage, l); } } c--; c = add_constituent(ctxt, c, linkage, domain, leftmost, rightmost, cons_of_domain(linkage, domain.type)); if (domain.type == 'z') { c = add_constituent(ctxt, c, linkage, domain, leftmost, rightmost, "S"); } if (domain.type=='c') { c = add_constituent(ctxt, c, linkage, domain, leftmost, rightmost, "S"); } if ((post_process_match("Ce*", ctxt->constituent[c].start_link)==1) || (post_process_match("Rn", ctxt->constituent[c].start_link)==1)) { c = add_constituent(ctxt, c, linkage, domain, leftmost, rightmost, "SBAR"); } if ((post_process_match("R*", ctxt->constituent[c].start_link)==1) || (post_process_match("MX#r", ctxt->constituent[c].start_link)==1)) { w = leftmost; if (strcmp(linkage->word[w], ",") == 0) w++; c = add_constituent(ctxt, c, linkage, domain, w, w, "WHNP"); } if (post_process_match("Mj", ctxt->constituent[c].start_link) == 1) { w = leftmost; if (strcmp(linkage->word[w], ",") == 0) w++; c = add_constituent(ctxt, c, linkage, domain, w, w+1, "WHPP"); c = add_constituent(ctxt, c, linkage, domain, w+1, w+1, "WHNP"); } if ((post_process_match("Ss#d", ctxt->constituent[c].start_link)==1) || (post_process_match("B#d", ctxt->constituent[c].start_link)==1)) { c = add_constituent(ctxt, c, linkage, domain, rootleft, rootleft, "WHNP"); c = add_constituent(ctxt, c, linkage, domain, rootleft, ctxt->constituent[c-1].right, "SBAR"); } if (post_process_match("CP", ctxt->constituent[c].start_link)==1) { if (strcmp(linkage->word[leftmost], ",") == 0) ctxt->constituent[c].left++; c = add_constituent(ctxt, c, linkage, domain, 1, linkage->num_words-1, "S"); } if ((post_process_match("MVs", ctxt->constituent[c].start_link)==1) || (domain.type=='f')) { w = ctxt->constituent[c].left; if (strcmp(linkage->word[w], ",") == 0) w++; if (strcmp(linkage->word[w], "when") == 0) { c = add_constituent(ctxt, c, linkage, domain, w, w, "WHADVP"); } } if (domain.type=='t') { c = add_constituent(ctxt, c, linkage, domain, leftmost, rightmost, "S"); } if ((post_process_match("QI", ctxt->constituent[c].start_link) == 1) || (post_process_match("Mr", ctxt->constituent[c].start_link) == 1) || (post_process_match("MX#d", ctxt->constituent[c].start_link) == 1)) { w = leftmost; if (strcmp(linkage->word[w], ",") == 0) w++; if (ctxt->wordtype[w] == NONE) name = "WHADVP"; else if (ctxt->wordtype[w] == QTYPE) name = "WHNP"; else if (ctxt->wordtype[w] == QDTYPE) name = "WHNP"; else assert(0, "Unexpected word type"); c = add_constituent(ctxt, c, linkage, domain, w, w, name); if (ctxt->wordtype[w] == QDTYPE) { /* Now find the finite verb to the right, start an S */ /* Limit w2 to sentence length. */ // for( w2=w+1; w2 < ctxt->r_limit-1; w2++ ) for (w2 = w+1; w2 < rightmost; w2++) if ((ctxt->wordtype[w2] == STYPE) || (ctxt->wordtype[w2] == PTYPE)) break; /* Adjust the right boundary of previous constituent */ ctxt->constituent[c].right = w2 - 1; c = add_constituent(ctxt, c, linkage, domain, w2, rightmost, "S"); } } if (ctxt->constituent[c].domain_type == '\0') { err_ctxt ec; ec.sent = linkage->sent; err_msg(&ec, Error, "Error: no domain type assigned to constituent\n"); } if (ctxt->constituent[c].start_link == NULL) { err_ctxt ec; ec.sent = linkage->sent; err_msg(&ec, Error, "Error: no type assigned to constituent\n"); } } numcon_subl = c - numcon_total; /* numcon_subl = handle_islands(linkage, numcon_total, numcon_subl); */ if (verbosity >= 2) printf("Constituents added at first stage for subl %d:\n", linkage->current); for (c = numcon_total; c < numcon_total + numcon_subl; c++) { print_constituent(ctxt, linkage, c); } /* Opener case - generates S around main clause. (This must be done first; the S generated will be needed for later cases.) */ numcon_subl = gen_comp(ctxt, linkage, numcon_total, numcon_subl, "SBAR", "S", "S", 5); /* pp opener case */ numcon_subl = gen_comp(ctxt, linkage, numcon_total, numcon_subl, "PP", "S", "S", 6); /* participle opener case */ numcon_subl = gen_comp(ctxt, linkage, numcon_total, numcon_subl, "S", "S", "S", 9); /* Subject-phrase case; every main VP generates an S */ numcon_subl = gen_comp(ctxt, linkage, numcon_total, numcon_subl, "VP", "S", "NP", 1); /* Relative clause case; an SBAR generates a complement NP */ numcon_subl = gen_comp(ctxt, linkage, numcon_total, numcon_subl, "SBAR", "NP", "NP", 3); /* Participle modifier case */ numcon_subl = gen_comp(ctxt, linkage, numcon_total, numcon_subl, "VP", "NP", "NP", 8); /* PP modifying NP */ numcon_subl = gen_comp(ctxt, linkage, numcon_total, numcon_subl, "PP", "NP", "NP", 8); /* Appositive case */ numcon_subl = gen_comp(ctxt, linkage, numcon_total, numcon_subl, "NP", "NP", "NP", 4); /* S-V inversion case; an NP generates a complement VP */ numcon_subl = gen_comp(ctxt, linkage, numcon_total, numcon_subl, "NP", "SINV", "VP", 7); adjust_subordinate_clauses(ctxt, linkage, numcon_total, numcon_subl); for (c = numcon_total; c < numcon_total + numcon_subl; c++) { if ((ctxt->constituent[c].domain_type=='p') && (strcmp(linkage->word[ctxt->constituent[c].left], ",")==0)) { ctxt->constituent[c].left++; } } /* Make sure the constituents are nested. If two constituents * are not nested: whichever constituent has the furthest left * boundary, shift that boundary rightwards to the left boundary * of the other one. */ while (1) { adjustment_made = 0; for (c = numcon_total; c < numcon_total + numcon_subl; c++) { for (c2 = numcon_total; c2 < numcon_total + numcon_subl; c2++) { if ((ctxt->constituent[c].left < ctxt->constituent[c2].left) && (ctxt->constituent[c].right < ctxt->constituent[c2].right) && (ctxt->constituent[c].right >= ctxt->constituent[c2].left)) { /* We've found two overlapping constituents. If one is larger, except the smaller one includes an extra comma, adjust the smaller one to exclude the comma */ if ((strcmp(linkage->word[ctxt->constituent[c2].right], ",") == 0) || (strcmp(linkage->word[ctxt->constituent[c2].right], "RIGHT-WALL") == 0)) { if (verbosity >= 2) printf("Adjusting %d to fix comma overlap\n", c2); adjust_for_right_comma(ctxt, linkage, c2); adjustment_made = 1; } else if (strcmp(linkage->word[ctxt->constituent[c].left], ",") == 0) { if (verbosity >= 2) printf("Adjusting c %d to fix comma overlap\n", c); adjust_for_left_comma(ctxt, linkage, c); adjustment_made = 1; } else { if (verbosity >= 2) { err_ctxt ec; ec.sent = linkage->sent; err_msg(&ec, Warn, "Warning: the constituents aren't nested! " "Adjusting them. (%d, %d)\n", c, c2); } ctxt->constituent[c].left = ctxt->constituent[c2].left; } } } } if (adjustment_made == 0) break; } #ifdef AUX_CODE_IS_DEAD /* The code here is ifdef-dead as it appears to be dead, as the computation it does * is immediately undone in the very next block. */ /* This labels certain words as auxiliaries (such as forms of "be" * with passives, forms of "have" wth past participles, * "to" with infinitives). These words start VP's which include * them. In Treebank I, these don't get printed unless they're part of an * andlist, in which case they get labeled "X". (this is why we need to * label them as "aux".) In Treebank II, however, they seem to be treated * just like other verbs, so the "aux" stuff isn't needed. */ for (c = numcon_total; c < numcon_total + numcon_subl; c++) { ctxt->constituent[c].subl = linkage->current; if (((ctxt->constituent[c].domain_type == 'v') && (ctxt->wordtype[linkage_get_link_rword(linkage, ctxt->constituent[c].start_num)] == PTYPE)) || ((ctxt->constituent[c].domain_type == 't') && (strcmp(ctxt->constituent[c].type, "VP") == 0))) { ctxt->constituent[c].aux = 1; } else { ctxt->constituent[c].aux = 0; } } #endif /* AUX_CODE_IS_DEAD */ if (MAXCONSTITUENTS <= numcon_total + numcon_subl) { err_ctxt ec; ec.sent = linkage->sent; err_msg(&ec, Error, "Error: Too many constituents (a2).\n"); numcon_total = MAXCONSTITUENTS - numcon_subl; } for (c = numcon_total; c < numcon_total + numcon_subl; c++) { ctxt->constituent[c].subl = linkage->current; #ifdef AUX_CODE_IS_DEAD /* See comments at top */ ctxt->constituent[c].aux = 0; #endif /* AUX_CODE_IS_DEAD */ } return numcon_subl; } static char * exprint_constituent_structure(con_context_t *ctxt, Linkage linkage, int numcon_total) { int have_opened = 1; int c, w; int leftdone[MAXCONSTITUENTS]; int rightdone[MAXCONSTITUENTS]; int best, bestright, bestleft; Sentence sent; char s[100], * p; String * cs = string_new(); assert (numcon_total < MAXCONSTITUENTS, "Too many constituents (b)"); sent = linkage_get_sentence(linkage); for (c = 0; c < numcon_total; c++) { leftdone[c] = 0; rightdone[c] = 0; } if (verbosity >= 2) printf("\n"); for (w = 1; w < linkage->num_words; w++) { /* Skip left wall; don't skip right wall, since it may have constituent boundaries */ while(1) { best = -1; bestright = -1; for (c = 0; c < numcon_total; c++) { if ((ctxt->constituent[c].left == w) && (leftdone[c] == 0) && (ctxt->constituent[c].valid == 1) && (ctxt->constituent[c].right >= bestright)) { best = c; bestright = ctxt->constituent[c].right; } } if (best == -1) break; leftdone[best] = 1; /* have_open is a hack to avoid printing anything until * bracket is opened */ if (w == 1) have_opened = 0; #ifdef AUX_CODE_IS_DEAD /* See comments at top */ if (ctxt->constituent[best].aux == 1) continue; #endif /* AUX_CODE_IS_DEAD */ have_opened = 1; append_string(cs, "%c%s ", OPEN_BRACKET, ctxt->constituent[best].type); } /* Don't print out right wall */ if (have_opened && (w < linkage->num_words - 1)) { char *p; strcpy(s, sent->word[w].string); /* Constituent processing will crash if the sentence contains * square brackets, so we have to do something ... replace * them with curly braces ... will have to do. */ p = strchr(s, OPEN_BRACKET); while(p) { *p = '{'; p = strchr(p, OPEN_BRACKET); } p = strchr(s, CLOSE_BRACKET); while(p) { *p = '}'; p = strchr(p, CLOSE_BRACKET); } /* Now, if the first character of the word was originally uppercase, we put it back that way */ if (sent->word[w].firstupper == 1) upcase_utf8_str(s, s, MAX_WORD); append_string(cs, "%s ", s); } while(1) { best = -1; bestleft = -1; for(c = 0; c < numcon_total; c++) { if ((ctxt->constituent[c].right == w) && (rightdone[c] == 0) && (ctxt->constituent[c].valid == 1) && (ctxt->constituent[c].left > bestleft)) { best = c; bestleft = ctxt->constituent[c].left; } } if (best == -1) break; rightdone[best] = 1; #ifdef AUX_CODE_IS_DEAD /* See comments at top */ if (ctxt->constituent[best].aux == 1) continue; #endif /* AUX_CODE_IS_DEAD */ append_string(cs, "%s%c ", ctxt->constituent[best].type, CLOSE_BRACKET); } } append_string(cs, "\n"); p = string_copy(cs); string_delete(cs); return p; } static char * do_print_flat_constituents(con_context_t *ctxt, Linkage linkage) { int num_words; Sentence sent; Postprocessor * pp; int s, numcon_total, numcon_subl, num_subl; char * q; sent = linkage_get_sentence(linkage); ctxt->phrase_ss = string_set_create(); pp = linkage->sent->dict->constituent_pp; numcon_total = 0; count_words_used(ctxt, linkage); num_subl = linkage->num_sublinkages; if (num_subl > MAXSUBL) { num_subl = MAXSUBL; if (verbosity >= 2) printf("Number of sublinkages exceeds maximum: only considering first %d sublinkages\n", MAXSUBL); } if (linkage->unionized == 1 && num_subl > 1) num_subl--; for (s = 0; s < num_subl; s++) { linkage_set_current_sublinkage(linkage, s); linkage_post_process(linkage, pp); num_words = linkage_get_num_words(linkage); generate_misc_word_info(ctxt, linkage); numcon_subl = read_constituents_from_domains(ctxt, linkage, numcon_total, s); numcon_total = numcon_total + numcon_subl; if (MAXCONSTITUENTS <= numcon_total) { err_ctxt ec; ec.sent = linkage->sent; err_msg(&ec, Error, "Error: Too many constituents (c).\n"); numcon_total = MAXCONSTITUENTS-1; break; } } numcon_total = merge_constituents(ctxt, linkage, numcon_total); if (MAXCONSTITUENTS <= numcon_total) { err_ctxt ec; ec.sent = linkage->sent; err_msg(&ec, Error, "Error: Too many constituents (d).\n"); numcon_total = MAXCONSTITUENTS-1; } numcon_total = last_minute_fixes(ctxt, linkage, numcon_total); if (MAXCONSTITUENTS <= numcon_total) { err_ctxt ec; ec.sent = linkage->sent; err_msg(&ec, Error, "Error: Too many constituents (e).\n"); numcon_total = MAXCONSTITUENTS-1; } q = exprint_constituent_structure(ctxt, linkage, numcon_total); string_set_delete(ctxt->phrase_ss); ctxt->phrase_ss = NULL; return q; } static char * print_flat_constituents(Linkage linkage) { /* In principle, the ctxt could be allocated on stack, instead of * with malloc(). However, The java6 jvm (and MS Windows jvm's) * gives JNI clients only a small amount of stack space. Alloc'ing * this (rather large) structure on stack will blow up the JVM. * This was discovered only after much work. Bummer. */ char * p; con_context_t *ctxt = (con_context_t *) malloc (sizeof(con_context_t)); memset(ctxt, 0, sizeof(con_context_t)); p = do_print_flat_constituents(ctxt, linkage); free(ctxt); return p; } static CType token_type (char *token) { if ((token[0] == OPEN_BRACKET) && (strlen(token) > 1)) return OPEN_TOK; if ((strlen(token) > 1) && (token[strlen(token) - 1] == CLOSE_BRACKET)) return CLOSE_TOK; return WORD_TOK; } static CNode * make_CNode(char *q) { CNode * cn; cn = (CNode *) exalloc(sizeof(CNode)); cn->label = (char *) exalloc(sizeof(char)*(strlen(q)+1)); strcpy(cn->label, q); cn->child = cn->next = (CNode *) NULL; cn->next = (CNode *) NULL; cn->start = cn->end = -1; return cn; } static CNode * parse_string(CNode * n, char **saveptr) { char *q; CNode *m, *last_child=NULL; while ((q = strtok_r(NULL, " ", saveptr))) { switch (token_type(q)) { case CLOSE_TOK : q[strlen(q)-1]='\0'; assert(strcmp(q, n->label)==0, "Constituent tree: Labels do not match."); return n; break; case OPEN_TOK: m = make_CNode(q+1); m = parse_string(m, saveptr); break; case WORD_TOK: m = make_CNode(q); break; default: assert(0, "Constituent tree: Illegal token type"); } if (n->child == NULL) { last_child = n->child = m; } else { last_child->next = m; last_child = m; } } assert(0, "Constituent tree: Constituent did not close"); return NULL; } static void print_tree(String * cs, int indent, CNode * n, int o1, int o2) { int i, child_offset; CNode * m; if (n == NULL) return; if (indent) for (i = 0; i < o1; ++i) append_string(cs, " "); append_string(cs, "(%s ", n->label); child_offset = o2 + strlen(n->label) + 2; for (m = n->child; m != NULL; m = m->next) { if (m->child == NULL) { char * p; /* If the original string has left or right parens in it, * the printed string will be messed up by these ... * so replace them by curly braces. What else can one do? */ p = strchr(m->label, '('); while(p) { *p = '{'; p = strchr(p, '('); } p = strchr(m->label, ')'); while(p) { *p = '}'; p = strchr(p, ')'); } append_string(cs, "%s", m->label); if ((m->next != NULL) && (m->next->child == NULL)) append_string(cs, " "); } else { if (m != n->child) { if (indent) append_string(cs, "\n"); else append_string(cs, " "); print_tree(cs, indent, m, child_offset, child_offset); } else { print_tree(cs, indent, m, 0, child_offset); } if ((m->next != NULL) && (m->next->child == NULL)) { if (indent) { append_string(cs, "\n"); for (i = 0; i < child_offset; ++i) append_string(cs, " "); } else append_string(cs, " "); } } } append_string(cs, ")"); } static int assign_spans(CNode * n, int start) { int num_words=0; CNode * m=NULL; if (n==NULL) return 0; n->start = start; if (n->child == NULL) { n->end = start; return 1; } else { for (m=n->child; m!=NULL; m=m->next) { num_words += assign_spans(m, start+num_words); } n->end = start+num_words-1; } return num_words; } CNode * linkage_constituent_tree(Linkage linkage) { char *p, *q, *saveptr; int len; CNode * root; p = print_flat_constituents(linkage); len = strlen(p); q = strtok_r(p, " ", &saveptr); assert(token_type(q) == OPEN_TOK, "Illegal beginning of string"); root = make_CNode(q+1); root = parse_string(root, &saveptr); assign_spans(root, 0); exfree(p, sizeof(char)*(len+1)); return root; } void linkage_free_constituent_tree(CNode * n) { CNode *m, *x; for (m=n->child; m!=NULL; m=x) { x=m->next; linkage_free_constituent_tree(m); } exfree(n->label, sizeof(char)*(strlen(n->label)+1)); exfree(n, sizeof(CNode)); } /** * Print out the constituent tree. * mode 1: treebank-style constituent tree * mode 2: flat, bracketed tree [A like [B this B] A] * mode 3: flat, treebank-style tree (A like (B this) ) */ char * linkage_print_constituent_tree(Linkage linkage, int mode) { String * cs; CNode * root; char * p; if ((mode == 0) || (linkage->sent->dict->constituent_pp == NULL)) { return NULL; } else if (mode == 1 || mode == 3) { cs = string_new(); root = linkage_constituent_tree(linkage); print_tree(cs, (mode==1), root, 0, 0); linkage_free_constituent_tree(root); append_string(cs, "\n"); p = string_copy(cs); string_delete(cs); return p; } else if (mode == 2) { return print_flat_constituents(linkage); } assert(0, "Illegal mode in linkage_print_constituent_tree"); return NULL; } void linkage_free_constituent_tree_str(char * s) { exfree(s, strlen(s)+1); } const char * linkage_constituent_node_get_label(const CNode *n) { return n->label; } CNode * linkage_constituent_node_get_child(const CNode *n) { return n->child; } CNode * linkage_constituent_node_get_next(const CNode *n) { return n->next; } int linkage_constituent_node_get_start(const CNode *n) { return n->start; } int linkage_constituent_node_get_end(const CNode *n) { return n->end; } link-grammar-4.7.4/link-grammar/massage.h0000644000175000017500000000171411241073062017262 0ustar bloombloom/*************************************************************************/ /* Copyright (c) 2004 */ /* Daniel Sleator, David Temperley, and John Lafferty */ /* All rights reserved */ /* */ /* Use of the link grammar parsing system is subject to the terms of the */ /* license set forth in the LICENSE file included with this software, */ /* and also available at http://www.link.cs.cmu.edu/link/license.html */ /* This license allows free redistribution and use in source and binary */ /* forms, with or without modification, subject to certain conditions. */ /* */ /*************************************************************************/ void install_special_conjunctive_connectors(Sentence sent); link-grammar-4.7.4/link-grammar/error.h0000644000175000017500000000226511120541437016777 0ustar bloombloom/*************************************************************************/ /* Copyright (c) 2004 */ /* Daniel Sleator, David Temperley, and John Lafferty */ /* All rights reserved */ /* */ /* Use of the link grammar parsing system is subject to the terms of the */ /* license set forth in the LICENSE file included with this software, */ /* and also available at http://www.link.cs.cmu.edu/link/license.html */ /* This license allows free redistribution and use in source and binary */ /* forms, with or without modification, subject to certain conditions. */ /* */ /*************************************************************************/ #ifndef _LINK_GRAMMAR_ERROR_H_ #define _LINK_GRAMMAR_ERROR_H_ #include "link-includes.h" typedef struct { Sentence sent; } err_ctxt; typedef enum { Fatal = 1, Error, Warn, Info, Debug } severity; void err_msg(err_ctxt *, severity, const char *fmt, ...) GNUC_PRINTF(3,4); #endif link-grammar-4.7.4/link-grammar/tokenize.h0000644000175000017500000000203711176725237017510 0ustar bloombloom/*************************************************************************/ /* Copyright (c) 2004 */ /* Daniel Sleator, David Temperley, and John Lafferty */ /* All rights reserved */ /* */ /* Use of the link grammar parsing system is subject to the terms of the */ /* license set forth in the LICENSE file included with this software, */ /* and also available at http://www.link.cs.cmu.edu/link/license.html */ /* This license allows free redistribution and use in source and binary */ /* forms, with or without modification, subject to certain conditions. */ /* */ /*************************************************************************/ int separate_sentence(Sentence, Parse_Options); int build_sentence_expressions(Sentence, Parse_Options); int sentence_in_dictionary(Sentence); link-grammar-4.7.4/link-grammar/word-file.c0000644000175000017500000000703011171176332017530 0ustar bloombloom/***************************************************************************/ /* Copyright (c) 2004 */ /* Daniel Sleator, David Temperley, and John Lafferty */ /* All rights reserved */ /* */ /* Use of the link grammar parsing system is subject to the terms of the */ /* license set forth in the LICENSE file included with this software, */ /* and also available at http://www.link.cs.cmu.edu/link/license.html */ /* This license allows free redistribution and use in source and binary */ /* forms, with or without modification, subject to certain conditions. */ /* */ /***************************************************************************/ #include #include #include #include "error.h" /** * Reads in one word from the file, allocates space for it, * and returns it. */ static const char * get_a_word(Dictionary dict, FILE * fp) { char word[MAX_WORD+4]; /* allow for 4-byte wide chars */ const char * s; wint_t c; mbstate_t mbss; int j; do { c = fgetwc(fp); } while ((c != WEOF) && iswspace(c)); if (c == WEOF) return NULL; memset(&mbss, 0, sizeof(mbss)); for (j=0; (j <= MAX_WORD-1) && (!iswspace(c)) && (c != WEOF);) { j += wctomb_check(&word[j], c, &mbss); c = fgetwc(fp); } if (j >= MAX_WORD) { word[MAX_WORD] = 0x0; prt_error("Fatal Error: The dictionary contains a word that " "is too long. The word was: %s", word); exit(1); } word[j] = '\0'; s = string_set_add(word, dict->string_set); return s; } /** * * (1) opens the word file and adds it to the word file list * (2) reads in the words * (3) puts each word in a Dict_node * (4) links these together by their left pointers at the * front of the list pointed to by dn * (5) returns a pointer to the first of this list */ Dict_node * read_word_file(Dictionary dict, Dict_node * dn, char * filename) { Dict_node * dn_new; Word_file * wf; FILE * fp; const char * s; char file_name_copy[MAX_PATH_NAME+1]; safe_strcpy(file_name_copy, filename+1, sizeof(file_name_copy)); /* get rid of leading '/' */ if ((fp = dictopen(file_name_copy, "r")) == NULL) { prt_error("Error opening word file %s\n", file_name_copy); return NULL; } /*printf(" Reading \"%s\"\n", file_name_copy);*/ /*printf("*"); fflush(stdout);*/ wf = (Word_file *) xalloc(sizeof (Word_file)); safe_strcpy(wf->file, file_name_copy, sizeof(wf->file)); wf->changed = FALSE; wf->next = dict->word_file_header; dict->word_file_header = wf; while ((s = get_a_word(dict, fp)) != NULL) { dn_new = (Dict_node *) xalloc(sizeof(Dict_node)); dn_new->left = dn; dn = dn_new; dn->string = s; dn->file = wf; } fclose(fp); return dn; } void save_files(Dictionary dict) { Word_file *wf; FILE *fp; for (wf = dict->word_file_header; wf != NULL; wf = wf->next) { if (wf->changed) { if ((fp = fopen(wf->file, "w")) == NULL) { printf("\nCannot open %s. Gee, this shouldn't happen.\n", wf->file); printf("file not saved\n"); return; } printf(" saving file \"%s\"\n", wf->file); /*output_dictionary(dict_root, fp, wf);*/ fclose(fp); wf->changed = FALSE; } } } int files_need_saving(Dictionary dict) { Word_file *wf; for (wf = dict->word_file_header; wf != NULL; wf = wf->next) { if (wf->changed) return TRUE; } return FALSE; } link-grammar-4.7.4/link-grammar/api-structures.h0000644000175000017500000003202511526022265020640 0ustar bloombloom/*************************************************************************/ /* Copyright (c) 2004 */ /* Daniel Sleator, David Temperley, and John Lafferty */ /* All rights reserved */ /* */ /* Use of the link grammar parsing system is subject to the terms of the */ /* license set forth in the LICENSE file included with this software, */ /* and also available at http://www.link.cs.cmu.edu/link/license.html */ /* This license allows free redistribution and use in source and binary */ /* forms, with or without modification, subject to certain conditions. */ /* */ /*************************************************************************/ /***************************************************************************** * * NOTE: There are five basic "types" in the link parser API. These are: * * Dictionary, Parse_Options, Sentence, Linkage, PostProcessor * * To make the use of the API simpler, each of these is typedef'ed as a pointer * to a data structure. As a result, some of the code may look a little funny, * since it uses pointers in a way that is syntactically inconsistent. After * working a bit with these basic types enough, this should not be confusing. * ******************************************************************************/ #ifndef _API_STRUCTURESH_ #define _API_STRUCTURESH_ #include #include "api-types.h" #include "structures.h" /* for definition of Link */ #include "corpus/corpus.h" #include "error.h" typedef enum { VDAL=1, /* Sort by Violations, Disjunct cost, And cost, Link cost */ CORPUS, /* Sort by Corpus cost */ } Cost_Model_type; struct Cost_Model_s { Cost_Model_type type; int (*compare_fn)(Linkage_info *, Linkage_info *); }; struct Resources_s { int max_parse_time; /* in seconds */ size_t max_memory; /* in bytes */ double time_when_parse_started; size_t space_when_parse_started; double when_created; double when_last_called; double cumulative_time; int memory_exhausted; int timer_expired; }; struct Parse_Options_s { int verbosity; /* Level of detail to give about the computation 0 */ int use_sat_solver; /* Use the Boolean SAT based parser */ int linkage_limit; /* The maximum number of linkages processed 100 */ float disjunct_cost; /* Max disjunct cost to allow */ int use_fat_links; /* Look for fat linkages */ int min_null_count; /* The minimum number of null links to allow */ int max_null_count; /* The maximum number of null links to allow */ int null_block; /* consecutive blocks of this many words are considered as one null link (default=1) */ int islands_ok; /* If TRUE, then linkages with islands (separate component of the link graph) will be generated (default=FALSE) */ int twopass_length; /* min length for two-pass post processing */ int max_sentence_length; int short_length; /* Links that are limited in length can be * no longer than this. Default = 6 */ int all_short; /* If true, there can be no connectors that are exempt */ int use_spell_guess; /* Perform spell-guessing of unknown words. */ Cost_Model cost_model; /* For sorting linkages in post_processing */ Resources resources; /* For deciding when to abort the parsing */ /* Flags governing the command-line client; not used by parser */ int display_short; int display_word_subscripts; /* as in "dog.n" as opposed to "dog" */ int display_link_subscripts; /* as in "Ss" as opposed to "S" */ int display_walls; int display_union; /* print squashed version of linkage with conjunction? */ int allow_null; /* true if we allow null links in parsing */ int use_cluster_disjuncts; /* if true, atttempt using a borader list of disjuncts */ int echo_on; /* true if we should echo the input sentence */ int batch_mode; /* if true, process sentences non-interactively */ int panic_mode; /* if true, parse in "panic mode" after all else fails */ int screen_width; /* width of screen for displaying linkages */ int display_on; /* if true, output graphical linkage diagram */ int display_postscript; /* if true, output postscript linkage */ int display_constituents; /* if true, output treebank-style constituent structure */ int display_bad; /* if true, bad linkages are displayed */ int display_disjuncts; /* if true, print disjuncts that were used */ int display_links; /* if true, a list o' links is printed out */ int display_senses; /* if true, sense candidates are printed out */ }; struct Connector_set_s { Connector ** hash_table; int table_size; int is_defined; /* if 0 then there is no such set */ }; struct Dictionary_s { Dict_node * root; Regex_node * regex_root; const char * name; const char * lang; int use_unknown_word; int unknown_word_defined; /* If not null, then use spelling guesser for unknown words */ void * spell_checker; /* spell checker handle */ #if USE_CORPUS Corpus * corpus; /* Statistics database */ #endif #if DONT_USE_REGEX_GUESSING /* English language morphology bits * replaced by regex-based morpho guesser * Dead code, remove at leisure. */ int capitalized_word_defined; int pl_capitalized_word_defined; int hyphenated_word_defined; int number_word_defined; int ing_word_defined; int s_word_defined; int ed_word_defined; int ly_word_defined; #endif /* DONT_USE_REGEX_GUESSING */ int left_wall_defined; int right_wall_defined; /* Affixes are used during the tokenization stage. */ Dictionary affix_table; int r_strippable; /* right */ int l_strippable; /* left */ int u_strippable; /* units on left */ int s_strippable; /* generic suffix */ int p_strippable; /* generic prefix */ const char ** strip_left; const char ** strip_right; const char ** strip_units; const char ** prefix; const char ** suffix; Postprocessor * postprocessor; Postprocessor * constituent_pp; int andable_defined; Connector_set * andable_connector_set; /* NULL=everything is andable */ Connector_set * unlimited_connector_set; /* NULL=everthing is unlimited */ int max_cost; String_set * string_set; /* Set of link names constructed during parsing */ int num_entries; Word_file * word_file_header; /* exp_list links together all the Exp structs that are allocated * in reading this dictionary. Needed for freeing the dictionary */ Exp * exp_list; /* Private data elements that come in play only while the * dictionary is being read, and are not otherwise used. */ FILE * fp; char token[MAX_TOKEN_LENGTH]; int is_special; /* boolean */ wint_t already_got_it; int line_number; int recursive_error; /* boolean */ mbstate_t mbss; /* multi-byte shift state */ }; struct Label_node_s { int label; Label_node * next; }; #define HT_SIZE (1<<10) struct And_data_s { int LT_bound; int LT_size; Disjunct ** label_table; Label_node * hash_table[HT_SIZE]; /* keeping statistics */ int STAT_N_disjuncts; int STAT_calls_to_equality_test; }; struct Parse_info_struct { int x_table_size; int log2_x_table_size; X_table_connector ** x_table; Parse_set * parse_set; int N_words; Disjunct ** chosen_disjuncts; int N_links; Link link_array[MAX_LINKS]; /* Points to the image structure for each word. * NULL if not a fat word. */ Image_node ** image_array; /* Array of boolean flags, one per word. Set to TRUE if this * word has a fat down link. FALSE otherise */ Boolean *has_fat_down; /* thread-safe random number state */ unsigned int rand_state; }; struct Sentence_s { Dictionary dict; /* words are defined from this dictionary */ const char *orig_sentence; /* Copy of original sentence */ int length; /* number of words */ Word word[MAX_SENTENCE]; /* array of words after tokenization */ char * is_conjunction; /* Array of flags, one per word; set to TRUE if conjunction, as defined by dictionary */ char** deletable; /* deletable regions in a sentence with conjunction */ char** dptr; /* private pointer for mem management only */ char** effective_dist; int num_linkages_found; /* total number before postprocessing. This is returned by the count() function */ int num_linkages_alloced;/* total number of linkages allocated. the number post-processed might be fewer because some are non-canonical */ int num_linkages_post_processed; /* The number of linkages that are actually put into the array that was alloced. This is not the same as num alloced because some may be non-canonical. */ int num_valid_linkages; /* number with no pp violations */ int num_thin_linkages; /* valid linkages which are not fat */ int null_links; /* null links allowed */ int null_count; /* number of null links in linkages */ Parse_info parse_info; /* set of parses for the sentence */ Linkage_info * link_info; /* array of valid and invalid linkages (sorted) */ String_set * string_set; /* used for word names, not connectors */ And_data and_data; /* used to keep track of fat disjuncts */ char q_pruned_rules; /* don't prune rules more than once in p.p. */ int post_quote[MAX_SENTENCE]; /* Used only by tokenizer. */ analyze_context_t * analyze_ctxt; /* private state used for analyzing */ count_context_t * count_ctxt; /* private state info used for counting */ match_context_t * match_ctxt; /* private state info used for matching */ /* thread-safe random number state */ unsigned int rand_state; /* Hook for the SAT solver */ void *hook; }; /********************************************************* * * Post processing * **********************************************************/ struct Domain_s { const char * string; int size; List_o_links * lol; int start_link; /* the link that started this domain */ int type; /* one letter name */ DTreeLeaf * child; Domain * parent; }; struct DTreeLeaf_s { Domain * parent; int link; DTreeLeaf * next; }; struct PP_data_s { int N_domains; List_o_links * word_links[MAX_SENTENCE]; List_o_links * links_to_ignore; Domain domain_array[MAX_LINKS]; /* the domains, sorted by size */ int length; /* length of current sentence */ }; struct PP_info_s { int num_domains; const char ** domain_name; }; struct Postprocessor_s { pp_knowledge *knowledge; /* internal rep'n of the actual rules */ int n_global_rules_firing; /* this & the next are diagnostic */ int n_local_rules_firing; pp_linkset *set_of_links_of_sentence; /* seen in *any* linkage of sent */ pp_linkset *set_of_links_in_an_active_rule;/*used in *some* linkage of sent*/ int *relevant_contains_one_rules; /* -1-terminated list of indices */ int *relevant_contains_none_rules; /* the following maintain state during a call to post_process() */ String_set *sentence_link_name_set; /* link names seen for sentence */ int visited[MAX_SENTENCE]; /* for the depth-first search */ PP_node *pp_node; PP_data pp_data; }; /********************************************************* * * Linkages * **********************************************************/ struct Sublinkage_s { int num_links; /* Number of links in array */ Link ** link; /* Array of links */ PP_info * pp_info; /* PP info for each link */ const char * violation; /* Name of violation, if any */ PP_data pp_data; }; typedef struct DIS_node_struct DIS_node; struct Linkage_s { int num_words; /* number of (tokenized) words */ const char * * word; /* array of word spellings */ Linkage_info* info; /* index and cost information */ int num_sublinkages; /* One for thin linkages, bigger for fat */ int current; /* Allows user to select particular sublinkage */ Sublinkage * sublinkage; /* A parse with conjunctions will have several */ int unionized; /* if TRUE, union of links has been computed */ Sentence sent; Parse_Options opts; DIS_node * dis_con_tree; /* Disjunction-conjunction tree */ }; #endif link-grammar-4.7.4/link-grammar/error.c0000644000175000017500000000506111225713775017003 0ustar bloombloom/*************************************************************************/ /* Copyright (c) 2004 */ /* Daniel Sleator, David Temperley, and John Lafferty */ /* All rights reserved */ /* */ /* Use of the link grammar parsing system is subject to the terms of the */ /* license set forth in the LICENSE file included with this software, */ /* and also available at http://www.link.cs.cmu.edu/link/license.html */ /* This license allows free redistribution and use in source and binary */ /* forms, with or without modification, subject to certain conditions. */ /* */ /*************************************************************************/ #include #include #include #include #ifdef USE_PTHREADS #include #endif #include "error.h" #include "structures.h" #include "api-structures.h" #ifdef _MSC_VER #define DLLEXPORT __declspec(dllexport) #else #define DLLEXPORT #endif /* ============================================================ */ static void verr_msg(err_ctxt *ec, severity sev, const char *fmt, va_list args) { fprintf(stderr, "link-grammar: "); vfprintf(stderr, fmt, args); if ((Info != sev) && ec->sent != NULL) { int i; fprintf(stderr, "\tFailing sentence was:\n\t"); for (i=0; isent->length; i++) { fprintf(stderr, "%s ", ec->sent->word[i].string); } fprintf(stderr, "\n"); } } void err_msg(err_ctxt *ec, severity sev, const char *fmt, ...) { va_list args; va_start(args, fmt); verr_msg(ec, sev, fmt, args); va_end(args); } void prt_error(const char *fmt, ...) { severity sev; err_ctxt ec; va_list args; sev = Error; if (0 == strncmp(fmt, "Fatal", 5)) sev = Fatal; if (0 == strncmp(fmt, "Error:", 6)) sev = Error; if (0 == strncmp(fmt, "Warn", 4)) sev = Warn; if (0 == strncmp(fmt, "Info:", 5)) sev = Info; ec.sent = NULL; va_start(args, fmt); verr_msg(&ec, sev, fmt, args); va_end(args); } /* ============================================================ */ /* These are deprecated, obsolete, and unused, but are still here * because these are exported in the public API. Do not use these. */ DLLEXPORT int lperrno = 0; DLLEXPORT char lperrmsg[1]; extern void lperror_clear(void); void lperror_clear(void) { lperrmsg[0] = 0x0; lperrno = 0; } /* ============================================================ */ link-grammar-4.7.4/link-grammar/tokenize.c0000644000175000017500000007043411526022265017477 0ustar bloombloom/*************************************************************************/ /* Copyright (c) 2004 */ /* Daniel Sleator, David Temperley, and John Lafferty */ /* Copyright (c) 2009 Linas Vepstas */ /* All rights reserved */ /* */ /* Use of the link grammar parsing system is subject to the terms of the */ /* license set forth in the LICENSE file included with this software, */ /* and also available at http://www.link.cs.cmu.edu/link/license.html */ /* This license allows free redistribution and use in source and binary */ /* forms, with or without modification, subject to certain conditions. */ /* */ /*************************************************************************/ #ifndef _WIN32 #include #endif #include #include "build-disjuncts.h" #include "error.h" #include "externs.h" #include "read-dict.h" #include "regex-morph.h" #include "spellcheck.h" #include "string-set.h" #include "structures.h" #include "tokenize.h" #include "utilities.h" #include "word-utils.h" #define MAX_STRIP 10 /* These are no longer in use, but are read from the 4.0.affix file */ /* I've left these here, as an axample of what to expect. */ /*static char * strip_left[] = {"(", "$", "``", NULL}; */ /*static char * strip_right[] = {")", "%", ",", ".", ":", ";", "?", "!", "''", "'", "'s", NULL};*/ #define ENTITY_MARKER "" #define COMMON_ENTITY_MARKER "" /** * is_common_entity - Return true if word is a common noun or adjective * Common nouns and adjectives are typically used in corporate entity * names -- e.g. "Sun State Bank" -- "sun", "state" and "bank" are all * common nouns. */ static int is_common_entity(Dictionary dict, const char * str) { if (word_contains(dict, str, COMMON_ENTITY_MARKER) == 1) return TRUE; return FALSE; } static int is_entity(Dictionary dict, const char * str) { const char * regex_name; if (word_contains(dict, str, ENTITY_MARKER) == 1) return TRUE; regex_name = match_regex(dict, str); if (NULL == regex_name) return FALSE; return word_contains(dict, regex_name, ENTITY_MARKER); } /** * Return TRUE if word is a proper name. * XXX This is a cheap hack that works only in English, and is * broken for German! We need to replace this with something * language-specific. * * Basically, if word starts with upper-case latter, we assume * its a proper name, and that's that. */ static int is_proper_name(const char * word) { return is_utf8_upper(word); } /* Create a string containing anything that can be construed to * be a quotation mark. This works, because link-grammar is more * or less ignorant of quotes at this time. */ static const wchar_t *list_of_quotes(void) { #define QUSZ 50 static wchar_t wqs[QUSZ]; mbstate_t mbs; /* Single-quotes are used for abbreviations, don't mess with them */ /* const char * qs = "\"\'«»《》【】『』‘’`„“"; */ const char * qs = "\"«»《》【】『』`„“"; const char *pqs = qs; memset(&mbs, 0, sizeof(mbs)); mbsrtowcs(wqs, &pqs, QUSZ, &mbs); return wqs; } /** * Return TRUE if the character is a quotation character. */ static int is_quote(wchar_t wc) { static const wchar_t *quotes = NULL; if (NULL == quotes) quotes = list_of_quotes(); if (NULL != wcschr(quotes, wc)) return TRUE; return FALSE; } /** * Returns true if the word can be interpreted as a number. * The ":" is included here so we allow "10:30" to be a number. * We also allow U+00A0 "no-break space" */ static int is_number(const char * s) { mbstate_t mbs; int nb = 1; wchar_t c; if (!is_utf8_digit(s)) return FALSE; memset(&mbs, 0, sizeof(mbs)); while ((*s != 0) && (0 < nb)) { nb = mbrtowc(&c, s, MB_CUR_MAX, &mbs); if (iswdigit(c)) { s += nb; } /* U+00A0 no break space */ else if (0xa0 == c) { s += nb; } else if ((*s == '.') || (*s == ',') || (*s == ':')) { s++; } else return FALSE; } return TRUE; } /** * Returns true if the word contains digits. */ static int contains_digits(const char * s) { mbstate_t mbs; int nb = 1; wchar_t c; memset(&mbs, 0, sizeof(mbs)); while ((*s != 0) && (0 < nb)) { nb = mbrtowc(&c, s, MB_CUR_MAX, &mbs); if (iswdigit(c)) return TRUE; s += nb; } return FALSE; } /** * The string s is the next word of the sentence. * Do not issue the empty string. * Return false if too many words or the word is too long. */ static int issue_sentence_word(Sentence sent, const char * s) { if (*s == '\0') return TRUE; if (strlen(s) > MAX_WORD) { err_ctxt ec; ec.sent = sent; err_msg(&ec, Error, "Error separating sentence. The word \"%s\" is too long.\n" "A word can have a maximum of %d characters.\n", s, MAX_WORD); return FALSE; } if (sent->length >= MAX_SENTENCE) { err_ctxt ec; ec.sent = sent; err_msg(&ec, Error, "Error separating sentence. The sentence has too many words.\n"); return FALSE; } strcpy(sent->word[sent->length].string, s); /* Now we record whether the first character of the word is upper-case. (The first character may be made lower-case later, but we may want to get at the original version) */ if (is_utf8_upper(s)) sent->word[sent->length].firstupper=1; else sent->word[sent->length].firstupper = 0; sent->length++; return TRUE; } /* Here's a summary of how subscripts are handled: Reading the dictionary: If the last "." in a string is followed by a non-digit character, then the "." and everything after it is considered to be the subscript of the word. The dictionary reader does not allow you to have two words that match according to the criterion below. (so you can't have "dog.n" and "dog") Quote marks are used to allow you to define words in the dictionary which would otherwise be considered part of the dictionary, as in ";": {@Xca-} & Xx- & (W+ or Qd+) & {Xx+}; "%" : (ND- & {DD-} & & ( or B*x+)) or (ND- & (OD- or AN+)); Rules for chopping words from the input sentence: First the prefix chars are stripped off of the word. These characters are "(" and "$" (and now "``") Now, repeat the following as long as necessary: Look up the word in the dictionary. If it's there, the process terminates. If it's not there and it ends in one of the right strippable strings (see "strip_right") then remove the strippable string and make it into a separate word. If there is no strippable string, then the process terminates. Rule for defining subscripts in input words: The subscript rule is followed just as when reading the dictionary. When does a word in the sentence match a word in the dictionary? Matching is done as follows: Two words with subscripts must match exactly. If neither has a subscript they must match exactly. If one does and one doesn't then they must match when the subscript is removed. Notice that this is symmetric. So, under this system, the dictonary could have the words "Ill" and also the word "Ill." It could also have the word "i.e.", which could be used in a sentence. */ #undef MIN #define MIN(a, b) (((a) < (b)) ? (a) : (b)) static int boolean_reg_dict_lookup(Dictionary dict, const char * word) { const char * regex_name; if (boolean_dictionary_lookup(dict, word)) return TRUE; regex_name = match_regex(dict, word); if (NULL == regex_name) return FALSE; return boolean_dictionary_lookup(dict, regex_name); } static int downcase_is_in_dict(Dictionary dict, char * word) { int i, rc; char low[MB_LEN_MAX]; char save[MB_LEN_MAX]; wchar_t c; int nbl, nbh; mbstate_t mbs, mbss; if (!is_utf8_upper(word)) return FALSE; memset(&mbs, 0, sizeof(mbs)); memset(&mbss, 0, sizeof(mbss)); nbh = mbrtowc (&c, word, MB_CUR_MAX, &mbs); c = towlower(c); nbl = wctomb_check(low, c, &mbss); if (nbh != nbl) { prt_error("Warning: can't downcase multi-byte string: %s\n", word); return FALSE; } /* Downcase */ for (i=0; idict, word)) word_is_in_dict = TRUE; else if (is_first_word && downcase_is_in_dict (sent->dict,word)) word_is_in_dict = TRUE; if (word_is_in_dict) { return issue_sentence_word(sent, word); } /* Set up affix tables. */ if (sent->dict->affix_table != NULL) { Dictionary dict = sent->dict->affix_table; r_strippable = dict->r_strippable; l_strippable = dict->l_strippable; u_strippable = dict->u_strippable; p_strippable = dict->p_strippable; s_strippable = dict->s_strippable; strip_left = dict->strip_left; strip_right = dict->strip_right; strip_units = dict->strip_units; prefix = dict->prefix; suffix = dict->suffix; } /* Strip off punctuation, etc. on the left-hand side. */ /* XXX FIXME: this fails in certain cases: e.g. * "By the '50s, he was very prosperous." * where the leading quote is striped, and then "50s," cannot be * found in the dict. Next, the comma is removed, and "50s" is still * not in the dict ... the trick was that the comma should be * right-stripped first, then the possible quotes. * More generally, link-grammar does not support multiple possible * tokenizations. */ for (;;) { for (i=0; i= wend) return TRUE; /* Now w points to the string starting just to the right of * any left-stripped characters. * stripped[] is an array of numbers, indicating the index * numbers (in the strip_right array) of any strings stripped off; * stripped[0] is the number of the first string stripped off, etc. * When it breaks out of this loop, n_stripped will be the number * of strings stripped off. */ for (n_r_stripped = 0; n_r_stripped < MAX_STRIP; n_r_stripped++) { sz = MIN(wend-w, MAX_WORD); strncpy(word, w, sz); word[sz] = '\0'; if (wend == w) break; /* it will work without this */ if (boolean_reg_dict_lookup(sent->dict, word)) { word_is_in_dict = TRUE; break; } /* This could happen if it's a word after a colon, also! */ if (is_first_word && downcase_is_in_dict (sent->dict, word)) { word_is_in_dict = TRUE; break; } for (i=0; i < r_strippable; i++) { len = strlen(strip_right[i]); /* the remaining w is too short for a possible match */ if ((wend-w) < len) continue; if (strncmp(wend-len, strip_right[i], len) == 0) { r_stripped[n_r_stripped] = strip_right[i]; wend -= len; break; } } if (i == r_strippable) break; } /* Is there a number in the word? If so, then search for * trailing units suffixes. */ if ((FALSE == word_is_in_dict) && contains_digits(word)) { /* Same as above, but with a twist: the only thing that can * preceed a units suffix is a number. This is so that we can * split up things like "12ft" (twelve feet) but not split up * things like "Delft blue". Multiple passes allow for * constructions such as 12sq.ft. */ n_r_stripped_save = n_r_stripped; wend_save = wend; for (; n_r_stripped < MAX_STRIP; n_r_stripped++) { size_t sz = MIN(wend-w, MAX_WORD); strncpy(word, w, sz); word[sz] = '\0'; if (wend == w) break; /* it will work without this */ /* Number */ if (is_number(word)) { found_number = 1; break; } for (i=0; i < u_strippable; i++) { len = strlen(strip_units[i]); /* the remaining w is too short for a possible match */ if ((wend-w) < len) continue; if (strncmp(wend-len, strip_units[i], len) == 0) { r_stripped[n_r_stripped] = strip_units[i]; wend -= len; break; } } if (i == u_strippable) break; } /* The root *must* be a number! */ if (0 == found_number) { wend = wend_save; n_r_stripped = n_r_stripped_save; } } /* Now we strip off suffixes...w points to the remaining word, * "wend" to the end of the word. */ s_stripped = -1; strncpy(word, w, MIN(wend-w, MAX_WORD)); word[MIN(wend-w, MAX_WORD)] = '\0'; /* Umm, double-check, if need be ... !?? */ if (FALSE == word_is_in_dict) { if (boolean_reg_dict_lookup(sent->dict, word)) word_is_in_dict = TRUE; else if (is_first_word && downcase_is_in_dict (sent->dict,word)) word_is_in_dict = TRUE; } if (FALSE == word_is_in_dict) { j=0; for (i=0; i <= s_strippable; i++) { s_ok = 0; /* Go through once for each suffix; then go through one * final time for the no-suffix case */ if (i < s_strippable) { len = strlen(suffix[i]); /* The remaining w is too short for a possible match */ if ((wend-w) < len) continue; if (strncmp(wend-len, suffix[i], len) == 0) s_ok=1; } else len = 0; if (s_ok || i == s_strippable) { strncpy(newword, w, MIN((wend-len)-w, MAX_WORD)); newword[MIN((wend-len)-w, MAX_WORD)] = '\0'; /* Check if the remainder is in the dictionary; * for the no-suffix case, it won't be */ if (boolean_reg_dict_lookup(sent->dict, newword)) { if ((verbosity>1) && (i < s_strippable)) printf("Splitting word into two: %s-%s\n", newword, suffix[i]); s_stripped = i; wend -= len; strncpy(word, w, MIN(wend-w, MAX_WORD)); word[MIN(wend-w, MAX_WORD)] = '\0'; word_is_in_dict = TRUE; break; } /* If the remainder isn't in the dictionary, * try stripping off prefixes */ else { for (j=0; jdict, newword)) { if ((verbosity>1) && (i < s_strippable)) printf("Splitting word into three: %s-%s-%s\n", prefix[j], newword, suffix[i]); if (!issue_sentence_word(sent, prefix[j])) return FALSE; if (i < s_strippable) s_stripped = i; wend -= len; w += strlen(prefix[j]); sz = MIN(wend-w, MAX_WORD); strncpy(word, w, sz); word[sz] = '\0'; word_is_in_dict = TRUE; break; } } } } if (j != p_strippable) break; } } } /* word is now what remains after all the stripping has been done */ issued = FALSE; /* If n_r_stripped exceed max, the "word" is most likely a long * sequence of periods. Just accept it as an unknown "word", * and move on. */ if (n_r_stripped >= MAX_STRIP) { n_r_stripped = 0; word_is_in_dict = TRUE; } if (quote_found == TRUE) sent->post_quote[sent->length] = 1; #if defined HAVE_HUNSPELL || defined HAVE_ASPELL /* If the word is still not being found, then it might be * a run-on of two words. Ask the spell-checker to split * the word in two, if possible. Do this only if the word * is not a proper name, and if spell-checking is enabled. */ if ((FALSE == word_is_in_dict) && TRUE == opts->use_spell_guess && sent->dict->spell_checker && (FALSE == is_proper_name(word))) { char **alternates = NULL; char *sp = NULL; char *wp; int j, n; n = spellcheck_suggest(sent->dict->spell_checker, &alternates, word); for (j=0; j=0; i--) { if (!issue_sentence_word(sent, r_stripped[i])) return FALSE; } return TRUE; } /** * The string s has just been read in from standard input. * This function breaks it up into words and stores these words in * the sent->word[] array. Returns TRUE if all is well, FALSE otherwise. * Quote marks are treated just like blanks. */ int separate_sentence(Sentence sent, Parse_Options opts) { const char *t; int is_first, quote_found; Dictionary dict = sent->dict; mbstate_t mbs; const char * s = sent->orig_sentence; memset(sent->post_quote, 0, MAX_SENTENCE*sizeof(int)); sent->length = 0; if (dict->left_wall_defined) if (!issue_sentence_word(sent, LEFT_WALL_WORD)) return FALSE; /* Reset the multibyte shift state to the initial state */ memset(&mbs, 0, sizeof(mbs)); is_first = TRUE; for(;;) { int isq; wchar_t c; int nb = mbrtowc(&c, s, MB_CUR_MAX, &mbs); quote_found = FALSE; if (0 > nb) goto failure; /* Skip all whitespace. Also, ignore *all* quotation marks. * XXX This is sort-of a hack, but that is because LG does * not have any intelligent support for quoted character * strings at this time. */ isq = is_quote (c); if (isq) quote_found = TRUE; while (iswspace(c) || isq) { s += nb; nb = mbrtowc(&c, s, MB_CUR_MAX, &mbs); if (0 == nb) break; if (0 > nb) goto failure; isq = is_quote (c); if (isq) quote_found = TRUE; } if (*s == '\0') break; t = s; nb = mbrtowc(&c, t, MB_CUR_MAX, &mbs); if (0 > nb) goto failure; while (!iswspace(c) && !is_quote(c) && (c != 0) && (nb != 0)) { t += nb; nb = mbrtowc(&c, t, MB_CUR_MAX, &mbs); if (0 > nb) goto failure; } if (!separate_word(sent, opts, s, t, is_first, quote_found)) return FALSE; is_first = FALSE; s = t; if (*s == '\0') break; } if (dict->right_wall_defined) if (!issue_sentence_word(sent, RIGHT_WALL_WORD)) return FALSE; return (sent->length > dict->left_wall_defined + dict->right_wall_defined); failure: prt_error("Unable to process UTF8 input string in current locale %s\n", nl_langinfo(CODESET)); return FALSE; } /** * Build the word expressions, and add a tag to the word to indicate * that it was guessed by means of regular-expression matching. * Also, add a subscript to the resulting word to indicate the * rule origin. */ static void tag_regex_string(Sentence sent, int i, const char * type) { char str[MAX_WORD+1]; char * t; X_node * e; sent->word[i].x = build_word_expressions(sent->dict, type); for (e = sent->word[i].x; e != NULL; e = e->next) { t = strchr(e->string, '.'); e->string = sent->word[i].string; if (NULL != t) { snprintf(str, MAX_WORD, "%.50s[!].%.5s", e->string, t+1); } else { snprintf(str, MAX_WORD, "%.50s", e->string); } e->string = string_set_add(str, sent->string_set); } } /** * Puts into word[i].x the expression for the unknown word * the parameter s is the word that was not in the dictionary * it massages the names to have the corresponding subscripts * to those of the unknown words * so "grok" becomes "grok[?].v" */ static void handle_unknown_word(Sentence sent, int i, char * s) { char *t; X_node *d; char str[MAX_WORD+1]; sent->word[i].x = build_word_expressions(sent->dict, UNKNOWN_WORD); if (sent->word[i].x == NULL) assert(FALSE, "UNKNOWN_WORD should have been there"); for (d = sent->word[i].x; d != NULL; d = d->next) { t = strchr(d->string, '.'); if (t != NULL) { snprintf(str, MAX_WORD, "%.50s[?].%.5s", s, t+1); } else { snprintf(str, MAX_WORD, "%.50s[?]", s); } d->string = string_set_add(str, sent->string_set); } } /** * If a word appears to be mis-spelled, then add alternate * spellings. Maybe one of those will do ... */ static void guess_misspelled_word(Sentence sent, int i, char * s) { int spelling_ok; char str[MAX_WORD+1]; Dictionary dict = sent->dict; X_node *d, *head = NULL; int j, n; char **alternates = NULL; /* Spell-guessing is disabled if no spell-checker is speficified */ if (NULL == dict->spell_checker) { handle_unknown_word(sent, i, s); return; } /* If the spell-checker knows about this word, and we don't ... * Dang. We should fix it someday. Accept it as such. */ spelling_ok = spellcheck_test(dict->spell_checker, s); if (spelling_ok) { handle_unknown_word(sent, i, s); return; } /* Else, ask the spell-checker for alternate spellings * and see if these are in the dict. */ n = spellcheck_suggest(dict->spell_checker, &alternates, s); for (j=0; jdict, alternates[j])) { X_node *x = build_word_expressions(sent->dict, alternates[j]); head = catenate_X_nodes(x, head); } } sent->word[i].x = head; if (alternates) spellcheck_free_suggest(alternates, n); /* Add a [~] to the output to signify that its the result of * guessing. */ for (d = sent->word[i].x; d != NULL; d = d->next) { const char * t = strchr(d->string, '.'); if (t != NULL) { size_t off = t - d->string; strncpy(str, d->string, off); str[off] = 0; strcat(str, "[~]"); strcat(str, t); } else { snprintf(str, MAX_WORD, "%.50s[~]", s); } d->string = string_set_add(str, sent->string_set); } /* If nothing found at all... */ if (NULL == head) { handle_unknown_word(sent, i, s); } } /** * Corrects case of first word, fills in other proper nouns, and * builds the expression lists for the resulting words. * * Algorithm: * Apply the following step to all words w: * If w is in the dictionary, use it. * Else if w is identified by regex matching, use the * appropriately matched disjunct collection. * * Now, we correct the first word, w. * If w is upper case, let w' be the lower case version of w. * If both w and w' are in the dict, concatenate these disjncts. * Else if just w' is in dict, use disjuncts of w', together with * the CAPITALIZED-WORDS rule. * Else leave the disjuncts alone. */ int build_sentence_expressions(Sentence sent, Parse_Options opts) { int i, first_word; /* the index of the first word after the wall */ char *s, temp_word[MAX_WORD+1]; const char * regex_name; X_node * e; Dictionary dict = sent->dict; if (dict->left_wall_defined) { first_word = 1; } else { first_word = 0; } /* The following loop treats all words the same * (nothing special for 1st word) */ for (i=0; ilength; i++) { s = sent->word[i].string; if (boolean_dictionary_lookup(sent->dict, s)) { sent->word[i].x = build_word_expressions(sent->dict, s); } else if ((NULL != (regex_name = match_regex(sent->dict, s))) && boolean_dictionary_lookup(sent->dict, regex_name)) { tag_regex_string(sent, i, regex_name); } else if (dict->unknown_word_defined && dict->use_unknown_word) { if (opts->use_spell_guess) { guess_misspelled_word(sent, i, s); } else { handle_unknown_word(sent, i, s); } } else { /* The reason I can assert this is that the word * should have been looked up already if we get here. */ assert(FALSE, "I should have found that word."); } } /* Under certain cases--if it's the first word of the sentence, * or if it follows a colon or a quotation mark--a word that's * capitalized has to be looked up as an uncapitalized word * (as well as a capitalized word). * XXX This rule is English-language-oriented, and should be * abstracted. */ for (i=0; ilength; i++) { if (! (i == first_word || (i > 0 && strcmp(":", sent->word[i-1].string)==0) || sent->post_quote[i] == 1)) continue; s = sent->word[i].string; /* If the lower-case version of this word is in the dictionary, * then add the disjuncts for the lower-case version. The upper * case version disjuncts had previously come from matching the * CAPITALIZED-WORDS regex. * * Err .. add the lower-case version only if the lower-case word * is a common noun or adjective; otherwise, *replace* the * upper-case word with the lower-case one. This allows common * nouns and adjectives to be used for entity names: e.g. * "Great Southern Union declares bankruptcy", allowing Great * to be capitalized, while preventing an upper-case "She" being * used as a proper name in "She declared bankruptcy". * * Arghh. This is still messed up. The capitalized-regex runs * too early, I think. We need to *add* Sue.f (female name Sue) * even though sue.v (the verb "to sue") is in the dict. So * test for capitalized entity names. Glurg. Too much complexity * here, it seems to me. * * This is actually a great example of a combo of an algorithm * together with a list of words used to determine grammatical * function. */ if (is_utf8_upper(s)) { const char * lc; downcase_utf8_str(temp_word, s, MAX_WORD); lc = string_set_add(temp_word, sent->string_set); /* The lower-case dict lookup might trigger regex * matches in the dictionary. We want to avoid these. * e.g. "Cornwallis" triggers both PL-CAPITALIZED_WORDS * and S-WORDS. Since its not an entity, the regex * matches will erroneously discard the upper-case version. */ if (boolean_dictionary_lookup(sent->dict, lc)) { if (is_entity(sent->dict,s) || is_common_entity(sent->dict,lc)) { if (1 < verbosity) { printf ("Info: First word: %s entity=%d common=%d\n", s, is_entity(sent->dict,s), is_common_entity(sent->dict,lc)); } e = build_word_expressions(sent->dict, lc); sent->word[i].x = catenate_X_nodes(sent->word[i].x, e); } else { if (1 < verbosity) { printf("Info: First word: %s downcase only\n", lc); } safe_strcpy(s, lc, MAX_WORD); e = build_word_expressions(sent->dict, s); free_X_nodes(sent->word[i].x); sent->word[i].x = e; } } } } return TRUE; } /** * This just looks up all the words in the sentence, and builds * up an appropriate error message in case some are not there. * It has no side effect on the sentence. Returns TRUE if all * went well. * * This code is called only is the 'unkown-words' flag is set. */ int sentence_in_dictionary(Sentence sent) { int w, ok_so_far; char * s; Dictionary dict = sent->dict; char temp[1024]; ok_so_far = TRUE; for (w=0; wlength; w++) { s = sent->word[w].string; if (!boolean_reg_dict_lookup(dict, s)) { if (ok_so_far) { safe_strcpy(temp, "The following words are not in the dictionary:", sizeof(temp)); ok_so_far = FALSE; } safe_strcat(temp, " \"", sizeof(temp)); safe_strcat(temp, sent->word[w].string, sizeof(temp)); safe_strcat(temp, "\"", sizeof(temp)); } } if (!ok_so_far) { err_ctxt ec; ec.sent = sent; err_msg(&ec, Error, "Error: Sentence not in dictionary\n%s\n", temp); } return ok_so_far; } link-grammar-4.7.4/link-grammar/pp_lexer.c0000644000175000017500000013765511246576250017505 0ustar bloombloom/*************************************************************************/ /* Copyright (c) 2004 */ /* Daniel Sleator, David Temperley, and John Lafferty */ /* All rights reserved */ /* */ /* Use of the link grammar parsing system is subject to the terms of the */ /* license set forth in the LICENSE file included with this software, */ /* and also available at http://www.link.cs.cmu.edu/link/license.html */ /* This license allows free redistribution and use in source and binary */ /* forms, with or without modification, subject to certain conditions. */ /* */ /*************************************************************************/ /* XXX the original flex source for this file is missing !! */ #include #include "error.h" /* I edited this file to eliminate compiler warnings. I've documented here all the changes. The .fl file from which this is derived is in pp_lexer-flex-file. Here are all the warnings I got: pp_lexer.c: In function `pp_lexer_lex': pp_lexer.c:841: warning: implicit declaration of function `yywrap' pp_lexer.c:689: warning: label `find_rule' defined but not used pp_lexer.c: At top level: pp_lexer.c:1590: warning: `yy_flex_realloc' defined but not used pp_lexer.c:1099: warning: `yyunput' defined but not used pp_lexer.c:1814: warning: `show_bindings' defined but not used Here are the changes I made. All of them are labeled with "--DS" in the code. Got rid of #line directives. Added the prototype of yywrap() right below this comment. Commented out code and prototype declarations for the unused functions */ int yywrap(void); /* --DS */ #define yy_create_buffer pp_lexer__create_buffer #define yy_delete_buffer pp_lexer__delete_buffer #define yy_scan_buffer pp_lexer__scan_buffer #define yy_scan_string pp_lexer__scan_string #define yy_scan_bytes pp_lexer__scan_bytes #define yy_flex_debug pp_lexer__flex_debug #define yy_init_buffer pp_lexer__init_buffer #define yy_flush_buffer pp_lexer__flush_buffer #define yy_load_buffer_state pp_lexer__load_buffer_state #define yy_switch_to_buffer pp_lexer__switch_to_buffer #define yyin pp_lexer_in #define yyleng pp_lexer_leng #define yylex pp_lexer_lex #define yyout pp_lexer_out #define yyrestart pp_lexer_restart #define yytext pp_lexer_text #define yylineno pp_lexer_lineno #define yywrap pp_lexer_wrap /* #line 21 "pp_lexer.c" --DS */ /* A lexical scanner generated by flex */ /* Scanner skeleton version: * $Header$ */ #define FLEX_SCANNER #define YY_FLEX_MAJOR_VERSION 2 #define YY_FLEX_MINOR_VERSION 5 #include #include /* cfront 1.2 defines "c_plusplus" instead of "__cplusplus" */ #ifdef c_plusplus #ifndef __cplusplus #define __cplusplus #endif #endif #ifdef __cplusplus #include #include /* Use prototypes in function declarations. */ #define YY_USE_PROTOS /* The "const" storage-class-modifier is valid. */ #define YY_USE_CONST #else /* ! __cplusplus */ #if __STDC__ #define YY_USE_PROTOS #define YY_USE_CONST #endif /* __STDC__ */ #endif /* ! __cplusplus */ #ifdef __TURBOC__ #pragma warn -rch #pragma warn -use #include #include #define YY_USE_CONST #define YY_USE_PROTOS #endif #ifndef YY_USE_CONST #ifndef const #define const #endif #endif #ifdef YY_USE_PROTOS #define YY_PROTO(proto) proto #else #define YY_PROTO(proto) () #endif /* Returned upon end-of-file. */ #define YY_NULL 0 /* Promotes a possibly negative, possibly signed char to an unsigned * integer for use as an array index. If the signed char is negative, * we want to instead treat it as an 8-bit unsigned char, hence the * double cast. */ #define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) /* Enter a start condition. This macro really ought to take a parameter, * but we do it the disgusting crufty way forced on us by the ()-less * definition of BEGIN. */ #define BEGIN yy_start = 1 + 2 * /* Translate the current start state into a value that can be later handed * to BEGIN to return to the state. The YYSTATE alias is for lex * compatibility. */ #define YY_START ((yy_start - 1) / 2) #define YYSTATE YY_START /* Action number for EOF rule of a given start state. */ #define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) /* Special action meaning "start processing a new file". */ #define YY_NEW_FILE yyrestart( yyin ) #define YY_END_OF_BUFFER_CHAR 0 /* Size of default input buffer. */ #define YY_BUF_SIZE 16384 typedef struct yy_buffer_state *YY_BUFFER_STATE; extern int yyleng; extern FILE *yyin, *yyout; #define EOB_ACT_CONTINUE_SCAN 0 #define EOB_ACT_END_OF_FILE 1 #define EOB_ACT_LAST_MATCH 2 /* The funky do-while in the following #define is used to turn the definition * int a single C statement (which needs a semi-colon terminator). This * avoids problems with code like: * * if ( condition_holds ) * yyless( 5 ); * else * do_something_else(); * * Prior to using the do-while the compiler would get upset at the * "else" because it interpreted the "if" statement as being all * done when it reached the ';' after the yyless() call. */ /* Return all but the first 'n' matched characters back to the input stream. */ #define yyless(n) \ do \ { \ /* Undo effects of setting up yytext. */ \ *yy_cp = yy_hold_char; \ yy_c_buf_p = yy_cp = yy_bp + n - YY_MORE_ADJ; \ YY_DO_BEFORE_ACTION; /* set up yytext again */ \ } \ while ( 0 ) /* #define unput(c) yyunput( c, yytext_ptr ) --DS */ /* The following is because we cannot portably get our hands on size_t * (without autoconf's help, which isn't available because we want * flex-generated scanners to compile on their own). */ typedef unsigned int yy_size_t; struct yy_buffer_state { FILE *yy_input_file; char *yy_ch_buf; /* input buffer */ char *yy_buf_pos; /* current position in input buffer */ /* Size of input buffer in bytes, not including room for EOB * characters. */ yy_size_t yy_buf_size; /* Number of characters read into yy_ch_buf, not including EOB * characters. */ int yy_n_chars; /* Whether we "own" the buffer - i.e., we know we created it, * and can realloc() it to grow it, and should free() it to * delete it. */ int yy_is_our_buffer; /* Whether this is an "interactive" input source; if so, and * if we're using stdio for input, then we want to use getwc() * instead of fread(), to make sure we stop fetching input after * each newline. */ int yy_is_interactive; /* Whether we're considered to be at the beginning of a line. * If so, '^' rules will be active on the next match, otherwise * not. */ int yy_at_bol; /* Whether to try to fill the input buffer when we reach the * end of it. */ int yy_fill_buffer; int yy_buffer_status; #define YY_BUFFER_NEW 0 #define YY_BUFFER_NORMAL 1 /* When an EOF's been seen but there's still some text to process * then we mark the buffer as YY_EOF_PENDING, to indicate that we * shouldn't try reading from the input source any more. We might * still have a bunch of tokens to match, though, because of * possible backing-up. * * When we actually see the EOF, we change the status to "new" * (via yyrestart()), so that the user can continue scanning by * just pointing yyin at a new input file. */ #define YY_BUFFER_EOF_PENDING 2 }; static YY_BUFFER_STATE yy_current_buffer = 0; /* We provide macros for accessing buffer states in case in the * future we want to put the buffer states in a more general * "scanner state". */ #define YY_CURRENT_BUFFER yy_current_buffer /* yy_hold_char holds the character lost when yytext is formed. */ static char yy_hold_char; static int yy_n_chars; /* number of characters read into yy_ch_buf */ int yyleng; /* Points to current character in buffer. */ static char *yy_c_buf_p = (char *) 0; static int yy_init = 1; /* whether we need to initialize */ static int yy_start = 0; /* start state number */ /* Flag which is used to allow yywrap()'s to do buffer switches * instead of setting up a fresh yyin. A bit of a hack ... */ static int yy_did_buffer_switch_on_eof; void yyrestart YY_PROTO(( FILE *input_file )); void yy_switch_to_buffer YY_PROTO(( YY_BUFFER_STATE new_buffer )); void yy_load_buffer_state YY_PROTO(( void )); YY_BUFFER_STATE yy_create_buffer YY_PROTO(( FILE *file, int size )); void yy_delete_buffer YY_PROTO(( YY_BUFFER_STATE b )); void yy_init_buffer YY_PROTO(( YY_BUFFER_STATE b, FILE *file )); void yy_flush_buffer YY_PROTO(( YY_BUFFER_STATE b )); #define YY_FLUSH_BUFFER yy_flush_buffer( yy_current_buffer ) YY_BUFFER_STATE yy_scan_buffer YY_PROTO(( char *base, yy_size_t size )); YY_BUFFER_STATE yy_scan_string YY_PROTO(( const char *str )); YY_BUFFER_STATE yy_scan_bytes YY_PROTO(( const char *bytes, int len )); static void *yy_flex_alloc YY_PROTO(( yy_size_t )); /* static void *yy_flex_realloc YY_PROTO(( void *, yy_size_t )); --DS */ static void yy_flex_free YY_PROTO(( void * )); #define yy_new_buffer yy_create_buffer #define yy_set_interactive(is_interactive) \ { \ if ( ! yy_current_buffer ) \ yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \ yy_current_buffer->yy_is_interactive = is_interactive; \ } #define yy_set_bol(at_bol) \ { \ if ( ! yy_current_buffer ) \ yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \ yy_current_buffer->yy_at_bol = at_bol; \ } #define YY_AT_BOL() (yy_current_buffer->yy_at_bol) #define YY_USES_REJECT typedef unsigned char YY_CHAR; #ifdef VMS #ifndef __VMS_POSIX FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0; #else FILE *yyin = stdin, *yyout = stdout; #endif #else FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0; #endif typedef int yy_state_type; extern int yylineno; int yylineno = 1; extern char *yytext; #define yytext_ptr yytext #ifndef YY_SKIP_YYWRAP #ifdef __cplusplus extern "C" int yywrap YY_PROTO(( void )); #else extern int yywrap YY_PROTO(( void )); #endif #endif #if 0 /* --DS */ #ifndef YY_NO_UNPUT static void yyunput YY_PROTO(( int c, char *buf_ptr )); #endif #endif /* --DS */ #ifndef yytext_ptr static void yy_flex_strncpy YY_PROTO(( char *, const char *, int )); #endif #ifdef THIS_FUNCTION_IS_NO_LONGER_USED #ifndef YY_NO_INPUT #ifdef __cplusplus static int yyinput YY_PROTO(( void )); #else static int input YY_PROTO(( void )); #endif #endif #endif /* THIS_FUNCTION_IS_NO_LONGER_USED */ static yy_state_type yy_get_previous_state YY_PROTO(( void )); static yy_state_type yy_try_NUL_trans YY_PROTO(( yy_state_type current_state )); static int yy_get_next_buffer YY_PROTO(( mbstate_t * )); static void yy_fatal_error YY_PROTO(( const char msg[] )); /* Done after the current pattern has been matched and before the * corresponding action - sets up yytext. */ #define YY_DO_BEFORE_ACTION \ yytext_ptr = yy_bp; \ yyleng = (int) (yy_cp - yy_bp); \ yy_hold_char = *yy_cp; \ *yy_cp = '\0'; \ yy_c_buf_p = yy_cp; #define YY_NUM_RULES 8 #define YY_END_OF_BUFFER 9 static const short int yy_acclist[39] = { 0, 2, 2, 2, 2, 9, 5, 7, 8, 2, 7, 8, 2, 8, 7, 8, 7, 8, 5, 7, 8, 2, 7, 8, 5, 7, 8, 7, 8, 5, 3, 2, 4, 5, 2, 5, 1, 3, 6 } ; static const short int yy_accept[29] = { 0, 1, 2, 3, 4, 5, 6, 9, 12, 14, 16, 18, 21, 24, 27, 29, 30, 31, 32, 32, 34, 35, 35, 36, 36, 37, 38, 39, 39 } ; static const int yy_ec[256] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 1, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 6, 7, 1, 1, 1, 1, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ; static const int yy_meta[9] = { 0, 1, 2, 2, 3, 4, 5, 1, 1 } ; static const short int yy_base[32] = { 0, 0, 7, 14, 21, 18, 11, 0, 0, 0, 66, 10, 27, 34, 42, 7, 66, 0, 7, 4, 0, 0, 0, 0, 66, 0, 66, 66, 50, 54, 57, 60 } ; static const short int yy_def[32] = { 0, 27, 1, 1, 3, 27, 28, 29, 29, 30, 27, 31, 27, 27, 13, 28, 27, 29, 30, 31, 12, 14, 13, 14, 27, 14, 27, 0, 27, 27, 27, 27 } ; static const short int yy_nxt[75] = { 0, 6, 7, 8, 7, 9, 10, 6, 11, 12, 16, 12, 26, 16, 13, 10, 16, 16, 27, 10, 27, 10, 10, 12, 27, 12, 27, 27, 14, 20, 17, 20, 27, 27, 21, 22, 23, 24, 23, 23, 25, 22, 22, 23, 27, 27, 27, 27, 23, 23, 23, 15, 27, 27, 27, 15, 17, 17, 18, 27, 18, 19, 27, 27, 27, 19, 5, 27, 27, 27, 27, 27, 27, 27, 27 } ; static const short int yy_chk[75] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 19, 2, 18, 15, 2, 3, 11, 6, 5, 3, 0, 3, 3, 4, 0, 4, 0, 0, 4, 12, 12, 12, 0, 0, 12, 13, 13, 13, 13, 13, 13, 13, 13, 14, 0, 0, 0, 0, 14, 14, 14, 28, 0, 0, 0, 28, 29, 29, 30, 0, 30, 31, 0, 0, 0, 31, 27, 27, 27, 27, 27, 27, 27, 27, 27 } ; static yy_state_type yy_state_buf[YY_BUF_SIZE + 2], *yy_state_ptr; static char *yy_full_match; static int yy_lp; #define REJECT \ { \ *yy_cp = yy_hold_char; /* undo effects of setting up yytext */ \ yy_cp = yy_full_match; /* restore poss. backed-over text */ \ ++yy_lp; \ goto find_rule; \ } #define yymore() yymore_used_but_not_detected #define YY_MORE_ADJ 0 char *yytext; /* #line 1 "pp_lexer.fl" --DS */ #define INITIAL 0 /* #line 2 "pp_lexer.fl" --DS */ /************************************************************************** Lex specification for post-process knowledge file 6/96 ALB Updated 8/97 to allow multiple instances Compile with either 1) flex pp_lexer.fl (on systems which support %option prefix) OR 2) flex pp_lexer.fl mv lex.yy.c pp_lexer.tmp.c cat pp_lexer.tmp.c | sed "s/yy/pp_lexer_/g" > pp_lexer.c rm -f pp_lexer.tmp.c (on systems which do not) In the case of (1), uncomment the three %option lines below. **************************************************************************/ #include #include #undef yywrap /* forward references for non-exported functions (and static variable) */ static void check_string(const char *str); static void setup(PPLexTable *lt); static void set_label(PPLexTable *lt, const char *label); static void add_string_to_label(PPLexTable *lt, const char *str); static void add_set_of_strings_to_label(PPLexTable *lt,const char *label_of_set); /* static void show_bindings(PPLexTable *lt); --DS */ static int get_index_of_label(PPLexTable *lt, const char *label); static PPLexTable *clt=NULL; /* ptr to lex table we're currently filling in */ /* see above */ #define INCLUDE 1 /* #line 490 "pp_lexer.c" --DS */ /* Macros after this point can all be overridden by user definitions in * section 1. */ #if YY_STACK_USED static int yy_start_stack_ptr = 0; static int yy_start_stack_depth = 0; static int *yy_start_stack = 0; #ifndef YY_NO_PUSH_STATE static void yy_push_state YY_PROTO(( int new_state )); #endif #ifndef YY_NO_POP_STATE static void yy_pop_state YY_PROTO(( void )); #endif #ifndef YY_NO_TOP_STATE static int yy_top_state YY_PROTO(( void )); #endif #else #define YY_NO_PUSH_STATE 1 #define YY_NO_POP_STATE 1 #define YY_NO_TOP_STATE 1 #endif #ifdef YY_MALLOC_DECL YY_MALLOC_DECL #else #if __STDC__ #ifndef __cplusplus #include #endif #else /* Just try to get by without declaring the routines. This will fail * miserably on non-ANSI systems for which sizeof(size_t) != sizeof(int) * or sizeof(void*) != sizeof(int). */ #endif #endif /* Amount of stuff to slurp up with each read. */ #ifndef YY_READ_BUF_SIZE #define YY_READ_BUF_SIZE 8192 #endif /* Copy whatever the last rule matched to the standard output. */ #ifndef ECHO /* This used to be an fputs(), but since the string might contain NUL's, * we now use fwrite(). */ #define ECHO (void) fwrite( yytext, yyleng, 1, yyout ) #endif /* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, * is returned in "result". */ #ifndef YY_INPUT #define YY_INPUT(buf,result,max_size,pmbss) \ if ( yy_current_buffer->yy_is_interactive ) \ { \ wint_t c = '*'; \ int n; \ for ( n = 0; n < max_size && \ (c = fgetwc( yyin )) != WEOF && c != '\n'; ) \ n += wcrtomb(&buf[n], c, pmbss); \ if ( c == '\n' ) \ buf[n++] = '\n'; \ if ( c == WEOF && ferror( yyin ) ) \ YY_FATAL_ERROR( "input in flex scanner failed" ); \ result = n; \ } \ else if ( ((result = fread( buf, 1, max_size, yyin )) == 0) \ && ferror( yyin ) ) \ YY_FATAL_ERROR( "input in flex scanner failed" ); #endif /* No semi-colon after return; correct usage is to write "yyterminate();" - * we don't want an extra ';' after the "return" because that will cause * some compilers to complain about unreachable statements. */ #ifndef yyterminate #define yyterminate() return YY_NULL #endif /* Number of entries by which start-condition stack grows. */ #ifndef YY_START_STACK_INCR #define YY_START_STACK_INCR 25 #endif /* Report a fatal error. */ #ifndef YY_FATAL_ERROR #define YY_FATAL_ERROR(msg) yy_fatal_error( msg ) #endif /* Default declaration of generated scanner - a define so the user can * easily add parameters. */ #ifndef YY_DECL #define YY_DECL int yylex YY_PROTO(( void )) #endif /* Code executed at the beginning of each rule, after yytext and yyleng * have been set up. */ #ifndef YY_USER_ACTION #define YY_USER_ACTION #endif /* Code executed at the end of each rule. */ #ifndef YY_BREAK #define YY_BREAK break; #endif #define YY_RULE_SETUP \ if ( yyleng > 0 ) \ yy_current_buffer->yy_at_bol = \ (yytext[yyleng - 1] == '\n'); \ YY_USER_ACTION YY_DECL; YY_DECL { yy_state_type yy_current_state; char *yy_cp, *yy_bp; int yy_act; /* Reset multi-byte shift state */ mbstate_t mbss; memset(&mbss, 0, sizeof(mbss)); /* #line 56 "pp_lexer.fl" --DS */ /* #line 619 "pp_lexer.c" --DS */ if ( yy_init ) { yy_init = 0; #ifdef YY_USER_INIT YY_USER_INIT; #endif if ( ! yy_start ) yy_start = 1; /* first start state */ if ( ! yyin ) yyin = stdin; if ( ! yyout ) yyout = stdout; if ( ! yy_current_buffer ) yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); yy_load_buffer_state(); } while ( 1 ) /* loops until end-of-file is reached */ { yy_cp = yy_c_buf_p; /* Support of yytext. */ *yy_cp = yy_hold_char; /* yy_bp points to the position in yy_ch_buf of the start of * the current run. */ yy_bp = yy_cp; yy_current_state = yy_start; yy_current_state += YY_AT_BOL(); yy_state_ptr = yy_state_buf; *yy_state_ptr++ = yy_current_state; yy_match: do { register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)]; while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 28 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; *yy_state_ptr++ = yy_current_state; ++yy_cp; } while ( yy_base[yy_current_state] != 66 ); yy_find_action: yy_current_state = *--yy_state_ptr; yy_lp = yy_accept[yy_current_state]; /* find_rule: --DS */ /* we branch to this label when backing up */ for ( ; ; ) /* until we find what rule we matched */ { if ( yy_lp && yy_lp < yy_accept[yy_current_state + 1] ) { yy_act = yy_acclist[yy_lp]; { yy_full_match = yy_cp; break; } } --yy_cp; yy_current_state = *--yy_state_ptr; yy_lp = yy_accept[yy_current_state]; } YY_DO_BEFORE_ACTION; if ( yy_act != YY_END_OF_BUFFER ) { int yyl; for ( yyl = 0; yyl < yyleng; ++yyl ) if ( yytext[yyl] == '\n' ) ++yylineno; } do_action: /* This label is used only to access EOF actions. */ switch ( yy_act ) { /* beginning of action switch */ case 1: *yy_cp = yy_hold_char; /* undo effects of setting up yytext */ yy_c_buf_p = yy_cp -= 1; YY_DO_BEFORE_ACTION; /* set up yytext again */ YY_RULE_SETUP /* #line 58 "pp_lexer.fl" --DS */ ; YY_BREAK case 2: YY_RULE_SETUP /* #line 59 "pp_lexer.fl" --DS */ ; YY_BREAK case 3: YY_RULE_SETUP /* #line 61 "pp_lexer.fl" --DS */ { set_label(clt, yytext); } YY_BREAK case 4: YY_RULE_SETUP /* #line 62 "pp_lexer.fl" --DS */ { add_set_of_strings_to_label(clt, &(yytext[1])); } YY_BREAK case 5: YY_RULE_SETUP /* #line 63 "pp_lexer.fl" --DS */ { add_string_to_label(clt, yytext); } YY_BREAK case 6: YY_RULE_SETUP /* #line 64 "pp_lexer.fl" --DS */ { add_string_to_label(clt, yytext); } YY_BREAK case 7: YY_RULE_SETUP /* #line 66 "pp_lexer.fl" --DS */ { prt_error("Fatal Error: pp_lexer: unable to parse knowledge file (line %i).\n",yylineno); exit(1); } YY_BREAK case 8: YY_RULE_SETUP /* #line 68 "pp_lexer.fl" --DS */ ECHO; YY_BREAK /* #line 754 "pp_lexer.c" --DS */ case YY_STATE_EOF(INITIAL): case YY_STATE_EOF(INCLUDE): yyterminate(); case YY_END_OF_BUFFER: { /* Amount of text matched not including the EOB char. */ int yy_amount_of_matched_text = (int) (yy_cp - yytext_ptr) - 1; /* Undo the effects of YY_DO_BEFORE_ACTION. */ *yy_cp = yy_hold_char; if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_NEW ) { /* We're scanning a new file or input source. It's * possible that this happened because the user * just pointed yyin at a new source and called * yylex(). If so, then we have to assure * consistency between yy_current_buffer and our * globals. Here is the right place to do so, because * this is the first action (other than possibly a * back-up) that will match for the new input source. */ yy_n_chars = yy_current_buffer->yy_n_chars; yy_current_buffer->yy_input_file = yyin; yy_current_buffer->yy_buffer_status = YY_BUFFER_NORMAL; } /* Note that here we test for yy_c_buf_p "<=" to the position * of the first EOB in the buffer, since yy_c_buf_p will * already have been incremented past the NUL character * (since all states make transitions on EOB to the * end-of-buffer state). Contrast this with the test * in input(). */ if ( yy_c_buf_p <= &yy_current_buffer->yy_ch_buf[yy_n_chars] ) { /* This was really a NUL. */ yy_state_type yy_next_state; yy_c_buf_p = yytext_ptr + yy_amount_of_matched_text; yy_current_state = yy_get_previous_state(); /* Okay, we're now positioned to make the NUL * transition. We couldn't have * yy_get_previous_state() go ahead and do it * for us because it doesn't know how to deal * with the possibility of jamming (and we don't * want to build jamming into it because then it * will run more slowly). */ yy_next_state = yy_try_NUL_trans( yy_current_state ); yy_bp = yytext_ptr + YY_MORE_ADJ; if ( yy_next_state ) { /* Consume the NUL. */ yy_cp = ++yy_c_buf_p; yy_current_state = yy_next_state; goto yy_match; } else { yy_cp = yy_c_buf_p; goto yy_find_action; } } else switch ( yy_get_next_buffer(&mbss) ) { case EOB_ACT_END_OF_FILE: { yy_did_buffer_switch_on_eof = 0; if ( yywrap() ) { /* Note: because we've taken care in * yy_get_next_buffer() to have set up * yytext, we can now set up * yy_c_buf_p so that if some total * hoser (like flex itself) wants to * call the scanner after we return the * YY_NULL, it'll still work - another * YY_NULL will get returned. */ yy_c_buf_p = yytext_ptr + YY_MORE_ADJ; yy_act = YY_STATE_EOF(YY_START); goto do_action; } else { if ( ! yy_did_buffer_switch_on_eof ) YY_NEW_FILE; } break; } case EOB_ACT_CONTINUE_SCAN: yy_c_buf_p = yytext_ptr + yy_amount_of_matched_text; yy_current_state = yy_get_previous_state(); yy_cp = yy_c_buf_p; yy_bp = yytext_ptr + YY_MORE_ADJ; goto yy_match; case EOB_ACT_LAST_MATCH: yy_c_buf_p = &yy_current_buffer->yy_ch_buf[yy_n_chars]; yy_current_state = yy_get_previous_state(); yy_cp = yy_c_buf_p; yy_bp = yytext_ptr + YY_MORE_ADJ; goto yy_find_action; } break; } default: YY_FATAL_ERROR( "fatal flex scanner internal error--no action found" ); } /* end of action switch */ } /* end of scanning one token */ } /* end of yylex */ /* yy_get_next_buffer - try to read in a new buffer * * Returns a code representing an action: * EOB_ACT_LAST_MATCH - * EOB_ACT_CONTINUE_SCAN - continue scanning from current position * EOB_ACT_END_OF_FILE - end of file */ static int yy_get_next_buffer(mbstate_t *pmbss) { char *dest = yy_current_buffer->yy_ch_buf; char *source = yytext_ptr; int number_to_move, i; int ret_val; if ( yy_c_buf_p > &yy_current_buffer->yy_ch_buf[yy_n_chars + 1] ) YY_FATAL_ERROR( "fatal flex scanner internal error--end of buffer missed" ); if ( yy_current_buffer->yy_fill_buffer == 0 ) { /* Don't try to fill the buffer, so this is an EOF. */ if ( yy_c_buf_p - yytext_ptr - YY_MORE_ADJ == 1 ) { /* We matched a singled characater, the EOB, so * treat this as a final EOF. */ return EOB_ACT_END_OF_FILE; } else { /* We matched some text prior to the EOB, first * process it. */ return EOB_ACT_LAST_MATCH; } } /* Try to read more data. */ /* First move last chars to start of buffer. */ number_to_move = (int) (yy_c_buf_p - yytext_ptr) - 1; for ( i = 0; i < number_to_move; ++i ) *(dest++) = *(source++); if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_EOF_PENDING ) /* don't do the read, it's not guaranteed to return an EOF, * just force an EOF */ yy_n_chars = 0; else { int num_to_read = yy_current_buffer->yy_buf_size - number_to_move - 1; while ( num_to_read <= 0 ) { /* Not enough room in the buffer - grow it. */ #ifdef YY_USES_REJECT YY_FATAL_ERROR( "input buffer overflow, can't enlarge buffer because scanner uses REJECT" ); #else /* just a shorter name for the current buffer */ YY_BUFFER_STATE b = yy_current_buffer; int yy_c_buf_p_offset = (int) (yy_c_buf_p - b->yy_ch_buf); if ( b->yy_is_our_buffer ) { int new_size = b->yy_buf_size * 2; if ( new_size <= 0 ) b->yy_buf_size += b->yy_buf_size / 8; else b->yy_buf_size *= 2; b->yy_ch_buf = (char *) /* Include room in for 2 EOB chars. */ yy_flex_realloc( (void *) b->yy_ch_buf, b->yy_buf_size + 2 ); } else /* Can't grow it, we don't own it. */ b->yy_ch_buf = 0; if ( ! b->yy_ch_buf ) YY_FATAL_ERROR( "fatal error - scanner input buffer overflow" ); yy_c_buf_p = &b->yy_ch_buf[yy_c_buf_p_offset]; num_to_read = yy_current_buffer->yy_buf_size - number_to_move - 1; #endif } if ( num_to_read > YY_READ_BUF_SIZE ) num_to_read = YY_READ_BUF_SIZE; /* Read in more data. */ YY_INPUT( (&yy_current_buffer->yy_ch_buf[number_to_move]), yy_n_chars, num_to_read, pmbss ); } if ( yy_n_chars == 0 ) { if ( number_to_move == YY_MORE_ADJ ) { ret_val = EOB_ACT_END_OF_FILE; yyrestart( yyin ); } else { ret_val = EOB_ACT_LAST_MATCH; yy_current_buffer->yy_buffer_status = YY_BUFFER_EOF_PENDING; } } else ret_val = EOB_ACT_CONTINUE_SCAN; yy_n_chars += number_to_move; yy_current_buffer->yy_ch_buf[yy_n_chars] = YY_END_OF_BUFFER_CHAR; yy_current_buffer->yy_ch_buf[yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR; yytext_ptr = &yy_current_buffer->yy_ch_buf[0]; return ret_val; } /* yy_get_previous_state - get the state just before the EOB char was reached */ static yy_state_type yy_get_previous_state(void) { register yy_state_type yy_current_state; register char *yy_cp; yy_current_state = yy_start; yy_current_state += YY_AT_BOL(); yy_state_ptr = yy_state_buf; *yy_state_ptr++ = yy_current_state; for ( yy_cp = yytext_ptr + YY_MORE_ADJ; yy_cp < yy_c_buf_p; ++yy_cp ) { register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 28 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; *yy_state_ptr++ = yy_current_state; } return yy_current_state; } /* yy_try_NUL_trans - try to make a transition on the NUL character * * synopsis * next_state = yy_try_NUL_trans( current_state ); */ #ifdef YY_USE_PROTOS static yy_state_type yy_try_NUL_trans( yy_state_type yy_current_state ) #else static yy_state_type yy_try_NUL_trans( yy_current_state ) yy_state_type yy_current_state; #endif { register int yy_is_jam; register YY_CHAR yy_c = 1; while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 28 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; *yy_state_ptr++ = yy_current_state; yy_is_jam = (yy_current_state == 27); return yy_is_jam ? 0 : yy_current_state; } #if 0 /* --DS */ #ifdef YY_USE_PROTOS static void yyunput( int c, register char *yy_bp ) #else static void yyunput( c, yy_bp ) int c; register char *yy_bp; #endif { register char *yy_cp = yy_c_buf_p; /* undo effects of setting up yytext */ *yy_cp = yy_hold_char; if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 ) { /* need to shift things up to make room */ /* +2 for EOB chars. */ register int number_to_move = yy_n_chars + 2; register char *dest = &yy_current_buffer->yy_ch_buf[ yy_current_buffer->yy_buf_size + 2]; register char *source = &yy_current_buffer->yy_ch_buf[number_to_move]; while ( source > yy_current_buffer->yy_ch_buf ) *--dest = *--source; yy_cp += (int) (dest - source); yy_bp += (int) (dest - source); yy_n_chars = yy_current_buffer->yy_buf_size; if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 ) YY_FATAL_ERROR( "flex scanner push-back overflow" ); } *--yy_cp = (char) c; if ( c == '\n' ) --yylineno; yytext_ptr = yy_bp; yy_hold_char = *yy_cp; yy_c_buf_p = yy_cp; } #endif /* --DS */ #ifdef THIS_FUNCTION_IS_NOT_USED_ANYMORE #ifdef __cplusplus static int yyinput(void) #else static int input(void) #endif { int c; *yy_c_buf_p = yy_hold_char; if ( *yy_c_buf_p == YY_END_OF_BUFFER_CHAR ) { /* yy_c_buf_p now points to the character we want to return. * If this occurs *before* the EOB characters, then it's a * valid NUL; if not, then we've hit the end of the buffer. */ if ( yy_c_buf_p < &yy_current_buffer->yy_ch_buf[yy_n_chars] ) /* This was really a NUL. */ *yy_c_buf_p = '\0'; else { /* need more input */ yytext_ptr = yy_c_buf_p; ++yy_c_buf_p; switch ( yy_get_next_buffer() ) { case EOB_ACT_END_OF_FILE: { if ( yywrap() ) { yy_c_buf_p = yytext_ptr + YY_MORE_ADJ; return EOF; } if ( ! yy_did_buffer_switch_on_eof ) YY_NEW_FILE; #ifdef __cplusplus return yyinput(); #else return input(); #endif } case EOB_ACT_CONTINUE_SCAN: yy_c_buf_p = yytext_ptr + YY_MORE_ADJ; break; case EOB_ACT_LAST_MATCH: #ifdef __cplusplus YY_FATAL_ERROR( "unexpected last match in yyinput()" ); #else YY_FATAL_ERROR( "unexpected last match in input()" ); #endif } } } c = *(unsigned char *) yy_c_buf_p; /* cast for 8-bit char's */ *yy_c_buf_p = '\0'; /* preserve yytext */ yy_hold_char = *++yy_c_buf_p; yy_current_buffer->yy_at_bol = (c == '\n'); if ( yy_current_buffer->yy_at_bol ) ++yylineno; return c; } #endif /* THIS_FUNCTION_IS_NOT_USED_ANYMORE */ #ifdef YY_USE_PROTOS void yyrestart( FILE *input_file ) #else void yyrestart( input_file ) FILE *input_file; #endif { if ( ! yy_current_buffer ) yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); yy_init_buffer( yy_current_buffer, input_file ); yy_load_buffer_state(); } #ifdef YY_USE_PROTOS void yy_switch_to_buffer( YY_BUFFER_STATE new_buffer ) #else void yy_switch_to_buffer( new_buffer ) YY_BUFFER_STATE new_buffer; #endif { if ( yy_current_buffer == new_buffer ) return; if ( yy_current_buffer ) { /* Flush out information for old buffer. */ *yy_c_buf_p = yy_hold_char; yy_current_buffer->yy_buf_pos = yy_c_buf_p; yy_current_buffer->yy_n_chars = yy_n_chars; } yy_current_buffer = new_buffer; yy_load_buffer_state(); /* We don't actually know whether we did this switch during * EOF (yywrap()) processing, but the only time this flag * is looked at is after yywrap() is called, so it's safe * to go ahead and always set it. */ yy_did_buffer_switch_on_eof = 1; } #ifdef YY_USE_PROTOS void yy_load_buffer_state( void ) #else void yy_load_buffer_state() #endif { yy_n_chars = yy_current_buffer->yy_n_chars; yytext_ptr = yy_c_buf_p = yy_current_buffer->yy_buf_pos; yyin = yy_current_buffer->yy_input_file; yy_hold_char = *yy_c_buf_p; } #ifdef YY_USE_PROTOS YY_BUFFER_STATE yy_create_buffer( FILE *file, int size ) #else YY_BUFFER_STATE yy_create_buffer( file, size ) FILE *file; int size; #endif { YY_BUFFER_STATE b; b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) ); if ( ! b ) YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); b->yy_buf_size = size; /* yy_ch_buf has to be 2 characters longer than the size given because * we need to put in 2 end-of-buffer characters. */ b->yy_ch_buf = (char *) yy_flex_alloc( b->yy_buf_size + 2 ); if ( ! b->yy_ch_buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); b->yy_is_our_buffer = 1; yy_init_buffer( b, file ); return b; } #ifdef YY_USE_PROTOS void yy_delete_buffer( YY_BUFFER_STATE b ) #else void yy_delete_buffer( b ) YY_BUFFER_STATE b; #endif { if ( b == yy_current_buffer ) yy_current_buffer = (YY_BUFFER_STATE) 0; if ( b->yy_is_our_buffer ) yy_flex_free( (void *) b->yy_ch_buf ); yy_flex_free( (void *) b ); } #ifndef YY_ALWAYS_INTERACTIVE #ifndef YY_NEVER_INTERACTIVE extern int isatty YY_PROTO(( int )); #endif #endif #ifdef YY_USE_PROTOS void yy_init_buffer( YY_BUFFER_STATE b, FILE *file ) #else void yy_init_buffer( b, file ) YY_BUFFER_STATE b; FILE *file; #endif { yy_flush_buffer( b ); b->yy_input_file = file; b->yy_fill_buffer = 1; #if YY_ALWAYS_INTERACTIVE b->yy_is_interactive = 1; #else #if YY_NEVER_INTERACTIVE b->yy_is_interactive = 0; #else b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; #endif #endif } #ifdef YY_USE_PROTOS void yy_flush_buffer( YY_BUFFER_STATE b ) #else void yy_flush_buffer( b ) YY_BUFFER_STATE b; #endif { b->yy_n_chars = 0; /* We always need two end-of-buffer characters. The first causes * a transition to the end-of-buffer state. The second causes * a jam in that state. */ b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; b->yy_buf_pos = &b->yy_ch_buf[0]; b->yy_at_bol = 1; b->yy_buffer_status = YY_BUFFER_NEW; if ( b == yy_current_buffer ) yy_load_buffer_state(); } #ifndef YY_NO_SCAN_BUFFER #ifdef YY_USE_PROTOS YY_BUFFER_STATE yy_scan_buffer( char *base, yy_size_t size ) #else YY_BUFFER_STATE yy_scan_buffer( base, size ) char *base; yy_size_t size; #endif { YY_BUFFER_STATE b; if ( size < 2 || base[size-2] != YY_END_OF_BUFFER_CHAR || base[size-1] != YY_END_OF_BUFFER_CHAR ) /* They forgot to leave room for the EOB's. */ return 0; b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) ); if ( ! b ) YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" ); b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */ b->yy_buf_pos = b->yy_ch_buf = base; b->yy_is_our_buffer = 0; b->yy_input_file = 0; b->yy_n_chars = b->yy_buf_size; b->yy_is_interactive = 0; b->yy_at_bol = 1; b->yy_fill_buffer = 0; b->yy_buffer_status = YY_BUFFER_NEW; yy_switch_to_buffer( b ); return b; } #endif #ifndef YY_NO_SCAN_STRING #ifdef YY_USE_PROTOS YY_BUFFER_STATE yy_scan_string( const char *str ) #else YY_BUFFER_STATE yy_scan_string( str ) const char *str; #endif { int len; for ( len = 0; str[len]; ++len ) ; return yy_scan_bytes( str, len ); } #endif #ifndef YY_NO_SCAN_BYTES #ifdef YY_USE_PROTOS YY_BUFFER_STATE yy_scan_bytes( const char *bytes, int len ) #else YY_BUFFER_STATE yy_scan_bytes( bytes, len ) const char *bytes; int len; #endif { YY_BUFFER_STATE b; char *buf; yy_size_t n; int i; /* Get memory for full buffer, including space for trailing EOB's. */ n = len + 2; buf = (char *) yy_flex_alloc( n ); if ( ! buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" ); for ( i = 0; i < len; ++i ) buf[i] = bytes[i]; buf[len] = buf[len+1] = YY_END_OF_BUFFER_CHAR; b = yy_scan_buffer( buf, n ); if ( ! b ) YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" ); /* It's okay to grow etc. this buffer, and we should throw it * away when we're done. */ b->yy_is_our_buffer = 1; return b; } #endif #ifndef YY_NO_PUSH_STATE #ifdef YY_USE_PROTOS static void yy_push_state( int new_state ) #else static void yy_push_state( new_state ) int new_state; #endif { if ( yy_start_stack_ptr >= yy_start_stack_depth ) { yy_size_t new_size; yy_start_stack_depth += YY_START_STACK_INCR; new_size = yy_start_stack_depth * sizeof( int ); if ( ! yy_start_stack ) yy_start_stack = (int *) yy_flex_alloc( new_size ); else yy_start_stack = (int *) yy_flex_realloc( (void *) yy_start_stack, new_size ); if ( ! yy_start_stack ) YY_FATAL_ERROR( "out of memory expanding start-condition stack" ); } yy_start_stack[yy_start_stack_ptr++] = YY_START; BEGIN(new_state); } #endif #ifndef YY_NO_POP_STATE static void yy_pop_state() { if ( --yy_start_stack_ptr < 0 ) YY_FATAL_ERROR( "start-condition stack underflow" ); BEGIN(yy_start_stack[yy_start_stack_ptr]); } #endif #ifndef YY_NO_TOP_STATE static int yy_top_state() { return yy_start_stack[yy_start_stack_ptr - 1]; } #endif #ifndef YY_EXIT_FAILURE #define YY_EXIT_FAILURE 2 #endif #ifdef YY_USE_PROTOS static void yy_fatal_error( const char msg[] ) #else static void yy_fatal_error( msg ) char msg[]; #endif { (void) fprintf( stderr, "%s\n", msg ); exit( YY_EXIT_FAILURE ); } /* Redefine yyless() so it works in section 3 code. */ #undef yyless #define yyless(n) \ do \ { \ /* Undo effects of setting up yytext. */ \ yytext[yyleng] = yy_hold_char; \ yy_c_buf_p = yytext + n - YY_MORE_ADJ; \ yy_hold_char = *yy_c_buf_p; \ *yy_c_buf_p = '\0'; \ yyleng = n; \ } \ while ( 0 ) /* Internal utility routines. */ #ifndef yytext_ptr #ifdef YY_USE_PROTOS static void yy_flex_strncpy( char *s1, const char *s2, int n ) #else static void yy_flex_strncpy( s1, s2, n ) char *s1; const char *s2; int n; #endif { register int i; for ( i = 0; i < n; ++i ) s1[i] = s2[i]; } #endif #ifdef YY_USE_PROTOS static void *yy_flex_alloc( yy_size_t size ) #else static void *yy_flex_alloc( size ) yy_size_t size; #endif { return (void *) malloc( size ); } #if 0 /* --DS */ #ifdef YY_USE_PROTOS static void *yy_flex_realloc( void *ptr, yy_size_t size ) #else static void *yy_flex_realloc( ptr, size ) void *ptr; yy_size_t size; #endif { return (void *) realloc( ptr, size ); } #endif /* --DS */ #ifdef YY_USE_PROTOS static void yy_flex_free( void *ptr ) #else static void yy_flex_free( ptr ) void *ptr; #endif { free( ptr ); } #if YY_MAIN int main() { yylex(); return 0; } #endif /* #line 68 "pp_lexer.fl" --DS */ /************************ exported functions ******************************/ PPLexTable *pp_lexer_open(FILE *f) { PPLexTable *lt; if (f == NULL) { prt_error("Fatal Error: pp_lexer_open: passed a NULL file pointer"); exit(1); } yyin = f; /* redirect lex to look at the specified file */ lt = (PPLexTable*) xalloc (sizeof(PPLexTable)); setup(lt); clt = lt; /* set lt to be the current table, which yylex will fill in */ yylex(); clt = NULL; lt->idx_of_active_label=-1; return lt; } void pp_lexer_close(PPLexTable *lt) { int i; pp_label_node *node,*next; for (i=0; inodes_of_label[i]; while (node) { next = node->next; xfree(node, sizeof(pp_label_node)); node=next; } } string_set_delete(lt->string_set); xfree(lt, sizeof(PPLexTable)); } int pp_lexer_set_label(PPLexTable *lt, const char *label) { /* set lexer state to first node of this label */ lt->idx_of_active_label = get_index_of_label(lt, label); if (lt->idx_of_active_label==-1) return 0; /* label not found */ lt->current_node_of_active_label=lt->nodes_of_label[lt->idx_of_active_label]; return 1; } int pp_lexer_count_tokens_of_label(PPLexTable *lt) { /* counts all tokens, even the commas */ int n; pp_label_node *p; if (lt->idx_of_active_label==-1) { prt_error("Fatal Error: pp_lexer: current label is invalid"); exit(1); } for (n=0, p=lt->nodes_of_label[lt->idx_of_active_label]; p;p=p->next, n++){} return n; } const char *pp_lexer_get_next_token_of_label(PPLexTable *lt) { /* retrieves next token of set label, or NULL if list exhausted */ static const char *p; if (lt->current_node_of_active_label==NULL) return NULL; p = lt->current_node_of_active_label->str; lt->current_node_of_active_label=lt->current_node_of_active_label->next; return p; } int pp_lexer_count_commas_of_label(PPLexTable *lt) { int n; pp_label_node *p; if (lt->idx_of_active_label==-1) { prt_error("Fatal Error: pp_lexer: current label is invalid"); exit(1); } for (n=0,p=lt->nodes_of_label[lt->idx_of_active_label];p!=NULL;p=p->next) if (!strcmp(p->str, ",")) n++; return n; } const char **pp_lexer_get_next_group_of_tokens_of_label(PPLexTable *lt, int *n_tokens) { /* all tokens until next comma, null-terminated */ int n; pp_label_node *p; static const char **tokens = NULL; static int extents=0; p=lt->current_node_of_active_label; for (n=0; p!=NULL && strcmp(p->str,","); n++, p=p->next) {} if (n>extents) { extents = n; free (tokens); tokens = (const char **) malloc (extents * sizeof(const char*)); } p = lt->current_node_of_active_label; for (n=0; p!=NULL && strcmp(p->str,","); n++, p=p->next) tokens[n] = string_set_add(p->str, lt->string_set); /* advance "current node of label" state */ lt->current_node_of_active_label = p; if (p!=NULL) lt->current_node_of_active_label = p->next; *n_tokens = n; return tokens; } int yywrap(void) { /* must return 1 for end of input, 0 otherwise */ return 1; } /********************** non-exported functions ************************/ static void setup(PPLexTable *lt) { int i; for (i=0; inodes_of_label[i] = NULL; lt->last_node_of_label[i] = NULL; lt->labels[i]=NULL; } lt->string_set = string_set_create(); } static void set_label(PPLexTable *lt, const char *label) { int i; char *c; char *label_sans_colon; /* check for and then slice off the trailing colon */ label_sans_colon = strdup(label); c=&(label_sans_colon[strlen(label_sans_colon)-1]); if (*c != ':') { prt_error("Fatal Error: Label %s must end with :", label); exit(1); } *c = 0; /* have we seen this label already? If so, abort */ for (i=0;lt->labels[i]!=NULL && strcmp(lt->labels[i],label_sans_colon);i++) {} if (lt->labels[i]!=NULL) { prt_error("Fatal Error: pp_lexer: label %s multiply defined!", label_sans_colon); exit(1); } /* new label. Store it */ if (i == PP_LEXER_MAX_LABELS-1) { prt_error("Fatal Error: pp_lexer: too many labels. Raise PP_LEXER_MAX_LABELS"); exit(1); } lt->labels[i] = string_set_add(label_sans_colon, lt->string_set); lt->idx_of_active_label = i; free(label_sans_colon); } static void add_string_to_label(PPLexTable *lt, const char *str) { /* add the single string str to the set of strings associated with label */ pp_label_node *new_node; if (lt->idx_of_active_label == -1) { prt_error("Fatal Error: pp_lexer: invalid syntax (line %i)",yylineno); exit(1); } /* make sure string is legal */ check_string(str); /* create a new node in (as yet to be determined) linked list of strings */ new_node = (pp_label_node *) xalloc (sizeof(pp_label_node)); new_node->str = string_set_add(str, lt->string_set); new_node->next = NULL; /* stick newly-created node at the *end* of the appropriate linked list */ if (lt->last_node_of_label[lt->idx_of_active_label]==NULL) { /* first entry on linked list */ lt->nodes_of_label[lt->idx_of_active_label] = new_node; lt->last_node_of_label[lt->idx_of_active_label] = new_node; } else { /* non-first entry on linked list */ lt->last_node_of_label[lt->idx_of_active_label]->next = new_node; lt->last_node_of_label[lt->idx_of_active_label] = new_node; } } static void add_set_of_strings_to_label(PPLexTable *lt,const char *label_of_set) { /* add the set of strings, defined earlier by label_of_set, to the set of strings associated with the current label */ pp_label_node *p; int idx_of_label_of_set; if (lt->idx_of_active_label==-1) { prt_error("Fatal Error: pp_lexer: invalid syntax (line %i)",yylineno); exit(1); } if ((idx_of_label_of_set = get_index_of_label(lt, label_of_set))==-1) { prt_error("Fatal Error: pp_lexer: label %s must be defined before it's referred to (line %i)" ,label_of_set, yylineno); exit(1); } for (p=lt->nodes_of_label[idx_of_label_of_set]; p!=NULL; p=p->next) add_string_to_label(lt, p->str); } #if 0 /* --DS */ static void show_bindings(PPLexTable *lt) { /* Diagnostic. Show contents of knowledge file, as arranged internally */ int i,j; char *la; pp_label_node *p; printf("The symbol table's contents: \n"); for (i=0; (la=lt->labels[i])!=NULL; i++) { printf("\n\n%s\n", la); for (j=0; jnodes_of_label[i]; p!=NULL; p=p->next) printf(" %s ", p->str); } printf("\n"); } #endif static int get_index_of_label(PPLexTable *lt, const char *label) { int i; for (i=0; lt->labels[i]!=NULL; i++) if (!strcmp(lt->labels[i], label)) return i; return -1; } static void check_string(const char *str) { if (strlen(str)>1 && strchr(str, ',')!=NULL) { prt_error("Fatal Error: pp_lexer: string %s contains a comma, which is a no-no.",str); exit(1); } } link-grammar-4.7.4/link-grammar/disjuncts.h0000644000175000017500000000160111133175025017645 0ustar bloombloom/*************************************************************************/ /* Copyright (c) 2008, 2009 Linas Vepstas */ /* All rights reserved */ /* */ /* Use of the link grammar parsing system is subject to the terms of the */ /* license set forth in the LICENSE file included with this software, */ /* and also available at http://www.link.cs.cmu.edu/link/license.html */ /* This license allows free redistribution and use in source and binary */ /* forms, with or without modification, subject to certain conditions. */ /* */ /*************************************************************************/ void lg_compute_disjunct_strings(Sentence, Linkage_info *); link-grammar-4.7.4/link-grammar/minisat/0000755000175000017500000000000011531775721017147 5ustar bloombloomlink-grammar-4.7.4/link-grammar/minisat/Vec.h0000644000175000017500000001324711052427621020033 0ustar bloombloom/*******************************************************************************************[Vec.h] MiniSat -- Copyright (c) 2003-2006, Niklas Een, Niklas Sorensson Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. **************************************************************************************************/ #ifndef Vec_h #define Vec_h #include #include //================================================================================================= // Automatically resizable arrays // // NOTE! Don't use this vector on datatypes that cannot be re-located in memory (with realloc) template class vec { T* data; int sz; int cap; void init(int size, const T& pad); void grow(int min_cap); // Don't allow copying (error prone): vec& operator = (vec& other) { return *this; } vec (vec& other) { } static inline int imin(int x, int y) { int mask = (x-y) >> (sizeof(int)*8-1); return (x&mask) + (y&(~mask)); } static inline int imax(int x, int y) { int mask = (y-x) >> (sizeof(int)*8-1); return (x&mask) + (y&(~mask)); } public: // Types: typedef int Key; typedef T Datum; // Constructors: vec(void) : data(NULL) , sz(0) , cap(0) { } vec(const T& a, const T& b) : cap(2), sz(2) { data = (T*)malloc(cap * sizeof(T)); data[0] = a; data[1] = b; } vec(int size) : data(NULL) , sz(0) , cap(0) { growTo(size); } vec(int size, const T& pad) : data(NULL) , sz(0) , cap(0) { growTo(size, pad); } vec(T* array, int size) : data(array), sz(size), cap(size) { } // (takes ownership of array -- will be deallocated with 'free()') ~vec(void) { clear(true); } // Ownership of underlying array: T* release (void) { T* ret = data; data = NULL; sz = 0; cap = 0; return ret; } operator T* (void) { return data; } // (unsafe but convenient) operator const T* (void) const { return data; } // Size operations: int size (void) const { return sz; } void shrink (int nelems) { for (int i = 0; i < nelems; i++) sz--, data[sz].~T(); } void shrink_(int nelems) { sz -= nelems; } void pop (void) { sz--, data[sz].~T(); } void growTo (int size); void growTo (int size, const T& pad); void clear (bool dealloc = false); void capacity (int size) { grow(size); } // Stack interface: #if 1 void push (void) { if (sz == cap) { cap = imax(2, (cap*3+1)>>1); data = (T*)realloc(data, cap * sizeof(T)); } new (&data[sz]) T(); sz++; } //void push (const T& elem) { if (sz == cap) { cap = imax(2, (cap*3+1)>>1); data = (T*)realloc(data, cap * sizeof(T)); } new (&data[sz]) T(elem); sz++; } void push (const T& elem) { if (sz == cap) { cap = imax(2, (cap*3+1)>>1); data = (T*)realloc(data, cap * sizeof(T)); } data[sz++] = elem; } void push_ (const T& elem) { data[sz++] = elem; } #else void push (void) { if (sz == cap) grow(sz+1); new (&data[sz]) T() ; sz++; } void push (const T& elem) { if (sz == cap) grow(sz+1); new (&data[sz]) T(elem); sz++; } #endif const T& last (void) const { return data[sz-1]; } T& last (void) { return data[sz-1]; } // Vector interface: const T& operator [] (int index) const { return data[index]; } T& operator [] (int index) { return data[index]; } // Duplicatation (preferred instead): void copyTo(vec& copy) const { copy.clear(); copy.growTo(sz); for (int i = 0; i < sz; i++) new (©[i]) T(data[i]); } void moveTo(vec& dest) { dest.clear(true); dest.data = data; dest.sz = sz; dest.cap = cap; data = NULL; sz = 0; cap = 0; } }; template void vec::grow(int min_cap) { if (min_cap <= cap) return; if (cap == 0) cap = (min_cap >= 2) ? min_cap : 2; else do cap = (cap*3+1) >> 1; while (cap < min_cap); data = (T*)realloc(data, cap * sizeof(T)); } template void vec::growTo(int size, const T& pad) { if (sz >= size) return; grow(size); for (int i = sz; i < size; i++) new (&data[i]) T(pad); sz = size; } template void vec::growTo(int size) { if (sz >= size) return; grow(size); for (int i = sz; i < size; i++) new (&data[i]) T(); sz = size; } template void vec::clear(bool dealloc) { if (data != NULL){ for (int i = 0; i < sz; i++) data[i].~T(); sz = 0; if (dealloc) free(data), data = NULL, cap = 0; } } #endif link-grammar-4.7.4/link-grammar/minisat/Solver.h0000644000175000017500000004276111052427621020573 0ustar bloombloom/****************************************************************************************[Solver.h] MiniSat -- Copyright (c) 2003-2006, Niklas Een, Niklas Sorensson Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. **************************************************************************************************/ #ifndef Solver_h #define Solver_h #include #include #include "Vec.h" #include "Heap.h" #include "Alg.h" #include "SolverTypes.h" //================================================================================================= // Solver -- the main class: class Solver { public: // Constructor/Destructor: // Solver(); ~Solver(); // Problem specification: // Var newVar (bool polarity = true, double activity = 0.0, bool dvar = true); // Add a new variable with parameters specifying variable mode. bool addClause (vec& ps); // Add a clause to the solver. NOTE! 'ps' may be shrunk by this method! void addConflictingClause(vec& lits); // Solving: // bool simplify (); // Removes already satisfied clauses. lbool solve (const vec& assumps); // Search for a model that respects a given set of assumptions. lbool solve (); // Search without assumptions. bool okay () const; // FALSE means solver is in a conflicting state // Variable mode: // void setPolarity (Var v, bool b); // Declare which polarity the decision heuristic should use for a variable. Requires mode 'polarity_user'. void setDecisionVar (Var v, bool b); // Declare if a variable should be eligible for selection in the decision heuristic. void setActivity (Var v, double a); // Read state: // lbool value (Var x) const; // The current value of a variable. lbool value (Lit p) const; // The current value of a literal. lbool modelValue (Lit p) const; // The value of a literal in the last model. The last call to solve must have been satisfiable. int nAssigns () const; // The current number of assigned literals. int nClauses () const; // The current number of original clauses. int nLearnts () const; // The current number of learnt clauses. int nVars () const; // The current number of variables. // Extra results: (read-only member variable) // vec model; // If problem is satisfiable, this vector contains the model (if any). vec conflict; // If problem is unsatisfiable (possibly under assumptions), // this vector represent the final conflict clause expressed in the assumptions. // Mode of operation: // double var_decay; // Inverse of the variable activity decay factor. (default 1 / 0.95) double clause_decay; // Inverse of the clause activity decay factor. (1 / 0.999) double random_var_freq; // The frequency with which the decision heuristic tries to choose a random variable. (default 0.02) int restart_first; // The initial restart limit. (default 100) double restart_inc; // The factor with which the restart limit is multiplied in each restart. (default 1.5) double learntsize_factor; // The intitial limit for learnt clauses is a factor of the original clauses. (default 1 / 3) double learntsize_inc; // The limit for learnt clauses is multiplied with this factor each restart. (default 1.1) bool expensive_ccmin; // Controls conflict clause minimization. (default TRUE) int polarity_mode; // Controls which polarity the decision heuristic chooses. See enum below for allowed modes. (default polarity_false) int verbosity; // Verbosity level. 0=silent, 1=some progress report (default 0) enum { polarity_true = 0, polarity_false = 1, polarity_user = 2, polarity_rnd = 3 }; // Statistics: (read-only member variable) // uint64_t starts, decisions, rnd_decisions, propagations, conflicts; uint64_t clauses_literals, learnts_literals, max_literals, tot_literals; protected: // Helper structures: // struct VarOrderLt { const vec& activity; bool operator () (Var x, Var y) const { return activity[x] > activity[y]; } VarOrderLt(const vec& act) : activity(act) { } void print(Var x) const { printf("%.2f", activity[x]); } }; friend class VarFilter; struct VarFilter { const Solver& s; VarFilter(const Solver& _s) : s(_s) {} bool operator()(Var v) const { return toLbool(s.assigns[v]) == l_Undef && s.decision_var[v]; } }; // Solver state: // bool ok; // If FALSE, the constraints are already unsatisfiable. No part of the solver state may be used! vec clauses; // List of problem clauses. vec learnts; // List of learnt clauses. double cla_inc; // Amount to bump next clause with. vec activity; // A heuristic measurement of the activity of a variable. vec original_activity; // A heuristic measurement of the activity of a variable. double var_inc; // Amount to bump next variable with. vec > watches; // 'watches[lit]' is a list of constraints watching 'lit' (will go there if literal becomes true). vec assigns; // The current assignments (lbool:s stored as char:s). vec polarity; // The preferred polarity of each variable. vec decision_var; // Declares if a variable is eligible for selection in the decision heuristic. vec trail; // Assignment stack; stores all assigments made in the order they were made. vec trail_lim; // Separator indices for different decision levels in 'trail'. vec reason; // 'reason[var]' is the clause that implied the variables current value, or 'NULL' if none. vec level; // 'level[var]' contains the level at which the assignment was made. int qhead; // Head of queue (as index into the trail -- no more explicit propagation queue in MiniSat). int simpDB_assigns; // Number of top-level assignments since last execution of 'simplify()'. int64_t simpDB_props; // Remaining number of propagations that must be made before next execution of 'simplify()'. vec assumptions; // Current set of assumptions provided to solve by the user. Heap order_heap; // A priority queue of variables ordered with respect to the variable activity. double random_seed; // Used by the random variable selection. double progress_estimate;// Set by 'search()'. bool remove_satisfied; // Indicates whether possibly inefficient linear scan for satisfied clauses should be performed in 'simplify'. // Temporaries (to reduce allocation overhead). Each variable is prefixed by the method in which it is // used, exept 'seen' wich is used in several places. // vec seen; vec analyze_stack; vec analyze_toclear; vec add_tmp; // Main internal methods: // void insertVarOrder (Var x); // Insert a variable in the decision order priority queue. Lit pickBranchLit (int polarity_mode, double random_var_freq); // Return the next decision variable. void newDecisionLevel (); // Begins a new decision level. void uncheckedEnqueue (Lit p, Clause* from = NULL); // Enqueue a literal. Assumes value of literal is undefined. bool enqueue (Lit p, Clause* from = NULL); // Test if fact 'p' contradicts current state, enqueue otherwise. Clause* propagate (); // Perform unit propagation. Returns possibly conflicting clause. void cancelUntil (int level); // Backtrack until a certain level. void analyze (Clause* confl, vec& out_learnt, int& out_btlevel); // (bt = backtrack) void analyzeFinal (Lit p, vec& out_conflict); // COULD THIS BE IMPLEMENTED BY THE ORDINARIY "analyze" BY SOME REASONABLE GENERALIZATION? bool litRedundant (Lit p, uint32_t abstract_levels); // (helper method for 'analyze()') lbool search (int nof_conflicts, int nof_learnts); // Search for a given number of conflicts. void reduceDB (); // Reduce the set of learnt clauses. void removeSatisfied (vec& cs); // Shrink 'cs' to contain only non-satisfied clauses. // Maintaining Variable/Clause activity: // void varDecayActivity (); // Decay all variables with the specified factor. Implemented by increasing the 'bump' value instead. void varBumpActivity (Var v); // Increase a variable with the current 'bump' value. void claDecayActivity (); // Decay all clauses with the specified factor. Implemented by increasing the 'bump' value instead. void claBumpActivity (Clause& c); // Increase a clause with the current 'bump' value. // Operations on clauses: // void attachClause (Clause& c); // Attach a clause to watcher lists. void detachClause (Clause& c); // Detach a clause to watcher lists. void removeClause (Clause& c); // Detach and free a clause. bool locked (const Clause& c) const; // Returns TRUE if a clause is a reason for some implication in the current state. bool satisfied (const Clause& c) const; // Returns TRUE if a clause is satisfied in the current state. // Misc: // int decisionLevel () const; // Gives the current decisionlevel. uint32_t abstractLevel (Var x) const; // Used to represent an abstraction of sets of decision levels. double progressEstimate () const; // DELETE THIS ?? IT'S NOT VERY USEFUL ... unsigned minDecisionLevel; // Debug: void printLit (Lit l); template void printClause (const C& c); public: void printTrail() { int j = 0; for (int i = 0; i < trail.size(); i++) { if (j < trail_lim.size() && i == trail_lim[j]) { printf("|\n"); j++; printLit(trail[i]); printf(" (%g) ", activity[var(trail[i])]); continue; } if (activity[var(trail[i])] > 0) { char c1 = sign(trail[i]) ? '-' : '+'; char c2 = polarity[var(trail[i])] == 0 ? '-' : '+'; if (c1 != c2) { printLit(trail[i]); printf(" (%g)", activity[var(trail[i])]); printf("_*. "); } } } printf("\n\n"); } std::map _literal_count; void checkPure() { std::map::const_iterator i; for (i = _literal_count.begin(); i != _literal_count.end(); i++) if (_literal_count.find(~(i->first)) == _literal_count.end() && value(i->first) == l_Undef) { printf("Pure literal:"); printLit(i->first); printf("\n"); exit(1); } } void printStats() { printf("restarts : .%lld.\n", starts); printf("conflicts : .%-12lld. \n", conflicts); printf("decisions : .%-12lld. (%4.2f %% random) \n", decisions, (float)rnd_decisions*100 / (float)decisions); printf("propagations : .%-12lld. \n", propagations); printf("conflict literals : .%-12lld. (%4.2f %% deleted)\n", tot_literals, (max_literals - tot_literals)*100 / (double)max_literals); } protected: void verifyModel (); void checkLiteralCount(); // Static helpers: // // Returns a random float 0 <= x < 1. Seed must never be 0. static inline double drand(double& seed) { seed *= 1389796; int q = (int)(seed / 2147483647); seed -= (double)q * 2147483647; return seed / 2147483647; } // Returns a random integer 0 <= x < size. Seed must never be 0. static inline int irand(double& seed, int size) { return (int)(drand(seed) * size); } }; //================================================================================================= // Implementation of inline methods: inline void Solver::insertVarOrder(Var x) { if (!order_heap.inHeap(x) && decision_var[x]) order_heap.insert(x); } inline void Solver::varDecayActivity() { var_inc *= var_decay; } inline void Solver::varBumpActivity(Var v) { if ( (activity[v] += var_inc) > 1e100 ) { // Rescale: for (int i = 0; i < nVars(); i++) activity[i] *= 1e-100; var_inc *= 1e-100; } // Update order_heap with respect to new activity: if (order_heap.inHeap(v)) order_heap.decrease(v); } inline void Solver::claDecayActivity() { cla_inc *= clause_decay; } inline void Solver::claBumpActivity (Clause& c) { if ( (c.activity() += cla_inc) > 1e20 ) { // Rescale: for (int i = 0; i < learnts.size(); i++) learnts[i]->activity() *= 1e-20; cla_inc *= 1e-20; } } inline bool Solver::enqueue (Lit p, Clause* from) { return value(p) != l_Undef ? value(p) != l_False : (uncheckedEnqueue(p, from), true); } inline bool Solver::locked (const Clause& c) const { return reason[var(c[0])] == &c && value(c[0]) == l_True; } inline void Solver::newDecisionLevel() { trail_lim.push(trail.size()); } inline int Solver::decisionLevel () const { return trail_lim.size(); } inline uint32_t Solver::abstractLevel (Var x) const { return 1 << (level[x] & 31); } inline lbool Solver::value (Var x) const { return toLbool(assigns[x]); } inline lbool Solver::value (Lit p) const { return toLbool(assigns[var(p)]) ^ sign(p); } inline lbool Solver::modelValue (Lit p) const { return model[var(p)] ^ sign(p); } inline int Solver::nAssigns () const { return trail.size(); } inline int Solver::nClauses () const { return clauses.size(); } inline int Solver::nLearnts () const { return learnts.size(); } inline int Solver::nVars () const { return assigns.size(); } inline void Solver::setPolarity (Var v, bool b) { polarity [v] = (char)b; } inline void Solver::setDecisionVar(Var v, bool b) { decision_var[v] = (char)b; if (b) { insertVarOrder(v); } } inline void Solver::setActivity (Var v, double a) { activity[v] = a; original_activity[v] = a; if (order_heap.inHeap(v)) order_heap.decrease(v);} inline lbool Solver::solve () { vec tmp; return solve(tmp); } inline bool Solver::okay () const { return ok; } //================================================================================================= // Debug + etc: #define reportf(format, args...) ( fflush(stdout), fprintf(stdout, format, ## args), fflush(stderr) ) static inline void logLit(FILE* f, Lit l) { fprintf(f, "%sx%d", sign(l) ? "~" : "", var(l)+1); } static inline void logLits(FILE* f, const vec& ls) { fprintf(f, "[ "); if (ls.size() > 0){ logLit(f, ls[0]); for (int i = 1; i < ls.size(); i++){ fprintf(f, ", "); logLit(f, ls[i]); } } fprintf(f, "] "); } static inline const char* showBool(bool b) { return b ? "true" : "false"; } // Just like 'assert()' but expression will be evaluated in the release version as well. static inline void check(bool expr) { } inline void Solver::printLit(Lit l) { // printf("%s%d:%c", sign(l) ? "-" : "", var(l)+1, value(l) == l_True ? '1' : (value(l) == l_False ? '0' : 'X')); printf("%s%d", sign(l) ? "-" : "+", var(l)); } template inline void Solver::printClause(const C& c) { int size = c.size(); for (int i = 0; i < size; i++){ printLit(c[i]); printf(" "); } } //================================================================================================= #endif link-grammar-4.7.4/link-grammar/minisat/BasicHeap.h0000644000175000017500000000671411052427621021136 0ustar bloombloom/******************************************************************************************[Heap.h] MiniSat -- Copyright (c) 2003-2006, Niklas Een, Niklas Sorensson Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. **************************************************************************************************/ #ifndef BasicHeap_h #define BasicHeap_h #include "Vec.h" //================================================================================================= // A heap implementation with support for decrease/increase key. template class BasicHeap { Comp lt; vec heap; // heap of ints // Index "traversal" functions static inline int left (int i) { return i*2+1; } static inline int right (int i) { return (i+1)*2; } static inline int parent(int i) { return (i-1) >> 1; } inline void percolateUp(int i) { int x = heap[i]; while (i != 0 && lt(x, heap[parent(i)])){ heap[i] = heap[parent(i)]; i = parent(i); } heap [i] = x; } inline void percolateDown(int i) { int x = heap[i]; while (left(i) < heap.size()){ int child = right(i) < heap.size() && lt(heap[right(i)], heap[left(i)]) ? right(i) : left(i); if (!lt(heap[child], x)) break; heap[i] = heap[child]; i = child; } heap[i] = x; } bool heapProperty(int i) { return i >= heap.size() || ((i == 0 || !lt(heap[i], heap[parent(i)])) && heapProperty(left(i)) && heapProperty(right(i))); } public: BasicHeap(const C& c) : comp(c) { } int size () const { return heap.size(); } bool empty () const { return heap.size() == 0; } int operator[](int index) const { return heap[index+1]; } void clear (bool dealloc = false) { heap.clear(dealloc); } void insert (int n) { heap.push(n); percolateUp(heap.size()-1); } int removeMin() { int r = heap[0]; heap[0] = heap.last(); heap.pop(); if (heap.size() > 1) percolateDown(0); return r; } // DEBUG: consistency checking bool heapProperty() { return heapProperty(1); } // COMPAT: should be removed int getmin () { return removeMin(); } }; //================================================================================================= #endif link-grammar-4.7.4/link-grammar/minisat/Alg.h0000644000175000017500000000374011052427621020016 0ustar bloombloom/*******************************************************************************************[Alg.h] MiniSat -- Copyright (c) 2003-2006, Niklas Een, Niklas Sorensson Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. **************************************************************************************************/ #ifndef Alg_h #define Alg_h //================================================================================================= // Useful functions on vectors #if 1 template static inline void remove(V& ts, const T& t) { int j = 0; for (; j < ts.size() && ts[j] != t; j++); for (; j < ts.size()-1; j++) ts[j] = ts[j+1]; ts.pop(); } #else template static inline void remove(V& ts, const T& t) { int j = 0; for (; j < ts.size() && ts[j] != t; j++); ts[j] = ts.last(); ts.pop(); } #endif template static inline bool find(V& ts, const T& t) { int j = 0; for (; j < ts.size() && ts[j] != t; j++); return j < ts.size(); } #endif link-grammar-4.7.4/link-grammar/minisat/Solver.C0000644000175000017500000006607011526022265020526 0ustar bloombloom/****************************************************************************************[Solver.C] MiniSat -- Copyright (c) 2003-2006, Niklas Een, Niklas Sorensson Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. **************************************************************************************************/ #include "Solver.h" #include "Sort.h" #include #include // #define _MINISAT_DEFAULT_VSS // #define __PRINT //================================================================================================= // Constructor/Destructor: Solver::Solver() : // Parameters: (formerly in 'SearchParams') var_decay(1 / 0.95), clause_decay(1 / 0.999), random_var_freq(0.02) , restart_first(100), restart_inc(1.5), learntsize_factor((double)1/(double)3), learntsize_inc(1.1) // More parameters: // , expensive_ccmin (true) , polarity_mode (polarity_false) , verbosity (0) // Statistics: (formerly in 'SolverStats') // , starts(0), decisions(0), rnd_decisions(0), propagations(0), conflicts(0) , clauses_literals(0), learnts_literals(0), max_literals(0), tot_literals(0) , ok (true) , cla_inc (1) , var_inc (1) , qhead (0) , simpDB_assigns (-1) , simpDB_props (0) , order_heap (VarOrderLt(activity)) , random_seed (91648253) , progress_estimate(0) , remove_satisfied (true) , minDecisionLevel ((unsigned)(-1)) {} Solver::~Solver() { for (int i = 0; i < learnts.size(); i++) free(learnts[i]); for (int i = 0; i < clauses.size(); i++) free(clauses[i]); } //================================================================================================= // Minor methods: // Creates a new SAT variable in the solver. If 'decision_var' is cleared, variable will not be // used as a decision variable (NOTE! This has effects on the meaning of a SATISFIABLE result). // Var Solver::newVar(bool sign, double act, bool dvar) { int v = nVars(); watches .push(); // (list for positive literal) watches .push(); // (list for negative literal) reason .push(NULL); assigns .push(toInt(l_Undef)); level .push(-1); activity .push(act); original_activity .push(act); seen .push(0); polarity .push((char)sign); decision_var.push((char)dvar); insertVarOrder(v); return v; } bool Solver::addClause(vec& ps) { #ifdef __PRINT for (int i = 0; i < ps.size(); i++) { if (_literal_count.find(ps[i]) == _literal_count.end()) _literal_count[ps[i]] = 1; else _literal_count[ps[i]]++; } #endif if (!ok) return false; // Check if clause is satisfied and remove false/duplicate literals: // Special attention is put on single and double literal clauses if (ps.size() == 1 || (ps.size() == 2 && ps[0] == ps[1])) { // Unary or Binary with a duplicate literal if (value(ps[0]) == l_True) { #ifdef __PRINT printf("---satisfied---\n"); #endif return true; } else if (value(ps[0]) == l_False) { #ifdef __PRINT printf("Clause empty after simplification\n"); #endif return ok = false; } else { uncheckedEnqueue(ps[0]); return ok = (propagate() == NULL); } } else if (ps.size() == 2) { // Real Binary clauses if (value(ps[0]) == l_True || value(ps[1]) == l_True || ps[0] == ~ps[1]) { #ifdef __PRINT printf("---satisfied---\n"); #endif return true; } else if (value(ps[0]) == l_False) { if (value(ps[1]) == l_False) { #ifdef __PRINT printf("Clause empty after simplification\n"); #endif return ok = false; } else { uncheckedEnqueue(ps[1]); return ok = (propagate() == NULL); } } else { if (value(ps[1]) == l_False) { uncheckedEnqueue(ps[0]); return ok = (propagate() == NULL); } else { Clause* c = Clause_new(ps, false); clauses.push(c); attachClause(*c); } } } else { sort(ps); Lit p; int i, j; for (i = j = 0, p = lit_Undef; i < ps.size(); i++) if (value(ps[i]) == l_True || ps[i] == ~p) { #ifdef __PRINT printf("---satisfied---\n"); #endif return true; } else if (value(ps[i]) != l_False && ps[i] != p) ps[j++] = p = ps[i]; ps.shrink(i - j); if (ps.size() == 0) { #ifdef __PRINT printf("Clause empty after simplification\n"); #endif return ok = false; } else if (ps.size() == 1){ uncheckedEnqueue(ps[0]); return ok = (propagate() == NULL); }else{ Clause* c = Clause_new(ps, false); clauses.push(c); attachClause(*c); #ifdef __PRINT // printf("Simplified: "); // printClause(*c); // printf("\n"); #endif } } return true; } void Solver::addConflictingClause(vec& lits) { if (lits.size() == 1) { if (value(lits[0]) == l_True) return; if (value(lits[0]) == l_False) { if (level[var(lits[0])] == 0) { ok = false; return; } cancelUntil(level[var(lits[0])] - 1); } uncheckedEnqueue(~lits[0]); } else { vec learnt_clause; int backtrack_level; for (int i = 1; i < lits.size(); i++) { if (value(lits[0]) == l_False) { if (value(lits[i]) != l_False){ Lit tmp = lits[0]; lits[0] = lits[i]; lits[i] = tmp; } } else if (value(lits[1]) == l_False) { if (value(lits[i]) != l_False){ Lit tmp = lits[1]; lits[1] = lits[i]; lits[i] = tmp; break; } } } if (value(lits[0]) == l_False) { for (int i = 1; i < lits.size(); i++) { if (level[var(lits[i])] > level[var(lits[0])]) { Lit tmp = lits[0]; lits[0] = lits[i]; lits[i] = tmp; } } } if (value(lits[1]) == l_False) { for (int i = 2; i < lits.size(); i++) { if (level[var(lits[i])] > level[var(lits[1])]) { Lit tmp = lits[1]; lits[1] = lits[i]; lits[i] = tmp; } } } Clause* confl = Clause_new(lits, true); clauses.push(confl); attachClause(*confl); if (value(lits[0]) != l_False) { if (value(lits[1]) == l_False) { uncheckedEnqueue(lits[0], confl); } return; } int maxLevel = level[var(lits[0])]; cancelUntil(maxLevel); if (maxLevel == 0) { ok = false; return; } learnt_clause.clear(); analyze(confl, learnt_clause, backtrack_level); cancelUntil(backtrack_level); if (learnt_clause.size() == 1){ uncheckedEnqueue(learnt_clause[0]); }else{ Clause* c = Clause_new(learnt_clause, true); learnts.push(c); attachClause(*c); claBumpActivity(*c); uncheckedEnqueue(learnt_clause[0], c); } #ifdef _MINISAT_DEFAULT_VSS varDecayActivity(); #endif claDecayActivity(); } } void Solver::attachClause(Clause& c) { watches[toInt(~c[0])].push(&c); watches[toInt(~c[1])].push(&c); if (c.learnt()) learnts_literals += c.size(); else clauses_literals += c.size(); } void Solver::detachClause(Clause& c) { remove(watches[toInt(~c[0])], &c); remove(watches[toInt(~c[1])], &c); if (c.learnt()) learnts_literals -= c.size(); else clauses_literals -= c.size(); } void Solver::removeClause(Clause& c) { detachClause(c); free(&c); } bool Solver::satisfied(const Clause& c) const { for (int i = 0; i < c.size(); i++) if (value(c[i]) == l_True) return true; return false; } // Revert to the state at given level (keeping all assignment at 'level' but not beyond). // void Solver::cancelUntil(int level) { if (decisionLevel() > level){ for (int c = trail.size()-1; c >= trail_lim[level]; c--){ Var x = var(trail[c]); assigns[x] = toInt(l_Undef); insertVarOrder(x); } qhead = trail_lim[level]; trail.shrink(trail.size() - trail_lim[level]); trail_lim.shrink(trail_lim.size() - level); } } //================================================================================================= // Major methods: Lit Solver::pickBranchLit(int polarity_mode, double random_var_freq) { Var next = var_Undef; // Random decision: /* if (drand(random_seed) < random_var_freq && !order_heap.empty()){ next = order_heap[irand(random_seed,order_heap.size())]; if (toLbool(assigns[next]) == l_Undef && decision_var[next]) rnd_decisions++; } */ // Activity based decision: while (next == var_Undef || toLbool(assigns[next]) != l_Undef || !decision_var[next]) { if (order_heap.empty()){ next = var_Undef; break; }else next = order_heap.removeMin(); } if (next == var_Undef) return lit_Undef; bool sign = false; switch (polarity_mode){ case polarity_true: sign = false; break; case polarity_false: sign = true; break; case polarity_user: sign = polarity[next]; break; case polarity_rnd: sign = irand(random_seed, 2); break; } sign = !polarity[next]; // do { // int var; // std::cin >> var; // sign = !(var > 0); // next = Var(abs(var) - 1); // } while(toLbool(assigns[next]) != l_Undef); // std::cout << "var: " << var << " sign: " << sign << std::endl; return next == var_Undef ? lit_Undef : Lit(next, sign); } /*_________________________________________________________________________________________________ | | analyze : (confl : Clause*) (out_learnt : vec&) (out_btlevel : int&) -> [void] | | Description: | Analyze conflict and produce a reason clause. | | Pre-conditions: | * 'out_learnt' is assumed to be cleared. | * Current decision level must be greater than root level. | | Post-conditions: | * 'out_learnt[0]' is the asserting literal at level 'out_btlevel'. | | Effect: | Will undo part of the trail, upto but not beyond the assumption of the current decision level. |________________________________________________________________________________________________@*/ void Solver::analyze(Clause* confl, vec& out_learnt, int& out_btlevel) { int pathC = 0; Lit p = lit_Undef; // Generate conflict clause: // out_learnt.push(); // (leave room for the asserting literal) int index = trail.size() - 1; out_btlevel = 0; do{ Clause& c = *confl; #ifdef __PRINT printf("Explain: "); printClause(c); printf("\n"); #endif if (c.learnt()) claBumpActivity(c); for (int j = (p == lit_Undef) ? 0 : 1; j < c.size(); j++){ Lit q = c[j]; if (!seen[var(q)] && level[var(q)] > 0){ #ifdef _MINISAT_DEFAULT_VSS varBumpActivity(var(q)); #endif seen[var(q)] = 1; if (level[var(q)] >= decisionLevel()) { pathC++; }else{ out_learnt.push(q); if (level[var(q)] > out_btlevel) out_btlevel = level[var(q)]; } } } // Select next clause to look at: while (!seen[var(trail[index--])]); p = trail[index+1]; confl = reason[var(p)]; seen[var(p)] = 0; pathC--; } while (pathC > 0); out_learnt[0] = ~p; // Simplify conflict clause: // int i, j; if (expensive_ccmin){ uint32_t abstract_level = 0; for (i = 1; i < out_learnt.size(); i++) abstract_level |= abstractLevel(var(out_learnt[i])); // (maintain an abstraction of levels involved in conflict) out_learnt.copyTo(analyze_toclear); for (i = j = 1; i < out_learnt.size(); i++) if (reason[var(out_learnt[i])] == NULL || !litRedundant(out_learnt[i], abstract_level)) out_learnt[j++] = out_learnt[i]; }else{ out_learnt.copyTo(analyze_toclear); for (i = j = 1; i < out_learnt.size(); i++){ Clause& c = *reason[var(out_learnt[i])]; for (int k = 1; k < c.size(); k++) if (!seen[var(c[k])] && level[var(c[k])] > 0){ out_learnt[j++] = out_learnt[i]; break; } } } max_literals += out_learnt.size(); out_learnt.shrink(i - j); tot_literals += out_learnt.size(); // Find correct backtrack level: // if (out_learnt.size() == 1) out_btlevel = 0; else{ int max_i = 1; for (int i = 2; i < out_learnt.size(); i++) if (level[var(out_learnt[i])] > level[var(out_learnt[max_i])]) max_i = i; Lit p = out_learnt[max_i]; out_learnt[max_i] = out_learnt[1]; out_learnt[1] = p; out_btlevel = level[var(p)]; } #ifdef __PRINT printf("Learnt: "); for (int i = 0; i < out_learnt.size(); i++) { printf("%s%d ", sign(out_learnt[i]) ? "-" : "", var(out_learnt[i])); if (value(out_learnt[i]) != l_False) exit(1); } printf("\n"); #endif for (int j = 0; j < analyze_toclear.size(); j++) seen[var(analyze_toclear[j])] = 0; // ('seen[]' is now cleared) } // Check if 'p' can be removed. 'abstract_levels' is used to abort early if the algorithm is // visiting literals at levels that cannot be removed later. bool Solver::litRedundant(Lit p, uint32_t abstract_levels) { analyze_stack.clear(); analyze_stack.push(p); int top = analyze_toclear.size(); while (analyze_stack.size() > 0){ Clause& c = *reason[var(analyze_stack.last())]; analyze_stack.pop(); for (int i = 1; i < c.size(); i++){ Lit p = c[i]; if (!seen[var(p)] && level[var(p)] > 0){ if (reason[var(p)] != NULL && (abstractLevel(var(p)) & abstract_levels) != 0){ seen[var(p)] = 1; analyze_stack.push(p); analyze_toclear.push(p); }else{ for (int j = top; j < analyze_toclear.size(); j++) seen[var(analyze_toclear[j])] = 0; analyze_toclear.shrink(analyze_toclear.size() - top); return false; } } } } return true; } /*_________________________________________________________________________________________________ | | analyzeFinal : (p : Lit) -> [void] | | Description: | Specialized analysis procedure to express the final conflict in terms of assumptions. | Calculates the (possibly empty) set of assumptions that led to the assignment of 'p', and | stores the result in 'out_conflict'. |________________________________________________________________________________________________@*/ void Solver::analyzeFinal(Lit p, vec& out_conflict) { out_conflict.clear(); out_conflict.push(p); if (decisionLevel() == 0) return; seen[var(p)] = 1; for (int i = trail.size()-1; i >= trail_lim[0]; i--){ Var x = var(trail[i]); if (seen[x]){ if (reason[x] == NULL){ out_conflict.push(~trail[i]); }else{ Clause& c = *reason[x]; for (int j = 1; j < c.size(); j++) if (level[var(c[j])] > 0) seen[var(c[j])] = 1; } seen[x] = 0; } } seen[var(p)] = 0; } void Solver::uncheckedEnqueue(Lit p, Clause* from) { #ifdef __PRINT if (from) { printClause(*from); } printf("--> "); printLit(p); printf("\n"); if (decisionLevel() == 0) { printf("Zl: "); printLit(p); printf("\n"); } #endif assigns [var(p)] = toInt(lbool(!sign(p))); // <<== abstract but not uttermost effecient level [var(p)] = decisionLevel(); reason [var(p)] = from; trail.push(p); } /*_________________________________________________________________________________________________ | | propagate : [void] -> [Clause*] | | Description: | Propagates all enqueued facts. If a conflict arises, the conflicting clause is returned, | otherwise NULL. | | Post-conditions: | * the propagation queue is empty, even if there was a conflict. |________________________________________________________________________________________________@*/ Clause* Solver::propagate() { Clause* confl = NULL; int num_props = 0; while (qhead < trail.size()){ Lit p = trail[qhead++]; // 'p' is enqueued fact to propagate. vec& ws = watches[toInt(p)]; Clause **i, **j, **end; num_props++; for (i = j = (Clause**)ws, end = i + ws.size(); i != end;){ Clause& c = **i++; // Make sure the false literal is data[1]: Lit false_lit = ~p; if (c[0] == false_lit) c[0] = c[1], c[1] = false_lit; // If 0th watch is true, then clause is already satisfied. Lit first = c[0]; if (value(first) == l_True){ *j++ = &c; }else{ // Look for new watch: for (int k = 2; k < c.size(); k++) if (value(c[k]) != l_False){ c[1] = c[k]; c[k] = false_lit; watches[toInt(~c[1])].push(&c); goto FoundWatch; } // Did not find watch -- clause is unit under assignment: *j++ = &c; if (value(first) == l_False){ confl = &c; #ifdef __PRINT printf("Conflict: "); printClause(*confl); printf("\n"); /* vec learnt_clause; int backtrack_level; analyze(confl, learnt_clause, backtrack_level); */ #endif qhead = trail.size(); // Copy the remaining watches: while (i < end) *j++ = *i++; }else uncheckedEnqueue(first, &c); } FoundWatch:; } ws.shrink(i - j); } propagations += num_props; simpDB_props -= num_props; return confl; } /*_________________________________________________________________________________________________ | | reduceDB : () -> [void] | | Description: | Remove half of the learnt clauses, minus the clauses locked by the current assignment. Locked | clauses are clauses that are reason to some assignment. Binary clauses are never removed. |________________________________________________________________________________________________@*/ struct reduceDB_lt { bool operator () (Clause* x, Clause* y) { return x->size() > 2 && (y->size() == 2 || x->activity() < y->activity()); } }; void Solver::reduceDB() { int i, j; double extra_lim = cla_inc / learnts.size(); // Remove any clause below this activity sort(learnts, reduceDB_lt()); for (i = j = 0; i < learnts.size() / 2; i++){ if (learnts[i]->size() > 2 && !locked(*learnts[i])) removeClause(*learnts[i]); else learnts[j++] = learnts[i]; } for (; i < learnts.size(); i++){ if (learnts[i]->size() > 2 && !locked(*learnts[i]) && learnts[i]->activity() < extra_lim) removeClause(*learnts[i]); else learnts[j++] = learnts[i]; } learnts.shrink(i - j); } void Solver::removeSatisfied(vec& cs) { int i,j; for (i = j = 0; i < cs.size(); i++){ if (satisfied(*cs[i])) removeClause(*cs[i]); else cs[j++] = cs[i]; } cs.shrink(i - j); } /*_________________________________________________________________________________________________ | | simplify : [void] -> [bool] | | Description: | Simplify the clause database according to the current top-level assigment. Currently, the only | thing done here is the removal of satisfied clauses, but more things can be put here. |________________________________________________________________________________________________@*/ bool Solver::simplify() { if (!ok || propagate() != NULL) { return ok = false; } if (nAssigns() == simpDB_assigns || (simpDB_props > 0)) return true; // Remove satisfied clauses: removeSatisfied(learnts); if (remove_satisfied) // Can be turned off. removeSatisfied(clauses); // Remove fixed variables from the variable heap: order_heap.filter(VarFilter(*this)); simpDB_assigns = nAssigns(); simpDB_props = clauses_literals + learnts_literals; // (shouldn't depend on stats really, but it will do for now) return true; } /*_________________________________________________________________________________________________ | | search : (nof_conflicts : int) (nof_learnts : int) (params : const SearchParams&) -> [lbool] | | Description: | Search for a model the specified number of conflicts, keeping the number of learnt clauses | below the provided limit. NOTE! Use negative value for 'nof_conflicts' or 'nof_learnts' to | indicate infinity. | | Output: | 'l_True' if a partial assigment that is consistent with respect to the clauseset is found. If | all variables are decision variables, this means that the clause set is satisfiable. 'l_False' | if the clause set is unsatisfiable. 'l_Undef' if the bound on number of conflicts is reached. |________________________________________________________________________________________________@*/ lbool Solver::search(int nof_conflicts, int nof_learnts) { int backtrack_level; int conflictC = 0; vec learnt_clause; starts++; bool first = true; for (;;){ Clause* confl = propagate(); if (confl != NULL){ // CONFLICT conflicts++; conflictC++; if (decisionLevel() == 0) return l_False; first = false; learnt_clause.clear(); analyze(confl, learnt_clause, backtrack_level); cancelUntil(backtrack_level); #ifdef __PRINT char c1 = sign(learnt_clause[0]) ? '-' : '+'; char c2 = polarity[var(learnt_clause[0])] == 0 ? '-' : '+'; if (decisionLevel() < minDecisionLevel && original_activity[var(learnt_clause[0])] > 0) { printf("Conflict record: "); printLit(learnt_clause[0]); printf(" .%d.\t.%d. %c .%c .%g\n", decisionLevel(), trail.size(), c1, c2, original_activity[var(learnt_clause[0])]); if (decisionLevel() == 0) { minDecisionLevel = (unsigned)(-1); } else { minDecisionLevel = decisionLevel(); } } #endif if (learnt_clause.size() == 1){ uncheckedEnqueue(learnt_clause[0]); }else{ Clause* c = Clause_new(learnt_clause, true); learnts.push(c); attachClause(*c); claBumpActivity(*c); uncheckedEnqueue(learnt_clause[0], c); } #ifdef _MINISAT_DEFAULT_VSS varDecayActivity(); #endif claDecayActivity(); }else{ // NO CONFLICT if (nof_conflicts >= 0 && conflictC >= nof_conflicts){ // Reached bound on number of conflicts: progress_estimate = progressEstimate(); // cancelUntil(0); return l_Undef; } // Simplify the set of problem clauses: if (decisionLevel() == 0 && !simplify()) return l_False; if (nof_learnts >= 0 && learnts.size()-nAssigns() >= nof_learnts) // Reduce the set of learnt clauses: reduceDB(); Lit next = lit_Undef; while (decisionLevel() < assumptions.size()){ // Perform user provided assumption: Lit p = assumptions[decisionLevel()]; if (value(p) == l_True){ // Dummy decision level: newDecisionLevel(); }else if (value(p) == l_False){ analyzeFinal(~p, conflict); return l_False; }else{ next = p; break; } } if (next == lit_Undef){ // New variable decision: decisions++; next = pickBranchLit(polarity_mode, random_var_freq); if (next == lit_Undef) // Model found: return l_True; #ifdef __PRINT printf("Decision: "); printLit(next); printf("\t.%f.\t.%d.\t.%d.", activity[var(next)], decisionLevel(), trail.size()); printf("\n"); #endif } // Increase decision level and enqueue 'next' newDecisionLevel(); uncheckedEnqueue(next); } //#ifdef __PRINT // printTrail(); //#endif } } double Solver::progressEstimate() const { double progress = 0; double F = 1.0 / nVars(); for (int i = 0; i <= decisionLevel(); i++){ int beg = i == 0 ? 0 : trail_lim[i - 1]; int end = i == decisionLevel() ? trail.size() : trail_lim[i]; progress += pow(F, i) * (end - beg); } return progress / nVars(); } lbool Solver::solve(const vec& assumps) { model.clear(); conflict.clear(); if (!ok) { return false; } assumps.copyTo(assumptions); double nof_conflicts = restart_first; double nof_learnts = nClauses() * learntsize_factor; lbool status = l_Undef; if (verbosity >= 1){ reportf("============================[ Search Statistics ]==============================\n"); reportf("| Conflicts | ORIGINAL | LEARNT | Progress |\n"); reportf("| | Vars Clauses Literals | Limit Clauses Lit/Cl | |\n"); reportf("===============================================================================\n"); } // Search: while (status == l_Undef){ if (verbosity >= 1) reportf("| .%9d. | .%7d. .%8d. .%8d. | .%8d. .%8d. .%6.0f. | .%6.3f. %% |\n", (int)conflicts, order_heap.size(), nClauses(), (int)clauses_literals, (int)nof_learnts, nLearnts(), (double)learnts_literals/nLearnts(), progress_estimate*100), fflush(stdout); status = search((int)nof_conflicts, (int)nof_learnts); nof_conflicts *= restart_inc; nof_learnts *= learntsize_inc; } if (verbosity >= 1) reportf("===============================================================================\n"); if (status == l_True){ // Extend & copy model: model.growTo(nVars()); for (int i = 0; i < nVars(); i++) model[i] = value(i); // printTrail(); #ifdef _DEBUG verifyModel(); #endif }else{ if (conflict.size() == 0) { ok = false; } } // cancelUntil(0); return status; } //================================================================================================= // Debug methods: void Solver::verifyModel() { bool failed = false; for (int i = 0; i < clauses.size(); i++){ Clause& c = *clauses[i]; for (int j = 0; j < c.size(); j++) if (modelValue(c[j]) == l_True) goto next; reportf("unsatisfied clause: "); printClause(*clauses[i]); reportf("\n"); failed = true; next:; } // reportf("Verified %d original clauses.\n", clauses.size()); } void Solver::checkLiteralCount() { // Check that sizes are calculated correctly: int cnt = 0; for (int i = 0; i < clauses.size(); i++) if (clauses[i]->mark() == 0) cnt += clauses[i]->size(); if ((int)clauses_literals != cnt){ fprintf(stderr, "literal count: %d, real value = %d\n", (int)clauses_literals, cnt); } } link-grammar-4.7.4/link-grammar/minisat/Sort.h0000644000175000017500000000620511052427621020241 0ustar bloombloom/******************************************************************************************[Sort.h] MiniSat -- Copyright (c) 2003-2006, Niklas Een, Niklas Sorensson Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. **************************************************************************************************/ #ifndef Sort_h #define Sort_h #include "Vec.h" //================================================================================================= // Some sorting algorithms for vec's template struct LessThan_default { bool operator () (T x, T y) { return x < y; } }; template void selectionSort(T* array, int size, LessThan lt) { int i, j, best_i; T tmp; for (i = 0; i < size-1; i++){ best_i = i; for (j = i+1; j < size; j++){ if (lt(array[j], array[best_i])) best_i = j; } tmp = array[i]; array[i] = array[best_i]; array[best_i] = tmp; } } template static inline void selectionSort(T* array, int size) { selectionSort(array, size, LessThan_default()); } template void sort(T* array, int size, LessThan lt) { if (size <= 15) selectionSort(array, size, lt); else{ T pivot = array[size / 2]; T tmp; int i = -1; int j = size; for(;;){ do i++; while(lt(array[i], pivot)); do j--; while(lt(pivot, array[j])); if (i >= j) break; tmp = array[i]; array[i] = array[j]; array[j] = tmp; } sort(array , i , lt); sort(&array[i], size-i, lt); } } template static inline void sort(T* array, int size) { sort(array, size, LessThan_default()); } //================================================================================================= // For 'vec's: template void sort(vec& v, LessThan lt) { sort((T*)v, v.size(), lt); } template void sort(vec& v) { sort(v, LessThan_default()); } //================================================================================================= #endif link-grammar-4.7.4/link-grammar/minisat/BoxedVec.h0000644000175000017500000001272711052427621021017 0ustar bloombloom/*******************************************************************************************[Vec.h] MiniSat -- Copyright (c) 2003-2006, Niklas Een, Niklas Sorensson Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. **************************************************************************************************/ #ifndef BoxedVec_h #define BoxedVec_h #include #include //================================================================================================= // Automatically resizable arrays // // NOTE! Don't use this vector on datatypes that cannot be re-located in memory (with realloc) template class bvec { static inline int imin(int x, int y) { int mask = (x-y) >> (sizeof(int)*8-1); return (x&mask) + (y&(~mask)); } static inline int imax(int x, int y) { int mask = (y-x) >> (sizeof(int)*8-1); return (x&mask) + (y&(~mask)); } struct Vec_t { int sz; int cap; T data[0]; static Vec_t* alloc(Vec_t* x, int size){ x = (Vec_t*)realloc((void*)x, sizeof(Vec_t) + sizeof(T)*size); x->cap = size; return x; } }; Vec_t* ref; static const int init_size = 2; static int nextSize (int current) { return (current * 3 + 1) >> 1; } static int fitSize (int needed) { int x; for (x = init_size; needed > x; x = nextSize(x)); return x; } void fill (int size) { assert(ref != NULL); for (T* i = ref->data; i < ref->data + size; i++) new (i) T(); } void fill (int size, const T& pad) { assert(ref != NULL); for (T* i = ref->data; i < ref->data + size; i++) new (i) T(pad); } // Don't allow copying (error prone): altvec& operator = (altvec& other) { assert(0); } altvec (altvec& other) { assert(0); } public: void clear (bool dealloc = false) { if (ref != NULL){ for (int i = 0; i < ref->sz; i++) (*ref).data[i].~T(); if (dealloc) { free(ref); ref = NULL; }else ref->sz = 0; } } // Constructors: altvec(void) : ref (NULL) { } altvec(int size) : ref (Vec_t::alloc(NULL, fitSize(size))) { fill(size); ref->sz = size; } altvec(int size, const T& pad) : ref (Vec_t::alloc(NULL, fitSize(size))) { fill(size, pad); ref->sz = size; } ~altvec(void) { clear(true); } // Ownership of underlying array: operator T* (void) { return ref->data; } // (unsafe but convenient) operator const T* (void) const { return ref->data; } // Size operations: int size (void) const { return ref != NULL ? ref->sz : 0; } void pop (void) { assert(ref != NULL && ref->sz > 0); int last = --ref->sz; ref->data[last].~T(); } void push (const T& elem) { int size = ref != NULL ? ref->sz : 0; int cap = ref != NULL ? ref->cap : 0; if (size == cap){ cap = cap != 0 ? nextSize(cap) : init_size; ref = Vec_t::alloc(ref, cap); } //new (&ref->data[size]) T(elem); ref->data[size] = elem; ref->sz = size+1; } void push () { int size = ref != NULL ? ref->sz : 0; int cap = ref != NULL ? ref->cap : 0; if (size == cap){ cap = cap != 0 ? nextSize(cap) : init_size; ref = Vec_t::alloc(ref, cap); } new (&ref->data[size]) T(); ref->sz = size+1; } void shrink (int nelems) { for (int i = 0; i < nelems; i++) pop(); } void shrink_(int nelems) { for (int i = 0; i < nelems; i++) pop(); } void growTo (int size) { while (this->size() < size) push(); } void growTo (int size, const T& pad) { while (this->size() < size) push(pad); } void capacity (int size) { growTo(size); } const T& last (void) const { return ref->data[ref->sz-1]; } T& last (void) { return ref->data[ref->sz-1]; } // Vector interface: const T& operator [] (int index) const { return ref->data[index]; } T& operator [] (int index) { return ref->data[index]; } void copyTo(altvec& copy) const { copy.clear(); for (int i = 0; i < size(); i++) copy.push(ref->data[i]); } void moveTo(altvec& dest) { dest.clear(true); dest.ref = ref; ref = NULL; } }; #endif link-grammar-4.7.4/link-grammar/minisat/SolverTypes.h0000644000175000017500000001650211052427621021612 0ustar bloombloom/***********************************************************************************[SolverTypes.h] MiniSat -- Copyright (c) 2003-2006, Niklas Een, Niklas Sorensson Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. **************************************************************************************************/ #ifndef SolverTypes_h #define SolverTypes_h #include //================================================================================================= // Variables, literals, lifted booleans, clauses: // NOTE! Variables are just integers. No abstraction here. They should be chosen from 0..N, // so that they can be used as array indices. typedef int Var; #define var_Undef (-1) class Lit { int x; public: Lit() : x(2*var_Undef) { } // (lit_Undef) explicit Lit(Var var, bool sign = false) : x((var+var) + (int)sign) { } // Don't use these for constructing/deconstructing literals. Use the normal constructors instead. friend int toInt (Lit p); // Guarantees small, positive integers suitable for array indexing. friend Lit toLit (int i); // Inverse of 'toInt()' friend Lit operator ~(Lit p); friend bool sign (Lit p); friend int var (Lit p); friend Lit unsign (Lit p); friend Lit id (Lit p, bool sgn); bool operator == (Lit p) const { return x == p.x; } bool operator != (Lit p) const { return x != p.x; } bool operator < (Lit p) const { return x < p.x; } // '<' guarantees that p, ~p are adjacent in the ordering. }; inline int toInt (Lit p) { return p.x; } inline Lit toLit (int i) { Lit p; p.x = i; return p; } inline Lit operator ~(Lit p) { Lit q; q.x = p.x ^ 1; return q; } inline bool sign (Lit p) { return p.x & 1; } inline int var (Lit p) { return p.x >> 1; } inline Lit unsign (Lit p) { Lit q; q.x = p.x & ~1; return q; } inline Lit id (Lit p, bool sgn) { Lit q; q.x = p.x ^ (int)sgn; return q; } const Lit lit_Undef(var_Undef, false); // }- Useful special constants. const Lit lit_Error(var_Undef, true ); // } //================================================================================================= // Lifted booleans: class lbool { char value; explicit lbool(int v) : value(v) { } public: lbool() : value(0) { } lbool(bool x) : value((int)x*2-1) { } int toInt(void) const { return value; } bool operator == (lbool b) const { return value == b.value; } bool operator != (lbool b) const { return value != b.value; } lbool operator ^ (bool b) const { return b ? lbool(-value) : lbool(value); } friend int toInt (lbool l); friend lbool toLbool(int v); }; inline int toInt (lbool l) { return l.toInt(); } inline lbool toLbool(int v) { return lbool(v); } const lbool l_True = toLbool( 1); const lbool l_False = toLbool(-1); const lbool l_Undef = toLbool( 0); //================================================================================================= // Clause -- a simple class for representing a clause: class Clause { uint32_t size_etc; union { float act; uint32_t abst; } extra; Lit data[0]; public: void calcAbstraction() { uint32_t abstraction = 0; for (int i = 0; i < size(); i++) abstraction |= 1 << (var(data[i]) & 31); extra.abst = abstraction; } // NOTE: This constructor cannot be used directly (doesn't allocate enough memory). template Clause(const V& ps, bool learnt) { size_etc = (ps.size() << 3) | (uint32_t)learnt; for (int i = 0; i < ps.size(); i++) data[i] = ps[i]; if (learnt) extra.act = 0; else calcAbstraction(); } // -- use this function instead: template friend Clause* Clause_new(const V& ps, bool learnt = false) { void* mem = malloc(sizeof(Clause) + sizeof(uint32_t)*(ps.size())); return new (mem) Clause(ps, learnt); } int size () const { return size_etc >> 3; } void shrink (int i) { size_etc = (((size_etc >> 3) - i) << 3) | (size_etc & 7); } void pop () { shrink(1); } bool learnt () const { return size_etc & 1; } uint32_t mark () const { return (size_etc >> 1) & 3; } void mark (uint32_t m) { size_etc = (size_etc & ~6) | ((m & 3) << 1); } const Lit& last () const { return data[size()-1]; } // NOTE: somewhat unsafe to change the clause in-place! Must manually call 'calcAbstraction' afterwards for // subsumption operations to behave correctly. Lit& operator [] (int i) { return data[i]; } Lit operator [] (int i) const { return data[i]; } operator const Lit* (void) const { return data; } float& activity () { return extra.act; } uint32_t abstraction () const { return extra.abst; } Lit subsumes (const Clause& other) const; void strengthen (Lit p); }; /*_________________________________________________________________________________________________ | | subsumes : (other : const Clause&) -> Lit | | Description: | Checks if clause subsumes 'other', and at the same time, if it can be used to simplify 'other' | by subsumption resolution. | | Result: | lit_Error - No subsumption or simplification | lit_Undef - Clause subsumes 'other' | p - The literal p can be deleted from 'other' |________________________________________________________________________________________________@*/ inline Lit Clause::subsumes(const Clause& other) const { if (other.size() < size() || (extra.abst & ~other.extra.abst) != 0) return lit_Error; Lit ret = lit_Undef; const Lit* c = (const Lit*)(*this); const Lit* d = (const Lit*)other; for (int i = 0; i < size(); i++) { // search for c[i] or ~c[i] for (int j = 0; j < other.size(); j++) if (c[i] == d[j]) goto ok; else if (ret == lit_Undef && c[i] == ~d[j]){ ret = c[i]; goto ok; } // did not find it return lit_Error; ok:; } return ret; } inline void Clause::strengthen(Lit p) { remove(*this, p); calcAbstraction(); } #endif link-grammar-4.7.4/link-grammar/minisat/Queue.h0000644000175000017500000000624511052427621020402 0ustar bloombloom/*****************************************************************************************[Queue.h] MiniSat -- Copyright (c) 2003-2006, Niklas Een, Niklas Sorensson Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. **************************************************************************************************/ #ifndef Queue_h #define Queue_h #include "Vec.h" //================================================================================================= template class Queue { vec elems; int first; public: Queue(void) : first(0) { } void insert(T x) { elems.push(x); } T peek () const { return elems[first]; } void pop () { first++; } void clear(bool dealloc = false) { elems.clear(dealloc); first = 0; } int size(void) { return elems.size() - first; } //bool has(T x) { for (int i = first; i < elems.size(); i++) if (elems[i] == x) return true; return false; } const T& operator [] (int index) const { return elems[first + index]; } }; //template //class Queue { // vec buf; // int first; // int end; // //public: // typedef T Key; // // Queue() : buf(1), first(0), end(0) {} // // void clear () { buf.shrinkTo(1); first = end = 0; } // int size () { return (end >= first) ? end - first : end - first + buf.size(); } // // T peek () { assert(first != end); return buf[first]; } // void pop () { assert(first != end); first++; if (first == buf.size()) first = 0; } // void insert(T elem) { // INVARIANT: buf[end] is always unused // buf[end++] = elem; // if (end == buf.size()) end = 0; // if (first == end){ // Resize: // vec tmp((buf.size()*3 + 1) >> 1); // //**/printf("queue alloc: %d elems (%.1f MB)\n", tmp.size(), tmp.size() * sizeof(T) / 1000000.0); // int i = 0; // for (int j = first; j < buf.size(); j++) tmp[i++] = buf[j]; // for (int j = 0 ; j < end ; j++) tmp[i++] = buf[j]; // first = 0; // end = buf.size(); // tmp.moveTo(buf); // } // } //}; //================================================================================================= #endif link-grammar-4.7.4/link-grammar/minisat/Makefile.am0000644000175000017500000000047611055307651021204 0ustar bloombloom VERSION=2.0.0 dnl Version info for libraries = CURRENT:REVISION:AGE MINISAT_VERSION_INFO=2:0:0 libminisat_la_LDFLAGS = -version-info $(MINISAT_VERSION_INFO) lib_LTLIBRARIES = libminisat.la libminisat_la_SOURCES = \ Solver.C Solver.h SolverTypes.h \ Alg.h BasicHeap.h BoxedVec.h Heap.h Map.h Queue.h Sort.h Vec.h link-grammar-4.7.4/link-grammar/minisat/Map.h0000644000175000017500000001054411052427621020030 0ustar bloombloom/*******************************************************************************************[Map.h] MiniSat -- Copyright (c) 2003-2006, Niklas Een, Niklas Sorensson Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. **************************************************************************************************/ #ifndef Map_h #define Map_h #include #include "Vec.h" //================================================================================================= // Default hash/equals functions // template struct Hash { uint32_t operator()(const K& k) const { return hash(k); } }; template struct Equal { bool operator()(const K& k1, const K& k2) const { return k1 == k2; } }; template struct DeepHash { uint32_t operator()(const K* k) const { return hash(*k); } }; template struct DeepEqual { bool operator()(const K* k1, const K* k2) const { return *k1 == *k2; } }; //================================================================================================= // Some primes // static const int nprimes = 25; static const int primes [nprimes] = { 31, 73, 151, 313, 643, 1291, 2593, 5233, 10501, 21013, 42073, 84181, 168451, 337219, 674701, 1349473, 2699299, 5398891, 10798093, 21596719, 43193641, 86387383, 172775299, 345550609, 691101253 }; //================================================================================================= // Hash table implementation of Maps // template, class E = Equal > class Map { struct Pair { K key; D data; }; H hash; E equals; vec* table; int cap; int size; // Don't allow copying (error prone): Map& operator = (Map& other) { assert(0); } Map (Map& other) { assert(0); } int32_t index (const K& k) const { return hash(k) % cap; } void _insert (const K& k, const D& d) { table[index(k)].push(); table[index(k)].last().key = k; table[index(k)].last().data = d; } void rehash () { const vec* old = table; int newsize = primes[0]; for (int i = 1; newsize <= cap && i < nprimes; i++) newsize = primes[i]; table = new vec[newsize]; for (int i = 0; i < cap; i++){ for (int j = 0; j < old[i].size(); j++){ _insert(old[i][j].key, old[i][j].data); }} delete [] old; cap = newsize; } public: Map () : table(NULL), cap(0), size(0) {} Map (const H& h, const E& e) : Map(), hash(h), equals(e) {} ~Map () { delete [] table; } void insert (const K& k, const D& d) { if (size+1 > cap / 2) rehash(); _insert(k, d); size++; } bool peek (const K& k, D& d) { if (size == 0) return false; const vec& ps = table[index(k)]; for (int i = 0; i < ps.size(); i++) if (equals(ps[i].key, k)){ d = ps[i].data; return true; } return false; } void remove (const K& k) { assert(table != NULL); vec& ps = table[index(k)]; int j = 0; for (; j < ps.size() && !equals(ps[j].key, k); j++); assert(j < ps.size()); ps[j] = ps.last(); ps.pop(); } void clear () { cap = size = 0; delete [] table; table = NULL; } }; #endif link-grammar-4.7.4/link-grammar/minisat/Heap.h0000644000175000017500000001177411052427621020176 0ustar bloombloom/******************************************************************************************[Heap.h] MiniSat -- Copyright (c) 2003-2006, Niklas Een, Niklas Sorensson Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. **************************************************************************************************/ #ifndef Heap_h #define Heap_h #include "Vec.h" #include using namespace std; //================================================================================================= // A heap implementation with support for decrease/increase key. template class Heap { Comp lt; vec heap; // heap of ints vec indices; // int -> index in heap // Index "traversal" functions static inline int left (int i) { return i*2+1; } static inline int right (int i) { return (i+1)*2; } static inline int parent(int i) { return (i-1) >> 1; } inline void percolateUp(int i) { int x = heap[i]; while (i != 0 && lt(x, heap[parent(i)])){ heap[i] = heap[parent(i)]; indices[heap[i]] = i; i = parent(i); } heap [i] = x; indices[x] = i; } inline void percolateDown(int i) { int x = heap[i]; while (left(i) < heap.size()){ int child = right(i) < heap.size() && lt(heap[right(i)], heap[left(i)]) ? right(i) : left(i); if (!lt(heap[child], x)) break; heap[i] = heap[child]; indices[heap[i]] = i; i = child; } heap [i] = x; indices[x] = i; } bool heapProperty (int i) const { return i >= heap.size() || ((i == 0 || !lt(heap[i], heap[parent(i)])) && heapProperty(left(i)) && heapProperty(right(i))); } public: Heap(const Comp& c) : lt(c) { } int size () const { return heap.size(); } bool empty () const { return heap.size() == 0; } bool inHeap (int n) const { return n < indices.size() && indices[n] >= 0; } int operator[](int index) const { return heap[index]; } void decrease (int n) { percolateUp(indices[n]); } // RENAME WHEN THE DEPRECATED INCREASE IS REMOVED. void increase_ (int n) { percolateDown(indices[n]); } void insert(int n) { indices.growTo(n+1, -1); indices[n] = heap.size(); heap.push(n); percolateUp(indices[n]); } int removeMin() { int x = heap[0]; heap[0] = heap.last(); indices[heap[0]] = 0; indices[x] = -1; heap.pop(); if (heap.size() > 1) percolateDown(0); return x; } void clear(bool dealloc = false) { for (int i = 0; i < heap.size(); i++) indices[heap[i]] = -1; #ifdef NDEBUG for (int i = 0; i < indices.size(); i++) #endif heap.clear(dealloc); } // Fool proof variant of insert/decrease/increase void update (int n) { if (!inHeap(n)) insert(n); else { percolateUp(indices[n]); percolateDown(indices[n]); } } // Delete elements from the heap using a given filter function (-object). // *** this could probaly be replaced with a more general "buildHeap(vec&)" method *** template void filter(const F& filt) { int i,j; for (i = j = 0; i < heap.size(); i++) if (filt(heap[i])){ heap[j] = heap[i]; indices[heap[i]] = j++; }else indices[heap[i]] = -1; heap.shrink(i - j); for (int i = heap.size() / 2 - 1; i >= 0; i--) percolateDown(i); } // DEBUG: consistency checking bool heapProperty() const { return heapProperty(1); } void print() const { cout << "_____________________" << endl; int i = 2; for (int j = 0; j < heap.size(); j++) { printf("%3d ", heap[j]); lt.print(heap[j]); cout << (!(i & (i-1)) ? "\n" : " "); i++; } cout << endl << "_____________________" << endl; } // COMPAT: should be removed void setBounds (int n) { } void increase (int n) { decrease(n); } int getmin () { return removeMin(); } }; //================================================================================================= #endif link-grammar-4.7.4/link-grammar/disjunct-utils.h0000644000175000017500000000250411261443146020627 0ustar bloombloom/*************************************************************************/ /* Copyright (c) 2004 */ /* Daniel Sleator, David Temperley, and John Lafferty */ /* All rights reserved */ /* */ /* Use of the link grammar parsing system is subject to the terms of the */ /* license set forth in the LICENSE file included with this software, */ /* and also available at http://www.link.cs.cmu.edu/link/license.html */ /* This license allows free redistribution and use in source and binary */ /* forms, with or without modification, subject to certain conditions. */ /* */ /*************************************************************************/ #ifndef _LINK_GRAMMAR_DISJUNCT_UTILS_H_ #define _LINK_GRAMMAR_DISJUNCT_UTILS_H_ #include "api-types.h" /* Disjunct utilities ... */ void free_disjuncts(Disjunct *); int count_disjuncts(Disjunct *); Disjunct * copy_disjunct(Disjunct * ); Disjunct * catenate_disjuncts(Disjunct *, Disjunct *); Disjunct * eliminate_duplicate_disjuncts(Disjunct * ); char * print_one_disjunct(Disjunct *); #endif /* _LINK_GRAMMAR_DISJUNCT_UTILS_H_ */ link-grammar-4.7.4/link-grammar/malloc-dbg.c0000644000175000017500000001007511007703713017641 0ustar bloombloom/* * malloc-dbg.c * * Debug memory allocation. Hacky code, used only * for debugging. * * Copyright (c) 2008 Linas Vepstas */ #ifndef _MSC_VER #include #include #include #include /* ======================================================== */ static void *(*old_malloc_hook)(size_t, const void *); static void (*old_free_hook)(void *, const void *); static void *(*old_realloc_hook)(void *, size_t, const void *); static void my_free_hook(void * mem, const void * caller); static void * my_malloc_hook(size_t n_bytes, const void * caller); #define TBLSZ 366000 typedef struct { void * mem; const void * caller; int cnt; size_t sz; } loc_t; static loc_t loc[TBLSZ]; static int mcnt = 0; static FILE *fh = NULL; static void init_io(void) { if (fh) return; /* fh = fopen("/tmp/m", "w"); */ fh = stdout; } static void * my_realloc_hook(void * mem, size_t n_bytes, const void *caller) { __realloc_hook = old_realloc_hook; void * nm = realloc(mem, n_bytes); old_realloc_hook = __realloc_hook; __realloc_hook = my_realloc_hook; int i; for (i=0; i #include #if !defined(_WIN32) #include #include #endif #if defined(__linux__) /* based on reading the man page for getrusage on linux, I inferred that I needed to include this. However it doesn't seem to be necessary */ #include #endif #if defined(__hpux__) #include int syscall(int, int, struct rusage *rusage); /* can't find the prototype for this */ #define getrusage(a, b) syscall(SYS_GETRUSAGE, (a), (b)) #endif /* __hpux__ */ #if defined(__sun__) int getrusage(int who, struct rusage *rusage); /* Declaration missing from sys/resource.h in sun operating systems (?) */ #endif /* __sun__ */ #define MAX_PARSE_TIME_UNLIMITED -1 #define MAX_MEMORY_UNLIMITED ((size_t) -1) /** returns the current usage time clock in seconds */ static double current_usage_time(void) { #if !defined(_WIN32) struct rusage u; getrusage (RUSAGE_SELF, &u); return (u.ru_utime.tv_sec + ((double) u.ru_utime.tv_usec) / 1000000.0); #else return ((double) clock())/CLOCKS_PER_SEC; #endif } Resources resources_create(void) { Resources r; r = (Resources) xalloc(sizeof(struct Resources_s)); r->max_parse_time = MAX_PARSE_TIME_UNLIMITED; r->when_created = current_usage_time(); r->when_last_called = current_usage_time(); r->time_when_parse_started = current_usage_time(); r->space_when_parse_started = get_space_in_use(); r->max_memory = MAX_MEMORY_UNLIMITED; r->cumulative_time = 0; r->memory_exhausted = FALSE; r->timer_expired = FALSE; return r; } void resources_delete(Resources r) { xfree(r, sizeof(struct Resources_s)); } void resources_reset(Resources r) { r->when_last_called = r->time_when_parse_started = current_usage_time(); r->space_when_parse_started = get_space_in_use(); r->timer_expired = FALSE; r->memory_exhausted = FALSE; } #if 0 static void resources_reset_time(Resources r) { r->when_last_called = r->time_when_parse_started = current_usage_time(); } #endif void resources_reset_space(Resources r) { r->space_when_parse_started = get_space_in_use(); } int resources_exhausted(Resources r) { if (resources_timer_expired(r)) { r->timer_expired = TRUE; } if (resources_memory_exhausted(r)) { r->memory_exhausted = TRUE; } return (r->timer_expired || r->memory_exhausted); } int resources_timer_expired(Resources r) { if (r->max_parse_time == MAX_PARSE_TIME_UNLIMITED) return 0; else return (r->timer_expired || (current_usage_time() - r->time_when_parse_started > r->max_parse_time)); } int resources_memory_exhausted(Resources r) { if (r->max_memory == MAX_MEMORY_UNLIMITED) return 0; else return (r->memory_exhausted || (get_space_in_use() > r->max_memory)); } /** print out the cpu ticks since this was last called */ static void resources_print_time(int verbosity, Resources r, const char * s) { double new_t; new_t = current_usage_time(); if (verbosity > 1) { printf("++++"); left_print_string(stdout, s, " "); printf("%7.2f seconds\n", new_t - r->when_last_called); } r->when_last_called = new_t; } /** print out the cpu ticks since this was last called */ static void resources_print_total_time(int verbosity, Resources r) { double new_t; new_t = current_usage_time(); r->cumulative_time += (new_t - r->time_when_parse_started) ; if (verbosity > 0) { printf("++++"); left_print_string(stdout, "Time", " "); printf("%7.2f seconds (%.2f total)\n", new_t - r->time_when_parse_started, r->cumulative_time); } r->time_when_parse_started = new_t; } static void resources_print_total_space(int verbosity, Resources r) { if (verbosity > 1) { printf("++++"); left_print_string(stdout, "Total space", " "); printf("%lu bytes (%lu max)\n", (long unsigned int) get_space_in_use(), (long unsigned int) get_max_space_used()); } } void print_time(Parse_Options opts, const char * s) { resources_print_time(opts->verbosity, opts->resources, s); } void parse_options_print_total_time(Parse_Options opts) { resources_print_total_time(opts->verbosity, opts->resources); } void print_total_space(Parse_Options opts) { resources_print_total_space(opts->verbosity, opts->resources); } link-grammar-4.7.4/link-grammar/regex-morph.c0000644000175000017500000000717311453342756020115 0ustar bloombloom/*************************************************************************/ /* Copyright (c) 2005 Sampo Pyysalo */ /* All rights reserved */ /* */ /* Use of the link grammar parsing system is subject to the terms of the */ /* license set forth in the LICENSE file included with this software, */ /* and also available at http://www.link.cs.cmu.edu/link/license.html */ /* This license allows free redistribution and use in source and binary */ /* forms, with or without modification, subject to certain conditions. */ /* */ /*************************************************************************/ /* On MS Windows, regex.h fails to pull in size_t, so work around this by * including before ( is not enough) */ #include #include #include "api-structures.h" #include "link-includes.h" #include "read-dict.h" #include "regex-morph.h" #include "structures.h" /** * Support for the regular-expression based token matching system * using standard POSIX regex. */ /* Compiles all the regexs in the Dictionary. Returns 0 on success, * else an error code. */ int compile_regexs(Dictionary dict) { regex_t *preg; int rc; Regex_node *re = dict->regex_root; while (re != NULL) { /* If re->re non-null, assume compiled already. */ if(re->re == NULL) { /* Compile with default options (0) and default character * tables (NULL). */ /* re->re = pcre_compile(re->pattern, 0, &error, &erroroffset, NULL); */ preg = (regex_t *) malloc (sizeof(regex_t)); re->re = preg; rc = regcomp(preg, re->pattern, REG_EXTENDED); if (rc) { /* prt_error("Error: Failed to compile regex '%s' (%s) at %d: %s\n", re->pattern, re->name, erroroffset, error); */ prt_error("Error: Failed to compile regex '%s' (%s)\n", re->pattern, re->name); return rc; } /* Check that the regex name is defined in the dictionary. */ if (!boolean_dictionary_lookup(dict, re->name)) { /* TODO: better error handing. Maybe remove the regex? */ prt_error("Error: Regex name %s not found in dictionary!\n", re->name); } } re = re->next; } return 0; } /** * Tries to match each regex in turn to word s. * On match, returns the name of the first matching regex. * If no match is found, returns NULL. */ const char *match_regex(Dictionary dict, const char *s) { int rc; Regex_node *re = dict->regex_root; while (re != NULL) { if (re->re == NULL) { /* Re not compiled; if this happens, it's likely an * internal error, but nevermind for now. */ continue; } /* Try to match with no extra data (NULL), whole str (0 to strlen(s)), * and default options (second 0). */ /* int rc = pcre_exec(re->re, NULL, s, strlen(s), 0, * 0, ovector, PCRE_OVEC_SIZE); */ rc = regexec((regex_t*) re->re, s, 0, NULL, 0); if (0 == rc) { return re->name; /* match found. just return--no multiple matches. */ } else if (rc != REG_NOMATCH) { /* We have an error. TODO: more appropriate error handling.*/ fprintf(stderr,"Regex matching error %d occurred!\n", rc); } re = re->next; } return NULL; /* no matches. */ } /** * Delete associated storage */ void free_regexs(Dictionary dict) { Regex_node *re = dict->regex_root; while (re != NULL) { Regex_node *next = re->next; regfree((regex_t *)re->re); free(re->re); free(re->name); free(re->pattern); free(re); re = next; } } link-grammar-4.7.4/link-grammar/disjunct-utils.c0000644000175000017500000001420111524651275020625 0ustar bloombloom/*************************************************************************/ /* Copyright (c) 2004 */ /* Daniel Sleator, David Temperley, and John Lafferty */ /* All rights reserved */ /* */ /* Use of the link grammar parsing system is subject to the terms of the */ /* license set forth in the LICENSE file included with this software, */ /* and also available at http://www.link.cs.cmu.edu/link/license.html */ /* This license allows free redistribution and use in source and binary */ /* forms, with or without modification, subject to certain conditions. */ /* */ /*************************************************************************/ #include #include #include "disjunct-utils.h" #include "externs.h" #include "structures.h" #include "utilities.h" #include "word-utils.h" /* Disjunct utilities ... */ /** * free_disjuncts() -- free the list of disjuncts pointed to by c * (does not free any strings) */ void free_disjuncts(Disjunct *c) { Disjunct *c1; for (;c != NULL; c = c1) { c1 = c->next; free_connectors(c->left); free_connectors(c->right); xfree((char *)c, sizeof(Disjunct)); } } /** * This builds a new copy of the disjunct pointed to by d (except for the * next field which is set to NULL). Strings, as usual, * are not copied. */ Disjunct * copy_disjunct(Disjunct * d) { Disjunct * d1; if (d == NULL) return NULL; d1 = (Disjunct *) xalloc(sizeof(Disjunct)); *d1 = *d; d1->next = NULL; d1->left = copy_connectors(d->left); d1->right = copy_connectors(d->right); return d1; } /** * Destructively catenates the two disjunct lists d1 followed by d2. * Doesn't change the contents of the disjuncts. * Traverses the first list, but not the second. */ Disjunct * catenate_disjuncts(Disjunct *d1, Disjunct *d2) { Disjunct * dis = d1; if (d1 == NULL) return d2; if (d2 == NULL) return d1; while (dis->next != NULL) dis = dis->next; dis->next = d2; return d1; } /** Returns the number of disjuncts in the list pointed to by d */ int count_disjuncts(Disjunct * d) { int count = 0; for (; d != NULL; d = d->next) { count++; } return count; } /* ============================================================= */ typedef struct disjunct_dup_table_s disjunct_dup_table; struct disjunct_dup_table_s { int dup_table_size; Disjunct ** dup_table; }; /** * This is a hash function for disjuncts * * This is the old version that doesn't check for domination, just * equality. */ static inline int old_hash_disjunct(disjunct_dup_table *dt, Disjunct * d) { int i; Connector *e; i = 0; for (e = d->left ; e != NULL; e = e->next) { i += string_hash(e->string); } for (e = d->right ; e != NULL; e = e->next) { i += string_hash(e->string); } i += string_hash(d->string); i += (i>>10); return (i & (dt->dup_table_size-1)); } /** * The connectors must be exactly equal. A similar function * is connectors_equal_AND(), but that ignores priorities, * this does not. */ static int connectors_equal_prune(Connector *c1, Connector *c2) { return (c1->label == c2->label) && (c1->multi == c2->multi) && (c1->priority == c2->priority) && (strcmp(c1->string, c2->string) == 0); } /** returns TRUE if the disjuncts are exactly the same */ static int disjuncts_equal(Disjunct * d1, Disjunct * d2) { Connector *e1, *e2; e1 = d1->left; e2 = d2->left; while((e1!=NULL) && (e2!=NULL)) { if (!connectors_equal_prune(e1,e2)) break; e1 = e1->next; e2 = e2->next; } if ((e1!=NULL) || (e2!=NULL)) return FALSE; e1 = d1->right; e2 = d2->right; while((e1!=NULL) && (e2!=NULL)) { if (!connectors_equal_prune(e1,e2)) break; e1 = e1->next; e2 = e2->next; } if ((e1!=NULL) || (e2!=NULL)) return FALSE; return (strcmp(d1->string, d2->string) == 0); } static disjunct_dup_table * disjunct_dup_table_new(size_t sz) { size_t i; disjunct_dup_table *dt; dt = (disjunct_dup_table *) malloc(sizeof(disjunct_dup_table)); dt->dup_table_size = sz; dt->dup_table = (Disjunct **) xalloc(sz * sizeof(Disjunct *)); for (i=0; idup_table[i] = NULL; return dt; } static void disjunct_dup_table_delete(disjunct_dup_table *dt) { xfree((char *) dt->dup_table, dt->dup_table_size * sizeof(Disjunct *)); free(dt); } /** * Takes the list of disjuncts pointed to by d, eliminates all * duplicates, and returns a pointer to a new list. * It frees the disjuncts that are eliminated. */ Disjunct * eliminate_duplicate_disjuncts(Disjunct * d) { int i, h, count; Disjunct *dn, *dx; disjunct_dup_table *dt; count = 0; dt = disjunct_dup_table_new(next_power_of_two_up(2 * count_disjuncts(d))); while (d != NULL) { dn = d->next; h = old_hash_disjunct(dt, d); for (dx = dt->dup_table[h]; dx!=NULL; dx=dx->next) { if (disjuncts_equal(dx, d)) break; } if (dx == NULL) { d->next = dt->dup_table[h]; dt->dup_table[h] = d; } else { d->next = NULL; /* to prevent it from freeing the whole list */ if (d->cost < dx->cost) dx->cost = d->cost; free_disjuncts(d); count++; } d = dn; } /* d is already null */ for (i=0; idup_table_size; i++) { for (dn = dt->dup_table[i]; dn != NULL; dn = dx) { dx = dn->next; dn->next = d; d = dn; } } if ((verbosity > 2) && (count != 0)) printf("killed %d duplicates\n", count); disjunct_dup_table_delete(dt); return d; } /* ============================================================= */ /* Return the stringified disjunct. * Be sure to free the string upon return. */ static char * prt_con(Connector *c, char * p, char dir) { size_t n; if (NULL == c) return p; p = prt_con (c->next, p, dir); if (c->multi) { n = sprintf(p, "@%s%c ", c->string, dir); } else { n = sprintf(p, "%s%c ", c->string, dir); } return p+n; } char * print_one_disjunct(Disjunct *dj) { char buff[MAX_LINE]; char * p = buff; p = prt_con(dj->left, p, '-'); p = prt_con(dj->right, p, '+'); return strdup(buff); } /* ========================= END OF FILE ============================== */ link-grammar-4.7.4/link-grammar/string-set.h0000644000175000017500000000217611145400370017743 0ustar bloombloom/*************************************************************************/ /* Copyright (c) 2004 */ /* Daniel Sleator, David Temperley, and John Lafferty */ /* All rights reserved */ /* */ /* Use of the link grammar parsing system is subject to the terms of the */ /* license set forth in the LICENSE file included with this software, */ /* and also available at http://www.link.cs.cmu.edu/link/license.html */ /* This license allows free redistribution and use in source and binary */ /* forms, with or without modification, subject to certain conditions. */ /* */ /*************************************************************************/ String_set * string_set_create(void); const char * string_set_add(const char * source_string, String_set * ss); const char * string_set_lookup(const char * source_string, String_set * ss); void string_set_delete(String_set *ss); link-grammar-4.7.4/link-grammar/build-disjuncts.h0000644000175000017500000000230211241427433020744 0ustar bloombloom/*************************************************************************/ /* Copyright (c) 2004 */ /* Daniel Sleator, David Temperley, and John Lafferty */ /* All rights reserved */ /* */ /* Use of the link grammar parsing system is subject to the terms of the */ /* license set forth in the LICENSE file included with this software, */ /* and also available at http://www.link.cs.cmu.edu/link/license.html */ /* This license allows free redistribution and use in source and binary */ /* forms, with or without modification, subject to certain conditions. */ /* */ /*************************************************************************/ #include "api-types.h" #include "structures.h" void build_sentence_disjuncts(Sentence sent, float cost_cutoff); X_node * build_word_expressions(Dictionary dict, const char *); Disjunct * build_disjuncts_for_dict_node(Dict_node *); Disjunct * build_disjuncts_for_X_node(X_node * x, float cost_cutoff); link-grammar-4.7.4/link-grammar/prune.c0000644000175000017500000014206011526022265016773 0ustar bloombloom/*************************************************************************/ /* Copyright (c) 2004 */ /* Daniel Sleator, David Temperley, and John Lafferty */ /* All rights reserved */ /* */ /* Use of the link grammar parsing system is subject to the terms of the */ /* license set forth in the LICENSE file included with this software, */ /* and also available at http://www.link.cs.cmu.edu/link/license.html */ /* This license allows free redistribution and use in source and binary */ /* forms, with or without modification, subject to certain conditions. */ /* */ /*************************************************************************/ #include #include "disjunct-utils.h" #define CONTABSZ 8192 typedef Connector * connector_table; typedef struct disjunct_dup_table_s disjunct_dup_table; struct disjunct_dup_table_s { int dup_table_size; Disjunct ** dup_table; }; /* the indiction in a word field that this connector cannot * be used -- is obsolete. */ #define BAD_WORD (MAX_SENTENCE+1) typedef struct c_list_s C_list; struct c_list_s { Connector * c; int shallow; C_list * next; }; typedef struct power_table_s power_table; struct power_table_s { int power_table_size; int l_table_size[MAX_SENTENCE]; /* the sizes of the hash tables */ int r_table_size[MAX_SENTENCE]; C_list ** l_table[MAX_SENTENCE]; C_list ** r_table[MAX_SENTENCE]; }; typedef struct cms_struct Cms; struct cms_struct { Cms * next; const char * name; int count; /* the number of times this is in the multiset */ }; #define CMS_SIZE (2<<10) typedef struct multiset_table_s multiset_table; struct multiset_table_s { Cms * cms_table[CMS_SIZE]; }; typedef struct prune_context_s prune_context; struct prune_context_s { int null_links; char ** deletable; char ** effective_dist; int power_cost; int power_prune_mode; /* either GENTLE or RUTHLESS */ int N_changed; /* counts the number of changes of c->word fields in a pass */ power_table *pt; Sentence sent; }; /* The algorithms in this file prune disjuncts from the disjunct list of the sentence that can be elimininated by a simple checks. The first check works as follows: A series of passes are made through the sentence, alternating left-to-right and right-to-left. Consier the left-to-right pass (the other is symmetric). A set S of connectors is maintained (initialized to be empty). Now the disjuncts of the current word are processed. If a given disjunct's left pointing connectors have the property that at least one of them has no connector in S to which it can be matched, then that disjunct is deleted. Now the set S is augmented by the right connectors of the remaining disjuncts of that word. This completes one word. The process continues through the words from left to right. Alternate passes are made until no disjunct is deleted. It worries me a little that if there are some really huge disjuncts lists, then this process will probably do nothing. (This fear turns out to be unfounded.) Notes: Power pruning will not work if applied before generating the "and" disjuncts. This is because certain of it's tricks don't work. Think about this, and finish this note later.... Also, currently I use the standard connector match procedure instead of the pruning one, since I know power pruning will not be used before and generation. Replace this to allow power pruning to work before generating and disjuncts. Currently it seems that normal pruning, power pruning, and generation, pruning, and power pruning (after "and" generation) and parsing take about the same amount of time. This is why doing power pruning before "and" generation might be a very good idea. New idea: Suppose all the disjuncts of a word have a connector of type c pointing to the right. And further, suppose that there is exactly one word to its right containing that type of connector pointing to the left. Then all the other disjuncts on the latter word can be deleted. (This situation is created by the processing of "either...or", and by the extra disjuncts added to a "," neighboring a conjunction.) */ /** * This hash function only looks at the leading upper case letters of * the connector string, and the label fields. This ensures that if two * strings match (formally), then they must hash to the same place. */ static inline int hash_S(Connector * c) { int h = connector_hash(c); return (h & (CONTABSZ-1)); } /** * This is almost identical to match(). Its reason for existance * is the rather subtle fact that with "and" can transform a "Ss" * connector into "Sp". This means that in order for pruning to * work, we must allow a "Ss" connector on word match an "Sp" connector * on a word to its right. This is what this version of match allows. * We assume that a is on a word to the left of b. */ int prune_match(int dist, Connector *a, Connector *b) { const char *s, *t; int x, y; if (a->label != b->label) return FALSE; x = hash_S(a); y = hash_S(b); if (x != y) return FALSE; s = a->string; t = b->string; while(s < a->prune_string || t < b->prune_string) { if (*s != *t) return FALSE; s++; t++; } /* printf("PM: a=%4s b=%4s ap=%d bp=%d a->ll=%d b->ll=%d dist=%d\n", s, t, x, y, a->length_limit, b->length_limit, dist); */ if (dist > a->length_limit || dist > b->length_limit) return FALSE; x = a->priority; y = b->priority; if ((x == THIN_priority) && (y == THIN_priority)) { #if defined(PLURALIZATION) /* if ((*(a->string)=='S') && ((*s=='s') || (*s=='p')) && (*t=='p')) { return TRUE; } */ /* The above is a kludge to stop pruning from killing off disjuncts which (because of pluralization in and) might become valid later. Recall that "and" converts a singular subject into a plural one. The (*s=='p') part is so that "he and I are good" doesn't get killed off. The above hack is subsumed by the following one: */ if ((*(a->string)=='S') && ((*s=='s') || (*s=='p')) && ((*t=='p') || (*t=='s')) && ((s-1 == a->string) || ((s-2 == a->string) && (*(s-1) == 'I')))){ return TRUE; } /* This change is to accommodate "nor". In particular we need to prevent "neither John nor I likes dogs" from being killed off. We want to allow this to apply to "are neither a dog nor a cat here" and "is neither a dog nor a cat here". This uses the "SI" connector. The third line above ensures that the connector is either "S" or "SI". */ #endif while ((*s != '\0') && (*t != '\0')) { if ((*s == '*') || (*t == '*') || ((*s == *t) && (*s != '^'))) { /* this last case here is rather obscure. It prevents '^' from matching '^'.....Is this necessary? ......yes, I think it is. */ s++; t++; } else return FALSE; } return TRUE; } else if ((x == UP_priority) && (y == DOWN_priority)) { while ((*s!='\0') && (*t!='\0')) { if ((*s == *t) || (*s == '*') || (*t == '^')) { /* that '^' should match on the DOWN_priority node is subtle, but correct */ s++; t++; } else return FALSE; } return TRUE; } else if ((y == UP_priority) && (x == DOWN_priority)) { while ((*s!='\0') && (*t!='\0')) { if ((*s == *t) || (*t == '*') || (*s == '^')) { s++; t++; } else return FALSE; } return TRUE; } else return FALSE; } static void zero_connector_table(connector_table *ct) { memset(ct, 0, sizeof(Connector *) * CONTABSZ); } /** * This function puts connector c into the connector table * if one like it isn't already there. */ static void insert_connector(connector_table *ct, Connector * c) { int h; Connector * e; h = hash_S(c); for (e = ct[h]; e != NULL; e = e->tableNext) { if ((strcmp(c->string, e->string) == 0) && (c->label == e->label) && (c->priority == e->priority)) return; } c->tableNext = ct[h]; ct[h] = c; } void prune(Sentence sent) { Connector *e, *f; int w; int N_deleted; Connector *ct[CONTABSZ]; Disjunct fake_head, *d, *d1; /* XXX why is this here ?? */ count_set_effective_distance(sent); N_deleted = 1; /* a lie to make it always do at least 2 passes */ while(1) { /* Left-to-right pass */ zero_connector_table(ct); /* For every word */ for (w = 0; w < sent->length; w++) { d = &fake_head; d->next = sent->word[w].d; /* For every disjunct of word */ while ((d1 = d->next)) { e = d1->left; /* For every left clause of this disjunct */ while (e) { int h = hash_S(e); for (f = ct[h]; f != NULL; f = f->tableNext) { if (prune_match(0, f, e)) break; } if (!f) break; /* If f null, not a single match was found */ e = e->next; } /* We know this disjunct is dead since no match * can be found on a required clause. */ if (e) { N_deleted ++; free_connectors(d1->left); free_connectors(d1->right); d->next = d1->next; xfree(d1, sizeof(Disjunct)); } else { /* Store surviving disjunct in hash table */ for (e = d1->right; e != NULL; e = e->next) { insert_connector(ct, e); } d = d1; /* move on to next disjunct*/ } } sent->word[w].d = fake_head.next; } if (2 < verbosity) { printf("l->r pass removed %d\n", N_deleted); print_disjunct_counts(sent); } /* We did nothing (and this is not the 1st pass) */ if (N_deleted == 0) break; /* Right-to-left pass */ zero_connector_table(ct); N_deleted = 0; /* For every word */ for (w = sent->length-1; w >= 0; w--) { d = &fake_head; d->next = sent->word[w].d; while ((d1 = d->next)) { e = d1->right; while (e) { int h = hash_S(e); for (f = ct[h]; f != NULL; f = f->tableNext) { if (prune_match(0, e, f)) break; } if (!f) break; /* If f null, not a single match was found */ e = e->next; } /* We know this disjunct is dead since it can't match * to the right*/ if(e) { N_deleted ++; free_connectors(d1->left); free_connectors(d1->right); d->next = d1->next; xfree(d1, sizeof(Disjunct)); } else { /* Store surviving disjunct in hash table */ for (e = d1->left; e != NULL; e = e->next) { insert_connector(ct, e); } d = d1; /* move on to next disjunct*/ } sent->word[w].d = fake_head.next; } } if (verbosity > 2) { printf("r->l pass removed %d\n", N_deleted); print_disjunct_counts(sent); } /* We made no change on this pass */ if (N_deleted == 0) break; N_deleted = 0; } } /* The second algorithm eliminates disjuncts that are dominated by another. It works by hashing them all, and checking for domination. */ #if FALSE /* ============================================================x */ /* Consider the idea of deleting a disjunct if it is dominated (in terms of what it can match) by some other disjunct on the same word. This has been implemented below. There are three problems with it: (1) It is almost never the case that any disjuncts are eliminated. (The code below has works correctly with fat links, but because all of the fat connectors on a fat disjunct have the same matching string, the only time a disjuct will die is if it is the same as another one. This is captured by the simplistic version below. (2) connector_matches_alam may not be exactly correct. I don't think it does the fat link matches properly. (See the comment in and.c for more information about matching fat links.) This is irrelevant because of (1). (3) The linkage that is eliminated by this, might just be the one that passes post-processing, as the following example shows. This is pretty silly, and should probably be changed. > telling John how our program works would be stupid Accepted (2 linkages, 1 with no P.P. violations) Linkage 1, cost vector = (0, 0, 7) +------------------G-----------------+ +-----R-----+----CL----+ | +---O---+ | +---D--+---S---+ +--I-+-AI-+ | | | | | | | | | telling.g John how our program.n works would be stupid ///// CLg <---CLg---> CL telling.g (g) telling.g G <---G-----> G would (g) (d) telling.g R <---R-----> R how (g) (d) telling.g O <---O-----> O John (g) (d) how CLe <---CLe---> CL program.n (g) (d) (e) our D <---Ds----> Ds program.n (g) (d) (e) program.n Ss <---Ss----> Ss works (g) would I <---Ix----> Ix be (g) be AI <---AIi---> AIi stupid (press return for another) > Linkage 2 (bad), cost vector = (0, 0, 7) +------------------G-----------------+ +-----R-----+----CL----+ | +---O---+ | +---D--+---S---+ +--I-+-AI-+ | | | | | | | | | telling.g John how our program.n works would be stupid ///// CLg <---CLg---> CL telling.g (g) telling.g G <---G-----> G would (g) (d) telling.g R <---R-----> R how (g) (d) telling.g O <---O-----> O John (g) (d) how CLe <---CLe---> CL program.n (g) (d) (e) our D <---Ds----> Ds program.n (g) (d) (e) program.n Ss <---Ss----> Ss works (g) would I <---Ix----> Ix be (g) be AI <---AI----> AI stupid P.P. violations: Special subject rule violated */ /** * hash function that takes a string and a seed value i */ static int string_hash(disjunct_dup_table *dt, const char * s, int i) { for(;*s != '\0';s++) i = i + (i<<1) + randtable[(*s + i) & (RTSIZE-1)]; return (i & (dt->dup_table_size-1)); } /** * This returns true if the connector a matches everything that b * matches, and possibly more. (alam=at least as much) * * TRUE for equal connectors. * remains TRUE if multi-match added to the first. * remains TRUE if subsrcripts deleted from the first. */ int connector_matches_alam(Connector * a, Connector * b) { char * s, * t, *u; if (((!a->multi) && b->multi) || (a->label != b->label) || (a->priority != b->priority)) return FALSE; s = a->string; t = b->string; /* isupper -- connectors cannot be UTF8 at this time */ while(isupper(*s) || isupper(*t)) { if (*s == *t) { s++; t++; } else return FALSE; } if (a->priority == DOWN_priority) { u = s; s = t; t = u; } while((*s != '\0') && (*t != '\0')) { if ((*s == *t) || (*s == '*') || (*t == '^')) { s++; t++; } else return FALSE; } while ((*s != '\0') && (*s == '*')) s++; return (*s == '\0'); } /** * This hash function that takes a connector and a seed value i. * It only looks at the leading upper case letters of * the string, and the label. This ensures that if two connectors * match, then they must hash to the same place. */ static int conn_hash(Connector * c, int i) { int nb; const char * s; s = c->string; i = i + (i<<1) + randtable[(c->label + i) & (RTSIZE-1)]; nb = is_utf8_upper(s); while(nb) { i = i + (i<<1) + randtable[(*s + i) & (RTSIZE-1)]; s += nb; nb = is_utf8_upper(s); } return i; } static inline int pconnector_hash(disjunct_dup_table *dt, Connector * c, int i) { i = conn_hash(c, i); return (i & (ct->dup_table_size-1)); } /** * This is a hash function for disjuncts */ static int hash_disjunct(disjunct_dup_table *dt, Disjunct * d) { int i; Connector *e; i = 0; for (e = d->left ; e != NULL; e = e->next) { i = pconnector_hash(dt, e, i); } for (e = d->right ; e != NULL; e = e->next) { i = pconnector_hash(dt, e, i); } return string_hash(dt, d->string, i); } /** * Returns TRUE if disjunct d1 can match anything that d2 can * if this happens, it constitutes a proof that there is absolutely * no use for d2. */ static int disjunct_matches_alam(Disjunct * d1, Disjunct * d2) { Connector *e1, *e2; if (d1->cost > d2->cost) return FALSE; e1 = d1->left; e2 = d2->left; while((e1!=NULL) && (e2!=NULL)) { if (!connector_matches_alam(e1,e2)) break; e1 = e1->next; e2 = e2->next; } if ((e1!=NULL) || (e2!=NULL)) return FALSE; e1 = d1->right; e2 = d2->right; while((e1!=NULL) && (e2!=NULL)) { if (!connector_matches_alam(e1,e2)) break; e1 = e1->next; e2 = e2->next; } if ((e1!=NULL) || (e2!=NULL)) return FALSE; return (strcmp(d1->string, d2->string) == 0); } /** * Takes the list of disjuncts pointed to by d, eliminates all * duplicates, and returns a pointer to a new list. * It frees the disjuncts that are eliminated. */ Disjunct * eliminate_duplicate_disjuncts(Disjunct * d) { int i, h, count; Disjunct *dn, *dx, *dxn, *front; count = 0; disjunct_dup_table *dt; dt = disjunct_dup_table_new(next_power_of_two_up(2 * count_disjuncts(d))); for (;d!=NULL; d = dn) { dn = d->next; h = hash_disjunct(d); front = NULL; for (dx = dt->dup_table[h]; dx != NULL; dx = dxn) { dxn = dx->next; if (disjunct_matches_alam(dx,d)) { /* we know that d should be killed */ d->next = NULL; free_disjuncts(d); count++; front = catenate_disjuncts(front, dx); break; } else if (disjunct_matches_alam(d,dx)) { /* we know that dx should be killed off */ dx->next = NULL; free_disjuncts(dx); count++; } else { /* neither should be killed off */ dx->next = front; front = dx; } } if (dx == NULL) { /* we put d in the table */ d->next = front; front = d; } dt->dup_table[h] = front; } /* d is now NULL */ for (i = 0; i < dt->dup_table_size; i++) { for (dx = dt->dup_table[i]; dx != NULL; dx = dxn) { dxn = dx->next; dx->next = d; d = dx; } } if ((verbosity > 2) && (count != 0)) printf("killed %d duplicates\n", count); disjunct_dup_table_delete(dt); return d; } /* ============================================================x */ #endif /* ================================================================= */ /** * Here is expression pruning. This is done even before the expressions * are turned into lists of disjuncts. * * This uses many of the same data structures and functions that are used * by prune. * * The purge operations remove all irrelevant stuff from the expression, * and free the purged stuff. A connector is deemed irrelevant if its * string pointer has been set to NULL. The passes through the sentence * have the job of doing this. * * If an OR or AND type expression node has one child, we can replace it * by its child. This, of course, is not really necessary, except for * performance(?) */ static Exp* purge_Exp(Exp *); /** * Get rid of the elements with null expressions */ static E_list * or_purge_E_list(E_list * l) { E_list * el; if (l == NULL) return NULL; if ((l->e = purge_Exp(l->e)) == NULL) { el = or_purge_E_list(l->next); xfree((char *)l, sizeof(E_list)); return el; } l->next = or_purge_E_list(l->next); return l; } /** * Returns 0 iff the length of the disjunct list is 0. * If this is the case, it frees the structure rooted at l. */ static int and_purge_E_list(E_list * l) { if (l == NULL) return 1; if ((l->e = purge_Exp(l->e)) == NULL) { free_E_list(l->next); xfree((char *)l, sizeof(E_list)); return 0; } if (and_purge_E_list(l->next) == 0) { free_Exp(l->e); xfree((char *)l, sizeof(E_list)); return 0; } return 1; } /** * Must be called with a non-null expression. * Return NULL iff the expression has no disjuncts. */ static Exp* purge_Exp(Exp *e) { if (e->type == CONNECTOR_type) { if (e->u.string == NULL) { xfree((char *)e, sizeof(Exp)); return NULL; } else { return e; } } if (e->type == AND_type) { if (and_purge_E_list(e->u.l) == 0) { xfree((char *)e, sizeof(Exp)); return NULL; } } else { e->u.l = or_purge_E_list(e->u.l); if (e->u.l == NULL) { xfree((char *)e, sizeof(Exp)); return NULL; } } /* This code makes it kill off nodes that have just one child (1) It's going to give an insignificant speed-up (2) Costs have not been handled correctly here. The code is excised for these reasons. */ /* if ((e->u.l != NULL) && (e->u.l->next == NULL)) { ne = e->u.l->e; xfree((char *) e->u.l, sizeof(E_list)); xfree((char *) e, sizeof(Exp)); return ne; } */ return e; } /** * Returns TRUE if c can match anything in the set S. */ static inline int matches_S(connector_table *ct, Connector * c, int dir) { Connector * e; int h = hash_S(c); if (dir == '-') { for (e = ct[h]; e != NULL; e = e->tableNext) { if (prune_match(0, e, c)) return TRUE; } return FALSE; } else { for (e = ct[h]; e != NULL; e = e->tableNext) { if (prune_match(0, c, e)) return TRUE; } return FALSE; } } /** * Mark as dead all of the dir-pointing connectors * in e that are not matched by anything in the current set. * Returns the number of connectors so marked. */ static int mark_dead_connectors(connector_table *ct, Exp * e, int dir) { int count; count = 0; if (e->type == CONNECTOR_type) { if (e->dir == dir) { Connector dummy; init_connector(&dummy); dummy.label = NORMAL_LABEL; dummy.priority = THIN_priority; dummy.string = e->u.string; if (!matches_S(ct, &dummy, dir)) { e->u.string = NULL; count++; } } } else { E_list *l; for (l = e->u.l; l != NULL; l = l->next) { count += mark_dead_connectors(ct, l->e, dir); } } return count; } /** * Put into the set S all of the dir-pointing connectors still in e. * Return a list of allocated dummy connectors; these will need to be * freed. */ static Connector * insert_connectors(connector_table *ct, Exp * e, Connector *alloc_list, int dir) { if (e->type == CONNECTOR_type) { if (e->dir == dir) { Connector *dummy = connector_new(); dummy->string = e->u.string; insert_connector(ct, dummy); dummy->next = alloc_list; alloc_list = dummy; } } else { E_list *l; for (l=e->u.l; l!=NULL; l=l->next) { alloc_list = insert_connectors(ct, l->e, alloc_list, dir); } } return alloc_list; } /** * This removes the expressions that are empty from the list corresponding * to word w of the sentence. */ static void clean_up_expressions(Sentence sent, int w) { X_node head_node, *d, *d1; d = &head_node; d->next = sent->word[w].x; while (d->next != NULL) { if (d->next->exp == NULL) { d1 = d->next; d->next = d1->next; xfree((char *)d1, sizeof(X_node)); } else { d = d->next; } } sent->word[w].x = head_node.next; } void expression_prune(Sentence sent) { int N_deleted; X_node * x; int w; Connector *ct[CONTABSZ]; Connector *dummy_list = NULL; zero_connector_table(ct); N_deleted = 1; /* a lie to make it always do at least 2 passes */ while(1) { /* Left-to-right pass */ /* For every word */ for (w = 0; w < sent->length; w++) { /* For every expression in word */ for (x = sent->word[w].x; x != NULL; x = x->next) { /* printf("before marking: "); print_expression(x->exp); printf("\n"); */ N_deleted += mark_dead_connectors(ct, x->exp, '-'); /* printf(" after marking: "); print_expression(x->exp); printf("\n"); */ } for (x = sent->word[w].x; x != NULL; x = x->next) { /* printf("before purging: "); print_expression(x->exp); printf("\n"); */ x->exp = purge_Exp(x->exp); /* printf("after purging: "); print_expression(x->exp); printf("\n"); */ } /* gets rid of X_nodes with NULL exp */ clean_up_expressions(sent, w); for (x = sent->word[w].x; x != NULL; x = x->next) { dummy_list = insert_connectors(ct, x->exp, dummy_list, '+'); } } if (verbosity > 2) { printf("l->r pass removed %d\n", N_deleted); print_expression_sizes(sent); } /* Free the allocated dummy connectors */ free_connectors(dummy_list); dummy_list = NULL; zero_connector_table(ct); if (N_deleted == 0) break; /* Right-to-left pass */ N_deleted = 0; for (w = sent->length-1; w >= 0; w--) { for (x = sent->word[w].x; x != NULL; x = x->next) { /* printf("before marking: "); print_expression(x->exp); printf("\n"); */ N_deleted += mark_dead_connectors(ct, x->exp, '+'); /* printf("after marking: "); print_expression(x->exp); printf("\n"); */ } for (x = sent->word[w].x; x != NULL; x = x->next) { /* printf("before perging: "); print_expression(x->exp); printf("\n"); */ x->exp = purge_Exp(x->exp); /* printf("after perging: "); print_expression(x->exp); printf("\n"); */ } clean_up_expressions(sent, w); /* gets rid of X_nodes with NULL exp */ for (x = sent->word[w].x; x != NULL; x = x->next) { dummy_list = insert_connectors(ct, x->exp, dummy_list, '-'); } } if (verbosity > 2) { printf("r->l pass removed %d\n", N_deleted); print_expression_sizes(sent); } /* Free the allocated dummy connectors */ free_connectors(dummy_list); dummy_list = NULL; zero_connector_table(ct); if (N_deleted == 0) break; N_deleted = 0; } } /* Here is what you've been waiting for: POWER-PRUNE The kinds of constraints it checks for are the following: 1) successive connectors on the same disjunct have to go to nearer and nearer words. 2) two deep connectors cannot attach to eachother (A connectors is deep if it is not the first in its list, it is shallow if it is the first in its list, it is deepest if it is the last on its list.) 3) on two adjacent words, a pair of connectors can be used only if they're the deepest ones on their disjuncts 4) on two non-adjacent words, a pair of connectors can be used only if not [both of them are the deepest]. The data structure consists of a pair of hash tables on every word. Each bucket of a hash table has a list of pointers to connectors. These nodes also store if the chosen connector is shallow. */ /* As with normal pruning, we make alternate left->right and right->left passes. In the R->L pass, when we're on a word w, we make use of all the left-pointing hash tables on the words to the right of w. After the pruning on this word, we build the left-pointing hash table this word. This guarantees idempotence of the pass -- after doing an L->R, doing another would change nothing. Each connector has an integer c_word field. This refers to the closest word that it could be connected to. These are initially determined by how deep the connector is. For example, a deepest connector can connect to the neighboring word, so its c_word field is w+1 (w-1 if this is a left pointing connector). It's neighboring shallow connector has a c_word value of w+2, etc. The pruning process adjusts these c_word values as it goes along, accumulating information about any way of linking this sentence. The pruning process stops only after no disjunct is deleted and no c_word values change. The difference between RUTHLESS and GENTLE power pruning is simply that GENTLE uses the deletable region array, and RUTHLESS does not. So we can get the effect of these two different methods simply by always unsuring that deletable[][] has been defined. With nothing deletable, this is equivalent to RUTHLESS. --DS, 7/97 */ /** * returns the number of connectors in the left lists of the disjuncts. */ static int left_connector_count(Disjunct * d) { Connector *c; int i=0; for (;d!=NULL; d=d->next) { for (c = d->left; c!=NULL; c = c->next) i++; } return i; } static int right_connector_count(Disjunct * d) { Connector *c; int i=0; for (;d!=NULL; d=d->next) { for (c = d->right; c!=NULL; c = c->next) i++; } return i; } static void free_C_list(C_list * t) { C_list *xt; for (; t!=NULL; t=xt) { xt = t->next; xfree((char *)t, sizeof(C_list)); } } /** * free all of the hash tables and C_lists */ static void power_table_delete(power_table *pt) { int w; int i; for (w = 0; w < pt->power_table_size; w++) { for (i = 0; i < pt->l_table_size[w]; i++) { free_C_list(pt->l_table[w][i]); } xfree((char *)pt->l_table[w], pt->l_table_size[w] * sizeof (C_list *)); for (i = 0; i < pt->r_table_size[w]; i++) { free_C_list(pt->r_table[w][i]); } xfree((char *)pt->r_table[w], pt->r_table_size[w] * sizeof (C_list *)); } free(pt); } /** * The disjunct d (whose left or right pointer points to c) is put * into the appropriate hash table */ static void put_into_power_table(int size, C_list ** t, Connector * c, int shal) { int h; C_list * m; h = connector_hash(c) & (size-1); m = (C_list *) xalloc (sizeof(C_list)); m->next = t[h]; t[h] = m; m->c = c; m->shallow = shal; } static int set_dist_fields(Connector * c, int w, int delta) { int i; if (c==NULL) return w; i = set_dist_fields(c->next, w, delta) + delta; c->word = i; return i; } /** * Allocates and builds the initial power hash tables */ static power_table * power_table_new(Sentence sent) { power_table *pt; int w, len, size, i; C_list ** t; Disjunct * d, * xd, * head; Connector * c; pt = (power_table *) malloc (sizeof(power_table)); pt->power_table_size = sent->length; /* first we initialize the word fields of the connectors, and eliminate those disjuncts with illegal connectors */ for (w=0; wlength; w++) { head = NULL; for (d=sent->word[w].d; d!=NULL; d=xd) { xd = d->next; if ((set_dist_fields(d->left, w, -1) < 0) || (set_dist_fields(d->right, w, 1) >= sent->length)) { d->next = NULL; free_disjuncts(d); } else { d->next = head; head = d; } } sent->word[w].d = head; } for (w=0; wlength; w++) { len = left_connector_count(sent->word[w].d); size = next_power_of_two_up(len); pt->l_table_size[w] = size; t = pt->l_table[w] = (C_list **) xalloc(size * sizeof(C_list *)); for (i=0; iword[w].d; d!=NULL; d=d->next) { c = d->left; if (c != NULL) { put_into_power_table(size, t, c, TRUE); for (c=c->next; c!=NULL; c=c->next){ put_into_power_table(size, t, c, FALSE); } } } len = right_connector_count(sent->word[w].d); size = next_power_of_two_up(len); pt->r_table_size[w] = size; t = pt->r_table[w] = (C_list **) xalloc(size * sizeof(C_list *)); for (i=0; iword[w].d; d!=NULL; d=d->next) { c = d->right; if (c != NULL) { put_into_power_table(size, t, c, TRUE); for (c=c->next; c!=NULL; c=c->next){ put_into_power_table(size, t, c, FALSE); } } } } return pt; } /** * This runs through all the connectors in this table, and eliminates those * who are obsolete. The word fields of an obsolete one has been set to * BAD_WORD. */ static void clean_table(int size, C_list ** t) { int i; C_list * m, * xm, * head; for (i=0; inext; if (m->c->word != BAD_WORD) { m->next = head; head = m; } else { xfree((char *) m, sizeof(C_list)); } } t[i] = head; } } /** * This takes two connectors (and whether these are shallow or not) * (and the two words that these came from) and returns TRUE if it is * possible for these two to match based on local considerations. */ static int possible_connection(prune_context *pc, Connector *lc, Connector *rc, int lshallow, int rshallow, int lword, int rword) { if ((!lshallow) && (!rshallow)) return FALSE; /* two deep connectors can't work */ if ((lc->word > rword) || (rc->word < lword)) return FALSE; /* word range constraints */ assert(lword < rword, "Bad word order in possible connection."); /* Now, notice that the only differences between the following two cases is that (1) ruthless uses match and gentle uses prune_match. and (2) ruthless doesn't use deletable[][]. This latter fact is irrelevant, since deletable[][] is now guaranteed to have been created. */ if (pc->power_prune_mode == RUTHLESS) { if (lword == rword-1) { if (!((lc->next == NULL) && (rc->next == NULL))) return FALSE; } else { if ((!pc->null_links) && (lc->next == NULL) && (rc->next == NULL) && (!lc->multi) && (!rc->multi)) { return FALSE; } } return do_match(pc->sent, lc, rc, lword, rword); } else { if (lword == rword-1) { if (!((lc->next == NULL) && (rc->next == NULL))) return FALSE; } else { if ((!pc->null_links) && (lc->next == NULL) && (rc->next == NULL) && (!lc->multi) && (!rc->multi) && !pc->deletable[lword][rword]) { return FALSE; } } return prune_match(pc->effective_dist[lword][rword], lc, rc); } } /** * This returns TRUE if the right table of word w contains * a connector that can match to c. shallow tells if c is shallow. */ static int right_table_search(prune_context *pc, int w, Connector *c, int shallow, int word_c) { int size, h; C_list *cl; power_table *pt; pt = pc->pt; size = pt->r_table_size[w]; h = connector_hash(c) & (size-1); for (cl = pt->r_table[w][h]; cl != NULL; cl = cl->next) { if (possible_connection(pc, cl->c, c, cl->shallow, shallow, w, word_c)) { return TRUE; } } return FALSE; } /** * This returns TRUE if the right table of word w contains * a connector that can match to c. shallows tells if c is shallow */ static int left_table_search(prune_context *pc, int w, Connector *c, int shallow, int word_c) { int size, h; C_list *cl; power_table *pt; pt = pc->pt; size = pt->l_table_size[w]; h = connector_hash(c) & (size-1); for (cl = pt->l_table[w][h]; cl != NULL; cl = cl->next) { if (possible_connection(pc, c, cl->c, shallow, cl->shallow, word_c, w)) { return TRUE; } } return FALSE; } #if NOT_USED_NOW static int ok_cwords(Sentence sent, Connector *c) { for (; c != NULL; c=c->next) { if (c->word == BAD_WORD) return FALSE; if (c->word >= sent->length) return FALSE; } return TRUE; } #endif /** * take this connector list, and try to match it with the words * w-1, w-2, w-3...Returns the word to which the first connector of the * list could possibly be matched. If c is NULL, returns w. If there * is no way to match this list, it returns a negative number. * If it does find a way to match it, it updates the c->word fields * correctly. */ static int left_connector_list_update(prune_context *pc, Connector *c, int word_c, int w, int shallow) { int n; int foundmatch; if (c==NULL) return w; n = left_connector_list_update(pc, c->next, word_c, w, FALSE) - 1; if (((int) c->word) < n) n = c->word; /* n is now the rightmost word we need to check */ foundmatch = FALSE; for (; (n >= 0) && ((w-n) < MAX_SENTENCE); n--) { pc->power_cost++; if (right_table_search(pc, n, c, shallow, word_c)) { foundmatch = TRUE; break; } } if (n < ((int) c->word)) { c->word = n; pc->N_changed++; } return (foundmatch ? n : -1); } /** * take this connector list, and try to match it with the words * w+1, w+2, w+3...Returns the word to which the first connector of the * list could possibly be matched. If c is NULL, returns w. If there * is no way to match this list, it returns a number greater than N_words-1 * If it does find a way to match it, it updates the c->word fields * correctly. */ static int right_connector_list_update(prune_context *pc, Sentence sent, Connector *c, int word_c, int w, int shallow) { int n; int foundmatch; if (c==NULL) return w; n = right_connector_list_update(pc, sent, c->next, word_c, w, FALSE) + 1; if (c->word > n) n = c->word; /* n is now the leftmost word we need to check */ foundmatch = FALSE; for (; (n < sent->length) && ((n-w) < MAX_SENTENCE); n++) { pc->power_cost++; if (left_table_search(pc, n, c, shallow, word_c)) { foundmatch = TRUE; break; } } if (n > c->word) { c->word = n; pc->N_changed++; } return (foundmatch ? n : sent->length); } /** The return value is the number of disjuncts deleted */ int power_prune(Sentence sent, int mode, Parse_Options opts) { power_table *pt; prune_context *pc; Disjunct *d, *free_later, *dx, *nd; Connector *c; int w, N_deleted, total_deleted; pc = (prune_context *) malloc (sizeof(prune_context)); pc->power_cost = 0; pc->power_prune_mode = mode; pc->null_links = (opts->min_null_count > 0); pc->N_changed = 1; /* forces it always to make at least two passes */ pc->deletable = sent->deletable; pc->effective_dist = sent->effective_dist; pc->sent = sent; count_set_effective_distance(sent); pt = power_table_new(sent); pc->pt = pt; free_later = NULL; N_deleted = 0; total_deleted = 0; while (1) { /* left-to-right pass */ for (w = 0; w < sent->length; w++) { if (parse_options_resources_exhausted(opts)) break; for (d = sent->word[w].d; d != NULL; d = d->next) { if (d->left == NULL) continue; if (left_connector_list_update(pc, d->left, w, w, TRUE) < 0) { for (c=d->left ;c!=NULL; c = c->next) c->word = BAD_WORD; for (c=d->right ;c!=NULL; c = c->next) c->word = BAD_WORD; N_deleted++; total_deleted++; } } clean_table(pt->r_table_size[w], pt->r_table[w]); nd = NULL; for (d = sent->word[w].d; d != NULL; d = dx) { dx = d->next; if ((d->left != NULL) && (d->left->word == BAD_WORD)) { d->next = free_later; free_later = d; } else { d->next = nd; nd = d; } } sent->word[w].d = nd; } if (verbosity > 2) { printf("l->r pass changed %d and deleted %d\n",pc->N_changed,N_deleted); } if (pc->N_changed == 0) break; pc->N_changed = N_deleted = 0; /* right-to-left pass */ for (w = sent->length-1; w >= 0; w--) { if (parse_options_resources_exhausted(opts)) break; for (d = sent->word[w].d; d != NULL; d = d->next) { if (d->right == NULL) continue; if (right_connector_list_update(pc, sent, d->right,w,w,TRUE) >= sent->length){ for (c=d->right;c!=NULL; c = c->next) c->word = BAD_WORD; for (c=d->left ;c!=NULL; c = c->next) c->word = BAD_WORD; N_deleted++; total_deleted++; } } clean_table(pt->l_table_size[w], pt->l_table[w]); nd = NULL; for (d = sent->word[w].d; d != NULL; d = dx) { dx = d->next; if ((d->right != NULL) && (d->right->word == BAD_WORD)) { d->next = free_later; free_later = d; } else { d->next = nd; nd = d; } } sent->word[w].d = nd; } if (verbosity > 2) { printf("r->l pass changed %d and deleted %d\n", pc->N_changed,N_deleted); } if (pc->N_changed == 0) break; pc->N_changed = N_deleted = 0; } free_disjuncts(free_later); power_table_delete(pt); pt = NULL; pc->pt = NULL; if (verbosity > 2) printf("%d power prune cost:\n", pc->power_cost); if (mode == RUTHLESS) { print_time(opts, "power pruned (ruthless)"); } else { print_time(opts, "power pruned (gentle)"); } if (verbosity > 2) { if (mode == RUTHLESS) { printf("\nAfter power_pruning (ruthless):\n"); } else { printf("\nAfter power_pruning (gentle):\n"); } print_disjunct_counts(sent); } free(pc); return total_deleted; } /* =================================================================== PP Pruning The "contains one" post-processing constraints give us a new way to prune. Suppose there's a rule that says "a group that contains foo must contain a bar or a baz." Here foo, bar, and baz are connector types. foo is the trigger link, bar and baz are called the criterion links. If, after considering the disjuncts we find that there is is a foo, but neither a bar, nor a baz, then we can eliminte the disjuct containing bar. Things are actually a bit more complex, because of the matching rules and subscripts. The problem is that post-processing deals with link names, while at this point all we have to work with is connector names. Consider the foo part. Consider a connector C. When does foo match C for our purposes? It matches it if every possible link name L (that can result from C being at one end of that link) results in post_process_match(foo,L) being true. Suppose foo contains a "*". Then there is no C that has this property. This is because the *s in C may be replaced by some other subscripts in the construction of L. And the non-* chars in L will not post_process_match the * in foo. So let's assume that foo has no *. Now the result we want is simply given by post_process_match(foo, C). Proof: L is the same as C but with some *s replaced by some other letters. Since foo contains no * the replacement in C of some * by some other letter could change post_process_match from FALSE to TRUE, but not vice versa. Therefore it's conservative to use this test. For the criterion parts, we need to determine if there is a collection of connectors C1, C2,... such that by combining them you can get a link name L that post_process_matches bar or baz. Here's a way to do this. Say bar="Xabc". Then we see if there are connector names that post_process_match "Xa##", "X#b#", and "X##c". They must all be there in order for it to be possible to create a link name "Xabc". A "*" in the criterion part is a little different. In this case we can simply skip the * (treat it like an upper case letter) for this purpose. So if bar="X*ab" then we look for "X*#b" and "X*a#". (The * in this case could be treated the same as another subscript without breaking it.) Note also that it's only necessary to find a way to match one of the many criterion links that may be in the rule. If none can match, then we can delete the disjunct containing C. Here's how we're going to implement this. We'll maintain a multiset of connector names. We'll represent them in a hash table, where the hash function uses only the upper case letters of the connector name. We'll insert all the connectors into the multiset. The multiset will support the operation of deletion (probably simplest to just decrement the count). Here's the algorithm. Insert all the connectors into M. While the previous pass caused a count to go to 0 do: For each connector C do For each rule R do if C is a trigger for R and the criterion links of the rule cannot be satisfied by the connectors in M, Then: We delete C's disjunct. But before we do, we remove all the connectors of this disjunct from the multiset. Keep tabs on whether or not any of the counts went to 0. Efficiency hacks to be added later: Note for a given rule can become less and less satisfiable. That is, rule_satisfiable(r) for a given rule r can change from TRUE to FALSE, but not vice versa. So once it's FALSE, we can just remember that. Consider the effect of a pass p on the set of rules that are satisfiable. Suppose this set does not change. Then pass p+1 will do nothing. This is true even if pass p caused some disjuncts to be deleted. (This observation will only obviate the need for the last pass.) */ static multiset_table * cms_table_new(void) { multiset_table *mt; int i; mt = (multiset_table *) malloc(sizeof(multiset_table)); for (i=0; icms_table[i] = NULL; } return mt; } static void cms_table_delete(multiset_table *mt) { Cms * cms, *xcms; int i; for (i=0; icms_table[i]; cms != NULL; cms = xcms) { xcms = cms->next; xfree(cms, sizeof(Cms)); } } free(mt); } static int cms_hash(const char * s) { unsigned int i = 5381; while (isupper((int) *s)) /* connector names are not yet UTF8-capable */ { i = ((i << 5) + i) + *s; s++; } return (i & (CMS_SIZE-1)); } /** * This returns TRUE if there is a connector name C in the table * such that post_process_match(pp_match_name, C) is TRUE */ static int match_in_cms_table(multiset_table *cmt, const char * pp_match_name) { Cms * cms; for (cms = cmt->cms_table[cms_hash(pp_match_name)]; cms != NULL; cms = cms->next) { if(post_process_match(pp_match_name, cms->name)) return TRUE; } return FALSE; } static Cms * lookup_in_cms_table(multiset_table *cmt, const char * str) { Cms * cms; for (cms = cmt->cms_table[cms_hash(str)]; cms != NULL; cms = cms->next) { if(strcmp(str, cms->name) == 0) return cms; } return NULL; } static void insert_in_cms_table(multiset_table *cmt, const char * str) { Cms * cms; int h; cms = lookup_in_cms_table(cmt, str); if (cms != NULL) { cms->count++; } else { cms = (Cms *) xalloc(sizeof(Cms)); cms->name = str; /* don't copy the string...just keep a pointer to it. we won't free these later */ cms->count = 1; h = cms_hash(str); cms->next = cmt->cms_table[h]; cmt->cms_table[h] = cms; } } /** * Delete the given string from the table. Return TRUE if * this caused a count to go to 0, return FALSE otherwise. */ static int delete_from_cms_table(multiset_table *cmt, const char * str) { Cms * cms; cms = lookup_in_cms_table(cmt, str); if (cms != NULL && cms->count > 0) { cms->count--; return (cms->count == 0); } return FALSE; } static int rule_satisfiable(multiset_table *cmt, pp_linkset *ls) { int hashval; const char * t; char name[20], *s; pp_linkset_node *p; int bad, n_subscripts; for (hashval = 0; hashval < ls->hash_table_size; hashval++) { for (p = ls->hash_table[hashval]; p!=NULL; p=p->next) { /* ok, we've got our hands on one of the criterion links */ strncpy(name, p->str, sizeof(name)-1); /* could actually use the string in place because we change it back */ name[sizeof(name)-1] = '\0'; /* now we want to see if we can satisfy this criterion link */ /* with a collection of the links in the cms table */ for (s = name; isupper((int)*s); s++) {} for (;*s != '\0'; s++) if (*s != '*') *s = '#'; for (s = name, t = p->str; isupper((int) *s); s++, t++) {} /* s and t remain in lockstep */ bad = 0; n_subscripts = 0; for (;*s != '\0' && bad==0; s++, t++) { if (*s == '*') continue; n_subscripts++; /* after the upper case part, and is not a * so must be a regular subscript */ *s = *t; if (!match_in_cms_table(cmt, name)) bad++; *s = '#'; } if (n_subscripts == 0) { /* now we handle the special case which occurs if there were 0 subscripts */ if (!match_in_cms_table(cmt, name)) bad++; } /* now if bad==0 this criterion link does the job to satisfy the needs of the trigger link */ if (bad == 0) return TRUE; } } return FALSE; } static int pp_prune(Sentence sent, Parse_Options opts) { pp_knowledge * knowledge; pp_rule rule; const char * selector; pp_linkset * link_set; int i, w, dir; Disjunct *d; Connector *c; int change, total_deleted, N_deleted, deleteme; multiset_table *cmt; if (sent->dict->postprocessor == NULL) return 0; knowledge = sent->dict->postprocessor->knowledge; cmt = cms_table_new(); for (w = 0; w < sent->length; w++) { for (d = sent->word[w].d; d != NULL; d = d->next) { d->marked = TRUE; for (dir=0; dir < 2; dir++) { for (c = ( (dir)?(d->left):(d->right) ); c!=NULL; c=c->next) { insert_in_cms_table(cmt, c->string); } } } } total_deleted = 0; change = 1; while (change > 0) { change = 0; N_deleted = 0; for (w = 0; w < sent->length; w++) { for (d = sent->word[w].d; d != NULL; d = d->next) { if (!d->marked) continue; deleteme = FALSE; for (dir=0; dir < 2; dir++) { for (c = ( (dir)?(d->left):(d->right) ); c!=NULL; c=c->next) { for (i=0; in_contains_one_rules; i++) { rule = knowledge->contains_one_rules[i]; /* the ith rule */ selector = rule.selector; /* selector string for this rule */ link_set = rule.link_set; /* the set of criterion links */ if (strchr(selector, '*') != NULL) continue; /* If it has a * forget it */ if (!post_process_match(selector, c->string)) continue; /* printf("pp_prune: trigger ok. selector = %s c->string = %s\n", selector, c->string); */ /* We know c matches the trigger link of the rule. */ /* Now check the criterion links */ if (!rule_satisfiable(cmt, link_set)) { deleteme = TRUE; } if (deleteme) break; } if (deleteme) break; } if (deleteme) break; } if (deleteme) { /* now we delete this disjunct */ N_deleted++; total_deleted++; d->marked = FALSE; /* mark for deletion later */ for (dir=0; dir < 2; dir++) { for (c = ( (dir)?(d->left):(d->right) ); c!=NULL; c=c->next) { change += delete_from_cms_table(cmt, c->string); } } } } } if (verbosity > 2) { printf("pp_prune pass deleted %d\n", N_deleted); } } delete_unmarked_disjuncts(sent); cms_table_delete(cmt); if (verbosity > 2) { printf("\nAfter pp_pruning:\n"); print_disjunct_counts(sent); } print_time(opts, "pp pruning"); return total_deleted; } /** * Do the following pruning steps until nothing happens: * power pp power pp power pp.... * Make sure you do them both at least once. */ void pp_and_power_prune(Sentence sent, int mode, Parse_Options opts) { power_prune(sent, mode, opts); for (;;) { if (parse_options_resources_exhausted(opts)) break; if (pp_prune(sent, opts) == 0) break; if (parse_options_resources_exhausted(opts)) break; if (power_prune(sent, mode, opts) == 0) break; } } link-grammar-4.7.4/link-grammar/command-line.h0000644000175000017500000000162311153023377020212 0ustar bloombloom/*************************************************************************/ /* Copyright (c) 2004 */ /* Daniel Sleator, David Temperley, and John Lafferty */ /* All rights reserved */ /* */ /* Use of the link grammar parsing system is subject to the terms of the */ /* license set forth in the LICENSE file included with this software, */ /* and also available at http://www.link.cs.cmu.edu/link/license.html */ /* This license allows free redistribution and use in source and binary */ /* forms, with or without modification, subject to certain conditions. */ /* */ /*************************************************************************/ link-grammar-4.7.4/link-grammar/prune.h0000644000175000017500000000226511241074137017001 0ustar bloombloom/*************************************************************************/ /* Copyright (c) 2004 */ /* Daniel Sleator, David Temperley, and John Lafferty */ /* All rights reserved */ /* */ /* Use of the link grammar parsing system is subject to the terms of the */ /* license set forth in the LICENSE file included with this software, */ /* and also available at http://www.link.cs.cmu.edu/link/license.html */ /* This license allows free redistribution and use in source and binary */ /* forms, with or without modification, subject to certain conditions. */ /* */ /*************************************************************************/ void prune(Sentence sent); int power_prune(Sentence sent, int mode, Parse_Options opts); void pp_and_power_prune(Sentence sent, int mode, Parse_Options opts); int prune_match(int dist, Connector * left, Connector * right); void expression_prune(Sentence sent); link-grammar-4.7.4/link-grammar/massage.c0000644000175000017500000002472711526022265017273 0ustar bloombloom/*************************************************************************/ /* Copyright (c) 2004 */ /* Daniel Sleator, David Temperley, and John Lafferty */ /* All rights reserved */ /* */ /* Use of the link grammar parsing system is subject to the terms of the */ /* license set forth in the LICENSE file included with this software, */ /* and also available at http://www.link.cs.cmu.edu/link/license.html */ /* This license allows free redistribution and use in source and binary */ /* forms, with or without modification, subject to certain conditions. */ /* */ /*************************************************************************/ #include #include "disjunct-utils.h" /* This file contains the functions for massaging disjuncts of the sentence in special ways having to do with conjunctions. The only function called from the outside world is install_special_conjunctive_connectors() It would be nice if this code was written more transparently. In other words, there should be some fairly general functions that manipulate disjuncts, and take words like "neither" etc as input parameters, so as to encapsulate the changes being made for special words. This would not be too hard to do, but it's not a high priority. -DS 3/98 */ #define COMMA_LABEL (-2) /* to hook the comma to the following "and" */ #define EITHER_LABEL (-3) /* to connect the "either" to the following "or" */ #define NEITHER_LABEL (-4) /* to connect the "neither" to the following "nor"*/ #define NOT_LABEL (-5) /* to connect the "not" to the following "but"*/ #define NOTONLY_LABEL (-6) /* to connect the "not" to the following "only"*/ #define BOTH_LABEL (-7) /* to connect the "both" to the following "and"*/ /* There's a problem with installing "...but...", "not only...but...", and "not...but...", which is that the current comma mechanism will allow a list separated by commas. "Not only John, Mary but Jim came" The best way to prevent this is to make it impossible for the comma to attach to the "but", via some sort of additional subscript on commas. I can't think of a good way to prevent this. */ /* The following functions all do slightly different variants of the following thing: Catenate to the disjunct list pointed to by d, a new disjunct list. The new list is formed by copying the old list, and adding the new connector somewhere in the old disjunct, for disjuncts that satisfy certain conditions */ /** * glom_comma_connector() -- * In this case the connector is to connect to the comma to the * left of an "and" or an "or". Only gets added next to a fat link */ static Disjunct * glom_comma_connector(Disjunct * d) { Disjunct * d_list, * d1, * d2; Connector * c, * c1; d_list = NULL; for (d1 = d; d1!=NULL; d1=d1->next) { if (d1->left == NULL) continue; for (c = d1->left; c->next != NULL; c = c->next) ; if (c->label < 0) continue; /* last one must be a fat link */ d2 = copy_disjunct(d1); d2->next = d_list; d_list = d2; c1 = connector_new(); c1->label = COMMA_LABEL; c->next = c1; } return catenate_disjuncts(d, d_list); } /** * In this case the connector is to connect to the "either", "neither", * "not", or some auxilliary d to the current which is a conjunction. * Only gets added next to a fat link, but before it (not after it) * In the case of "nor", we don't create new disjuncts, we merely modify * existing ones. This forces the fat link uses of "nor" to * use a neither. (Not the case with "or".) If necessary=FALSE, then * duplication is done, otherwise it isn't */ static Disjunct * glom_aux_connector(Disjunct * d, int label, int necessary) { Disjunct * d_list, * d1, * d2; Connector * c, * c1, *c2; d_list = NULL; for (d1 = d; d1!=NULL; d1=d1->next) { if (d1->left == NULL) continue; for (c = d1->left; c->next != NULL; c = c->next) ; if (c->label < 0) continue; /* last one must be a fat link */ if (!necessary) { d2 = copy_disjunct(d1); d2->next = d_list; d_list = d2; } c1 = connector_new(); c1->label = label; c1->next = c; if (d1->left == c) { d1->left = c1; } else { for (c2 = d1->left; c2->next != c; c2 = c2->next) ; c2->next = c1; } } return catenate_disjuncts(d, d_list); } /** * This adds one connector onto the beginning of the left (or right) * connector list of d. The label and string of the connector are * specified */ static Disjunct * add_one_connector(int label, int dir, const char *cs, Disjunct * d) { Connector * c; c = connector_new(); c->string = cs; c->label = label; if (dir == '+') { c->next = d->right; d->right = c; } else { c->next = d->left; d->left = c; } return d; } /** * special_disjunct() -- * Builds a new disjunct with one connector pointing in direction dir * (which is '+' or '-'). The label and string of the connector * are specified, as well as the string of the disjunct. * The next pointer of the new disjunct set to NULL, so it can be * regarded as a list. */ static Disjunct * special_disjunct(int label, int dir, const char *cs, const char * ds) { Disjunct * d1; Connector * c; d1 = (Disjunct *) xalloc(sizeof(Disjunct)); d1->cost = 0; d1->string = ds; d1->next = NULL; c = connector_new(); c->string = cs; c->label = label; if (dir == '+') { d1->left = NULL; d1->right = c; } else { d1->right = NULL; d1->left = c; } return d1; } /** * Finds all places in the sentence where a comma is followed by * a conjunction ("and", "or", "but", or "nor"). It modifies these comma * disjuncts, and those of the following word, to allow the following * word to absorb the comma (if used as a conjunction). */ static void construct_comma(Sentence sent) { int w; for (w=0; wlength-1; w++) { if ((strcmp(sent->word[w].string, ",")==0) && sent->is_conjunction[w+1]) { sent->word[w].d = catenate_disjuncts(special_disjunct(COMMA_LABEL,'+',"", ","), sent->word[w].d); sent->word[w+1].d = glom_comma_connector(sent->word[w+1].d); } } } /** Returns TRUE if one of the words in the sentence is s */ static int sentence_contains(Sentence sent, const char * s) { int w; for (w=0; wlength; w++) { if (strcmp(sent->word[w].string, s) == 0) return TRUE; } return FALSE; } /** * The functions below put the special connectors on certain auxilliary words to be used with conjunctions. Examples: either, neither, both...and..., not only...but... XXX FIXME: This routine uses "sentence_contains" to test for explicit English words, and clearly this fails for other langauges!! XXX FIXME! */ static void construct_either(Sentence sent) { int w; if (!sentence_contains(sent, "either")) return; for (w=0; wlength; w++) { if (strcmp(sent->word[w].string, "either") != 0) continue; sent->word[w].d = catenate_disjuncts( special_disjunct(EITHER_LABEL,'+',"", "either"), sent->word[w].d); } for (w=0; wlength; w++) { if (strcmp(sent->word[w].string, "or") != 0) continue; sent->word[w].d = glom_aux_connector (sent->word[w].d, EITHER_LABEL, FALSE); } } static void construct_neither(Sentence sent) { int w; if (!sentence_contains(sent, "neither")) { /* I don't see the point removing disjuncts on "nor". I Don't know why I did this. What's the problem keeping the stuff explicitely defined for "nor" in the dictionary? --DS 3/98 */ #if 0 for (w=0; wlength; w++) { if (strcmp(sent->word[w].string, "nor") != 0) continue; free_disjuncts(sent->word[w].d); sent->word[w].d = NULL; /* a nor with no neither is dead */ } #endif return; } for (w=0; wlength; w++) { if (strcmp(sent->word[w].string, "neither") != 0) continue; sent->word[w].d = catenate_disjuncts( special_disjunct(NEITHER_LABEL,'+',"", "neither"), sent->word[w].d); } for (w=0; wlength; w++) { if (strcmp(sent->word[w].string, "nor") != 0) continue; sent->word[w].d = glom_aux_connector (sent->word[w].d, NEITHER_LABEL, TRUE); } } static void construct_notonlybut(Sentence sent) { int w; Disjunct *d; if (!sentence_contains(sent, "not")) { return; } for (w=0; wlength; w++) { if (strcmp(sent->word[w].string, "not") != 0) continue; sent->word[w].d = catenate_disjuncts( special_disjunct(NOT_LABEL,'+',"", "not"), sent->word[w].d); if (wlength-1 && strcmp(sent->word[w+1].string, "only")==0) { sent->word[w+1].d = catenate_disjuncts( special_disjunct(NOTONLY_LABEL, '-',"","only"), sent->word[w+1].d); d = special_disjunct(NOTONLY_LABEL, '+', "","not"); d = add_one_connector(NOT_LABEL,'+',"", d); sent->word[w].d = catenate_disjuncts(d, sent->word[w].d); } } /* The code below prevents sentences such as the following from parsing: it was not carried out by Serbs but by Croats */ /* We decided that this is a silly thing to. Here's the bug report caused by this: Bug with conjunctions. Some that work with "and" but they don't work with "but". "He was not hit by John and by Fred". (Try replacing "and" by "but" and it does not work. It's getting confused by the "not".) */ for (w=0; wlength; w++) { if (strcmp(sent->word[w].string, "but") != 0) continue; sent->word[w].d = glom_aux_connector (sent->word[w].d, NOT_LABEL, FALSE); /* The above line use to have a TRUE in it */ } } static void construct_both(Sentence sent) { int w; if (!sentence_contains(sent, "both")) return; for (w=0; wlength; w++) { if (strcmp(sent->word[w].string, "both") != 0) continue; sent->word[w].d = catenate_disjuncts( special_disjunct(BOTH_LABEL,'+',"", "both"), sent->word[w].d); } for (w=0; wlength; w++) { if (strcmp(sent->word[w].string, "and") != 0) continue; sent->word[w].d = glom_aux_connector(sent->word[w].d, BOTH_LABEL, FALSE); } } void install_special_conjunctive_connectors(Sentence sent) { construct_either(sent); /* special connectors for "either" */ construct_neither(sent); /* special connectors for "neither" */ construct_notonlybut(sent); /* special connectors for "not..but.." */ /* and "not only..but.." */ construct_both(sent); /* special connectors for "both..and.." */ construct_comma(sent); /* special connectors for extra comma */ } link-grammar-4.7.4/link-grammar/spellcheck.h0000644000175000017500000000305711357144415017772 0ustar bloombloom/*************************************************************************/ /* Copyright (c) 2009 Linas Vepstas */ /* All rights reserved */ /* */ /* Use of the link grammar parsing system is subject to the terms of the */ /* license set forth in the LICENSE file included with this software, */ /* and also available at http://www.link.cs.cmu.edu/link/license.html */ /* This license allows free redistribution and use in source and binary */ /* forms, with or without modification, subject to certain conditions. */ /* */ /*************************************************************************/ #if (defined HAVE_HUNSPELL) || (defined HAVE_ASPELL) void * spellcheck_create(const char * lang); void spellcheck_destroy(void *); int spellcheck_test(void *, const char * word); int spellcheck_suggest(void * chk, char ***sug, const char * word); void spellcheck_free_suggest(char **sug, int size); #else #include "utilities.h" /* For MSVC inline portability */ static inline void * spellcheck_create(const char * lang) { return NULL; } static inline void spellcheck_destroy(void * chk) {} static inline int spellcheck_test(void * chk, const char * word) { return 0; } static inline int spellcheck_suggest(void * chk, char ***sug, const char * word) { return 0; } static inline void spellcheck_free_suggest(char **sug, int size) {} #endif link-grammar-4.7.4/link-grammar/print.h0000644000175000017500000000213711035441747017010 0ustar bloombloom/*************************************************************************/ /* Copyright (c) 2004 */ /* Daniel Sleator, David Temperley, and John Lafferty */ /* All rights reserved */ /* */ /* Use of the link grammar parsing system is subject to the terms of the */ /* license set forth in the LICENSE file included with this software, */ /* and also available at http://www.link.cs.cmu.edu/link/license.html */ /* This license allows free redistribution and use in source and binary */ /* forms, with or without modification, subject to certain conditions. */ /* */ /*************************************************************************/ void print_disjunct_counts(Sentence sent); void print_sentence(FILE *fp, Sentence sent, int w); void print_expression_sizes(Sentence sent); void compute_chosen_words(Sentence sent, Linkage linkage); link-grammar-4.7.4/link-grammar/command-line.c0000644000175000017500000003422111526022265020204 0ustar bloombloom/*************************************************************************/ /* Copyright (c) 2004 */ /* Daniel Sleator, David Temperley, and John Lafferty */ /* Copyright (c) 2008, 2009, 2011 Linas Vepstas */ /* All rights reserved */ /* */ /* Use of the link grammar parsing system is subject to the terms of the */ /* license set forth in the LICENSE file included with this software, */ /* and also available at http://www.link.cs.cmu.edu/link/license.html */ /* This license allows free redistribution and use in source and binary */ /* forms, with or without modification, subject to certain conditions. */ /* */ /*************************************************************************/ #include #include #include #include "utilities.h" // For MSWindows portability static struct { int verbosity; int timeout; int memory; int linkage_limit; int null_block; int islands_ok; int spell_guess; int short_length; int batch_mode; int panic_mode; int allow_null; int use_cluster_disjuncts; int use_fat_links; int use_sat_solver; int echo_on; int cost_model; float max_cost; int screen_width; int display_on; int display_constituents; int max_sentence_length; int display_postscript; int display_bad; int display_links; int display_walls; int display_union; int display_disjuncts; int display_senses; } local; typedef enum { Int, Bool, Float, } ParamType; typedef struct { const char *string; ParamType param_type; const char *description; void *ptr; } Switch; static Switch default_switches[] = { {"bad", Bool, "Display of bad linkages", &local.display_bad}, {"batch", Bool, "Batch mode", &local.batch_mode}, {"cluster", Bool, "Use clusters to loosen parsing", &local.use_cluster_disjuncts}, {"constituents", Int, "Generate constituent output", &local.display_constituents}, {"cost-model", Int, "Cost model used for ranking", &local.cost_model}, {"cost-max", Float, "Largest cost to be considered", &local.max_cost}, {"disjuncts", Bool, "Display of disjunct used", &local.display_disjuncts}, {"echo", Bool, "Echoing of input sentence", &local.echo_on}, {"graphics", Bool, "Graphical display of linkage", &local.display_on}, {"islands-ok", Bool, "Use of null-linked islands", &local.islands_ok}, {"limit", Int, "The maximum linkages processed", &local.linkage_limit}, {"links", Bool, "Display of complete link data", &local.display_links}, {"max-length", Int, "Maximum sentence length", &local.max_sentence_length}, {"memory", Int, "Max memory allowed", &local.memory}, {"null", Bool, "Allow null links", &local.allow_null}, {"null-block", Int, "Size of blocks with null count 1", &local.null_block}, {"panic", Bool, "Use of \"panic mode\"", &local.panic_mode}, {"postscript", Bool, "Generate postscript output", &local.display_postscript}, {"senses", Bool, "Display of word senses", &local.display_senses}, {"short", Int, "Max length of short links", &local.short_length}, #if defined HAVE_HUNSPELL || defined HAVE_ASPELL {"spell", Bool, "Use spell-guesser for unknown words", &local.spell_guess}, #endif /* HAVE_HUNSPELL */ {"timeout", Int, "Abort parsing after this many seconds", &local.timeout}, {"union", Bool, "Display of 'union' linkage", &local.display_union}, {"use-fat", Bool, "Use fat links when parsing", &local.use_fat_links}, #ifdef USE_SAT_SOLVER {"use-sat", Bool, "Use Boolean SAT-based parser", &local.use_sat_solver}, #endif /* USE_SAT_SOLVER */ {"verbosity", Int, "Level of detail in output", &local.verbosity}, {"walls", Bool, "Display wall words", &local.display_walls}, {"width", Int, "The width of the display", &local.screen_width}, {NULL, Bool, NULL, NULL} }; struct {const char * s; const char * str;} user_command[] = { {"variables", "List user-settable variables and their functions"}, {"help", "List the commands and what they do"}, {"file", "Read input from the specified filename"}, {NULL, NULL} }; /** * Gets rid of all the white space in the string s. Changes s */ static void clean_up_string(char * s) { char * x, * y; wchar_t p; size_t len, w; mbstate_t state; memset (&state, 0, sizeof(mbstate_t)); len = strlen(s); y = x = s; while(*x != '\0') { w = mbrtowc(&p, x, len, &state); if (0 == w) break; len -= w; if (!iswspace(p)) { while(w) { *y = *x; x++; y++; w--; } } else { x += w; } } *y = '\0'; } /** * Return TRUE if s points to a number: * optional + or - followed by 1 or more * digits. */ static int is_numerical_rhs(char *s) { wchar_t p; size_t len, w; mbstate_t state; memset (&state, 0, sizeof(mbstate_t)); len = strlen(s); if (*s=='+' || *s == '-') s++; if (*s == '\0') return FALSE; for (; *s != '\0'; s+=w) { w = mbrtowc(&p, s, len, &state); if (0 == w) break; len -= w; if(!iswdigit(p)) return FALSE; } return TRUE; } static inline int ival(Switch s) { return *((int *) s.ptr); } static inline void setival(Switch s, int val) { *((int *) s.ptr) = val; } static int x_issue_special_command(const char * line, Parse_Options opts, Dictionary dict) { char *s, myline[1000], *x, *y; int i, count, j, k; Switch * as = default_switches; strncpy(myline, line, sizeof(myline)); myline[sizeof(myline)-1] = '\0'; clean_up_string(myline); s = myline; j = k = -1; count = 0; /* Look for boolean flippers */ for (i=0; as[i].string != NULL; i++) { if ((Bool == as[i].param_type) && strncasecmp(s, as[i].string, strlen(s)) == 0) { count++; j = i; } } /* Look for abbreviations */ for (i=0; user_command[i].s != NULL; i++) { if (strncasecmp(s, user_command[i].s, strlen(s)) == 0) { count++; k = i; } } if (count > 1) { printf("Ambiguous command. Type \"!help\" or \"!variables\"\n"); return -1; } else if (count == 1) { /* flip boolean value */ if (j >= 0) { setival(as[j], (0 == ival(as[j]))); printf("%s turned %s.\n", as[j].description, (ival(as[j]))? "on" : "off"); return 0; } else { /* Found an abbreviated command, but it wasn't a boolean */ /* Replace the abbreviated command by the full one */ /* Basically, this just fixes !v and !h for use below. */ strcpy(s, user_command[k].s); } } if (strcmp(s, "variables") == 0) { printf(" Variable Controls Value\n"); printf(" -------- -------- -----\n"); for (i = 0; as[i].string != NULL; i++) { printf(" "); left_print_string(stdout, as[i].string, " "); left_print_string(stdout, as[i].description, " "); if (Float == as[i].param_type) { /* Float point print! */ printf("%5.2f", (double) (*((float *)as[i].ptr))); } else { printf("%5d", ival(as[i])); } if (Bool == as[i].param_type) { if (ival(as[i])) printf(" (On)"); else printf(" (Off)"); } printf("\n"); } printf("\n"); printf("Toggle a boolean variable as in \"!batch\"; "); printf("set a variable as in \"!width=100\".\n"); return 0; } if (strcmp(s, "help") == 0) { printf("Special commands always begin with \"!\". Command and variable names\n"); printf("can be abbreviated. Here is a list of the commands:\n\n"); for (i=0; user_command[i].s != NULL; i++) { printf(" !"); left_print_string(stdout, user_command[i].s, " "); left_print_string(stdout, user_command[i].str, " "); printf("\n"); } printf(" !! Print all the dictionary words matching .\n"); printf(" Also print the number of disjuncts of each.\n"); printf("\n"); printf(" ! Toggle the specified boolean variable.\n"); printf(" != Assign that value to that variable.\n"); return 0; } if (s[0] == '!') { dict_display_word_info(dict, s+1); dict_display_word_expr(dict, s+1); return 0; } /* Test here for an equation i.e. does the command line hold an equals sign? */ for (x=s; (*x != '=') && (*x != '\0') ; x++) ; if (*x == '=') { *x = '\0'; y = x+1; x = s; /* now x is the first word and y is the rest */ /* Figure out which command it is .. it'll be the j'th one */ j = -1; for (i=0; as[i].string != NULL; i++) { if (strncasecmp(x, as[i].string, strlen(x)) == 0) { j = i; count ++; } } if (j<0) { printf("There is no user variable called \"%s\".\n", x); return -1; } if (count > 1) { printf("Ambiguous variable. Type \"!help\" or \"!variables\"\n"); return -1; } if (as[j].param_type != Float) { int val = -1; if (is_numerical_rhs(y)) val = atoi(y); if ((0 == strcasecmp(y, "true")) || (0 == strcasecmp(y, "t"))) val = 1; if ((0 == strcasecmp(y, "false")) || (0 == strcasecmp(y, "f"))) val = 0; if (val < 0) { printf("Invalid value %s for variable %s Type \"!help\" or \"!variables\"\n", y, as[j].string); return -1; } setival(as[j], val); printf("%s set to %d\n", as[j].string, val); return 0; } else { float val = -1.0; val = atof(y); if (val < 0.0f) { printf("Invalid value %s for variable %s Type \"!help\" or \"!variables\"\n", y, as[j].string); return -1; } *((float *) as[j].ptr) = val; printf("%s set to %5.2f\n", as[j].string, val); return 0; } } /* Look for valid commands, but ones that needed an argument */ j = -1; count = 0; for (i = 0; as[i].string != NULL; i++) { if ((Bool != as[i].param_type) && strncasecmp(s, as[i].string, strlen(s)) == 0) { j = i; count++; } } if (0 < count) { printf("Variable \"%s\" requires a value. Try \"!help\".\n", as[j].string); return -1; } printf("I can't interpret \"%s\" as a command. Try \"!help\".\n", myline); return -1; } static void put_opts_in_local_vars(Parse_Options opts) { local.verbosity = parse_options_get_verbosity(opts); local.timeout = parse_options_get_max_parse_time(opts);; local.memory = parse_options_get_max_memory(opts);; local.linkage_limit = parse_options_get_linkage_limit(opts); local.null_block = parse_options_get_null_block(opts); local.islands_ok = parse_options_get_islands_ok(opts); local.spell_guess = parse_options_get_spell_guess(opts); local.short_length = parse_options_get_short_length(opts); local.cost_model = parse_options_get_cost_model_type(opts); local.max_cost = parse_options_get_disjunct_costf(opts); local.echo_on = parse_options_get_echo_on(opts); local.batch_mode = parse_options_get_batch_mode(opts); local.panic_mode = parse_options_get_panic_mode(opts); local.screen_width = parse_options_get_screen_width(opts); local.allow_null = parse_options_get_allow_null(opts); local.use_cluster_disjuncts = parse_options_get_use_cluster_disjuncts(opts); local.use_fat_links = parse_options_get_use_fat_links(opts); local.use_sat_solver = parse_options_get_use_sat_parser(opts); local.screen_width = parse_options_get_screen_width(opts); local.display_on = parse_options_get_display_on(opts); local.display_postscript = parse_options_get_display_postscript(opts); local.display_constituents = parse_options_get_display_constituents(opts); local.max_sentence_length = parse_options_get_max_sentence_length(opts); local.display_bad = parse_options_get_display_bad(opts); local.display_disjuncts = parse_options_get_display_disjuncts(opts); local.display_links = parse_options_get_display_links(opts); local.display_senses = parse_options_get_display_senses(opts); local.display_walls = parse_options_get_display_walls(opts); local.display_union = parse_options_get_display_union(opts); } static void put_local_vars_in_opts(Parse_Options opts) { parse_options_set_verbosity(opts, local.verbosity); parse_options_set_max_parse_time(opts, local.timeout); parse_options_set_max_memory(opts, local.memory); parse_options_set_linkage_limit(opts, local.linkage_limit); parse_options_set_null_block(opts, local.null_block); parse_options_set_islands_ok(opts, local.islands_ok); parse_options_set_spell_guess(opts, local.spell_guess); parse_options_set_short_length(opts, local.short_length); parse_options_set_echo_on(opts, local.echo_on); parse_options_set_cost_model_type(opts, local.cost_model); parse_options_set_disjunct_costf(opts, local.max_cost); parse_options_set_batch_mode(opts, local.batch_mode); parse_options_set_panic_mode(opts, local.panic_mode); parse_options_set_screen_width(opts, local.screen_width); parse_options_set_allow_null(opts, local.allow_null); parse_options_set_use_cluster_disjuncts(opts, local.use_cluster_disjuncts); parse_options_set_use_fat_links(opts, local.use_fat_links); #ifdef USE_SAT_SOLVER parse_options_set_use_sat_parser(opts, local.use_sat_solver); #endif parse_options_set_screen_width(opts, local.screen_width); parse_options_set_display_on(opts, local.display_on); parse_options_set_display_postscript(opts, local.display_postscript); parse_options_set_display_constituents(opts, local.display_constituents); parse_options_set_max_sentence_length(opts, local.max_sentence_length); parse_options_set_display_bad(opts, local.display_bad); parse_options_set_display_disjuncts(opts, local.display_disjuncts); parse_options_set_display_links(opts, local.display_links); parse_options_set_display_senses(opts, local.display_senses); parse_options_set_display_walls(opts, local.display_walls); parse_options_set_display_union(opts, local.display_union); } int issue_special_command(const char * line, Parse_Options opts, Dictionary dict) { int rc; put_opts_in_local_vars(opts); rc = x_issue_special_command(line, opts, dict); put_local_vars_in_opts(opts); return rc; } link-grammar-4.7.4/link-grammar/.cvsignore0000644000175000017500000000012711002137363017466 0ustar bloombloomMakefile Makefile.in link-parser link-features.h svn-commit.tmp* .deps .libs *.la *.lo link-grammar-4.7.4/link-grammar/link-parser.c0000644000175000017500000005342611526022265020100 0ustar bloombloom/***************************************************************************/ /* Copyright (c) 2004 */ /* Daniel Sleator, David Temperley, and John Lafferty */ /* Copyright (c) 2008 Linas Vepstas */ /* All rights reserved */ /* */ /* Use of the link grammar parsing system is subject to the terms of the */ /* license set forth in the LICENSE file included with this software, */ /* and also available at http://www.link.cs.cmu.edu/link/license.html */ /* This license allows free redistribution and use in source and binary */ /* forms, with or without modification, subject to certain conditions. */ /* */ /***************************************************************************/ /**************************************************************************** * * This is a simple example of the link parser API. It similates most of * the functionality of the original link grammar parser, allowing sentences * to be typed in either interactively or in "batch" mode (if -batch is * specified on the command line, and stdin is redirected to a file). * The program: * Opens up a dictionary * Iterates: * 1. Reads from stdin to get an input string to parse * 2. Tokenizes the string to form a Sentence * 3. Tries to parse it with cost 0 * 4. Tries to parse with increasing cost * When a parse is found: * 1. Extracts each Linkage * 2. Passes it to process_some_linkages() * 3. Deletes linkage * After parsing each Sentence is deleted by making a call to * sentence_delete. * ****************************************************************************/ #include #include #include #include #include #include /* Used for terminal resizing */ #ifndef _WIN32 #include #include #include #include #endif #ifdef HAVE_EDITLINE #include #endif #ifdef _MSC_VER #define LINK_GRAMMAR_DLL_EXPORT 0 #endif #include #include #include #include "command-line.h" #include "expand.h" #define MAX_INPUT 1024 #define DISPLAY_MAX 1024 #define COMMENT_CHAR '%' /* input lines beginning with this are ignored */ static int batch_errors = 0; static int input_pending=FALSE; static Parse_Options opts; static Parse_Options panic_parse_opts; static int verbosity = 0; typedef enum { UNGRAMMATICAL='*', PARSE_WITH_DISJUNCT_COST_GT_0=':', /* Not used anywhere, currently ... */ NO_LABEL=' ' } Label; static char * fget_input_string(FILE *in, FILE *out, Parse_Options opts) { #ifdef HAVE_EDITLINE static char * pline = NULL; const char * prompt = "linkparser> "; if (in != stdin) { static char input_string[MAX_INPUT]; input_pending = FALSE; if (fgets(input_string, MAX_INPUT, in)) return input_string; return NULL; } if (input_pending && pline != NULL) { input_pending = FALSE; return pline; } if (parse_options_get_batch_mode(opts) || (verbosity == 0) || input_pending) { prompt = ""; } input_pending = FALSE; if (pline) free(pline); pline = readline(prompt); /* Save non-blank lines */ if (pline && *pline) { if (*pline) add_history(pline); } return pline; #else static char input_string[MAX_INPUT]; if ((!parse_options_get_batch_mode(opts)) && (verbosity > 0) && (!input_pending)) { fprintf(out, "linkparser> "); fflush(out); } input_pending = FALSE; /* For UTF-8 input, I think its still technically correct to * use fgets() and not fgetws() at this point. */ if (fgets(input_string, MAX_INPUT, in)) return input_string; else return NULL; #endif } static int fget_input_char(FILE *in, FILE *out, Parse_Options opts) { #ifdef HAVE_EDITLINE char * pline = fget_input_string(in, out, opts); if (NULL == pline) return EOF; if (*pline) { input_pending = TRUE; return *pline; } return '\n'; #else int c; if (!parse_options_get_batch_mode(opts) && (verbosity > 0)) fprintf(out, "linkparser> "); fflush(out); /* For UTF-8 input, I think its still technically correct to * use fgetc() and not fgetwc() at this point. */ c = fgetc(in); if (c != '\n') { ungetc(c, in); input_pending = TRUE; } return c; #endif } /************************************************************************** * * This procedure displays a linkage graphically. Since the diagrams * are passed as character strings, they need to be deleted with a * call to free. * **************************************************************************/ static void process_linkage(Linkage linkage, Parse_Options opts) { char * string; int j, mode, first_sublinkage; int nlink; if (!linkage) return; /* Can happen in timeout mode */ if (parse_options_get_use_fat_links(opts) && parse_options_get_display_union(opts)) { linkage_compute_union(linkage); first_sublinkage = linkage_get_num_sublinkages(linkage)-1; } else { first_sublinkage = 0; } nlink = linkage_get_num_sublinkages(linkage); for (j=first_sublinkage; j 0) { if (sentence_num_linkages_found(sent) > parse_options_get_linkage_limit(opts)) { fprintf(stdout, "Found %d linkage%s (%d of %d random " \ "linkages had no P.P. violations)", sentence_num_linkages_found(sent), sentence_num_linkages_found(sent) == 1 ? "" : "s", sentence_num_valid_linkages(sent), sentence_num_linkages_post_processed(sent)); } else { fprintf(stdout, "Found %d linkage%s (%d had no P.P. violations)", sentence_num_linkages_post_processed(sent), sentence_num_linkages_found(sent) == 1 ? "" : "s", sentence_num_valid_linkages(sent)); } if (sentence_null_count(sent) > 0) { fprintf(stdout, " at null count %d", sentence_null_count(sent)); } fprintf(stdout, "\n"); } } static int process_some_linkages(Sentence sent, Parse_Options opts) { int c; int i, num_to_query, num_to_display, num_displayed; Linkage linkage; double corpus_cost; if (verbosity > 0) print_parse_statistics(sent, opts); num_to_query = MIN(sentence_num_linkages_post_processed(sent), DISPLAY_MAX); if (!parse_options_get_display_bad(opts)) { num_to_display = MIN(sentence_num_valid_linkages(sent), DISPLAY_MAX); } else { num_to_display = MIN(sentence_num_linkages_post_processed(sent), DISPLAY_MAX); } for (i=0, num_displayed=0; i 0) && (!parse_options_get_display_bad(opts))) { continue; } linkage = linkage_create(i, sent, opts); /* Currently, sat solver returns NULL when there ain't no more */ if (!linkage) break; if (verbosity > 0) { if ((sentence_num_valid_linkages(sent) == 1) && (!parse_options_get_display_bad(opts))) { fprintf(stdout, " Unique linkage, "); } else if ((parse_options_get_display_bad(opts)) && (sentence_num_violations(sent, i) > 0)) { fprintf(stdout, " Linkage %d (bad), ", num_displayed+1); } else { fprintf(stdout, " Linkage %d, ", num_displayed+1); } if (!linkage_is_canonical(linkage)) { fprintf(stdout, "non-canonical, "); } if (linkage_is_improper(linkage)) { fprintf(stdout, "improper fat linkage, "); } if (linkage_has_inconsistent_domains(linkage)) { fprintf(stdout, "inconsistent domains, "); } corpus_cost = linkage_corpus_cost(linkage); if (corpus_cost < 0.0f) { fprintf(stdout, "cost vector = (UNUSED=%d DIS=%d FAT=%d AND=%d LEN=%d)\n", linkage_unused_word_cost(linkage), linkage_disjunct_cost(linkage), linkage_is_fat(linkage), linkage_and_cost(linkage), linkage_link_cost(linkage)); } else { fprintf(stdout, "cost vector = (CORP=%6.4f UNUSED=%d DIS=%d FAT=%d AND=%d LEN=%d)\n", corpus_cost, linkage_unused_word_cost(linkage), linkage_disjunct_cost(linkage), linkage_is_fat(linkage), linkage_and_cost(linkage), linkage_link_cost(linkage)); } } process_linkage(linkage, opts); linkage_delete(linkage); if (++num_displayed < num_to_display) { if (verbosity > 0) { fprintf(stdout, "Press RETURN for the next linkage.\n"); } c = fget_input_char(stdin, stdout, opts); if (c != '\n') return c; } else { break; } } return 'x'; } static int there_was_an_error(Label label, Sentence sent, Parse_Options opts) { if (sentence_num_valid_linkages(sent) > 0) { if (label == UNGRAMMATICAL) { batch_errors++; return UNGRAMMATICAL; } if ((sentence_disjunct_cost(sent, 0) == 0) && (label == PARSE_WITH_DISJUNCT_COST_GT_0)) { batch_errors++; return PARSE_WITH_DISJUNCT_COST_GT_0; } } else { if (label != UNGRAMMATICAL) { batch_errors++; return UNGRAMMATICAL; } } return FALSE; } static void batch_process_some_linkages(Label label, Sentence sent, Parse_Options opts) { Linkage linkage; if (there_was_an_error(label, sent, opts)) { /* Note: sentence_num_linkages_found returns total linkages * not valid linkages. So the printed linkage might be bad... */ if (sentence_num_linkages_found(sent) > 0) { linkage = linkage_create(0, sent, opts); process_linkage(linkage, opts); linkage_delete(linkage); } fprintf(stdout, "+++++ error %d\n", batch_errors); } } static int special_command(char *input_string, Dictionary dict) { if (input_string[0] == '\n') return TRUE; if (input_string[0] == COMMENT_CHAR) return TRUE; if (input_string[0] == '!') { if (strncmp(input_string, "!panic_", 7) == 0) { issue_special_command(input_string+7, panic_parse_opts, dict); return TRUE; } issue_special_command(input_string+1, opts, dict); return TRUE; } return FALSE; } static Label strip_off_label(char * input_string) { Label c; c = (Label) input_string[0]; switch(c) { case UNGRAMMATICAL: case PARSE_WITH_DISJUNCT_COST_GT_0: input_string[0] = ' '; return c; case NO_LABEL: default: return NO_LABEL; } } static void setup_panic_parse_options(Parse_Options opts) { parse_options_set_disjunct_costf(opts, 3.0f); parse_options_set_min_null_count(opts, 1); parse_options_set_max_null_count(opts, MAX_SENTENCE); parse_options_set_max_parse_time(opts, 60); parse_options_set_use_fat_links(opts, 0); parse_options_set_islands_ok(opts, 1); parse_options_set_short_length(opts, 6); parse_options_set_all_short_connectors(opts, 1); parse_options_set_linkage_limit(opts, 100); parse_options_set_spell_guess(opts, FALSE); } static void print_usage(char *str) { fprintf(stderr, "Usage: %s [language|dictionary location]\n" " [-]\n" " [--version]\n", str); fprintf(stderr, "\nSpecial commands are:\n"); opts = parse_options_create(); issue_special_command("var", opts, NULL); exit(-1); } /** * On Unix, this checks for the current window size, * and sets the output screen width accordingly. * Not sure how MS Windows does this. */ static void check_winsize(Parse_Options popts) { /* Neither windows nor MSYS have the ioctl support needed for this. */ #ifdef _WIN32 parse_options_set_screen_width(popts, 79); #else struct winsize ws; int fd = open("/dev/tty", O_RDWR); if (0 != ioctl(fd, TIOCGWINSZ, &ws)) { perror("ioctl(/dev/tty, TIOCGWINSZ)"); close(fd); return; } close(fd); /* printf("rows %i\n", ws.ws_row); */ /* printf("cols %i\n", ws.ws_col); */ /* Set the screen width only if the returned value seems * rational: its positive and not insanely tiny. */ if ((10 < ws.ws_col) && (16123 > ws.ws_col)) { parse_options_set_screen_width(popts, ws.ws_col - 1); } #endif /* _WIN32 */ } int main(int argc, char * argv[]) { FILE *input_fh = stdin; Dictionary dict; const char *language="en"; /* default to english, and not locale */ int num_linkages, i; Label label = NO_LABEL; const char *codeset; #if LATER /* Try to catch the SIGNWINCH ... except this is not working. */ struct sigaction winch_act; winch_act.sa_handler = winch_handler; winch_act.sa_sigaction = NULL; sigemptyset (&winch_act.sa_mask); winch_act.sa_flags = 0; sigaction (SIGWINCH, &winch_act, NULL); #endif i = 1; if ((argc > 1) && (argv[1][0] != '-')) { /* the dictionary is the first argument if it doesn't begin with "-" */ language = argv[1]; i++; } /* Get the locale from the environment... * perhaps we should someday get it from the dictionary ?? */ setlocale(LC_ALL, ""); /* Check to make sure the current locale is UTF8; if its not, * then force-set this to the english utf8 locale */ codeset = nl_langinfo(CODESET); if (!strstr(codeset, "UTF") && !strstr(codeset, "utf")) { fprintf(stderr, "%s: Warning: locale %s was not UTF-8; force-setting to en_US.UTF-8\n", argv[0], codeset); setlocale(LC_CTYPE, "en_US.UTF-8"); } for (; i parse_options_get_max_sentence_length(opts)) { if (verbosity > 0) { fprintf(stdout, "Sentence length (%d words) exceeds maximum allowable (%d words)\n", sentence_length(sent), parse_options_get_max_sentence_length(opts)); } sentence_delete(sent); sent = NULL; continue; } /* First parse with cost 0 or 1 and no null links */ // parse_options_set_disjunct_costf(opts, 2.0f); parse_options_set_min_null_count(opts, 0); parse_options_set_max_null_count(opts, 0); parse_options_reset_resources(opts); num_linkages = sentence_parse(sent, opts); if (num_linkages < 0) { sentence_delete(sent); sent = NULL; continue; } #if 0 /* Try again, this time ommitting the requirement for * definite articles, etc. This should allow for the parsing * of newspaper headlines and other clipped speech. * * XXX Unfortunately, this also allows for the parsing of * all sorts of ungrammatical sentences which should not * parse, and leads to bad parses of many other unparsable * but otherwise grammatical sentences. Thus, this trick * pretty much fails; we leave it here to document the * experiment. */ if (num_linkages == 0) { parse_options_set_disjunct_costf(opts, 3.5f); num_linkages = sentence_parse(sent, opts); if (num_linkages < 0) continue; } #endif /* Try using a larger list of disjuncts */ if ((num_linkages == 0) && parse_options_get_use_cluster_disjuncts(opts)) { int expanded; if (verbosity > 0) fprintf(stdout, "No standard linkages, expanding disjunct set.\n"); parse_options_set_disjunct_costf(opts, 2.9f); expanded = lg_expand_disjunct_list(sent); if (expanded) { num_linkages = sentence_parse(sent, opts); } if (0 < num_linkages) printf("Got One !!!!!!!!!!!!!!!!!\n"); } /* If asked to show bad linkages, then show them. */ if ((num_linkages == 0) && (!parse_options_get_batch_mode(opts))) { if (parse_options_get_display_bad(opts)) { num_linkages = sentence_num_linkages_found(sent); } } /* Now parse with null links */ if ((num_linkages == 0) && (!parse_options_get_batch_mode(opts))) { if (verbosity > 0) fprintf(stdout, "No complete linkages found.\n"); if (parse_options_get_allow_null(opts)) { /* XXX should use expanded disjunct list here too */ parse_options_set_min_null_count(opts, 1); parse_options_set_max_null_count(opts, sentence_length(sent)); num_linkages = sentence_parse(sent, opts); } } if (parse_options_timer_expired(opts)) { if (verbosity > 0) fprintf(stdout, "Timer is expired!\n"); } if (parse_options_memory_exhausted(opts)) { if (verbosity > 0) fprintf(stdout, "Memory is exhausted!\n"); } if ((num_linkages == 0) && parse_options_resources_exhausted(opts) && parse_options_get_panic_mode(opts)) { /* print_total_time(opts); */ batch_errors++; if (verbosity > 0) fprintf(stdout, "Entering \"panic\" mode...\n"); parse_options_reset_resources(panic_parse_opts); parse_options_set_verbosity(panic_parse_opts, verbosity); num_linkages = sentence_parse(sent, panic_parse_opts); if (parse_options_timer_expired(panic_parse_opts)) { if (verbosity > 0) fprintf(stdout, "Timer is expired!\n"); } } /* print_total_time(opts); */ if (parse_options_get_batch_mode(opts)) { batch_process_some_linkages(label, sent, opts); } else { int c = process_some_linkages(sent, opts); if (c == EOF) { sentence_delete(sent); sent = NULL; break; } } fflush(stdout); sentence_delete(sent); sent = NULL; } if (parse_options_get_batch_mode(opts)) { /* print_time(opts, "Total"); */ fprintf(stderr, "%d error%s.\n", batch_errors, (batch_errors==1) ? "" : "s"); } /* Free stuff, so that mem-leak detectors don't commplain. */ parse_options_delete(panic_parse_opts); parse_options_delete(opts); dictionary_delete(dict); printf ("Bye.\n"); return 0; } link-grammar-4.7.4/link-grammar/autoit/0000755000175000017500000000000011531775721017010 5ustar bloombloomlink-grammar-4.7.4/link-grammar/autoit/_LinkGrammar.au30000644000175000017500000006025211526022265021762 0ustar bloombloomGlobal $_LG_DLL = DllOpen("link-grammar.dll") Func _LG_GetVersion() ;const char * linkgrammar_get_version(void); $result = DllCall($_LG_DLL, "str:cdecl", "linkgrammar_get_version") Return $result[0] EndFunc ;==>_LG_GetVersion Func _LG_DictionaryCreateDefault() ;Dictionary dictionary_create_default_lang(void); $result = DllCall($_LG_DLL, "ptr:cdecl", "dictionary_create_default_lang") Return $result[0] EndFunc ;==>_LG_DictionaryCreateDefault Func _LG_DictionaryCreateLang($sLanguage) ;Dictionary dictionary_create_lang(const char * lang); $result = DllCall($_LG_DLL, "ptr:cdecl", "dictionary_create_lang", "str", $sLanguage) Return $result[0] EndFunc ;==>_LG_DictionaryCreateLang ;Func _LG_Dictionary_Create($sDictName, $sPostProcessFileName, $sConstituentKnowledgeName, $sAffixName) ;Dictionary dictionary_create(const char *dict_name, ; const char *post_process_file_name, ; const char *constituent_knowledge_name, ; const char *affix_name);EndFunc ;EndFunc Func _LG_DictionaryDelete($hDictionary) ;int dictionary_delete(Dictionary dict); DllCall($_LG_DLL, "none:cdecl", "dictionary_delete", "ptr", $hDictionary) EndFunc ;==>_LG_DictionaryDelete Func _LG_DictionarySetData($sPath) ;void dictionary_set_data_dir(const char * path); DllCall($_LG_DLL, "none:cdecl", "dictionary_set_data_dir", "str", $sPath) EndFunc ;==>_LG_DictionarySetData Func _LG_DictionaryGetDataDir() ;const char * dictionary_get_data_dir(void); $result = DllCall($_LG_DLL, "str:cdecl", "dictionary_get_data_dir") Return $result[0] EndFunc ;==>_LG_DictionaryGetDataDir Func _LG_DictionaryGetMaxCost($hDictionary) ;int dictionary_get_max_cost(Dictionary dict); $result = DllCall($_LG_DLL, "int:cdecl", "dictionary_get_max_cost", "ptr", $hDictionary) Return $result[0] EndFunc ;==>_LG_DictionaryGetMaxCost Func _LG_ParseOptionsCreate() ;Parse_Options parse_options_create(); $result = DllCall($_LG_DLL, "ptr:cdecl", "parse_options_create") Return $result[0] EndFunc ;==>_LG_ParseOptionsCreate Func _LG_ParseOptionsDelete($hOptions) ;int parse_options_delete(Parse_Options opts); DllCall($_LG_DLL, "none:cdecl", "parse_options_delete", "ptr", $hOptions) EndFunc ;==>_LG_ParseOptionsDelete Func _LG_ParseOptionsSetVerbosity($hOptions, $iVerbosity) ;void parse_options_set_verbosity(Parse_Options opts, int verbosity); DllCall($_LG_DLL, "none:cdecl", "parse_options_set_verbosity", "ptr", $hOptions, "int", $iVerbosity) EndFunc ;==>_LG_ParseOptionsSetVerbosity Func _LG_ParseOptionsGetVerbosity($hOptions) ;int parse_options_get_verbosity(Parse_Options opts); $result = DllCall($_LG_DLL, "int:cdecl", "parse_options_get_verbosity", "ptr", $hOptions) Return $result[0] EndFunc ;==>_LG_ParseOptionsGetVerbosity Func _LG_ParseOptionsSetLinkageLimit($hOptions, $iLinkageLimit) ;void parse_options_set_linkage_limit(Parse_Options opts, int linkage_limit); DllCall($_LG_DLL, "none:cdecl", "parse_options_set_linkage_limit", "ptr", $hOptions, "int", $iLinkageLimit) EndFunc ;==>_LG_ParseOptionsSetLinkageLimit Func _LG_ParseOptionsGetLinkageLimit($hOptions) ;int parse_options_get_linkage_limit(Parse_Options opts); $result = DllCall($_LG_DLL, "int:cdecl", "parse_options_get_linkage_limit", "ptr", $hOptions) Return $result[0] EndFunc ;==>_LG_ParseOptionsGetLinkageLimit Func _LG_ParseOptionsSetDisjunctCost($hOptions, $iDisjunctCost) ;void parse_options_set_disjunct_cost(Parse_Options opts, int disjunct_cost); DllCall($_LG_DLL, "none:cdecl", "parse_options_set_disjunct_cost", "ptr", $hOptions, "int", $iDisjunctCost) EndFunc ;==>_LG_ParseOptionsSetDisjunctCost Func _LG_ParseOptionsGetDisjunctCost($hOptions) ;int parse_options_get_disjunct_cost(Parse_Options opts); $result = DllCall($_LG_DLL, "int:cdecl", "parse_options_get_disjunct_cost", "ptr", $hOptions) Return $result[0] EndFunc ;==>_LG_ParseOptionsGetDisjunctCost Func _LG_ParseOptionsSetMinNullCount($hOptions, $iNullCount) ;void parse_options_set_min_null_count(Parse_Options opts, int null_count); DllCall($_LG_DLL, "none:cdecl", "parse_options_set_min_null_count", "ptr", $hOptions, "int", $iNullCount) EndFunc ;==>_LG_ParseOptionsSetMinNullCount Func _LG_ParseOptionsGetMinNullCount($hOptions) ;int parse_options_get_min_null_count(Parse_Options opts); $result = DllCall($_LG_DLL, "int:cdecl", "parse_options_get_min_null_count", "ptr", $hOptions) Return $result[0] EndFunc ;==>_LG_ParseOptionsGetMinNullCount Func _LG_ParseOptionsSetMaxNullCount($hOptions, $iNullCount) ;void parse_options_set_max_null_count(Parse_Options opts, int null_count); DllCall($_LG_DLL, "none:cdecl", "parse_options_set_max_null_count", "ptr", $hOptions, "int", $iNullCount) EndFunc ;==>_LG_ParseOptionsSetMaxNullCount Func _LG_ParseOptionsGetMaxNullCount($hOptions) ;int parse_options_get_max_null_count(Parse_Options opts); $result = DllCall($_LG_DLL, "int:cdecl", "parse_options_get_max_null_count", "ptr", $hOptions) Return $result[0] EndFunc ;==>_LG_ParseOptionsGetMaxNullCount Func _LG_ParseOptionsSetNullBlock($hOptions, $iNullBlock) ;void parse_options_set_null_block(Parse_Options opts, int null_block); DllCall($_LG_DLL, "none:cdecl", "parse_options_set_null_block", "ptr", $hOptions, "int", $iNullBlock) EndFunc ;==>_LG_ParseOptionsSetNullBlock Func _LG_ParseOptionsGetNullBlock($hOptions) ;int parse_options_get_null_block(Parse_Options opts); $result = DllCall($_LG_DLL, "int:cdecl", "parse_options_get_null_block", "ptr", $hOptions) Return $result[0] EndFunc ;==>_LG_ParseOptionsGetNullBlock Func _LG_ParseOptionsSetShortLength($hOptions, $iShortLength) ;void parse_options_set_short_length(Parse_Options opts, int short_length); DllCall($_LG_DLL, "none:cdecl", "parse_options_set_short_length", "ptr", $hOptions, "int", $iShortLength) EndFunc ;==>_LG_ParseOptionsSetShortLength Func _LG_ParseOptionsGetShortLength($hOptions) ;int parse_options_get_short_length(Parse_Options opts); $result = DllCall($_LG_DLL, "int:cdecl", "parse_options_get_short_length", "ptr", $hOptions) Return $result[0] EndFunc ;==>_LG_ParseOptionsGetShortLength Func _LG_ParseOptionsSetIslandsOk($hOptions, $iIslandsOk) ;void parse_options_set_islands_ok(Parse_Options opts, int islands_ok); DllCall($_LG_DLL, "none:cdecl", "parse_options_set_islands_ok", "ptr", $hOptions, "int", $iIslandsOk) EndFunc ;==>_LG_ParseOptionsSetIslandsOk Func _LG_ParseOptionsGetIslandsOk($hOptions) ;int parse_options_get_islands_ok(Parse_Options opts); $result = DllCall($_LG_DLL, "int:cdecl", "parse_options_get_islands_ok", "ptr", $hOptions) Return $result[0] EndFunc ;==>_LG_ParseOptionsGetIslandsOk Func _LG_ParseOptionsSetMaxParseTime($hOptions, $iSeconds) ;void parse_options_set_max_parse_time(Parse_Options opts, int secs); DllCall($_LG_DLL, "none:cdecl", "parse_options_set_max_parse_time", "ptr", $hOptions, "int", $iSeconds) EndFunc ;==>_LG_ParseOptionsSetMaxParseTime Func _LG_ParseOptionsGetMaxParseTime($hOptions) ;int parse_options_get_max_parse_time(Parse_Options opts); $result = DllCall($_LG_DLL, "int:cdecl", "parse_options_get_max_parse_time", "ptr", $hOptions) Return $result[0] EndFunc ;==>_LG_ParseOptionsGetMaxParseTime Func _LG_ParseOptionsSetMaxMemory($hOptions, $iMemory) ;void parse_options_set_max_memory(Parse_Options opts, int mem); DllCall($_LG_DLL, "none:cdecl", "parse_options_set_max_memory", "ptr", $hOptions, "int", $iMemory) EndFunc ;==>_LG_ParseOptionsSetMaxMemory Func _LG_ParseOptionsGetMaxMemory($hOptions) ;int parse_options_get_max_memory(Parse_Options opts); $result = DllCall($_LG_DLL, "int:cdecl", "parse_options_get_max_memory", "ptr", $hOptions) Return $result[0] EndFunc ;==>_LG_ParseOptionsGetMaxMemory Func _LG_ParseOptionsTimerExpired($hOptions) ;int parse_options_timer_expired(Parse_Options opts); $result = DllCall($_LG_DLL, "int:cdecl", "parse_options_timer_expired", "ptr", $hOptions) Return $result[0] EndFunc ;==>_LG_ParseOptionsTimerExpired Func _LG_ParseOptionsMemoryExhausted($hOptions) ;int parse_options_memory_exhausted(Parse_Options opts); $result = DllCall($_LG_DLL, "int:cdecl", "parse_options_memory_exhausted", "ptr", $hOptions) Return $result[0] EndFunc ;==>_LG_ParseOptionsMemoryExhausted Func _LG_ParseOptionsResourcesExhausted($hOptions) ;int parse_options_resources_exhausted(Parse_Options opts); $result = DllCall($_LG_DLL, "int:cdecl", "parse_options_resources_exhausted", "ptr", $hOptions) Return $result[0] EndFunc ;==>_LG_ParseOptionsResourcesExhausted Func _LG_ParseOptionsResetResources($hOptions) ;void parse_options_reset_resources(Parse_Options opts); DllCall($_LG_DLL, "none:cdecl", "parse_options_reset_resources", "ptr", $hOptions) EndFunc ;==>_LG_ParseOptionsResetResources Func _LG_ParseOptionsSetCostModelType($hOptions, $iCostModel) ;void parse_options_set_cost_model_type(Parse_Options opts, int cm); DllCall($_LG_DLL, "none:cdecl", "parse_options_set_cost_model_type", "ptr", $hOptions, "int", $iCostModel) EndFunc ;==>_LG_ParseOptionsSetCostModelType Func _LG_ParseOptionsGetCostModelType($hOptions) ;int parse_options_get_cost_model_type(Parse_Options opts); $result = DllCall($_LG_DLL, "int:cdecl", "parse_options_get_cost_model_type", "ptr", $hOptions) Return $result[0] EndFunc ;==>_LG_ParseOptionsGetCostModelType Func _LG_ParseOptionsSetScreenWidth($hOptions, $iWidth) ;void parse_options_set_screen_width(Parse_Options opts, int val); DllCall($_LG_DLL, "none:cdecl", "parse_options_set_screen_width", "ptr", $hOptions, "int", $iWidth) EndFunc ;==>_LG_ParseOptionsSetScreenWidth Func _LG_ParseOptionsGetScreenWidth($hOptions) ;int parse_options_get_screen_width(Parse_Options opts); $result = DllCall($_LG_DLL, "int:cdecl", "parse_options_get_screen_width", "ptr", $hOptions) Return $result[0] EndFunc ;==>_LG_ParseOptionsGetScreenWidth Func _LG_ParseOptionsSetAllowNull($hOptions, $iAllowNull) ;void parse_options_set_allow_null(Parse_Options opts, int val); DllCall($_LG_DLL, "none:cdecl", "parse_options_set_allow_null", "ptr", $hOptions, "int", $iAllowNull) EndFunc ;==>_LG_ParseOptionsSetAllowNull Func _LG_ParseOptionsGetAllowNull($hOptions) ;int parse_options_get_allow_null(Parse_Options opts); $result = DllCall($_LG_DLL, "int:cdecl", "parse_options_get_allow_null", "ptr", $hOptions) Return $result[0] EndFunc ;==>_LG_ParseOptionsGetAllowNull Func _LG_ParseOptionsSetDisplayWalls($hOptions, $iDisplayWalls) ;void parse_options_set_display_walls(Parse_Options opts, int val); DllCall($_LG_DLL, "none:cdecl", "parse_options_set_display_walls", "ptr", $hOptions, "int", $iDisplayWalls) EndFunc ;==>_LG_ParseOptionsSetDisplayWalls Func _LG_ParseOptionsGetDisplayWalls($hOptions) ;int parse_options_get_display_walls(Parse_Options opts); $result = DllCall($_LG_DLL, "int:cdecl", "parse_options_get_display_walls", "ptr", $hOptions) Return $result[0] EndFunc ;==>_LG_ParseOptionsGetDisplayWalls Func _LG_ParseOptionsSetAllShortConnectors($hOptions, $iShortConnectors) ;void parse_options_set_all_short_connectors(Parse_Options opts, int val); DllCall($_LG_DLL, "none:cdecl", "parse_options_set_all_short_connectors", "ptr", $hOptions, "int", $iShortConnectors) EndFunc ;==>_LG_ParseOptionsSetAllShortConnectors Func _LG_ParseOptionsGetAllShortConnectors($hOptions) ;int parse_options_get_all_short_connectors(Parse_Options opts); $result = DllCall($_LG_DLL, "int:cdecl", "parse_options_get_all_short_connectors", "ptr", $hOptions) Return $result[0] EndFunc ;==>_LG_ParseOptionsGetAllShortConnectors Func _LG_SentenceCreate($sInputString, $hDictionary) ;Sentence sentence_create(const char *input_string, Dictionary dict); $result = DllCall($_LG_DLL, "ptr:cdecl", "sentence_create", "str", $sInputString, "ptr", $hDictionary) Return $result[0] EndFunc ;==>_LG_SentenceCreate Func _LG_SentenceDelete($hSentence) ;void sentence_delete(Sentence sent); DllCall($_LG_DLL, "none:cdecl", "sentence_delete", "ptr", $hSentence) EndFunc ;==>_LG_SentenceDelete Func _LG_SentenceSplit($hSentence, $hOptions) ;int sentence_split(Sentence sent, Parse_Options opts); DllCall($_LG_DLL, "none:cdecl", "sentence_split", "ptr", $hSentence, "ptr", $hOptions) EndFunc ;==>_LG_SentenceSplit Func _LG_SentenceParse($hSentence, $hOptions) ;int sentence_parse(Sentence sent, Parse_Options opts); $result = DllCall($_LG_DLL, "int:cdecl", "sentence_parse", "ptr", $hSentence, "ptr", $hOptions) Return $result[0] EndFunc ;==>_LG_SentenceParse Func _LG_SentenceLength($hSentence) ;int sentence_length(Sentence sent); $result = DllCall($_LG_DLL, "int:cdecl", "sentence_length", "ptr", $hSentence) Return $result[0] EndFunc ;==>_LG_SentenceLength Func _LG_SentenceGetWord($hSentence, $iWord) ;const char * sentence_get_word(Sentence sent, int w); $result = DllCall($_LG_DLL, "str:cdecl", "sentence_get_word", "ptr", $hSentence, "int", $iWord) Return $result[0] EndFunc ;==>_LG_SentenceGetWord Func _LG_SentenceNullCount($hSentence) ;int sentence_null_count(Sentence sent); $result = DllCall($_LG_DLL, "int:cdecl", "sentence_null_count", "ptr", $hSentence) Return $result[0] EndFunc ;==>_LG_SentenceNullCount Func _LG_SentenceNumLinkagesFound($hSentence) ;int sentence_num_linkages_found(Sentence sent); $result = DllCall($_LG_DLL, "int:cdecl", "sentence_num_linkages_found", "ptr", $hSentence) Return $result[0] EndFunc ;==>_LG_SentenceNumLinkagesFound Func _LG_SentenceNumValidLinkages($hSentence) ;int sentence_num_valid_linkages(Sentence sent); $result = DllCall($_LG_DLL, "int:cdecl", "sentence_num_valid_linkages", "ptr", $hSentence) Return $result[0] EndFunc ;==>_LG_SentenceNumValidLinkages Func _LG_SentenceNumLinkagesPostProcessed($hSentence) ;int sentence_num_linkages_post_processed(Sentence sent); $result = DllCall($_LG_DLL, "int:cdecl", "sentence_num_linkages_post_processed", "ptr", $hSentence) Return $result[0] EndFunc ;==>_LG_SentenceNumLinkagesPostProcessed Func _LG_SentenceNumViolations($hSentence, $iNumber) ;int sentence_num_violations(Sentence sent, int i); $result = DllCall($_LG_DLL, "int:cdecl", "sentence_num_violations", "ptr", $hSentence, "int", $iNumber) Return $result[0] EndFunc ;==>_LG_SentenceNumViolations Func _LG_SentenceDisjunctCost($hSentence, $iNumber) ;int sentence_disjunct_cost(Sentence sent, int i); $result = DllCall($_LG_DLL, "int:cdecl", "sentence_disjunct_cost", "ptr", $hSentence, "int", $iNumber) Return $result[0] EndFunc ;==>_LG_SentenceDisjunctCost Func _LG_SentenceLinkCost($hSentence, $iNumber) ;int sentence_link_cost(Sentence sent, int i); $result = DllCall($_LG_DLL, "int:cdecl", "sentence_link_cost", "ptr", $hSentence, "int", $iNumber) Return $result[0] EndFunc ;==>_LG_SentenceLinkCost Func _LG_SentenceAndCost($hSentence, $iNumber) ;int sentence_and_cost(Sentence sent, int i); $result = DllCall($_LG_DLL, "int:cdecl", "sentence_and_cost", "ptr", $hSentence, "int", $iNumber) Return $result[0] EndFunc ;==>_LG_SentenceAndCost Func _LG_LinkageCreate($iIndex, $hSentence, $hOptions) ;Linkage linkage_create(int index, Sentence sent, Parse_Options opts); $result = DllCall($_LG_DLL, "ptr:cdecl", "linkage_create", "int", $iIndex, "ptr", $hSentence, "ptr", $hOptions) Return $result[0] EndFunc ;==>_LG_LinkageCreate Func _LG_LinkageGetNumSublinkages($hLinkage) ;int linkage_get_num_sublinkages(Linkage linkage); $result = DllCall($_LG_DLL, "int:cdecl", "linkage_get_num_sublinkages", "ptr", $hLinkage) Return $result[0] EndFunc ;==>_LG_LinkageGetNumSublinkages Func _LG_LinkageSetCurrentSublinkage($hLinkage, $iIndex) ;int linkage_set_current_sublinkage(Linkage linkage, int index); $result = DllCall($_LG_DLL, "int:cdecl", "linkage_set_current_sublinkage", "ptr", $hLinkage, "int", $iIndex) Return $result[0] EndFunc ;==>_LG_LinkageSetCurrentSublinkage Func _LG_LinkageComputeUnion($hLinkage) ;int linkage_compute_union(Linkage linkage); $result = DllCall($_LG_DLL, "int:cdecl", "linkage_compute_union", "ptr", $hLinkage) Return $result[0] EndFunc ;==>_LG_LinkageComputeUnion Func _LG_LinkageGetNumWords($hLinkage) ;int linkage_get_num_words(Linkage linkage); $result = DllCall($_LG_DLL, "int:cdecl", "linkage_get_num_words", "ptr", $hLinkage) Return $result[0] EndFunc ;==>_LG_LinkageGetNumWords Func _LG_LinkageGetNumLinks($hLinkage) ;int linkage_get_num_links(Linkage linkage); $result = DllCall($_LG_DLL, "int:cdecl", "linkage_get_num_links", "ptr", $hLinkage) Return $result[0] EndFunc ;==>_LG_LinkageGetNumLinks Func _LG_LinkageGetLinkLength($hLinkage, $iIndex) ;int linkage_get_link_length(Linkage linkage, int index); $result = DllCall($_LG_DLL, "int:cdecl", "linkage_get_link_length", "ptr", $hLinkage, "int", $iIndex) Return $result[0] EndFunc ;==>_LG_LinkageGetLinkLength Func _LG_LinkageGetLinkLWord($hLinkage, $iIndex) ;int linkage_get_link_lword(Linkage linkage, int index); $result = DllCall($_LG_DLL, "int:cdecl", "linkage_get_link_lword", "ptr", $hLinkage, "int", $iIndex) Return $result[0] EndFunc ;==>_LG_LinkageGetLinkLWord Func _LG_LinkageGetLinkRWord($hLinkage, $iIndex) ;int linkage_get_link_rword(Linkage linkage, int index); $result = DllCall($_LG_DLL, "int:cdecl", "linkage_get_link_rword", "ptr", $hLinkage, "int", $iIndex) Return $result[0] EndFunc ;==>_LG_LinkageGetLinkRWord Func _LG_LinkagePrintDiagram($hLinkage) ;char * linkage_print_diagram(Linkage linkage); $result = DllCall($_LG_DLL, "str:cdecl", "linkage_print_diagram", "ptr", $hLinkage) Return $result[0] EndFunc ;==>_LG_LinkagePrintDiagram Func _LG_LinkageFreeDiagram($hDiagram) ;void linkage_free_diagram(char * str); DllCall($_LG_DLL, "none:cdecl", "linkage_free_diagram", "ptr", $hDiagram) EndFunc ;==>_LG_LinkageFreeDiagram Func _LG_LinkagePrintPostscript($hLinkage, $iMode) ;char * linkage_print_postscript(Linkage linkage, int mode); $result = DllCall($_LG_DLL, "str:cdecl", "linkage_print_postscript", "ptr", $hLinkage, "int", $iMode) Return $result[0] EndFunc ;==>_LG_LinkagePrintPostscript Func _LG_LinkageFreePostscript($hPostscript) ;void linkage_free_postscript(char * str); DllCall($_LG_DLL, "none:cdecl", "linkage_free_postscript", "ptr", $hPostscript) EndFunc ;==>_LG_LinkageFreePostscript Func _LG_LinkagePrintLinksAndDomains($hLinkage) ;char * linkage_print_links_and_domains(Linkage linkage); $result = DllCall($_LG_DLL, "str:cdecl", "linkage_print_links_and_domains", "ptr", $hLinkage) Return $result[0] EndFunc ;==>_LG_LinkagePrintLinksAndDomains Func _LG_LinkageFreeLinksAndDomains($hLinksAndDomains) ;void linkage_free_links_and_domains(char *str); DllCall($_LG_DLL, "none:cdecl", "linkage_free_links_and_domains", "ptr", $hLinksAndDomains) EndFunc ;==>_LG_LinkageFreeLinksAndDomains Func _LG_LinkagePrintConstituentTree($hLinkage, $iOpt) ;char * linkage_print_constituent_tree(Linkage linkage int iOpt); $result = DllCall($_LG_DLL, "str:cdecl", "linkage_print_constituent_tree", "ptr", $hLinkage, "int", $iOpt) Return $result[0] EndFunc ;==>_LG_LinkagePrintConstituentTree Func _LG_LinkageGetLinkLabel($hLinkage, $iIndex) ;const char * linkage_get_link_label(Linkage linkage, int index); $result = DllCall($_LG_DLL, "str:cdecl", "linkage_get_link_label", "ptr", $hLinkage, "int", $iIndex) Return $result[0] EndFunc ;==>_LG_LinkageGetLinkLabel Func _LG_LinkageGetLinkLLabel($hLinkage, $iIndex) ;const char * linkage_get_link_llabel(Linkage linkage, int index); $result = DllCall($_LG_DLL, "str:cdecl", "linkage_get_link_llabel", "ptr", $hLinkage, "int", $iIndex) Return $result[0] EndFunc ;==>_LG_LinkageGetLinkLLabel Func _LG_LinkageGetLinkRLabel($hLinkage, $iIndex) ;const char * linkage_get_link_rlabel(Linkage linkage, int index); $result = DllCall($_LG_DLL, "str:cdecl", "linkage_get_link_rlabel", "ptr", $hLinkage, "int", $iIndex) Return $result[0] EndFunc ;==>_LG_LinkageGetLinkRLabel Func _LG_LinkageGetLinkNumDomains($hLinkage, $iIndex) ;int linkage_get_link_num_domains(Linkage linkage, int index); $result = DllCall($_LG_DLL, "int:cdecl", "linkage_get_link_num_domains", "ptr", $hLinkage, "int", $iIndex) Return $result[0] EndFunc ;==>_LG_LinkageGetLinkNumDomains Func _LG_LinkageGetLinkDomainNames($hLinkage, $iIndex) ;const char ** linkage_get_link_domain_names(Linkage linkage, int index); $result = DllCall($_LG_DLL, "str:cdecl", "linkage_get_link_domain_names", "ptr", $hLinkage, "int", $iIndex) Return $result[0] EndFunc ;==>_LG_LinkageGetLinkDomainNames Func _LG_LinkageGetViolationName($hLinkage) ;const char * linkage_get_violation_name(Linkage linkage); $result = DllCall($_LG_DLL, "str:cdecl", "linkage_get_violation_name", "ptr", $hLinkage) Return $result[0] EndFunc ;==>_LG_LinkageGetViolationName ;Func _LG_LinkageGetWords($hLinkage) ; ;const char ** linkage_get_words(Linkage linkage); ; $result = DllCall($_LG_DLL, "int:cdecl", "linkage_get_words", "ptr", $hLinkage) ; Return $result[0] ;EndFunc Func _LG_LinkageGetWord($hLinkage, $iWord) ;const char * linkage_get_word(Linkage linkage, int w); $result = DllCall($_LG_DLL, "str:cdecl", "linkage_get_word", "ptr", $hLinkage, "int", $iWord) Return $result[0] EndFunc ;==>_LG_LinkageGetWord Func _LG_LinkageGetDisjunct($hLinkage, $iWord) ;const char * linkage_get_disjunct(Linkage linkage, int w); $result = DllCall($_LG_DLL, "str:cdecl", "linkage_get_disjunct", "ptr", $hLinkage, "int", $iWord) Return $result[0] EndFunc ;==>_LG_LinkageGetDisjunct Func _LG_LinkageUnusedWordCost($hLinkage) ;int linkage_unused_word_cost(Linkage linkage); $result = DllCall($_LG_DLL, "int:cdecl", "linkage_unused_word_cost", "ptr", $hLinkage) Return $result[0] EndFunc ;==>_LG_LinkageUnusedWordCost Func _LG_LinkageDisjunctCost($hLinkage) ;int linkage_disjunct_cost(Linkage linkage); $result = DllCall($_LG_DLL, "int:cdecl", "linkage_disjunct_cost", "ptr", $hLinkage) Return $result[0] EndFunc ;==>_LG_LinkageDisjunctCost Func _LG_LinkageAndCost($hLinkage) ;int linkage_and_cost(Linkage linkage); $result = DllCall($_LG_DLL, "int:cdecl", "linkage_and_cost", "ptr", $hLinkage) Return $result[0] EndFunc ;==>_LG_LinkageAndCost Func _LG_LinkageLinkCost($hLinkage) ;int linkage_link_cost(Linkage linkage); $result = DllCall($_LG_DLL, "int:cdecl", "linkage_link_cost", "ptr", $hLinkage) Return $result[0] EndFunc ;==>_LG_LinkageLinkCost Func _LG_LinkageIsCanonical($hLinkage) ;int linkage_is_canonical(Linkage linkage); $result = DllCall($_LG_DLL, "int:cdecl", "linkage_is_canonical", "ptr", $hLinkage) Return $result[0] EndFunc ;==>_LG_LinkageIsCanonical Func _LG_LinkageIsImproper($hLinkage) ;int linkage_is_improper(Linkage linkage); $result = DllCall($_LG_DLL, "int:cdecl", "linkage_is_improper", "ptr", $hLinkage) Return $result[0] EndFunc ;==>_LG_LinkageIsImproper Func _LG_LinkageHasInconsistentDomains($hLinkage) ;int linkage_has_inconsistent_domains(Linkage linkage); $result = DllCall($_LG_DLL, "int:cdecl", "linkage_has_inconsistent_domains", "ptr", $hLinkage) Return $result[0] EndFunc ;==>_LG_LinkageHasInconsistentDomains Func _LG_LinkageDelete($hLinkage) ;void linkage_delete(Linkage linkage); $result = DllCall($_LG_DLL, "none:cdecl", "linkage_delete", "ptr", $hLinkage) EndFunc ;==>_LG_LinkageDelete Func _LG_PostProcessOpen($sName) ;PostProcessor post_process_open(const char * name); $result = DllCall($_LG_DLL, "ptr:cdecl", "post_process_open", "str", $sName) Return $result[0] EndFunc ;==>_LG_PostProcessOpen Func _LG_PostProcessClose($hPostProcessor) ;void post_process_close(PostProcessor postprocessor); DllCall($_LG_DLL, "none:cdecl", "post_process_close", "ptr", $hPostProcessor) EndFunc ;==>_LG_PostProcessClose Func _LG_LinkagePostProcess($hLinkage, $hPostProcessor) ;void linkage_post_process(Linkage linkage, PostProcessor postprocessor); DllCall($_LG_DLL, "none:cdecl", "linkage_post_process", "ptr", $hLinkage, "ptr", $hPostProcessor) EndFunc ;==>_LG_LinkagePostProcess Func _LG_LinkagePrintDisjuncts($hLinkage) $result = DllCall($_LG_DLL, "str:cdecl", "linkage_print_disjuncts", "ptr", $hLinkage) Return $result[0] EndFunc link-grammar-4.7.4/link-grammar/autoit/_LGTest.au30000644000175000017500000000120011347476535020722 0ustar bloombloom#include "_LinkGrammar.au3" $Test = "My dog likes dog food." $options = _LG_ParseOptionsCreate() $dict = _LG_DictionaryCreateLang("en") $Sentence = _LG_SentenceCreate($Test, $dict) _LG_SentenceSplit($Sentence, $options) $num_linkages = _LG_SentenceParse($Sentence, $options) If $num_linkages > 0 Then $linkage = _LG_LinkageCreate(0, $Sentence, $options) $diagram = _LG_LinkagePrintDiagram($linkage) $diagram2 = _LG_LinkagePrintConstituentTree($linkage, 3) $diagram3 = _LG_LinkagePrintDisjuncts($linkage) ConsoleWrite($diagram & @CRLF) ConsoleWrite($diagram2 & @CRLF) ConsoleWrite($diagram3 & @CRLF) EndIf link-grammar-4.7.4/link-grammar/autoit/README0000644000175000017500000000033011347476535017672 0ustar bloombloom Link-grammar bindings for AutoIt -------------------------------- Developed by J Rowe March 2010 AutoIt is a scripting language for MS Windows. See http://www.autoitscript.com link-grammar-4.7.4/link-grammar/prefix.c0000644000175000017500000002517110430124501017127 0ustar bloombloom/* * BinReloc - a library for creating relocatable executables * Written by: Mike Hearn * Hongli Lai * http://autopackage.org/ * * This source code is public domain. You can relicense this code * under whatever license you want. * * NOTE: if you're using C++ and are getting "undefined reference * to br_*", try renaming prefix.c to prefix.cpp */ /* WARNING, BEFORE YOU MODIFY PREFIX.C: * * If you make changes to any of the functions in prefix.c, you MUST * change the BR_NAMESPACE macro (in prefix.h). * This way you can avoid symbol table conflicts with other libraries * that also happen to use BinReloc. * * Example: * #define BR_NAMESPACE(funcName) foobar_ ## funcName * --> expands br_locate to foobar_br_locate */ #ifndef _PREFIX_C_ #define _PREFIX_C_ #ifdef HAVE_CONFIG_H #include "config.h" #endif #ifndef BR_PTHREADS /* Change 1 to 0 if you don't want pthread support */ #define BR_PTHREADS 1 #endif /* BR_PTHREADS */ #include #include #include #include #include "prefix.h" #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ #undef NULL #define NULL ((void *) 0) #ifdef __GNUC__ #define br_return_val_if_fail(expr,val) if (!(expr)) {fprintf (stderr, "** BinReloc (%s): assertion %s failed\n", __PRETTY_FUNCTION__, #expr); return val;} #else #define br_return_val_if_fail(expr,val) if (!(expr)) return val #endif /* __GNUC__ */ static br_locate_fallback_func fallback_func = (br_locate_fallback_func) NULL; static void *fallback_data = NULL; #ifdef ENABLE_BINRELOC #include #include #include #include /** * br_locate: * symbol: A symbol that belongs to the app/library you want to locate. * Returns: A newly allocated string containing the full path of the * app/library that func belongs to, or NULL on error. This * string should be freed when not when no longer needed. * * Finds out to which application or library symbol belongs, then locate * the full path of that application or library. * Note that symbol cannot be a pointer to a function. That will not work. * * Example: * --> main.c * #include "prefix.h" * #include "libfoo.h" * * int main (int argc, char *argv[]) { * printf ("Full path of this app: %s\n", br_locate (&argc)); * libfoo_start (); * return 0; * } * * --> libfoo.c starts here * #include "prefix.h" * * void libfoo_start () { * --> "" is a symbol that belongs to libfoo (because it's called * --> from libfoo_start()); that's why this works. * printf ("libfoo is located in: %s\n", br_locate ("")); * } */ char * br_locate (void *symbol) { char line[5000]; FILE *f; char *path; br_return_val_if_fail (symbol != NULL, NULL); f = fopen ("/proc/self/maps", "r"); if (!f) { if (fallback_func) return fallback_func(symbol, fallback_data); else return NULL; } while (!feof (f)) { unsigned long start, end; if (!fgets (line, sizeof (line), f)) continue; if (!strstr (line, " r-xp ") || !strchr (line, '/')) continue; sscanf (line, "%lx-%lx ", &start, &end); if (symbol >= (void *) start && symbol < (void *) end) { char *tmp; size_t len; /* Extract the filename; it is always an absolute path */ path = strchr (line, '/'); /* Get rid of the newline */ tmp = strrchr (path, '\n'); if (tmp) *tmp = 0; /* Get rid of "(deleted)" */ len = strlen (path); if (len > 10 && strcmp (path + len - 10, " (deleted)") == 0) { tmp = path + len - 10; *tmp = 0; } fclose(f); return strdup (path); } } fclose (f); return NULL; } /** * br_locate_prefix: * symbol: A symbol that belongs to the app/library you want to locate. * Returns: A prefix. This string should be freed when no longer needed. * * Locates the full path of the app/library that symbol belongs to, and return * the prefix of that path, or NULL on error. * Note that symbol cannot be a pointer to a function. That will not work. * * Example: * --> This application is located in /usr/bin/foo * br_locate_prefix (&argc); --> returns: "/usr" */ char * br_locate_prefix (void *symbol) { char *path, *prefix; br_return_val_if_fail (symbol != NULL, NULL); path = br_locate (symbol); if (!path) return NULL; prefix = br_extract_prefix (path); free (path); return prefix; } /** * br_prepend_prefix: * symbol: A symbol that belongs to the app/library you want to locate. * path: The path that you want to prepend the prefix to. * Returns: The new path, or NULL on error. This string should be freed when no * longer needed. * * Gets the prefix of the app/library that symbol belongs to. Prepend that prefix to path. * Note that symbol cannot be a pointer to a function. That will not work. * * Example: * --> The application is /usr/bin/foo * br_prepend_prefix (&argc, "/share/foo/data.png"); --> Returns "/usr/share/foo/data.png" */ char * br_prepend_prefix (void *symbol, char *path) { char *tmp, *newpath; br_return_val_if_fail (symbol != NULL, NULL); br_return_val_if_fail (path != NULL, NULL); tmp = br_locate_prefix (symbol); if (!tmp) return NULL; if (strcmp (tmp, "/") == 0) newpath = strdup (path); else newpath = br_strcat (tmp, path); /* Get rid of compiler warning ("br_prepend_prefix never used") */ if (0) br_prepend_prefix (NULL, NULL); free (tmp); return newpath; } #endif /* ENABLE_BINRELOC */ /* Pthread stuff for thread safetiness */ #if BR_PTHREADS && defined(ENABLE_BINRELOC) #include static pthread_key_t br_thread_key; static pthread_once_t br_thread_key_once = PTHREAD_ONCE_INIT; static void br_thread_local_store_fini () { char *specific; specific = (char *) pthread_getspecific (br_thread_key); if (specific) { free (specific); pthread_setspecific (br_thread_key, NULL); } pthread_key_delete (br_thread_key); br_thread_key = 0; } static void br_str_free (void *str) { if (str) free (str); } static void br_thread_local_store_init () { if (pthread_key_create (&br_thread_key, br_str_free) == 0) atexit (br_thread_local_store_fini); } #else /* BR_PTHREADS */ #ifdef ENABLE_BINRELOC static char *br_last_value = (char *) NULL; static void br_free_last_value () { if (br_last_value) free (br_last_value); } #endif /* ENABLE_BINRELOC */ #endif /* BR_PTHREADS */ #ifdef ENABLE_BINRELOC /** * br_thread_local_store: * str: A dynamically allocated string. * Returns: str. This return value must not be freed. * * Store str in a thread-local variable and return str. The next * you run this function, that variable is freed too. * This function is created so you don't have to worry about freeing * strings. Just be careful about doing this sort of thing: * * some_function( BR_DATADIR("/one.png"), BR_DATADIR("/two.png") ) * * Examples: * char *foo; * foo = br_thread_local_store (strdup ("hello")); --> foo == "hello" * foo = br_thread_local_store (strdup ("world")); --> foo == "world"; "hello" is now freed. */ const char * br_thread_local_store (char *str) { #if BR_PTHREADS char *specific; pthread_once (&br_thread_key_once, br_thread_local_store_init); specific = (char *) pthread_getspecific (br_thread_key); br_str_free (specific); pthread_setspecific (br_thread_key, str); #else /* BR_PTHREADS */ static int initialized = 0; if (!initialized) { atexit (br_free_last_value); initialized = 1; } if (br_last_value) free (br_last_value); br_last_value = str; #endif /* BR_PTHREADS */ return (const char *) str; } #endif /* ENABLE_BINRELOC */ /** * br_strcat: * str1: A string. * str2: Another string. * Returns: A newly-allocated string. This string should be freed when no longer needed. * * Concatenate str1 and str2 to a newly allocated string. */ char * br_strcat (const char *str1, const char *str2) { char *result; size_t len1, len2; if (!str1) str1 = ""; if (!str2) str2 = ""; len1 = strlen (str1); len2 = strlen (str2); result = (char *) malloc (len1 + len2 + 1); memcpy (result, str1, len1); memcpy (result + len1, str2, len2); result[len1 + len2] = '\0'; return result; } /* Emulates glibc's strndup() */ static char * br_strndup (char *str, size_t size) { char *result = (char *) NULL; size_t len; br_return_val_if_fail (str != (char *) NULL, (char *) NULL); len = strlen (str); if (!len) return strdup (""); if (size > len) size = len; result = (char *) calloc (sizeof (char), len + 1); memcpy (result, str, size); return result; } /** * br_extract_dir: * path: A path. * Returns: A directory name. This string should be freed when no longer needed. * * Extracts the directory component of path. Similar to g_dirname() or the dirname * commandline application. * * Example: * br_extract_dir ("/usr/local/foobar"); --> Returns: "/usr/local" */ char * br_extract_dir (const char *path) { char *end, *result; br_return_val_if_fail (path != (char *) NULL, (char *) NULL); end = strrchr (path, '/'); if (!end) return strdup ("."); while (end > path && *end == '/') end--; result = br_strndup ((char *) path, end - path + 1); if (!*result) { free (result); return strdup ("/"); } else return result; } /** * br_extract_prefix: * path: The full path of an executable or library. * Returns: The prefix, or NULL on error. This string should be freed when no longer needed. * * Extracts the prefix from path. This function assumes that your executable * or library is installed in an LSB-compatible directory structure. * * Example: * br_extract_prefix ("/usr/bin/gnome-panel"); --> Returns "/usr" * br_extract_prefix ("/usr/local/lib/libfoo.so"); --> Returns "/usr/local" * br_extract_prefix ("/usr/local/libfoo.so"); --> Returns "/usr" */ char * br_extract_prefix (const char *path) { char *end, *tmp, *result; br_return_val_if_fail (path != (char *) NULL, (char *) NULL); if (!*path) return strdup ("/"); end = strrchr (path, '/'); if (!end) return strdup (path); tmp = br_strndup ((char *) path, end - path); if (!*tmp) { free (tmp); return strdup ("/"); } end = strrchr (tmp, '/'); if (!end) return tmp; result = br_strndup (tmp, end - tmp); free (tmp); if (!*result) { free (result); result = strdup ("/"); } return result; } /** * br_set_fallback_function: * func: A function to call to find the binary. * data: User data to pass to func. * * Sets a function to call to find the path to the binary, in * case "/proc/self/maps" can't be opened. The function set should * return a string that is safe to free with free(). */ void br_set_locate_fallback_func (br_locate_fallback_func func, void *data) { fallback_func = func; fallback_data = data; } #ifdef __cplusplus } #endif /* __cplusplus */ #endif /* _PREFIX_C */ link-grammar-4.7.4/link-grammar/pp_linkset.h0000644000175000017500000000251210764122153020014 0ustar bloombloom/********************************************************************************/ /* Copyright (c) 2004 */ /* Daniel Sleator, David Temperley, and John Lafferty */ /* All rights reserved */ /* */ /* Use of the link grammar parsing system is subject to the terms of the */ /* license set forth in the LICENSE file included with this software, */ /* and also available at http://www.link.cs.cmu.edu/link/license.html */ /* This license allows free redistribution and use in source and binary */ /* forms, with or without modification, subject to certain conditions. */ /* */ /********************************************************************************/ pp_linkset *pp_linkset_open(int size); void pp_linkset_close (pp_linkset *ls); void pp_linkset_clear (pp_linkset *ls); int pp_linkset_add (pp_linkset *ls, const char *str); int pp_linkset_match (pp_linkset *ls, const char *str); int pp_linkset_match_bw (pp_linkset *ls, const char *str); int pp_linkset_population(pp_linkset *ls); link-grammar-4.7.4/link-grammar/resources.h0000644000175000017500000000254511526022265017664 0ustar bloombloom/*************************************************************************/ /* Copyright (c) 2004 */ /* Daniel Sleator, David Temperley, and John Lafferty */ /* All rights reserved */ /* */ /* Use of the link grammar parsing system is subject to the terms of the */ /* license set forth in the LICENSE file included with this software, */ /* and also available at http://www.link.cs.cmu.edu/link/license.html */ /* This license allows free redistribution and use in source and binary */ /* forms, with or without modification, subject to certain conditions. */ /* */ /*************************************************************************/ void print_time(Parse_Options opts, const char * s); /* void print_total_time(Parse_Options opts); */ void print_total_space(Parse_Options opts); void resources_reset(Resources r); void resources_reset_space(Resources r); int resources_timer_expired(Resources r); int resources_memory_exhausted(Resources r); int resources_exhausted(Resources r); Resources resources_create(void); void resources_delete(Resources ti); link-grammar-4.7.4/link-grammar/sat-solver/0000755000175000017500000000000011531775721017602 5ustar bloombloomlink-grammar-4.7.4/link-grammar/sat-solver/rejected.cpp0000644000175000017500000001777711052414476022111 0ustar bloombloom void generate_power_pruning_right(int w, Exp* exp, int& dfs_position, std::vector empty_conditions, char* name, char* var); void generate_power_pruning_left(int w, Exp* exp, int& dfs_position, std::vector empty_conditions, char* name, char* var, int w_r, int pos_r, char* name_r); void SATEncoder::generate_power_pruning_right(int w, Exp* exp, int& dfs_position, std::vector empty_conditions, char* name, char* var) { if (exp->type == CONNECTOR_type) { dfs_position++; if (exp->dir == '+' && !exp->multi) { for (int w_l = w + 2; w_l < _sent->length; w_l++) { if (_sent->word[w_l].x == NULL) continue; char name_l[MAX_VARIABLE_NAME]; sprintf(name_l, "w%d", w_l); bool join = _sent->word[w_l].x->next != NULL; Exp* e_l = join ? join_alternatives(w_l) : _sent->word[w_l].x->exp; int dfs_position_l = 0; generate_power_pruning_left(w_l, e_l, dfs_position_l, empty_conditions, name_l, NULL, w, dfs_position, exp->u.string); if (join) free_alternatives(e_l); } } } else if (exp->type == OR_type) { if (exp->u.l != NULL && exp->u.l->next == NULL) { /* unary or - skip */ generate_power_pruning_right(w, exp->u.l->e,dfs_position, empty_conditions, name, var); } else { int i; E_list* l; for (l = exp->u.l, i = 0; l != NULL; l = l->next, i++) { char new_var[MAX_VARIABLE_NAME]; if (var != NULL) { sprintf(new_var, "%s_d%d", var, i); } else { sprintf(new_var, "d%d", i); } generate_power_pruning_right(w, l->e, dfs_position, empty_conditions, name, new_var); } } } else if (exp->type == AND_type) { if (exp->u.l != NULL && exp->u.l->next == NULL) { /* unary and - skip */ generate_power_pruning_right(w, exp->u.l->e,dfs_position, empty_conditions, name, var); } else { int i; E_list* l; for (l = exp->u.l, i = 0; l != NULL; l = l->next, i++) { char new_var[MAX_VARIABLE_NAME]; if (var != NULL) { sprintf(new_var, "%s_c%d", var, i); } else { sprintf(new_var, "c%d", i); } generate_power_pruning_right(w, l->e, dfs_position, empty_conditions, name, new_var); empty_conditions.push_back(-_variables->epsilon(name, new_var, '+')); } } } } void SATEncoder::generate_power_pruning_left(int w, Exp* exp, int& dfs_position, std::vector empty_conditions, char* name, char* var, int w_r, int pos_r, char* name_r) { // cout << "TDL: "; // print_expression(exp); // cout << endl; if (exp->type == CONNECTOR_type) { dfs_position++; if (exp->dir == '-' && !exp->multi) { Connector c1, c2; init_connector(&c1); c1.label = NORMAL_LABEL; c1.priority = THIN_priority; c1.string = name_r; init_connector(&c2); c2.label = NORMAL_LABEL; c2.priority = THIN_priority; c2.string = exp->u.string; // cout << name_r << "_" << w_r << "_" << pos_r << " vs " // << exp->u.string << "_" << w << "_" << dfs_position << endl; if (!WordTag::match(c1, '+', c2)) return; cout << "POS: "; cout << name_r << "_." << w_r << "._." << pos_r << ". vs " << exp->u.string << "_." << w << "._." << dfs_position << endl; empty_conditions.push_back(-_variables->link(w_r, pos_r, name_r, w, dfs_position, exp->u.string)); generate_or(empty_conditions); } } else if (exp->type == OR_type) { if (exp->u.l != NULL && exp->u.l->next == NULL) { /* unary or - skip */ generate_power_pruning_left(w, exp->u.l->e,dfs_position, empty_conditions, name, var, w_r, pos_r, name_r); } else { int i; E_list* l; for (l = exp->u.l, i = 0; l != NULL; l = l->next, i++) { char new_var[MAX_VARIABLE_NAME]; if (var != NULL) { sprintf(new_var, "%s_d%d", var, i); } else { sprintf(new_var, "d%d", i); } generate_power_pruning_left(w, l->e, dfs_position, empty_conditions, name, new_var, w_r, pos_r, name_r); } } } else if (exp->type == AND_type) { if (exp->u.l != NULL && exp->u.l->next == NULL) { /* unary and - skip */ generate_power_pruning_left(w, exp->u.l->e,dfs_position, empty_conditions, name, var, w_r, pos_r, name_r); } else { int i; E_list* l; for (l = exp->u.l, i = 0; l != NULL; l = l->next, i++) { char new_var[MAX_VARIABLE_NAME]; if (var != NULL) { sprintf(new_var, "%s_c%d", var, i); } else { sprintf(new_var, "c%d", i); } generate_power_pruning_left(w, l->e, dfs_position, empty_conditions, name, new_var, w_r, pos_r, name_r); empty_conditions.push_back(-_variables->epsilon(name, new_var, '-')); } } } } bool SATEncoder::pp_match(const char* name) { // cout << "PPMATCH: " << name << endl; for (int w = 0; w < _sent->length; w++) if (_word_tags[w].pp_check(name)) return true; return false; } bool SATEncoder::pp_check(const char* connector) { if (_sent->dict->postprocessor == NULL) return true; pp_knowledge * knowledge; knowledge = _sent->dict->postprocessor->knowledge; for (int i=0; in_contains_one_rules; i++) { pp_rule rule; char * selector; pp_linkset * link_set; rule = knowledge->contains_one_rules[i]; /* the ith rule */ selector = rule.selector; /* selector string for this rule */ link_set = rule.link_set; /* the set of criterion links */ if (strchr(selector, '*') != NULL) continue; /* If it has a * forget it */ if (!post_process_match(selector, connector)) continue; cout << "Trigger: " << connector << endl; pp_linkset_node *p; bool match_possible = false; for (int hashval = 0; hashval < link_set->hash_table_size && !match_possible; hashval++) { for (p = link_set->hash_table[hashval]; p!=NULL && !match_possible; p=p->next) { const char * t; char name[20], *s; strncpy(name, p->str, sizeof(name)-1); name[sizeof(name)-1] = '\0'; cout << "NAME: " << name << endl; for (s = name; isupper((int)*s); s++) ; for (;*s != '\0'; s++) if (*s != '*') *s = '#'; for (s = name, t = p->str; isupper((int) *s); s++, t++) ; int bad = 0; int n_subscripts = 0; for (;*s != '\0' && bad==0; s++, t++) { if (*s == '*') continue; n_subscripts++; /* after the upper case part, and is not a * so must be a regular subscript */ *s = *t; if (!pp_match(name)) bad++; *s = '#'; } if (n_subscripts == 0) { /* now we handle the special case which occurs if there were 0 subscripts */ if (!pp_match(name)) bad++; } /* now if bad==0 this criterion link does the job to satisfy the needs of the trigger link */ if (bad == 0) match_possible = true; } } if (!match_possible) { cout << "THIS ONE IS FALSE\n" << endl; return false; } } return true; } bool pp_match(const char* name); bool pp_check(const char* connector); bool pp_check(const char* connector); bool WordTag::pp_check(const char* connector) { std::vector::const_iterator i; for (i = _left_connectors.begin(); i != _left_connectors.end(); i++) if (post_process_match(connector, i->connector->string)) return true; for (i = _right_connectors.begin(); i != _right_connectors.end(); i++) if (post_process_match(connector, i->connector->string)) return true; return false; } static void split(const std::string& str, char c, std::vector& parts) { const char *s, *e; e = str.c_str(); while(1) { s = e + 1; e = strchr(s, c); if (!e) { parts.push_back(str.substr(s - str.c_str())); break; } else parts.push_back(str.substr(s - str.c_str(), e - s)); } } static char* link_label(const std::string& link_var) { std::vector parts; split(link_var, '_', parts); return construct_link_label(parts[3].c_str(), parts[6].c_str()); } static int link_left_word(const std::string& link_var) { std::vector parts; split(link_var, '_', parts); return atoi(parts[1].c_str()); } static int link_right_word(const std::string& link_var) { std::vector parts; split(link_var, '_', parts); return atoi(parts[4].c_str()); } link-grammar-4.7.4/link-grammar/sat-solver/word-tag.cpp0000644000175000017500000001125711526022265022030 0ustar bloombloom#include "word-tag.hpp" #include "fast-sprintf.hpp" void WordTag::insert_connectors(Exp* exp, int& dfs_position, bool& leading_right, bool& leading_left, std::vector& eps_right, std::vector& eps_left, char* var, bool root, int parrent_cost) { int cost = parrent_cost + exp->cost; if (exp->type == CONNECTOR_type) { dfs_position++; const char* name = exp->u.string; Connector* connector = connector_new(); connector->multi = exp->multi; connector->string = name; set_connector_length_limit(connector); switch(exp->dir) { case '+': _position.push_back(_right_connectors.size()); _dir.push_back('+'); _right_connectors.push_back(PositionConnector(connector, '+', _word, dfs_position, exp->cost, cost, leading_right, false, eps_right, eps_left)); leading_right = false; break; case '-': _position.push_back(_left_connectors.size()); _dir.push_back('-'); _left_connectors.push_back(PositionConnector(connector, '-', _word, dfs_position, exp->cost, cost, false, leading_left, eps_right, eps_left)); leading_left = false; break; default: throw std::string("Unknown connector direction: ") + exp->dir; } } else if (exp->type == AND_type) { if (exp->u.l == NULL) { /* zeroary and */ } else if (exp->u.l != NULL && exp->u.l->next == NULL) { /* unary and - skip */ insert_connectors(exp->u.l->e, dfs_position, leading_right, leading_left, eps_right, eps_left, var, root, cost); } else { int i; E_list* l; char new_var[MAX_VARIABLE_NAME]; char* last_new_var = new_var; char* last_var = var; while(*last_new_var = *last_var) { last_new_var++; last_var++; } for (i = 0, l = exp->u.l; l != NULL; l = l->next, i++) { char* s = last_new_var; *s++ = 'c'; fast_sprintf(s, i); insert_connectors(l->e, dfs_position, leading_right, leading_left, eps_right, eps_left, new_var, false, cost); if (leading_right && var != NULL) { eps_right.push_back(_variables->epsilon(new_var, '+')); } if (leading_left && var != NULL) { eps_left.push_back(_variables->epsilon(new_var, '-')); } } } } else if (exp->type == OR_type) { if (exp->u.l != NULL && exp->u.l->next == NULL) { /* unary or - skip */ insert_connectors(exp->u.l->e, dfs_position, leading_right, leading_left, eps_right, eps_left, var, root, cost); } else { int i; E_list* l; bool ll_true = false; bool lr_true = false; char new_var[MAX_VARIABLE_NAME]; char* last_new_var = new_var; char* last_var = var; while(*last_new_var = *last_var) { last_new_var++; last_var++; } for (i = 0, l = exp->u.l; l != NULL; l = l->next, i++) { bool lr = leading_right, ll = leading_left; std::vector er = eps_right, el = eps_left; char* s = last_new_var; *s++ = 'd'; fast_sprintf(s, i); insert_connectors(l->e, dfs_position, lr, ll, er, el, new_var, false, cost); if (lr) lr_true = true; if (ll) ll_true = true; } leading_right = lr_true; leading_left = ll_true; } } } void WordTag::find_matches(int w, const char* C, char dir, std::vector& matches) { // cout << "Look connection on: ." << _word << ". ." << w << ". " << C << dir << endl; Connector search_cntr; init_connector(&search_cntr); search_cntr.label = NORMAL_LABEL; search_cntr.priority = THIN_priority; search_cntr.string = C; set_connector_length_limit(&search_cntr); std::vector* connectors; switch(dir) { case '+': connectors = &_left_connectors; break; case '-': connectors = &_right_connectors; break; default: throw std::string("Unknown connector direction: ") + dir; } bool conjunction = sentence_contains_conjunction(_sent); std::vector::iterator i; for (i = connectors->begin(); i != connectors->end(); i++) { if (WordTag::match(w, search_cntr, dir, (*i).word, *((*i).connector), conjunction)) { matches.push_back(&(*i)); } } } void WordTag::add_matches_with_word(WordTag& tag) { std::vector::iterator i; for (i = _right_connectors.begin(); i != _right_connectors.end(); i++) { std::vector connector_matches; tag.find_matches(_word, (*i).connector->string, '+', connector_matches); std::vector::iterator j; for (j = connector_matches.begin(); j != connector_matches.end(); j++) { i->matches.push_back(*j); set_match_possible((*j)->word, (*j)->position); (*j)->matches.push_back(&(*i)); tag.set_match_possible(_word, (*i).position); } } } link-grammar-4.7.4/link-grammar/sat-solver/trie.hpp0000644000175000017500000000523711052414476021260 0ustar bloombloom#ifndef __TRIE_HPP__ #define __TRIE_HPP__ #include /* Trie that supports strings made out of alphabeth letters, digits and underscores */ template class Trie { public: Trie(); ~Trie(); void insert(const char* key, T value); T lookup(const char* key); // returned in the key is not found in the trie const static int NOT_FOUND = -1; private: // no copying Trie(const Trie&); void operator=(const Trie& t); // Number of supported chars - digits + upper + lower + other const static int NUM_CHARS = 10 + 1 + 10 + 1; // hash chars int char_to_pos(char c); bool _terminal; Trie* _next[NUM_CHARS]; T _value; }; template Trie::Trie() : _terminal(false) { memset(_next, 0, NUM_CHARS*sizeof(Trie*)); } template Trie::~Trie() { for (int i = 0; i < NUM_CHARS; i++) if (_next[i]) { delete _next[i]; } } template int Trie::char_to_pos(char c) { static int pos[] = { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, -1, -1, -1, -1, -1, -1, // A B C D E F G H I J K L M N O P Q R S T U V W X Y Z -1, -1, -1, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 11, -1, // a b c d e f g h i j k l m n o p q r s t u v w x y z -1, -1, 12, 13, 14, 15, -1, -1, 16, -1, -1, 17, -1, 18, -1, -1, -1, 19, -1, -1, 20, -1, 21, -1, -1, -1}; assert(pos[c] != -1, "NOT FOUND"); return pos[c]; /* if ('0' <= c && c <= '9') return c-'0' + 26 + 26; if (c == 'c') return 2; if (c == 'd') return 3; if (c == '_') return 26 + 26 + 10; if ('a' <= c && c <= 'z') return c-'a'; if ('A' <= c && c <= 'Z') return c-'A' + 26; if (c == '*') return 26 + 26 + 10 + 1; throw std::string("Trie::char ") + c + " is not supported"; */ } template void Trie::insert(const char* key, T value) { Trie* t = this; while(*key != '\0') { int pos = char_to_pos(*key); if (!t->_next[pos]) { t->_next[pos] = new Trie(); } t = t->_next[pos]; key++; } t->_terminal = true; t->_value = value; } template T Trie::lookup(const char* key) { Trie* t = this; while(*key != '\0') { int pos = char_to_pos(*key); t = t->_next[pos]; if (!t) { return NOT_FOUND; } key++; } return t->_terminal ? t->_value : NOT_FOUND; } #endif link-grammar-4.7.4/link-grammar/sat-solver/variables.cpp0000644000175000017500000000011711052414476022250 0ustar bloombloom#include "variables.hpp" #ifdef _VARS ostream& var_defs_stream = cerr; #endif link-grammar-4.7.4/link-grammar/sat-solver/sat-encoder.cpp0000644000175000017500000025202511526022265022510 0ustar bloombloom#include #include #include #include #include #include #include #include using std::cout; using std::cerr; using std::endl; #include "sat-encoder.hpp" #include "variables.hpp" #include "word-tag.hpp" #include "matrix-ut.hpp" #include "clock.hpp" #include "fast-sprintf.hpp" #include "minisat/Solver.h" extern "C" { #include #include "preparation.h" } // Macro DEBUG_print is used to dump to stdout information while debugging #ifdef _DEBUG #define DEBUG_print(x) (cout << x << endl) #else #define DEBUG_print(x) (0) #endif /*-------------------------------------------------------------------------* * C N F C O N V E R S I O N * *-------------------------------------------------------------------------*/ void SATEncoder::generate_literal(Lit l) { vec clause(1); clause[0] = l; add_clause(clause); } void SATEncoder::generate_and_definition(Lit lhs, vec& rhs) { vec clause; for (int i = 0; i < rhs.size(); i++) { clause.growTo(2); clause[0] = ~lhs; clause[1] = rhs[i]; add_clause(clause); } for (int i = 0; i < rhs.size(); i++) { clause.growTo(2); clause[0] = ~rhs[i]; clause[1] = lhs; add_clause(clause); } } void SATEncoder::generate_classical_and_definition(Lit lhs, vec& rhs) { { vec clause; for (int i = 0; i < rhs.size(); i++) { clause.growTo(2); clause[0] = ~lhs; clause[1] = rhs[i]; add_clause(clause); } } { vec clause(rhs.size() + 1); for (int i = 0; i < rhs.size(); i++) { clause[i] = ~rhs[i]; } clause[rhs.size()] = lhs; add_clause(clause); } } void SATEncoder::generate_or_definition(Lit lhs, vec& rhs) { { vec clause; for (int i = 0; i < rhs.size(); i++) { clause.growTo(2); clause[0] = lhs; clause[1] = ~rhs[i]; add_clause(clause); } } { vec clause(rhs.size() + 1); for (int i = 0; i < rhs.size(); i++) { clause[i] = rhs[i]; } clause[rhs.size()] = ~lhs; add_clause(clause); } } void SATEncoder::generate_conditional_or_definition(Lit condition, Lit lhs, vec& rhs) { { vec clause; for (int i = 0; i < rhs.size(); i++) { clause.growTo(3); clause[0] = ~condition; clause[1] = lhs; clause[2] = ~rhs[i]; add_clause(clause); } } { vec clause(rhs.size() + 2); for (int i = 0; i < rhs.size(); i++) { clause[i] = rhs[i]; } clause[rhs.size()] = ~lhs; clause[rhs.size()+1] = ~condition; add_clause(clause); } } void SATEncoder::generate_conditional_lr_implication_or_definition(Lit condition, Lit lhs, vec& rhs) { { vec clause; for (int i = 0; i < rhs.size(); i++) { clause.growTo(2); clause[0] = lhs; clause[1] = ~rhs[i]; add_clause(clause); } } { vec clause(rhs.size() + 2); for (int i = 0; i < rhs.size(); i++) { clause[i] = rhs[i]; } clause[rhs.size()] = ~lhs; clause[rhs.size()+1] = ~condition; add_clause(clause); } } void SATEncoder::generate_conditional_lr_implication_or_definition(Lit condition1, Lit condition2, Lit lhs, vec& rhs) { { vec clause; for (int i = 0; i < rhs.size(); i++) { clause.growTo(2); clause[0] = lhs; clause[1] = ~rhs[i]; add_clause(clause); } } { vec clause(rhs.size() + 3); for (int i = 0; i < rhs.size(); i++) { clause[i] = rhs[i]; } clause[rhs.size()] = ~lhs; clause[rhs.size()+1] = ~condition1; clause[rhs.size()+2] = ~condition2; add_clause(clause); } } void SATEncoder::generate_xor_conditions(vec& vect) { vec clause; for (int i = 0; i < vect.size(); i++) { for (int j = i + 1; j < vect.size(); j++) { if (vect[i] == vect[j]) continue; clause.growTo(2); clause[0] = ~vect[i]; clause[1] = ~vect[j]; add_clause(clause); } } } void SATEncoder::generate_and(vec& vect) { for (int i = 0; i < vect.size(); i++) { generate_literal(vect[i]); } } void SATEncoder::generate_or(vec& vect) { add_clause(vect); } void SATEncoder::generate_equivalence_definition(Lit l1, Lit l2) { { vec clause(2); clause[0] = ~l1; clause[1] = l2; add_clause(clause); } { vec clause(2); clause[0] = l1; clause[1] = ~l2; add_clause(clause); } } /*-------------------------------------------------------------------------* * E N C O D I N G * *-------------------------------------------------------------------------*/ void SATEncoder::encode() { Clock clock; generate_satisfaction_conditions(); DEBUG_print(clock.elapsed()); generate_linked_definitions(); DEBUG_print(clock.elapsed()); generate_planarity_conditions(); DEBUG_print(clock.elapsed()); #ifdef _CONNECTIVITY_ generate_connectivity(); DEBUG_print(clock.elapsed()); #endif generate_encoding_specific_clauses(); DEBUG_print(clock.elapsed()); pp_prune(); power_prune(); DEBUG_print(clock.elapsed()); _variables->setVariableParameters(_solver); } /*-------------------------------------------------------------------------* * W O R D - T A G S * *-------------------------------------------------------------------------*/ void SATEncoder::build_word_tags() { for (int w = 0; w < _sent->length; w++) { _word_tags.push_back(WordTag(w, _variables, _sent, _opts)); int dfs_position = 0; if (_sent->word[w].x == NULL) { DEBUG_print("Word ." << w << ".: " << _sent->word[w].string << " (null)" << endl); continue; } bool join = _sent->word[w].x->next != NULL; Exp* exp = join ? join_alternatives(w) : _sent->word[w].x->exp; #ifdef _DEBUG cout << "Word ." << w << ".: " << _sent->word[w].string << endl; print_expression(exp); cout << endl; #endif char name[MAX_VARIABLE_NAME]; sprintf(name, "w%d", w); bool leading_right = true; bool leading_left = true; std::vector eps_right, eps_left; _word_tags[w].insert_connectors(exp, dfs_position, leading_right, leading_left, eps_right, eps_left, name, true, 0); if (join) free_alternatives(exp); } for (int wl = 0; wl < _sent->length - 1; wl++) { for (int wr = wl + 1; wr < _sent->length; wr++) { _word_tags[wl].add_matches_with_word(_word_tags[wr]); } } } void SATEncoder::find_all_matches_between_words(int w1, int w2, std::vector >& matches) { const std::vector& w1_right = _word_tags[w1].get_right_connectors(); std::vector::const_iterator i; for (i = w1_right.begin(); i != w1_right.end(); i++) { const std::vector& w2_left_c = (*i).matches; std::vector::const_iterator j; for (j = w2_left_c.begin(); j != w2_left_c.end(); j++) { if ((*j)->word == w2) { matches.push_back(std::pair(&(*i), *j)); } } } } bool SATEncoder::matches_in_interval(int wi, int pi, int l, int r) { for (int w = l; w < r; w++) { if (_word_tags[w].match_possible(wi, pi)) return true; } return false; } /*-------------------------------------------------------------------------* * S A T I S F A C T I O N * *-------------------------------------------------------------------------*/ void SATEncoder::generate_satisfaction_conditions() { for (int w = 0; w < _sent->length; w++) { if (_sent->word[w].x == NULL) { DEBUG_print("Word: " << _sent->word[w].string << " : " << "(null)" << endl); handle_null_expression(w); continue; } bool join = _sent->word[w].x->next != NULL; Exp* exp = join ? join_alternatives(w) : _sent->word[w].x->exp; #ifdef _DEBUG cout << "Word: " << _sent->word[w].string << endl; print_expression(exp); cout << endl; #endif char name[MAX_VARIABLE_NAME]; sprintf(name, "w%d", w); determine_satisfaction(w, name); int dfs_position = 0; generate_satisfaction_for_expression(w, dfs_position, exp, name, 0); if (join) free_alternatives(exp); } } void SATEncoder::generate_satisfaction_for_expression(int w, int& dfs_position, Exp* e, char* var, int parrent_cost) { E_list *l; int total_cost = parrent_cost + e->cost; if (e->type == CONNECTOR_type) { dfs_position++; generate_satisfaction_for_connector(w, dfs_position, e->u.string, e->dir, e->multi, e->cost, var); if (total_cost > _cost_cutoff) { Lit lhs = Lit(_variables->string_cost(var, e->cost)); generate_literal(~lhs); } } else { if (e->type == AND_type) { if (e->u.l == NULL) { /* zeroary and */ _variables->string_cost(var, e->cost); if (total_cost > _cost_cutoff) { generate_literal(~Lit(_variables->string_cost(var, e->cost))); } } else if (e->u.l != NULL && e->u.l->next == NULL) { /* unary and - skip */ generate_satisfaction_for_expression(w, dfs_position, e->u.l->e, var, total_cost); } else { /* n-ary and */ int i; char new_var[MAX_VARIABLE_NAME]; char* last_new_var = new_var; char* last_var = var; while(*last_new_var = *last_var) { last_new_var++; last_var++; } vec rhs; for (i = 0, l=e->u.l; l!=NULL; l=l->next, i++) { // sprintf(new_var, "%sc%d", var, i) char* s = last_new_var; *s++ = 'c'; fast_sprintf(s, i); rhs.push(Lit(_variables->string(new_var))); } Lit lhs = Lit(_variables->string_cost(var, e->cost)); generate_and_definition(lhs, rhs); /* Preceeds */ int dfs_position_tmp = dfs_position; for (l = e->u.l; l->next != NULL; l = l->next) { generate_conjunct_order_constraints(w, l->e, l->next->e, dfs_position_tmp); } /* Recurse */ for (i = 0, l=e->u.l; l!=NULL; l=l->next, i++) { // sprintf(new_var, "%sc%d", var, i) char* s = last_new_var; *s++ = 'c'; fast_sprintf(s, i); generate_satisfaction_for_expression(w, dfs_position, l->e, new_var, total_cost); } } } else if (e->type == OR_type) { if (e->u.l == NULL) { /* zeroary or */ cerr << "Zeroary OR" << endl; exit(EXIT_FAILURE); } else if (e->u.l != NULL && e->u.l->next == NULL) { /* unary or */ generate_satisfaction_for_expression(w, dfs_position, e->u.l->e, var, total_cost); } else { /* n-ary or */ int i; char new_var[MAX_VARIABLE_NAME]; char* last_new_var = new_var; char* last_var = var; while(*last_new_var = *last_var) { last_new_var++; last_var++; } vec rhs; for (i = 0, l=e->u.l; l!=NULL; l=l->next, i++) { // sprintf(new_var, "%sc%d", var, i) char* s = last_new_var; *s++ = 'd'; fast_sprintf(s, i); rhs.push(Lit(_variables->string(new_var))); } Lit lhs = Lit(_variables->string_cost(var, e->cost)); generate_or_definition(lhs, rhs); generate_xor_conditions(rhs); /* Recurse */ for (i = 0, l=e->u.l; l!=NULL; l=l->next, i++) { char* s = last_new_var; *s++ = 'd'; fast_sprintf(s, i); generate_satisfaction_for_expression(w, dfs_position, l->e, new_var, total_cost); } } } } } Exp* SATEncoder::join_alternatives(int w) { // join all alternatives using and OR_type node Exp* exp; E_list* or_list = NULL;; for (X_node* x = _sent->word[w].x; x != NULL; x = x->next) { E_list* new_node = (E_list*)xalloc(sizeof(E_list)); new_node->e = x->exp; new_node->next = NULL; if (or_list == NULL) { or_list = new_node; } else { E_list *y; for (y = or_list; y->next != NULL; y = y->next) ; y->next = new_node; } } exp = (Exp*)xalloc(sizeof(Exp)); exp->type = OR_type; exp->u.l = or_list; exp->cost = 0; return exp; } void SATEncoder::free_alternatives(Exp* exp) { E_list *l = exp->u.l; while (l != NULL) { E_list* next = l->next; xfree(l, sizeof(E_list)); l = next; } xfree(exp, sizeof(exp)); } void SATEncoder::generate_link_cw_ordinary_definition(int wi, int pi, const char* Ci, char dir, int cost, int wj) { Lit lhs = Lit(_variables->link_cw(wj, wi, pi, Ci)); char str[MAX_VARIABLE_NAME]; sprintf(str, "w%d", wj); Lit condition = Lit(_variables->string(str)); vec rhs; // Collect matches (wi, pi) with word wj std::vector& matches = _word_tags[wi].get(pi)->matches; std::vector::const_iterator i; for (i = matches.begin(); i != matches.end(); i++) { /* TODO: PositionConnector->matches[wj] */ if ((*i)->word != wj) continue; if (dir == '+') { rhs.push(Lit(_variables->link_cost(wi, pi, Ci, (*i)->word, (*i)->position, (*i)->connector->string, cost + (*i)->cost))); } else if (dir == '-'){ rhs.push(Lit(_variables->link((*i)->word, (*i)->position, (*i)->connector->string, wi, pi, Ci))); } } // Generate clauses DEBUG_print("--------- link_cw as ordinary down"); generate_conditional_lr_implication_or_definition(condition, lhs, rhs); generate_xor_conditions(rhs); DEBUG_print("--------- end link_cw as ordinary down"); } /*--------------------------------------------------------------------------* * C O N J U N C T O R D E R I N G * *--------------------------------------------------------------------------*/ int SATEncoder::num_connectors(Exp* e) { if (e->type == CONNECTOR_type) return 1; else { int num = 0; for (E_list* l = e->u.l; l != NULL; l = l->next) { num += num_connectors(l->e); } return num; } } int SATEncoder::empty_connectors(Exp* e, char dir) { if (e->type == CONNECTOR_type) { return e->dir != dir; } else if (e->type == OR_type) { for (E_list* l = e->u.l; l != NULL; l = l->next) { if (empty_connectors(l->e, dir)) return true; } return false; } else if (e->type == AND_type) { for (E_list* l = e->u.l; l != NULL; l = l->next) { if (!empty_connectors(l->e, dir)) return false; } return true; } else throw std::string("Unkown connector type"); } int SATEncoder::non_empty_connectors(Exp* e, char dir) { if (e->type == CONNECTOR_type) { return e->dir == dir; } else if (e->type == OR_type) { for (E_list* l = e->u.l; l != NULL; l = l->next) { if (non_empty_connectors(l->e, dir)) return true; } return false; } else if (e->type == AND_type) { for (E_list* l = e->u.l; l != NULL; l = l->next) { if (non_empty_connectors(l->e, dir)) return true; } return false; } else throw std::string("Unkown connector type"); } bool SATEncoder::trailing_connectors_and_aux(int w, E_list* l, char dir, int& dfs_position, std::vector& connectors) { if (l == NULL) { return true; } else { int dfs_position_in = dfs_position; dfs_position += num_connectors(l->e); if (trailing_connectors_and_aux(w, l->next, dir, dfs_position, connectors)) { trailing_connectors(w, l->e, dir, dfs_position_in, connectors); } return empty_connectors(l->e, dir); } } void SATEncoder::trailing_connectors(int w, Exp* exp, char dir, int& dfs_position, std::vector& connectors) { if (exp->type == CONNECTOR_type) { dfs_position++; if (exp->dir == dir) { connectors.push_back(_word_tags[w].get(dfs_position)); } } else if (exp->type == OR_type) { for (E_list* l = exp->u.l; l != NULL; l = l->next) { trailing_connectors(w, l->e, dir, dfs_position, connectors); } } else if (exp->type == AND_type) { trailing_connectors_and_aux(w, exp->u.l, dir, dfs_position, connectors); } } void SATEncoder::certainly_non_trailing(int w, Exp* exp, char dir, int& dfs_position, std::vector& connectors, bool has_right) { if (exp->type == CONNECTOR_type) { dfs_position++; if (exp->dir == dir && has_right) { connectors.push_back(_word_tags[w].get(dfs_position)); } } else if (exp->type == OR_type) { for (E_list* l = exp->u.l; l != NULL; l = l->next) { certainly_non_trailing(w, l->e, dir, dfs_position, connectors, has_right); } } else if (exp->type == AND_type) { if (has_right) { for (E_list* l = exp->u.l; l != NULL; l = l->next) { certainly_non_trailing(w, l->e, dir, dfs_position, connectors, true); } } else { for (E_list* l = exp->u.l; l != NULL; l = l->next) { has_right = false; for (E_list* m = l->next; m != NULL; m = m->next) { if (non_empty_connectors(m->e, dir) && !empty_connectors(m->e, dir)) { has_right = true; break; } } certainly_non_trailing(w, l->e, dir, dfs_position, connectors, has_right); } } } } void SATEncoder::leading_connectors(int w, Exp* exp, char dir, int& dfs_position, vector& connectors) { if (exp->type == CONNECTOR_type) { dfs_position++; if (exp->dir == dir) { connectors.push_back(_word_tags[w].get(dfs_position)); } } else if (exp->type == OR_type) { for (E_list* l = exp->u.l; l != NULL; l = l->next) { leading_connectors(w, l->e, dir, dfs_position, connectors); } } else if (exp->type == AND_type) { E_list* l; for (l = exp->u.l; l != NULL; l = l->next) { leading_connectors(w, l->e, dir, dfs_position, connectors); if (!empty_connectors(l->e, dir)) break; } if (l != NULL) { for (l = l->next; l != NULL; l = l->next) dfs_position += num_connectors(l->e); } } } void SATEncoder::generate_conjunct_order_constraints(int w, Exp *e1, Exp* e2, int& dfs_position) { DEBUG_print("----- conjunct order constraints"); int dfs_position_e1 = dfs_position; std::vector last_right_in_e1, first_right_in_e2; trailing_connectors(w, e1, '+', dfs_position_e1, last_right_in_e1); int dfs_position_e2 = dfs_position_e1; leading_connectors(w, e2, '+', dfs_position_e2, first_right_in_e2); vec clause; if (!last_right_in_e1.empty() && !first_right_in_e2.empty()) { std::vector::iterator i, j; for (i = last_right_in_e1.begin(); i != last_right_in_e1.end(); i++) { std::vector& matches_e1 = (*i)->matches; for (j = first_right_in_e2.begin(); j != first_right_in_e2.end(); j++) { std::vector& matches_e2 = (*j)->matches; std::vector::const_iterator m1, m2; std::vector mw1; for (m1 = matches_e1.begin(); m1 != matches_e1.end(); m1++) { if ((m1+1) == matches_e1.end() || (*m1)->word != (*(m1 + 1))->word) mw1.push_back((*m1)->word); } std::vector mw2; for (m2 = matches_e2.begin(); m2 != matches_e2.end(); m2++) { if ((m2+1) == matches_e2.end() || (*m2)->word != (*(m2 + 1))->word) mw2.push_back((*m2)->word); } std::vector::const_iterator mw1i, mw2i; for (mw1i = mw1.begin(); mw1i != mw1.end(); mw1i++) { for (mw2i = mw2.begin(); mw2i != mw2.end(); mw2i++) { if (*mw1i >= *mw2i) { clause.growTo(2); clause[0] = ~Lit(_variables->link_cw(*mw1i, w, (*i)->position, (*i)->connector->string)); clause[1] = ~Lit(_variables->link_cw(*mw2i, w, (*j)->position, (*j)->connector->string)); add_clause(clause); } } } } } } DEBUG_print("----"); dfs_position_e1 = dfs_position; std::vector last_left_in_e1, first_left_in_e2; trailing_connectors(w, e1, '-', dfs_position_e1, last_left_in_e1); dfs_position_e2 = dfs_position_e1; leading_connectors(w, e2, '-', dfs_position_e2, first_left_in_e2); if (!last_left_in_e1.empty() && !first_left_in_e2.empty()) { std::vector::iterator i, j; for (i = last_left_in_e1.begin(); i != last_left_in_e1.end(); i++) { std::vector& matches_e1 = (*i)->matches; for (j = first_left_in_e2.begin(); j != first_left_in_e2.end(); j++) { std::vector& matches_e2 = (*j)->matches; std::vector::const_iterator m1, m2; std::vector mw1; for (m1 = matches_e1.begin(); m1 != matches_e1.end(); m1++) { if ((m1+1) == matches_e1.end() || (*m1)->word != (*(m1 + 1))->word) mw1.push_back((*m1)->word); } std::vector mw2; for (m2 = matches_e2.begin(); m2 != matches_e2.end(); m2++) { if ((m2+1) == matches_e2.end() || (*m2)->word != (*(m2 + 1))->word) mw2.push_back((*m2)->word); } std::vector::const_iterator mw1i, mw2i; for (mw1i = mw1.begin(); mw1i != mw1.end(); mw1i++) { for (mw2i = mw2.begin(); mw2i != mw2.end(); mw2i++) { if (*mw1i <= *mw2i) { clause.growTo(2); clause[0] = ~Lit(_variables->link_cw(*mw1i, w, (*i)->position, (*i)->connector->string)); clause[1] = ~Lit(_variables->link_cw(*mw2i, w, (*j)->position, (*j)->connector->string)); add_clause(clause); } } } } } } dfs_position = dfs_position_e1; DEBUG_print("---end conjunct order constraints"); } /*--------------------------------------------------------------------------* * C O N N E C T I V I T Y * *--------------------------------------------------------------------------*/ #ifdef _CONNECTIVITY_ void SATEncoder::generate_connectivity() { for (int w = 1; w < _sent->length; w++) { if (!_linkage_possible(0, w)) { vec clause; clause.push(~Lit(_variables->con(w, 1))); generate_and(clause); } else { generate_equivalence_definition(Lit(_variables->con(w, 1)), Lit(_variables->linked(0, w))); } } for (int d = 2; d < _sent->length; d++) { for (int w = 1; w < _sent->length; w++) { Lit lhs = Lit(_variables->con(w, d)); vec rhs; rhs.push(Lit(_variables->con(w, d-1))); for (int w1 = 1; w1 < _sent->length; w1++) { if (w == w1) continue; if (!_linkage_possible(std::min(w, w1), std::max(w, w1))) { continue; } rhs.push(Lit(_variables->l_con(w, w1, d-1))); } generate_or_definition(lhs, rhs); /* lc definitions*/ for (int w1 = 1; w1 < _sent->length; w1++) { if (w == w1) continue; int mi = std::min(w, w1), ma = std::max(w, w1); if (!_linked_possible(mi, ma)) continue; Lit lhs = Lit(_variables->l_con(w, w1, d-1)); vec rhs(2); rhs[0] = Lit(_variables->linked(mi, ma)); rhs[1] = Lit(_variables->con(w1, d-1)); generate_classical_and_definition(lhs, rhs); } } } for (int w = 1; w < _sent->length; w++) { generate_literal(Lit(_variables->con(w, _sent->length-1))); } } #endif void SATEncoder::dfs(int node, const MatrixUpperTriangle& graph, int component, std::vector& components) { if (components[node] != -1) return; components[node] = component; for (int other_node = node + 1; other_node < components.size(); other_node++) { if (graph(node, other_node)) dfs(other_node, graph, component, components); } for (int other_node = 0; other_node < node; other_node++) { if (graph(other_node, node)) dfs(other_node, graph, component, components); } } bool SATEncoder::connectivity_components(std::vector& components) { // get satisfied linked(wi, wj) variables const std::vector& linked_variables = _variables->linked_variables(); std::vector satisfied_linked_variables; for (std::vector::const_iterator i = linked_variables.begin(); i != linked_variables.end(); i++) { int var = *i; if (_solver->model[var] == l_True) { satisfied_linked_variables.push_back(var); } } // build the connectivity graph MatrixUpperTriangle graph(_sent->length, 0); std::vector::const_iterator i; for (i = satisfied_linked_variables.begin(); i != satisfied_linked_variables.end(); i++) { graph.set(_variables->linked_variable(*i)->left_word, _variables->linked_variable(*i)->right_word, 1); } // determine the connectivity components components.resize(_sent->length); std::fill(components.begin(), components.end(), -1); for (int node = 0; node < _sent->length; node++) dfs(node, graph, node, components); bool connected = true; for (int node = 0; node < _sent->length; node++) { if (components[node] != 0) { connected = false; } } return connected; } void SATEncoder::generate_disconnectivity_prohibiting(std::vector components) { // vector of unique components std::vector different_components = components; std::sort(different_components.begin(), different_components.end()); different_components.erase(std::unique(different_components.begin(), different_components.end()), different_components.end()); // Each connected component must contain a branch going out of it std::vector::const_iterator c; for (c = different_components.begin(); c != different_components.end(); c++) { vec clause; const std::vector& linked_variables = _variables->linked_variables(); for (std::vector::const_iterator i = linked_variables.begin(); i != linked_variables.end(); i++) { int var = *i; const Variables::LinkedVar* lv = _variables->linked_variable(var); if ((components[lv->left_word] == *c && components[lv->right_word] != *c) || (components[lv->left_word] != *c && components[lv->right_word] == *c)) { clause.push(Lit(var)); } } _solver->addConflictingClause(clause); if (different_components.size() == 2) break; } } /*--------------------------------------------------------------------------* * P L A N A R I T Y * *--------------------------------------------------------------------------*/ void SATEncoder::generate_planarity_conditions() { vec clause; for (int wi1 = 0; wi1 < _sent->length; wi1++) { for (int wj1 = wi1+1; wj1 < _sent->length; wj1++) { for (int wi2 = wj1+1; wi2 < _sent->length; wi2++) { if (!_linked_possible(wi1, wi2)) continue; for (int wj2 = wi2+1; wj2 < _sent->length; wj2++) { if (!_linked_possible(wj1, wj2)) continue; clause.growTo(2); clause[0] = ~Lit(_variables->linked(wi1, wi2)); clause[1] = ~Lit(_variables->linked(wj1, wj2)); add_clause(clause); } } } } // generate_linked_min_max_planarity(); } /*--------------------------------------------------------------------------* * P O W E R P R U N I N G * *--------------------------------------------------------------------------*/ void SATEncoder::generate_epsilon_definitions() { for (int w = 0; w < _sent->length; w++) { if (_sent->word[w].x == NULL) { continue; } bool join = _sent->word[w].x->next != NULL; Exp* exp = join ? join_alternatives(w) : _sent->word[w].x->exp; char name[MAX_VARIABLE_NAME]; sprintf(name, "w%d", w); int dfs_position; dfs_position = 0; generate_epsilon_for_expression(w, dfs_position, exp, name, true, '+'); dfs_position = 0; generate_epsilon_for_expression(w, dfs_position, exp, name, true, '-'); if (join) free_alternatives(exp); } } bool SATEncoder::generate_epsilon_for_expression(int w, int& dfs_position, Exp* e, char* var, bool root, char dir) { E_list *l; if (e->type == CONNECTOR_type) { dfs_position++; if (var != NULL) { if (e->dir == dir) { // generate_literal(-_variables->epsilon(name, var, e->dir)); return false; } else { generate_equivalence_definition(Lit(_variables->epsilon(var, dir)), Lit(_variables->string(var))); return true; } } } else if (e->type == AND_type) { if (e->u.l == NULL) { /* zeroary and */ generate_equivalence_definition(Lit(_variables->string(var)), Lit(_variables->epsilon(var, dir))); return true; } else if (e->u.l != NULL && e->u.l->next == NULL) { /* unary and - skip */ return generate_epsilon_for_expression(w, dfs_position, e->u.l->e, var, root, dir); } else { /* Recurse */ E_list* l; int i; bool eps = true; char new_var[MAX_VARIABLE_NAME]; char* last_new_var = new_var; char* last_var = var; while(*last_new_var = *last_var) { last_new_var++; last_var++; } for (i = 0, l = e->u.l; l != NULL; l = l->next, i++) { // sprintf(new_var, "%sc%d", var, i) char* s = last_new_var; *s++ = 'c'; fast_sprintf(s, i); if (!generate_epsilon_for_expression(w, dfs_position, l->e, new_var, false, dir)) { eps = false; break; } } if (l != NULL) { for (l = l->next; l != NULL; l = l->next) dfs_position += num_connectors(l->e); } if (!root && eps) { Lit lhs = Lit(_variables->epsilon(var, dir)); vec rhs; for (i = 0, l=e->u.l; l!=NULL; l=l->next, i++) { // sprintf(new_var, "%sc%d", var, i) char* s = last_new_var; *s++ = 'c'; fast_sprintf(s, i); rhs.push(Lit(_variables->epsilon(new_var, dir))); } generate_classical_and_definition(lhs, rhs); } return eps; } } else if (e->type == OR_type) { if (e->u.l != NULL && e->u.l->next == NULL) { /* unary or - skip */ return generate_epsilon_for_expression(w, dfs_position, e->u.l->e, var, root, dir); } else { /* Recurse */ E_list* l; int i; bool eps = false; char new_var[MAX_VARIABLE_NAME]; char* last_new_var = new_var; char* last_var = var; while(*last_new_var = *last_var) { last_new_var++; last_var++; } vec rhs; for (i = 0, l = e->u.l; l != NULL; l = l->next, i++) { // sprintf(new_var, "%sc%d", var, i) char* s = last_new_var; *s++ = 'd'; fast_sprintf(s, i); if (generate_epsilon_for_expression(w, dfs_position, l->e, new_var, false, dir) && !root) { rhs.push(Lit(_variables->epsilon(new_var, dir))); eps = true; } } if (!root && eps) { Lit lhs = Lit(_variables->epsilon(var, dir)); generate_or_definition(lhs, rhs); } return eps; } } return false; } void SATEncoder::power_prune() { generate_epsilon_definitions(); // on two non-adjacent words, a pair of connectors can be used only // if not [both of them are the deepest]. for (int wl = 0; wl < _sent->length - 2; wl++) { const std::vector& rc = _word_tags[wl].get_right_connectors(); std::vector::const_iterator rci; for (rci = rc.begin(); rci != rc.end(); rci++) { if (!(*rci).leading_right || (*rci).connector->multi) continue; const std::vector& matches = rci->matches; for (std::vector::const_iterator lci = matches.begin(); lci != matches.end(); lci++) { if (!(*lci)->leading_left || (*lci)->connector->multi || (*lci)->word <= wl + 2) continue; // printf("LR: .%d. .%d. %s\n", wl, rci->position, rci->connector->string); // printf("LL: .%d. .%d. %s\n", (*lci)->word, (*lci)->position, (*lci)->connector->string); vec clause; for (std::vector::const_iterator i = rci->eps_right.begin(); i != rci->eps_right.end(); i++) { clause.push(~Lit(*i)); } for (std::vector::const_iterator i = (*lci)->eps_left.begin(); i != (*lci)->eps_left.end(); i++) { clause.push(~Lit(*i)); } add_additional_power_pruning_conditions(clause, wl, (*lci)->word); clause.push(~Lit(_variables->link(wl, rci->position, rci->connector->string, (*lci)->word, (*lci)->position, (*lci)->connector->string))); add_clause(clause); } } } /* // on two adjacent words, a pair of connectors can be used only if // they're the deepest ones on their disjuncts for (int wl = 0; wl < _sent->length - 2; wl++) { const std::vector& rc = _word_tags[wl].get_right_connectors(); std::vector::const_iterator rci; for (rci = rc.begin(); rci != rc.end(); rci++) { if (!(*rci).leading_right) continue; const std::vector& matches = rci->matches; for (std::vector::const_iterator lci = matches.begin(); lci != matches.end(); lci++) { if (!(*lci)->leading_left || (*lci)->word != wl + 1) continue; int link = _variables->link(wl, rci->position, rci->connector->string, (*lci)->word, (*lci)->position, (*lci)->connector->string); std::vector clause(2); clause[0] = -link; for (std::vector::const_iterator i = rci->eps_right.begin(); i != rci->eps_right.end(); i++) { clause[1] = *i; } for (std::vector::const_iterator i = (*lci)->eps_left.begin(); i != (*lci)->eps_left.end(); i++) { clause[1] = *i; } add_clause(clause); } } } // Two deep connectors cannot match (deep means notlast) std::vector > certainly_deep_left(_sent->length), certainly_deep_right(_sent->length); for (int w = 0; w < _sent->length; w++) { if (_sent->word[w].x == NULL) continue; bool join = _sent->word[w].x->next != NULL; Exp* exp = join ? join_alternatives(w) : _sent->word[w].x->exp; int dfs_position = 0; certainly_non_trailing(w, exp, '+', dfs_position, certainly_deep_right[w], false); dfs_position = 0; certainly_non_trailing(w, exp, '-', dfs_position, certainly_deep_left[w], false); if (join) free_alternatives(exp); } for (int w = 0; w < _sent->length; w++) { std::vector::const_iterator i; for (i = certainly_deep_right[w].begin(); i != certainly_deep_right[w].end(); i++) { const std::vector& matches = (*i)->matches; std::vector::const_iterator j; for (j = matches.begin(); j != matches.end(); j++) { if (std::find(certainly_deep_left[(*j)->word].begin(), certainly_deep_left[(*j)->word].end(), *j) != certainly_deep_left[(*j)->word].end()) { generate_literal(-_variables->link((*i)->word, (*i)->position, (*i)->connector->string, (*j)->word, (*j)->position, (*j)->connector->string)); } } } } */ } /*--------------------------------------------------------------------------* * P O S T P R O C E S S I N G & P P P R U N I N G * *--------------------------------------------------------------------------*/ void SATEncoder::pp_prune() { const std::vector& link_variables = _variables->link_variables(); if (_sent->dict->postprocessor == NULL) return; pp_knowledge * knowledge; knowledge = _sent->dict->postprocessor->knowledge; for (int i=0; in_contains_one_rules; i++) { pp_rule rule; const char * selector; pp_linkset * link_set; rule = knowledge->contains_one_rules[i]; selector = rule.selector; /* selector string for this rule */ link_set = rule.link_set; /* the set of criterion links */ vec triggers; for (int i = 0; i < link_variables.size(); i++) { const Variables::LinkVar* var = _variables->link_variable(link_variables[i]); if (post_process_match(rule.selector, var->label)) { triggers.push(Lit(link_variables[i])); } } if (triggers.size() == 0) continue; vec criterions; for (int j = 0; j < link_variables.size(); j++) { pp_linkset_node *p; for (int hashval = 0; hashval < link_set->hash_table_size; hashval++) { for (p = link_set->hash_table[hashval]; p!=NULL; p=p->next) { const Variables::LinkVar* var = _variables->link_variable(link_variables[j]); if (post_process_match(p->str, var->label)) { criterions.push(Lit(link_variables[j])); } } } } DEBUG_print("---pp_pruning--"); for (int k = 0; k < triggers.size(); k++) { vec clause(criterions.size() + 1); for (int i = 0; i < criterions.size(); i++) clause[i] = criterions[i]; clause[criterions.size()] = (~triggers[k]); add_clause(clause); } DEBUG_print("---end pp_pruning--"); } } /* TODO: replace with analyze_xxx_linkage */ bool SATEncoder::post_process_linkage(Linkage linkage) { if (parse_options_get_use_fat_links(_opts) && set_has_fat_down(_sent)) { Linkage_info li = analyze_fat_linkage(_sent, _opts, PP_SECOND_PASS); return li.N_violations == 0; } else { Linkage_info li = analyze_thin_linkage(_sent, _opts, PP_SECOND_PASS); return li.N_violations == 0; } return 1; } /*--------------------------------------------------------------------------* * D E C O D I N G * *--------------------------------------------------------------------------*/ Linkage SATEncoder::create_linkage() { /* Using exalloc since this is external to the parser itself. */ Linkage linkage = (Linkage) exalloc(sizeof(struct Linkage_s)); memset(linkage, 0, sizeof(struct Linkage_s)); linkage->num_words = _sent->length; linkage->word = (const char **) exalloc(linkage->num_words*sizeof(char *)); linkage->sent = _sent; linkage->opts = _opts; // linkage->info = sent->link_info[k]; if (_sent->parse_info) { Parse_info pi = _sent->parse_info; for (int i=0; i< MAX_LINKS; i++) { free_connectors(pi->link_array[i].lc); free_connectors(pi->link_array[i].rc); } free_parse_info(_sent->parse_info); _sent->parse_info = NULL; } Parse_info pi = _sent->parse_info = parse_info_new(_sent->length); bool fat = extract_links(pi); // compute_chosen_words(sent, linkage); /* TODO: this is just a simplified version of the compute_chosen_words. */ for (int i = 0; i < _sent->length; i++) { char *s = (char *) exalloc(strlen(_sent->word[i].string)+1); strcpy(s, _sent->word[i].string); linkage->word[i] = s; } linkage->num_words = _sent->length; pi->N_words = _sent->length; if (!fat || !parse_options_get_use_fat_links(_opts)) extract_thin_linkage(_sent, _opts, linkage); else extract_fat_linkage(_sent, _opts, linkage); linkage_set_current_sublinkage(linkage, 0); return linkage; } void SATEncoder::generate_linkage_prohibiting() { vec clause; const std::vector& link_variables = _variables->link_variables(); for (std::vector::const_iterator i = link_variables.begin(); i != link_variables.end(); i++) { int var = *i; if (_solver->model[var] == l_True) { clause.push(~Lit(var)); } else if (_solver->model[var] == l_False) { clause.push(Lit(var)); } } _solver->addConflictingClause(clause); } Linkage SATEncoder::get_next_linkage() { if (l_False == _solver->solve()) return NULL; Linkage linkage = create_linkage(); std::vector components; bool connected = connectivity_components(components); if (connected) { // num_connected_linkages++; if (post_process_linkage(linkage)) { cout << "Linkage PP OK" << endl; _sent->num_valid_linkages++; } else { cout << "Linkage PP NOT OK" << endl; } generate_linkage_prohibiting(); } else { cout << "Linkage DISCONNECTED" << endl; generate_disconnectivity_prohibiting(components); } _solver->printStats(); return linkage; } /******************************************************************************* * SAT encoding for sentences that do not contain conjunction. * *******************************************************************************/ void SATEncoderConjunctionFreeSentences::generate_encoding_specific_clauses() { } void SATEncoderConjunctionFreeSentences::handle_null_expression(int w) { // Formula is unsatisfiable vec clause; add_clause(clause); } void SATEncoderConjunctionFreeSentences::determine_satisfaction(int w, char* name) { // All tags must be satisfied generate_literal(Lit(_variables->string(name))); } void SATEncoderConjunctionFreeSentences::generate_satisfaction_for_connector(int wi, int pi, const char* Ci, char dir, bool multi, int cost, char* var) { Lit lhs = Lit(_variables->string_cost(var, cost)); #ifdef _DEBUG cout << "*** Connector: ." << wi << ". ." << pi << ". " << Ci << dir << endl; #endif // words that can potentially match (wi, pi) int low = (dir == '-') ? 0 : wi + 1; int hi = (dir == '-') ? wi : _sent->length; std::vector _w_; for (int wj = low; wj < hi; wj++) { // Eliminate words that cannot be connected to (wi, pi) if (!_word_tags[wj].match_possible(wi, pi)) continue; // Now we know that there is a potential link between the // connector (wi, pi) and the word wj _w_.push_back(wj); generate_link_cw_ordinary_definition(wi, pi, Ci, dir, cost, wj); } vec _link_cw_; for (int i = 0; i < _w_.size(); i++) _link_cw_.push(Lit(_variables->link_cw(_w_[i], wi, pi, Ci))); generate_or_definition(lhs, _link_cw_); DEBUG_print("--------- multi"); if (!multi) { generate_xor_conditions(_link_cw_); } DEBUG_print("--------- end multi"); #ifdef _DEBUG cout << "*** End Connector: ." << wi << ". ." << pi << ". " << Ci << endl; #endif } void SATEncoderConjunctionFreeSentences::generate_linked_definitions() { _linked_possible.resize(_sent->length, 1); DEBUG_print("------- linked definitions"); for (int w1 = 0; w1 < _sent->length; w1++) { for (int w2 = w1 + 1; w2 < _sent->length; w2++) { DEBUG_print("---------- ." << w1 << ". ." << w2 << "."); Lit lhs = Lit(_variables->linked(w1, w2)); vec rhs; const std::vector& w1_connectors = _word_tags[w1].get_right_connectors(); std::vector::const_iterator c; for (c = w1_connectors.begin(); c != w1_connectors.end(); c++) { assert(c->word == w1, "Connector word must match"); if (_word_tags[w2].match_possible(c->word, c->position)) { rhs.push(Lit(_variables->link_cw(w2, c->word, c->position, c->connector->string))); } } _linked_possible.set(w1, w2, rhs.size() > 0); generate_or_definition(lhs, rhs); } } DEBUG_print("------- end linked definitions"); } void SATEncoder::generate_linked_min_max_planarity() { DEBUG_print("---- linked_max"); for (int w1 = 0; w1 < _sent->length; w1++) { for (int w2 = 0; w2 < _sent->length; w2++) { Lit lhs = Lit(_variables->linked_max(w1, w2)); vec rhs; if (w2 < _sent->length - 1) { rhs.push(Lit(_variables->linked_max(w1, w2 + 1))); if (w1 != w2 + 1 && _linked_possible(std::min(w1, w2+1), std::max(w1, w2+1))) rhs.push(~Lit(_variables->linked(std::min(w1, w2+1), std::max(w1, w2+1)))); } generate_classical_and_definition(lhs, rhs); } } DEBUG_print("---- end linked_max"); DEBUG_print("---- linked_min"); for (int w1 = 0; w1 < _sent->length; w1++) { for (int w2 = 0; w2 < _sent->length; w2++) { Lit lhs = Lit(_variables->linked_min(w1, w2)); vec rhs; if (w2 > 0) { rhs.push(Lit(_variables->linked_min(w1, w2 - 1))); if (w1 != w2-1 && _linked_possible(std::min(w1, w2 - 1), std::max(w1, w2 - 1))) rhs.push(~Lit(_variables->linked(std::min(w1, w2 - 1), std::max(w1, w2 - 1)))); } generate_classical_and_definition(lhs, rhs); } } DEBUG_print("---- end linked_min"); vec clause; for (int wi = 3; wi < _sent->length; wi++) { for (int wj = 1; wj < wi - 1; wj++) { for (int wl = wj + 1; wl < wi; wl++) { clause.growTo(3); clause[0] = ~Lit(_variables->linked_min(wi, wj)); clause[1] = ~Lit(_variables->linked_max(wi, wl - 1)); clause[2] = Lit(_variables->linked_min(wl, wj)); add_clause(clause); } } } DEBUG_print("------------"); for (int wi = 0; wi < _sent->length - 1; wi++) { for (int wj = wi + 1; wj < _sent->length - 1; wj++) { for (int wl = wi+1; wl < wj; wl++) { clause.growTo(3); clause[0] = ~Lit(_variables->linked_max(wi, wj)); clause[1] = ~Lit(_variables->linked_min(wi, wl + 1)); clause[2] = Lit(_variables->linked_max(wl, wj)); add_clause(clause); } } } DEBUG_print("------------"); clause.clear(); for (int wi = 1; wi < _sent->length; wi++) { for (int wj = wi + 2; wj < _sent->length - 1; wj++) { for (int wl = wi + 1; wl < wj; wl++) { clause.growTo(2); clause[0] = ~Lit(_variables->linked_min(wi, wj)); clause[1] = Lit(_variables->linked_min(wl, wi)); add_clause(clause); clause.growTo(2); clause[0] = ~Lit(_variables->linked_max(wj, wi)); clause[1] = Lit(_variables->linked_max(wl, wj)); add_clause(clause); } } } } bool SATEncoderConjunctionFreeSentences::extract_links(Parse_info pi) { int current_link = 0; const std::vector& link_variables = _variables->link_variables(); std::vector::const_iterator i; for (i = link_variables.begin(); i != link_variables.end(); i++) { if (_solver->model[*i] != l_True) continue; const Variables::LinkVar* var = _variables->link_variable(*i); if (_solver->model[_variables->linked(var->left_word, var->right_word)] != l_True) continue; pi->link_array[current_link].l = var->left_word; pi->link_array[current_link].r = var->right_word; // pi->link_array[j].name = var->label; Connector* connector; connector = connector_new(); connector->string = var->left_connector; pi->link_array[current_link].lc = connector; connector = connector_new(); connector->string = var->right_connector; pi->link_array[current_link].rc = connector; current_link++; } pi->N_links = current_link; DEBUG_print("Total: ." << pi->N_links << "." << endl); return false; } /******************************************************************************* * SAT encoding for sentences that contain conjunction. * *******************************************************************************/ // Check if a connector is andable static int is_andable(Sentence sent, Connector* c, char dir) { /* if no set, then everything is considered andable */ if (sent->dict->andable_connector_set == NULL) return TRUE; return match_in_connector_set(sent, sent->dict->andable_connector_set, c, dir); } void SATEncoderConjunctiveSentences::handle_null_expression(int w) { // Formula is unsatisfiable, but only if w is not a conjunctive // word. Conjunctive words can have empty tags, but then they must // have fat-links attached. if (!isConnectiveOrComma(w)) { vec clause; add_clause(clause); } else { char str[MAX_VARIABLE_NAME]; sprintf(str, "fl_d_%d", w); generate_literal(Lit(_variables->string(str))); sprintf(str, "w%d", w); generate_literal(~Lit(_variables->string(str))); } } void SATEncoderConjunctiveSentences::determine_satisfaction(int w, char* name) { if (!parse_options_get_use_fat_links(_opts) || !isConnectiveOrComma(w)) { // Non-conjunctive words must have their tags satisfied generate_literal(Lit(_variables->string(name))); } else { // Tags of conjunctive words are satisfied iff they are not fat-linked either_tag_or_fat_link(w, Lit(_variables->string(name))); } } void SATEncoderConjunctiveSentences::generate_satisfaction_for_connector(int wi, int pi, const char* Ci, char dir, bool multi, int cost, char* var) { Lit lhs = Lit(_variables->string_cost(var, cost)); #ifdef _DEBUG cout << "*** Connector: ." << wi << ". ." << pi << ". " << Ci << dir << endl; #endif // words that can potentially match (wi, pi) int low = (dir == '-') ? 0 : wi + 1; int hi = (dir == '-') ? wi : _sent->length; // determine if opposite of (wi, pi) is andable Connector conn; init_connector(&conn); conn.label = NORMAL_LABEL; conn.priority = THIN_priority; conn.string = Ci; bool andable_opposite = is_andable(_sent, &conn, dir == '+' ? '-' : '+'); std::vector _w_; for (int wj = low; wj < hi; wj++) { // Eliminate words that cannot be connected to (wi, pi) if (!link_cw_possible(wi, pi, Ci, dir, wj, 1, _sent->length-1)) continue; // Now we know that there is a potential link between the // connector (wi, pi) and the word w _w_.push_back(wj); // link_cw down definitions as ordinary words if (_word_tags[wj].match_possible(wi, pi) || isConnectiveOrComma(wj)) { generate_link_cw_ordinary_definition(wi, pi, Ci, dir, cost, wj); } // link_cw down definitions as special words if (isConnectiveOrComma(wj)) { if (!link_cw_possible_with_fld(wi, pi, Ci, dir, wj, 1, _sent->length-1)) { generate_link_cw_connective_impossible(wi, pi, Ci, wj); } else { generate_link_cw_connective_definition(wi, pi, Ci, wj); } } // ------------------------------------------------------------------------ // link_top_cw up defintions if (andable_opposite) { // connections can be either directly established or inherited from above generate_link_top_cw_up_definition(wj, wi, pi, Ci, multi); } else { // connection is established iff it is directly established // i.e., it cannot be inherited from above generate_link_top_cw_iff_link_cw(wj, wi, pi, Ci); } // Commas cannot be directly connected if they have fat links down if (parse_options_get_use_fat_links(_opts) && isComma(_sent, wj)) { vec clause; char str[MAX_VARIABLE_NAME]; sprintf(str,"fl_d_%d", wj); clause.push(~Lit(_variables->string(str))); clause.push(~Lit(_variables->link_top_cw(wj, wi, pi, Ci))); add_clause(clause); } } vec _link_cw_; for (int i = 0; i < _w_.size(); i++) _link_cw_.push(Lit(_variables->link_cw(_w_[i], wi, pi, Ci))); generate_or_definition(lhs, _link_cw_); vec _link_top_cw_; for (int i = 0; i < _w_.size(); i++) _link_top_cw_.push(Lit(_variables->link_top_cw(_w_[i], wi, pi, Ci))); // Faster generate_or_definition(lhs, _link_top_cw_); DEBUG_print("--------- multi"); if (!multi) { generate_xor_conditions(_link_top_cw_); } DEBUG_print("--------- end multi"); #ifdef _DEBUG cout << "*** End Connector: ." << wi << ". ." << pi << ". " << Ci << endl; #endif } void SATEncoderConjunctiveSentences::add_additional_power_pruning_conditions(vec& clause, int wl, int wr) { char str[MAX_VARIABLE_NAME]; sprintf(str, "fl_ur_%d", wl); clause.push(Lit(_variables->string(str))); sprintf(str, "fl_ul_%d", wl); clause.push(Lit(_variables->string(str))); sprintf(str, "fl_ul_%d", wr); clause.push(Lit(_variables->string(str))); sprintf(str, "fl_ur_%d", wr); clause.push(Lit(_variables->string(str))); } void SATEncoderConjunctiveSentences::generate_encoding_specific_clauses() { generate_label_compatibility(); generate_fat_link_existence(); generate_fat_link_up_definitions(); generate_fat_link_down_definitions(); generate_fat_link_up_between_down_conditions(); generate_fat_link_comma_conditions(); generate_fat_link_crossover_conditions(); generate_fat_link_Left_Wall_not_inside(); generate_fat_link_linked_upperside(); generate_fat_link_neighbor(); } void SATEncoderConjunctiveSentences::init_connective_words() { for (int i = 0; i < _sent->length; i++) { if (::isConnectiveOrComma(_sent, i)) { _connectives.push_back(i); _is_connective_or_comma.push_back(true); } else { _is_connective_or_comma.push_back(false); } } } /* If there is a direct link between a connective word wi and a connector (w,p), then there is an indirect link between wi and (w, p). */ void SATEncoderConjunctiveSentences::generate_link_top_cw_iff_link_cw(int wi, int wj, int pj, const char* Cj) { DEBUG_print("--------- link_top_cw iff link_cw"); vec clause; clause.growTo(2); clause[0] = ~Lit(_variables->link_cw(wi, wj, pj, Cj)); clause[1] = Lit(_variables->link_top_cw(wi, wj, pj, Cj)); add_clause(clause); clause.growTo(2); clause[0] = ~Lit(_variables->link_top_cw(wi, wj, pj, Cj)); clause[1] = Lit(_variables->link_cw(wi, wj, pj, Cj)); add_clause(clause); DEBUG_print("--------- end link_top_cw iff link_cw"); } void SATEncoderConjunctiveSentences::generate_link_top_cw_up_definition(int wj, int wi, int pi, const char* Ci, bool multi) { DEBUG_print("--------- link_top_cw definition"); Lit link_cw_wj = Lit(_variables->link_cw(wj, wi, pi, Ci)); Lit link_top_cw_wj = Lit(_variables->link_top_cw(wj, wi, pi, Ci)); char dir = wi < wj ? '+' : '-'; vec clause; clause.growTo(2); clause[0] = ~link_top_cw_wj; clause[1] = link_cw_wj; add_clause(clause); // Collect connectors up std::vector Wk; for (int k = 0; k < _connectives.size(); k++) { int wk = _connectives[k]; if (wk != wj && (wj - wi)*(wk - wi) > 0 && link_cw_possible_with_fld(wi, pi, Ci, dir, wk, 1, _sent->length - 1)) Wk.push_back(wk); } for (int k = 0; k < Wk.size(); k++) { int wk = Wk[k]; clause.growTo(4); clause[0] = link_top_cw_wj; clause[1] = ~link_cw_wj; clause[2] = ~Lit(_variables->fat_link(wj, wk)); clause[3] = Lit(_variables->link_cw(wk, wi, pi, Ci)); add_clause(clause); } clause.clear(); for (int k = 0; k < Wk.size(); k++) { int wk = Wk[k]; clause.growTo(3); clause[0] = ~link_top_cw_wj; clause[1] = ~Lit(_variables->fat_link(wj, wk)); clause[2] = ~Lit(_variables->link_cw(wk, wi, pi, Ci)); add_clause(clause); } clause.clear(); clause.push(~link_cw_wj); clause.push(link_top_cw_wj); for (int k = 0; k < Wk.size(); k++) { int wk = Wk[k]; clause.push(Lit(_variables->fat_link(wj, wk))); } add_clause(clause); if (clause.size() == 2) return; // Faster clause.clear(); clause.push(~link_cw_wj); clause.push(link_top_cw_wj); for (int k = 0; k < Wk.size(); k++) { int wk = Wk[k]; clause.push(Lit(_variables->link_cw(wk, wi, pi, Ci))); } add_clause(clause); if (multi) { // cannot directly link to both ends of the fat link clause.clear(); for (int k = 0; k < Wk.size(); k++) { int wk = Wk[k]; clause.growTo(3); clause[0] = ~Lit(_variables->fat_link(wj, wk)); clause[1] = ~Lit(_variables->link_top_cw(wj, wi, pi, Ci)); clause[2] = ~Lit(_variables->link_top_cw(wk, wi, pi, Ci)); add_clause(clause); } } DEBUG_print("--------- end link_top_cw definition"); } /* If there is an indirect link from a connective word or a comma wi to a connector (wj, pj), then, there exist two words wk1 and wk2, such that: (1) (a) wk1 is between wi and wj (b) there is a fat-link between wk1 and wi (c) there is an indirect link between wk1 and (wj, pj) (2) (a) wi is between wk2 and wj (b) there is a fat-link between wk2 and wi (c) there is an indirect link between wk2 and (wj, pj) */ void SATEncoderConjunctiveSentences::generate_link_cw_connective_definition(int wj, int pj, const char* Cj, int wi) { DEBUG_print("--------- link_cw as special"); char str[MAX_VARIABLE_NAME]; sprintf(str, "fl_d_%d", wi); Lit not_wi_fld = ~Lit(_variables->string(str)); char link_cw_k1_str[MAX_VARIABLE_NAME]; sprintf(link_cw_k1_str, "%d_%d_%d__1", wj, pj, wi); Lit link_cw_k1(_variables->string(link_cw_k1_str)); char link_cw_k2_str[MAX_VARIABLE_NAME]; sprintf(link_cw_k2_str, "%d_%d_%d__2", wj, pj, wi); Lit link_cw_k2(_variables->string(link_cw_k2_str)); Lit not_link_wi_wjpj = ~Lit(_variables->link_cw(wi, wj, pj, Cj)); char dir = wj < wi ? '+' : '-'; vec clause; clause.growTo(3); clause[0] = not_wi_fld; clause[1] = not_link_wi_wjpj; clause[2] = link_cw_k1; add_clause(clause); clause.growTo(3); clause[0] = not_wi_fld; clause[1] = not_link_wi_wjpj; clause[2] = link_cw_k2; add_clause(clause); clause.growTo(3); clause[0] = ~link_cw_k1; clause[1] = ~link_cw_k2; clause[2] = ~not_link_wi_wjpj; add_clause(clause); clause.clear(); // B(wi, w, wj) int wl, wr; if (wi < wj) { wl = wi + 1; wr = wj; } else { wl = wj + 1; wr = wi; } std::vector link_cw_possible_cache(wr - wl); for (int wk1 = wl; wk1 < wr; wk1++) { if (!(link_cw_possible_cache[wk1 - wl] = link_cw_possible(wj, pj, Cj, dir, wk1, wl, wr))) continue; clause.growTo(3); clause[0] = ~link_cw_k1; clause[1] = ~Lit(_variables->fat_link(wk1, wi)); clause[2] = Lit(_variables->link_cw(wk1, wj, pj, Cj)); add_clause(clause); } clause.clear(); clause.push(~link_cw_k1); for (int wk1 = wl; wk1 < wr; wk1++) { if (!link_cw_possible_cache[wk1 - wl]) continue; clause.push(Lit(_variables->fat_link(wk1, wi))); } add_clause(clause); // Faster clause.clear(); clause.push(~link_cw_k1); for (int wk1 = wl; wk1 < wr; wk1++) { if (!link_cw_possible_cache[wk1 - wl]) continue; clause.push(Lit(_variables->link_cw(wk1, wj, pj, Cj))); } add_clause(clause); clause.clear(); for (int wk1 = wl; wk1 < wr; wk1++) { if (!link_cw_possible_cache[wk1 - wl]) continue; clause.growTo(3); clause[0] = ~Lit(_variables->fat_link(wk1, wi)); clause[1] = ~Lit(_variables->link_cw(wk1, wj, pj, Cj)); clause[2] = link_cw_k1; add_clause(clause); } DEBUG_print("---"); // B(wk2, wi, wj) if (wi < wj) { wl = 1; wr = wi; } else { wl = wi + 1; wr = _sent->length - 1; } link_cw_possible_cache.resize(wr - wl); clause.clear(); for (int wk2 = wl; wk2 < wr; wk2++) { if (!(link_cw_possible_cache[wk2 - wl] = link_cw_possible(wj, pj, Cj, dir, wk2, wl, wr))) continue; clause.growTo(3); clause[0] = ~link_cw_k2; clause[1] = ~Lit(_variables->fat_link(wk2, wi)); clause[2] = Lit(_variables->link_cw(wk2, wj, pj, Cj)); add_clause(clause); } clause.clear(); clause.push(~link_cw_k2); for (int wk2 = wl; wk2 < wr; wk2++) { if (!link_cw_possible_cache[wk2 - wl]) continue; clause.push(Lit(_variables->fat_link(wk2, wi))); } add_clause(clause); // Faster clause.clear(); clause.push(~link_cw_k2); for (int wk2 = wl; wk2 < wr; wk2++) { if (!link_cw_possible_cache[wk2 - wl]) continue; clause.push(Lit(_variables->link_cw(wk2, wj, pj, Cj))); } add_clause(clause); clause.clear(); for (int wk2 = wl; wk2 < wr; wk2++) { if (!link_cw_possible_cache[wk2 - wl]) continue; clause.growTo(3); clause[0] = ~Lit(_variables->fat_link(wk2, wi)); clause[1] = ~Lit(_variables->link_cw(wk2, wj, pj, Cj)); clause[2] = link_cw_k2; add_clause(clause); } DEBUG_print("--------- end link_cw as special"); } void SATEncoderConjunctiveSentences::generate_link_cw_connective_impossible(int wi, int pi, const char* Ci, int wj) { DEBUG_print("--------- link_cw as special down - impossible"); // If the connective word w has fat-links down it cannot be // connected to (wi, pi) vec clause; char str[MAX_VARIABLE_NAME]; sprintf(str,"fl_d_%d", wj); clause.push(~Lit(_variables->string(str))); clause.push(~Lit(_variables->link_cw(wj, wi, pi, Ci))); add_clause(clause); DEBUG_print("--------- end link_cw as special down - impossible"); } void SATEncoderConjunctiveSentences::generate_fat_link_up_definitions() { Lit lhs; vec rhs; char fl_str[MAX_VARIABLE_NAME]; vec clause; for (int w = 1; w < _sent->length - 1; w++) { DEBUG_print("----fat_link up definition"); // Fatlink up left definition rhs.clear(); for (std::vector::const_iterator cl = _connectives.begin(); cl != _connectives.end(); cl++) { if (*cl < w) rhs.push(Lit(_variables->fat_link(w, *cl))); } sprintf(fl_str, "fl_ul_%d", w); lhs = Lit(_variables->string(fl_str)); generate_or_definition(lhs, rhs); generate_xor_conditions(rhs); // Fatlink up right definition rhs.clear(); for (std::vector::const_iterator cr = _connectives.begin(); cr != _connectives.end(); cr++) { if (*cr > w) rhs.push(Lit(_variables->fat_link(w, *cr))); } sprintf(fl_str, "fl_ur_%d", w); lhs = Lit(_variables->string(fl_str)); generate_or_definition(lhs, rhs); generate_xor_conditions(rhs); // There can not be two links up clause.growTo(2); sprintf(fl_str, "fl_ul_%d", w); clause[0] = ~Lit(_variables->string(fl_str)); sprintf(fl_str, "fl_ur_%d", w); clause[1] = ~Lit(_variables->string(fl_str)); add_clause(clause); DEBUG_print("----end fat_link up definition"); } } void SATEncoderConjunctiveSentences::generate_fat_link_down_definitions() { // Fat links down char fl_str[MAX_VARIABLE_NAME]; std::vector::const_iterator w; for (w = _connectives.begin(); w != _connectives.end(); w++) { DEBUG_print("----fat_link down definition"); // Fatlink down left definition vec rhs; for (int wl = 1; wl < *w; wl++) { rhs.push(Lit(_variables->fat_link(wl, *w))); } sprintf(fl_str, "fl_d_%d", *w); Lit lhs = Lit(_variables->string(fl_str)); generate_or_definition(lhs, rhs); generate_xor_conditions(rhs); // Fatlink down right definition rhs.clear(); for (int wr = *w + 1; wr < _sent->length - 1; wr++) { rhs.push(Lit(_variables->fat_link(wr, *w))); } sprintf(fl_str, "fl_d_%d", *w); lhs = Lit(_variables->string(fl_str)); generate_or_definition(lhs, rhs); generate_xor_conditions(rhs); DEBUG_print("----end fat_link down definition"); } } void SATEncoderConjunctiveSentences::generate_fat_link_comma_conditions() { char fl_str[MAX_VARIABLE_NAME]; std::vector::const_iterator w; vec clause; for (w = _connectives.begin(); w != _connectives.end(); w++) { if (isComma(_sent, *w)) { DEBUG_print("---comma---"); // If comma has a link down it has to have a link up to the right sprintf(fl_str, "fl_d_%d", *w); clause.growTo(2); clause[0] = ~Lit(_variables->string(fl_str)); sprintf(fl_str, "fl_ur_%d", *w); clause[1] = Lit(_variables->string(fl_str)); add_clause(clause); // If comma has a link down it cannot have a link up to the left sprintf(fl_str, "fl_d_%d", *w); clause.growTo(2); clause[0] = ~Lit(_variables->string(fl_str)); sprintf(fl_str, "fl_ul_%d", *w); clause[1] = ~Lit(_variables->string(fl_str)); add_clause(clause); DEBUG_print("---end comma---"); } } } void SATEncoderConjunctiveSentences::generate_fat_link_crossover_conditions() { vec clause; // If a word has a fat link up, than it cannot establish links with words behind that connective for (int w = 1; w < _sent->length - 1; w++) { DEBUG_print("----links cannot crossover the fat-links"); std::vector::const_iterator c1, c2; for (c1 = _connectives.begin(); c1 != _connectives.end(); c1++) { if (*c1 > w) { for (int w1 = *c1 + 1; w1 < _sent->length; w1++) { if (!_linked_possible(w, w1)) continue; clause.growTo(3); clause[0] = ~Lit(_variables->fat_link(w, *c1)); clause[1] = Lit(_variables->link_top_ww(*c1, w1)); clause[2] = ~Lit(_variables->link_top_ww(w, w1)); add_clause(clause); } } if (*c1 < w) { for (int w1 = 0; w1 < *c1; w1++) { if (!_linked_possible(w1, w)) continue; clause.growTo(3); clause[0] = ~Lit(_variables->fat_link(w, *c1)); clause[1] = Lit(_variables->link_top_ww(*c1, w1)); clause[2] = ~Lit(_variables->link_top_ww(w, w1)); add_clause(clause); } } } DEBUG_print("----end links cannot cross over the fat-links"); } // One step structure violation pruning heuristic If a word is // directly linked to a fat linked word, than it cannot establish // links with words behind that connective std::vector::const_iterator c; for (c = _connectives.begin(); c != _connectives.end(); c++) { DEBUG_print("----links cannot crossover the fat-links heuristic"); for (int w = 1; w < *c; w++) { for (int w1 = 0; w1 < w; w1++) { if (!_linked_possible(w1, w)) continue; for (int w2 = *c; w2 < _sent->length; w2++) { if (!_linked_possible(w1, w2)) continue; vec clause; clause.push(~Lit(_variables->fat_link(w, *c))); clause.push(~Lit(_variables->linked(w1, w))); clause.push(~Lit(_variables->linked(w1, w2))); add_clause(clause); } } } for (int w = *c + 1; w < _sent->length - 1; w++) { for (int w1 = w+1; w1 < _sent->length; w1++) { if (!_linked_possible(w, w1)) continue; for (int w2 = 0; w2 <= *c; w2++) { if (!_linked_possible(w2, w1)) continue; vec clause; clause.push(~Lit(_variables->fat_link(w, *c))); clause.push(~Lit(_variables->linked(w, w1))); clause.push(~Lit(_variables->linked(w2, w1))); add_clause(clause); } } } DEBUG_print("----end links cannot cross over the fat-links heuristic"); } } void SATEncoderConjunctiveSentences::generate_fat_link_up_between_down_conditions() { // If a connective wi has a fat-link down to wj, it cannot have // links up between wi and wj. vec clause; for (std::vector::const_iterator wi = _connectives.begin(); wi != _connectives.end(); wi++) { DEBUG_print("---up between down---"); for (int wj = 1; wj < _sent->length - 1; wj++) { if (*wi == wj) continue; int l = std::min(*wi, wj) + 1; int r = std::max(*wi, wj); for (int wk = l; wk < r; wk++) { int mi = std::min(*wi, wk); int ma = std::max(*wi, wk); if (!_linked_possible(mi, ma)) continue; clause.growTo(2); clause[0] = ~Lit(_variables->fat_link(wj, *wi)); clause[1] = ~Lit(_variables->linked(mi, ma)); add_clause(clause); } if (isConnectiveOrComma(wj)) { clause.growTo(2); clause[0] = ~Lit(_variables->fat_link(wj, *wi)); clause[1] = ~Lit(_variables->fat_link(*wi, wj)); add_clause(clause); } } DEBUG_print("---end up between down---"); } } void SATEncoderConjunctiveSentences::generate_fat_link_neighbor() { // Search guiding heuristic: one fat-link is usually just next to the word Lit lhs; vec rhs; char fl_str[MAX_VARIABLE_NAME]; std::vector::const_iterator w; for (w = _connectives.begin(); w != _connectives.end(); w++) { DEBUG_print("----fat-link-neighbor"); if (*w > 1 && *w < _sent->length - 1) { rhs.clear(); rhs.push(Lit(_variables->fat_link(*w - 1, *w))); rhs.push(Lit(_variables->fat_link(*w + 1, *w))); lhs = Lit(_variables->neighbor_fat_link(*w)); sprintf(fl_str, "fl_d_%d", *w); Lit fld = Lit(_variables->string(fl_str)); generate_conditional_or_definition(fld, lhs, rhs); } DEBUG_print("----end fat-link-neighbor"); } } void SATEncoderConjunctiveSentences::generate_label_compatibility() { // Eliminate non-matching indirect links DEBUG_print("----label compatibility"); vec clause; const std::vector& vars = _variables->link_variables(); std::vector::const_iterator i, j; for (i = vars.begin(); i != vars.end(); i++) { const Variables::LinkVar* vari = _variables->link_variable(*i); const std::vector& varsjr = _variables->link_variables(vari->right_word, vari->right_position); for (j = varsjr.begin(); j != varsjr.end(); j++) { const Variables::LinkVar* varj = _variables->link_variable(*j); if (!labels_match(vari->label, varj->label)) { clause.growTo(2); clause[0] = ~Lit(*i); clause[1] = ~Lit(*j); add_clause(clause); } } const std::vector& varsjl = _variables->link_variables(vari->left_word, vari->left_position); for (j = varsjl.begin(); j != varsjl.end(); j++) { const Variables::LinkVar* varj = _variables->link_variable(*j); if (!labels_match(vari->label, varj->label)) { clause.growTo(2); clause[0] = ~Lit(*i); clause[1] = ~Lit(*j); add_clause(clause); } } } DEBUG_print("----label compatibility"); } void SATEncoderConjunctiveSentences::generate_fat_link_existence() { // If there is a fat link from wa to wb then there should be // at least one connector in the wa word tag that is indirectly // connected to words between: // if wa < wb: [0, wa) and [wb+2, n) // if wa > wb: [0, wb-1) and [wa+1, n) DEBUG_print("----fat-link-existence"); vec clause_a, clause_b; for (std::vector::const_iterator wb = _connectives.begin(); wb != _connectives.end(); wb++) { for (int wa = 1; wa < _sent->length-1; wa++) { if (isConnectiveOrComma(wa)) continue; if (wa == *wb) continue; int up = (wa < *wb) ? wa : *wb - 1; int low = (wa < *wb) ? *wb + 2 : wa + 1; clause_a.clear(); clause_b.clear(); clause_a.push(~Lit(_variables->fat_link(wa, *wb))); clause_b.push(~Lit(_variables->fat_link(wa, *wb))); std::vector::const_iterator ci; char dir; const std::vector& lconnectors = _word_tags[wa].get_left_connectors(); for (ci = lconnectors.begin(); ci != lconnectors.end(); ci++) { const std::vector& matches = ci->matches; std::vector::const_iterator m; for (m = matches.begin(); m != matches.end(); m++) { if ((0 <= (*m)->word && (*m)->word < up) && link_cw_possible_with_fld((*m)->word, (*m)->position, (*m)->connector->string, '+', *wb, 1, _sent->length - 1)) { clause_a.push(Lit(_variables->link_cw(wa, (*m)->word, (*m)->position, (*m)->connector->string))); clause_b.push(Lit(_variables->link_cw(*wb, (*m)->word, (*m)->position, (*m)->connector->string))); } } } const std::vector& rconnectors = _word_tags[wa].get_right_connectors(); for (ci = rconnectors.begin(); ci != rconnectors.end(); ci++) { const std::vector& matches = ci->matches; std::vector::const_iterator m; for (m = matches.begin(); m != matches.end(); m++) { if ((low <= (*m)->word && (*m)->word < _sent->length) && link_cw_possible_with_fld((*m)->word, (*m)->position, (*m)->connector->string, '-', *wb, 1, _sent->length - 1)) { clause_a.push(Lit(_variables->link_cw(wa, (*m)->word, (*m)->position, (*m)->connector->string))); clause_b.push(Lit(_variables->link_cw(*wb, (*m)->word, (*m)->position, (*m)->connector->string))); } } } add_clause(clause_a); add_clause(clause_b); } } DEBUG_print("----end fat-link-existence"); } void SATEncoderConjunctiveSentences::generate_fat_link_Left_Wall_not_inside() { // Wall cannot be connected just inside the fat-link tree for (int w = 1; w < _sent->length-1; w++) { DEBUG_print("---Left Wall cannot be connected inside"); vec clause; std::vector::const_iterator c; if (!_linked_possible(0, w)) continue; for (c = _connectives.begin(); c != _connectives.end(); c++) { if (w == *c) continue; if (!_linked_possible(0, *c)) continue; clause.growTo(3); clause[0] = ~Lit(_variables->linked(0, w)); clause[1] = ~Lit(_variables->fat_link(w, *c)); clause[2] = Lit(_variables->linked(0, *c)); add_clause(clause); } DEBUG_print("---end Left Wall cannot be connected inside"); } } void SATEncoderConjunctiveSentences::generate_fat_link_linked_upperside() { // Fat link must be linked on the upper side DEBUG_print("--- Fat link must be linked on the upper side"); vec clause; std::vector::const_iterator c; for (c = _connectives.begin(); c != _connectives.end(); c++) { if (isComma(_sent, *c)) continue; clause.clear(); char fl_str[MAX_VARIABLE_NAME]; sprintf(fl_str, "fl_d_%d", *c); clause.push(~Lit(_variables->string(fl_str))); for (int wl = 0; wl < *c - 1; wl++) { if (_linked_possible(wl, *c)) { const std::vector& vc = _word_tags[wl].get_right_connectors(); std::vector::const_iterator i; for (i = vc.begin(); i != vc.end(); i++) { if (link_cw_possible(wl, i->position, i->connector->string, '+', *c, 1, _sent->length - 1)) clause.push(Lit(_variables->link_cw(*c, wl, (*i).position, (*i).connector->string))); } } } for (int wr = *c+2; wr < _sent->length; wr++) { if (_linked_possible(*c, wr)) { const std::vector& vc = _word_tags[wr].get_left_connectors(); std::vector::const_iterator i; for (i = vc.begin(); i != vc.end(); i++) { if (link_cw_possible(wr, i->position, i->connector->string, '-', *c, 1, _sent->length - 1)) clause.push(Lit(_variables->link_cw(*c, wr, (*i).position, (*i).connector->string))); } } } std::vector::const_iterator c1; for (c1 = _connectives.begin(); c1 != _connectives.end(); c1++) { if (c1 != c) clause.push(Lit(_variables->fat_link(*c, *c1))); } add_clause(clause); } DEBUG_print("---end Fat link must be connected on the upper side"); } void SATEncoderConjunctiveSentences::either_tag_or_fat_link(int w, Lit tag) { DEBUG_print("----either tag or fat_link"); vec clause; char fl_str[MAX_VARIABLE_NAME]; sprintf(fl_str, "fl_d_%d", w); // Either tag of the word is satisfied or there must be fat-link on // this word clause.growTo(2); clause[0] = tag; clause[1] = Lit(_variables->string(fl_str)); add_clause(clause); // There cannot be both fat-links and a satisfied tag clause.growTo(2); clause[0] = ~tag; clause[1] = ~Lit(_variables->string(fl_str)); add_clause(clause); DEBUG_print("----end either tag or fat_link"); } // Check if there can be a connection between the connector (wi, pi) // with the word w when the word w has fat links down bool SATEncoderConjunctiveSentences::link_cw_possible_with_fld(int wi, int pi, const char* Ci, char dir, int w, int llim, int rlim) { // Connective word can match iff the connector is andable and there // are words wk1 and wk2 such that B(wi, wk1, w) and B(wi, w, wk1) // and there are connectors on wk1 and wk2 that can match (wi, pi) Connector conn; init_connector(&conn); conn.label = NORMAL_LABEL; conn.priority = THIN_priority; conn.string = Ci; bool andable_opposite = is_andable(_sent, &conn, dir == '+' ? '-' : '+'); if (!andable_opposite) { return false; } int low = wi < w ? std::max(llim, wi + 1) : llim; int hi = wi < w ? rlim : std::min(wi, rlim); return matches_in_interval(wi, pi, low, w) && matches_in_interval(wi, pi, w + 1, hi); } // Check if there can be a connection between the connector (wi, pi) with the word w bool SATEncoderConjunctiveSentences::link_cw_possible(int wi, int pi, const char* Ci, char dir, int w, int llim, int rlim) { if (!isConnectiveOrComma(w)) { // Ordinary word can match iff it has a connector that can match return _word_tags[w].match_possible(wi, pi); } else { // Connective word can match iff it can match as an ordinary word // or the connector is andable and there are words wk1 and wk2 // such that B(wi, wk1, w) and B(wi, w, wk1) and there are // connectors on wk1 and wk2 that can match (wi, pi) return _word_tags[w].match_possible(wi, pi) || link_cw_possible_with_fld(wi, pi, Ci, dir, w, llim, rlim); } } void SATEncoderConjunctiveSentences::generate_link_top_ww_connective_comma_definition(Lit lhs, int w1, int w2) { DEBUG_print("---- link_top_connective_comma"); vec clause; vec fatlinks_left, fatlinks_right, link_top_left, link_top_right; int low = w1 < w2 ? 1 : w2+1; int hi = w1 < w2 ? w2 : _sent->length - 1; for (int w = low; w < w1; w++) { Lit fl(_variables->fat_link(w, w1)); Lit tl(_variables->link_top_ww(w, w2)); clause.growTo(3); clause[0] = ~fl; clause[1] = ~lhs; clause[2] = tl; add_clause(clause); fatlinks_left.push(fl); link_top_left.push(tl); } DEBUG_print("---------"); for (int w = w1 + 1; w < hi; w++) { Lit fr(_variables->fat_link(w, w1)); Lit tr(_variables->link_top_ww(w, w2)); clause.growTo(3); clause[0] = ~fr; clause[1] = ~lhs; clause[2] = tr; add_clause(clause); fatlinks_right.push(fr); link_top_right.push(tr); } clause.clear(); for (int i = 0; i < fatlinks_left.size(); i++) { for (int j = 0; j < fatlinks_right.size(); j++) { clause.growTo(5); clause[0] = ~fatlinks_left[i]; clause[1] = ~link_top_left[i]; clause[2] = ~fatlinks_right[j]; clause[3] = ~link_top_right[j]; clause[4] = lhs; add_clause(clause); } } DEBUG_print("---- end link_top_connective_comma"); } void SATEncoderConjunctiveSentences::generate_linked_definitions() { Matrix _thin_link_possible; _thin_link_possible.resize(_sent->length, 1); DEBUG_print("------- link_top_ww definitions"); for (int w1 = 0; w1 < _sent->length; w1++) { for (int w2 = 0; w2 < _sent->length; w2++) { if (w1 == w2) continue; DEBUG_print("---------- ." << w1 << ". ." << w2 << "."); Lit lhs; vec rhs; const std::vector& w1_connectors = (w1 < w2) ? _word_tags[w1].get_right_connectors() : _word_tags[w1].get_left_connectors(); std::vector::const_iterator c; for (c = w1_connectors.begin(); c != w1_connectors.end(); c++) { if (link_cw_possible(w1, c->position, c->connector->string, c->dir, w2, 1, _sent->length - 1)) { rhs.push(Lit(_variables->link_top_cw(w2, w1, c->position, c->connector->string))); } } lhs = Lit(_variables->link_top_ww(w1, w2)); if (!isConnectiveOrComma(w1) || abs(w1 - w2) == 1) { if (rhs.size() == 0) _thin_link_possible.set(w1, w2, 0); generate_or_definition(lhs, rhs); } else { char w1_str[MAX_VARIABLE_NAME]; sprintf(w1_str, "w%d", w1); generate_conditional_or_definition(Lit(_variables->string(w1_str)), lhs, rhs); generate_link_top_ww_connective_comma_definition(lhs, w1, w2); } DEBUG_print("----------"); } } DEBUG_print("------- end link_top_ww definitions"); DEBUG_print("------- thin_link definitions"); Lit lhs; vec rhs; for (int w1 = 0; w1 < _sent->length - 1; w1++) { for (int w2 = w1 + 1; w2 < _sent->length; w2++) { rhs.clear(); if (_thin_link_possible(w1, w2)) { lhs = Lit(_variables->thin_link(w1, w2)); rhs.growTo(2); rhs[0] = Lit(_variables->link_top_ww(w1, w2)); rhs[1] = Lit(_variables->link_top_ww(w2, w1)); generate_classical_and_definition(lhs, rhs); } } } DEBUG_print("------- thin_linked definitions"); DEBUG_print("------- linked definitions"); _linked_possible.resize(_sent->length, 1); for (int w1 = 0; w1 < _sent->length - 1; w1++) { for (int w2 = w1 + 1; w2 < _sent->length; w2++) { rhs.clear(); if (_thin_link_possible(w1, w2)) rhs.push(Lit(_variables->thin_link(w1, w2))); if (isConnectiveOrComma(w1) && w2 < _sent->length - 1) rhs.push(Lit(_variables->fat_link(w2, w1))); if (isConnectiveOrComma(w2) && w1 > 0) rhs.push(Lit(_variables->fat_link(w1, w2))); if (rhs.size() > 0) { lhs = Lit(_variables->linked(w1, w2)); generate_or_definition(lhs, rhs); _linked_possible.set(w1, w2, 1); } else { _linked_possible.set(w1, w2, 0); } } } DEBUG_print("------- linked definitions"); DEBUG_print("---Weak connectivity"); for (int w1 = 0; w1 < _sent->length; w1++) { // At least one link should exist (weak connectivity) vec clause; for (int w2 = 0; w2 < w1; w2++) { if (_linked_possible(w2, w1)) clause.push(Lit(_variables->linked(w2, w1))); } for (int w2 = w1+1; w2 < _sent->length; w2++) { if (_linked_possible(w1, w2)) clause.push(Lit(_variables->linked(w1, w2))); } add_clause(clause); } DEBUG_print("---end Weak connectivity"); } void SATEncoderConjunctiveSentences::get_satisfied_link_top_cw_connectors(int word, int top_word, std::vector& link_top_cw_vars) { static int tab = 0; // Check if top_word acts as an ordinary or as a special connective words char str[MAX_VARIABLE_NAME]; sprintf(str, "w%d", top_word); bool ordinary = _solver->model[_variables->string(str)] == l_True; if (ordinary) { const std::vector& link_top_cw_variables = _variables->link_top_cw_variables(); std::vector::const_iterator i; for (i = link_top_cw_variables.begin(); i != link_top_cw_variables.end(); i++) { if (_solver->model[*i] != l_True) continue; const Variables::LinkTopCWVar* var = _variables->link_top_cw_variable(*i); if (var->top_word != word || var->connector_word != top_word) continue; link_top_cw_vars.push_back(*i); } } else { // Find two words that are fat_linked up to the top word for (int w = 1; w < _sent->length - 1; w++) { if (w == top_word) continue; if (_solver->model[_variables->fat_link(w, top_word)] == l_True) { get_satisfied_link_top_cw_connectors(word, w, link_top_cw_vars); } } } } bool SATEncoderConjunctiveSentences::extract_links(Parse_info pi) { int current_link = 0; bool fat = false; const std::vector& linked_variables = _variables->linked_variables(); std::vector::const_iterator i; for (i = linked_variables.begin(); i != linked_variables.end(); i++) { if (_solver->model[*i] != l_True) continue; const Variables::LinkedVar* var = _variables->linked_variable(*i); // Check if words are connected with a fat-link bool fl_lr = 0 < var->left_word && var->right_word < _sent->length - 1 && parse_options_get_use_fat_links(_opts) && isConnectiveOrComma(var->right_word) && _solver->model[_variables->fat_link(var->left_word, var->right_word)] == l_True; bool fl_rl = 0 < var->left_word && var->right_word < _sent->length - 1 && parse_options_get_use_fat_links(_opts) && isConnectiveOrComma(var->left_word) && _solver->model[_variables->fat_link(var->right_word, var->left_word)] == l_True; if (fl_lr || fl_rl) { // a fat link pi->link_array[current_link].l = var->left_word; pi->link_array[current_link].r = var->right_word; Connector* connector; connector = connector_new(); connector->priority = fl_lr ? UP_priority : DOWN_priority; connector->string = "fat"; pi->link_array[current_link].lc = connector; connector = connector_new(); connector->priority = fl_lr ? DOWN_priority : UP_priority; connector->string = "fat"; pi->link_array[current_link].rc = connector; current_link++; fat = true; } else { // a thin link std::vector link_top_cw_vars_right; std::vector link_top_cw_vars_left; get_satisfied_link_top_cw_connectors(var->left_word, var->right_word, link_top_cw_vars_left); get_satisfied_link_top_cw_connectors(var->right_word, var->left_word, link_top_cw_vars_right); std::vector strings_right; std::vector::const_iterator rc, lc; for (rc = link_top_cw_vars_right.begin(); rc != link_top_cw_vars_right.end(); rc++) { const Variables::LinkTopCWVar* var = _variables->link_top_cw_variable(*rc); strings_right.push_back(var->connector); } std::vector strings_left; for (lc = link_top_cw_vars_left.begin(); lc != link_top_cw_vars_left.end(); lc++) { const Variables::LinkTopCWVar* var = _variables->link_top_cw_variable(*lc); strings_left.push_back(var->connector); } // String unification std::vector::const_iterator li, ri; const char* left_string = strings_left[0]; for (li = strings_left.begin() + 1; li != strings_left.end(); li++) { left_string = intersect_strings(_sent, left_string, *li); } const char* right_string = strings_right[0]; for (ri = strings_right.begin() + 1; ri != strings_right.end(); ri++) { right_string = intersect_strings(_sent, right_string, *ri); } pi->link_array[current_link].l = var->left_word; pi->link_array[current_link].r = var->right_word; Connector* connector; connector = connector_new(); connector->string = right_string; pi->link_array[current_link].lc = connector; connector = connector_new(); connector->string = left_string; pi->link_array[current_link].rc = connector; current_link++; } } pi->N_links = current_link; return fat; } /**************************************************************************** * Main entry point into the SAT parser * ****************************************************************************/ extern "C" int sat_parse(Sentence sent, Parse_Options opts) { SATEncoder* encoder = (SATEncoder*) sent->hook; if (encoder) delete encoder; // Prepare for parsing - extracted for "preparation.c" build_deletable(sent, 0); build_effective_dist(sent, 0); init_count(sent); count_set_effective_distance(sent); bool conjunction = FALSE; if (parse_options_get_use_fat_links(opts)) { conjunction = sentence_contains_conjunction(sent); } // Create the encoder, encode the formula and solve it if (conjunction) { DEBUG_print("Conjunctive sentence\n"); encoder = new SATEncoderConjunctiveSentences(sent, opts); } else { DEBUG_print("Conjunction free sentence\n"); encoder = new SATEncoderConjunctionFreeSentences(sent, opts); } sent->hook = encoder; encoder->encode(); // XXX this is wrong, we actually don't know yet ... // If we don't return some large number here, then the // Command-line client will fail to print all of the possible // linkages. Work around this by lying ... sent->num_valid_linkages = 222; sent->num_linkages_post_processed = 222; return 0; } extern "C" Linkage sat_create_linkage(int k, Sentence sent, Parse_Options opts) { SATEncoder* encoder = (SATEncoder*) sent->hook; if (!encoder) return NULL; return encoder->get_next_linkage(); } extern "C" void sat_sentence_delete(Sentence sent) { SATEncoder* encoder = (SATEncoder*) sent->hook; if (!encoder) return; delete encoder; // Don't do this parse-info-free stuff, if there's no encoder. // That's because it will screw up the regular parser. if (sent->parse_info) { Parse_info pi = sent->parse_info; for (int i=0; i< MAX_LINKS; i++) { free_connectors(pi->link_array[i].lc); free_connectors(pi->link_array[i].rc); } free_parse_info(sent->parse_info); sent->parse_info = NULL; } } link-grammar-4.7.4/link-grammar/sat-solver/clock.hpp0000755000175000017500000000055111052414476021405 0ustar bloombloom#ifndef __CLOCK_H__ #define __CLOCK_H__ /** * Time measurment functions */ #include #include class Clock { private: clock_t start; public: Clock() { reset(); } void reset() { start = clock(); } public: double elapsed() { clock_t stop = clock(); return ((double)stop-(double)start)/CLOCKS_PER_SEC; } }; #endif link-grammar-4.7.4/link-grammar/sat-solver/guiding.hpp0000644000175000017500000001674211052414476021746 0ustar bloombloom#ifndef __GUIDING_HPP__ #define __GUIDING_HPP__ #include "Solver.h" #include "util.hpp" // This class represents different guding strategies of LinkParser SAT search class Guiding { public: struct SATParameters { /* Should the variable with the given number be used as a decision variable during the SAT search? */ bool isDecision; /* What is the decision priority of the variable with the given number during the SAT search? */ double priority; /* What is the preffered polarity of the variable with the given number during the SAT search? */ double polarity; }; Guiding(Sentence sent) : _sent(sent) { } /* Abstract functions that calculate params for each type of variable */ /* string variables */ virtual void setStringParameters (int var, const char* str) { bool isDecision = false; setParameters(var, isDecision, 0.0, 0.0); } virtual void setStringParameters (int var, const char* str, int cost) = 0; /* epsilon variables */ virtual void setEpsilonParameters (int var) { bool isDecision = false; setParameters(var, isDecision, 0.0, 0.0); } /* link_cc variables */ virtual void setLinkParameters (int var, int wi, const char* ci, int wj, const char* cj, const char* label) = 0; virtual void setLinkParameters (int var, int wi, const char* ci, int wj, const char* cj, const char* label, int cost) = 0; /* linked_variables */ virtual void setLinkedParameters (int var, int wi, int wj) { bool isDecision = false; setParameters(var, isDecision, 0.0, 0.0); } virtual void setLinkedMinMaxParameters (int var, int wi, int wj) { bool isDecision = false; setParameters(var, isDecision, 0.0, 0.0); } /* link_cw_variables */ virtual void setLinkCWParameters (int var, int wi, int wj, const char* cj) { bool isDecision = false; setParameters(var, isDecision, 0.0, 0.0); } /* link_top_cw variables */ virtual void setLinkTopCWParameters (int var, int wi, int wj, const char* cj) { bool isDecision = false; setParameters(var, isDecision, 0.0, 0.0); } /* link_top_ww variables */ virtual void setLinkTopWWParameters (int var, int wi, int wj) { bool isDecision = false; setParameters(var, isDecision, 0.0, 0.0); } /* fat_link variables */ virtual void setFatLinkParameters (int var, int wi, int wj) = 0; /* thin_link variables */ virtual void setThinLinkParameters (int var, int wi, int wj) = 0; /* neighbor fat link variables */ virtual void setNeighborFatLinkParameters (int var, int w) = 0; /* Pass SAT search parameters to the MiniSAT solver */ void passParametersToSolver(Solver* solver) { for (int v = 0; v < _parameters.size(); v++) { solver->setDecisionVar(v, _parameters[v].isDecision); if (_parameters[v].isDecision) { solver->setActivity(v, _parameters[v].priority); /* TODO: make polarity double instead of boolean*/ solver->setPolarity(v, _parameters[v].polarity > 0.0); } } } protected: /* Set the parameters for the given variable to given values */ void setParameters(int var, bool isDecision, double priority, double polarity) { if (var >= _parameters.size()) _parameters.resize(var + 1); _parameters[var].isDecision = isDecision; _parameters[var].priority = priority; _parameters[var].polarity = polarity; // printf("Set: %d %s .%g. .%g.\n", var, isDecision ? "true" : "false", priority, polarity); } /* Sentence that is being parsed */ Sentence _sent; /* Parameters for each variable */ std::vector _parameters; }; //////////////////////////////////////////////////////////////////////////// class CostDistanceGuiding : public Guiding { public: double cost2priority(int cost) { return cost == 0 ? 0.0 : (double)(_sent->length + cost); } CostDistanceGuiding(Sentence sent) : Guiding(sent) { } virtual void setStringParameters (int var, const char* str, int cost) { bool isDecision = cost > 0.0; double priority = cost2priority(cost); double polarity = 0.0; setParameters(var, isDecision, priority, polarity); } virtual void setLinkParameters (int var, int wi, const char* ci, int wj, const char* cj, const char* label) { bool isDecision = true; double priority = 0.0; double polarity = 0.0; setParameters(var, isDecision, priority, polarity); } virtual void setLinkParameters(int var, int i, const char* ci, int j, const char* cj, const char* label, int cost) { bool isDecision = true; double priority = cost2priority(cost); double polarity = 0.0; setParameters(var, isDecision, priority, polarity); } void setFatLinkParameters(int var, int i, int j) { bool isDecision = true; double priority = (double)abs(j - i); if (_sent->is_conjunction[i]) priority = 0.0; double polarity = abs(j - i) == 1 ? 1.0 : 0.0; setParameters(var, isDecision, priority, polarity); } void setThinLinkParameters(int var, int i, int j) { bool isDecision = true; double priority = (double)(j - i); if (_sent->is_conjunction[i] || _sent->is_conjunction[j]) priority = priority / 2; double polarity = j - i == 1 ? 1.0 : 0.0; if (i == 0 && j == _sent->length - 2 && isEndingInterpunction(_sent->word[j].string)) { polarity = 1.0; } if (i == 0 && j == _sent->length - 1 && !isEndingInterpunction(_sent->word[j - 1].string)) { polarity = 1.0; } setParameters(var, isDecision, priority, polarity); } void setNeighborFatLinkParameters(int var, int w) { bool isDecision = true; double priority = _sent->length; double polarity = 1.0; setParameters(var, isDecision, priority, polarity); } }; //////////////////////////////////////////////////////////////////////////// class CostDistanceGuidingOnlyLink : public Guiding { public: double cost2priority(int cost) { return cost == 0 ? 0.0 : (double)(_sent->length + cost); } CostDistanceGuidingOnlyLink(Sentence sent) : Guiding(sent) { } virtual void setStringParameters (int var, const char* str, int cost) { bool isDecision = cost > 0.0; double priority = cost2priority(cost); double polarity = 0.0; setParameters(var, isDecision, priority, polarity); } virtual void setLinkParameters (int var, int wi, const char* ci, int wj, const char* cj, const char* label) { bool isDecision = true; double priority = _sent->length - (wj - wi); double polarity = wj - wi <= 3 ? 1.0 : 0.0;; setParameters(var, isDecision, priority, polarity); } virtual void setLinkParameters(int var, int wi, const char* ci, int wj, const char* cj, const char* label, int cost) { bool isDecision = true; double priority = cost > 0 ? cost2priority(cost) : wj - wi; double polarity = wj - wi <= 3 ? 1.0 : 0.0; setParameters(var, isDecision, priority, polarity); } void setFatLinkParameters(int var, int i, int j) { bool isDecision = true; double priority = (double)abs(j - i); if (_sent->is_conjunction[i]) priority = 0.0; double polarity = abs(j - i) == 1 ? 1.0 : 0.0; setParameters(var, isDecision, priority, polarity); } void setThinLinkParameters(int var, int i, int j) { bool isDecision = false; setParameters(var, isDecision, 0.0, 0.0); } void setNeighborFatLinkParameters(int var, int w) { bool isDecision = true; double priority = _sent->length; double polarity = 1.0; setParameters(var, isDecision, priority, polarity); } }; #endif link-grammar-4.7.4/link-grammar/sat-solver/fast-sprintf.cpp0000644000175000017500000000070411052414476022722 0ustar bloombloom#include "fast-sprintf.hpp" char* fast_sprintf(char* buffer, int num) { char* begin = buffer; do { *buffer++ = '0' + num % 10; num /= 10; } while (num > 0); char* end = buffer - 1; for (; begin < end; begin++, end--) { char tmp = *begin; *begin = *end; *end = tmp; } *buffer = '\0'; return buffer; } char* fast_sprintf(char* buffer, const char* str) { while(*buffer++ = *str++) ; return buffer - 1; } link-grammar-4.7.4/link-grammar/sat-solver/matrix-ut-test.cpp0000644000175000017500000000052111052414476023206 0ustar bloombloom#include #include "matrix-ut.hpp" using namespace std; int main() { MatrixUpperTriangle m(10, 5); for (int i = 0; i < 10; i++) for (int j = i+1; j < 10; j++) { m.set(i, j, i+j); } for (int i = 0; i < 10; i++) for (int j = i+1; j < 10; j++) { cout << m(i, j) << endl; } return 0; } link-grammar-4.7.4/link-grammar/sat-solver/sat-encoder.h0000644000175000017500000000072211526022265022150 0ustar bloombloom#include #ifdef USE_SAT_SOLVER int sat_parse(Sentence sent, Parse_Options opts); Linkage sat_create_linkage(int k, Sentence sent, Parse_Options opts); void sat_sentence_delete(Sentence sent); #else static inline int sat_parse(Sentence sent, Parse_Options opts) { return -1; } static inline Linkage sat_create_linkage(int k, Sentence sent, Parse_Options opts) { return NULL; } static inline void sat_sentence_delete(Sentence sent) {} #endif link-grammar-4.7.4/link-grammar/sat-solver/util.hpp0000644000175000017500000000046311052414476021266 0ustar bloombloom#ifndef __UTIL_HPP__ #define __UTIL_HPP__ extern "C" { #include } bool isEndingInterpunction(const char* str); bool isConnective(Sentence sent, int w); bool isComma(Sentence sent, int w); bool isConnectiveOrComma(Sentence sent, int w); const char* word(Sentence sent, int w); #endif link-grammar-4.7.4/link-grammar/sat-solver/util.cpp0000644000175000017500000000076311052414476021264 0ustar bloombloom#include "util.hpp" bool isEndingInterpunction(const char* str) { return strcmp(str, ".") == 0 || strcmp(str, "?") == 0 || strcmp(str, "!") == 0; } bool isConnective(Sentence sent, int w) { return sent->is_conjunction[w]; } bool isComma(Sentence sent, int w) { return strcmp(word(sent, w), ",") == 0; } bool isConnectiveOrComma(Sentence sent, int w) { return isConnective(sent, w) || isComma(sent, w); } const char* word(Sentence sent, int w) { return sent->word[w].string; } link-grammar-4.7.4/link-grammar/sat-solver/matrix-ut.hpp0000644000175000017500000000324011052414476022237 0ustar bloombloom#ifndef __MATRIX_UPPER_TRIANGLE_HPP__ #define __MATRIX_UPPER_TRIANGLE_HPP__ #include #ifndef assert #define assert(ex,string) { \ if (!(ex)) { \ printf("Assertion failed: %s\n", string); \ exit(1); \ } \ } #endif template class Matrix { public: Matrix(int n = 1, T init = T()) { resize(n, init); } virtual void resize(int n, T init = T()) { _n = n; _data.resize(size(_n), init); } virtual const T& operator() (int i, int j) const { return _data[pos(i, j, _n)]; } virtual T& operator() (int i, int j) { return _data[pos(i, j, _n)]; } void set(int i, int j, T t) { (*this)(i, j) = t; } protected: virtual int pos (int i, int j, int n) const { return n*i + j; } virtual int size(int n) const { return n*n; } std::vector _data; int _n; }; template class MatrixUpperTriangle : public Matrix { public: MatrixUpperTriangle(int n = 1, T init = T()) : Matrix(n, init) { } const T& operator() (int i, int j) const { assert(i < j, "MatrixUpperTriangle: i >= j"); return Matrix::_data[pos(i, j, Matrix::_n)]; } T& operator() (int i, int j) { assert(i < j, "MatrixUpperTriangle: i >= j"); return Matrix::_data[pos(i, j, Matrix::_n)]; } protected: virtual int size(int n) const { return n*(n-1)/2; } virtual int pos (int i, int j, int n) const { return i*(n-2) - i*(i-1)/2 + j - 1; } }; #endif link-grammar-4.7.4/link-grammar/sat-solver/variables.hpp0000644000175000017500000005437511052414476022274 0ustar bloombloom#ifndef __VARIABLES_HPP__ #define __VARIABLES_HPP__ #include #include extern "C" { #include } #include "guiding.hpp" #include "Solver.h" #include "trie.hpp" #include "matrix-ut.hpp" #include "fast-sprintf.hpp" #define MAX_VARIABLE_NAME 256 // #define _DEBUG // #define _VARS #ifdef _DEBUG #define _VARS #endif #ifdef _VARS extern ostream& var_defs_stream; #endif static char* construct_link_label(const char* connector1, const char* connector2) { char* result = (char*)xalloc((std::max(strlen(connector1), strlen(connector2)) + 1)* sizeof(char)); char* presult = result; while (*connector1 != '\0' && *connector2 != '\0') { if (*connector1 == '*') *presult++ = *connector2; else if (*connector2 == '*') *presult++ = *connector1; else *presult++ = std::max(*connector1, *connector2); connector1++; connector2++; } while(*connector1 != '\0') *presult++ = *connector1++; while(*connector2 != '\0') *presult++ = *connector2++; *presult = '\0'; return result; } static bool labels_match(const char* label1, const char* label2) { // printf("Compare: %s %s\n", label1, label2); if ((label1[0] == 'S' && label2[0] == 'S') && (label1[1] == 's' || label1[1] == 'p') && (label2[1] == 's' || label2[1] == 'p')) { label1 += 2; label2 += 2; } while(*label1 != '\0' && *label2 != '\0') { if (*label1 != '*' && *label2 != '*' && *label1 != *label2) return false; label1++; label2++; } return true; } //////////////////////////////////////////////////////////////////////////// class Variables { public: Variables(Sentence sent) :_var(0) ,_sent(sent) ,_linked_variable_map(sent->length, -1) ,_linked_min_variable_map(sent->length, -1) ,_linked_max_variable_map(sent->length, -1) ,_link_variable_map(sent->length) ,_fat_link_variable_map(sent->length, -1) ,_link_top_cw_variable_map(sent->length) , _link_cw_variable_map(sent->length) ,_link_top_ww_variable_map(sent->length, -1) ,_thin_link_variable_map(sent->length, -1) ,_guiding(new CostDistanceGuiding(sent)) { } ~Variables() { std::vector::iterator i; for (i = _link_variables.begin(); i != _link_variables.end(); i++) { if ((*i) != 0) { xfree((*i)->label, strlen((*i)->label)); delete *i; } } delete _guiding; } /* * General purpose variables specified by their names */ // If guiding params are unknown, they are set do default int string(const char* name) { int var; if (!get_var_from_trie(name, var)) { #ifdef _VARS var_defs_stream << name << "\t" << var << endl; #endif _guiding->setStringParameters(var, name); } assert(var != -1, "Var == -1"); return var; } // If the cost is explicitely given, guiding params are calculated // using the cost. Any params set earlier are overridden. int string_cost(const char* name, int cost) { int var; var = string(name); _guiding->setStringParameters(var, name, cost); assert(var != -1, "Var == -1"); return var; } /* * Variables that specify that a part of word tag is satisfied * without making any connections of the given direction. */ // If guiding params are unknown, they are set do default int epsilon(char* v, char dir) { char name[MAX_VARIABLE_NAME]; dir = (dir == '+') ? 'r' : 'l'; char* s = name; *s++ = dir; *s++ = 'e'; s = fast_sprintf(s, v); int var; if (!get_var_from_trie(name, var)) { #ifdef _VARS var_defs_stream << name << "\t" << var << endl; #endif _guiding->setEpsilonParameters(var); } assert(var != -1, "Var == -1"); return var; } /* * linked(wi, wj) * Variables that specify that two words are linked */ // If guiding params are unknown, they are set do default int linked(int wi, int wj) { assert(wi < wj, "Variables: linked should be ordered"); int var; if (!get_linked_variable(wi, wj, var)) { #ifdef _VARS var_defs_stream << "linked_" << wi << "_" << wj << "\t" << var << endl; #endif add_linked_variable(wi, wj, var); _guiding->setLinkedParameters(var, wi, wj); } assert(var != -1, "Var == -1"); return var; } // If guiding params are unknown, they are set do default int linked_max(int wi, int wj) { int var; if (!get_linked_max_variable(wi, wj, var)) { #ifdef _VARS var_defs_stream << "linked_max_" << wi << "_" << wj << "\t" << var << endl; #endif _guiding->setLinkedMinMaxParameters(var, wi, wj); } assert(var != -1, "Var == -1"); return var; } // If guiding params are unknown, they are set do default int linked_min(int wi, int wj) { int var; if (!get_linked_min_variable(wi, wj, var)) { #ifdef _VARS var_defs_stream << "linked_min_" << wi << "_" << wj << "\t" << var << endl; #endif _guiding->setLinkedMinMaxParameters(var, wi, wj); } assert(var != -1, "Var == -1"); return var; } /* * link(wi, pi, wj, pj) * Variables that specify that a direct link has been established * between the connectors ci of the word_i at position i and * cj of the word_j at position j */ // If guiding params are unknown, they are set do default int link(int wi, int pi, const char* ci, int wj, int pj, const char* cj) { assert(wi < wj, "Variables: link should be ordered"); int var; if (!get_link_variable(wi, pi, wj, pj, var)) { #ifdef _VARS var_defs_stream << "link_" << wi << "_" << pi << "_" << ci << "_" << wj << "_" << pj << "_" << cj << "\t" << var << endl; #endif add_link_variable(wi, pi, ci, wj, pj, cj, var); _guiding->setLinkParameters(var, wi, ci, wj, cj, _link_variables[var]->label); } assert(var != -1, "Var == -1"); return var; } // If the cost is specified, guiding params are calculated // using the cost. Any guiding params that are set earlier are overridden int link_cost(int wi, int pi, const char* ci, int wj, int pj, const char* cj, int cost) { assert(wi < wj, "Variables: link should be ordered"); int var = link(wi, pi, ci, wj, pj, cj); _guiding->setLinkParameters(var, wi, ci, wj, cj, link_variable(var)->label, cost); assert(var != -1, "Var == -1"); return var; } /* * The following types of variables are used for conjunction handling */ /* * fat_link(wi, wj) * Variables that specify that there is a fat link from the word i * up to the word j */ // If guiding params for this variable are not set earlier, they are // now set to default int fat_link(int wi, int wj) { assert(_sent->is_conjunction[wj] || strcmp(_sent->word[wj].string, ",") == 0, "Fat link can up only to a connective word"); int var; if (!get_fat_link_variable(wi, wj, var)) { #ifdef _VARS var_defs_stream << "fatlink_" << wi << "_" << wj << "\t" << var << endl; #endif add_fatlink_variable(wi, wj, var); _guiding->setFatLinkParameters(var, wi, wj); } assert(var != -1, "Var == -1"); return var; } /* * fat_link_neighbor(w) * It seems that connective words usually have fat links to at least one * neighboring word. This is a definitional variable for that notion and * it can positively affect the search guiding. */ int neighbor_fat_link(int w) { assert(_sent->is_conjunction[w] || strcmp(_sent->word[w].string, ",") == 0, "Only connective words can have fat links down"); int var; char name[MAX_VARIABLE_NAME]; sprintf(name, "nfl_%d", w); if (!get_var_from_trie(name, var)) { #ifdef _VARS var_defs_stream << name << "\t" << var << endl; #endif _guiding->setNeighborFatLinkParameters(var, w); } assert(var != -1, "Var == -1"); return var; } /* * thin_link(wi, wj) * Variables that specify that two words are linked by a thin link */ // If guiding params are unknown, they are set do default int thin_link(int wi, int wj) { assert(wi < wj, "Variables: thin link should be ordered"); int var; if (!get_thin_link_variable(wi, wj, var)) { #ifdef _VARS var_defs_stream << "thin_link_" << wi << "_" << wj << "\t" << var << endl; #endif _guiding->setThinLinkParameters(var, wi, wj); } assert(var != -1, "Var == -1"); return var; } /* * link_cw(wi, wj, pj) * Variables that specify that an indirect link has been established * between the word i and connector cj of the word_j at position * j. */ // If guiding params for this variable are not set earlier, they are // now set to default int link_cw(int wi, int wj, int pj, const char* cj) { int var; if (!get_link_cw_variable(wi, wj, pj, var)) { #ifdef _VARS var_defs_stream << "link_cw_" << "(" << wj << "_" << pj << "_" << cj << ")_" << wi << "\t" << var << endl; #endif _guiding->setLinkCWParameters(var, wi, wj, cj); } assert(var != -1, "Var == -1"); return var; } /* * link_top_cw(wi, wj, pj) * Variables that specify that a connective word has been directly * linked to a connector */ // If guiding params for this variable are not set earlier, they are // now set to default int link_top_cw(int wi, int wj, int pj, const char* cj) { int var; if (!get_link_top_cw_variable(wi, wj, pj, var)) { add_link_top_cw_variable(wi, wj, pj, cj, var); _guiding->setLinkTopCWParameters(var, wi, wj, cj); #ifdef _VARS var_defs_stream << "link_top_cw_" << "(" << wj << "_" << pj << "_" << cj << ")_" << wi << "\t" << var << endl; #endif } assert(var != -1, "Var == -1"); return var; } /* * link_top_ww(wi, wj) * Variables that specify that word wi is linked to the word wj, and * wj is a top of the fat-link tree. */ // If guiding params are unknown, they are set do default int link_top_ww(int wi, int wj) { int var; if (!get_link_top_ww_variable(wi, wj, var)) { #ifdef _VARS var_defs_stream << "link_top_ww_" << wi << "_" << wj << "\t" << var << endl; #endif _guiding->setLinkTopWWParameters(var, wi, wj); } assert(var != -1, "Var == -1"); return var; } #ifdef _CONNECTIVITY_ /* The following variables are deprecated */ // Variables that specify that words i and j are connected int con(int i, int j) { char name[MAX_VARIABLE_NAME]; char* s = name; *s++ = 'c'; s = fast_sprintf(s, i); *s++ = '_'; s = fast_sprintf(s, j); int var; if (!get_var_from_trie(name, var)) set_variable_sat_params(var, false); return var; } // Auxilary variables used for connectivity encoding int l_con(int i, int j, int k) { int var; if (!get_lcon_variable(i, j, k, var)) set_variable_sat_params(var, false); return var; } #endif /* * link(wi, pi, wj, pj) */ // Returns the indices of all link variables const std::vector& link_variables() { return _link_variables_indices; } // Returns the indices of all link_x_x_wj_pj variables const std::vector& link_variables(int wj, int pj) { std::pair p(wj, pj); return _link_variable_wp_map[p]; } // Additional info about the link(wi, pi, wj, pj) variable struct LinkVar { LinkVar(const std::string& _name, char* _label, int _lw, int _lp, int _rw, int _rp, const char* _lc, const char* _rc) : name(_name), label(_label), left_word(_lw), right_word(_rw), left_position(_lp), right_position(_rp), left_connector(_lc), right_connector(_rc) { } std::string name; char* label; const char* left_connector; const char* right_connector; int left_word; int left_position; int right_word; int right_position; }; // Returns additional info about the given link variable const LinkVar* link_variable(int var) { return _link_variables[var]; } /* * linked(wi, wj) */ // Returns the indices of all linked variables const std::vector& linked_variables() { return _linked_variables_indices; } // Additional info about the linked(i, j) variable struct LinkedVar { LinkedVar(int lw, int rw) : left_word(lw), right_word(rw) { } int left_word; int right_word; }; // Returns additional info about the given linked variable const LinkedVar* linked_variable(int var) { return _linked_variables[var]; } /* * link_top_cw((wi, pi), wj) */ // Returns indices of all link_top_cw variables const std::vector& link_top_cw_variables() { return _link_top_cw_variables_indices; } // Additional info about the link_top_cw(wi, wj, pj) variable struct LinkTopCWVar { LinkTopCWVar(const std::string& _name, int _tw, int _cw, const char* _c) : name(_name), connector_word(_cw), top_word(_tw), connector(_c) { } std::string name; char* label; const char* connector; int connector_word; int top_word; }; // Returns additional info about the given link_top_cw variable const LinkTopCWVar* link_top_cw_variable(int var) { return _link_top_cw_variables[var]; } /* * fat_link(wi, wj) */ // Returns indices of all fat-link variables const std::vector& fat_link_variables() { return _fat_link_variables_indices; } // Additional info about the fatlink(wi, wj) variable struct FatLinkVar { FatLinkVar(int down, int up) : down_word(down), up_word(up) { } int down_word; int up_word; }; // Return additional info about the given fat-link variable const FatLinkVar* fat_link_variable(int var) { return _fat_link_variables[var]; } /* Pass SAT search parameters to the MiniSAT solver */ void setVariableParameters(Solver* solver) { _guiding->passParametersToSolver(solver); } private: /* Sentence that is being parsed */ Sentence _sent; /* * Information about string variables */ // What is the number of the variable with the given name? Trie _variable_trie; /* * Information about link(wi, pi, wj, pj) variables */ // What is the number of the link(wi, pi, wj, pj) variable? MatrixUpperTriangle< std::map, int> > _link_variable_map; // What are the numbers of all link(wi, pi, wj, pj) variables? std::vector _link_variables_indices; // What are the numbers of all link(x, x, wj, pj) variables? std::map< std::pair, std::vector > _link_variable_wp_map; // Additional info about the link(wi, pi, wj, pj) variable with the given number std::vector _link_variables; // Set this additional info void add_link_variable(int i, int pi, const char* ci, int j, int pj, const char* cj, int var) { char name[MAX_VARIABLE_NAME]; char* s = name; *s++ = 'l'; *s++ = 'i'; *s++ = 'n'; *s++ = 'k'; *s++ = '_'; s = fast_sprintf(s, i); *s++ = '_'; s = fast_sprintf(s, pi); *s++ = '_'; s = fast_sprintf(s, ci); *s++ = '_'; s = fast_sprintf(s, j); *s++ = '_'; s = fast_sprintf(s, pj); *s++ = '_'; s = fast_sprintf(s, cj); char* label = construct_link_label(ci, cj); if (var >= _link_variables.size()) { _link_variables.resize(var + 1, 0); } _link_variables[var] = new LinkVar(name, label, i, pi, j, pj, ci, cj); _link_variables_indices.push_back(var); } /* * Information about linked(i, j) variables */ // What is the number of the linked(i, j) variable? MatrixUpperTriangle _linked_variable_map; // What are the numbers of all linked(i, j) variables? std::vector _linked_variables_indices; // Additional info about the linked(i, j) variable std::vector _linked_variables; // Set the additional info void add_linked_variable(int i, int j, int var) { if (var >= _linked_variables.size()) { _linked_variables.resize(var + 1, 0); } _linked_variables[var] = new LinkedVar(i, j); _linked_variables_indices.push_back(var); } // What is the number of the linked_min(i, j) variable? Matrix _linked_min_variable_map; // What is the number of the linked_max(i, j) variable? Matrix _linked_max_variable_map; /* * Information about the fat_link(i, j) variables */ // What is the number of the fatlink(wi, wj) variable? Matrix _fat_link_variable_map; // What are the numbers of all fatlink(wi wj) variables? std::vector _fat_link_variables_indices; // Additional info about the fatlink(wi, wj) variable with the given number std::vector _fat_link_variables; // Set the additional info void add_fatlink_variable(int i, int j, int var) { if (var >= _fat_link_variables.size()) { _fat_link_variables.resize(var + 1, 0); } _fat_link_variables[var] = new FatLinkVar(i, j); _fat_link_variables_indices.push_back(var); } /* * Information about the thin_link(i, j) variables */ // What is the number of the thin_link(i, j) variable? MatrixUpperTriangle _thin_link_variable_map; /* * Information about the link_top_cw(w, wj, pj) variables */ // What is the number of the link_top_cw(wi, wj, pj) variable? Matrix< std::map > _link_top_cw_variable_map; // What are the numbers of all link_top_cw(wi, wj, pj) variables? std::vector _link_top_cw_variables_indices; // Additional info about the link_top_cw(wi, wj, pj) variable with the given number std::vector _link_top_cw_variables; // Set this additional info void add_link_top_cw_variable(int i, int j, int pj, const char* cj, int var) { char name[MAX_VARIABLE_NAME]; char* s = name; *s++ = 'l'; *s++ = 'i'; *s++ = 'n'; *s++ = 'k'; *s++ = '_'; *s++ = 't'; *s++ = 'o'; *s++ = 'p'; *s++ = '_'; s = fast_sprintf(s, i); *s++ = '_'; *s++ = '('; s = fast_sprintf(s, j); *s++ = '_'; s = fast_sprintf(s, pj); *s++ = '_'; s = fast_sprintf(s, cj); *s++ = ')'; *s = '\0'; if (var >= _link_top_cw_variables.size()) { _link_top_cw_variables.resize(var + 1, 0); } _link_top_cw_variables[var] = new LinkTopCWVar(name, i, j, cj); _link_top_cw_variables_indices.push_back(var); } /* * Information about the link_cw(w, wj, pj) variables */ // What is the number of the link_cw(wi, wj, pj) variable? Matrix< std::map > _link_cw_variable_map; /* * Information about the link_top_ww(i, j) variables */ // What is the number of the link_top_ww(i, j) variable? Matrix _link_top_ww_variable_map; #ifdef _CONNECTIVITY_ std::map,int>, int> _lcon_variables; #endif /* SAT search parameters */ Guiding* _guiding; /* Current free variable number */ int _var; /* Get a variable number that has not been used before */ int get_fresh_var(void) { return _var++; } /* Helper functions that retrieve variable numbers from appropriate data structures. If the variable is not present, it is assigned a fresh variable number, and false is returned. Otherwise, the number is retrieved and true is returned. */ bool get_var_from_trie(const char* name, int& var) { try { int num = _variable_trie.lookup(name); if (num != Trie::NOT_FOUND) { var = num; return true; } else { var = get_fresh_var(); _variable_trie.insert(name, var); return false; } } catch (const std::string& s) { cout << s << endl; exit(EXIT_FAILURE); } } bool get_2int_variable(int i, int j, int& var, Matrix& mp) { var = mp(i, j); if (var == -1) { var = get_fresh_var(); mp.set(i, j, var); return false; } return true; } bool get_3int_variable(int i, int j, int pj, int& var, Matrix< std::map >& mp) { std::map& m = mp(i, j); std::map::iterator it = m.find(pj); if (it == m.end()) { var = get_fresh_var(); m[pj] = var; return false; } else { var = it->second; return true; } } bool get_4int_variable(int i, int pi, int j, int pj, int& var, Matrix< std::map, int> >& mp) { std::map< std::pair, int >& m = mp(i, j); std::pair p(pi, pj); std::map< std::pair, int >::iterator it = m.find(p); if (it == m.end()) { var = get_fresh_var(); m[p] = var; return false; } else { var = it->second; return true; } } bool get_link_variable(int i, int pi, int j, int pj, int& var) { bool ret = get_4int_variable(i, pi, j, pj, var, _link_variable_map); if (!ret) { std::pair p(j, pj); _link_variable_wp_map[p].push_back(var); } return ret; } bool get_linked_variable(int i, int j, int& var) { return get_2int_variable(i, j, var, _linked_variable_map); } bool get_linked_min_variable(int i, int j, int& var) { return get_2int_variable(i, j, var, _linked_min_variable_map); } bool get_linked_max_variable(int i, int j, int& var) { return get_2int_variable(i, j, var, _linked_max_variable_map); } bool get_fat_link_variable(int i, int j, int& var) { return get_2int_variable(i, j, var, _fat_link_variable_map); } bool get_thin_link_variable(int i, int j, int& var) { return get_2int_variable(i, j, var, _thin_link_variable_map); } bool get_link_cw_variable(int i, int j, int pj, int& var) { return get_3int_variable(i, j, pj, var, _link_cw_variable_map); } bool get_link_top_cw_variable(int i, int j, int pj, int& var) { return get_3int_variable(i, j, pj, var, _link_top_cw_variable_map); } bool get_link_top_ww_variable(int i, int j, int& var) { return get_2int_variable(i, j, var, _link_top_ww_variable_map); } #ifdef _CONNECTIVITY_ bool get_lcon_variable(int i, int j, int k, int& var) { std::pair, int> p(std::pair(i, j), k); std::map, int>, int>::iterator it = _lcon_variables.find(p); if (it != _lcon_variables.end()) { var = it->second; return true; } else { var = get_fresh_var(); #ifdef _VARS var_defs_stream << "lcon_" << i << "_" << j << "_" << k << "\t" << var << endl; #endif _lcon_variables[p] = var; return false; } } #endif }; #endif link-grammar-4.7.4/link-grammar/sat-solver/Makefile.am0000644000175000017500000000132411246751164021634 0ustar bloombloom VERSION=0.0.1 dnl Version info for libraries = CURRENT:REVISION:AGE SATSOLVER_VERSION_INFO=1:0:1 libsat_solver_la_LDFLAGS = -version-info $(SATSOLVER_VERSION_INFO) INCLUDES = -I$(top_srcdir) -I$(top_srcdir)/link-grammar -I$(top_srcdir)/link-grammar/minisat libsat_solver_includedir = $(includedir)/link-grammar $(includedir)/link-grammar/minisat lib_LTLIBRARIES = libsat-solver.la libsat_solver_la_SOURCES = \ clock.hpp \ fast-sprintf.cpp \ fast-sprintf.hpp \ guiding.hpp \ matrix-ut.hpp \ sat-encoder.cpp \ sat-encoder.hpp \ sat-encoder.h \ trie.hpp \ util.cpp \ util.hpp \ variables.cpp \ variables.hpp \ word-tag.cpp \ word-tag.hpp link-grammar-4.7.4/link-grammar/sat-solver/word-tag.hpp0000644000175000017500000001054511170672732022041 0ustar bloombloom#ifndef __WORD_TAG_HPP__ #define __WORD_TAG_HPP__ #include #include #include extern "C" { #include } #include "variables.hpp" struct PositionConnector { PositionConnector(Connector* c, char d, int w, int p, int cst, int pcst, bool lr, bool ll, const std::vector& er, const std::vector& el) : connector(c), dir(d), word(w), position(p), cost(cst), parrent_cost(pcst), leading_right(lr), leading_left(ll), eps_right(er), eps_left(el) { /* cout << c->string << " : ." << w << ". : ." << p << ". "; if (leading_right) { cout << "lr: "; copy(er.begin(), er.end(), ostream_iterator(cout, " ")); } if (leading_left) { cout << "ll: "; copy(el.begin(), el.end(), ostream_iterator(cout, " ")); } cout << endl; */ } // Connector itself Connector* connector; // Direction char dir; // word in a sentence that this connector belongs to int word; // position in the word tag int position; // cost of the connector int cost; // parrent cost int parrent_cost; bool leading_right; std::vector eps_right; bool leading_left; std::vector eps_left; // Matches with other words std::vector matches; }; // TODO: Hash connectors for faster matching class WordTag { private: std::vector _left_connectors; std::vector _right_connectors; std::vector _dir; std::vector _position; int _word; Variables* _variables; Sentence _sent; Parse_Options _opts; // Could this word tag match a connector (wi, pi)? // For each word wi I keep a set of positions pi that can be matched std::vector< std::set > _match_possible; void set_match_possible(int wj, int pj) { _match_possible[wj].insert(pj); } public: WordTag(int word, Variables* variables, Sentence sent, Parse_Options opts) : _word(word), _variables(variables), _sent(sent), _opts(opts) { _match_possible.resize(_sent->length); } const std::vector& get_left_connectors() { return _left_connectors; } const std::vector& get_right_connectors() { return _right_connectors; } PositionConnector* get(int dfs_position) { switch (_dir[dfs_position - 1]) { case '+': return &_right_connectors[_position[dfs_position - 1]]; case '-': return &_left_connectors[_position[dfs_position - 1]]; } } void set_connector_length_limit(Connector* c) { int short_len = _opts->short_length; if (short_len > UNLIMITED_LEN) short_len = UNLIMITED_LEN; Connector_set *conset = _sent->dict->unlimited_connector_set; if (parse_options_get_all_short_connectors(_opts)) { c->length_limit = short_len; } else if (conset == NULL || match_in_connector_set(_sent, conset, c, '+')) { c->length_limit = UNLIMITED_LEN; } else { c->length_limit = short_len; } } int match(int w1, Connector& cntr1, char dir, int w2, Connector& cntr2, bool conjunction) { if (conjunction) { switch (dir) { case '+': return ::prune_match(0, &cntr1, &cntr2); case '-': return ::prune_match(0, &cntr2, &cntr1); default: throw std::string("Unknown connector direction: ") + dir; } } else { return ::do_match(_sent, &cntr1, &cntr2, w1, w2); } } void insert_connectors(Exp* exp, int& dfs_position, bool& leading_right, bool& leading_left, std::vector& eps_right, std::vector& eps_left, char* var, bool root, int parrent_cost); // Caches information about the found matches to the _matches vector, and also // updates the _matches vector of all connectors in the given tag. // In order to have all possible matches correctly cached, the function assumes that it is // iteratively called for all words in the sentence, where the tag is on the right side of // this word void add_matches_with_word(WordTag& tag); // Find matches in this word tag with the connector (name, dir). void find_matches(int w, const char* C, char dir, std::vector& matches); // A simpler function: Can any connector in this word match a connector wi, pi? // It is assumed that bool match_possible(int wi, int pi) { return _match_possible[wi].find(pi) != _match_possible[wi].end(); } }; #endif link-grammar-4.7.4/link-grammar/sat-solver/sat-encoder.hpp0000644000175000017500000003027411526022265022515 0ustar bloombloomextern "C" { #include } extern "C" int sat_encode(Sentence sent, Parse_Options opts); extern "C" Linkage sat_create_linkage(int k, Sentence sent, Parse_Options opts); extern "C" void sat_sentence_delete(Sentence sent); #include "word-tag.hpp" /** * Base class for all SAT encodings */ class SATEncoder { public: // Construct the encoder based on given sentence SATEncoder(Sentence sent, Parse_Options opts) : _sent(sent), _opts(opts), _solver(new Solver()), _variables(new Variables(sent)) { // Preprocess word tags of the sentence build_word_tags(); } virtual ~SATEncoder() { delete _variables; delete _solver; } // Create the formula from the sentence void encode(); // Solve the formula, returning the next linkage. Linkage get_next_linkage(); protected: /** * Methods that generate various link-grammar constraints. */ // Top-level method that generates satisfaction conditions for every // word in the sentence void generate_satisfaction_conditions(); // Generates satisfaction conditions for the word-tag expression e void generate_satisfaction_for_expression(int w, int& dfs_position, Exp* e, char* var, int parrent_cost); // Handle the case of NULL expression of a word virtual void handle_null_expression(int w) = 0; // Determine if this word-tag must be satisfied and generate appropriate clauses virtual void determine_satisfaction(int w, char* name) = 0; // Generates satisfaction condition for the connector (wi, pi) virtual void generate_satisfaction_for_connector(int wi, int pi, const char* Ci, char dir, bool multi, int cost, char* var) = 0; // Definition of link_cw((wi, pi), wj) variables when wj is an ordinary word void generate_link_cw_ordinary_definition(int wi, int pi, const char* Ci, char dir, int cost, int wj); // Generates order constraints for the elements of a conjunction. void generate_conjunct_order_constraints(int w, Exp *e1, Exp* e2, int& dfs_position); /** * Methods used for optimizing conjunction ordering constraints */ // Number of connectors in an expression int num_connectors(Exp* e); // This expression can be matched without using any connectors of // the given direction static int empty_connectors(Exp* exp, char dir); // This expression can be matched while using a connector of the // given direction static int non_empty_connectors(Exp* exp, char dir); // Trailing connectors of a given direction in the given expression void trailing_connectors(int w, Exp* exp, char dir, int& dfs_position, std::vector& connectors); bool trailing_connectors_and_aux(int w, E_list* l, char dir, int& dfs_position, std::vector& connectors); // Connectors of the given direction that cannot be trailing // connectors void certainly_non_trailing(int w, Exp* exp, char dir, int& dfs_position, std::vector& connectors, bool has_right); // Connectors that can act as leading connectors of a given // direction in the given direction void leading_connectors(int w, Exp* exp, char dir, int& dfs_position, std::vector& connectors); /** * Definitions of linked(wi, wj) variables. */ // Define all linked(wi, wj) variables virtual void generate_linked_definitions() = 0; // In order to reduce the number of clauses, some linked(wi, wj) // variables can apriori be eliminated. The information about pairs // of words that can be linked is kept in this matrix. MatrixUpperTriangle _linked_possible; /** * Planarity constraints */ // Generates clauses that forbid link-crossing void generate_planarity_conditions(); // Stronger planarity pruning void generate_linked_min_max_planarity(); /** * Connectivity constraints */ #ifdef _CONNECTIVITY_ // Generate clauses that encode the connectivity requirement of the // linkage. Experiments showed that it is better to check the // connectivity aposteriori and this method has been excised. void generate_connectivity(); #endif // Helper method for connectivity_components static void dfs(int node, const MatrixUpperTriangle& graph, int component, std::vector& components); // Extract connectivity components of a linkage. Return true iff the linkage is connected. bool connectivity_components(std::vector& components); // Generate clauses that prohibit all disconnected linkages that // have the specified connectivity components. void generate_disconnectivity_prohibiting(std::vector components); /** * Encoding specific clauses - override to add clauses that are * specific to a certain encoding */ virtual void generate_encoding_specific_clauses() {} /** * Post-processing - PP pruning */ // Generates PP pruning clauses. void pp_prune(); bool post_process_linkage(Linkage linkage); /** * Power pruning */ // Generate definition of epsilon variables that are used for power // pruning void generate_epsilon_definitions(); bool generate_epsilon_for_expression(int w, int& dfs_position, Exp* e, char* var, bool root, char dir); // Power pruning void power_prune(); // auxiliary method that extends power pruning clauses with additional literals // (e.g., link should not be power-prunned if there words are fat-linked) virtual void add_additional_power_pruning_conditions(vec& clause, int wl, int wr) {} /** * Cost cutoff */ // Cost cutoff treshold value. Nodes of the expression tree are // pruned if their cost exceeds this value. Cost cutoff is performed // during satisfaction condition generating. static const int _cost_cutoff = 2; /** * Creating clauses and passing them to the MiniSAT solver */ // Add the specified clause to the solver void add_clause(vec& clause) { #ifdef _DEBUG print_clause(clause); #endif for (int i = 0; i < clause.size(); i++) { while (var(clause[i]) >= _solver->nVars()) { _solver->newVar(); } } _solver->addClause(clause); } // Print clause literals to standard output static void print_clause(const vec& clause) { static int num = 1; cout << "Clause: ." << num++ << ". "; for (int i = 0; i < clause.size(); i++) cout << (sign(clause[i]) ? '-' : '+') << var(clause[i]) << " "; cout << endl; } /** * Conversion of various formula types to CNF. Clauses obtained * are automatically passed to the SAT Solver. */ void generate_literal(Lit l); void generate_and_definition(Lit lhs, vec& rhs); void generate_or_definition(Lit lhs, vec& rhs); void generate_xor_definition(Lit lhs, vec& rhs); void generate_equivalence_definition(Lit l1, Lit l2); void generate_classical_and_definition(Lit lhs, vec& rhs); void generate_and(vec& vect); void generate_or(vec& vect); void generate_xor_conditions(vec& vect); void generate_conditional_or_definition(Lit condition, Lit lhs, vec& rhs); void generate_conditional_lr_implication_or_definition(Lit condition, Lit lhs, vec& rhs); void generate_conditional_lr_implication_or_definition(Lit condition1, Lit condition2, Lit lhs, vec& rhs); /* * Word tags of the words in a sentence kept in a preprocessed * form. This enables users to get information about the * connectors in a very eficient way. */ // Word tags std::vector _word_tags; // Initializes _word_tags array void build_word_tags(); // Find all matching connectors between two words void find_all_matches_between_words(int w1, int w2, std::vector >& matches); // Check if the connector (wi, pi) can match any word in [l, r) bool matches_in_interval(int wi, int pi, int l, int r); // Join several expressions corresponding to different dictionary // entries of a word into a single expression. Exp* join_alternatives(int w); // Erase auxiliary expression tree nodes obtained by joining several // expressions into one. void free_alternatives(Exp* e); /** * Decoding */ // Convert propositional model to a parse info structure virtual bool extract_links(Parse_info pi) = 0; // Create linkage from a propositional model Linkage create_linkage(); // Generate clause that prohibits the current model void generate_linkage_prohibiting(); // Object that contains all information about the variable // encoding. Variables* _variables; // The MiniSAT solver instance. The solver keeps the set of clauses. Solver* _solver; // Sentence that is being parsed. Sentence _sent; // Parse options. Parse_Options _opts; }; /******************************************************************************* * SAT encoding for sentences that do not contain conjunction. * *******************************************************************************/ class SATEncoderConjunctionFreeSentences : public SATEncoder { public: SATEncoderConjunctionFreeSentences(Sentence sent, Parse_Options opts) : SATEncoder(sent, opts) { } virtual void handle_null_expression(int w); virtual void determine_satisfaction(int w, char* name); virtual void generate_satisfaction_for_connector(int wi, int pi, const char* Ci, char dir, bool multi, int cost, char* var); virtual void generate_linked_definitions(); virtual bool extract_links(Parse_info pi); virtual void generate_encoding_specific_clauses(); }; /******************************************************************************* * SAT encoding for sentences that contain conjunction. * *******************************************************************************/ class SATEncoderConjunctiveSentences : public SATEncoder { public: SATEncoderConjunctiveSentences(Sentence sent, Parse_Options opts) : SATEncoder(sent, opts) { init_connective_words(); } private: virtual void handle_null_expression(int w); virtual void determine_satisfaction(int w, char* name); virtual void generate_satisfaction_for_connector(int wi, int pi, const char* Ci, char dir, bool multi, int cost, char* var); virtual void add_additional_power_pruning_conditions(vec& clause, int wl, int wr); virtual void generate_encoding_specific_clauses(); // various fat-link conditions void either_tag_or_fat_link(int w, Lit tag); void generate_fat_link_up_definitions(); void generate_fat_link_down_definitions(); void generate_fat_link_up_between_down_conditions(); void generate_fat_link_comma_conditions(); void generate_fat_link_crossover_conditions(); void generate_fat_link_Left_Wall_not_inside(); void generate_fat_link_linked_upperside(); void generate_fat_link_existence(); void generate_fat_link_neighbor(); void generate_label_compatibility(); // link_cw variables bool link_cw_possible(int wi, int pi, const char* Ci, char dir, int w, int llim, int rlim); bool link_cw_possible_with_fld(int wi, int pi, const char* Ci, char dir, int w, int llim, int rlim); void generate_link_cw_connective_impossible (int wi, int pi, const char* Ci, int wj); void generate_link_cw_connective_definition (int wi, int pi, const char* Cj, int wj); // link_top_cw variables void generate_link_top_cw_up_definition (int wi, int wj, int pj, const char* Cj, bool multi); void generate_link_top_cw_iff_link_cw (int wi, int wj, int pj, const char* Cj); // link_top_ww void generate_link_top_ww_connective_comma_definition (Lit lhs, int wi, int wj); // link_ww virtual void generate_linked_definitions(); // Linkage extraction from the model void get_satisfied_link_top_cw_connectors(int word, int top_word, std::vector& link_top_cw_vars); virtual bool extract_links(Parse_info pi); // Initialize the vector of connective words of this sentence void init_connective_words(); // Words that are connectives or commas std::vector _connectives; // Cache isConnectiveOrComma results for faster checking std::vector _is_connective_or_comma; bool isConnectiveOrComma(int w) { return _is_connective_or_comma[w]; } }; link-grammar-4.7.4/link-grammar/sat-solver/fast-sprintf.hpp0000644000175000017500000000024111052414476022723 0ustar bloombloom#ifndef __FAST_SPRINTF_HPP__ #define __FAST_SPRINTF_HPP__ char* fast_sprintf(char* buffer, int num); char* fast_sprintf(char* buffer, const char* str); #endif link-grammar-4.7.4/link-grammar/jni-client.h0000644000175000017500000001264511414162142017703 0ustar bloombloom #include /* Header for class LinkGrammar */ #ifndef _LinkGrammar_H_ #define _LinkGrammar_H_ #ifdef __cplusplus extern "C" { #endif /* * Class: LinkGrammar * Method: setMaxParseSeconds * Signature: (I)V */ JNIEXPORT void JNICALL Java_org_linkgrammar_LinkGrammar_setMaxParseSeconds (JNIEnv *, jclass, jint); /* * Class: LinkGrammar * Method: setMaxCost * Signature: (I)V */ JNIEXPORT void JNICALL Java_org_linkgrammar_LinkGrammar_setMaxCost (JNIEnv *, jclass, jint); /* * Class: LinkGrammar * Method: setDictionariesPath * Signature: (Ljava/lang/String;)V */ JNIEXPORT void JNICALL Java_org_linkgrammar_LinkGrammar_setDictionariesPath (JNIEnv *, jclass, jstring); /* * Class: LinkGrammar * Method: init * Signature: (Ljava/lang/String;)V */ JNIEXPORT void JNICALL Java_org_linkgrammar_LinkGrammar_init (JNIEnv *, jclass); /* * Class: LinkGrammar * Method: parse * Signature: (Ljava/lang/String;)V */ JNIEXPORT void JNICALL Java_org_linkgrammar_LinkGrammar_parse (JNIEnv *, jclass, jstring); /* * Class: LinkGrammar * Method: close * Signature: ()V */ JNIEXPORT void JNICALL Java_org_linkgrammar_LinkGrammar_close (JNIEnv *, jclass); /* * Class: LinkGrammar * Method: numWords * Signature: ()I */ JNIEXPORT jint JNICALL Java_org_linkgrammar_LinkGrammar_getNumWords (JNIEnv *, jclass); /* * Class: LinkGrammar * Method: getWord * Signature: (I)Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_org_linkgrammar_LinkGrammar_getWord (JNIEnv *, jclass, jint); JNIEXPORT jstring JNICALL Java_org_linkgrammar_LinkGrammar_getLinkageWord (JNIEnv *, jclass, jint); JNIEXPORT jstring JNICALL Java_org_linkgrammar_LinkGrammar_getLinkageDisjunct (JNIEnv *, jclass, jint); JNIEXPORT jstring JNICALL Java_org_linkgrammar_LinkGrammar_getLinkageSense (JNIEnv *, jclass, jint, jint); JNIEXPORT jdouble JNICALL Java_org_linkgrammar_LinkGrammar_getLinkageSenseScore (JNIEnv *, jclass, jint, jint); JNIEXPORT jstring JNICALL Java_org_linkgrammar_LinkGrammar_getVersion(JNIEnv *, jclass); JNIEXPORT jstring JNICALL Java_org_linkgrammar_LinkGrammar_getDictVersion(JNIEnv *, jclass); /* * Class: LinkGrammar * Method: numSkippedWords * Signature: ()I */ JNIEXPORT jint JNICALL Java_org_linkgrammar_LinkGrammar_getNumSkippedWords (JNIEnv *, jclass); /* * Class: LinkGrammar * Method: numLinkages * Signature: ()I */ JNIEXPORT jint JNICALL Java_org_linkgrammar_LinkGrammar_getNumLinkages (JNIEnv *, jclass); /* * Class: LinkGrammar * Method: makeLinkage * Signature: (I)V */ JNIEXPORT void JNICALL Java_org_linkgrammar_LinkGrammar_makeLinkage (JNIEnv *, jclass, jint); /* * Class: LinkGrammar * Method: linkageNumViolations * Signature: ()I */ JNIEXPORT jint JNICALL Java_org_linkgrammar_LinkGrammar_getLinkageNumViolations (JNIEnv *, jclass); /* * Class: LinkGrammar * Method: linkageAndCost * Signature: ()I */ JNIEXPORT jint JNICALL Java_org_linkgrammar_LinkGrammar_getLinkageAndCost (JNIEnv *, jclass); /* * Class: LinkGrammar * Method: linkageDisjunctCost * Signature: ()I */ JNIEXPORT jint JNICALL Java_org_linkgrammar_LinkGrammar_getLinkageDisjunctCost (JNIEnv *, jclass); /* * Class: LinkGrammar * Method: linkageLinkCost * Signature: ()I */ JNIEXPORT jint JNICALL Java_org_linkgrammar_LinkGrammar_getLinkageLinkCost (JNIEnv *, jclass); /* * Class: LinkGrammar * Method: numLinks * Signature: ()I */ JNIEXPORT jint JNICALL Java_org_linkgrammar_LinkGrammar_getNumLinks (JNIEnv *, jclass); /* * Class: LinkGrammar * Method: getLinkLWord * Signature: (I)I */ JNIEXPORT jint JNICALL Java_org_linkgrammar_LinkGrammar_getLinkLWord (JNIEnv *, jclass, jint); /* * Class: LinkGrammar * Method: getLinkRWord * Signature: (I)I */ JNIEXPORT jint JNICALL Java_org_linkgrammar_LinkGrammar_getLinkRWord (JNIEnv *, jclass, jint); /* * Class: LinkGrammar * Method: getLinkLLabel * Signature: (I)Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_org_linkgrammar_LinkGrammar_getLinkLLabel (JNIEnv *, jclass, jint); /* * Class: LinkGrammar * Method: getLinkRLabel * Signature: (I)Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_org_linkgrammar_LinkGrammar_getLinkRLabel (JNIEnv *, jclass, jint); /* * Class: LinkGrammar * Method: getLinkLabel * Signature: (I)Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_org_linkgrammar_LinkGrammar_getLinkLabel (JNIEnv *, jclass, jint); /* * Class: LinkGrammar * Method: constituentString * Signature: ()Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_org_linkgrammar_LinkGrammar_getConstituentString (JNIEnv *, jclass); /* * Class: LinkGrammar * Method: getLinkString * Signature: ()Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_org_linkgrammar_LinkGrammar_getLinkString (JNIEnv *, jclass); /* * Class: LinkGrammar * Method: isPastTenseForm * Signature: (Ljava/lang/String;)Z * @deprecated -- past-tense verbs are tagged with .v-d or .w-d or .q-d * subscripts. use those instead to figure out if a verb is past tense. */ JNIEXPORT jboolean JNICALL Java_org_linkgrammar_LinkGrammar_isPastTenseForm (JNIEnv *, jclass, jstring); /* * Class: LinkGrammar * Method: isEntity * Signature: (Ljava/lang/String;)Z */ JNIEXPORT jboolean JNICALL Java_org_linkgrammar_LinkGrammar_isEntity (JNIEnv *, jclass, jstring); #ifdef __cplusplus } #endif #endif /*_LinkGrammar_H_ */ link-grammar-4.7.4/link-grammar/spellcheck-aspell.c0000644000175000017500000001026511354146630021240 0ustar bloombloom/*************************************************************************/ /* Copyright (c) 2009 Vikas N. Kumar */ /* Copyright (c) 2009 Linas Vepstas */ /* All rights reserved */ /* */ /* Use of the link grammar parsing system is subject to the terms of the */ /* license set forth in the LICENSE file included with this software, */ /* and also available at http://www.link.cs.cmu.edu/link/license.html */ /* This license allows free redistribution and use in source and binary */ /* forms, with or without modification, subject to certain conditions. */ /* */ /*************************************************************************/ #ifdef HAVE_ASPELL #include #include #include #include #include "link-includes.h" #include "spellcheck.h" #include "utilities.h" /* For Win32 compatibility */ #define ASPELL_LANG_KEY "lang" static const char *spellcheck_lang_mapping[] = { "en" /* link-grammar language */, "en_US" /* Aspell language key */ }; struct linkgrammar_aspell { AspellConfig *config; AspellSpeller *speller; }; void * spellcheck_create(const char * lang) { struct linkgrammar_aspell *aspell = NULL; size_t i = 0; AspellCanHaveError *spell_err = NULL; for (i = 0; i < sizeof(spellcheck_lang_mapping)/sizeof(char *); i += 2) { if (0 != strcmp(lang, spellcheck_lang_mapping[i])) continue; aspell = (struct linkgrammar_aspell *)malloc(sizeof(struct linkgrammar_aspell)); if (!aspell) { prt_error("Error: out of memory. Aspell not used.\n"); aspell = NULL; break; } aspell->config = NULL; aspell->speller = NULL; aspell->config = new_aspell_config(); if (aspell_config_replace(aspell->config, ASPELL_LANG_KEY, spellcheck_lang_mapping[i]) == 0) { prt_error("Error: failed to set language in aspell: %s\n", lang); delete_aspell_config(aspell->config); free(aspell); aspell = NULL; break; } spell_err = new_aspell_speller(aspell->config); if (aspell_error_number(spell_err) != 0) { prt_error("Error: Aspell: %s\n", aspell_error_message(spell_err)); delete_aspell_can_have_error(spell_err); delete_aspell_config(aspell->config); free(aspell); aspell = NULL; break; } aspell->speller = to_aspell_speller(spell_err); break; } return aspell; } void spellcheck_destroy(void * chk) { struct linkgrammar_aspell *aspell = (struct linkgrammar_aspell *)chk; if (aspell) { delete_aspell_speller(aspell->speller); delete_aspell_config(aspell->config); free(aspell); aspell = NULL; } } int spellcheck_test(void * chk, const char * word) { int val = 0; struct linkgrammar_aspell *aspell = (struct linkgrammar_aspell *)chk; if (aspell && aspell->speller) { /* this can return -1 on failure */ val = aspell_speller_check(aspell->speller, word, -1); } return (val == 1) ? 1 : 0; } int spellcheck_suggest(void * chk, char ***sug, const char * word) { struct linkgrammar_aspell *aspell = (struct linkgrammar_aspell *)chk; if (!sug) { prt_error("Error: Aspell. Corrupt pointer.\n"); return 0; } if (aspell && aspell->speller) { const AspellWordList *list = NULL; AspellStringEnumeration *elem = NULL; const char *aword = NULL; unsigned int size, i; char **array = NULL; list = aspell_speller_suggest(aspell->speller, word, -1); elem = aspell_word_list_elements(list); size = aspell_word_list_size(list); /* allocate an array of char* for returning back to link-parser */ array = (char **)malloc(sizeof(char *) * size); if (!array) { prt_error("Error: Aspell. Out of memory.\n"); delete_aspell_string_enumeration(elem); return 0; } i = 0; while ((aword = aspell_string_enumeration_next(elem)) != NULL) { array[i++] = strdup(aword); } delete_aspell_string_enumeration(elem); *sug = array; return size; } return 0; } void spellcheck_free_suggest(char **sug, int size) { int i = 0; for (i = 0; i < size; ++i) { free(sug[i]); sug[i] = NULL; } free(sug); } #endif /* #ifdef HAVE_ASPELL */ link-grammar-4.7.4/link-grammar/post-process.c0000644000175000017500000010755411172431532020312 0ustar bloombloom/*************************************************************************/ /* Copyright (c) 2004 */ /* Daniel Sleator, David Temperley, and John Lafferty */ /* All rights reserved */ /* */ /* Use of the link grammar parsing system is subject to the terms of the */ /* license set forth in the LICENSE file included with this software, */ /* and also available at http://www.link.cs.cmu.edu/link/license.html */ /* This license allows free redistribution and use in source and binary */ /* forms, with or without modification, subject to certain conditions. */ /* */ /*************************************************************************/ /* see bottom of file for comments on post processing */ #include #include #include #include "error.h" #define PP_MAX_DOMAINS 128 /***************** utility routines (not exported) ***********************/ static int string_in_list(const char * s, const char * a[]) { /* returns FALSE if the string s does not match anything in the array. The array elements are post-processing symbols */ int i; for (i=0; a[i] != NULL; i++) if (post_process_match(a[i], s)) return TRUE; return FALSE; } static int find_domain_name(Postprocessor *pp, const char *link) { /* Return the name of the domain associated with the provided starting link. Return -1 if link isn't associated with a domain. */ int i,domain; StartingLinkAndDomain *sllt = pp->knowledge->starting_link_lookup_table; for (i=0;;i++) { domain = sllt[i].domain; if (domain==-1) return -1; /* hit the end-of-list sentinel */ if (post_process_match(sllt[i].starting_link, link)) return domain; } } static int contained_in(Domain * d1, Domain * d2, Sublinkage *sublinkage) { /* returns TRUE if domain d1 is contained in domain d2 */ char mark[MAX_LINKS]; List_o_links * lol; memset(mark, 0, sublinkage->num_links*(sizeof mark[0])); for (lol=d2->lol; lol != NULL; lol = lol->next) mark[lol->link] = TRUE; for (lol=d1->lol; lol != NULL; lol = lol->next) if (!mark[lol->link]) return FALSE; return TRUE; } static int link_in_domain(int link, Domain * d) { /* returns the predicate "the given link is in the given domain" */ List_o_links * lol; for (lol = d->lol; lol != NULL; lol = lol->next) if (lol->link == link) return TRUE; return FALSE; } /* #define CHECK_DOMAIN_NESTING */ #if defined(CHECK_DOMAIN_NESTING) /* Although this is no longer used, I'm leaving the code here for future reference --DS 3/98 */ static int check_domain_nesting(Postprocessor *pp, int num_links) { /* returns TRUE if the domains actually form a properly nested structure */ Domain * d1, * d2; int counts[4]; char mark[MAX_LINKS]; List_o_links * lol; int i; for (d1=pp->pp_data.domain_array; d1 < pp->pp_data.domain_array + pp->pp_data.N_domains; d1++) { for (d2=d1+1; d2 < pp->pp_data.domain_array + pp->pp_data.N_domains; d2++) { memset(mark, 0, num_links*(sizeof mark[0])); for (lol=d2->lol; lol != NULL; lol = lol->next) { mark[lol->link] = 1; } for (lol=d1->lol; lol != NULL; lol = lol->next) { mark[lol->link] += 2; } counts[0] = counts[1] = counts[2] = counts[3] = 0; for (i=0; i 0) && (counts[2] > 0) && (counts[3] > 0)) return FALSE; } } return TRUE; } #endif /** * Free the list of links pointed to by lol * (does not free any strings) */ static void free_List_o_links(List_o_links *lol) { List_o_links * xlol; while(lol != NULL) { xlol = lol->next; xfree(lol, sizeof(List_o_links)); lol = xlol; } } static void free_D_tree_leaves(DTreeLeaf *dtl) { DTreeLeaf * xdtl; while(dtl != NULL) { xdtl = dtl->next; xfree(dtl, sizeof(DTreeLeaf)); dtl = xdtl; } } /** * Gets called after every invocation of post_process() */ void post_process_free_data(PP_data * ppd) { int w, d; for (w = 0; w < ppd->length; w++) { free_List_o_links(ppd->word_links[w]); ppd->word_links[w] = NULL; } for (d = 0; d < ppd->N_domains; d++) { free_List_o_links(ppd->domain_array[d].lol); ppd->domain_array[d].lol = NULL; free_D_tree_leaves(ppd->domain_array[d].child); ppd->domain_array[d].child = NULL; } free_List_o_links(ppd->links_to_ignore); ppd->links_to_ignore = NULL; } #ifdef THIS_FUNCTION_IS_NOT_CURRENTLY_USED static void connectivity_dfs(Postprocessor *pp, Sublinkage *sublinkage, int w, pp_linkset *ls) { List_o_links *lol; pp->visited[w] = TRUE; for (lol = pp->pp_data.word_links[w]; lol != NULL; lol = lol->next) { if (!pp->visited[lol->word] && !pp_linkset_match(ls, sublinkage->link[lol->link]->name)) connectivity_dfs(pp, sublinkage, lol->word, ls); } } #endif /* THIS_FUNCTION_IS_NOT_CURRENTLY_USED */ static void mark_reachable_words(Postprocessor *pp, int w) { List_o_links *lol; if (pp->visited[w]) return; pp->visited[w] = TRUE; for (lol = pp->pp_data.word_links[w]; lol != NULL; lol = lol->next) mark_reachable_words(pp, lol->word); } static int is_connected(Postprocessor *pp) { /* Returns true if the linkage is connected, considering words that have at least one edge....this allows conjunctive sentences not to be thrown out. */ int i; for (i=0; ipp_data.length; i++) pp->visited[i] = (pp->pp_data.word_links[i] == NULL); mark_reachable_words(pp, 0); for (i=0; ipp_data.length; i++) if (!pp->visited[i]) return FALSE; return TRUE; } static void build_type_array(Postprocessor *pp) { D_type_list * dtl; int d; List_o_links * lol; for (d=0; dpp_data.N_domains; d++) { for (lol=pp->pp_data.domain_array[d].lol; lol != NULL; lol = lol->next) { dtl = (D_type_list *) xalloc(sizeof(D_type_list)); dtl->next = pp->pp_node->d_type_array[lol->link]; pp->pp_node->d_type_array[lol->link] = dtl; dtl->type = pp->pp_data.domain_array[d].type; } } } void free_d_type(D_type_list * dtl) { D_type_list * dtlx; for (; dtl!=NULL; dtl=dtlx) { dtlx = dtl->next; xfree((void*) dtl, sizeof(D_type_list)); } } D_type_list * copy_d_type(D_type_list * dtl) { D_type_list *dtlx, *dtlcurr=NULL, *dtlhead=NULL; for (; dtl!=NULL; dtl=dtl->next) { dtlx = (D_type_list *) xalloc(sizeof(D_type_list)); *dtlx = *dtl; if (dtlhead == NULL) { dtlhead = dtlx; dtlcurr = dtlx; } else { dtlcurr->next = dtlx; dtlcurr = dtlx; } } return dtlhead; } /** free the pp node from last time */ static void free_pp_node(Postprocessor *pp) { int i; PP_node *ppn = pp->pp_node; pp->pp_node = NULL; if (ppn == NULL) return; for (i=0; id_type_array[i]); } xfree((void*) ppn, sizeof(PP_node)); } /** set up a fresh pp_node for later use */ static void alloc_pp_node(Postprocessor *pp) { int i; pp->pp_node=(PP_node *) xalloc(sizeof(PP_node)); pp->pp_node->violation = NULL; for (i=0; ipp_node->d_type_array[i] = NULL; } static void reset_pp_node(Postprocessor *pp) { free_pp_node(pp); alloc_pp_node(pp); } /************************ rule application *******************************/ static int apply_rules(Postprocessor *pp, int (applyfn) (Postprocessor *,Sublinkage *,pp_rule *), Sublinkage *sublinkage, pp_rule *rule_array, const char **msg) { int i; for (i=0; (*msg=rule_array[i].msg)!=NULL; i++) if (!applyfn(pp, sublinkage, &(rule_array[i]))) return 0; return 1; } static int apply_relevant_rules(Postprocessor *pp, int(applyfn)(Postprocessor *pp,Sublinkage*,pp_rule *rule), Sublinkage *sublinkage, pp_rule *rule_array, int *relevant_rules, const char **msg) { int i, idx; /* if we didn't accumulate link names for this sentence, we need to apply all rules */ if (pp_linkset_population(pp->set_of_links_of_sentence)==0) { return apply_rules(pp, applyfn, sublinkage, rule_array, msg); } /* we did, and we don't */ for (i=0; (idx=relevant_rules[i])!=-1; i++) { *msg = rule_array[idx].msg; /* Adam had forgotten this -- DS 4/9/98 */ if (!applyfn(pp, sublinkage, &(rule_array[idx]))) return 0; } return 1; } static int apply_contains_one(Postprocessor *pp, Sublinkage *sublinkage, pp_rule *rule) { /* returns TRUE if and only if all groups containing the specified link contain at least one from the required list. (as determined by exact string matching) */ DTreeLeaf * dtl; int d, count; for (d=0; dpp_data.N_domains; d++) { for (dtl = pp->pp_data.domain_array[d].child; dtl != NULL && !post_process_match(rule->selector, sublinkage->link[dtl->link]->name); dtl = dtl->next) {} if (dtl != NULL) { /* selector link of rule appears in this domain */ count=0; for (dtl = pp->pp_data.domain_array[d].child; dtl != NULL; dtl = dtl->next) if (string_in_list(sublinkage->link[dtl->link]->name, rule->link_array)) { count=1; break; } if (count == 0) return FALSE; } } return TRUE; } static int apply_contains_none(Postprocessor *pp,Sublinkage *sublinkage,pp_rule *rule) { /* returns TRUE if and only if: all groups containing the selector link do not contain anything from the link_array contained in the rule. Uses exact string matching. */ DTreeLeaf * dtl; int d; for (d=0; dpp_data.N_domains; d++) { for (dtl = pp->pp_data.domain_array[d].child; dtl != NULL && !post_process_match(rule->selector, sublinkage->link[dtl->link]->name); dtl = dtl->next) {} if (dtl != NULL) { /* selector link of rule appears in this domain */ for (dtl = pp->pp_data.domain_array[d].child; dtl != NULL; dtl = dtl->next) if (string_in_list(sublinkage->link[dtl->link]->name, rule->link_array)) return FALSE; } } return TRUE; } static int apply_contains_one_globally(Postprocessor *pp,Sublinkage *sublinkage,pp_rule *rule) { /* returns TRUE if and only if (1) the sentence doesn't contain the selector link for the rule, or (2) it does, and it also contains one or more from the rule's link set */ int i,j,count; for (i=0; inum_links; i++) { if (sublinkage->link[i]->l == -1) continue; if (post_process_match(rule->selector,sublinkage->link[i]->name)) break; } if (i==sublinkage->num_links) return TRUE; /* selector link of rule appears in sentence */ count=0; for (j=0; jnum_links && count==0; j++) { if (sublinkage->link[j]->l == -1) continue; if (string_in_list(sublinkage->link[j]->name, rule->link_array)) { count=1; break; } } if (count==0) return FALSE; else return TRUE; } static int apply_connected(Postprocessor *pp, Sublinkage *sublinkage, pp_rule *rule) { /* There is actually just one (or none, if user didn't specify it) rule asserting that linkage is connected. */ if (!is_connected(pp)) return 0; return 1; } #if 0 /* replaced in 3/98 with a slightly different algorithm shown below ---DS*/ static int apply_connected_without(Postprocessor *pp,Sublinkage *sublinkage,pp_rule *rule) { /* Returns true if the linkage is connected when ignoring the links whose names are in the given list of link names. Actually, what it does is this: it returns FALSE if the connectivity of the subgraph reachable from word 0 changes as a result of deleting these links. */ int i; memset(pp->visited, 0, pp->pp_data.length*(sizeof pp->visited[0])); mark_reachable_words(pp, 0); for (i=0; ipp_data.length; i++) pp->visited[i] = !pp->visited[i]; connectivity_dfs(pp, sublinkage, 0, rule->link_set); for (i=0; ipp_data.length; i++) if (pp->visited[i] == FALSE) return FALSE; return TRUE; } #else /* Here's the new algorithm: For each link in the linkage that is in the must_form_a_cycle list, we want to make sure that that link is in a cycle. We do this simply by deleting the link, then seeing if the end points of that link are still connected. */ static void reachable_without_dfs(Postprocessor *pp, Sublinkage *sublinkage, int a, int b, int w) { /* This is a depth first search of words reachable from w, excluding any direct edge between word a and word b. */ List_o_links *lol; pp->visited[w] = TRUE; for (lol = pp->pp_data.word_links[w]; lol != NULL; lol = lol->next) { if (!pp->visited[lol->word] && !(w == a && lol->word == b) && ! (w == b && lol->word == a)) { reachable_without_dfs(pp, sublinkage, a, b, lol->word); } } } /** * Returns TRUE if the linkage is connected when ignoring the links * whose names are in the given list of link names. * Actually, what it does is this: it returns FALSE if the connectivity * of the subgraph reachable from word 0 changes as a result of deleting * these links. */ static int apply_must_form_a_cycle(Postprocessor *pp,Sublinkage *sublinkage,pp_rule *rule) { List_o_links *lol; int w; for (w=0; wpp_data.length; w++) { for (lol = pp->pp_data.word_links[w]; lol != NULL; lol = lol->next) { if (w > lol->word) continue; /* only consider each edge once */ if (!pp_linkset_match(rule->link_set, sublinkage->link[lol->link]->name)) continue; memset(pp->visited, 0, pp->pp_data.length*(sizeof pp->visited[0])); reachable_without_dfs(pp, sublinkage, w, lol->word, w); if (!pp->visited[lol->word]) return FALSE; } } for (lol = pp->pp_data.links_to_ignore; lol != NULL; lol = lol->next) { w = sublinkage->link[lol->link]->l; /* (w, lol->word) are the left and right ends of the edge we're considering */ if (!pp_linkset_match(rule->link_set, sublinkage->link[lol->link]->name)) continue; memset(pp->visited, 0, pp->pp_data.length*(sizeof pp->visited[0])); reachable_without_dfs(pp, sublinkage, w, lol->word, w); if (!pp->visited[lol->word]) return FALSE; } return TRUE; } #endif static int apply_bounded(Postprocessor *pp,Sublinkage *sublinkage,pp_rule *rule) { /* Checks to see that all domains with this name have the property that all of the words that touch a link in the domain are not to the left of the root word of the domain. */ int d, lw, d_type; List_o_links * lol; d_type = rule->domain; for (d=0; dpp_data.N_domains; d++) { if (pp->pp_data.domain_array[d].type != d_type) continue; lw = sublinkage->link[pp->pp_data.domain_array[d].start_link]->l; for (lol = pp->pp_data.domain_array[d].lol; lol != NULL; lol = lol->next) { if (sublinkage->link[lol->link]->l < lw) return FALSE; } } return TRUE; } /********************* various non-exported functions ***********************/ static void build_graph(Postprocessor *pp, Sublinkage *sublinkage) { /* fill in the pp->pp_data.word_links array with a list of words neighboring each word (actually a list of links). The dir fields are not set, since this (after fat-link-extraction) is an undirected graph. */ int i, link; List_o_links * lol; for (i=0; ipp_data.length; i++) pp->pp_data.word_links[i] = NULL; for (link=0; linknum_links; link++) { if (sublinkage->link[link]->l == -1) continue; if (pp_linkset_match(pp->knowledge->ignore_these_links, sublinkage->link[link]->name)) { lol = (List_o_links *) xalloc(sizeof(List_o_links)); lol->next = pp->pp_data.links_to_ignore; pp->pp_data.links_to_ignore = lol; lol->link = link; lol->word = sublinkage->link[link]->r; continue; } lol = (List_o_links *) xalloc(sizeof(List_o_links)); lol->next = pp->pp_data.word_links[sublinkage->link[link]->l]; pp->pp_data.word_links[sublinkage->link[link]->l] = lol; lol->link = link; lol->word = sublinkage->link[link]->r; lol = (List_o_links *) xalloc(sizeof(List_o_links)); lol->next = pp->pp_data.word_links[sublinkage->link[link]->r]; pp->pp_data.word_links[sublinkage->link[link]->r] = lol; lol->link = link; lol->word = sublinkage->link[link]->l; } } static void setup_domain_array(Postprocessor *pp, int n, const char *string, int start_link) { /* set pp->visited[i] to FALSE */ memset(pp->visited, 0, pp->pp_data.length*(sizeof pp->visited[0])); pp->pp_data.domain_array[n].string = string; pp->pp_data.domain_array[n].lol = NULL; pp->pp_data.domain_array[n].size = 0; pp->pp_data.domain_array[n].start_link = start_link; } static void add_link_to_domain(Postprocessor *pp, int link) { List_o_links *lol; lol = (List_o_links *) xalloc(sizeof(List_o_links)); lol->next = pp->pp_data.domain_array[pp->pp_data.N_domains].lol; pp->pp_data.domain_array[pp->pp_data.N_domains].lol = lol; pp->pp_data.domain_array[pp->pp_data.N_domains].size++; lol->link = link; } static void depth_first_search(Postprocessor *pp, Sublinkage *sublinkage, int w, int root,int start_link) { List_o_links *lol; pp->visited[w] = TRUE; for (lol = pp->pp_data.word_links[w]; lol != NULL; lol = lol->next) { if (lol->word < w && lol->link != start_link) { add_link_to_domain(pp, lol->link); } } for (lol = pp->pp_data.word_links[w]; lol != NULL; lol = lol->next) { if (!pp->visited[lol->word] && (lol->word != root) && !(lol->word < root && lol->word < w && pp_linkset_match(pp->knowledge->restricted_links, sublinkage->link[lol->link]->name))) depth_first_search(pp, sublinkage, lol->word, root, start_link); } } static void bad_depth_first_search(Postprocessor *pp, Sublinkage *sublinkage, int w, int root, int start_link) { List_o_links * lol; pp->visited[w] = TRUE; for (lol = pp->pp_data.word_links[w]; lol != NULL; lol = lol->next) { if ((lol->word < w) && (lol->link != start_link) && (w != root)) { add_link_to_domain(pp, lol->link); } } for (lol = pp->pp_data.word_links[w]; lol != NULL; lol = lol->next) { if ((!pp->visited[lol->word]) && !(w == root && lol->word < w) && !(lol->word < root && lol->word < w && pp_linkset_match(pp->knowledge->restricted_links, sublinkage->link[lol->link]->name))) bad_depth_first_search(pp, sublinkage, lol->word, root, start_link); } } static void d_depth_first_search(Postprocessor *pp, Sublinkage *sublinkage, int w, int root, int right, int start_link) { List_o_links * lol; pp->visited[w] = TRUE; for (lol = pp->pp_data.word_links[w]; lol != NULL; lol = lol->next) { if ((lol->word < w) && (lol->link != start_link) && (w != root)) { add_link_to_domain(pp, lol->link); } } for (lol = pp->pp_data.word_links[w]; lol != NULL; lol = lol->next) { if (!pp->visited[lol->word] && !(w == root && lol->word >= right) && !(w == root && lol->word < root) && !(lol->word < root && lol->word < w && pp_linkset_match(pp->knowledge->restricted_links, sublinkage->link[lol->link]->name))) d_depth_first_search(pp,sublinkage,lol->word,root,right,start_link); } } static void left_depth_first_search(Postprocessor *pp, Sublinkage *sublinkage, int w, int right,int start_link) { List_o_links *lol; pp->visited[w] = TRUE; for (lol = pp->pp_data.word_links[w]; lol != NULL; lol = lol->next) { if (lol->word < w && lol->link != start_link) { add_link_to_domain(pp, lol->link); } } for (lol = pp->pp_data.word_links[w]; lol != NULL; lol = lol->next) { if (!pp->visited[lol->word] && (lol->word != right)) depth_first_search(pp, sublinkage, lol->word, right, start_link); } } static int domain_compare(const Domain * d1, const Domain * d2) { return (d1->size-d2->size); /* for sorting the domains by size */ } static void build_domains(Postprocessor *pp, Sublinkage *sublinkage) { int link, i, d; const char *s; pp->pp_data.N_domains = 0; for (link = 0; linknum_links; link++) { if (sublinkage->link[link]->l == -1) continue; s = sublinkage->link[link]->name; if (pp_linkset_match(pp->knowledge->ignore_these_links, s)) continue; if (pp_linkset_match(pp->knowledge->domain_starter_links, s)) { setup_domain_array(pp, pp->pp_data.N_domains, s, link); if (pp_linkset_match(pp->knowledge->domain_contains_links, s)) add_link_to_domain(pp, link); depth_first_search(pp,sublinkage,sublinkage->link[link]->r, sublinkage->link[link]->l, link); pp->pp_data.N_domains++; assert(pp->pp_data.N_domainsknowledge->urfl_domain_starter_links,s)) { setup_domain_array(pp, pp->pp_data.N_domains, s, link); /* always add the starter link to its urfl domain */ add_link_to_domain(pp, link); bad_depth_first_search(pp,sublinkage,sublinkage->link[link]->r, sublinkage->link[link]->l,link); pp->pp_data.N_domains++; assert(pp->pp_data.N_domainsknowledge->urfl_only_domain_starter_links,s)) { setup_domain_array(pp, pp->pp_data.N_domains, s, link); /* do not add the starter link to its urfl_only domain */ d_depth_first_search(pp,sublinkage, sublinkage->link[link]->l, sublinkage->link[link]->l, sublinkage->link[link]->r,link); pp->pp_data.N_domains++; assert(pp->pp_data.N_domainsknowledge->left_domain_starter_links,s)) { setup_domain_array(pp, pp->pp_data.N_domains, s, link); /* do not add the starter link to a left domain */ left_depth_first_search(pp,sublinkage, sublinkage->link[link]->l, sublinkage->link[link]->r,link); pp->pp_data.N_domains++; assert(pp->pp_data.N_domainspp_data.domain_array, pp->pp_data.N_domains, sizeof(Domain), (int (*)(const void *, const void *)) domain_compare); /* sanity check: all links in all domains have a legal domain name */ for (d=0; dpp_data.N_domains; d++) { i = find_domain_name(pp, pp->pp_data.domain_array[d].string); if (i == -1) prt_error("Error: post_process(): Need an entry for %s in LINK_TYPE_TABLE", pp->pp_data.domain_array[d].string); pp->pp_data.domain_array[d].type = i; } } static void build_domain_forest(Postprocessor *pp, Sublinkage *sublinkage) { int d, d1, link; DTreeLeaf * dtl; if (pp->pp_data.N_domains > 0) pp->pp_data.domain_array[pp->pp_data.N_domains-1].parent = NULL; for (d=0; d < pp->pp_data.N_domains-1; d++) { for (d1 = d+1; d1 < pp->pp_data.N_domains; d1++) { if (contained_in(&pp->pp_data.domain_array[d],&pp->pp_data.domain_array[d1],sublinkage)) { pp->pp_data.domain_array[d].parent = &pp->pp_data.domain_array[d1]; break; } } if (d1 == pp->pp_data.N_domains) { /* we know this domain is a root of a new tree */ pp->pp_data.domain_array[d].parent = NULL; /* It's now ok for this to happen. It used to do: printf("I can't find a parent domain for this domain\n"); print_domain(d); exit(1); */ } } /* the parent links of domain nodes have been established. now do the leaves */ for (d=0; d < pp->pp_data.N_domains; d++) { pp->pp_data.domain_array[d].child = NULL; } for (link=0; link < sublinkage->num_links; link++) { if (sublinkage->link[link]->l == -1) continue; /* probably not necessary */ for (d=0; dpp_data.N_domains; d++) { if (link_in_domain(link, &pp->pp_data.domain_array[d])) { dtl = (DTreeLeaf *) xalloc(sizeof(DTreeLeaf)); dtl->link = link; dtl->parent = &pp->pp_data.domain_array[d]; dtl->next = pp->pp_data.domain_array[d].child; pp->pp_data.domain_array[d].child = dtl; break; } } } } static int internal_process(Postprocessor *pp, Sublinkage *sublinkage, const char **msg) { int i; /* quick test: try applying just the relevant global rules */ if (!apply_relevant_rules(pp,apply_contains_one_globally, sublinkage, pp->knowledge->contains_one_rules, pp->relevant_contains_one_rules, msg)) { for (i=0; ipp_data.length; i++) pp->pp_data.word_links[i] = NULL; pp->pp_data.N_domains = 0; return -1; } /* build graph; confirm that it's legally connected */ build_graph(pp, sublinkage); build_domains(pp, sublinkage); build_domain_forest(pp, sublinkage); #if defined(CHECK_DOMAIN_NESTING) /* These messages were deemed to not be useful, so this code is commented out. See comment above. */ if(!check_domain_nesting(pp, sublinkage->num_links)) printf("WARNING: The domains are not nested.\n"); #endif /* The order below should be optimal for most cases */ if (!apply_relevant_rules(pp,apply_contains_one, sublinkage, pp->knowledge->contains_one_rules, pp->relevant_contains_one_rules, msg)) return 1; if (!apply_relevant_rules(pp,apply_contains_none, sublinkage, pp->knowledge->contains_none_rules, pp->relevant_contains_none_rules, msg)) return 1; if (!apply_rules(pp,apply_must_form_a_cycle, sublinkage, pp->knowledge->form_a_cycle_rules,msg)) return 1; if (!apply_rules(pp,apply_connected, sublinkage, pp->knowledge->connected_rules, msg)) return 1; if (!apply_rules(pp,apply_bounded, sublinkage, pp->knowledge->bounded_rules, msg)) return 1; return 0; /* This linkage satisfied all the rules */ } /** * Call this (a) after having called post_process_scan_linkage() on all * generated linkages, but (b) before calling post_process() on any * particular linkage. Here we mark all rules which we know (from having * accumulated a set of link names appearing in *any* linkage) won't * ever be needed. */ static void prune_irrelevant_rules(Postprocessor *pp) { pp_rule *rule; int coIDX, cnIDX, rcoIDX=0, rcnIDX=0; /* If we didn't scan any linkages, there's no pruning to be done. */ if (pp_linkset_population(pp->set_of_links_of_sentence)==0) return; for (coIDX=0;;coIDX++) { rule = &(pp->knowledge->contains_one_rules[coIDX]); if (rule->msg==NULL) break; if (pp_linkset_match_bw(pp->set_of_links_of_sentence, rule->selector)) { /* mark rule as being relevant to this sentence */ pp->relevant_contains_one_rules[rcoIDX++] = coIDX; pp_linkset_add(pp->set_of_links_in_an_active_rule, rule->selector); } } pp->relevant_contains_one_rules[rcoIDX] = -1; /* end sentinel */ for (cnIDX=0;;cnIDX++) { rule = &(pp->knowledge->contains_none_rules[cnIDX]); if (rule->msg==NULL) break; if (pp_linkset_match_bw(pp->set_of_links_of_sentence, rule->selector)) { pp->relevant_contains_none_rules[rcnIDX++] = cnIDX; pp_linkset_add(pp->set_of_links_in_an_active_rule, rule->selector); } } pp->relevant_contains_none_rules[rcnIDX] = -1; if (verbosity > 1) { printf("Saw %i unique link names in all linkages.\n", pp_linkset_population(pp->set_of_links_of_sentence)); printf("Using %i 'contains one' rules and %i 'contains none' rules\n", rcoIDX, rcnIDX); } } /***************** definitions of exported functions ***********************/ /** * read rules from path and initialize the appropriate fields in * a postprocessor structure, a pointer to which is returned. */ Postprocessor * post_process_open(const char *path) { Postprocessor *pp; if (path==NULL) return NULL; pp = (Postprocessor *) xalloc (sizeof(Postprocessor)); pp->knowledge = pp_knowledge_open(path); pp->sentence_link_name_set = string_set_create(); pp->set_of_links_of_sentence = pp_linkset_open(1024); pp->set_of_links_in_an_active_rule=pp_linkset_open(1024); pp->relevant_contains_one_rules = (int *) xalloc ((pp->knowledge->n_contains_one_rules+1) *(sizeof pp->relevant_contains_one_rules[0])); pp->relevant_contains_none_rules = (int *) xalloc ((pp->knowledge->n_contains_none_rules+1) *(sizeof pp->relevant_contains_none_rules[0])); pp->relevant_contains_one_rules[0] = -1; pp->relevant_contains_none_rules[0] = -1; pp->pp_node = NULL; pp->pp_data.links_to_ignore = NULL; pp->n_local_rules_firing = 0; pp->n_global_rules_firing = 0; return pp; } void post_process_close(Postprocessor *pp) { /* frees up memory associated with pp, previously allocated by open */ if (pp==NULL) return; string_set_delete(pp->sentence_link_name_set); pp_linkset_close(pp->set_of_links_of_sentence); pp_linkset_close(pp->set_of_links_in_an_active_rule); xfree(pp->relevant_contains_one_rules, (1+pp->knowledge->n_contains_one_rules) *(sizeof pp->relevant_contains_one_rules[0])); xfree(pp->relevant_contains_none_rules, (1+pp->knowledge->n_contains_none_rules) *(sizeof pp->relevant_contains_none_rules[0])); pp_knowledge_close(pp->knowledge); free_pp_node(pp); xfree(pp, sizeof(Postprocessor)); } void post_process_close_sentence(Postprocessor *pp) { if (pp==NULL) return; pp_linkset_clear(pp->set_of_links_of_sentence); pp_linkset_clear(pp->set_of_links_in_an_active_rule); string_set_delete(pp->sentence_link_name_set); pp->sentence_link_name_set = string_set_create(); pp->n_local_rules_firing = 0; pp->n_global_rules_firing = 0; pp->relevant_contains_one_rules[0] = -1; pp->relevant_contains_none_rules[0] = -1; free_pp_node(pp); } /** * During a first pass (prior to actual post-processing of the linkages * of a sentence), call this once for every generated linkage. Here we * simply maintain a set of "seen" link names for rule pruning later on */ void post_process_scan_linkage(Postprocessor *pp, Parse_Options opts, Sentence sent, Sublinkage *sublinkage) { const char *p; int i; if (pp == NULL) return; if (sent->length < opts->twopass_length) return; for (i=0; inum_links; i++) { if (sublinkage->link[i]->l == -1) continue; p = string_set_add(sublinkage->link[i]->name, pp->sentence_link_name_set); pp_linkset_add(pp->set_of_links_of_sentence, p); } } /** * Takes a sublinkage and returns: * . for each link, the domain structure of that link * . a list of the violation strings * NB: sublinkage->link[i]->l=-1 means that this connector * is to be ignored */ PP_node *post_process(Postprocessor *pp, Parse_Options opts, Sentence sent, Sublinkage *sublinkage, int cleanup) { const char *msg; if (pp==NULL) return NULL; pp->pp_data.links_to_ignore = NULL; pp->pp_data.length = sent->length; /* In the name of responsible memory management, we retain a copy of the * returned data structure pp_node as a field in pp, so that we can clear * it out after every call, without relying on the user to do so. */ reset_pp_node(pp); /* The first time we see a sentence, prune the rules which we won't be * needing during postprocessing the linkages of this sentence */ if (sent->q_pruned_rules==FALSE && sent->length >= opts->twopass_length) prune_irrelevant_rules(pp); sent->q_pruned_rules=TRUE; switch(internal_process(pp, sublinkage, &msg)) { case -1: /* some global test failed even before we had to build the domains */ pp->n_global_rules_firing++; pp->pp_node->violation = msg; return pp->pp_node; break; case 1: /* one of the "normal" post processing tests failed */ pp->n_local_rules_firing++; pp->pp_node->violation = msg; break; case 0: /* This linkage is legal according to the post processing rules */ pp->pp_node->violation = NULL; break; } build_type_array(pp); if (cleanup) { post_process_free_data(&pp->pp_data); } return pp->pp_node; } /* string comparison in postprocessing. The first parameter is a post-processing symbol. The second one is a connector name from a link. The upper case parts must match. We imagine that the first arg is padded with an infinite sequence of "#" and that the 2nd one is padded with "*". "#" matches anything, but "*" is just like an ordinary char for matching purposes. For efficiency sake there are several different versions of these functions */ int post_process_match(const char *s, const char *t) { char c; while(isupper((int)*s) || isupper((int)*t)) { if (*s != *t) return FALSE; s++; t++; } while (*s != '\0') { if (*s != '#') { if (*t == '\0') c = '*'; else c = *t; if (*s != c) return FALSE; } s++; if (*t != '\0') t++; } return TRUE; } /* OLD COMMENTS (OUT OF DATE): This file does the post-processing. The main routine is "post_process()". It uses the link names only, and not the connectors. A domain is a set of links. Each domain has a defining link. Only certain types of links serve to define a domain. These parameters are set by the lists of link names in a separate, human-readable file referred to herein as the 'knowledge file.' The domains are nested: given two domains, either they're disjoint, or one contains the other, i.e. they're tree structured. The set of links in a domain (but in no smaller domain) are called the "group" of the domain. Data structures are built to store all this stuff. The tree structured property is not mathematically guaranteed by the domain construction algorithm. Davy simply claims that because of how he built the dictionary, the domains will always be so structured. The program checks this and gives an error message if it's violated. Define the "root word" of a link (or domain) to be the word at the left end of the link. The other end of the defining link is called the "right word". The domain corresponding to a link is defined to be the set of links reachable by starting from the right word, following links and never using the root word or any word to its left. There are some minor exceptions to this. The "restricted_link" lists those connectors that, even if they point back before the root word, are included in the domain. Some of the starting links are included in their domain, these are listed in the "domain_contains_links" list. Such was the way it was. Now Davy tells me there should be another type of domain that's quite different. Let's call these "urfl" domains. Certain type of connectors start urfl domains. They're listed below. In a urfl domain, the search includes the root word. It does a separate search to find urfl domains. Restricted links should work just as they do with ordinary domains. If they come out of the right word, or anything to the right of it (that's in the domain), they should be included but should not be traced further. If they come out of the root word, they should not be included. */ /* I also, unfortunately, want to propose a new type of domain. These would include everything that can be reached from the root word of the link, to the right, that is closer than the right word of the link. (They would not include the link itself.) In the following sentence, then, the "Urfl_Only Domain" of the G link would include only the "O" link: +-----G----+ +---O--+ +-AI+ | | | | hitting dogs is fun.a In the following sentence it would include the "O", the "TT", the "I", the second "O", and the "A". +----------------G---------------+ +-----TT-----+ +-----O-----+ | +---O---+ +-I+ +---A--+ +-AI+ | | | | | | | | telling people to do stupid things is fun.a This would allow us to judge the following: kicking dogs bores me *kicking dogs kicks dogs explaining the program is easy *explaining the program is running (These are distinctions that I thought we would never be able to make, so I told myself they were semantic rather than syntactic. But with domains, they should be easy.) */ /* Modifications, 6/96 ALB: 1) Rules and link sets are relegated to a separate, user-written file(s), herein referred to as the 'knowledge file' 2) This information is read by a lexer, in pp_lexer.l (lex code) whose exported routines are all prefixed by 'pp_lexer' 3) when postprocessing a sentence, the links of each domain are placed in a set for quick lookup, ('contains one' and 'contains none') 4) Functions which were never called have been eliminated: link_inhabits(), match_in_list(), group_type_contains(), group_type_contains_one(), group_type_contains_all() 5) Some 'one-by-one' initializations have been replaced by faster block memory operations (memset etc.) 6) The above comments are correct but incomplete! (1/97) 7) observation: the 'contains one' is, empirically, by far the most violated rule, so it should come first in applying the rules. Modifications, 9/97 ALB: Deglobalization. Made code constistent with api. */ link-grammar-4.7.4/link-grammar/extract-links.c0000644000175000017500000004313611526022265020436 0ustar bloombloom/*************************************************************************/ /* Copyright (c) 2004 */ /* Daniel Sleator, David Temperley, and John Lafferty */ /* Copyright (c) 2010 Linas Vepstas */ /* All rights reserved */ /* */ /* Use of the link grammar parsing system is subject to the terms of the */ /* license set forth in the LICENSE file included with this software, */ /* and also available at http://www.link.cs.cmu.edu/link/license.html */ /* This license allows free redistribution and use in source and binary */ /* forms, with or without modification, subject to certain conditions. */ /* */ /*************************************************************************/ #include /** * The first thing we do is we build a data structure to represent the * result of the entire parse search. There will be a set of nodes * built for each call to the count() function that returned a non-zero * value, AND which is part of a valid linkage. Each of these nodes * represents a valid continuation, and contains pointers to two other * sets (one for the left continuation and one for the right * continuation). */ static Parse_set * dummy_set(void) { static Parse_set ds; ds.first = ds.current = NULL; ds.count = 1; return &ds; } /** Returns an empty set of parses */ static Parse_set * empty_set(void) { Parse_set *s; s = (Parse_set *) xalloc(sizeof(Parse_set)); s->first = s->current = NULL; s->count = 0; return s; } static void free_set(Parse_set *s) { Parse_choice *p, *xp; if (s == NULL) return; for (p=s->first; p != NULL; p = xp) { xp = p->next; xfree((void *)p, sizeof(*p)); } xfree((void *)s, sizeof(*s)); } static Parse_choice * make_choice(Parse_set *lset, int llw, int lrw, Connector * llc, Connector * lrc, Parse_set *rset, int rlw, int rrw, Connector * rlc, Connector * rrc, Disjunct *ld, Disjunct *md, Disjunct *rd) { Parse_choice *pc; pc = (Parse_choice *) xalloc(sizeof(*pc)); pc->next = NULL; pc->set[0] = lset; pc->link[0].l = llw; pc->link[0].r = lrw; pc->link[0].lc = llc; pc->link[0].rc = lrc; pc->set[1] = rset; pc->link[1].l = rlw; pc->link[1].r = rrw; pc->link[1].lc = rlc; pc->link[1].rc = rrc; pc->ld = ld; pc->md = md; pc->rd = rd; return pc; } /** * Put this parse_choice into a given set. The current pointer is always * left pointing to the end of the list. */ static void put_choice_in_set(Parse_set *s, Parse_choice *pc) { if (s->first == NULL) { s->first = pc; } else { s->current->next = pc; } s->current = pc; pc->next = NULL; } /** * Allocate the parse info struct * * A piecewise exponential function determines the size of the hash * table. Probably should make use of the actual number of disjuncts, * rather than just the number of words. */ Parse_info parse_info_new(int nwords) { int log2_table_size; Parse_info pi; pi = (Parse_info) xalloc(sizeof(struct Parse_info_struct)); memset(pi, 0, sizeof(struct Parse_info_struct)); pi->N_words = nwords; pi->parse_set = NULL; pi->chosen_disjuncts = (Disjunct **) xalloc(nwords * sizeof(Disjunct *)); memset(pi->chosen_disjuncts, 0, nwords * sizeof(Disjunct *)); pi->image_array = (Image_node **) xalloc(nwords * sizeof(Image_node *)); memset(pi->image_array, 0, nwords * sizeof(Image_node *)); pi->has_fat_down = (char *) xalloc(nwords * sizeof(Boolean)); memset(pi->has_fat_down, 0, nwords * sizeof(Boolean)); /* Alloc the x_table */ if (nwords >= 10) { log2_table_size = 14; } else if (nwords >= 4) { log2_table_size = nwords; } else { log2_table_size = 4; } pi->log2_x_table_size = log2_table_size; pi->x_table_size = (1 << log2_table_size); /*printf("Allocating x_table of size %d\n", x_table_size);*/ pi->x_table = (X_table_connector**) xalloc(pi->x_table_size * sizeof(X_table_connector*)); memset(pi->x_table, 0, pi->x_table_size * sizeof(X_table_connector*)); return pi; } /** * This is the function that should be used to free the set structure. Since * it's a dag, a recursive free function won't work. Every time we create * a set element, we put it in the hash table, so this is OK. */ void free_parse_info(Parse_info pi) { int i, len; X_table_connector *t, *x; len = pi->N_words; xfree(pi->chosen_disjuncts, len * sizeof(Disjunct *)); xfree(pi->image_array, len * sizeof(Image_node*)); xfree(pi->has_fat_down, len * sizeof(Boolean)); for (i=0; ix_table_size; i++) { for(t = pi->x_table[i]; t!= NULL; t=x) { x = t->next; free_set(t->set); xfree((void *) t, sizeof(X_table_connector)); } } pi->parse_set = NULL; /*printf("Freeing x_table of size %d\n", x_table_size);*/ xfree((void *) pi->x_table, pi->x_table_size * sizeof(X_table_connector*)); pi->x_table_size = 0; pi->x_table = NULL; xfree((void *) pi, sizeof(struct Parse_info_struct)); } /** * Returns the pointer to this info, NULL if not there. */ static X_table_connector * x_table_pointer(int lw, int rw, Connector *le, Connector *re, int cost, Parse_info pi) { X_table_connector *t; t = pi->x_table[pair_hash(pi->log2_x_table_size, lw, rw, le, re, cost)]; for (; t != NULL; t = t->next) { if ((t->lw == lw) && (t->rw == rw) && (t->le == le) && (t->re == re) && (t->cost == cost)) return t; } return NULL; } #if DEAD_CODE Parse_set * x_table_lookup(int lw, int rw, Connector *le, Connector *re, int cost, Parse_info pi) { /* returns the count for this quintuple if there, -1 otherwise */ X_table_connector *t = x_table_pointer(lw, rw, le, re, cost, pi); if (t == NULL) return -1; else return t->set; } #endif /** * Stores the value in the x_table. Assumes it's not already there. */ static X_table_connector * x_table_store(int lw, int rw, Connector *le, Connector *re, int cost, Parse_set * set, Parse_info pi) { X_table_connector *t, *n; int h; n = (X_table_connector *) xalloc(sizeof(X_table_connector)); n->set = set; n->lw = lw; n->rw = rw; n->le = le; n->re = re; n->cost = cost; h = pair_hash(pi->log2_x_table_size, lw, rw, le, re, cost); t = pi->x_table[h]; n->next = t; pi->x_table[h] = n; return n; } #ifdef UNUSED_FUNCTION static void x_table_update(int lw, int rw, Connector *le, Connector *re, int cost, Parse_set * set, Parse_info pi) { /* Stores the value in the x_table. Unlike x_table_store, it assumes it's already there */ X_table_connector *t = x_table_pointer(lw, rw, le, re, cost, pi); assert(t != NULL, "This entry is supposed to be in the x_table."); t->set = set; } #endif /** * returns NULL if there are no ways to parse, or returns a pointer * to a set structure representing all the ways to parse. * * This code is similar to code in count.c * (grep for end_word in these files). */ static Parse_set * parse_set(Sentence sent, Disjunct *ld, Disjunct *rd, int lw, int rw, Connector *le, Connector *re, int cost, int islands_ok, Parse_info pi) { Disjunct * d, * dis; int start_word, end_word, w; int lcost, rcost, Lmatch, Rmatch; int i, j; Parse_set *ls[4], *rs[4], *lset, *rset; Parse_choice * a_choice; Match_node * m, *m1; X_table_connector *xt; s64 count; assert(cost >= 0, "parse_set() called with cost < 0."); count = table_lookup(sent, lw, rw, le, re, cost); /* assert(count >= 0, "parse_set() called on params that were not in the table."); Actually, we can't assert this, because of the pseudocount technique that's used in count(). It's not the case that every call to parse_set() has already been put into the table. */ if ((count == 0) || (count == -1)) return NULL; xt = x_table_pointer(lw, rw, le, re, cost, pi); if (xt != NULL) return xt->set; /* we've already computed it */ /* Start it out with the empty set of options. */ /* This entry must be updated before we return. */ xt = x_table_store(lw, rw, le, re, cost, empty_set(), pi); xt->set->count = count; /* the count we already computed */ /* this count is non-zero */ if (rw == 1 + lw) return xt->set; if ((le == NULL) && (re == NULL)) { if (!islands_ok && (lw != -1)) return xt->set; if (cost == 0) return xt->set; w = lw + 1; for (dis = sent->word[w].d; dis != NULL; dis = dis->next) { if (dis->left == NULL) { rs[0] = parse_set(sent, dis, NULL, w, rw, dis->right, NULL, cost-1, islands_ok, pi); if (rs[0] == NULL) continue; a_choice = make_choice(dummy_set(), lw, w, NULL, NULL, rs[0], w, rw, NULL, NULL, NULL, NULL, NULL); put_choice_in_set(xt->set, a_choice); } } rs[0] = parse_set(sent, NULL, NULL, w, rw, NULL, NULL, cost-1, islands_ok, pi); if (rs[0] != NULL) { a_choice = make_choice(dummy_set(), lw, w, NULL, NULL, rs[0], w, rw, NULL, NULL, NULL, NULL, NULL); put_choice_in_set(xt->set, a_choice); } return xt->set; } if (le == NULL) { start_word = lw + 1; } else { start_word = le->word; } if (re == NULL) { end_word = rw; } else { end_word = re->word + 1; } for (w = start_word; w < end_word; w++) { m1 = m = form_match_list(sent, w, le, lw, re, rw); for (; m!=NULL; m=m->next) { d = m->d; for (lcost = 0; lcost <= cost; lcost++) { rcost = cost-lcost; /* now lcost and rcost are the costs we're assigning to * those parts respectively */ /* Now, we determine if (based on table only) we can see that the current range is not parsable. */ Lmatch = (le != NULL) && (d->left != NULL) && do_match(sent, le, d->left, lw, w); Rmatch = (d->right != NULL) && (re != NULL) && do_match(sent, d->right, re, w, rw); for (i=0; i<4; i++) {ls[i] = rs[i] = NULL;} if (Lmatch) { ls[0] = parse_set(sent, ld, d, lw, w, le->next, d->left->next, lcost, islands_ok, pi); if (le->multi) ls[1] = parse_set(sent, ld, d, lw, w, le, d->left->next, lcost, islands_ok, pi); if (d->left->multi) ls[2] = parse_set(sent, ld, d, lw, w, le->next, d->left, lcost, islands_ok, pi); if (le->multi && d->left->multi) ls[3] = parse_set(sent, ld, d, lw, w, le, d->left, lcost, islands_ok, pi); } if (Rmatch) { rs[0] = parse_set(sent, d, rd, w, rw, d->right->next, re->next, rcost, islands_ok, pi); if (d->right->multi) rs[1] = parse_set(sent, d, rd, w,rw,d->right,re->next, rcost, islands_ok, pi); if (re->multi) rs[2] = parse_set(sent, d, rd, w, rw, d->right->next, re, rcost, islands_ok, pi); if (d->right->multi && re->multi) rs[3] = parse_set(sent, d, rd, w, rw, d->right, re, rcost, islands_ok, pi); } for (i=0; i<4; i++) { /* this ordering is probably not consistent with that * needed to use list_links */ if (ls[i] == NULL) continue; for (j=0; j<4; j++) { if (rs[j] == NULL) continue; a_choice = make_choice(ls[i], lw, w, le, d->left, rs[j], w, rw, d->right, re, ld, d, rd); put_choice_in_set(xt->set, a_choice); } } if (ls[0] != NULL || ls[1] != NULL || ls[2] != NULL || ls[3] != NULL) { /* evaluate using the left match, but not the right */ rset = parse_set(sent, d, rd, w, rw, d->right, re, rcost, islands_ok, pi); if (rset != NULL) { for (i=0; i<4; i++) { if (ls[i] == NULL) continue; /* this ordering is probably not consistent with * that needed to use list_links */ a_choice = make_choice(ls[i], lw, w, le, d->left, rset, w, rw, NULL /* d->right */, re, /* the NULL indicates no link*/ ld, d, rd); put_choice_in_set(xt->set, a_choice); } } } if ((le == NULL) && (rs[0] != NULL || rs[1] != NULL || rs[2] != NULL || rs[3] != NULL)) { /* evaluate using the right match, but not the left */ lset = parse_set(sent, ld, d, lw, w, le, d->left, lcost, islands_ok, pi); if (lset != NULL) { for (i=0; i<4; i++) { if (rs[i] == NULL) continue; /* this ordering is probably not consistent with * that needed to use list_links */ a_choice = make_choice(lset, lw, w, NULL /* le */, d->left, /* NULL indicates no link */ rs[i], w, rw, d->right, re, ld, d, rd); put_choice_in_set(xt->set, a_choice); } } } } } put_match_list(sent, m1); } xt->set->current = xt->set->first; return xt->set; } /** * return TRUE if and only if overflow in the number of parses occured. * Use a 64-bit int for counting. */ static int verify_set_node(Parse_set *set) { Parse_choice *pc; s64 n; if (set == NULL || set->first == NULL) return FALSE; n = 0; for (pc = set->first; pc != NULL; pc = pc->next) { n += pc->set[0]->count * pc->set[1]->count; if (PARSE_NUM_OVERFLOW < n) return TRUE; } return FALSE; } static int verify_set(Parse_info pi) { int i; assert(pi->x_table != NULL, "called verify_set when x_table==NULL"); for (i=0; ix_table_size; i++) { X_table_connector *t; for(t = pi->x_table[i]; t != NULL; t = t->next) { if (verify_set_node(t->set)) return TRUE; } } return FALSE; } /** * This is the top level call that computes the whole parse_set. It * points whole_set at the result. It creates the necessary hash * table (x_table) which will be freed at the same time the * whole_set is freed. * * It also assumes that count() has been run, and that hash table is * filled with the values thus computed. Therefore this function * must be structured just like parse() (the main function for * count()). * * If the number of linkages gets huge, then the counts can overflow. * We check if this has happened when verifying the parse set. * This routine returns TRUE iff overflowed occurred. */ int build_parse_set(Sentence sent, int cost, Parse_Options opts) { Parse_set * whole_set; whole_set = parse_set(sent, NULL, NULL, -1, sent->length, NULL, NULL, cost+1, opts->islands_ok, sent->parse_info); if ((whole_set != NULL) && (whole_set->current != NULL)) { whole_set->current = whole_set->first; } sent->parse_info->parse_set = whole_set; return verify_set(sent->parse_info); } static void initialize_links(Parse_info pi) { pi->N_links = 0; memset(pi->chosen_disjuncts, 0, pi->N_words * sizeof(Disjunct *)); } static void issue_link(Parse_info pi, Disjunct * ld, Disjunct * rd, Link link) { assert(pi->N_links <= MAX_LINKS-1, "Too many links"); pi->link_array[pi->N_links] = link; pi->N_links++; pi->chosen_disjuncts[link.l] = ld; pi->chosen_disjuncts[link.r] = rd; } static void issue_links_for_choice(Parse_info pi, Parse_choice *pc) { if (pc->link[0].lc != NULL) { /* there is a link to generate */ issue_link(pi, pc->ld, pc->md, pc->link[0]); } if (pc->link[1].lc != NULL) { issue_link(pi, pc->md, pc->rd, pc->link[1]); } } #ifdef NOT_USED_ANYWHERE static void build_current_linkage_recursive(Parse_info pi, Parse_set *set) { if (set == NULL) return; if (set->current == NULL) return; issue_links_for_choice(pi, set->current); build_current_linkage_recursive(pi, set->current->set[0]); build_current_linkage_recursive(pi, set->current->set[1]); } /** * This function takes the "current" point in the given set and * generates the linkage that it represents. */ void build_current_linkage(Parse_info pi) { initialize_links(pi); build_current_linkage_recursive(pi, pi->parse_set); } /** * Advance the "current" linkage to the next one * return 1 if there's a "carry" from this node, * which indicates that the scan of this node has * just been completed, and it's now back to it's * starting state. */ static int advance_linkage(Parse_info pi, Parse_set * set) { if (set == NULL) return 1; /* probably can't happen */ if (set->first == NULL) return 1; /* the empty set */ if (advance_linkage(pi, set->current->set[0]) == 1) { if (advance_linkage(pi, set->current->set[1]) == 1) { if (set->current->next == NULL) { set->current = set->first; return 1; } set->current = set->current->next; } } return 0; } static void advance_parse_set(Parse_info pi) { advance_linkage(pi, pi->parse_set); } #endif static void list_links(Parse_info pi, Parse_set * set, int index) { Parse_choice *pc; s64 n; if (set == NULL || set->first == NULL) return; for (pc = set->first; pc != NULL; pc = pc->next) { n = pc->set[0]->count * pc->set[1]->count; if (index < n) break; index -= n; } assert(pc != NULL, "walked off the end in list_links"); issue_links_for_choice(pi, pc); list_links(pi, pc->set[0], index % pc->set[0]->count); list_links(pi, pc->set[1], index / pc->set[0]->count); } static void list_random_links(Parse_info pi, Parse_set * set) { Parse_choice *pc; int num_pc, new_index; if (set == NULL || set->first == NULL) return; num_pc = 0; for (pc = set->first; pc != NULL; pc = pc->next) { num_pc++; } new_index = rand_r(&pi->rand_state) % num_pc; num_pc = 0; for (pc = set->first; pc != NULL; pc = pc->next) { if (new_index == num_pc) break; num_pc++; } assert(pc != NULL, "Couldn't get a random parse choice"); issue_links_for_choice(pi, pc); list_random_links(pi, pc->set[0]); list_random_links(pi, pc->set[1]); } /** * Generate the list of all links of the index'th parsing of the * sentence. For this to work, you must have already called parse, and * already built the whole_set. */ void extract_links(int index, int cost, Parse_info pi) { initialize_links(pi); pi->rand_state = index; if (index < 0) { list_random_links(pi, pi->parse_set); } else { list_links(pi, pi->parse_set, index); } } link-grammar-4.7.4/link-grammar/constituents.h0000644000175000017500000000227110445317651020415 0ustar bloombloom/********************************************************************************/ /* Copyright (c) 2004 */ /* Daniel Sleator, David Temperley, and John Lafferty */ /* All rights reserved */ /* */ /* Use of the link grammar parsing system is subject to the terms of the */ /* license set forth in the LICENSE file included with this software, */ /* and also available at http://www.link.cs.cmu.edu/link/license.html */ /* This license allows free redistribution and use in source and binary */ /* forms, with or without modification, subject to certain conditions. */ /* */ /********************************************************************************/ #ifndef _CONSTITUENTSH_ #define _CONSTITUENTSH_ #include "link-includes.h" /* Invariant: Leaf if child==NULL */ struct CNode_s { char * label; CNode * child; CNode * next; int start, end; }; #endif link-grammar-4.7.4/link-grammar/Makefile.am0000644000175000017500000001464211350563112017532 0ustar bloombloom# # Automake file for building both liblink-grammar.so and # the command line application link-parser. # if WITH_SAT_SOLVER SUBDIRS=minisat sat-solver endif if WITH_CORPUS SUBDIRS=corpus endif if OS_WIN32 install-libtool-import-lib: $(INSTALL) .libs/liblink-grammar.dll.a $(DESTDIR)$(libdir) uninstall-libtool-import-lib: -rm $(DESTDIR)$(libdir)/liblink-grammar.dll.a else install-libtool-import-lib: uninstall-libtool-import-lib: endif DEFS = @DEFS@ -DVERSION=\"@VERSION@\" -DDICTIONARY_DIR=\"$(pkgdatadir)\" INCLUDES = -I$(top_srcdir) $(ANSI_CFLAGS) $(LINK_CFLAGS) $(HUNSPELL_CFLAGS) lib_LTLIBRARIES = liblink-grammar.la if HAVE_JAVA lib_LTLIBRARIES += liblink-grammar-java.la endif liblink_grammar_la_LDFLAGS = -version-info @VERSION_INFO@ -export-dynamic -no-undefined -export-symbols $(srcdir)/link-grammar.def liblink_grammar_java_la_LDFLAGS = -version-info @VERSION_INFO@ -export-dynamic -no-undefined -export-symbols $(srcdir)/link-grammar-java.def if OS_WIN32 liblink_grammar_la_LDFLAGS += -D_JNI_IMPLEMENTATION_ -Wl,--kill-at liblink_grammar_java_la_LDFLAGS += -D_JNI_IMPLEMENTATION_ -Wl,--kill-at endif liblink_grammar_la_LIBADD = ${REGEX_LIBS} liblink_grammar_java_la_LIBADD = liblink-grammar.la ${REGEX_LIBS} if HAVE_HUNSPELL liblink_grammar_la_LIBADD += ${HUNSPELL_LIBS} liblink_grammar_java_la_LIBADD += ${HUNSPELL_LIBS} endif if HAVE_ASPELL liblink_grammar_la_LIBADD += ${ASPELL_LIBS} liblink_grammar_java_la_LIBADD += ${ASPELL_LIBS} endif if WITH_SAT_SOLVER liblink_grammar_la_LIBADD += $(top_builddir)/link-grammar/sat-solver/libsat-solver.la liblink_grammar_la_LIBADD += $(top_builddir)/link-grammar/minisat/libminisat.la liblink_grammar_java_la_LIBADD += $(top_builddir)/link-grammar/sat-solver/libsat-solver.la liblink_grammar_java_la_LIBADD += $(top_builddir)/link-grammar/minisat/libminisat.la endif if WITH_CORPUS liblink_grammar_la_LIBADD += $(top_builddir)/link-grammar/corpus/liblink-corpus.la ${SQLITE3_LIBS} liblink_grammar_java_la_LIBADD += $(top_builddir)/link-grammar/corpus/liblink-corpus.la ${SQLITE3_LIBS} endif if WITH_BINRELOC liblink_grammar_la_LIBADD += -lpthread liblink_grammar_java_la_LIBADD += -lpthread endif if WITH_PTHREADS liblink_grammar_la_LIBADD += -lpthread liblink_grammar_java_la_LIBADD += -lpthread endif # Math libraries are needed for floorf, etc. liblink_grammar_la_LIBADD += -lm liblink_grammar_java_la_LIBADD += -lm liblink_grammar_la_SOURCES = \ analyze-linkage.c \ and.c \ api.c \ build-disjuncts.c \ command-line.c \ constituents.c \ count.c \ disjunct-utils.c \ disjuncts.c \ error.c \ expand.c \ extract-links.c \ fast-match.c \ idiom.c \ massage.c \ post-process.c \ pp_knowledge.c \ pp_lexer.c \ pp_linkset.c \ preparation.c \ print.c \ print-util.c \ prune.c \ read-dict.c \ read-regex.c \ regex-morph.c \ resources.c \ spellcheck-aspell.c \ spellcheck-hun.c \ string-set.c \ tokenize.c \ utilities.c \ word-file.c \ word-utils.c \ prefix.c \ api.h \ api-structures.h \ api-types.h \ analyze-linkage.h \ and.h \ build-disjuncts.h \ command-line.h \ constituents.h \ count.h \ disjunct-utils.h \ disjuncts.h \ error.h \ expand.h \ externs.h \ extract-links.h \ fast-match.h \ idiom.h \ link-includes.h \ massage.h \ post-process.h \ pp_knowledge.h \ pp_lexer.h \ pp_linkset.h \ preparation.h \ print.h \ print-util.h \ prune.h \ read-dict.h \ read-regex.h \ regex-morph.h \ resources.h \ spellcheck.h \ string-set.h \ structures.h \ tokenize.h \ utilities.h \ word-file.h \ word-utils.h liblink_grammar_includedir = $(includedir)/link-grammar liblink_grammar_include_HEADERS = \ link-includes.h \ link-features.h liblink_grammar_java_la_SOURCES = \ jni-client.h \ jni-client.c EXTRA_DIST= \ prefix.h \ autoit/_LGTest.au3 \ autoit/_LinkGrammar.au3 \ autoit/README \ java/README \ java/org/linkgrammar/JSONReader.java \ java/org/linkgrammar/LGConfig.java \ java/org/linkgrammar/LGRemoteClient.java \ java/org/linkgrammar/LGService.java \ java/org/linkgrammar/Linkage.java \ java/org/linkgrammar/LinkGrammar.java \ java/org/linkgrammar/Link.java \ java/org/linkgrammar/ParseResult.java \ link-grammar.def \ link-grammar-java.def # ----------------------------------------------------------- # Directives to build the link-parser command-line application bin_PROGRAMS=link-parser link_parser_SOURCES = link-parser.c link_parser_LDADD = $(LIBEDIT_LIBS) if WITH_SAT_SOLVER link_parser_LDADD += $(top_builddir)/link-grammar/sat-solver/libsat-solver.la link_parser_LDADD += $(top_builddir)/link-grammar/minisat/libminisat.la endif link_parser_LDADD += liblink-grammar.la # ----------------------------------------------------------- install-data-local: install-libtool-import-lib uninstall-local: uninstall-libtool-import-lib link-grammar-4.7.4/link-grammar/externs.h0000644000175000017500000000227711241162047017341 0ustar bloombloom/*************************************************************************/ /* Copyright (c) 2004 */ /* Daniel Sleator, David Temperley, and John Lafferty */ /* All rights reserved */ /* */ /* Use of the link grammar parsing system is subject to the terms of the */ /* license set forth in the LICENSE file included with this software, */ /* and also available at http://www.link.cs.cmu.edu/link/license.html */ /* This license allows free redistribution and use in source and binary */ /* forms, with or without modification, subject to certain conditions. */ /* */ /*************************************************************************/ /* verbosity global is held in utilities.c */ extern int verbosity; /* the verbosity level for error messages */ /* size of random table for computing the hash functions. must be a power of 2 */ #define RTSIZE 256 extern unsigned int randtable[RTSIZE]; /* random table for hashing */ link-grammar-4.7.4/link-grammar/word-file.h0000644000175000017500000000206711114551526017541 0ustar bloombloom/*************************************************************************/ /* Copyright (c) 2004 */ /* Daniel Sleator, David Temperley, and John Lafferty */ /* All rights reserved */ /* */ /* Use of the link grammar parsing system is subject to the terms of the */ /* license set forth in the LICENSE file included with this software, */ /* and also available at http://www.link.cs.cmu.edu/link/license.html */ /* This license allows free redistribution and use in source and binary */ /* forms, with or without modification, subject to certain conditions. */ /* */ /*************************************************************************/ int files_need_saving(Dictionary dict); void save_files(Dictionary dict); Dict_node * read_word_file(Dictionary dict, Dict_node * dn, char * filename); link-grammar-4.7.4/link-grammar/read-regex.h0000644000175000017500000000146611163570444017702 0ustar bloombloom/*************************************************************************/ /* Copyright (c) 2005 Sampo Pyysalo */ /* */ /* Use of the link grammar parsing system is subject to the terms of the */ /* license set forth in the LICENSE file included with this software, */ /* and also available at http://www.link.cs.cmu.edu/link/license.html */ /* This license allows free redistribution and use in source and binary */ /* forms, with or without modification, subject to certain conditions. */ /* */ /*************************************************************************/ int read_regex_file(Dictionary dict, const char *file_name); link-grammar-4.7.4/link-grammar/pp_linkset.c0000644000175000017500000001076411036216573020022 0ustar bloombloom/*************************************************************************/ /* Copyright (c) 2004 */ /* Daniel Sleator, David Temperley, and John Lafferty */ /* All rights reserved */ /* */ /* Use of the link grammar parsing system is subject to the terms of the */ /* license set forth in the LICENSE file included with this software, */ /* and also available at http://www.link.cs.cmu.edu/link/license.html */ /* This license allows free redistribution and use in source and binary */ /* forms, with or without modification, subject to certain conditions. */ /* */ /*************************************************************************/ /*********************************************************************** pp_linkset.c maintains sets of pointers to link names Similar to string-set, except that the comparison and hashing functions are tailored for links. More importantly, all we store here is pointers. It's up to the caller to ensure that the pointers always point to something useful. **********************************************************************/ #include #include #define LINKSET_SPARSENESS 2 #define LINKSET_SEED_VALUE 37 static void clear_hash_table(pp_linkset *ls) { memset(ls->hash_table,0,ls->hash_table_size*sizeof(pp_linkset_node *)); } static void initialize(pp_linkset *ls, int size) { ls->hash_table_size = size*LINKSET_SPARSENESS; ls->population = 0; ls->hash_table = (pp_linkset_node**) xalloc (ls->hash_table_size*sizeof(pp_linkset_node *)); clear_hash_table(ls); } static int compute_hash(pp_linkset *ls, const char *str) { /* hash is computed from capitalized prefix only */ int i, hashval; hashval=LINKSET_SEED_VALUE; for (i=0; isupper((int)str[i]); i++) hashval = str[i] + 31*hashval; hashval = hashval % ls->hash_table_size; if (hashval<0) hashval*=-1; return hashval; } static pp_linkset_node *add_internal(pp_linkset *ls, const char *str) { pp_linkset_node *p, *n; int hashval; /* look for str (exactly) in linkset */ hashval = compute_hash(ls, str); for (p=ls->hash_table[hashval]; p!=0; p=p->next) if (!strcmp(p->str,str)) return NULL; /* already present */ /* create a new node for u; stick it at head of linked list */ n = (pp_linkset_node *) xalloc (sizeof(pp_linkset_node)); n->next = ls->hash_table[hashval]; n->str = str; ls->hash_table[hashval] = n; return n; } pp_linkset *pp_linkset_open(int size) { pp_linkset *ls; if (size==0) return NULL; ls = (pp_linkset *) xalloc (sizeof(pp_linkset)); initialize(ls, size); return ls; } void pp_linkset_close(pp_linkset *ls) { if (ls==NULL) return; pp_linkset_clear(ls); /* free memory taken by linked lists */ xfree((void*) ls->hash_table, ls->hash_table_size*sizeof(pp_linkset_node*)); xfree((void*) ls, sizeof(pp_linkset)); } void pp_linkset_clear(pp_linkset *ls) { /* clear dangling linked lists, but retain hash table itself */ int i; pp_linkset_node *p; if (ls==NULL) return; for (i=0; ihash_table_size; i++) { p=ls->hash_table[i]; while (p) { pp_linkset_node *q = p; p=p->next; xfree((void*) q, sizeof(pp_linkset_node)); } } clear_hash_table(ls); ls->population=0; } /** * returns 0 if already there, 1 if new. Stores only the pointer */ int pp_linkset_add(pp_linkset *ls, const char *str) { if (ls==NULL) { prt_error("Fatal Error: pp_linkset internal error: Trying to add to a null set"); exit(1); } if (add_internal(ls, str) == NULL) return 0; ls->population++; return 1; } /** * Set query. Returns 1 if str pp-matches something in the set, 0 otherwise */ int pp_linkset_match(pp_linkset *ls, const char *str) { int hashval; pp_linkset_node *p; if (ls==NULL) return 0; hashval = compute_hash(ls, str); p = ls->hash_table[hashval]; while(p!=0) { if (post_process_match(p->str,str)) return 1; p=p->next; } return 0; } int pp_linkset_match_bw(pp_linkset *ls, const char *str) { int hashval; pp_linkset_node *p; if (ls==NULL) return 0; hashval = compute_hash(ls, str); p = ls->hash_table[hashval]; while(p!=0) { if (post_process_match(str,p->str)) return 1; p=p->next; } return 0; } int pp_linkset_population(pp_linkset *ls) { return (ls==NULL)? 0 : ls->population; } link-grammar-4.7.4/link-grammar/print-util.c0000644000175000017500000000477211172431532017756 0ustar bloombloom/*************************************************************************/ /* Copyright (c) 2004 */ /* Daniel Sleator, David Temperley, and John Lafferty */ /* All rights reserved */ /* */ /* Use of the link grammar parsing system is subject to the terms of the */ /* license set forth in the LICENSE file included with this software, */ /* and also available at http://www.link.cs.cmu.edu/link/license.html */ /* This license allows free redistribution and use in source and binary */ /* forms, with or without modification, subject to certain conditions. */ /* */ /*************************************************************************/ #include #include #include "utilities.h" /* This is a "safe" append function, used here to build up a link diagram incrementally. Because the diagram is built up a few characters at a time, we keep around a pointer to the end of string to prevent the algorithm from being quadratic. */ struct String_s { size_t allocated; /* Unsigned so VC++ doesn't complain about comparisons */ size_t eos; /* offset to end of string */ char * p; }; String * string_new(void) { #define INITSZ 30 String * string; string = (String *) exalloc(sizeof(String)); string->allocated = INITSZ; string->p = (char *) exalloc(INITSZ*sizeof(char)); string->p[0] = '\0'; string->eos = 0; return string; } void string_delete(String *s) { exfree(s->p, s->allocated*sizeof(char)); exfree(s, sizeof(String)); } char * string_copy(String *s) { char * p = (char *) exalloc(s->eos + 1); strcpy(p, s->p); return p; } void append_string(String * string, const char *fmt, ...) { #define TMPLEN 1024 char temp_string[TMPLEN]; size_t templen; char * p; size_t new_size; va_list args; va_start(args, fmt); templen = vsnprintf(temp_string, TMPLEN, fmt, args); va_end(args); if (string->allocated <= string->eos + templen) { new_size = 2 * string->allocated + templen + 1; p = (char *) exalloc(sizeof(char)*new_size); strcpy(p, string->p); strcpy(p + string->eos, temp_string); exfree(string->p, sizeof(char)*string->allocated); string->p = p; string->allocated = new_size; string->eos += templen; } else { strcpy(string->p + string->eos, temp_string); string->eos += templen; } } link-grammar-4.7.4/link-grammar/read-dict.c0000644000175000017500000013005711315242564017503 0ustar bloombloom/*************************************************************************/ /* Copyright (c) 2004 */ /* Daniel Sleator, David Temperley, and John Lafferty */ /* All rights reserved */ /* */ /* Use of the link grammar parsing system is subject to the terms of the */ /* license set forth in the LICENSE file included with this software, */ /* and also available at http://www.link.cs.cmu.edu/link/license.html */ /* This license allows free redistribution and use in source and binary */ /* forms, with or without modification, subject to certain conditions. */ /* */ /*************************************************************************/ #include #include #include #include #include #include "disjunct-utils.h" #include "error.h" const char * linkgrammar_get_version(void) { const char *s = "link-grammar-" LINK_VERSION_STRING; return s; } const char * linkgrammar_get_dict_version(Dictionary dict) { static char * ver = NULL; char * p; Dict_node *dn; Exp *e; if (ver) return ver; /* The newer dictionaries should contain a macro of the form: * : V4v6v6+; * which would indicate dictionary verison 4.6.6 * Older dictionaries contain no version info. */ dn = dictionary_lookup_list(dict, ""); if (NULL == dn) return "[unknown]"; e = dn->exp; ver = strdup(&e->u.string[1]); p = strchr(ver, 'v'); while (p) { *p = '.'; p = strchr(p+1, 'v'); } free_lookup_list(dn); return ver; } /* The dictionary format: In what follows: Every "%" symbol and everything after it is ignored on every line. Every newline or tab is replaced by a space. The dictionary file is a sequence of ENTRIES. Each ENTRY is one or more WORDS (a sequence of upper or lower case letters) separated by spaces, followed by a ":", followed by an EXPRESSION followed by a ";". An EXPRESSION is an expression where the operators are "&" or "and" or "|" or "or", and there are three types of parentheses: "()", "{}", and "[]". The terminal symbols of this grammar are the connectors, which are strings of letters or numbers or *s. Expressions may be written in prefix or infix form. In prefix-form, the expressions are lisp-like, with the operators &, | preceeding the operands. In infix-form, the operators are in the middle. The current dictionaries are in infix form. If the C preprocessor constant INFIX_NOTATION is defined, then the dictionary is assumed to be in infix form. The connector begins with an optinal @, which is followed by an upper case sequence of letters. Each subsequent *, lower case letter or number is a subscript. At the end is a + or - sign. The "@" allows this connector to attach to one or more other connectors. Here is a sample dictionary entry (in infix form): gone: T- & {@EV+}; (See our paper for more about how to interpret the meaning of the dictionary expressions.) A previously defined word (such as "gone" above) may be used instead of a connector to specify the expression it was defined to be. Of course, in this case, it must uniquely specify a word in the dictionary, and have been previously defined. If a word is of the form "/foo", then the file current-dir/foo is a so-called word file, and is read in as a list of words. A word file is just a list of words separted by blanks or newlines. A word that contains the character "_" defines an idiomatic use of the words separated by the "_". For example "kind of" is an idiomatic expression, so a word "kind_of" is defined in the dictionary. Idomatic expressions of any number of words can be defined in this way. When the word "kind" is encountered, all the idiomatic uses of the word are considered. An expresion enclosed in "[..]" is give a cost of 1. This means that if any of the connectors inside the square braces are used, a cost of 1 is incurred. (This cost is the first element of the cost vector printed when a sentence is parsed.) Of course if something is inside of 10 levels of "[..]" then using it incurs a cost of 10. These costs are called "disjunct costs". The linkages are printed out in order of non-increasing disjunct cost. The expression "(A+ or ())" means that you can choose either "A+" or the empty expression "()", that is, that the connector "A+" is optional. This is more compactly expressed as "{A+}". In other words, curly braces indicate an optional expression. The expression "(A+ or [])" is the same as that above, but there is a cost of 1 incurred for choosing not to use "A+". The expression "(EXP1 & [EXP2])" is exactly the same as "[EXP1 & EXP2]". The difference between "({[A+]} & B+)" and "([{A+}] & B+)" is that the latter always incurrs a cost of 1, while the former only gets a cost of 1 if "A+" is used. The dictionary writer is not allowed to use connectors that begin in "ID". This is reserved for the connectors automatically generated for idioms. Dictionary words may be followed by a dot (period, "."), and a "subscript" identifying the word type. The subscript may be one or more letters or numbers, but must begin with a letter. Currently, the dictionary contains (mostly?) subscripts consisting of a single letter, and these serve mostly to identify the part-of-speech. In general, subscripts can also be used to distinguish different word senses. */ static int link_advance(Dictionary dict); static void dict_error2(Dictionary dict, const char * s, const char *s2) { int i; char tokens[1024], t[128]; if (dict->recursive_error) return; dict->recursive_error = TRUE; tokens[0] = '\0'; for (i=0; i<5 && dict->token[0] != '\0' ; i++) { sprintf(t, "\"%s\" ", dict->token); strcat(tokens, t); link_advance(dict); } if (s2) { err_ctxt ec; ec.sent = NULL; err_msg(&ec, Error, "Error parsing dictionary %s.\n" "%s %s\n\t line %d, tokens = %s\n", dict->name, s, s2, dict->line_number, tokens); } else { err_ctxt ec; ec.sent = NULL; err_msg(&ec, Error, "Error parsing dictionary %s.\n" "%s\n\t line %d, tokens = %s\n", dict->name, s, dict->line_number, tokens); } dict->recursive_error = FALSE; } static void dict_error(Dictionary dict, const char * s) { dict_error2(dict, s, NULL); } static void warning(Dictionary dict, const char * s) { err_ctxt ec; ec.sent = NULL; err_msg(&ec, Warn, "Warning: %s\n" "\tline %d, current token = \"%s\"\n", s, dict->line_number, dict->token); } /** * This gets the next character from the input, eliminating comments. * If we're in quote mode, it does not consider the % character for * comments. */ static wint_t get_character(Dictionary dict, int quote_mode) { wint_t c; c = fgetwc(dict->fp); if ((c == '%') && (!quote_mode)) { while((c != WEOF) && (c != '\n')) c = fgetwc(dict->fp); } if (c == '\n') dict->line_number++; return c; } /* * This set of 10 characters are the ones defining the syntax of the * dictionary. */ #define SPECIAL "(){};[]&|:" /** * Return true if the input wide-character is one of the special * characters used to define the syntax of the dictionary. */ static int is_special(wint_t wc, mbstate_t *ps) { char buff[MB_LEN_MAX]; int nr = wcrtomb(buff, wc, ps); if (1 != nr) return FALSE; return (NULL != strchr(SPECIAL, buff[0])); } /** * This reads the next token from the input into token. * Return 1 if a character was read, else return 0 (and print a warning). */ static int link_advance(Dictionary dict) { wint_t c; int nr, i; int quote_mode; dict->is_special = FALSE; if (dict->already_got_it != '\0') { dict->is_special = is_special(dict->already_got_it, &dict->mbss); if (dict->already_got_it == WEOF) { dict->token[0] = '\0'; } else { dict->token[0] = dict->already_got_it; /* specials are one byte */ dict->token[1] = '\0'; } dict->already_got_it = '\0'; return 1; } do { c = get_character(dict, FALSE); } while (iswspace(c)); quote_mode = FALSE; i = 0; for (;;) { if (i > MAX_TOKEN_LENGTH-3) { /* 3 for multi-byte tokens */ dict_error(dict, "Token too long"); return 0; } if (quote_mode) { if (c == '\"') { quote_mode = FALSE; dict->token[i] = '\0'; return 1; } if (iswspace(c)) { dict_error(dict, "White space inside of token"); return 0; } /* Although we read wide chars, we store UTF8 internally, always. */ nr = wcrtomb(&dict->token[i], c, &dict->mbss); if (nr < 0) { #ifndef _WIN32 dict_error2(dict, "Unable to read UTF8 string in current locale", nl_langinfo(CODESET)); fprintf (stderr, "\tTry setting the locale with \"export LANG=en_US.UTF-8\"\n"); #else dict_error(dict, "Unable to read UTF8 string in current locale"); #endif return 0; } i += nr; } else { if (is_special(c, &dict->mbss)) { if (i == 0) { dict->token[0] = c; /* special toks are one char always */ dict->token[1] = '\0'; dict->is_special = TRUE; return 1; } dict->token[i] = '\0'; dict->already_got_it = c; return 1; } if (c == WEOF) { if (i == 0) { dict->token[0] = '\0'; return 1; } dict->token[i] = '\0'; dict->already_got_it = c; return 1; } if (iswspace(c)) { dict->token[i] = '\0'; return 1; } if (c == '\"') { quote_mode = TRUE; } else { /* store UTF8 internally, always. */ nr = wctomb_check(&dict->token[i], c, &dict->mbss); if (nr < 0) { #ifndef _WIN32 dict_error2(dict, "Unable to read UTF8 string in current locale", nl_langinfo(CODESET)); fprintf (stderr, "\tTry setting the locale with \"export LANG=en_US.UTF-8\"\n"); #else dict_error(dict, "Unable to read UTF8 string in current locale"); #endif return 0; } i += nr; } } c = get_character(dict, quote_mode); } return 1; } /** * Returns TRUE if this token is a special token and it is equal to c */ static int is_equal(Dictionary dict, wint_t c) { return (dict->is_special && wctob(c) == dict->token[0] && dict->token[1] == '\0'); } /** * Make sure the string s is a valid connector. * Return 1 if the connector is valid, else return 0, * and print an appropriate warning message. */ static int check_connector(Dictionary dict, const char * s) { int i; i = strlen(s); if (i < 1) { dict_error(dict, "Expecting a connector."); return 0; } i = s[i-1]; /* the last character of the token */ if ((i!='+') && (i!='-')) { dict_error(dict, "A connector must end in a \"+\" or \"-\"."); return 0; } if (*s == '@') s++; if (!isupper((int)*s)) { dict_error(dict, "The first letter of a connector must be in [A--Z]."); return 0; } if ((*s == 'I') && (*(s+1) == 'D')) { dict_error(dict, "Connectors beginning with \"ID\" are forbidden"); return 0; } while (*(s+1)) { if ((!isalnum((int)*s)) && (*s != '*') && (*s != '^')) { dict_error(dict, "All letters of a connector must be ASCII alpha-numeric."); return 0; } s++; } return 1; } /* ======================================================================== */ /** * Dictionary entry comparison and ordering functions. * * The data structure storing the dictionary is simply a binary tree. * The entries in the binary tree are sorted by alphabetical order. * There is one catch, however: words may have suffixes (a dot, followed * by the suffix), and these suffixes are to be handled appripriately * during sorting and comparison. * * The use of suffixes means that the ordering of the words is not * exactly the order given by strcmp. The order must be such that, for * example, "make" < "make.n" < "make-up" -- suffixed words come after * the bare words, but before any other other words with non-ascii-alpha * characters (such as the hyphen in "make-up", or possibly UTF8 * characters). Thus, stright "strcmp" can't be used to determine * dictionary order. * * Thus, a set of specialized string comparison and ordering functions * are provided. These "do the right thing" when matching string with * and without suffixes. */ /** * dict_order - order two dictionary words in proper sort order. * Return zero if the strings match, else return standard * (locale-dependent) UTF8 sort order. */ /* verbose version */ /* int dict_order(char *s, char *t) { int ss, tt; while (*s != '\0' && *s == *t) { s++; t++; } if (*s == '.') { ss = 1; } else { ss = (*s)<<1; } if (*t == '.') { tt = 1; } else { tt = (*t)<<1; } return (ss - tt); } */ /* terse version */ static inline int dict_order(const char *s, const char *t) { while (*s != '\0' && *s == *t) {s++; t++;} return (((*s == '.')?(1):((*s)<<1)) - ((*t == '.')?(1):((*t)<<1))); } /** * dict_order_wild() -- order dictionary strings, with wildcard. * Assuming that s is a pointer to a dictionary string, and that * t is a pointer to a search string, this returns 0 if they * match, >0 if s>t, and <0 if s (ds-s)) return FALSE; /* we need to do this to ensure that */ return (strncmp(s, t, ds-s) == 0); /* "i.e." does not match "i.e" */ } else if (dt != NULL && ds == NULL) { if (((int)strlen(s)) > (dt-t)) return FALSE; return (strncmp(s, t, dt-t) == 0); } else { return (strcmp(s, t) == 0); } } /* ======================================================================== */ static inline Dict_node * dict_node_new(void) { return (Dict_node*) xalloc(sizeof(Dict_node)); } static inline void free_dict_node(Dict_node *dn) { xfree((char *)dn, sizeof(Dict_node)); } /** * prune_lookup_list -- discard all list entries that don't match string * Walk the lookup list (of right links), discarding all nodes that do * not match the dictionary string s. The matching is dictionary matching: * suffixed entries will match "bare" entries. */ static Dict_node * prune_lookup_list(Dict_node *llist, const char * s) { Dict_node *dn, *dnx, *list_new; list_new = NULL; for (dn = llist; dn != NULL; dn = dnx) { dnx = dn->right; /* now put dn onto the answer list, or free it */ if (dict_match(dn->string, s)) { dn->right = list_new; list_new = dn; } else { free_dict_node(dn); } } /* now reverse the list back */ llist = NULL; for (dn = list_new; dn != NULL; dn = dnx) { dnx = dn->right; dn->right = llist; llist = dn; } return llist; } void free_lookup_list(Dict_node *llist) { Dict_node * n; while(llist != NULL) { n = llist->right; free_dict_node(llist); llist = n; } } static void free_dict_node_recursive(Dict_node * dn) { if (dn == NULL) return; free_dict_node_recursive(dn->left); free_dict_node_recursive(dn->right); free_dict_node(dn); } /* ======================================================================== */ /** * rdictionary_lookup() -- recursive dictionary lookup * Walk binary tree, given by 'dn', looking for the string 's'. * For every node in the tree where 's' matches (including wildcards) * make a copy of that node, and append it to llist. */ static Dict_node * rdictionary_lookup(Dict_node *llist, Dict_node * dn, const char * s, int match_idiom) { /* see comment in dictionary_lookup below */ int m; Dict_node * dn_new; if (dn == NULL) return llist; m = dict_order_wild(s, dn->string); if (m >= 0) { llist = rdictionary_lookup(llist, dn->right, s, match_idiom); } if ((m == 0) && (match_idiom || !is_idiom_word(dn->string))) { dn_new = dict_node_new(); *dn_new = *dn; dn_new->right = llist; llist = dn_new; } if (m <= 0) { llist = rdictionary_lookup(llist, dn->left, s, match_idiom); } return llist; } /** * dictionary_lookup_list() - return lookup list of words in the dictionary * * Returns a pointer to a lookup list of the words in the dictionary. * Matches include word that appear in idioms. Use * abridged_lookup_list() to obtain matches, excluding idioms. * * This list is made up of Dict_nodes, linked by their right pointers. * The node, file and string fields are copied from the dictionary. * * The returned list must be freed with free_lookup_list(). */ Dict_node * dictionary_lookup_list(Dictionary dict, const char *s) { Dict_node * llist = rdictionary_lookup(NULL, dict->root, s, TRUE); llist = prune_lookup_list(llist, s); return llist; } /** * abridged_lookup_list() - return lookup list of words in the dictionary * * Returns a pointer to a lookup list of the words in the dictionary. * Excludes any idioms that contain the word; use * dictionary_lookup_list() to obtain the complete list. * * This list is made up of Dict_nodes, linked by their right pointers. * The node, file and string fields are copied from the dictionary. * * The returned list must be freed with free_lookup_list(). */ Dict_node * abridged_lookup_list(Dictionary dict, const char *s) { Dict_node *llist; llist = rdictionary_lookup(NULL, dict->root, s, FALSE); llist = prune_lookup_list(llist, s); return llist; } int boolean_dictionary_lookup(Dictionary dict, const char *s) { Dict_node *llist = dictionary_lookup_list(dict, s); int boool = (llist != NULL); free_lookup_list(llist); return boool; } /* ======================================================================== */ /** * Allocate a new Exp node and link it into the exp_list for freeing later. */ Exp * Exp_create(Dictionary dict) { Exp * e; e = (Exp *) xalloc(sizeof(Exp)); e->next = dict->exp_list; dict->exp_list = e; return e; } static inline void exp_free(Exp * e) { xfree((char *)e, sizeof(Exp)); } /* ======================================================================== */ /** * This creates a node with one child (namely e). Initializes * the cost to zero. */ static Exp * make_unary_node(Dictionary dict, Exp * e) { Exp * n; n = Exp_create(dict); n->type = AND_type; /* these must be AND types */ n->cost = 0.0f; n->u.l = (E_list *) xalloc(sizeof(E_list)); n->u.l->next = NULL; n->u.l->e = e; return n; } /** * connector() -- make a node for a connector or dictionary word. * * Assumes the current token is a connector or dictionary word. */ static Exp * connector(Dictionary dict) { Exp * n; Dict_node *dn, *dn_head; int i; i = strlen(dict->token) - 1; /* this must be + or - if a connector */ if ((dict->token[i] != '+') && (dict->token[i] != '-')) { /* If we are here, token is a word */ dn_head = abridged_lookup_list(dict, dict->token); dn = dn_head; while ((dn != NULL) && (strcmp(dn->string, dict->token) != 0)) { dn = dn->right; } if (dn == NULL) { free_lookup_list(dn_head); dict_error(dict, "\nPerhaps missing + or - in a connector.\n" "Or perhaps you forgot the suffix on a word.\n" "Or perhaps a word is used before it is defined.\n"); return NULL; } n = make_unary_node(dict, dn->exp); free_lookup_list(dn_head); } else { /* If we are here, token is a connector */ if (!check_connector(dict, dict->token)) { return NULL; } n = Exp_create(dict); n->dir = dict->token[i]; dict->token[i] = '\0'; /* get rid of the + or - */ if (dict->token[0] == '@') { n->u.string = string_set_add(dict->token+1, dict->string_set); n->multi = TRUE; } else { n->u.string = string_set_add(dict->token, dict->string_set); n->multi = FALSE; } n->type = CONNECTOR_type; n->cost = 0.0f; } if (!link_advance(dict)) { exp_free(n); return NULL; } return n; } /** * This creates a node with zero children. Initializes * the cost to zero. */ static Exp * make_zeroary_node(Dictionary dict) { Exp * n; n = Exp_create(dict); n->type = AND_type; /* these must be AND types */ n->cost = 0.0f; n->u.l = NULL; return n; } /** * This creates an OR node with two children, one the given node, * and the other as zeroary node. This has the effect of creating * what used to be called an optional node. */ static Exp * make_optional_node(Dictionary dict, Exp * e) { Exp * n; E_list *el, *elx; n = Exp_create(dict); n->type = OR_type; n->cost = 0.0f; n->u.l = el = (E_list *) xalloc(sizeof(E_list)); el->e = make_zeroary_node(dict); el->next = elx = (E_list *) xalloc(sizeof(E_list)); elx->next = NULL; elx->e = e; return n; } /* ======================================================================== */ #if ! defined INFIX_NOTATION Exp * expression(Dictionary dict); /** * We're looking at the first of the stuff after an "and" or "or". * Build a Exp node for this expression. Set the cost and optional * fields to the default values. Set the type field according to type */ Exp * operator_exp(Dictionary dict, int type) { Exp * n; E_list first; E_list * elist; n = Exp_create(dict); n->type = type; n->cost = 0.0f; elist = &first; while((!is_equal(dict, ')')) && (!is_equal(dict, ']')) && (!is_equal(dict, '}'))) { elist->next = (E_list *) xalloc(sizeof(E_list)); elist = elist->next; elist->next = NULL; elist->e = expression(dict); if (elist->e == NULL) { return NULL; } } if (elist == &first) { dict_error(dict, "An \"or\" or \"and\" of nothing"); return NULL; } n->u.l = first.next; return n; } /** * Looks for the stuff that is allowed to be inside of parentheses * either & or | followed by a list, or a terminal symbol. */ Exp * in_parens(Dictionary dict) { Exp * e; if (is_equal(dict, '&') || (strcmp(token, "and")==0)) { if (!link_advance(dict)) { return NULL; } return operator_exp(dict, AND_type); } else if (is_equal(dict, '|') || (strcmp(dict->token, "or")==0)) { if (!link_advance(dict)) { return NULL; } return operator_exp(dict, OR_type); } else { return expression(dict); } } /** * Build (and return the root of) the tree for the expression beginning * with the current token. At the end, the token is the first one not * part of this expression. */ Exp * expression(Dictionary dict) { Exp * n; if (is_equal(dict, '(')) { if (!link_advance(dict)) { return NULL; } n = in_parens(dict); if (!is_equal(dict, ')')) { dict_error(dict, "Expecting a \")\"."); return NULL; } if (!link_advance(dict)) { return NULL; } } else if (is_equal(dict, '{')) { if (!link_advance(dict)) { return NULL; } n = in_parens(dict); if (!is_equal(dict, '}')) { dict_error(dict, "Expecting a \"}\"."); return NULL; } if (!link_advance(dict)) { return NULL; } n = make_optional_node(dict, n); } else if (is_equal(dict, '[')) { if (!link_advance(dict)) { return NULL; } n = in_parens(dict); if (!is_equal(dict, ']')) { dict_error(dict, "Expecting a \"]\"."); return NULL; } if (!link_advance(dict)) { return NULL; } n->cost += 1.0f; } else if (!dict->is_special) { n = connector(dict); if (n == NULL) { return NULL; } } else if (is_equal(dict, ')') || is_equal(dict, ']')) { /* allows "()" or "[]" */ n = make_zeroary_node(dict); } else { dict_error(dict, "Connector, \"(\", \"[\", or \"{\" expected."); return NULL; } return n; } /* ======================================================================== */ #else /* This is for infix notation */ static Exp * restricted_expression(Dictionary dict, int and_ok, int or_ok); /** * Build (and return the root of) the tree for the expression beginning * with the current token. At the end, the token is the first one not * part of this expression. */ static Exp * expression(Dictionary dict) { return restricted_expression(dict, TRUE, TRUE); } static Exp * restricted_expression(Dictionary dict, int and_ok, int or_ok) { Exp *nl = NULL, *nr; E_list *ell, *elr; if (is_equal(dict, '(')) { if (!link_advance(dict)) { return NULL; } nl = expression(dict); if (nl == NULL) { return NULL; } if (!is_equal(dict, ')')) { dict_error(dict, "Expecting a \")\"."); return NULL; } if (!link_advance(dict)) { return NULL; } } else if (is_equal(dict, '{')) { if (!link_advance(dict)) { return NULL; } nl = expression(dict); if (nl == NULL) { return NULL; } if (!is_equal(dict, '}')) { dict_error(dict, "Expecting a \"}\"."); return NULL; } if (!link_advance(dict)) { return NULL; } nl = make_optional_node(dict, nl); } else if (is_equal(dict, '[')) { if (!link_advance(dict)) { return NULL; } nl = expression(dict); if (nl == NULL) { return NULL; } if (!is_equal(dict, ']')) { dict_error(dict, "Expecting a \"]\"."); return NULL; } if (!link_advance(dict)) { return NULL; } nl->cost += 1.0f; } else if (!dict->is_special) { nl = connector(dict); if (nl == NULL) { return NULL; } } else if (is_equal(dict, ')') || is_equal(dict, ']')) { /* allows "()" or "[]" */ nl = make_zeroary_node(dict); } else { dict_error(dict, "Connector, \"(\", \"[\", or \"{\" expected."); return NULL; } if (is_equal(dict, '&') || (strcmp(dict->token, "and") == 0)) { Exp *n; if (!and_ok) { warning(dict, "\"and\" and \"or\" at the same level in an expression"); } if (!link_advance(dict)) { return NULL; } nr = restricted_expression(dict, TRUE, FALSE); if (nr == NULL) { return NULL; } n = Exp_create(dict); n->u.l = ell = (E_list *) xalloc(sizeof(E_list)); ell->next = elr = (E_list *) xalloc(sizeof(E_list)); elr->next = NULL; ell->e = nl; elr->e = nr; n->type = AND_type; n->cost = 0.0f; return n; } else if (is_equal(dict, '|') || (strcmp(dict->token, "or") == 0)) { Exp *n; if (!or_ok) { warning(dict, "\"and\" and \"or\" at the same level in an expression"); } if (!link_advance(dict)) { return NULL; } nr = restricted_expression(dict, FALSE,TRUE); if (nr == NULL) { return NULL; } n = Exp_create(dict); n->u.l = ell = (E_list *) xalloc(sizeof(E_list)); ell->next = elr = (E_list *) xalloc(sizeof(E_list)); elr->next = NULL; ell->e = nl; elr->e = nr; n->type = OR_type; n->cost = 0.0f; return n; } return nl; } #endif /* ======================================================================== */ /* Tree balancing utilities, used to implement an AVL tree. * Unfortunately, AVL tree insertion is very slowww, unusably * slow for creating the dictionary. The code is thus ifdef'ed out * but is left here for debugging and other sundry purposes. * A better way to rebalance the tree is the DSW algo, implemented * further below. */ static Dict_node *rotate_right(Dict_node *root) { Dict_node *pivot = root->left; root->left = pivot->right; pivot->right = root; return pivot; } #ifdef USE_AVL_TREE_FOR_INSERTION static Dict_node *rotate_left(Dict_node *root) { Dict_node *pivot = root->right; root->right = pivot->left; pivot->left = root; return pivot; } /* Return tree height. XXX this is not tail-recursive! */ static int tree_depth (Dict_node *n) { int l, r; if (NULL == n) return 0; if (NULL == n->left) return 1+tree_depth(n->right); if (NULL == n->right) return 1+tree_depth(n->left); l = tree_depth(n->left); r = tree_depth(n->right); if (l < r) return r+1; return l+1; } static int tree_balance(Dict_node *n) { int l = tree_depth(n->left); int r = tree_depth(n->right); return r-l; } /** * Rebalance the dictionary tree. * This recomputes the tree depth wayy too often, but so what.. this * only wastes cpu time during the initial dictinary read. */ static Dict_node *rebalance(Dict_node *root) { int bal = tree_balance(root); if (2 == bal) { bal = tree_balance(root->right); if (-1 == bal) { root->right = rotate_right (root->right); } return rotate_left(root); } else if (-2 == bal) { bal = tree_balance(root->left); if (1 == bal) { root->left = rotate_left (root->left); } return rotate_right(root); } return root; } #endif /* USE_AVL_TREE_FOR_INSERTION */ /* ======================================================================== */ /* Implementation of the DSW algo for rebalancing a binary tree. * The point is -- after building the dictionary tree, we rebalance it * once at the end. This is a **LOT LOT** quicker than maintaing an * AVL tree along the way (less than quarter-of-a-second vs. about * a minute or more!) FWIW, the DSW tree is even more balanced than * the AVL tree is (its less deep, more full). * * The DSW algo, with C++ code, is described in * * Timothy J. Rolfe, "One-Time Binary Search Tree Balancing: * The Day/Stout/Warren (DSW) Algorithm", inroads, Vol. 34, No. 4 * (December 2002), pp. 85-88 * http://penguin.ewu.edu/~trolfe/DSWpaper/ */ static Dict_node * dsw_tree_to_vine (Dict_node *root) { Dict_node *vine_tail, *vine_head, *rest; Dict_node vh; vine_head = &vh; vine_head->left = NULL; vine_head->right = root; vine_tail = vine_head; rest = root; while (NULL != rest) { /* If no left, we are done, do the right */ if (NULL == rest->left) { vine_tail = rest; rest = rest->right; } /* eliminate the left subtree */ else { rest = rotate_right(rest); vine_tail->right = rest; } } return vh.right; } static void dsw_compression (Dict_node *root, unsigned int count) { unsigned int j; for (j = 0; j < count; j++) { /* Compound left rotation */ Dict_node * pivot = root->right; root->right = pivot->right; root = pivot->right; pivot->right = root->left; root->left = pivot; } } /* Return size of the full portion of the tree * Gets the next pow(2,k)-1 */ static inline unsigned int full_tree_size (unsigned int size) { unsigned int pk = 1; while (pk < size) pk = 2*pk + 1; return pk/2; } static Dict_node * dsw_vine_to_tree (Dict_node *root, int size) { Dict_node vine_head; unsigned int full_count = full_tree_size(size +1); vine_head.left = NULL; vine_head.right = root; dsw_compression(&vine_head, size - full_count); for (size = full_count ; size > 1 ; size /= 2) { dsw_compression(&vine_head, size / 2); } return vine_head.right; } /* ======================================================================== */ /** * Insert the new node into the dictionary below node n. * Give error message if the new element's string is already there. * Assumes that the "n" field of new is already set, and the left * and right fields of it are NULL. * * The resulting tree is highly unbalanced. It needs to be rebalanced * before used. */ Dict_node * insert_dict(Dictionary dict, Dict_node * n, Dict_node * newnode) { int comp; if (NULL == n) return newnode; comp = dict_order(newnode->string, n->string); if (comp < 0) { if (NULL == n->left) { n->left = newnode; return n; } n->left = insert_dict(dict, n->left, newnode); return n; /* return rebalance(n); Uncomment to get an AVL tree */ } else if (comp > 0) { if (NULL == n->right) { n->right = newnode; return n; } n->right = insert_dict(dict, n->right, newnode); return n; /* return rebalance(n); Uncomment to get an AVL tree */ } else { char t[256]; snprintf(t, 256, "The word \"%s\" has been multiply defined\n", newnode->string); dict_error(dict, t); return NULL; } } /** * insert_list() - * p points to a list of dict_nodes connected by their left pointers. * l is the length of this list (the last ptr may not be NULL). * It inserts the list into the dictionary. * It does the middle one first, then the left half, then the right. * * Note: I think this insert middle, then left, then right, has * its origins as a lame attempt to hack around the fact that the * resulting binary tree is rather badly unbalanced. This has been * fixed by using the DSW rebalancing algo. Now, that would seem * to render this crazy bisected-insertion algo obsoloete, but .. * oddly enough, it seems to make the DSW balancing go really fast! * Faster than a simple insertion. Go figure. I think this has * something to do with the fact that the dictionaries are in * alphabetical order! This subdivision helps randomize a bit. */ static void insert_list(Dictionary dict, Dict_node * p, int l) { Dict_node * dn, *dn_head, *dn_second_half; int k, i; /* length of first half */ if (l == 0) return; k = (l-1)/2; dn = p; for (i = 0; i < k; i++) { dn = dn->left; } /* dn now points to the middle element */ dn_second_half = dn->left; dn->left = dn->right = NULL; if (contains_underbar(dn->string)) { insert_idiom(dict, dn); } else if (is_idiom_word(dn->string)) { err_ctxt ec; ec.sent = NULL; err_msg(&ec, Warn, "Warning: Word \"%s\" found near line %d.\n" "\tWords ending \".Ix\" (x a number) are reserved for idioms.\n" "\tThis word will be ignored.\n", dn->string, dict->line_number); free_dict_node(dn); } else if ((dn_head = abridged_lookup_list(dict, dn->string)) != NULL) { Dict_node *dnx; err_ctxt ec; ec.sent = NULL; err_msg(&ec, Warn, "Warning: The word \"%s\" " "found near line %d of %s matches the following words:\n", dn->string, dict->line_number, dict->name); for (dnx = dn_head; dnx != NULL; dnx = dnx->right) { fprintf(stderr, "\t%s", dnx->string); } fprintf(stderr, "\n\tThis word will be ignored.\n"); free_lookup_list(dn_head); free_dict_node(dn); } else { dict->root = insert_dict(dict, dict->root, dn); dict->num_entries++; } insert_list(dict, p, k); insert_list(dict, dn_second_half, l-k-1); } /** * read_entry() -- read one dictionary entry * Starting with the current token parse one dictionary entry. * Add these words to the dictionary. */ static int read_entry(Dictionary dict) { Exp *n; int i; Dict_node *dn_new, *dnx, *dn = NULL; /* Reset multi-byte shift state every line. */ memset(&dict->mbss, 0, sizeof(dict->mbss)); while (!is_equal(dict, ':')) { if (dict->is_special) { dict_error(dict, "I expected a word but didn\'t get it."); return 0; } /* if it's a word-file name */ /* However, be careful to reject "/.v" which is the division symbol * used in equations (.v means verb-like) */ if ((dict->token[0] == '/') && (dict->token[1] != '.')) { dn = read_word_file(dict, dn, dict->token); if (dn == NULL) { err_ctxt ec; ec.sent = NULL; err_msg(&ec, Error, "Error opening word file %s\n", dict->token); return 0; } } else { dn_new = dict_node_new(); dn_new->left = dn; dn = dn_new; dn->file = NULL; dn->string = string_set_add(dict->token, dict->string_set); } /* Advance to next entry, unless error */ if (0 == link_advance(dict)) goto syntax_error; } /* pass the : */ if (!link_advance(dict)) { goto syntax_error; } n = expression(dict); if (n == NULL) { goto syntax_error; } if (!is_equal(dict, ';')) { dict_error(dict, "Expecting \";\" at the end of an entry."); goto syntax_error; } /* pass the ; */ if (!link_advance(dict)) { goto syntax_error; } /* At this point, dn points to a list of Dict_nodes connected by * their left pointers. These are to be inserted into the dictionary */ i = 0; for (dnx = dn; dnx != NULL; dnx = dnx->left) { dnx->exp = n; i++; } insert_list(dict, dn, i); return 1; syntax_error: free_lookup_list(dn); return 0; } #if ! defined INFIX_NOTATION /** * print the expression, in prefix-style */ void print_expression(Exp * n) { E_list * el; int i, icost; if (n == NULL) { printf("NULL expression"); return; } icost = (int) (n->cost); if (n->type == CONNECTOR_type) { for (i=0; imulti) printf("@"); printf("%s%c",n->u.string, n->dir); for (i=0; i 0) printf(" "); } else { for (i=0; itype == AND_type) printf("& "); if (n->type == OR_type) printf("or "); for (el = n->u.l; el != NULL; el = el->next) { print_expression(el->e); } for (i=0; i 0) printf(" "); if (icost == 0) printf(") "); } } #else /* INFIX_NOTATION */ /** * print the expression, in infix-style */ static void print_expression_parens(Exp * n, int need_parens) { E_list * el; int i, icost; if (n == NULL) { printf("NULL expression"); return; } icost = (int) (n->cost); /* print the connector only */ if (n->type == CONNECTOR_type) { for (i=0; imulti) printf("@"); printf("%s%c",n->u.string, n->dir); for (i=0; iu.l; if (el == NULL) { for (i=0; itype == OR_type) && el && el->e && (NULL == el->e->u.l)) { printf ("{"); print_expression_parens(el->next->e, FALSE); printf ("}"); return; } if ((icost == 0) && need_parens) printf("("); /* print left side of binary expr */ print_expression_parens(el->e, TRUE); /* get a funny "and optional" when its a named expression thing. */ if ((n->type == AND_type) && (el->next == NULL)) { return; } if (n->type == AND_type) printf(" & "); if (n->type == OR_type) printf(" or "); /* print right side of binary expr */ el = el->next; if (el == NULL) { printf ("()"); } else { if (el->e->type == n->type) { print_expression_parens(el->e, FALSE); } else { print_expression_parens(el->e, TRUE); } if (el->next != NULL) printf ("\nERROR! Unexpected list!\n"); } for (i=0; ileft); printf("%s: ", n->string); print_expression(n->exp); printf("\n"); rprint_dictionary_data(n->right); } /** * Dump the entire contents of the dictionary * XXX This is not currently called by anything, but is a "good thing * to keep around". */ void print_dictionary_data(Dictionary dict) { rprint_dictionary_data(dict->root); } int read_dictionary(Dictionary dict) { if (!link_advance(dict)) { return 0; } while (dict->token[0] != '\0') { if (!read_entry(dict)) { return 0; } } dict->root = dsw_tree_to_vine(dict->root); dict->root = dsw_vine_to_tree(dict->root, dict->num_entries); return 1; } /* ======================================================================= */ /* the following functions are for handling deletion */ /** * Returns true if it finds a non-idiom dict_node in a file that matches * the string s. * ** note: this now DOES include non-file words in its search. * * Also sets parent and to_be_deleted appropriately. */ static int find_one_non_idiom_node(Dict_node * p, Dict_node * dn, const char * s, Dict_node **parent, Dict_node **to_be_deleted) { int m; if (dn == NULL) return FALSE; m = dict_order_wild(s, dn->string); if (m <= 0) { if (find_one_non_idiom_node(dn,dn->left, s, parent, to_be_deleted)) return TRUE; } /* if ((m == 0) && (!is_idiom_word(dn->string)) && (dn->file != NULL)) { */ if ((m == 0) && (!is_idiom_word(dn->string))) { *to_be_deleted = dn; *parent = p; return TRUE; } if (m >= 0) { if (find_one_non_idiom_node(dn,dn->right, s, parent, to_be_deleted)) return TRUE; } return FALSE; } static void set_parent_of_node(Dictionary dict, Dict_node *p, Dict_node * del, Dict_node * newnode) { if (p == NULL) { dict->root = newnode; } else { if (p->left == del) { p->left = newnode; } else if (p->right == del) { p->right = newnode; } else { assert(FALSE, "Dictionary broken?"); } } } /** * This deletes all the non-idiom words of the dictionary that match * the given string. Returns TRUE if some deleted, FALSE otherwise. * * XXX Note: this function is not currently used anywhere in the code, * but it could be useful for general dictionary editing. */ int delete_dictionary_words(Dictionary dict, const char * s) { Dict_node *pred, *pred_parent; Dict_node *parent, *to_be_deleted; if (!find_one_non_idiom_node(NULL, dict->root, s, &parent, &to_be_deleted)) return FALSE; for(;;) { /* now parent and to_be_deleted are set */ if (to_be_deleted->file != NULL) { to_be_deleted->file->changed = TRUE; } if (to_be_deleted->left == NULL) { set_parent_of_node(dict, parent, to_be_deleted, to_be_deleted->right); free_dict_node(to_be_deleted); } else { pred_parent = to_be_deleted; pred = to_be_deleted->left; while(pred->right != NULL) { pred_parent = pred; pred = pred->right; } to_be_deleted->string = pred->string; to_be_deleted->file = pred->file; to_be_deleted->exp = pred->exp; set_parent_of_node(dict, pred_parent, pred, pred->left); free_dict_node(pred); } if (!find_one_non_idiom_node(NULL, dict->root, s, &parent, &to_be_deleted)) return TRUE; } } static void free_Word_file(Word_file * wf) { Word_file *wf1; for (;wf != NULL; wf = wf1) { wf1 = wf->next; xfree((char *) wf, sizeof(Word_file)); } } /** * The following two functions free the Exp s and the * E_lists of the dictionary. Not to be confused with * free_E_list in utilities.c */ static void free_Elist(E_list * l) { E_list * l1; for (; l != NULL; l = l1) { l1 = l->next; xfree(l, sizeof(E_list)); } } static void free_Exp_list(Exp * e) { Exp * e1; for (; e != NULL; e = e1) { e1 = e->next; if (e->type != CONNECTOR_type) { free_Elist(e->u.l); } exp_free(e); } } void free_dictionary(Dictionary dict) { free_dict_node_recursive(dict->root); free_Word_file(dict->word_file_header); free_Exp_list(dict->exp_list); } /** * dict_display_word_info() - display the information about the given word. */ void dict_display_word_info(Dictionary dict, const char * s) { Dict_node *dn, *dn_head; Disjunct * d1, * d2; int len; dn_head = dictionary_lookup_list(dict, s); if (dn_head == NULL) { printf(" \"%s\" matches nothing in the dictionary.\n", s); return; } printf("Matches:\n"); for (dn = dn_head; dn != NULL; dn = dn->right) { len = 0; d1 = build_disjuncts_for_dict_node(dn); for(d2 = d1 ; d2 != NULL; d2 = d2->next) { len++; } free_disjuncts(d1); printf(" "); left_print_string(stdout, dn->string, " "); printf(" %5d disjuncts ", len); if (dn->file != NULL) { printf("<%s>", dn->file->file); } printf("\n"); } free_lookup_list(dn_head); return; } /** * dict_display_word_expr() - display the connector info for a given word. */ void dict_display_word_expr(Dictionary dict, const char * s) { Dict_node *dn, *dn_head; dn_head = dictionary_lookup_list(dict, s); if (dn_head == NULL) { printf(" \"%s\" matches nothing in the dictionary.\n", s); return; } printf("\nExpressions:\n"); for (dn = dn_head; dn != NULL; dn = dn->right) { printf(" "); left_print_string(stdout, dn->string, " "); print_expression(dn->exp); printf("\n\n"); } free_lookup_list(dn_head); return; } link-grammar-4.7.4/link-grammar/pp_knowledge.c0000644000175000017500000003154311251761436020330 0ustar bloombloom/*************************************************************************/ /* Copyright (c) 2004 */ /* Daniel Sleator, David Temperley, and John Lafferty */ /* All rights reserved */ /* */ /* Use of the link grammar parsing system is subject to the terms of the */ /* license set forth in the LICENSE file included with this software, */ /* and also available at http://www.link.cs.cmu.edu/link/license.html */ /* This license allows free redistribution and use in source and binary */ /* forms, with or without modification, subject to certain conditions. */ /* */ /*************************************************************************/ /*********************************************************************** pp_knowledge.c 7/97 Contains rules and associated information for post processing. This information is supplied in a human-readable file and is parsed by pp_lexer.h ***********************************************************************/ #include #include "error.h" #include "utilities.h" #define PP_MAX_UNIQUE_LINK_NAMES 1024 /* just needs to be approximate */ /****************** non-exported functions ***************************/ static void check_domain_is_legal(const char *p) { if (0x0 != p[1]) { prt_error("Fatal Error: post_process(): Domain (%s) must be a single character", p); exit(1); } } static void initialize_set_of_links_starting_bounded_domain(pp_knowledge *k) { int i,j,d,domain_of_rule; k->set_of_links_starting_bounded_domain = pp_linkset_open(PP_MAX_UNIQUE_LINK_NAMES); for (i=0; k->bounded_rules[i].msg!=0; i++) { domain_of_rule = k->bounded_rules[i].domain; for (j=0; (d=(k->starting_link_lookup_table[j].domain))!=-1; j++) if (d==domain_of_rule) pp_linkset_add(k->set_of_links_starting_bounded_domain, k->starting_link_lookup_table[j].starting_link); } } /** * Read table of [link, domain type]. * This tells us what domain type each link belongs to. * This lookup table *must* be defined in the knowledge file. */ static void read_starting_link_table(pp_knowledge *k) { const char *p; const char label[] = "STARTING_LINK_TYPE_TABLE"; int i, n_tokens; if (!pp_lexer_set_label(k->lt, label)) { prt_error("Fatal error: post_process: Couldn't find starting link table %s",label); exit(1); } n_tokens = pp_lexer_count_tokens_of_label(k->lt); if (n_tokens %2) { prt_error("Fatal error: post_process: Link table must have format [ ]+"); exit(1); } k->nStartingLinks = n_tokens/2; k->starting_link_lookup_table = (StartingLinkAndDomain*) xalloc((1+k->nStartingLinks)*sizeof(StartingLinkAndDomain)); for (i=0; inStartingLinks; i++) { /* read the starting link itself */ k->starting_link_lookup_table[i].starting_link = string_set_add(pp_lexer_get_next_token_of_label(k->lt),k->string_set); /* read the domain type of the link */ p = pp_lexer_get_next_token_of_label(k->lt); check_domain_is_legal(p); k->starting_link_lookup_table[i].domain = (int) p[0]; } /* end sentinel */ k->starting_link_lookup_table[k->nStartingLinks].domain = -1; } static pp_linkset *read_link_set(pp_knowledge *k, const char *label, String_set *ss) { /* read link set, marked by label in knowledge file, into a set of links whose handle is returned. Return NULL if link set not defined in file, in which case the set is taken to be empty. */ int n_strings,i; pp_linkset *ls; if (!pp_lexer_set_label(k->lt, label)) { if (verbosity>0) printf("PP warning: Link set %s not defined: assuming empty.\n",label); n_strings = 0; } else n_strings = pp_lexer_count_tokens_of_label(k->lt); ls = pp_linkset_open(n_strings); for (i=0; ilt),ss)); return ls; } static void read_link_sets(pp_knowledge *k) { String_set *ss = k->string_set; /* shorthand */ k->domain_starter_links =read_link_set(k,"DOMAIN_STARTER_LINKS",ss); k->urfl_domain_starter_links=read_link_set(k,"URFL_DOMAIN_STARTER_LINKS",ss); k->domain_contains_links =read_link_set(k,"DOMAIN_CONTAINS_LINKS",ss); k->ignore_these_links =read_link_set(k,"IGNORE_THESE_LINKS",ss); k->restricted_links =read_link_set(k,"RESTRICTED_LINKS",ss); k->must_form_a_cycle_links =read_link_set(k,"MUST_FORM_A_CYCLE_LINKS",ss); k->urfl_only_domain_starter_links= read_link_set(k,"URFL_ONLY_DOMAIN_STARTER_LINKS",ss); k->left_domain_starter_links=read_link_set(k,"LEFT_DOMAIN_STARTER_LINKS",ss); } static void free_link_sets(pp_knowledge *k) { pp_linkset_close(k->domain_starter_links); pp_linkset_close(k->urfl_domain_starter_links); pp_linkset_close(k->domain_contains_links); pp_linkset_close(k->ignore_these_links); pp_linkset_close(k->restricted_links); pp_linkset_close(k->must_form_a_cycle_links); pp_linkset_close(k->urfl_only_domain_starter_links); pp_linkset_close(k->left_domain_starter_links); } static void read_connected_rule(pp_knowledge *k, const char *label) { /* This is a degenerate class of rules: either a single rule asserting connectivity is there, or it isn't. The only information in the rule (besides its presence) is the error message to display if the rule is violated */ k->connected_rules = (pp_rule *) xalloc (sizeof(pp_rule)); if (!pp_lexer_set_label(k->lt, label)) { k->connected_rules[0].msg=0; /* rule not there */ if (verbosity>0) printf("PP warning: Not using 'link is connected' rule\n"); return; } if (pp_lexer_count_tokens_of_label(k->lt)>1) { prt_error("Fatal Error: post_process(): Invalid syntax in %s", label); exit(1); } k->connected_rules[0].msg = string_set_add(pp_lexer_get_next_token_of_label(k->lt), k->string_set); } static void read_form_a_cycle_rules(pp_knowledge *k, const char *label) { int n_commas, n_tokens, r, i; pp_linkset *lsHandle; const char **tokens; if (!pp_lexer_set_label(k->lt, label)) { k->n_form_a_cycle_rules = 0; if (verbosity>0) printf("PP warning: Not using any 'form a cycle' rules\n"); } else { n_commas = pp_lexer_count_commas_of_label(k->lt); k->n_form_a_cycle_rules = (n_commas + 1)/2; } k->form_a_cycle_rules= (pp_rule*) xalloc ((1+k->n_form_a_cycle_rules)*sizeof(pp_rule)); for (r=0; rn_form_a_cycle_rules; r++) { /* read link set */ tokens = pp_lexer_get_next_group_of_tokens_of_label(k->lt, &n_tokens); if (n_tokens <= 0) { prt_error("Fatal Error: syntax error in knowledge file"); exit(1); } lsHandle = pp_linkset_open(n_tokens); for (i=0; istring_set)); k->form_a_cycle_rules[r].link_set=lsHandle; /* read error message */ tokens = pp_lexer_get_next_group_of_tokens_of_label(k->lt, &n_tokens); if (n_tokens > 1) { prt_error("Fatal Error: post_process: Invalid syntax (rule %i of %s)",r+1,label); exit(1); } k->form_a_cycle_rules[r].msg=string_set_add(tokens[0],k->string_set); } /* sentinel entry */ k->form_a_cycle_rules[k->n_form_a_cycle_rules].msg = 0; } static void read_bounded_rules(pp_knowledge *k, const char *label) { const char **tokens; int n_commas, n_tokens, r; if (!pp_lexer_set_label(k->lt, label)) { k->n_bounded_rules = 0; if (verbosity>0) printf("PP warning: Not using any 'bounded' rules\n"); } else { n_commas = pp_lexer_count_commas_of_label(k->lt); k->n_bounded_rules = (n_commas + 1)/2; } k->bounded_rules = (pp_rule*) xalloc ((1+k->n_bounded_rules)*sizeof(pp_rule)); for (r=0; rn_bounded_rules; r++) { /* read domain */ tokens = pp_lexer_get_next_group_of_tokens_of_label(k->lt, &n_tokens); if (n_tokens!=1) { prt_error("Fatal Error: post_process: Invalid syntax: rule %i of %s",r+1,label); exit(1); } k->bounded_rules[r].domain = (int) tokens[0][0]; /* read error message */ tokens = pp_lexer_get_next_group_of_tokens_of_label(k->lt, &n_tokens); if (n_tokens!=1) { prt_error("Fatal Error: post_process: Invalid syntax: rule %i of %s",r+1,label); exit(1); } k->bounded_rules[r].msg = string_set_add(tokens[0], k->string_set); } /* sentinel entry */ k->bounded_rules[k->n_bounded_rules].msg = 0; } static void read_contains_rules(pp_knowledge *k, const char *label, pp_rule **rules, int *nRules) { /* Reading the 'contains_one_rules' and reading the 'contains_none_rules' into their respective arrays */ int n_commas, n_tokens, i, r; const char *p; const char **tokens; if (!pp_lexer_set_label(k->lt, label)) { *nRules = 0; if (verbosity>0) printf("PP warning: Not using any %s rules\n", label); } else { n_commas = pp_lexer_count_commas_of_label(k->lt); *nRules = (n_commas + 1)/3; } *rules = (pp_rule*) xalloc ((1+*nRules)*sizeof(pp_rule)); for (r=0; r<*nRules; r++) { /* first read link */ tokens = pp_lexer_get_next_group_of_tokens_of_label(k->lt, &n_tokens); if (n_tokens>1) { prt_error("Fatal Error: post_process: Invalid syntax in %s (rule %i)",label,r+1); exit(1); } (*rules)[r].selector = string_set_add(tokens[0], k->string_set); /* read link set */ tokens = pp_lexer_get_next_group_of_tokens_of_label(k->lt, &n_tokens); (*rules)[r].link_set = pp_linkset_open(n_tokens); (*rules)[r].link_set_size = n_tokens; (*rules)[r].link_array = (const char **) xalloc((1+n_tokens)*sizeof(const char*)); for (i=0; istring_set); pp_linkset_add((*rules)[r].link_set, p); (*rules)[r].link_array[i] = p; } (*rules)[r].link_array[i]=0; /* NULL-terminator */ /* read error message */ tokens = pp_lexer_get_next_group_of_tokens_of_label(k->lt, &n_tokens); if (n_tokens>1) { prt_error("Fatal Error: post_process: Invalid syntax in %s (rule %i)",label,r+1); exit(1); } (*rules)[r].msg = string_set_add(tokens[0], k->string_set); } /* sentinel entry */ (*rules)[*nRules].msg = 0; } static void read_rules(pp_knowledge *k) { read_form_a_cycle_rules(k, "FORM_A_CYCLE_RULES"); read_connected_rule(k, "CONNECTED_RULES"); read_bounded_rules(k, "BOUNDED_RULES"); read_contains_rules(k, "CONTAINS_ONE_RULES" , &(k->contains_one_rules), &(k->n_contains_one_rules)); read_contains_rules(k, "CONTAINS_NONE_RULES", &(k->contains_none_rules), &(k->n_contains_none_rules)); } static void free_rules(pp_knowledge *k) { int r; int rs=sizeof(pp_rule); pp_rule *rule; for (r=0; k->contains_one_rules[r].msg!=0; r++) { rule = &(k->contains_one_rules[r]); /* shorthand */ xfree((void*) rule->link_array, (1+rule->link_set_size)*sizeof(char*)); pp_linkset_close(rule->link_set); } for (r=0; k->contains_none_rules[r].msg!=0; r++) { rule = &(k->contains_none_rules[r]); /* shorthand */ xfree((void *)rule->link_array, (1+rule->link_set_size)*sizeof(char*)); pp_linkset_close(rule->link_set); } for (r=0; rn_form_a_cycle_rules; r++) pp_linkset_close(k->form_a_cycle_rules[r].link_set); xfree((void*)k->bounded_rules, rs*(1+k->n_bounded_rules)); xfree((void*)k->connected_rules, rs); xfree((void*)k->form_a_cycle_rules, rs*(1+k->n_form_a_cycle_rules)); xfree((void*)k->contains_one_rules, rs*(1+k->n_contains_one_rules)); xfree((void*)k->contains_none_rules, rs*(1+k->n_contains_none_rules)); } /********************* exported functions ***************************/ pp_knowledge *pp_knowledge_open(const char *path) { /* read knowledge from disk into pp_knowledge */ FILE *f = dictopen(path, "r"); pp_knowledge *k = (pp_knowledge *) xalloc (sizeof(pp_knowledge)); if (!f) { prt_error("Fatal Error: Couldn't find post-process knowledge file %s", path); exit(1); } k->lt = pp_lexer_open(f); fclose(f); k->string_set = string_set_create(); k->path = string_set_add(path, k->string_set); read_starting_link_table(k); read_link_sets(k); read_rules(k); initialize_set_of_links_starting_bounded_domain(k); return k; } void pp_knowledge_close(pp_knowledge *k) { /* clear the memory taken up by k */ xfree((void*)k->starting_link_lookup_table, ((1+k->nStartingLinks)*sizeof(StartingLinkAndDomain))); free_link_sets(k); free_rules(k); pp_linkset_close(k->set_of_links_starting_bounded_domain); string_set_delete(k->string_set); pp_lexer_close(k->lt); xfree((void*)k, sizeof(pp_knowledge)); } link-grammar-4.7.4/link-grammar/corpus/0000755000175000017500000000000011531775722017017 5ustar bloombloomlink-grammar-4.7.4/link-grammar/corpus/corpus.c0000644000175000017500000002651411245057777020513 0ustar bloombloom/* * corpus.c * * Data for corpus statistics, used to provide a parse ranking * to drive the SAT solver, as well as parse ranking with the * ordinary solver. * * Copyright (c) 2008, 2009 Linas Vepstas */ #include #include #include #include #include "corpus.h" #include "../api-structures.h" #include "../disjuncts.h" #include "../utilities.h" struct corpus_s { char * dbname; sqlite3 *dbconn; sqlite3_stmt *rank_query; sqlite3_stmt *sense_query; char *errmsg; int rc; }; struct sense_s { int word; const char * inflected_word; const char * disjunct; char * sense; double score; Sense *next; }; /* ========================================================= */ static void * db_file_open(const char * dbname, void * user_data) { Corpus *c = (Corpus *) user_data; int rc; sqlite3 *dbconn; c->rc = sqlite3_open_v2(dbname, &dbconn, SQLITE_OPEN_READONLY, NULL); if (c->rc) { sqlite3_close(dbconn); return NULL; } c->dbname = strdup(dbname); return dbconn; } /** * Initialize the corpus statistics subsystem. */ Corpus * lg_corpus_new(void) { int rc; Corpus *c = (Corpus *) malloc(sizeof(Corpus)); c->rank_query = NULL; c->sense_query = NULL; c->errmsg = NULL; c->dbname = NULL; /* dbname = "/link-grammar/data/en/sql/disjuncts.db"; */ #define DBNAME "sql/disjuncts.db" c->dbconn = object_open(DBNAME, db_file_open, c); if (NULL == c->dbconn) { /* Very weird .. but if the database is not found, then sqlite * reports an "out of memory" error! So hide this misleading * error message. */ if (SQLITE_CANTOPEN == c->rc) { prt_error("Warning: Can't open database: File not found\n" "\tWas looking for: " DBNAME); } else { prt_error("Warning: Can't open database: %s\n" "\tWas looking for: " DBNAME, sqlite3_errmsg(c->dbconn)); } return c; } /* Now prepare the statements we plan to use */ rc = sqlite3_prepare_v2(c->dbconn, "SELECT log_cond_probability FROM Disjuncts " "WHERE inflected_word = ? AND disjunct = ?;", -1, &c->rank_query, NULL); if (rc != SQLITE_OK) { prt_error("Error: Can't prepare the ranking statment: %s\n", sqlite3_errmsg(c->dbconn)); } /* Results are returned in sorted order .. would it be faster * to sort locally? Don't know ... */ rc = sqlite3_prepare_v2(c->dbconn, "SELECT word_sense, log_cond_probability FROM DisjunctSenses " "WHERE inflected_word = ? AND disjunct = ? " "ORDER BY log_cond_probability ASC;", -1, &c->sense_query, NULL); if (rc != SQLITE_OK) { prt_error("Error: Can't prepare the sense statment: %s\n", sqlite3_errmsg(c->dbconn)); } prt_error("Info: Corpus statistics database found at %s\n", c->dbname); return c; } /** * lg_corpus_delete -- shut down the corpus statistics subsystem. */ void lg_corpus_delete(Corpus *c) { if (NULL == c) return; if (c->rank_query) { sqlite3_finalize(c->rank_query); c->rank_query = NULL; } if (c->sense_query) { sqlite3_finalize(c->sense_query); c->sense_query = NULL; } if (c->dbconn) { sqlite3_close(c->dbconn); c->dbconn = NULL; } if (c->dbname) { free(c->dbname); c->dbname = NULL; } free(c); } /* ========================================================= */ /* LOW_SCORE is what is assumed if a disjunct-word pair is not found * in the dictionary. It is meant to be -log_2(prob(d|w)) where * prob(d|w) is the conditional probability of seeing the disjunct d * given the word w. A value of 17 is about equal to 1 in 100,000. */ #define LOW_SCORE 17.0 /** * get_disjunct_score -- get log probability of observing disjunt. * * Given an "inflected" word and a disjunct, thris routine returns the * -log_2 conditional probability prob(d|w) of seeing the disjunct 'd' * given that the word 'w' was observed. Here, "inflected word" means * the link-grammar dictionary entry, complete with its trailing period * and tag -- e.g. run.v or running.g -- everything after the dot is the * "inflection". */ static double get_disjunct_score(Corpus *corp, const char * inflected_word, const char * disjunct) { double val; int rc; /* Look up the disjunct in the database */ rc = sqlite3_bind_text(corp->rank_query, 1, inflected_word, -1, SQLITE_STATIC); if (rc != SQLITE_OK) { prt_error("Error: SQLite can't bind word: rc=%d \n", rc); return LOW_SCORE; } rc = sqlite3_bind_text(corp->rank_query, 2, disjunct, -1, SQLITE_STATIC); if (rc != SQLITE_OK) { prt_error("Error: SQLite can't bind disjunct: rc=%d \n", rc); return LOW_SCORE; } rc = sqlite3_step(corp->rank_query); if (rc != SQLITE_ROW) { val = LOW_SCORE; #ifdef DEBUG printf ("Word=%s dj=%s not found in dict, assume score=%f\n", inflected_word, disjunct, val); #endif } else { val = sqlite3_column_double(corp->rank_query, 0); if (LOW_SCORE < val) val = LOW_SCORE; #ifdef DEBUG printf ("Word=%s dj=%s score=%f\n", inflected_word, disjunct, val); #endif } /* Failure to do both a reset *and* a clear will cause subsequent * binds tp fail. */ sqlite3_reset(corp->rank_query); sqlite3_clear_bindings(corp->rank_query); return val; } /* ========================================================= */ /** * lg_corpus_score -- compute parse-ranking score for sentence. * * Given a parsed sentence, this routine will compute a parse ranking * score, based on the probabilites of observing the indicated set of * disjuncts in the statistics database. * * The score is stored in the Linkage_info->corpus_cost struct member. * * The score is currently computed as the average -log_2 conditional * probability p(d|w) of observing disjunct 'd', given word 'w'. * Lower scores are better -- they indicate more likely parses. */ void lg_corpus_score(Sentence sent, Linkage_info *lifo) { const char *infword, *djstr; double tot_score = 0.0f; Corpus *corp = sent->dict->corpus; int nwords = sent->length; int w; /* No-op if the database is not open */ if (NULL == corp->dbconn) return; lg_compute_disjunct_strings(sent, lifo); /* Decrement nwords, so as to ignore the RIGHT-WALL */ nwords --; /* Loop over each word in the sentence (skipping LEFT-WALL, which is * word 0. */ for (w=1; wparse_info->chosen_disjuncts[w]; /* disj is NULL if word did not participate in parse */ if (NULL == disj) { tot_score += LOW_SCORE; continue; } infword = disj->string; djstr = lifo->disjunct_list_str[w]; tot_score += get_disjunct_score(corp, infword, djstr); } /* Decrement nwords, so as to ignore the LEFT-WALL */ --nwords; tot_score /= nwords; lifo->corpus_cost = tot_score; } double lg_corpus_disjunct_score(Linkage linkage, int w) { double score; const char *infword, *djstr; Sentence sent = linkage->sent; Linkage_info *lifo = linkage->info; Corpus *corp = sent->dict->corpus; Disjunct *disj; /* No-op if the database is not open */ if (NULL == corp->dbconn) return LOW_SCORE; /* disj is NULL if word did not participate in parse */ disj = sent->parse_info->chosen_disjuncts[w]; if (NULL == disj) return LOW_SCORE; lg_compute_disjunct_strings(sent, lifo); infword = disj->string; djstr = lifo->disjunct_list_str[w]; score = get_disjunct_score(corp, infword, djstr); return score; } /* ========================================================= */ /** * lg_corpus_senses -- Given word and disjunct, look up senses. * * Given a particular disjunct for a word, look up its most * likely sense assignments from the database. */ static Sense * lg_corpus_senses(Corpus *corp, const char * inflected_word, const char * disjunct, int wrd) { double log_prob; const unsigned char *sense; Sense *sns, *head = NULL; int rc; /* Look up the disjunct in the database */ rc = sqlite3_bind_text(corp->sense_query, 1, inflected_word, -1, SQLITE_STATIC); if (rc != SQLITE_OK) { prt_error("Error: SQLite can't bind word in sense query: rc=%d \n", rc); return NULL; } rc = sqlite3_bind_text(corp->sense_query, 2, disjunct, -1, SQLITE_STATIC); if (rc != SQLITE_OK) { prt_error("Error: SQLite can't bind disjunct in sense query: rc=%d \n", rc); return NULL; } rc = sqlite3_step(corp->sense_query); while (SQLITE_ROW == rc) { sense = sqlite3_column_text(corp->sense_query, 0); log_prob = sqlite3_column_double(corp->sense_query, 1); // printf ("Word=%s dj=%s sense=%s score=%f\n", // inflected_word, disjunct, sense, log_prob); sns = (Sense *) malloc(sizeof(Sense)); sns->next = head; head = sns; sns->inflected_word = inflected_word; sns->disjunct = disjunct; sns->sense = strdup(sense); sns->score = log_prob; sns->word = wrd; /* Get the next row, if any */ rc = sqlite3_step(corp->sense_query); } /* Failure to do both a reset *and* a clear will cause subsequent * binds tp fail. */ sqlite3_reset(corp->sense_query); sqlite3_clear_bindings(corp->sense_query); return head; } /* ========================================================= */ /** * lg_corpus_linkage_senses -- Given a linkage, look up senses. * * Given a particular linakge, look up the most likely sense * assignments from the database. * * This function is not used to guide the parsing process; it is * only an informational look-up. */ void lg_corpus_linkage_senses(Linkage linkage) { const char * infword; Sentence sent = linkage->sent; Dictionary dict = sent->dict; Corpus *corp = dict->corpus; int nwords = sent->length; Linkage_info *lifo = linkage->info; int w; if (lifo->sense_list) return; /* Set up the disjunct strings first */ lg_compute_disjunct_strings(sent, lifo); lifo->nwords = nwords; lifo->sense_list = (Sense **) malloc(nwords * sizeof (Sense *)); memset(lifo->sense_list, 0, nwords * sizeof (Sense *)); /* Decrement nwords, so as to ignore the RIGHT-WALL */ nwords --; /* Loop over each word in the sentence (skipping LEFT-WALL, which is * word 0. */ for (w=1; wparse_info->chosen_disjuncts[w]; /* disj is NULL if word did not participate in parse */ if (NULL == disj) { continue; } infword = disj->string; lifo->sense_list[w] = lg_corpus_senses(corp, infword, lifo->disjunct_list_str[w], w); } } /* ========================================================= */ /* Return bits and pieces of the sense assignments */ Sense * lg_get_word_sense(Linkage_info *lifo, int word) { if (!lifo->sense_list) return NULL; if (lifo->nwords <= word) return NULL; return lifo->sense_list[word]; } Sense * lg_sense_next(Sense *sns) { return sns->next; } int lg_sense_get_index(Sense *sns) { return sns->word; } const char * lg_sense_get_subscripted_word(Sense *sns) { return sns->inflected_word; } const char * lg_sense_get_disjunct(Sense *sns) { return sns->disjunct; } const char * lg_sense_get_sense(Sense *sns) { return sns->sense; } double lg_sense_get_score(Sense *sns) { return sns->score; } void lg_sense_delete(Linkage_info *lifo) { size_t nwords = lifo->nwords; size_t w; if (NULL == lifo->sense_list) return; for (w=0; wsense_list[w]; while (sns) { Sense * nxt = sns->next; free(sns->sense); free(sns); sns = nxt; } } free (lifo->sense_list); lifo->sense_list = NULL; } /* ======================= END OF FILE ===================== */ link-grammar-4.7.4/link-grammar/corpus/corpus.h0000644000175000017500000000274111240625313020472 0ustar bloombloom/* * corpus.h * * Data for corpus statistics, used to provide a parse ranking * to drive the SAT solver, as well as parse ranking with the * ordinary solver. * * Copyright (c) 2008, 2009 Linas Vepstas */ #ifndef _LINKGRAMMAR_CORPUS_H #define _LINKGRAMMAR_CORPUS_H #ifdef USE_CORPUS #include "../api-types.h" #include "../link-includes.h" Corpus * lg_corpus_new(void); void lg_corpus_delete(Corpus *); void lg_corpus_score(Sentence, Linkage_info *); double lg_corpus_disjunct_score(Linkage linkage, int w); void lg_corpus_linkage_senses(Linkage); Sense * lg_get_word_sense(Linkage_info *, int word); Sense * lg_sense_next(Sense *); int lg_sense_get_index(Sense *); const char * lg_sense_get_subscripted_word(Sense *); const char * lg_sense_get_disjunct(Sense *); const char * lg_sense_get_sense(Sense *); double lg_sense_get_score(Sense *); void lg_sense_delete(Linkage_info *); #else /* USE_CORPUS */ static inline void lg_corpus_score(Sentence s, Linkage_info *li) {} static inline void lg_corpus_linkage_senses(Linkage l) {} static inline Sense * lg_get_word_sense(Linkage_info *lif, int word) { return NULL; } static inline Sense * lg_sense_next(Sense *s ) {return NULL; } static inline const char * lg_sense_get_sense(Sense *s) { return NULL; } static inline double lg_sense_get_score(Sense *s) { return 0.0; } static inline double lg_corpus_disjunct_score(Linkage linkage, int w) { return 998.0; } #endif /* USE_CORPUS */ #endif /* _LINKGRAMMAR_CORPUS_H */ link-grammar-4.7.4/link-grammar/corpus/cluster-pop.c0000644000175000017500000001312511241367502021431 0ustar bloombloom/* * cluster-pop.c * * Populate the cluster database with a precomputed collection of * disjuncts. This is a stand-alone program that is used to generate * the cluster-disjunct table, which is used only as a lookup table * during parsing. * * Copyright (c) 2009 Linas Vepstas */ #include #include #include #include #include "../build-disjuncts.h" #include "../externs.h" #include "../disjunct-utils.h" #include "../link-includes.h" #include "../read-dict.h" #include "../structures.h" int main (int argc, char * argv[]) { sqlite3 *dbconn; const char * dbname = "../../data/sql/clusters.db"; setlocale(LC_CTYPE, "en_US.UTF-8"); /* Open the database for update */ int rc = sqlite3_open_v2(dbname, &dbconn, SQLITE_OPEN_READWRITE, NULL); if (rc) { fprintf(stderr, "Error: cannot open the database\n"); sqlite3_close(dbconn); exit(1); } /* ------------------------------------------------- */ /* Prepare assorted queries */ sqlite3_stmt *cluname_query; rc = sqlite3_prepare_v2(dbconn, "SELECT DISTINCT cluster_name FROM ClusterMembers;", -1, &cluname_query, NULL); if (rc != SQLITE_OK) { fprintf(stderr, "Error: cannot prepare cluster-name stmt\n"); sqlite3_close(dbconn); exit(1); } /* ---- */ sqlite3_stmt *cluword_query; rc = sqlite3_prepare_v2(dbconn, "SELECT inflected_word FROM ClusterMembers WHERE cluster_name = ?;", -1, &cluword_query, NULL); if (rc != SQLITE_OK) { fprintf(stderr, "Error: cannot prepare cluword select stmt\n"); sqlite3_close(dbconn); exit(1); } /* ---- */ sqlite3_stmt *cludelete; rc = sqlite3_prepare_v2(dbconn, "DELETE FROM ClusterMembers WHERE cluster_name = ?;", -1, &cludelete, NULL); if (rc != SQLITE_OK) { fprintf(stderr, "Error: cannot prepare cluster delete stmt\n"); sqlite3_close(dbconn); exit(1); } /* ---- */ sqlite3_stmt *djinsert; rc = sqlite3_prepare_v2(dbconn, "INSERT INTO ClusterDisjuncts (cluster_name, disjunct, cost) " "VALUES (?,?,?);", -1, &djinsert, NULL); if (rc != SQLITE_OK) { fprintf(stderr, "Error: cannot prepare dj insert stmt\n"); sqlite3_close(dbconn); exit(1); } /* ------------------------------------------------- */ /* Open the dictionary */ Dictionary dict = dictionary_create_default_lang(); if (NULL == dict) { fprintf(stderr, "Error: couldn't read the dict\n"); exit(1); } /* Loop over all cluster names */ int clu_cnt = 0; int rec_cnt = 0; int dj_cnt = 0; int wrd_cnt = 0; int warn_cnt = 0; int del_cnt = 0; while(1) { rc = sqlite3_step(cluname_query); if (rc != SQLITE_ROW) break; const char * cluname = sqlite3_column_text(cluname_query,0); Disjunct *dj_union = NULL; int do_keep = 0; printf("Info: Processing cluster %s\n", cluname); rc = sqlite3_bind_text(cluword_query, 1, cluname, -1, SQLITE_STATIC); while(1) { rc = sqlite3_step(cluword_query); if (rc != SQLITE_ROW) break; const char * cluword = sqlite3_column_text(cluword_query,0); Dict_node *dn = dictionary_lookup_list(dict, cluword); if (NULL == dn) continue; Disjunct *dj = build_disjuncts_for_dict_node(dn); if (strcmp(dj->string, cluword)) { if (strncmp(dj->string, cluword, strlen(cluword))) { printf ("Error: asked for %s got %s\n", cluword, dj->string); // exit(1); } else { printf ("Warning: asked for %s got %s\n", cluword, dj->string); } warn_cnt++; free_disjuncts(dj); continue; } Disjunct *d = dj; int cnt = 0; while(d) { d->string = cluword; d = d->next; cnt ++; } dj_union = catenate_disjuncts(dj_union, dj); dj_union = eliminate_duplicate_disjuncts(dj_union); int ucnt = count_disjuncts(dj_union); if (cnt != ucnt) do_keep = 1; printf("\tprocessing word %s with %d disjuncts\n", cluword, cnt); wrd_cnt ++; } clu_cnt ++; if (do_keep) { int cnt = count_disjuncts(dj_union); printf("\tWill record %s of %d disjuncts\n", cluname, cnt); Disjunct *d = dj_union; while(d) { char * sdj = print_one_disjunct(d); // printf("duude %s -- %s\n", cluname, sdj); double cost = d->cost; rc = sqlite3_bind_text(djinsert, 1, cluname, -1, SQLITE_STATIC); rc = sqlite3_bind_text(djinsert, 2, sdj, -1, SQLITE_STATIC); rc = sqlite3_bind_double(djinsert, 3, cost); rc = sqlite3_step(djinsert); if (rc != SQLITE_DONE) { printf("Error: unexpected return value %d on insert!\n", rc); exit(1); } sqlite3_reset(djinsert); sqlite3_clear_bindings(djinsert); free(sdj); d = d->next; } rec_cnt ++; dj_cnt += cnt; } else { printf("\tDeleting pointless cluster %s\n", cluname); rc = sqlite3_bind_text(cludelete, 1, cluname, -1, SQLITE_STATIC); rc = sqlite3_step(cludelete); if (rc != SQLITE_DONE) { printf("Error: unexpected return value %d on delete!\n", rc); exit(1); } sqlite3_reset(cludelete); sqlite3_clear_bindings(cludelete); del_cnt ++; } free_disjuncts(dj_union); sqlite3_reset(cluword_query); sqlite3_clear_bindings(cluword_query); } sqlite3_reset(cluname_query); sqlite3_clear_bindings(cluname_query); sqlite3_close(dbconn); dictionary_delete(dict); printf("Examined %d clusters, recorded %d\n", clu_cnt, rec_cnt); printf("Examined %d words, and %d disjuncts\n", wrd_cnt, dj_cnt); float avg_wrd = ((float) wrd_cnt) / clu_cnt; float avg_dj = ((float) dj_cnt) / rec_cnt; printf("Average %f words/cluster; average %f dj's/recored-cluster\n", avg_wrd, avg_dj); printf("Got %d mismatch warnings\n", warn_cnt); printf("Deleted %d pointless clusters\n", del_cnt); return 0; } link-grammar-4.7.4/link-grammar/corpus/sniff.c0000644000175000017500000000165511122346405020263 0ustar bloombloom #include #include #include static int callback(void *user_data, int argc, char **argv, char **colname) { int i; for (i=0; i */ #include #include #include #include #include "cluster.h" #include "../build-disjuncts.h" #include "../disjunct-utils.h" #include "../structures.h" #include "../utilities.h" struct cluster_s { char * dbname; sqlite3 *dbconn; sqlite3_stmt *clu_query; sqlite3_stmt *dj_query; char *errmsg; int rc; }; /* ========================================================= */ static void * db_file_open(const char * dbname, void * user_data) { Cluster *c = (Cluster *) user_data; int rc; sqlite3 *dbconn; c->rc = sqlite3_open_v2(dbname, &dbconn, SQLITE_OPEN_READONLY, NULL); if (c->rc) { sqlite3_close(dbconn); return NULL; } c->dbname = strdup(dbname); return dbconn; } /** * Initialize the cluster statistics subsystem. */ Cluster * lg_cluster_new(void) { int rc; Cluster *c = (Cluster *) malloc(sizeof(Cluster)); c->clu_query = NULL; c->dj_query = NULL; c->errmsg = NULL; c->dbname = NULL; /* dbname = "/link-grammar/data/en/sql/clusters.db"; */ #define DBNAME "sql/clusters.db" c->dbconn = object_open(DBNAME, db_file_open, c); if (NULL == c->dbconn) { /* Very weird .. but if the database is not found, then sqlite * reports an "out of memory" error! So hide this misleading * error message. */ if (SQLITE_CANTOPEN == c->rc) { prt_error("Warning: Can't open database: File not found\n" "\tWas looking for: " DBNAME); } else { prt_error("Warning: Can't open database: %s\n" "\tWas looking for: " DBNAME, sqlite3_errmsg(c->dbconn)); } return c; } /* Now prepare the statements we plan to use */ rc = sqlite3_prepare_v2(c->dbconn, "SELECT cluster_name FROM ClusterMembers " "WHERE inflected_word = ?;", -1, &c->clu_query, NULL); if (rc != SQLITE_OK) { prt_error("Error: Can't prepare the cluster member statment: %s\n", sqlite3_errmsg(c->dbconn)); } rc = sqlite3_prepare_v2(c->dbconn, "SELECT disjunct, cost FROM ClusterDisjuncts " "WHERE cluster_name = ?;", -1, &c->dj_query, NULL); if (rc != SQLITE_OK) { prt_error("Error: Can't prepare the disjunct statment: %s\n", sqlite3_errmsg(c->dbconn)); } prt_error("Info: Cluster grouping database found at %s\n", c->dbname); return c; } /** * lg_cluster_delete -- shut down the cluster statistics subsystem. */ void lg_cluster_delete(Cluster *c) { if (NULL == c) return; if (c->clu_query) { sqlite3_finalize(c->clu_query); c->clu_query = NULL; } if (c->dj_query) { sqlite3_finalize(c->dj_query); c->dj_query = NULL; } if (c->dbconn) { sqlite3_close(c->dbconn); c->dbconn = NULL; } if (c->dbname) { free(c->dbname); c->dbname = NULL; } free(c); } /* ========================================================= */ static Exp * make_exp(const char *djstr, double cost) { Exp *e = (Exp *) malloc(sizeof(Exp)); e->multi = 0; e->dir = ' '; e->cost = cost; /* If its just a single connector, then do just that */ char *sp = strchr (djstr, ' '); if (NULL == sp || 0x0 == sp[1]) { e->type = CONNECTOR_type; if ('@' == djstr[0]) { e->multi = 1; djstr++; } size_t len = strlen(djstr) - 1; if (sp) len--; e->u.string = strndup(djstr, len); e->dir = djstr[len]; return e; } /* If there are multiple connectors, and them together */ size_t len = sp - djstr; char * tmp = strndup(djstr, len); Exp *p1 = make_exp(tmp, 0.0); free (tmp); Exp *p2 = make_exp(sp+1, 0.0); E_list *l; E_list *lhead = NULL; l = (E_list *) malloc(sizeof(E_list)); l->next = lhead; l->e = p2; lhead = l; l = (E_list *) malloc(sizeof(E_list)); l->next = lhead; l->e = p1; lhead = l; e->type = AND_type; e->u.l = lhead; return e; } #if NOT_NEEDED static Exp * or_exp(Exp *p1, Exp *p2) { if (NULL == p2) return p1; Exp *e = (Exp *) malloc(sizeof(Exp)); e->multi = 0; e->dir = ' '; e->cost = 0.0; e->type = OR_type; E_list *l; E_list *lhead = NULL; l = (E_list *) malloc(sizeof(E_list)); l->next = lhead; l->e = p2; lhead = l; l = (E_list *) malloc(sizeof(E_list)); l->next = lhead; l->e = p1; lhead = l; e->u.l = lhead; return e; } #endif static void free_exp(Exp *e) { if (CONNECTOR_type != e->type) { E_list *l = e->u.l; while(l) { free_exp(l->e); E_list *ln = l->next; free(l); l = ln; } return; } free((char *) e->u.string); free(e); } Disjunct * lg_cluster_get_disjuncts(Cluster *c, const char * wrd) { Disjunct *djl = NULL; int rc; /* Look for a cluster containing this word */ rc = sqlite3_bind_text(c->clu_query, 1, wrd, -1, SQLITE_STATIC); rc = sqlite3_step(c->clu_query); if (rc != SQLITE_ROW) goto noclust; /* Get the cluster name, and look for the disjuncts */ const char * cluname = sqlite3_column_text(c->clu_query,0); rc = sqlite3_bind_text(c->dj_query, 1, cluname, -1, SQLITE_STATIC); while(1) { rc = sqlite3_step(c->dj_query); if (rc != SQLITE_ROW) break; const char * djs = sqlite3_column_text(c->dj_query,0); double cost = sqlite3_column_double(c->dj_query,1); /* All expanded disjuncts are costly! */ // cost += 0.5; cost -= 6.0; if (cost < 0.0) cost = 0.0; /* Building expressions */ Exp *e = make_exp(djs, cost); X_node x; x.exp = e; x.string = wrd; Disjunct *dj = build_disjuncts_for_X_node(&x, MAX_CONNECTOR_COST); djl = catenate_disjuncts(dj, djl); free_exp(e); } sqlite3_reset(c->dj_query); sqlite3_clear_bindings(c->dj_query); noclust: sqlite3_reset(c->clu_query); sqlite3_clear_bindings(c->clu_query); return djl; } /* ======================= END OF FILE ===================== */ link-grammar-4.7.4/link-grammar/corpus/cluster.h0000644000175000017500000000145111241372223020635 0ustar bloombloom/* * cluster.h * * Data for related-word clusters. Meant to expand disjunct covereage * for the case where a parse cannot be completed without ommitting * a word. * * Copyright (c) 2009 Linas Vepstas */ #ifndef _LINKGRAMMAR_CLUSTER_H #define _LINKGRAMMAR_CLUSTER_H #ifdef USE_CORPUS #include "../api-types.h" #include "../link-includes.h" Cluster * lg_cluster_new(void); void lg_cluster_delete(Cluster *); Disjunct * lg_cluster_get_disjuncts(Cluster *, const char * wrd); #else /* USE_CORPUS */ static inline Cluster * lg_cluster_new(void) { return NULL; } static inline void lg_cluster_delete(Cluster *c) {} static inline Disjunct * lg_cluster_get_disjuncts(Cluster *c, const char * wrd) { return NULL; } #endif /* USE_CORPUS */ #endif /* _LINKGRAMMAR_CLUSTER_H */ link-grammar-4.7.4/link-grammar/corpus/Makefile.am0000644000175000017500000000231211261444042021035 0ustar bloombloom# # Makefile.am # Master automake file for building the corpus-statistics tools # DEFS = @DEFS@ -DVERSION=\"@VERSION@\" -DDICTIONARY_DIR=\"$(pkgdatadir)\" INCLUDES = -I$(top_srcdir) $(ANSI_CFLAGS) $(SQLITE3_CFLAGS) if WITH_CORPUS lib_LTLIBRARIES = liblink-corpus.la endif # Undefined symbols are allowed, as otherwise there is a circular # dependenincy on liblink-grammar. # liblink_corpus_la_LDFLAGS = -no-undefined liblink_corpus_la_LIBADD = ${SQLITE3_LIBS} liblink_corpus_la_SOURCES = \ cluster.h \ cluster.c \ corpus.h \ corpus.c EXTRA_DIST= \ README # Don't build the tools by default; only the maintainer (me) needs # to run this tool. # # Specifying the binaries here leads to circular Make dependencies # which I am too lazy to fix. To build the tool, you need to uncomment # the below, then run a two-step build process: # autogen.sh ; make # autogen.sh --enable-corpus-stats ; make # # noinst_PROGRAMS=cluster-pop sniff cluster_pop_SOURCES = cluster-pop.c cluster_pop_LDADD = ${SQLITE3_LIBS} cluster_pop_LDADD += $(top_builddir)/link-grammar/liblink-grammar.la sniff_SOURCES = sniff.c sniff_LDADD = ${SQLITE3_LIBS} link-grammar-4.7.4/link-grammar/corpus/README0000644000175000017500000000134211261444042017663 0ustar bloombloom Parse Ranking and Word Sense Statistics --------------------------------------- This directory contains code that computes a parse ranking, as well as a word-sense probability (based on WordNet 3.0) by looking up frequency statistics from an SQL database. The SQLite database engine is used because it is "administration-free" for the user, and because its license is compatbile with the current link-grammar license. This directory also contains code for "broadening" word linakges. See data/sql/README for more info. This directory contains one administrative tool, "cluster-pop", which is not built by default because users do not need this tool. See the Makefile.am for notes on how to build it. link-grammar-4.7.4/link-grammar/link-features.h.in0000644000175000017500000000157211007703713021025 0ustar bloombloom#ifndef LINK_FEATURES_H #define LINK_FEATURES_H #if defined(_MSC_VER) && !defined(LINK_GRAMMAR_DLL_EXPORT) #define LINK_GRAMMAR_DLL_EXPORT 1 #endif #ifdef __cplusplus # define LINK_BEGIN_DECLS extern "C" { # define LINK_END_DECLS } #else # define LINK_BEGIN_DECLS # define LINK_END_DECLS #endif #ifndef link_public_api # ifdef _MSC_VER # if !defined LINK_GRAMMAR_DLL_EXPORT # error !defined LINK_GRAMMAR_DLL_EXPORT # endif # if LINK_GRAMMAR_DLL_EXPORT # define link_public_api(x) __declspec(dllexport) x # else # define link_public_api(x) __declspec(dllimport) x # endif # else # define link_public_api(x) x # endif #endif #define LINK_MAJOR_VERSION @LINK_MAJOR_VERSION@ #define LINK_MINOR_VERSION @LINK_MINOR_VERSION@ #define LINK_MICRO_VERSION @LINK_MICRO_VERSION@ #define LINK_VERSION_STRING "@LINK_MAJOR_VERSION@.@LINK_MINOR_VERSION@.@LINK_MICRO_VERSION@" #endif link-grammar-4.7.4/link-grammar/spellcheck-hun.c0000644000175000017500000000735511363361772020566 0ustar bloombloom/*************************************************************************/ /* Copyright (c) 2009 Linas Vepstas */ /* Copyright (c) 2009 Vikas N. Kumar */ /* All rights reserved */ /* */ /* Use of the link grammar parsing system is subject to the terms of the */ /* license set forth in the LICENSE file included with this software, */ /* and also available at http://www.link.cs.cmu.edu/link/license.html */ /* This license allows free redistribution and use in source and binary */ /* forms, with or without modification, subject to certain conditions. */ /* */ /*************************************************************************/ #include #include #include "link-includes.h" #include "spellcheck.h" #include "utilities.h" /* For Win32 compatibility */ #ifdef HAVE_HUNSPELL #ifndef HUNSPELL_DICT_DIR #define HUNSPELL_DICT_DIR (char *)0 #endif /* HUNSPELL_DICT_DIR */ static const char *hunspell_dict_dirs[] = { "/usr/share/myspell/dicts", "/usr/share/hunspell/dicts", "/usr/local/share/myspell/dicts", "/usr/local/share/hunspell/dicts", "/usr/share/myspell", "/usr/share/hunspell", "/usr/local/share/myspell", "/usr/local/share/hunspell", HUNSPELL_DICT_DIR }; static const char *spellcheck_lang_mapping[] = { "en" /* link-grammar language */, "en-US" /* hunspell filename */, "en" /* link-grammar language */, "en_US" /* hunspell filename */ }; #define FPATHLEN 256 static char hunspell_aff_file[FPATHLEN]; static char hunspell_dic_file[FPATHLEN]; #include #include void * spellcheck_create(const char * lang) { size_t i = 0, j = 0; Hunhandle *h = NULL; memset(hunspell_aff_file, 0, FPATHLEN); memset(hunspell_dic_file, 0, FPATHLEN); for (i = 0; i < sizeof(spellcheck_lang_mapping)/sizeof(char *); i += 2) { if (0 != strcmp(lang, spellcheck_lang_mapping[i])) continue; /* check in each hunspell_dict_dir if the files exist */ for (j = 0; j < sizeof(hunspell_dict_dirs)/sizeof(char *); ++j) { FILE *fh; /* if the directory name is NULL then ignore */ if (hunspell_dict_dirs[j] == NULL) continue; snprintf(hunspell_aff_file, FPATHLEN, "%s/%s.aff", hunspell_dict_dirs[j], spellcheck_lang_mapping[i+1]); snprintf(hunspell_dic_file, FPATHLEN, "%s/%s.dic", hunspell_dict_dirs[j], spellcheck_lang_mapping[i+1]); /* Some versions of Hunspell_create() will succeed even if * there are no dictionary files. So test for permissions. */ fh = fopen(hunspell_aff_file, "r"); if (fh) fclose (fh); else continue; fh = fopen(hunspell_dic_file, "r"); if (fh) fclose (fh); else continue; h = Hunspell_create(hunspell_aff_file, hunspell_dic_file); /* if hunspell handle was created break from loop */ if (h != NULL) break; } /* if hunspell handle was created break from loop */ if (h != NULL) break; } return h; } void spellcheck_destroy(void * chk) { Hunhandle *h = (Hunhandle *) chk; Hunspell_destroy(h); } /** * Return boolean: 1 if spelling looks good, else zero */ int spellcheck_test(void * chk, const char * word) { if (NULL == chk) { prt_error("Error: no spell-check handle specified!\n"); return 0; } return Hunspell_spell((Hunhandle *)chk, word); } int spellcheck_suggest(void * chk, char ***sug, const char * word) { if (NULL == chk) { prt_error("Error: no spell-check handle specified!\n"); return 0; } return Hunspell_suggest((Hunhandle *)chk, sug, word); } void spellcheck_free_suggest(char **sug, int size) { free(sug); } #endif /* #ifdef HAVE_HUNSPELL */ link-grammar-4.7.4/link-grammar/preparation.h0000644000175000017500000000243011414162142020162 0ustar bloombloom/*************************************************************************/ /* Copyright (c) 2004 */ /* Daniel Sleator, David Temperley, and John Lafferty */ /* All rights reserved */ /* */ /* Use of the link grammar parsing system is subject to the terms of the */ /* license set forth in the LICENSE file included with this software, */ /* and also available at http://www.link.cs.cmu.edu/link/license.html */ /* This license allows free redistribution and use in source and binary */ /* forms, with or without modification, subject to certain conditions. */ /* */ /*************************************************************************/ void free_sentence_expressions(Sentence sent); void free_sentence_disjuncts(Sentence sent); void free_deletable(Sentence sent); void free_effective_dist(Sentence sent); void prepare_to_parse(Sentence sent, Parse_Options opts); void install_fat_connectors(Sentence sent); void build_deletable(Sentence sent, int has_conjunction); void build_effective_dist(Sentence sent, int has_conjunction); link-grammar-4.7.4/link-grammar/api-types.h0000644000175000017500000000552111402773541017565 0ustar bloombloom/*************************************************************************/ /* Copyright (c) 2004 */ /* Daniel Sleator, David Temperley, and John Lafferty */ /* All rights reserved */ /* */ /* Use of the link grammar parsing system is subject to the terms of the */ /* license set forth in the LICENSE file included with this software, */ /* and also available at http://www.link.cs.cmu.edu/link/license.html */ /* This license allows free redistribution and use in source and binary */ /* forms, with or without modification, subject to certain conditions. */ /* */ /*************************************************************************/ #ifndef _API_TYPES_H_ #define _API_TYPES_H_ #define MAX_TOKEN_LENGTH 50 /* maximum number of chars in a token */ /* MAX_SENTENCE cannot be more than 254, because word MAX_SENTENCE+1 is * used to indicate that nothing can connect to this connector, and this * should fit in one byte (if the word field of a connector is an * unsigned char). */ #define MAX_SENTENCE 250 /* maximum number of words in a sentence */ #define MAX_LINKS (2*MAX_SENTENCE-3) /* maximum number of links allowed */ /* "public" typedefs */ typedef struct And_data_s And_data; typedef struct Connector_struct Connector; typedef struct Cost_Model_s Cost_Model; typedef struct Dict_node_struct Dict_node; typedef struct Domain_s Domain; typedef struct DTreeLeaf_s DTreeLeaf; typedef struct Image_node_struct Image_node; typedef struct Label_node_s Label_node; typedef struct Linkage_info_struct Linkage_info; typedef struct Parse_info_struct *Parse_info; typedef struct Postprocessor_s Postprocessor; typedef struct PP_data_s PP_data; typedef struct PP_info_s PP_info; typedef struct Regex_node_s Regex_node; typedef struct Resources_s * Resources; typedef struct Sublinkage_s Sublinkage; /* Some private typedefs */ typedef char Boolean; typedef struct analyze_context_s analyze_context_t; typedef struct count_context_s count_context_t; typedef struct match_context_s match_context_t; typedef struct Connector_set_s Connector_set; typedef struct Disjunct_struct Disjunct; typedef struct Exp_struct Exp; typedef struct E_list_struct E_list; typedef struct Link_s Link; typedef struct List_o_links_struct List_o_links; typedef struct Parse_set_struct Parse_set; typedef struct String_set_s String_set; typedef struct Word_struct Word; typedef struct Word_file_struct Word_file; typedef struct X_table_connector_struct X_table_connector; typedef struct pp_knowledge_s pp_knowledge; typedef struct corpus_s Corpus; typedef struct sense_s Sense; typedef struct cluster_s Cluster; #endif link-grammar-4.7.4/link-grammar/count.h0000644000175000017500000000264211523141521016772 0ustar bloombloom/*************************************************************************/ /* Copyright (c) 2004 */ /* Daniel Sleator, David Temperley, and John Lafferty */ /* All rights reserved */ /* */ /* Use of the link grammar parsing system is subject to the terms of the */ /* license set forth in the LICENSE file included with this software, */ /* and also available at http://www.link.cs.cmu.edu/link/license.html */ /* This license allows free redistribution and use in source and binary */ /* forms, with or without modification, subject to certain conditions. */ /* */ /*************************************************************************/ s64 table_lookup(Sentence, int, int, Connector *, Connector *, int); int do_match(Sentence, Connector *a, Connector *b, int wa, int wb); int x_match(Sentence, Connector *a, Connector *b); s64 do_parse(Sentence sent, int mincost, Parse_Options opts); void conjunction_prune(Sentence sent, Parse_Options opts); void count_set_effective_distance(Sentence sent); void count_unset_effective_distance(Sentence sent); void delete_unmarked_disjuncts(Sentence sent); void init_count(Sentence sent); void free_count(Sentence sent); link-grammar-4.7.4/MAINTAINERS0000644000175000017500000000011610747752074014621 0ustar bloombloomDom Lachowicz (domlachowicz@gmail.com) Linas Vepstas (linasvepstas@gmail.com) link-grammar-4.7.4/link-grammar.spec.in0000644000175000017500000000316710750643120016760 0ustar bloombloom%define name link-grammar %define version @VERSION@ %define release 1 Summary: A Natural Language Parser based on Link Grammar Theory Name: %{name} Version: %{version} Release: %{release} Group: System Environment/Libraries License: LGPL Source: %{name}-%{version}.tar.gz Buildroot: /var/tmp/%{name}-%{version}-%{release}-root URL: http://www.link.cs.cmu.edu/link/ #Requires: #BuildRequires: %description The Link Grammar Parser is a natural language parser based on link grammar theories of natural language. %package devel Summary: Support files necessary to compile applications with link-grammar. Group: Development/Libraries Requires: link-grammar %description devel Libraries, headers, and support files necessary to compile applications using link-grammar. %prep %setup %build %ifarch alpha MYARCH_FLAGS="--host=alpha-redhat-linux" %endif if [ ! -f configure ]; then CFLAGS="$RPM_OPT_FLAGS" ./autogen.sh --prefix=%{_prefix} fi CFLAGS="$RPM_OPT_FLAGS" ./configure --prefix=%{_prefix} if [ "$SMP" != "" ]; then (%__make "MAKE=%__make -k -j $SMP"; exit 0) %__make else %__make fi %install if [ -d $RPM_BUILD_ROOT ]; then rm -r $RPM_BUILD_ROOT; fi %__make DESTDIR=$RPM_BUILD_ROOT install find $RPM_BUILD_ROOT/%{_libdir} -name \*.la -exec rm -f \{\} \; %files %defattr(644,root,root,755) %doc LICENSE README %attr(755,root,root)%{_bindir}/* %{_libdir}/lib*.so* %{_datadir}/link-grammar/* %files devel %defattr(644,root,root,755) %{_libdir}/*.a %{_libdir}/pkgconfig/link-grammar.pc %{_includedir}/link-grammar/* %clean %__rm -r $RPM_BUILD_ROOT %changelog * Sat Feb 5 2005 Dom Lachowicz - Initial version link-grammar-4.7.4/man/0000755000175000017500000000000011531775730013675 5ustar bloombloomlink-grammar-4.7.4/man/.cvsignore0000644000175000017500000000002510772523445015672 0ustar bloombloomMakefile.in Makefile link-grammar-4.7.4/man/link-parser.10000644000175000017500000001221411002136745016174 0ustar bloombloom.\" Hey, EMACS: -*- nroff -*- .\" First parameter, NAME, should be all caps .\" Second parameter, SECTION, should be 1-8, maybe w/ subsection .\" other parameters are allowed: see man(7), man(1) .TH LINK-GRAMMAR 1 "April 18, 2008" .\" Please adjust this date whenever revising the manpage. .\" .\" Some roff macros, for reference: .\" .nh disable hyphenation .\" .hy enable hyphenation .\" .ad l left justify .\" .ad b justify to both left and right margins .\" .nf disable filling .\" .fi enable filling .\" .br insert line break .\" .sp insert n+1 empty lines .\" for manpage-specific macros, see man(7) .SH NAME link-parser \- parses natural language sentences .SH SYNOPSIS .B link-parser .RI [language] [\-pp pp_knowledge_file] [\-c constituent_knowledge_file] [\-a affix_file] [\-ppoff] [\-coff] [\-aoff] [\-batch] [\-] .SH DESCRIPTION .PP .\" TeX users may be more comfortable with the \fB\fP and .\" \fI\fP escape sequences to invode bold face and italics, .\" respectively. In Selator, D. and Temperly, D. "Parsing English with a Link Grammar" (1991), the authors defined a new formal grammatical system called a "link grammar". A sequence of words is in the language of a link grammar if there is a way to draw "links" between words in such a way that the local requirements of each word are satisfied, the links do not cross, and the words form a consistent connected graph. The authors encoded English grammar into such a system, and wrote \fBlink\-parser\fP to parse English using this grammar. .PP This package can be used for linguistic parsing for information retrieval or extraction from natural language documents. Abiword also uses it as a grammar checker. .SH OPTIONS .TP .B \-pp pp_knowledge_file .TP .B \-c constituent_knowledge_file .TP .B \-a affix_file .TP .B \-ppoff .TP .B \-coff .TP .B \-aoff .TP .B \-batch .TP .B \- \"Can special commands be commandline arguments? .SH USE .PP link\-parser, when invoked manually, will take control of the terminal; link\-parser will then attempt to analyze the grammar of all input, unless escaped with an exclamation mark, according to the dictionary file provided as an argument. If escaped, the input will be treated as a "special command"; "!help" lists all special commands available. .PP link\-parser depends on a link\-grammar dictionary which contains lists of words and associated metadata about their grammatical properties in order to analyze sentences. A link\-grammar dictionary provided by the authors of link\-grammar is usually included with the link\-grammar package, and can often be found somewhere in the /usr/share/link\-grammar/ hierarchy. When this is the case, only the two\-letter language code needs to be specified on the command\-line. Alternatively, a user can provide their own dictionary as an argument, in which case the dictionary's directory should be specified. Hence, either of the commands .TP .B link\-parser en .TP .B link\-parser /usr/share/link\-grammar/en will run link\-parser using the english dictionary included with the parser. .PP While in a link\-parser session, some example output could be: .PP .RS .B linkparser> Reading a man page is informative. .PP ++++Time 0.00 seconds (0.01 total) .PP Found 1 linkage (1 had no P.P. violations) Unique linkage, cost vector = (UNUSED=0 DIS=0 AND=0 LEN=12) +------------------------Xp-----------------------+ | +---------Ss*g---------+ | | +-------Os-------+ | | | | +----Ds----+ | | +----Wd---+ | +--AN--+ +---Pa---+ | | | | | | | | | .PP LEFT\-WALL reading.g a man.n page.n is.v informative.a . .RE .PP A P.P. violation is a post-processing violation; it is a post\-linkage step used to reject invalid parses. The link types shown are specific to English; other langauges will have different link types. .PP link\-parser can also be used non\-interactively, either through its API, or via the \-batch option. When used with the \-batch option, link\-parser passively receives input from standard input, and when the stream finishes, it then outputs its analysis. So one could construct an ad\-hoc grammar checker by piping text through link\-parser with a batch option, and seeing what sentences fail to parse as valid: .RS .B cat thesis.txt | link\-parser /usr/share/link\-grammar/en/4.0.dict \-batch .RE .SH SEE ALSO .br Information on the shared\-library API and the link types used in the parse is avavailable at the Abiword website at .B http://www.abisource.com/projects/link-grammar/dict/index.html .br Peer\-reviewed papers explaining link\-parser can be found at the original CMU site at .B http://www.link.cs.cmu.edu/link/papers/index.html. .SH AUTHOR .nh link\-parser was written by Daniel Sleator , Davy Temperley , and John Lafferty .PP This manual page was written by Ken Bloom , for the Debian project (but may be used by others). link-grammar-4.7.4/man/Makefile.am0000644000175000017500000000016211002136745015716 0ustar bloombloom## Process this file with automake to produce Makefile.in. man_MANS = link-parser.1 EXTRA_DIST = link-parser.1 link-grammar-4.7.4/LICENSE0000644000175000017500000000354511526022265014126 0ustar bloombloom LICENSE ------- Copyright (c) 2003,2004 Daniel Sleator, David Temperley, and John Lafferty. All rights reserved. Copyright (c) 2007 Mike Ross. Copyright (c) 2008,2009,2010 Linas Vepstas, Borislav Iordanov. Copyright (c) 2011 Linas Vepstas Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The names "Link Grammar" and "Link Parser" must not be used to endorse or promote products derived from this software without prior written permission. To obtain permission, contact sleator@cs.cmu.edu THIS SOFTWARE IS PROVIDED BY DANIEL SLEATOR, DAVID TEMPERLEY, JOHN LAFFERTY AND OTHER CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. link-grammar-4.7.4/autopackage/0000755000175000017500000000000011531775723015410 5ustar bloombloomlink-grammar-4.7.4/autopackage/.cvsignore0000644000175000017500000000001710772523445017404 0ustar bloombloomdefault.apspec link-grammar-4.7.4/autopackage/default.apspec.in0000644000175000017500000000245711002136745020632 0ustar bloombloom# -*-shell-script-*- [Meta] RootName: @abisource.org/link-grammar:@VERSION@ DisplayName: An english language parser ShortName: link-grammar Maintainer: Link-Grammar Team - http://www.abisource.com/projects/link-grammar/ Packager: Robert Staudinger Summary: An english language parser SoftwareVersion: @VERSION@ AutopackageTarget: 1.0 PackageVersion: 1 # Only uncomment InterfaceVersion if your package exposes interfaces to other software, # for instance if it includes DSOs or python/perl modules. See the developer guide for more info, # or ask on autopackage-dev if you don't understand interface versioning in autopackage. InterfaceVersion: 4.1 [Description] An english language parsrer, based on the theory of link grammars. [BuildPrepare] # create configure wrapper when building out of the source tree if [ ! -e "configure" ] ; then echo '#!/bin/bash' > configure echo '../link-grammar/configure $@' >> configure chmod +x configure fi prepareBuild --prefix=/break/if/binreloc/breaks --enable-binreloc --disable-debug [BuildUnprepare] unprepareBuild [Imports] echo '*' | import [Prepare] # avoid warning echo "nothing to prepare" [Install] #doesn't work installExe ./bin/link-parser installLib ./lib/*.so.*.*.* installData ./share/* [Uninstall] uninstallFromLog link-grammar-4.7.4/COPYING0000644000175000017500000000354511526022265014154 0ustar bloombloom LICENSE ------- Copyright (c) 2003,2004 Daniel Sleator, David Temperley, and John Lafferty. All rights reserved. Copyright (c) 2007 Mike Ross. Copyright (c) 2008,2009,2010 Linas Vepstas, Borislav Iordanov. Copyright (c) 2011 Linas Vepstas Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The names "Link Grammar" and "Link Parser" must not be used to endorse or promote products derived from this software without prior written permission. To obtain permission, contact sleator@cs.cmu.edu THIS SOFTWARE IS PROVIDED BY DANIEL SLEATOR, DAVID TEMPERLEY, JOHN LAFFERTY AND OTHER CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. link-grammar-4.7.4/autogen.sh0000755000175000017500000000376410616765560015140 0ustar bloombloom#!/bin/sh # # Run this before configure # # This file blatantly ripped off from subversion. # # Note: this dependency on Perl is fine: only developers use autogen.sh # and we can state that dev people need Perl on their machine # rm -f autogen.err automake --version | perl -ne 'if (/\(GNU automake\) (([0-9]+).([0-9]+))/) {print; if ($2 < 1 || ($2 == 1 && $3 < 4)) {exit 1;}}' if [ $? -ne 0 ]; then echo "Error: you need automake 1.4 or later. Please upgrade." exit 1 fi if test ! -d `aclocal --print-ac-dir 2>> autogen.err`; then echo "Bad aclocal (automake) installation" exit 1 fi libtoolize --force --copy || { echo "error: libtoolize failed" exit 1 } # Produce aclocal.m4, so autoconf gets the automake macros it needs # ACLOCAL_BINRELOC='-I ac-helpers' echo "Creating aclocal.m4: aclocal $ACLOCAL_FLAGS $ACLOCAL_BINRELOC" aclocal $ACLOCAL_FLAGS $ACLOCAL_BINRELOC 2>> autogen.err # Produce all the `GNUmakefile.in's and create neat missing things # like `install-sh', etc. # echo "automake --add-missing --copy --foreign" automake --add-missing --copy --foreign 2>> autogen.err || { echo "" echo "* * * warning: possible errors while running automake - check autogen.err" echo "" } # If there's a config.cache file, we may need to delete it. # If we have an existing configure script, save a copy for comparison. if [ -f config.cache ] && [ -f configure ]; then cp configure configure.$$.tmp fi # Produce ./configure # echo "Creating configure..." autoconf 2>> autogen.err || { echo "" echo "* * * warning: possible errors while running automake - check autogen.err" echo "" } run_configure=true for arg in $*; do case $arg in --no-configure) run_configure=false ;; *) ;; esac done if $run_configure; then ./configure --enable-maintainer-mode "$@" echo echo "Now type 'make' to compile link-grammar." else echo echo "Now run 'configure' and 'make' to compile link-grammar." fi link-grammar-4.7.4/data/0000755000175000017500000000000011531775730014033 5ustar bloombloomlink-grammar-4.7.4/data/de/0000755000175000017500000000000011531775730014423 5ustar bloombloomlink-grammar-4.7.4/data/de/4.0.affix0000644000175000017500000000016411003202452015720 0ustar bloombloom ")" "%" "," "." ":" ";" "?" "!" "''" "'" "'s": RPUNC+; "(" "$" "``": LPUNC+; e en er.f es.f em: SUF+; xxx: PRE+; link-grammar-4.7.4/data/de/Makefile.am0000644000175000017500000000015511137424062016447 0ustar bloombloom DICTS= \ 4.0.affix \ 4.0.dict dictdir=$(pkgdatadir)/de dict_DATA = $(DICTS) EXTRA_DIST = $(DICTS) link-grammar-4.7.4/data/de/4.0.dict0000644000175000017500000005073411003202452015556 0ustar bloombloom% NOUNS, PRONOUNS % Masculine singular Hund.n Mann.n Brief.n Stein.n Freund.n Koenig.n Punkt.n Schuh.n Mond.n Ball.n Markt.n Frosch.n Hof.n Rock.n Sohn.n Baum.n Traum.n Arzt.n Satz.n Monat.n Bericht.n Erfolg.n Versuch.n Professor.n Doktor.n Staat.n Junge.n Bauer.n Nachbar.n Name.n Lehrer.s Vater.n Bruder.n Schlussel.s Vogel.n Apfel.n Garten.n Tag.n Park.n: {GE+} & {Rm+ or @M+} & {@MX+} & (((({@Ae-} & Dnmd-) or ({@Ar-} & Dnmi-)) & (Ss+ or SIs- or (Xd- & Xc+ & MX-))) or ({@An-} & Dam- & (O- or J*a- or B+)) or ({@An-} & Ddm- & (J*d- or JB+))); % Feminine singular Katze.n Frau.n Hand.n Bank.n Nacht.n Stadt.n Wand.n Wurst.n Form.n Bahn.n Uhr.n Zahl.n Zeit.n Ansicht.n Gestalt.n Krankheit.n Bibliothek.n Blume.n Ecke.n Farbe.n Geige.n Karte.n Kueche.n Nase.n Reise.n Sache.n Strasse.n Woche.n Regel.n Schwester.n Tochter.n Mutter.n Tuer.n Geschichte.n: {GE+} & {Rf+ or @M+} & {@MX+} & (({@Ae-} & Dnf- & (Ss+ or SIs- or O- or B+ or J*a- or (Xd- & Xc+ & MX-))) or ({@An-} & ((Ddf- & (J*d- or JB+)) or (Dgf- & GE-)))); % Neuter singular Maedchen.s Haus.n Jahr.n Bein.n Stueck.n Teil.n Geschenk.n Geschaeft.n Papier.n Glas.n Land.n Wort.n Buch.n Bild.n Kind.n Bett.n Auge.n Ende.n Buero.n Auto.n Kino.n Fenster.s Messer.s Verbrechen.s Halsband.n: {GE+} & {Rn+ or @M+} & {@MX+} & (((({@Ae-} & Dnnd-) or ({@As-} & Dnni-)) & (Ss+ or SIs- or O- or J*a- or B+ or (Xd- & Xc+ & MX-))) or ({@An-} & Ddn- & (J*d- or JB+))); % Masculine genitive Hundes.n Mannes.n Briefes.n Steines.n Freundes.n Koeniges.n Punktes.n Schuhes.n Mondes.n Balles.n Marktes.n Frosches.n Hofes.n Rockes.n Sohnes.n Baumes.n Traumes.n Arztes.n Satzes.n Monates.n Berichtes.n Erfolges.n Versuches.n Professores.n Doktors.n Staates.n Junges.n Bauern.s Nachbares.n Names.n Lehrers.s Vaters.n Bruders.n Schlusseles.s Vogeles.n Apfeles.n Gartenes.n Tages.n Parkes.n: {GE+} & {Rn+ or @M+} & {@MX+} & {@An-} & Dgm- & GE-; % Neuter genitive Maedchenes.s Hauses.n Jahres.n Beines.n Stueckes.n Teiles.n Geschenkes.n Geschaeftes.n Papieres.n Glases.n Landes.n Wortes.n Buches.n Bildes.n Kindes.n Bettes.n Auges.n Endes.n Bueros.s Autos.s Kinos.s Fensters.n Messers.n Verbrechenes.n: {GE+} & {Rn+ or @M+} & {@MX+} & {@An-} & Dgn- & GE-; % Plural Maenner.n Hunde.n Katzen.n Frauen.n Hauser.n Maedchenen.n Briefe.n Steine.n Freunde.n Koenige.n Punkte.n Schuhe.n Monde.n Baelle.n Maerkte.n Froesche.n Hoefe.n Roecke.n Soehne.n Baeume.n Traeume.n Aerzte.n Saetze.n Monate.n Berichte.n Erfolge.n Versuche.n Professoren.n Doktoren.n Staaten.n Jungen.n Bauern.p Nachbarn.n Namen.n Lehrer.p Vaeter.n Brueder.n Schlussel.p Voegel.n Aepfel.n Gaerten.n Haende.n Baenke.n Naechte.n Staedte.n Waende.n Wuerste.n Kuenste.n Banken.n Formen.n Bahnen.n Uhren.n Zahlen.n Zeiten.n Ansichten.n Gestalten.n Krankheiten.n Bibliotheken.n Blumen.n Ecken.n Farben.n Geigen.n Karten.n Kuechen.n Nasen.n Reisen.n Sachen.n Strassen.n Wochen.n Regeln.n Schwestern.n Toechter.n Muetter.n Jahre.n Beine.n Stuecke.n Teile.n Geschenke.n Geschaefte.n Papiere.n Glaeser.n Laender.n Woerter.n Buecher.n Bilder.n Gelder.n Kinder.n Betten.n Augen.n Enden.n Bueros.p Autos.p Kinos.p Fenster.p Messer.p Verbrechen.p Maedchen.p Tagen.n Parke.n Tueren.n Halsbaender.n Geschichten.n: {GE+} & {Rp+ or @M+} & {@MX+} & {@An-} & ((Dnp- & (Sp+ or SIp- or O- or J*a- or B+ or (Xd- & Xc+ & MX-))) or (Ddp- & (J*d- or JB+)) or (Dgp- & GE-)); %Masculine mass Kaese.n: {GE+} & {Rm+ or @M+} & {@MX+} & ((((({@Ae-} & Dnmd-) or ({@Ar-} & {Dnmi- or Dm-}))) & (Ss+ or SIs- or (Xd- & Xc+ & MX-))) or (({@An-} & {Dam- or Dm-}) & (O- or J*a- or B+)) or ((({@An-} & Ddm-) or ({@Am-} & {Dm-})) & (J*d- or JB+))); %Feminine mass Arbeit.n Luft.n Milch.n: {GE+} & {Rf+ or @M+} & {@MX+} & ((({@Ae-} & {Dnf- or Dm-}) & (Ss+ or SIs- or O- or B+ or J*a- or (Xd- & Xc+ & MX-))) or ((({@An-} & Ddf-) or ({@Ar-} & {Dm-})) & (J*d- or JB+)) or ((({@An-} & Dgf-) or ({@Ar-} & {Dm-})) & GE-)); %Neuter mass Geld.n Wasser.n Bier.n Brot.n: {GE+} & {Rn+ or @M+} & {@MX+} & (((({@Ae-} & Dnnd-) or ({@As-} & {Dnni- or Dm-})) & (Ss+ or SIs- or O- or J*a- or B+ or (Xd- & Xc+ & MX-))) or ((({@An-} & Ddn-) or ({@Am-} & {Dm-})) & (J*d- or JB+))); %Masculine mass genitive Kaeses.n: {GE+} & {Rn+ or @M+} & {@MX+} & (({@An-} & Dgm-) or ({@As-} & {Dm-})) & GE-; %Neuter mass genitive Geldes.n Wassers.n Bieres.n Brotes.n: {GE+} & {Rn+ or @M+} & {@MX+} & (({@An-} & Dgn-) or ({@As-} & {Dm-})) & GE-; %PRONOUNS AND DETERMINERS ich: Si+ or SIi-; du: Sd+ or SId-; es.p: Ss+ or SIs- or O- or J*a- or B+; er.p: Ss+ or SIs-; wir: Sp+ or SIp-; ihr.p: Sr+ or SIr- or J*d- or JB+; sie.s: Ss+ or SIs- or O- or J*a- or B+; sie.p: Sp+ or SIp- or O- or J*a- or B+; das.p dies: Ss+ or SIp- or O- or B+ or JB+; mich dich ihn: O- or J*a- or B+; mir dir ihm: J*d- or JB+; uns: O- or J*a- or J*d- or B+ or JB+; ihnen: J*d- or JB+; der.d dieser jener: Dnmd+ or Ddf+ or Dgf+ or Dgp+; die.d diese jene: Dnf+ or Dnp+; das.d: Dnnd+; den.d diesen jenen: Dam+ or Ddp+; dem.d diesem jenem: Ddm+ or Ddn+; des.d: Dgm+ or Dgn+; dieses jenes: Dnnd+ or Dgm+; der.r: (RSs+ & {Xd- & Xc+} & Rm-); die.r: ((RSs+ or RO+) & {Xd- & Xc+} & Rf-) or (RSp+ & {Xd- & Xc+} & Rp-); das.r: ((RSs+ or RO+) & {Xd- & Xc+} & Rn-); den.r: (RO+ & {Xd- & Xc+} & Rm-); ein: Dnmi+ or Dnni+; eine: Dnf+; einen: Dam+; einer: Ddf+ or Dgf+; einem: Ddm+ or Ddn+; eines: Dgm+ or Dgn+; mein dein sein.d unser ihr.d euer: Dnmi+ or Dnni+; meine deine seine unsere ihre eure: Dnf+ or Dnp+; meinen deinen seinen unseren ihren euren: Dam+ or Ddp+ or Dgf+; meiner deiner seiner unserer ihrer eurer: Ddf+ or Dgf+ or Dgp+; meinem deinem seinem unserem ihrem eurem: Ddm+ or Ddn+; meines deines seines unseres ihres eures: Dgm+ or Dgn+; einige: Dnp+ or Sp+ or SIp- or O- or J*a- or B+; einigen: Ddp+ or J*d- or JB+; einiger: Dgp+ or GE-; etwas.d: Dm+; zwei drei vier fuenf sechs sieben acht neun zehn: D*p+; s: YS- & D+; % VERBS bin.v war.i: (((Si- or ({CO-} & SIi+)) & (O+ or P+) & W-) or ((B- or PI-) & (Si- & C-))) & {SC+}; bist.v warst.v: (((Sd- or ({CO-} & SId+)) & (O+ or P+) & W-) or ((B- or PI-) & (Sd- & C-))) & {SC+}; ist.v war.s: (((Ss- or ({CO-} & SIs+)) & (O+ or P+) & W-) or ((B- or PI-) & ((Ss- & C-) or RSs-))) & {SC+}; sind.v waren.v: (((Sp- or ({CO-} & SIp+)) & (O+ or P+) & W-) or ((B- or PI-) & ((Sp- & C-) or RSp-))) & {SC+}; seid.v wart.v: (((Sr- or ({CO-} & SIr+)) & (O+ or P+) & W-) or ((B- or PI-) & (Sr- & C-))) & {SC+}; sein.v: (B- or PI-) & (I- or II+); gewesen.v: (B- or PI-) & (Pb- or PIb+); habe.v hatte.i: (((Si- or ({CO-} & SIi+)) & (O+ or PP+) & {@MV+} & W-) or ({@MVI-} & (((B- or PPI-) & (Si- & (C- or RO-))) or (Sit- & RO-)))) & {SC+}; hast.v hattest.v: (((Sd- or ({CO-} & SId+)) & (O+ or PP+) & {@MV+} & W-) or ({@MVI-} & (((B- or PPI-) & (Sd- & (C- or RO-))) or (Sdt- & RO-)))) & {SC+}; hat.v hatte.s: (((Ss- or ({CO-} & SIs+)) & (O+ or PP+) & {@MV+} & W-) or ({@MVI-} & (((B- or PPI-) & ((Ss- & (C- or RO-)) or RSs-)) or (Sst- & RO-)))) & {SC+}; habt.v hattet.v: (((Sr- or ({CO-} & SIr+)) & (O+ or PP+) & {@MV+} & W-) or ({@MVI-} & (((B- or PPI-) & (Sr- & (C- or RO-))) or (Srt- & RO-)))) & {SC+}; hatten.v: (((Sp- or ({CO-} & SIp+)) & (O+ or PP+) & {@MV+} & W-) or ({@MVI-} & (((B- or PPI-) & ((Sp- & (C- or RO-)) or RSp-)) or (Spt- & RO-)))) & {SC+}; haben.v: (((Sp- or ({CO-} & SIp+)) & (O+ or PP+) & {@MV+} & W-) or ({@MVI-} & (((B- or PPI-) & ((Sp- & (C- or RO-)) or RSp-)) or (Spt- & RO-)))) & {SC+}; haben.i: {ZU-} & {@MVI-} & (B- or PPI-) & ((Xd- & Xc+ & SCz-) or I- or IIt+); gehabt.v: {@MVI-} & ((B- & PP-) or ({B-} & PPIt+)); muss.v soll.v will.v kann.v musste.v sollte.v wollte.v kannte.m: (((Si- or Ss- or ({CO-} & (SIi+ or SIs+))) & I+ & W-) or (II- & (((Si- or Ss-) & (C- or RO-)) or RS-))) & {SC+}; werde.v: (((Si- or ({CO-} & SIi+)) & (I+ or PV+) & W-) or ((II- or PVI-) & Si- & (C- or RO-))) & {SC+}; wird.v: (((Ss- or ({CO-} & SIs+)) & (I+ or PV+) & W-) or ((II- or PVI-) & ((Ss- & (C- or RO-)) or RSs-))) & {SC+}; wurde.v: (((Si- or Ss- or ({CO-} & (SIi+ or SIs+))) & (I+ or PV+) & W-) or ((II- or PVI-) & (((Si- or Ss-) & (C- or RO-)) or RS-))) & {SC+}; musst.v sollst.v willst.v kannst.v musstest.v solltest.v wolltest.v kanntest.m: (((Sd- or ({CO-} & SId+)) & I+ & W-) or (II- & Sd- & (C- or RO-))) & {SC+}; wirst.v wurdest.v: (((Sd- or ({CO-} & SId+)) & (I+ or PV+) & W-) or ((II- or PVI-) & Sd- & (C- or RO-))) & {SC+}; muesst.v sollt.v wollt.v koennt.v: (((Sr- or ({CO-} & SIr+)) & I+ & W-) or (II- & Sr- & (C- or RO-))) & {SC+}; werdet.v wurdet.v: (((Sr- or ({CO-} & SIr+)) & (I+ or PV+) & W-) or ((II- or PVI-) & Sr- & (C- or RO-))) & {SC+}; muessen.v sollen.v wollen.v koennen.v muessten.v sollten.v wollten.v kannten.m: (((Sp- or ({CO-} & SIp+)) & I+ & W-) or (II- & (I- or II+ or ((Sp- & (C- or RO-)) or RSp-)))) & {SC+}; werden.v wurden.v: (((Sp- or ({CO-} & SIp+)) & (I+ or PV+) & W-) or ((II- or PVI-) & (I- or II+ or ((Sp- & (C- or RO-)) or RSp-)))) & {SC+}; worden.i: PVI- & (Pb- or PIb+); muessen.i sollen.i wollen.i koennen.i werden.i: (II- & (I- or II+)); gehe.v spreche.v bleibe.v fahre.v komme.v laufe.v sterbe.v an+komme.v ging.i sprach.i blieb.i fuhr.i kam.i lief.i starb.i an+kam.i: (((Si- or ({CO-} & SIi+)) & {@MV+} & {K+} & W-) or ({KI-} & {@MVI-} & Si- & C-)) & {SC+}; gehst.v sprichst.v bleibst.v faehrst.v kommst.v laeufst.v stirbst.a an+kommst.v gingst.v sprachst.v bliebst.v fuhrst.v kamst.v liefst.v starbst.v an+kamst.v: (((Sd- or ({CO-} & SId+)) & {@MV+} & {K+} & W-) or ({KI-} & {@MVI-} & Sd- & C-)) & {SC+}; geht.v spricht.v bleibt.v faehrt.v kommt.v laeuft.v stirbt.v an+kommt.v ging.s sprach.s blieb.s fuhr.s kam.s lief.s starb.s an+kam.s: (((Ss- or Sr- or ({CO-} & (SIs+ or SIr+))) & {@MV+} & {K+} & W-) or ({KI-} & {@MVI-} & (((Ss- or Sr-) & C-) or RSs-))) & {SC+}; % Sr- gingt.v spracht.v bliebt.v fuhrt.v kamt.v lieft.v starbt.v an+kamt.v: (((Sr- or ({CO-} & SIr+)) & {@MV+} & {K+} & W-) or ({KI-} & {@MVI-} & Sr- & C-)) & {SC+}; gehen.v sprechen.v bleiben.v fahren.v kommen.v laufen.v sterben.v an+kommen.v: (((Sp- or ({CO-} & SIp+)) & {@MV+} & {K+} & W-) or ({KI-} & {@MVI-} & (((Sp- & C-) or RSp-)))) & {SC+}; gehen.i sprechen.i bleiben.i fahren.i kommen.i laufen.i sterben.i an+kommen.i: {ZU-} & {KI-} & {@MVI-} & ((Xd- & Xc+ & SCz-) or I- or IIi+); % SCz- needs an optional SC+ gingen.v sprachen.v blieben.v fuhren.v kamen.v liefen.v starben.v an+kamen.v: (((Sp- or ({CO-} & SIp+)) & {@MV+} & {K+} & W-) or ({KI-} & {@MVI-} & ((Sp- & C-) or RSp-))) & {SC+}; gesprochen.v: {KI-} & {@MVI-} & (PP- or PPIi+); gegangen.v geblieben.v gekommen.v gestorben.v gelaufen.v an+gekommen.v: {KI-} & {@MVI-} & (Pb- or PIb+); gefahren.v: {KI-} & {@MVI-} & (Pb- or PIb+ or PP- or PPIi+); spiele.v koche.v esse.v trinke.v schreibe.v lese.v spielte.i kochte.i ass.i trank.i schrieb.i las.i: (((Si- or ({CO-} & SIi+)) & {O+} & {@MV+} & W-) or ({@MVI-} & {B-} & Sio- & (C- or RO-))) & {SC+}; spielst.v kochst.v isst.d trinkst.v schreibst.v liest.d spieltest.v kochtest.v assest.i trankst.v schriebst.i lasst.v: (((Sd- or ({CO-} & SId+)) & {O+} & {@MV+} & W-) or ({@MVI-} & {B-} & Sdo- & (C- or RO-))) & {SC+}; spielt.v kocht.v isst.s trinkt.v schreibt.v liest.s spielte.s kochte.s asst.s trank.s schrieb.s las.s: (((Ss- or Sr- or ({CO-} & (SIs+ or SIr+))) & {O+} & {@MV+} & W-) or ({@MVI-} & {B-} & (((Sso- or Sro-) & (C- or RO-)) or RSs-))) & {SC+}; spieltet.v kochtet.v asset.v tranket.v schriebet.v last.v: (((Sr- or ({CO-} & SIr+)) & {O+} & {@MV+} & W-) or ({@MVI-} & {B-} & Sro- & (C- or RO-))) & {SC+}; spielen.v kochen.v essen.v schreiben.v lesen.v: (((Sp- or ({CO-} & SIp+)) & {O+} & {@MV+} & W-) or ({@MVI-} & {B-} & (((Spo- & (C- or RO-)) or RSp-)))) & {SC+}; spielen.i kochen.i essen.i schreiben.i lesen.i: {ZU-} & {@MVI-} & {B-} & ((Xd- & Xc+ & SCz-) or I- or IIo+); spielten.v kochten.v assen.i tranken.v schrieben.v lasen.v: (((Sp- or ({CO-} & SIp+)) & {O+} & {@MV+} & W-) or ({@MVI-} & {B-} & ((Spo- & (C- or RO-)) or RSp-))) & {SC+}; gespielt.v gekocht.v gegessen.v geschrieben.v gelesen.v: {@MVI-} & (PV- or PVI+ or ({B-} & (PP- or PPIo+))); sehe.v schlage.v mache.v hoere.v kenne.v brauche.v nehme.v trage.v finde.v jage.v sah.i schlug.i machte.i hoerte.i kannte.i brauchte.i nahm.i trug.i fand.i jagte.i: (((Si- or ({CO-} & SIi+)) & O+ & {@MV+} & W-) or ({@MVI-} & {B-} & Sit- & (C- or RO-))) & {SC+}; siehst.v schlaegst.v machst.v hoerst.v kennst.v brauchst.v nimmst.v traegst.v findest.v jagst.v sahst.v schlugst.v machtest.v hoertest.v kanntest.v brauchtest.v nahmst.v trugst.v fandest.i jagtest.v: (((Sd- or ({CO-} & SId+)) & O+ & {@MV+} & W-) or ({@MVI-} & {B-} & Sdt- & (C- or RO-))) & {SC+}; sieht.v schlaegt.v macht.v hoert.v kennt.v braucht.v nimmt.v traegt.v findet.v jagt.v sah.s schlug.s machte.s hoerte.s kannte.s brauchte.s nahm.s trug.s fand.s jagte.s: (((Ss- or Sr- or ({CO-} & (SIs+ or SIr+))) & O+ & {@MV+} & W-) or ({@MVI-} & {B-} & (((Sst- or Srt-) & (C- or RO-)) or RSst-))) & {SC+}; saht.v schlugt.v machtet.v hoertet.v kanntet.v brauchtet.v nahmet.v trugt.v fandet jagtet.v: (((Sr- or ({CO-} & SIr+)) & O+ & {@MV+} & W-) or ({@MVI-} & {B-} & Srt- & (C- or RO-))) & {SC+}; sehen.v schlagen.v machen.v hoeren.v kennen.v brauchen.v nehmen.v tragen.v jagen.v: (((Sp- or ({CO-} & SIp+)) & O+ & {@MV+} & W-) or ({@MVI-} & {B-} & ((Spt- & (C- or RO-)) or RSpt-))) & {SC+}; sehen.i schlagen.i machen.i hoeren.i kennen.i brauchen.i nehmen.i tragen.i jagen.i: {ZU-} & {@MVI-} & {B-} & ((Xd- & Xc+ & SCz-) or I- or IIt+); sahten.v schlugten.v machten.v hoerten.v kannten.v brauchten.v nahmen.v trugten.v fanden.v jagten.v: (((Sp- or ({CO-} & SIp+)) & O+ & {@MV+} & {SC+} & W-) or ({@MVI-} & {B-} & ((Spt- & (C- or RO-)) or RSpt-))) & {SC+}; gesehen.v geschlagt.v gemacht.v gehoert.v gekannt.v gebraucht.v genommen.v getragen.v gefunden.v gejagt.v erschreckt.v: {@MVI-} & (PV- or PVI+ or (B- & PP-) or ({B-} & PPIt+)); gebe.v bringe.v kaufe.v gab.i brachte.i kaufte.i: (((Si- or ({CO-} & SIi+)) & {J*d+} & O+ & {@MV+} & W-) or ({@MVI-} & {B-} & {JB-} & Sit- & (C- or RO-))) & {SC+}; % To handle dative relative clauses: % ...& ({@MVI-} & {B-} & {JB-} & Sit- & (C- or RO- or RJ-))) & {SC+}; % make RJ incompat with JB. When RJ is used, B will be obligatory, as it should be! gibst.v bringst.v kaufst.v gabst.v brachtest.v kauftest.v: (((Sd- or ({CO-} & SId+)) & {J*d+} & O+ & {@MV+} & W-) or ({@MVI-} & {B-} & {JB-} & Sdt- & (C- or RO-))) & {SC+}; gibt.v bringt.v kauft.v gab.s brachte.s kaufte.s: (((Ss- or Sr- or ({CO-} & (SIs+ or SIr+))) & {J*d+} & O+ & {@MV+} & W-) or ({@MVI-} & {B-} & {JB-} & (((Sst- or Srt-) & (C- or RO-)) or RSst-))) & {SC+}; gabt.v brachtet.v kauftet.v: (((Sr- or ({CO-} & SIr+)) & {J*d+} & O+ & {@MV+} & W-) or ({@MVI-} & {B-} & {JB-} & Srt- & (C- or RO-))) & {SC+}; geben.v bringen.v kaufen.v: (((Sp- or ({CO-} & SIp+)) & {J*d+} & O+ & {@MV+} & W-) or ({@MVI-} & {B-} & {JB-} & ((Spt- & (C- or RO-)) or RSpt-))) & {SC+}; geben.i bringen.i kaufen.i: {ZU-} & {@MVI-} & {B-} & {JB-} & ((Xd- & Xc+ & SCz-) or I- or IIt+); gaben.v brachten.v kauften.v: (((Sp- or ({CO-} & SIp+)) & {J*d+} & O+ & {@MV+} & {SC+} & W-) or ({@MVI-} & {B-} & {JB-} & ((Spt- & (C- or RO-)) or RSpt-))) & {SC+}; gegeben.v gebracht.v gekauft.v: {@MVI-} & (PV- or PVI+ or (B- & {JB-} & PP-) or ({B-} & {JB-} & PPIt+)); glaube.v sage.v glaubte.i sagte.i: (((Sic- or ({CO-} & SIic+)) & {O+} & {@MV+} & W-) or ({@MVI-} & B- & Sic- & (C- or RO-))) & {SC+}; glaubst.v sagst.v glaubtest.v sagtest.v: (((Sdc- or ({CO-} & SIdc+)) & {O+} & {@MV+} & W-) or ({@MVI-} & {B-} & Sdc- & (C- or RO-))) & {SC+}; glaubt.v sagt.v glaubte.s sagte.v: (((Ssc- or Src- or ({CO-} & (SIsc+ or SIrc+))) & {O+} & {@MV+} & W-) or ({@MVI-} & {B-} & (((Ssc- or Src-) & (C- or RO-)) or RSs-))) & {SC+}; glaubtet.v sagtet.v: (((Src- or ({CO-} & SIrc-)) & {O+} & {@MV+} & W-) or ({@MVI-} & {B-} & Src- & (C- or RO-))) & {SC+}; glauben.v sagen.v: (((Spc- or ({CO-} & SIpc+)) & {O+} & {@MV+} & W-) or ({@MVI-} & {B-} & ((Spc- & (C- or RO-)) or RSp-))) & {SC+}; glauben.i sagen.i: {ZU-} & {@MVI-} & {B-} & (Ic- or IIc+); glaubten.v sagten.v: (((Spc- or ({CO-} & SIpc+)) & {O+} & {@MV+} & W-) or ({@MVI-} & {B-} & ((Spc- & (C- or RO-)) or RSp-))) & {SC+}; geglaubt.v gesagt.v: {@MVI-} & {B-} & (PPc- or PPIc+); versuche.v versuchte.i: (((Siz- or ({CO-} & SIiz+)) & {O+} & {@MV+} & W-) or ({@MVI-} & {B-} & Siz- & (C- or RO-))) & {SC+}; versuchst.v versuchtest.v: (((Sdz- or ({CO-} & SIdz+)) & {O+} & {@MV+} & W-) or ({@MVI-} & {B-} & Sdz- & (C- or RO-))) & {SC+}; versucht.v versuchte.s: (((Ssz- or Srz- or ({CO-} & (SIsz+ or SIrz+))) & {O+} & {@MV+} & W-) or ({@MVI-} & {B-} & (((Ssz- or Srz-) & (C- or RO-)) or RSs-))) & {SC+}; versuchtet.v: (((Srz- or ({CO-} & SIrz-)) & {O+} & {@MV+} & W-) or ({@MVI-} & {B-} & Srz- & (C- or RO-))) & {SC+}; versuchen.i: ((Spz- or ({CO-} & SIpz+)) & {O+} & {@MV+} & {SC+} & W-) or ({@MVI-} & {B-} & (I- or II+ or ((Spz- & (C- or RO-)) or RSp-))); versuchten.v: (((Spz- or ({CO-} & SIpz+)) & {O+} & {@MV+} & W-) or ({@MVI-} & {B-} & ((Spz- & (C- or RO-)) or RSp-))) & {SC+}; versuchen.p: {@MVI-} & {B-} & (PPz- or PPIz+); helfe.v half.i: ((Si- or ({CO-} & SIi+)) & J+ & {@MV+} & {SC+} & W-) or ({@MVI-} & B- & Si- & (C- or RO-)); hilfst.v halfst.v: ((Sd- or ({CO-} & SId+)) & J+ & {@MV+} & {SC+} & W-) or ({@MVI-} & B- & Sd- & (C- or RO-)); hilft.v half.s: ((Ss- or Sr- or ({CO-} & (SIs+ or SIr+))) & J+ & {@MV+} & {SC+} & W-) or ({@MVI-} & B- & (((Ss- or Sr-) & (C- or RO-)) or RSs-)); halft.v: ((Sr- or ({CO-} & SIr+)) & J+ & {@MV+} & {SC+} & W-) or ({@MVI-} & B- & Sr- & (C- or RO-)); helfen.v: ((Sp- or ({CO-} & SIp+)) & J+ & {@MV+} & {SC+} & W-) or ({@MVI-} & B- & (I- or IIt+ or ((Sp- & (C- or RO-)) or RSp-))); halfen.v: ((Sp- or ({CO-} & SIp+)) & J+ & {@MV+} & {SC+} & W-) or ({@MVI-} & B- & ((Sp- & (C- or RO-)) or RSp-)); geholfen.v: {@MVI-} & B- & (PP- or PPI+); % CONJUNCTIONS, ADVERBS, PREPOSITIONS jetzt.e heute.e morgen.e gestern.e: MV- or MVI+ or CO+; bis durch fuer gegen ohne: J*a+ & (M- or MV- or MVI+ or Pp- or PIp+ or ({Xc+} & CO+)); aus bei mit nach: J*d+ & (M- or MV- or MVI+ or Pp- or PIp+ or ({Xc+} & CO+)); in ueber unter: J*d+ & (M- or MV- or MVI+ or Pp- or PIp+ or ({Xc+} & CO+)); an auf: (J*d+ & (M- or MV- or MVI+ or Pp- or PIp+ or ({Xc+} & CO+))) or K- or KI+; als wenn weil: C+ & ((Xc+ & CO+) or ({Xd- & Xc+} & SC-)); zu: (J*d+ & (M- or MV- or MVI+ or Pp- or PIp+ or ({Xc+} & CO+))) or ZU+; dass: C+ & Xd- & SCc- & Xc+; wann: Wq- & W+; % Post-processing needed here to enforce s-v inversion aber denn: {Xd-} & SC- & W+; % und? % ADJECTIVES gross.a klein.a alt.a jung.a rot.a blau.a gelb.a gruen.a schwarz.a weiss.a billig.a teuer.a kurz.a lang.a gut.a schlecht.a gescheit.a dumm.a froh.a erstaunt.a besorgt.a schoen.a: {FP-} & {EA-} & (Pa- or PIa+ or (FSe+ & Ae+) or (FSn+ & An+) or (FSr+ & Ar+) or (FSs+ & As+) or (FSm+ & Am+)); e: FSe-; en: FSn-; er.f: FSr-; es.f: FSs-; em: FSm-; %grosse.a kleine.a alte.a junge.a rote.a blaue.a gelbe.a gruene.a schwarze.a weisse.a %billige.a teuere.a lange.a kurze.a gute.a schlechte.a gescheite.a dumme.a frohe.a %erstaunte.a besorgte.a schoene.a: {EA-} & Ae+; %grossen.a kleinen.a alten.a jungen.a roten.a blauen.a gelben.a gruenen.a schwarzen.a %weissen.a billigen.a teuren.a kurzen.a langen.a guten.a schlechten.a gescheiten.a %dummen.a frohen.a erstaunten.a besorgten.a boesen.a schoenen.a: {EA-} & An+; boese.a: {EA-} & (Pa- or PIa+ or Ae+); ex: FP+; %grosser.a kleiner.a alter.a junger.a roter.a blauer.a gelber.a gruener.a schwarzer.a %weisser.a billiger.a teurer.a kurzer.a langer.a guter.a schlechter.a gescheiter.a dummer.a %froher.a erstaunter.a besorgter.a boeser.a schoener.a: {EA-} & Ar+; %grosses.a kleines.a altes.a junges.a rotes.a blaues.a gelbes.a gruenes.a schwarzes.a %weisses.a billiges.a teures.a kurzes.a langes.a gutes.a schlechtes.a gescheites.a dummes.a %frohes.a erstauntes.a besorgtes.a boeses.a schoenes.a: {EA-} & As+; %grossem.a kleinem.a altem.a jungem.a rotem.a blauem.a gelbem.a gruenem.a schwarzem.a %weissem.a billigem.a teurem.a kurzem.a langem.a gutem.a schlechtem.a gescheitem.a dummem.a %frohem.a erstauntem.a besorgtem.a boesem.a schoenem.a: {EA-} & Am+; sehr.e ziemlich.e: EA+ or EE+; schnell.e: {EE-} & (MV- or MVI+); und: {@XL-} & XR+ & (({GE+} & {D-} & (S+ or SI- or O- or B+ or J- or GE- or (Xd- & Xc+ & MX-))) or ({EA-} & (A+ or ({@MV-} & (P- or PI+)))) or ({@MVI-} & (I- or II+)) or (J+ & (MV- or MVI+)) or W- or ((((S- or ({CO-} & SI+)) & {@MV+} & W-) or ({@MVI-} & S- & C-)) & {SC+})); ",": Xc- or Xd+; ".": {Xc-} & Xp- & RW+; "!": {Xc-} & Xp- & RW+; "?": {Xc-} & Xp- & RW+; CAPITALIZED-WORDS NAME: {G-} & (({@MX+} & (Ss+ or SIs- or O- or B+ or J- or G+ or (Xd- & Xc+ & MX-))) or YS+); LEFT-WALL: W+ & {Xp+ or RW+}; RIGHT-WALL: RW- or (Xc- & {@Xc-}); POSTPROCESS: BOGUS+; % With the following line in the dictionary, the parser will simply skip over (null-link) % unknown words. If you remove it, the parser will output an error for any unknown words. UNKNOWN-WORD: NO+;link-grammar-4.7.4/data/sql/0000755000175000017500000000000011531775723014634 5ustar bloombloomlink-grammar-4.7.4/data/sql/README0000644000175000017500000001255211243065702015506 0ustar bloombloom Parse Ranking and Word Sense Statistics --------------------------------------- This directory contains SQL tables that are used in computing a parse ranking, as well as a word-sense probability (based on WordNet 3.0) by looking up frequency statistics from an SQL database. The database used is the SQLite database; it has been choosen because it is "administration -free" for the user, and because its license is compatbile with the current link-grammar license. The data tables needed to operate this stuff can be downloaded from the web. See the main README file for download details. Disjuncts Table --------------- The disjuncts.db database contains two tables. The first records the probability that a given disjunct will be used for some given word. This probability was measured by parsing a large quantity of text, and simply counting disjunct frequencies. This probability can be used to rank parses, or to discriminate between alternate parses for a sentence. CREATE TABLE Disjuncts ( inflected_word TEXT NOT NULL, disjunct TEXT NOT NULL, log_cond_probability FLOAT ); CREATE INDEX ifwdj ON Disjuncts (inflected_word, disjunct); The log_cond_probability field contains the value of -log_2 p(d|w) where p(d|w) is the conditional probability of seeing the disjunct d given that the (inflected) word w was already seen. Word Senses Table ----------------- The DisjunctSenses table associates word senses to (word,disjunct) pairs. The core idea behind this table is that certain word senses are used only in certain ways in sentence constructions, and that the Link Grammar disjuncts are fine-grained enough to detect such differences, if they exist. The key idea is "if they exist" -- in most cases, grammar is insufficient to discriminate between word senses in a sentence -- but in some cases, it is. The goal here is to try to provide this info, as well as possible. CREATE TABLE DisjunctSenses ( word_sense TEXT NOT NULL, inflected_word TEXT NOT NULL, disjunct TEXT NOT NULL, log_cond_probability FLOAT ); CREATE INDEX siwdj ON DisjunctSenses (inflected_word, disjunct); The log_cond_probability field records -log_2 p(s|w,d) where s==sense, w==word, d==disjunct, so that p(s|w,d) is the probability of seeing the sense s, given the word w and the disjunct d. This probability was obtained by parsing a large quantity of text, and then applying the Radu Mihalcea word-sense disambiguation algorithm to it. Cluster Table ------------- When LG is unable to parse a sentence, one possible strategy is to increase the number of disjuncts that words can participate in, and hoping that the broadend collection of disjuncts will allow the parse to proceed. To obtain the broadened coverage, one can look up the word to see if it participates in a cluster of syntactically similar words, and then use a union of all of the disjuncts of words in the cluster. If this allows the parse to proceed, then the system will have "automatically" discovered a usable parse that is not otherwise covered by the existing dictionaries. CREATE TABLE ClusterMembers ( cluster_name TEXT NOT NULL, inflected_word TEXT NOT NULL ); CREATE INDEX iiw ON ClusterMembers (inflected_word); CREATE TABLE ClusterDisjuncts ( cluster_name TEXT NOT NULL, disjunct TEXT NOT NULL, cost FLOAT ); CREATE INDEX icn ON ClusterDisjuncts (cluster_name); To create these tables: 1) Perform clustering, a la Siva Reddy scripts. 2) Create sqlite3 database "clusters.db" in the data/sql directory 3) Create above tables and indexes 4) Run data/tools/cluster-pop.pl to populate the first table. 5) Run link-grammar/corpus/cluster-pop to populate the second table. A recent version has this table at 172MBytes. To use these tables: 1) Copy them into this directory 2) Enable the parser to the above-desribed algo, by saing !cluster at the parser prompt. Report: At this time, the results of using the above algo are underwhelming. This is somewhat surprising, as the above aglo is the "defacto" algo used manually, when debugging the dictionary: one tries "similar words" until one finds a working parse, and then modifies the dictionary appropriately. The reason for the poor experience so far may be that the clusters are too small, and not sufficiently encompassing. Note also that many failed parses are not due to the mis-categorization of a word that's already in the dictionary, but rather, because the dictionary fails to account for some particular linguistic phenomenon. Thus, even in the best case, the above algo will fail to fix all parse failures. Notes: ------ Go to http://opencog.org/ and download the source code. Then review the contents of opencog/nlp/wsd-post/README. That README explains the data processing pipleine used to create the word-senses table, and the disjunct-frequency table. To summarize, in breif: Compute the marginal and conditional probabilities for the Disjuncts table by running the opencog/nlp/wsd-post/compute-mi.scm script. Merge sysnsets by running opencog/nlp/wsd-post/synset-renorm.pl Recompute the DisjunstSenses conditional probs by: opencog/nlp/wsd-post/dj-probs.pl To populate the disjunct table: first, dump the disjuncts: pg_dump -D -O -t disjuncts lexat To populate the DisjunctSenses table: Then remove the count column, and the bogus entries, via select; run the cleanup scripts. pg_dump -D -O -t djsxxxtmp lexat ============ link-grammar-4.7.4/data/en/0000755000175000017500000000000011531775730014435 5ustar bloombloomlink-grammar-4.7.4/data/en/4.0.batch0000644000175000017500000012516011526022265015736 0ustar bloombloom !verbosity=1 !echo !limit=1000 !batch !short=20 !constituents=1 !spell=0 !use-fat=0 %NOUNS The fact that he smiled at me gives me hope *The event that he smiled at me gives me hope But my efforts to win his heart have failed *But my presents to win his heart have failed Failure to comply may result in dismissal *Absence to comply may result in dismissal The question is who we should invite *The party is who we should invite The big question on everybody's mind is who killed OJ *The big mind on everybody's question is who killed OJ Do it the way you've always done it I really like the way you do your hair *I really like the fashion you do your hair He made a request that there be an investigation *He stated the fact that there be an investigation He is the kind of person who would do that *He is the character of person who would do that An income tax increase may be necessary *A tax on income increase may be necessary Last week I saw a great movie % currently finds a parse with roman numeral I % i.e. "Last Dog the First saw a great movie" *Last dog I saw a great movie The party that night was a big success *The party that dog was a big success John Stuart Mill is an important author The Richard Milhous Nixon Library has been a big success The mystery of the Nixon tapes was never solved High income taxes are important Oil company stock prices rose in heavy trading today Metals futures prices rose in heavy trading today U.S. economic indicators fell sharply last month Columbia medical and administrative workers continued their strike today Janet, who is an expert on dogs, helped me choose one *Janet who is an expert on dogs helped me choose one The dog that we eventually bought was very expensive *The dog, that we eventually bought, was very expensive *The dog, we eventually bought, was very expensive Have you ever seen the Pacific The new David Letterman is a happy, relaxed David Letterman Actress Whoopi Goldberg and singer Michael Jackson attended the ceremony We are from the planet Gorpon This is my friend Bob John's family is renovating their kitchen *A man I know's family is renovating their kitchen The boys' bedrooms will be enlarged *The boys's bedrooms will be enlarged My uncle's mother's cousin is visiting us *Emily's my cousin is visiting us We ate at Joe's Diner last week The buy-out caused a free-for-all in the mid-afternoon Joan Smith is president of the company *Joan Smith is tourist Alfred Baird, formerly vice president of Beevil Corp., has been appointed as president *Alfred Baird, man I know, has been described as good gardener A bunch of dogs are in the yard *A picture of dogs are in the yard %DETERMINERS & PRONOUNS Many people were angered by the hearings *Many person were angered by the hearings Many were angered by the hearings My many female friends were angered by the hearings *My some female friends were angered by the hearings Many who initially supported Thomas later changed their minds The stupidity of the senators annoyed all my friends *The stupidity of the senators annoyed many my friends I need to buy a present, but I want something inexpensive *I need to buy a present, but I want a gift inexpensive Anyone who thinks this will work is crazy Their program is better than ours Those that want to come can come I read everything I could about the subject I read whatever I could about the subjetc *I read several books I could about the subject the best costumes got prizes *a best costume got prizes *some best costumes got prizes the best five costumes got prizes the five best costumes got prizes *the five best five costumes got prizes *the hundreds of best costumes got prizes *five best costumes got prizes *best costumes got prizes *best five costumes got prizes five other costumes got prizes the other five costumes got prizes *other five costumes got prizes the other candy was really disgusting *the five other candy was really disgusting other candy is really disgusting *other piece of candy was really bad other costumes were really bad some other costumes were really bad %NUMBERS 2 million attended 2863764 attended 2 million people attended *2 million person attended a million attended a million people attended about 2 million people attended about 2 million attended *about people attended a million such people attended *a million such attended 5 million of the people attended 5 thousand invited by Bob attended The 5 thousand invited by Bob attended The thousands of people who attended enjoyed it The 5 thousand people invited by Bob attended The nearly 5 million people who attended enjoyed it a few attended a few million people attended a few people attended few attended *few million people attended millions attended *5 millions attended millions of people attended hundreds of millions of people attended 5 million years ago, the earth was covered with ice millions of years ago, the earth was covered with ice *dogs of years ago, the earth was covered with ice *the five million years ago, the earth was covered with ice *the other five million years ago, the earth was covered with ice *5 million ago, the earth was covered with ice The city of New York contains over one hundred million billion brain cells Almost one third of the people in the country have no health insurance Of all the people in this country, almost one third have no health insurance Three quarters of a million people in this city have no health insurance The price of the stock rose three tenths of one point *The price of the stock rose three tenths of one dog The nearest drug store is about three quarters of a mile away The nearest drug store is about 3/4 of a mile away Every morning I walk 3 1/2 miles *Every morning I walk 1/2 3 miles Nearly 1/2 million people work here every day Nearly 1 1/4 million people work here every day *Nearly 1 million 1/4 people work here every day Between 500 and 1000 people pass through here every minute They are the Number 3 auto maker and a Fortune 500 company I live at 805 West Indiana Street %TIME EXPRESSIONS We're thinking about going to a movie this evening *We're thinking about going to a movie this theater I've been grading these stupid exams all day *I've been grading these stupid days all exam We're having a big party Tuesday *We're having a big party our house *There is going to be an important meeting January There is going to be an important meeting in January There is going to be an important meeting next January The party last week was a big success John last week threw a great party Until recently, these fossils were believed to belong to different species *Until initially, these fossils were believed to belong to different species *Until for many years, these fossils were believed to belong to different species Until last week, these fossils were believed to belong to different species *Until last meeting, these fossils were believed to belong to different species I'm quite excited about next week Monday sounds good for the meeting Tomorrow might be a good time for the meeting Last Tuesday was really fun *Three days ago was really fun Almost three years after our first date, I saw Ruth again Almost three years after I first met her, I saw Ruth again *Almost three years, I saw Ruth again Almost three years later, I saw Ruth again *Almost three years for our first date, I saw Ruth again I saw her again a year and a half later *I saw her again a year and a dog later He left here a quarter of an hour ago *He left here a quarter of a dog ago *He left here a picture of an hour ago I still remember the day I kissed him *I still remember the room I kissed him I'm going to Europe the day I graduate Clinton is expected to return to Washington Thursday morning *Clinton is expected to return to Thursday Washington office Clinton is expected to return to Washington on Thursday morning Clinton is expected to return to Washington late Thursday morning Clinton is expected to return to Washington next Thursday morning She walked out of the room the minute I saw her *She walked out of the room two minutes I saw her I was crazy about him the first time I saw him *I was crazy about him the first party I saw him In January 1990, a historic new law was passed *In Washington 1990, a historic new law was passed On January 15, 1990, a historic new law was passed *On January 320, 1990, a historic new law was passed He was convicted under an obscure 1990 law *He was convicted under an obscure 50 law I wish I could see him 100 times a day *I wish I could see him 3 meals a day *I wish I could see him 100 times a dog *I wish I could see him 100 times 2 days It's good to eat three big meals a day Someone is mugged in New York every five minutes Her career lasted almost thirty years *Her career lasted almost thirty books Every morning at 5 a.m., Ken gets up and runs for five miles At 4:52 p.m., on Monday, December 26, 1997, nothing happened %QUESTIONS AND RELATIVE CLAUSES Which dog did you chase *Which dog you chased Which dog did you say you chased *Which dog you said you chased *Which dog did you say did you chase I wonder which dog he said you chased *I wonder which dog did he say you chased *I wonder which dog did he say did you chase What did John say he thought you should do *What did John say did he think you should do *What John said he thought you should do What Alice did really annoyed me *Who Alice did really annoyed me Whoever designed this program didn't know what they were doing *Who designed this program didn't know what they were doing Invite John and whoever else you want to invite The dog which Chris bought is really ugly *The dog what Chris bought is really ugly I wonder whether we should go *Whether should we go We can't decide whether to go to the party *We can't decide who to go the party *We can't decide whether to go the the party with I am wondering who to go to the party with I am wondering who to invite to the party *I am wondering whether to invite to the party *I am wondering the people to invite to the party *Whether to go to the party *Who to invite to the party Do you think we should go to the party *What do you think we should go to the party How do you operate this machine How fast is the program How certain are you that John is coming *How tired are you that John is coming How likely is it that he will come *How likely is John that he will come How certain does he seem to be that John is coming How efficient a program is it *Efficient a program is it *How fast programs are they *How fast the program is it How fast a program does he think it is *How fast a program he thinks it is *How fast programs does he think they are *How big a dog chased you I wonder how fast a program he thinks it is *I wonder how fast a program does he think it is How much money did you earn *How much money you earn I wonder how much money you earned *I wonder how much money have you earned How much oil spilled How much do you swim *How much you swim I wonder how much you swim *I wonder how much do you swim *I don't have how much money I don't have very much money I don't have much money How much did you read *How much of the book you read How much of the book did you read I wonder how much of the book you read How many people died How many people did you see *How many people you saw I wonder how many people you saw I wonder how many of the people you saw were students How did John do it I wonder how John did it How long will it last *How big will it last How many years did it take to do it How big is the department *How big the department is *I wonder how big is the department I wonder how big the department is *I wonder how big departments they are *I wonder how a department it is I wonder how big a department it is How important is it to turn the computer off I wonder how important it is to turn off the computer *I wonder how important is it to turn off the computer How quickly did Joe run *How quickly Joe ran I know how quickly you ran *I know how quickly did you run *He ran I know how quickly *Quickly did Joe run *Very quickly did Joe run *I know very quickly did Joe run *I know quickly did John run How much more quickly did you run *How much more quickly you run *I wonder how much more quickly did he run I wonder how much more quickly he ran How much more quickly did he run than Joe How much more should we work on this How much further do you think we should drive tonight I don't know how much longer I can tolerate this How much bigger is the dog *How much bigger dogs are they *How much bigger dogs ran *How big dogs run How much further did you run How much more oil spilled How much more spilled How much more oil did they spill How much more did they spill *How much more they spilled I wonder how much oil spilled I wonder how much oil they spilled *How much more efficient programs are available How many dogs ran How many ran How many dogs did you see How many more people did you see How many more people do you think will come I wonder how many more people he thinks will come *I wonder how many more people does he think will come How many times did you do it *How many times you did it I wonder how many times you did it *How many more stupid times did you do it How many years ago did you do it *Many years ago did you do it *How many years did you do it I wonder how many years ago you did it *How many years ago you did it I'll show you the house where I met your mother *I'll show you the house which I met your mother This is the man whose dog I bought *This is the man which dog I bought I wonder where John is *I wonder where John hit The dogs, some of which were very large, ran after the man The dogs, some of which I had seen before, ran after the man *The dogs some of which were very large ran after the man The box contained many books, some of which were badly damaged *Some of which were badly damaged *The box contained many books, some were badly damaged *The box contained many books, some of the books were badly damaged The dogs, some of them very large, ran after the man *The dogs, some of the dogs very large, ran after the man *Some of them very large ran after the man The man was chased by dogs, some of them very large I believe it was John who stole the priceless documents *I believe Fred was John who stole the priceless documents It seems to have been Einstein who first came up with the idea *There seems to have been Einstein who first came up with the idea *It hopes to have been Einstein who first came up with the idea *The book discussed Einstein who first came up with the idea *Stravinsky was in Paris that Debussy first heard Balinese music It was in Paris that Debussy first heard Balinese music It must have been there that he realized his destiny *It tried to have been there that he realized his destiny *He composed some good music that he realized his destiny *It was quickly that he wrote his first symphony Wasn't it in 1955 that Sally first met Joe Whatever the outcome, I'm sure he'll still be popular *Whatever an outcome, I'm sure he'll still be popular Whatever the outcome is, I'm sure he'll still be popular *What the outcome is, I'm sure he'll still be popular %CONJUNCTIONS The man we saw when we went to Paris is here *The man we saw but we went to Paris is here You should see a play while in London *You should see a play after in London I left the party after seeing Ann there *I left the party because seeing Ann there *I left the party despite I saw Ann there Because I didn't see Ann, I left *Therefore I didn't see Ann, I left I left, therefore I didn't see Ann But I really wanted to see her *After I really wanted to see her As I suspected, he had already left *Because I suspected, he had already left *I suspected, he had already left *I suspected Some grammars are better than others, as we have proved As had been expected, the party was a big success *As had been green, the party was a big success *As had wanted to be expected, the party was a big success *As had expected the party to be a success, it was a success In the event that the case goes to trial, I'm sure Clinton will be acquitted *In the scandal that the case goes to trial, I'm sure Clinton will be acquitted He should be acquitted, on the grounds that there's no evidence The public seem to love him, no matter what he does *The public seem to love him, no matter the stupid things he does %VERBS Abrams does like programming *Abrams does be a good programmer He is being hired by another company He is looking for another job Fred has had five years of experience as a programmer *Fred has had been a programmer for five years I gave my mother the present I bought for her I gave her the present I bought for her *I gave my mother it We picked out some beautiful flowers for her We picked some beautiful flowers out for her We picked them out for her *We picked out them for her Did you put the milk in the refrigerator *Did you put the milk Where did you put the milk I hope he comes to the party tomorrow I hope that he comes to the party tomorrow *I hope him to come to the party tomorrow I expect him to come to the party tomorrow I expect to go to the party tomorrow *I expect *I expected who would come to the party I knew who would come to the party *I expected he go to the party I suggested he go to the party *He knew me how to use the program He asked me how to use the program *He disputed our program was superior He disputed that our program was superior Anne told me I would almost certainly be hired *Anne expected me I would almost certainly be hired *We argued adding new features to the program We discussed adding new features to the program *I thought terrible after our discussion I felt terrible after our discussion I made him make some changes in the program *I encouraged him make some changes in the program I helped him make some changes in the program I helped make some changes in the program *I saw make some changes in the program *I made him telling her about the party I saw him telling her about the party Phil gave me a sweater which he bought in Paris *Phil chose me a sweater which he bought in Paris Alan bet me five dollars Clinton would lose the election *Alan offered me five dollars Clinton would lose the election She said she didn't approve of my behavior *She said she didn't like of my behavior The results are in, the game is up and the truth is out *The in results show the out truth about the up game *The results became in and the truth seemed out He sold for five dollars the ring his mother had given him Clinton announced on Tuesday a bold new proposal *Clinton announced on Tuesday it I gave my brother an expensive present I gave him an expensive present I gave an expensive present I gave it *I gave my brother it I gave him for his birthday a very expensive present *I gave him for his birthday it I gave for his birthday an expensive present *I gave for his birthday it The President announced on Monday that several more bases would be closed He had attempted for years to make a career as a concert pianist *He had attempted for years I asked him when I saw him at the party yesterday what he was working on *I talked to him when I saw him at the party yesterday what he was working on I wondered for a long time why everyone liked her so much *I thought for a long time why everyone liked her so much I told Margaret that I thought she would probably be hired *I told on Tuesday Margaret that I thought she would probably be hired I told Margaret on Tuesday that I thought she would probably be hired We discussed at the meeting hiring a new secretary *We discussed at the meeting We informed the new employees that no salary increase would be possible We informed at the meeting the new employees *We informed at the meeting the new employees that no salary increase would be possible They were asked that he be allowed to go If his calculations were correct, Copernicus reasoned, the earth must revolve around the sun The earth, Copernicus reasoned, must revolve around the sun The earth must revolve around the sun, Copernicus reasoned *The earth must revolve around the sun, Copernicus was happy *The earth must revolve around the sun, Copernicus destroyed *The earth, the pope cringed when Copernicus reasoned, revolves around the sun Abortion was legal until the third month, the court ruled If the pregnancy was within the first three months, the court ruled, abortion was legal Nobody, it seems, wants to be a liberal *Nobody, John seems, wants to be a liberal Business is booming, Joe Smith, a car dealer, says Business is booming, says Joe Smith, a car dealer You can do anything you want, I told her In the last few years, it seems, nobody wants to be a liberal Also invited to the meeting were several prominent scientists *Also invited to the meeting invited several prominent scientists Also awarded the prize was Jean Smith, a prominent computer scientist Chosen to lead the commission was Fred Schultz, a former Federal judge *Chosen to lead the commission seemed likely to be Fred Schultz, a former Federal judge *Chooses to lead the investigation Fred Schultz *Choose to lead the investigation did Fred Schultz Also recommended in the report was a new initiative to combat crime *Also chosen the leader for the commission was Fred Schultz Included in our paper is a summary of the features of our program Also performing in the concert were members of the Budapest Quartet *Were performing in the concert members of the Budapest Quartet Voting in favor of the bill were 36 Republicans and 4 moderate Democrats Glaring coldly at Sarah, he walked out of the room He walked out of the room, glaring coldly at Sarah *Glaring coldly at Sarah, walking out of the room Finding that it was impossible to get work as a waiter, he worked as a janitor He had hoped to get work as a waiter, but, finding this was impossible, he worked as a janitor *He said that, finding that it was impossible to get work as a waiter, he would work as a janitor Used by some of the finest pianists in the country, Baldwin pianos are technical marvels Using specially designed parts, Baldwin pianos are technical marvels *Used specially designed parts, Baldwin pianos are technical marvels Sending a message of discontent to Washington, voters overwhelmingly rejected the Clinton administration She's a really good player John's coming to the party tonight He's usually gone to Boston for Thanksgiving *Do you know where John's Who's afraid of the big bad wolf That's just the kind of person he is *That's just the kind of person he's There's no reason to get so upset about it I didn't think he would do it, but he did *I didn't think he would invite her, but he invited If you don't want to do it, you should find someone who will If you don't want to do it, you should find someone who does Find someone who does *Find someone who wants to do I don't like programming, and someone who does may be difficult to find The price of the stock more than doubled in two days *The price of the stock more than increased in two days I finally figured out why this program is so slow *I finally flipped out why this program is so slow It turns out that Clinton didn't actually kiss Monica If you go around doing that, you're going to end up making people mad The lawyer pointed out that Clinton didn't actually kiss Monica A party is taking place, so if you'd like to show up, you should do so %PREPOSITIONS I have doubts about inviting him *I have doubts during inviting him I prevented her from doing it by praising her for not doing it From your description, I don't think I would enjoy it We had an argument over whether it was a good movie *We had an argument at whether it was a good movie Because of the rain, we decided to stay home They're having a party in front of the building The man with whom I play tennis is here The man I play tennis with is here *The man whom I play tennis is here *The man with whom I play tennis with is here With whom did you play tennis Who did you play tennis with The data on file will be used for the project at hand, which is already under way *The data on project will be used for the file at program The project was finished on schedule, as usual *The project as usual and the report on schedule were finished I told him by telephone that I was coming by car From in back of the shed, I heard a scream that seemed to come from on top of the garage The university spends $5 per student *The university spends $5 per the student They're building a gigantic mall five miles from here *They're building a gigantic mall five mistakes from here The 7-11 is half a mile up the road, but the supermarket is a long way away I'm sure things will get done with Janet running the company *I'm sure things will get done by Janet running the company *I'm sure things will get done because Janet running the company With Janet in charge, I'm sure things will get done %ADJECTIVES You are lucky that there is no exam today *You are stupid that there is no exam today You are lucky I am here *You are right I am here This is something we should be happy about *This is something we should be happy *The happy about it man kissed his wife Is he sure how to find the house *Is he correct how to find the house You should be proud of your achievement *You should be happy of your achievement He is the smartest man I know *They are some smartest men I know I've seen a lot of programs, but ours is the fastest Ours is the fastest of the programs we have seen I've seen a lot of programs, but ours runs the most quickly *This is our the fastest program Voters angry about the economy will probably vote for Clinton *Voters angry will probably vote for Clinton Many Democrats unhappy about the economy but doubtful that Clinton can be elected probably won't vote at all *Many Democrats unhappy but doubtful probably won't vote at all *Many Democrats likely that Bush will be reelected probably won't vote Hundreds of young men, furious about the verdict in the Rodney King case, looted stores in Los Angeles today *Hundreds of young men, furious, looted stores in Los Angeles today We need a programmer knowledgeable about Lisp *We need a programmer knowledgeable Any program as good as ours should be useful *Any program good should be useful Let us know if you have a program capable of parsing this sentence *Let us know if you have a program capable It is believed that even the troops loyal to Hussein will soon be forced to surrender *It is believed that even the troops loyal will soon be forced to surrender Republican policies only benefit the rich and powerful Republican policies only benefit the rich and the powerful *Republican policies only benefit a rich and a powerful *Republican policies only benefit some rich and some powerful The meek will inherit the earth, and the best is the enemy of the good They're building a skyscraper over 1000 feet tall *They're building a skyscraper tall The river is half a mile wide here and 300 feet deep *The river is half a mile beautiful and 300 feet dangerous Mr. John Smith, 66 years old, will succeed him as president *Mr. John Smith, old, will succeed him as president A big black ugly dog chased me A big, black, ugly dog chased me The former astronaut was alone and afraid *The alone astronaut was former %ADVERBS He is apparently an expert on dogs *He knows apparently an expert on dogs Mary quickly walked out of the room Mary just walked out of the room Quickly, Mary walked out of the room Mary walked out of the room quickly *Mary walked out of the room just He told them about the accident immediately *He told them about the accident presumably He told them about the accident, presumably She is very careful about her work She works very carefully *She very works carefully Is the piece easy enough for you Is the piece too easy for you *Is the piece enough easy for you She is apparently an excellent pianist *She married apparently an excellent pianist Only after the movie did he realize his mistake *After the movie did he realize his mistake I may have taken cocaine a few times, but at no time did I inhale *A few times may I have taken cocaine, but I inhaled at no time Never have I seen such a grotesque display of incompetence *Often have I seen such a grotesque display of incompetence We like to eat at restaurants, particularly on weekends We like to eat at restaurants, usually on weekends *We like to eat at restaurants, fortunately on weekends Such flowers are found mainly in Europe *Such flowers are found apparently in Europe *Such flowers are found mainly particularly in Europe *Such flowers are found mainly Many people, particularly doctors, believe there is no health care crisis *Many people, strongly doctors, believe there is no health care crisis I found a house that even John thinks we should buy He told me that even his mother likes me *He told me that even, his mother likes me We put the pie straight in the oven *We put the pie quickly in the oven We put the pie straight in *We put the pie straight He lives high in the mountains He lives over by the lake *He lives over by The apparently angry man walked out of the room The often underpaid administrators resent the invariably rude students and the understandably impatient professors The delicately lyrical tone of the cello contrasted with the fiercely percussive piano chords The always delicately lyrical tone was really beautiful *The delicately always lyrical tone was really beautiful *The delicately very lyrical tone was really beautiful Biochemically, I think the experiment has a lot of problems I think the experiment has a lot of problems biochemically It is biochemically an interesting experiment I'm not sure the results are biochemically valid %IT-THERE-THIS There is a dog in the park *There is chasing dogs *There are a dog in the park Does there seem to be a dog in the park? *Does there want to be a dog in the park? There seems to appear to have been likely to be a problem *There seems to appear to have been likely to be problems *There seems to appear to have been likely to be stupid There was an attempt to kill Rod The man there was an attempt to kill died There was a problem, but we solved it It is likely that Rod died *Joe is likely that Rod died It is clear who killed Rod *Joe is clear who killed Rod It may not be possible to fix the problem Grace may not be possible to fix the problem It is important that women be ready when they make these choices *It is clear that women be ready when they make these choices *Joe is important that women be ready when they make these choices flowers are red to attract bees I made it clear that I was angry *I made Anne clear that I was angry Dick is easy to hit *Dick is big to hit It is important to fix the problem Dick is important to fix the problem The man it is likely that John hit died *The man Joe is likely that Dick hit died Does it seem likely that Ann will come Does Ann act glad that Joe came *Does it act likely that Joe came It doesn't matter what Ted does *Joe doesn't matter what Ted does I want it to be possible to use the program I want Joe to be possible to use the program I want it to be clear that it was my idea *I asked it to be clear that it was my idea I want it to be obvious how to use the program *I want Emily to be obvious how to use the program I want Joe to be easy to hit It is likely they will come *Joe is likely they will come This is because he is extremely famous The trial is because he is extremely famous The excitement over the trial is because he is extremely famous This seems to have been because he is extremely famous %COMPARATIVES Our program works more elegantly than yours Ours works more elegantly than yours does Ours works more elegantly than yours works *Ours works more elegant than yours *Ours is more elegant than yours works Our program works more elegantly than efficiently Our program is more elegant than efficient Our program works better than yours We do this more for pleasure than for money He is more likely to go than to stay *He is more likely than to stay *He is more black to go than to stay He is more likely to go than he is to stay He is more likely to go than John is It is more likely that Joe died than that Fred died It is more likely that Joe died than it is that Fred died *John is more likely that Joe died than it is that Fred died *It is more likely that Joe died than John is that Fred died It is easier to ignore the problem than to solve it It is easier to ignore the problem than it is to solve it *Greg is easier to ignore the problem than to solve it Our program is easier to use than to understand *Our program is easier to use it than to understand I am more happy now than I was in college *I am more happy now than I earned in college He is more a teacher than a scholar I make more money in a month than John makes in a year I make more money in a month than John dies in a year I hit more the dog than the cat I have more money than John has time I have more dogs than John has five cats I have more money than John has a dog She interviewed more programmers than were hired *She interviewed more programmers than was hired I am as intelligent as John I earn as much money as John does I am as intelligent as John does I earn as much money in a month as John earns in a year *I earn as much money in a month than John earns in a year Our program was better than had been expected *Our program was better than had been argued *Our program was better than had been responded Our program was better than was expected *Our program was better than were expected More people came to the party than were expected More people came to the party than was expected Our program did not run as quickly as expected *Our program did not run as quickly as said How much faster is our program than theirs *How much faster our program is than theirs The more quickly we write the program, the more money we will earn *The more people like the program *The people like the program, the more money we will earn The better the program is, the more people will like it The better the program, the more people will like it *The better a program, the more people will like it The less likely it is that we can parse this, the easier it is to understand % "SO THAT", "SUCH...THAT" The shuttle is so big that it has to be carried on the back of a jet *The shuttle is big that it has to be carried on the back of a jet So many people attended that they spilled over into several neighboring fields *Many people attended that they spilled over into several neighboring fields The program has so many problems that you should probably just rewrite it *The program has many problems that you should probably just rewrite it I love her so much that I can't let her go *I love her very much that I can't let her go He ran home so quickly that his mother could hardly believe he had called from school *He ran home quickly that his mother could hardly believe he had called from school She presented her case with such eloquence that we could only admire her *She presented her case with eloquence that we could only admire her %"AND", ETC. I went to the store and got a gallon of milk *I got and went a gallon of milk I got a gallon of milk and some eggs I went to the store, got a gallon of milk, and returned the eggs % Sentence belwo was marked bad, but this seems arguable to me .. !? % *I went to the store, got a gallon of milk, and some eggs Mary, Joe and Louise are coming to the party Neither Mary nor Louise are coming to the party I am ready and eager to go to the party She handled it skillfully and with compassion I told him that I hated him and that I never wanted to see him again He told me why he was here and what he was doing *He told me why he was here and that he hated me Although he likes me and he respects me, he says he needs some privacy Your house and garden are very attractive I am in New York and I would like to see you This is not the man we know and love *This is not the man we know and love him The coverage on TV and on the radio has been terrible *The coverage on TV and I have seen has been terrible The sky is blue, so it is likely that Joe will come *It is blue and likely that Joe will come That is the man for whom and with whom Joe works *That is the man for whom and with Janet Joe works *When did Joe and John did leave the party % Huh ??? what's the correct parse/meaning of this sentence? % "my dog's freind came" is one of the parses !!?? wtf .. % My dog, cat, and cousin's friend came *My dog, cat, horse, mouse, and his cow left My dog, cat, horse, and mouse, and his cow left you should not only ask for your money back, but demand it I was both angry and sad at the same time %PLURALIZATION IN CONJUNCTIONS There is neither a dog nor a cat here *There are neither a dog nor a cat here There is a dog or a cat here *There are a dog or a cat here *There are a dog and a cat here There is a dog and a cat here He and I are friends neither I nor my friend knows what happened neither I nor my friend know what happened Either I or my friend knows what happened Either I or my friend know what happened The dog and cats know what happened *The dog and cats knows what happened Are a dog and a cat here *Is a dog and a cat here *Is John and I invited Are John and I invited Is John or I invited Are John or I invited Is neither John nor I invited Are neither John nor I invited %GERUNDS Playing the piano bothers John Releasing the program at this point would annoy our competitors The playing of the piano really bothers John *The playing the piano really bothers John Telling Joe about the party would create a real problem *The telling Joe about the party could create a real problem Your telling Joe about the party could create a real problem Telling Joe that Sue was coming to the party would create a real problem Telling would create a real problem I want her to know about it, but the telling won't be easy *The telling her won't be easy *Some children like to tease Teasing can be very cruel Your telling John to leave may have destroyed your relationship The graduating of Fred changes the situation The sleeping of students is becoming a big problem The sleeping of students can ruin a lecture Buying of shares was brisk on Wall Street today The sleeping in class is becoming a big problem *The telling John to leave was stupid *The inviting your mother was stupid *The showing how to use the program seemed to interest people *The attempting to go to the party angered Joe The showing of the program seemed to impress people The sleeping of students described by Fred is a big problem The sleeping of students I told you about is a big problem The frequent sleeping of students is a big problem His hitting of the dog didn't help matters Some hitting of dogs will solve the problem the drug running here has become a massive problem He made a mistake in inviting John He made a mistake in the inviting of John I should have talked to you before inviting John I should have talked to you before the inviting of John %SPECIAL SUBJECTS: INFINITIVES, CLAUSES, AND INDIRECT QUESTIONS To pretend that our program is usable in its current form would be silly *To pretend that our program is usable in its current form would be happy That our program will be immediately accepted is hardly likely *That our program will be immediately accepted wrote the program *Is that our program will be accepted likely *That our program will be accepted seems likely that our program will be accepted Whether we should go to the party is the important question *Whether we should go to the party annoys me %LONGER CONSTRUCTIONS, PUNCTUATION, AND CAPITALIZATION Using the conventional Minuet form, Beethoven produced a piece of great originality Written in 1820, the symphony shows a new level of maturity for the composer Abandoned by his friends, he left Vienna three years later In Vienna, Beethoven met someone who would later be greatly influenced by him: Franz Schubert *In Vienna, Beethoven met someone who would later be greatly influenced by him; Franz Schubert Today I did something very important: I bought a dog *The store where I did something very important: I bought a dog was closed today It has been said that Schubert ran out of the room when he met Beethoven; but we now know this is untrue An important question remains: did Beethoven know about Schubert's music She just wanted one thing: to be a professional skater She knew one thing: that she would be a professional skater I agree that, in some ways, your program is better I agree that in some ways, your program is better *I agree that, in some ways your program is better That is the man who, in Joe's opinion, we should hire *That is the man, in Joe's opinion, we should hire *That is the man who, in Joe's opinion we should hire I know you hate Bill, but why did you send him that nasty note *I know you hate Bill, because why did you send him that nasty note But why did you send him that nasty note If John was with Lisa last night, who went to the movie with Diane *Although John was with Lisa last night, who went to the movie with Diane We need a President who understands us We need a president who understands us *We need a Melvin who understand us The Zongle of Bongle Dongle resigned today % A Zongle with a bad haircut resigned today -- is valid. % A Zongle with a Mercedes Benz resigned today -- is valid. % *A Zongle with a Bongle Dongle resigned today The National Association of Linguists is meeting here *An Association that many Linguists belong to is meeting here An association that many linguists belong to is meeting here If you were a middle-class American without a job, who would you vote for Many Croats who had fled their homes are now returning to them *Many Croat who had fled their homes are now returning to them Chinese is a wonderful language, Chinese food is nice, and the Chinese are nice people *Armenian is a wonderful language, Armenian food is great, and the Armenian are nice people Armenian is a wonderful language, Armenian food is great, and the Armenians are nice people Danish is a wonderful language, Danish food is great, and the Danish are nice people The Danes are nice people Dr Jane Smith lives on Main St Dr. Jane Smith lives on Main St. *Dr. Jane. Smith. lives on Main. St. Dr. J.G.D. Smith lives on Main St. *A Dr. lives on this St Mr. Smith (a lawyer for Kodak) refused to comment Mr. Smith -- a lawyer for Kodak -- refused to comment We left (carrying the dog) and Fred followed I have $50, but I want a $50000 car 10% of the employees here do 90% of the work Zangbert stock fell 30% to $2.50 yesterday, but jumped 10% today in heavy trading *Zangbert stock fell %, but jumped to $ today With a 5% raise, I can get a $50000 car "What are you doing?" she asked. "This is what I'm going to do," he replied. "This is what I'm going to do!" he replied. *"This is what I'm going to do." he replied. *"This is what I'm doing to do" he replied. "On second thought," he said, "this is what I'm going to do". "Quotation marks" are simply "ignored" by our "program" Sometimes, people do this: They follow the colon with a capital letter. *However, they never do this; They don't follow a semi-colon with a capital letter. John said: "This is another use of colons one sometimes sees". Formerly, he had worked for Brody, McGill & Demson *He was unhappy & underpaid The rally, at 6:00 last night, was attended by 1.1 million people link-grammar-4.7.4/data/en/4.0.dict.m40000644000175000017500000074703211526022265016127 0ustar bloombloomdnl dnl Macro version of the 4.0.dict file. This is file is used to simplify dnl the maintenance of the verb definitions; it defines a handful of dnl macros to deal with the case of conjoined verbs. Pre-process this dnl file with the m4 macro pre-processor to create 4.0.dict dnl That is, at the command line, run: dnl m4 4.0.dict.m4 > 4.0.dict dnl dnl the comment delimiter for link-grammar data files is % changecom(`%') %***************************************************************************% % % % Copyright (C) 1991-1998 Daniel Sleator and Davy Temperley % % Copyright (c) 2003 Peter Szolovits and MIT. % % Copyright (c) 2008, 2009, 2010, 2011 Linas Vepstas % % % % See file "README" for information about commercial use of this system % % % %***************************************************************************% % Dictionary version number is 4.7.4 (formatted as V4v7v4+) : V4v7v4+; % _ORGANIZATION OF THE DICTIONARY_ % % I. NOUNS % II. PRONOUNS % III. DETERMINERS % IV. NUMERICAL EXPRESSIONS % V. VERBS % A. Auxiliaries; B. Common verb types; C. complex intransitive verbs; % D. complex intransitive verbs; E. complex verbs taking [obj] + % [complement]; F. idiomatic verbs % VI. PREPOSITIONS % VII. TIME AND PLACE EXPRESSIONS % VIII. QUESTION-WORDS AND CONJUNCTIONS % IX. ADJECTIVES % X. COMPARATIVES AND SUPERLATIVES % XI. ADVERBS % A. Mainly adjectival; B. Mainly post-verbal; C. Post-verbal/pre-verbal; % D. Post-verbal/pre-verbal/openers; E. Post-verbal/openers; % F. Pre-verbal/openers % XII. MISCELLANEOUS WORDS AND PUNCTUATION % % NEW LINKS INVENTED BY MIKE ROSS % Ct and Cta are used with comparatives so that 'than' links to the relative clause % John is bigger than Dave is. % John wants more cookies than Dave wants. % % Rw is used similarly to Ct, Cta, and Rn to link question words to the relative clauses % that follow them. % For auxillary verbs, replaced "{Q-}" with "(Rw- or Q-}". % For nouns and others, replaced "B*m+" with "(Rw+ & B*m+)" (for any *) % For who,what,which,whom, replaced "B*" with "(R+ & B*+)" (for any *) % % TODO: % To-do: many verb simple past-tense forms include ({@E-} & A+) to % make them adjective-like. Strictly speaking, these should probably % copied into words.adj.1 and treated like common adjectives, right? % % Many nouns in words.n.4 are treated as "mass or count". The side % effect is that mass nouns are inconsistently treated as sometimes % singular, sometimes plural. e.g. words.n.3 gets & % . This is a kind-of ugly tangle, it should really % be sorted out so that links are properly marks as s, p or m. % This is mostly fixed, except that some uses of % remain, below. % Null links. These are used to drop the requirement for certain words % to appear during parsing. Basically, if a parse fails at a given cost, % it is retried at a higher cost (by raising the disjunct_cost). % Currently, two different nulls are defined: a regular null, and a % costly null. The regular null is used to make determiners optional; % this allows for the parsing of newspaper headlines and clipped % technical speech (e.g. medical, engineering, where dterminers are % dropped). The costly-null is used during panic parsing. % Currently, both have the same cost: using the ordinary null allows % too many sentences to be parsed incorrectly. : [[[()]]]; : [[[()]]]; % NOUNS % The marker-entity is used to identify identity names. % The marker-common-entity is used to identify all common nouns % and adjectives that might appear in entity names: % e.g. "Great Southern Federal Bank and Railroad" or "Aluminum Bahrain" : XXXENTITY+; : XXXGIVEN+; % The RJ links connect to "and"; the l,r prevent cross-linking : RJrc- or RJlc+; : {({@COd-} & (C- or )) or ({@CO-} & (Wd- & {CC+})) or [Rn-]}; : {({@COd-} & (C- or )) or ({@CO-} & (Wd- & {CC+}))}; : {({@COd-} & (C- or )) or ({@CO-} & (Wd- or {CC+})) or Re-}; % Post-nominal qualifiers, complete with commas, etc. : ({[B*j+]} & Xd- & (Xc+ or ) & MX-); : ({[Bsj+]} & Xd- & (Xc+ or ) & MX-); : ({[Bpj+]} & Xd- & (Xc+ or ) & MX-); : ({[Buj+]} & Xd- & (Xc+ or ) & MX-); % noun-main-x -- singular or plural or mass. : (S+ & ) or SI- or J- or O- or or ; % noun-main-s -- singular : (Ss+ & ) or SIs- or Js- or Os- or or ; % noun-main-p -- plural : (Sp+ & ) or SIp- or Jp- or Op- or or ; % noun-main-u -- u == uncountable % TODO: alter this to use Su+, SIu- someday. likewise Buj+ % Doing this requires adding Su- links to many entries : (Ss+ & ) or SIs- or Ju- or Ou- or or ; % noun-main-m -- m == mass % TODO: get rid of this someday. % To get rid of this, any noun that uses this needs to be split into % two: the countable form, which will used and the % uncountable form, which will use : (Ss+ & ) or SIs- or Jp- or Os- or or ; : (Ss*b+ & ) or SIs*b- or Js- or Os- or or ; : J- or O- or or ; : Js- or Os- or or ; % Xd- or [[()]] allows parsing of "I have no idea what that is." % without requiring comma after "idea" : Js- or Os- or ({[Bsj+]} & (Xd- or [[()]]) & (Xc+ or ) & MX-) or ; : Jp- or Op- or or ; : Jp- or Os- or or ; % TO+: "The inability to laugh signifies trouble" % @M+: "The disability of John means he is slow" % XXX wait .. TO+ should only be for mass nouns ?? : {@M+} & {TO+} & {R+ & B+ & {[[@M+]]}} & {@MX+}; : {@M+} & {TO+} & {R+ & Bs+ & {[[@M+]]}} & {@MXs+}; : {@M+} & {TO+} & {R+ & Bp+ & {[[@M+]]}} & {@MXp+}; : {@AN-} & {@A- & {[[@AN-]]}}; % conjoined nouns or noun-phrases. % The l and r prevent two nouns from hooking up directly, they % must hook up to a conjunction (and, or) in the middle. % SJl == connect to left % SJr == connect to right % SJ*s == singular % SJ*p == plural % SJ*u == mass % % M+: "gloom of night and heat will not stop me" % The "of night" can connect to the left noun, but rarely to the right noun % because it should then connect to the "and", not the right noun. % but then: "neither heat nor gloom of night shall stop me" % Looks like only a proper semantic decision can determine the correct parse here ... : ({@M+} & SJls+) or ({[@M+]} & SJrs-) or (Dn- & SJn+); : ({@M+} & SJlp+) or ({[@M+]} & SJrp-) or (Dn- & SJn+); : ({@M+} & SJlu+) or ({[@M+]} & SJru-) or (Dn- & SJn+); : ({@M+} & SJl+) or ({[@M+]} & SJr-) or (Dn- & SJn+); : ({@M+} & SJlp+) or ({[@M+]} & SJrp-) or ({@M+} & SJlu+) or ({[@M+]} & SJru-) or (Dn- & SJn+); : {Rw+} & B*m+; : {Rw+} & Bsm+; : {Rw+} & Bpm+; % The use of Coa here needs to be carefully rexamined; it is used much too freely. : {[[Wi-]]} & ((Xc+ & Ic+) or ({Xd-} & (Xc+ or [[()]]) & [[COa+]])); % Just pure singular entities, no mass nouns % The CAPITALIZED-WORDS rule is triggered by regex matching, and % applies to all capitalized words that are not otherwise found in % the dictionary. % ({[[@MX+]]} & AN+) comes from postposed modifiers: % "Codon 311 (Cys --> Ser) polymorphism" % % We do NOT tag these with , a this messes up first-word % processing in tokenize.c. So for example, we do *not* want "There" % in "There they are" tagged as an entity, just because its capitalized. % We really do want to force the lower-case usage, because the lower case % is in the dict, and its the right word to use. (The only entities that % should be tagged as such are those that are in the dicts, in thier % capitalized form, e.g. "Sue.f" female given name as opposed to "sue.v" % verb in the sentence "Sue went to the store.") % % To help discourage capitalized use when the lower-case is in the dict, % we give a slight cost to [ & (JG- or )] to % discourage use as a common noun, so that the lower-case version can % play this role. % % MX+ & : country names: "...went to Paris, France" % CAPITALIZED-WORDS INITIALS NAME : ({NM+} & ({G-} & {[MG+]} & (({DG- or [[GN-]] or [[@A- & @AN-]] or [[{@A-} & {D-}]]} & ([ & (JG- or )] or or YS+)) or ({[[@MX+]]} & AN+) or G+))) or (MXs+ & ( or )) or ; % Capitalized words that seem to be plural (by ending with an s, etc) % -- But not all words that end with an 's' are plural: % e.g. Cornwallis ... and some of these can take a singular determiner: % "a Starbucks" PL-CAPITALIZED-WORDS: ({NM+} & {G-} & {[MG+]} & (({DG- or [[GN-]] or [[{@A-} & ({Dmc-} or {Ds-})]] } & ([ & (JG- or )] or or YS+ or YP+)) or AN+ or G+)) or ; % capitalized words ending in s % -- hmm .. proper names not used anywhere right now, has slot for plural ... !!?? : ({G-} & {[MG+]} & (({DG- or [[GN-]] or [[{@A-} & {D-}]]} & (({@MX+} & (JG- or )) or (YS+ or YP+))) or AN+ or G+)); % "Tom" is a given name, but can also be a proper name, so e.g. % "The late Mr. Tom will be missed." which needs A-, D- links : {G-} & {[MG+]} & (({DG- or [[GN-]] or [[{@A-} & {D-}]]} & (({@MX+} & {NMr+} & (JG- or or )) or YS+ or YP+)) or AN+ or G+); % Whole, entire entities, cannot participate in G links % because the entire entity has already been identified. : ({DG- or [[GN-]] or [[{@A-} & {D-}]]} & (({@MX+} & ) or or YS+)) or AN+; personID0 personID1 personID2 personID3 personID4 personID5 personID6 personID7 personID8 personID9 personID10 personID11 personID12 personID13 personID14 personID15 personID16 personID17 personID18 personID19 personID20 personID21 personID22 personID23 personID24 personID25 personID26 personID27 personID28 personID29 personID30 personID31 personID32 personID33 personID34 personID35 personID36 personID37 personID38 personID39 personID40 personID41 personID42 personID43 personID44 personID45 personID46 personID47 personID48 personID49 personID50 personID51 personID52 personID53 personID54 personID55 personID56 personID57 personID58 personID59 personID60: or ; organizationID0 organizationID1 organizationID2 organizationID3 organizationID4 organizationID5 organizationID6 organizationID7 organizationID8 organizationID9 organizationID10 organizationID11 organizationID12 organizationID13 organizationID14 organizationID15 organizationID16 organizationID17 organizationID18 organizationID19 organizationID20 organizationID21 organizationID22 organizationID23 organizationID24 organizationID25 organizationID26 organizationID27 organizationID28 organizationID29 organizationID30 organizationID31 organizationID32 organizationID33 organizationID34 organizationID35 organizationID36 organizationID37 organizationID38 organizationID39 organizationID40 organizationID41 organizationID42 organizationID43 organizationID44 organizationID45 organizationID46 organizationID47 organizationID48 organizationID49 organizationID50 organizationID51 organizationID52 organizationID53 organizationID54 organizationID55 organizationID56 organizationID57 organizationID58 organizationID59 organizationID60: or ; locationID0 locationID1 locationID2 locationID3 locationID4 locationID5 locationID6 locationID7 locationID8 locationID9 locationID10 locationID11 locationID12 locationID13 locationID14 locationID15 locationID16 locationID17 locationID18 locationID19 locationID20 locationID21 locationID22 locationID23 locationID24 locationID25 locationID26 locationID27 locationID28 locationID29 locationID30 locationID31 locationID32 locationID33 locationID34 locationID35 locationID36 locationID37 locationID38 locationID39 locationID40 locationID41 locationID42 locationID43 locationID44 locationID45 locationID46 locationID47 locationID48 locationID49 locationID50 locationID51 locationID52 locationID53 locationID54 locationID55 locationID56 locationID57 locationID58 locationID59 locationID60: or ; % Words that are also given names % Cannot take A or D links. % Art Bell Bill Bob Buck Bud % % The bisex dict includes names that can be given to both % men and women. /en/words/entities.given-bisex.sing /en/words/entities.given-female.sing /en/words/entities.given-male.sing: or or ; % Special handling for certain given names. These are words that have a % lower-case analog in the dictionary, and are also used in upper-case % form in an "idiomatic name" e.g. Vatican_City. Without the below, % this use of "City" would prevent it from being recognized in other % (non-idiomatic) proper name constructions, e.g. New York City. /en/words/entities.organizations.sing: or ; /en/words/entities.locations.sing: or ; % % entity IDs (mirror Capitalized-words - a mix of plural and singular) : ({DG- or [[GN-]] or [[{@A-} & {D-}]]} & (({@MX+} & ) or or YS+ or YP+)) or AN+; entityID0 entityID1 entityID2 entityID3 entityID4 entityID5 entityID6 entityID7 entityID8 entityID9 entityID10 entityID11 entityID12 entityID13 entityID14 entityID15 entityID16 entityID17 entityID18 entityID19 entityID20 entityID21 entityID22 entityID23 entityID24 entityID25 entityID26 entityID27 entityID28 entityID29 entityID30 entityID31 entityID32 entityID33 entityID34 entityID35 entityID36 entityID37 entityID38 entityID39 entityID40 entityID41 entityID42 entityID43 entityID44 entityID45 entityID46 entityID47 entityID48 entityID49 entityID50 entityID51 entityID52 entityID53 entityID54 entityID55 entityID56 entityID57 entityID58 entityID59 entityID60: or ; % words.n.4: nouns that can be mass or countable % allocation.n allotment.n alloy.n allure.n alteration.n alternation.n % piano.n flute.n belong here, because of "He plays piano" % This class has now been eliminated: nouns are either singular, plural % or mass. If they can be more than one, then they are listed separately % in each class e.g. words.n.1 and/or words.n.2 and/or words.n.3, etc. : & (({NM+} & AN+) or ({NM+} & {D*u-} & & ( or )) or or (YS+ & {D*u-}) or (GN+ & (DD- or [()])) or Us-); GREEK-LETTER-AND-NUMBER pH.i x.n: ; % Same as pattern used in words.n.4 -- mass nouns or countable nouns : ; % Pattern used for words.n.2.s % Similar to , but with different determiners for number % agreement. : [[AN+]] or ( & (({NM+ or Dmc-} & & ( or )) or ({NM+ or Dmc-} & ) or SJrp- or (YP+ & {Dmc-}) or (GN+ & (DD- or [()])) or Up-)); genericID0 genericID1 genericID2 genericID3 genericID4 genericID5 genericID6 genericID7 genericID8 genericID9 genericID10 genericID11 genericID12 genericID13 genericID14 genericID15 genericID16 genericID17 genericID18 genericID19 genericID20 genericID21 genericID22 genericID23 genericID24 genericID25 genericID26 genericID27 genericID28 genericID29 genericID30 genericID31 genericID32 genericID33 genericID34 genericID35 genericID36 genericID37 genericID38 genericID39 genericID40 genericID41 genericID42 genericID43 genericID44 genericID45 genericID46 genericID47 genericID48 genericID49 genericID50 genericID51 genericID52 genericID53 genericID54 genericID55 genericID56 genericID57 genericID58 genericID59 genericID60: or or ; %from words.y year numbers : NMd- or ({EN-} & (NIfn+ or NItn-)) or NN+ or AN+ or ((Xd- & TY- & Xc+) or TY-) or ({EN- or NIc-} & (ND+ or OD- or ({{@L+} & DD-} & ([[Dmcn+]] or (( or TA-) & (JT- or IN- or [[]])))))); dateID0 dateID1 dateID2 dateID3 dateID4 dateID5 dateID6 dateID7 dateID8 dateID9 dateID10 dateID11 dateID12 dateID13 dateID14 dateID15 dateID16 dateID17 dateID18 dateID19 dateID20 dateID21 dateID22 dateID23 dateID24 dateID25 dateID26 dateID27 dateID28 dateID29 dateID30 dateID31 dateID32 dateID33 dateID34 dateID35 dateID36 dateID37 dateID38 dateID39 dateID40 dateID41 dateID42 dateID43 dateID44 dateID45 dateID46 dateID47 dateID48 dateID49 dateID50 dateID51 dateID52 dateID53 dateID54 dateID55 dateID56 dateID57 dateID58 dateID59 dateID60: ; % ??? wtf? Is this like "roman numeral" ?? See I.p for "me" % XXX this is wrong or inappropriate .. % I.n: [[{Xi+} & {G-} & G+]]; % Explicitly include the period at the end of the abbreviation. Ms..x Mrs..x Mr..x Messrs..x Rev..x Dr..x Prof..x Atty..x Gov..x Sen..x Rep..x Gen..x Brig..x Col..x Capt..x Lieut..x Lt..x Maj..x Sgt..x Pvt..x Cmdr..x Adm..x Corp..x St..x Mt..x Ft..x Cie..x HMS..x: G+; % Period is missing in the abbreviation! Accept, but with a cost. Ms.x Mrs.x Mr.x Messrs.x Rev.x Sir.x Dr.x Prof.x Atty.x Gov.x Sen.x Rep.x Gen.x Brig.x Col.x Capt.x Lieut.x Lt.x Maj.x Sgt.x Pvt.x Cmdr.x Adm.x Corp.x St.x Mt.x Ft.x Cie.x HMS.x: [[G+]]; St.y St..y Ave.y Ave..y Av.y Av..y Pl.y Pl..y Ct.y Ct..y Dr.y Dr..y Gr.y Gr..y Rd.y Rd..y Blvd.y Blvd..y Pkwy.y Pkwy..y Hwy.y Hwy..y AG.y Assn.y Assn..y Corp.y Corp..y Co.y Co..y Inc.y Inc..y PLC.y Pty.y Pty..y Ltd.y Ltd..y LTD.y Bldg.y Bldg..y and_Co GmBH.y: G- & {Xi+} & {[MG+]} & (({DG- or [[GN-]] or [[{@A-} & {D-}]]} & (({@MX+} & (JG- or )) or or YS+ or YP+)) or AN+ or G+); % e.g. Joe Blow, Esq. or Dr. Smarty Pants, Ph.D. % Gack. See absurdely large collection at: % http://en.wikipedia.org/wiki/List_of_post-nominal_letters Jr.y Jr..y Sr.y Sr..y Esq.y Esq..y AB.y A.B..y AIA.y A.I.A..y BA.y B.A..y BFA.y B.F.A..y BS.y B.S..y BSc.y B.Sc..y CEng.y CEng..y CFA.y CPA.y CPL.y CSV.y DD.y D.D..y DDS.y D.D.S..y DO.y D.O..y D.Phil..y D.P.T..y Eng.D..y JD.y J.D..y KBE.y K.B.E..y LLD.y LL.D..y MA.y M.A..y MBA.y M.B.A..y MD.y M.D.y MFA.y M.F.A..y MS.y M.S..y MSc.y M.Sc..y OFM.y PE.y P.E..y Pharm.D..y PhD.y Ph.D.y Ph.D..y RA.y R.A..y RIBA.y R.I.B.A..y RN.y R.N..y USMC.y USN.y: {Xi+} & {Xd- & {Xc+}} & G- & {[MG+]} & (({DG- or [[GN-]] or [[{@A-} & {D-}]]} & (({@MX+} & (JG- or )) or or YS+ or YP+)) or AN+ or G+); HYPHENATED-WORDS.n: [[({@AN-} & {@A-} & (({NM+ or D-} & (( & ( or )) or )) or U-)) or ((YS+ or YP+) & {@AN-} & {@A-} & {D-})]]; % the generic category for strings containing a hyphen % NOUNS -------------------------------------------------------- % Nouns typically take determiners (a, the). The minor flags are: % D link: determiners: D1234 % position 1 can be s, m for singular, mass % position 2 can be c for count, u for uncountable % position 3 can be k,m,y for comparatives, w for questions. % words.n.1: Common nouns % activist.n actor.n actress.n actuary.n ad.n adage.n adagio.n adapter.n % The naked SJr- allows article to be skipped in conjunction (and,or) % constructions ("the hammer and sickle") : & (AN+ or ((NM+ or ({[NM+]} & (Ds- or ))) & (( & ( or )) or )) or SJrs- or (YS+ & Ds-) or (GN+ & (DD- or [()])) or Us-); /en/words/words.n.1 /en/words/words.n.1.wiki : or ; % Common plural nouns ending in "s" % allocations.n allotments.n allowances.n alloys.n allures.n allusions.n /en/words/words.n.2.s /en/words/words.n.2.s.wiki : or ; /en/words/words.n.2.s.biolg: ; PL-GREEK-LETTER-AND-NUMBER: ; % plural nouns not ending in "s" % aircraft.p bacteria.p bellmen.n buffalo.p businessmen.n chairmen.n /en/words/words.n.2.x /en/words/words.n.2.x.wiki : or ( & ([[AN+]] or ({NM+ or Dmc-} & (( & ( or )) or )) or (YS+ & {Dmc-}) or (GN+ & (DD- or [()])) or Up-)); % XXX should probably eliminate and replace by % but this requires other spread-out changes : or ( & (AN+ or ({NM+ or Dmu-} & (( & ( or )) or )) or (YS+ & {Dmu-}) or (GN+ & (DD- or [()])) or Up-)); % nouns that are mass only % absolutism.n absorption.n abstinence.n abundance.n academia.n /en/words/words.n.3: ; % Want to cost this so that it doesn't interfere with given name "Tom". tom.n-u: []; % Nouns that are also adjectives (e.g. red.n) and so we don't want to % allow these to take AN+ links. We need these as nouns, so as to % parse 'she prefers red'. However, assign a cost, so that 'her shoes % are red' gets red.a perfered over red.n. % [[Ds-]] to allow: "The house was painted a fading yellow" % % Doesn't seem to need a noun-and-x to make this work ... auburn.n black.n blue.n brown.n green.n gray.n pink.n purple.n red.n tawny.n ultramarine.n yellow.n: or ( & ((({Dmu- or [[Ds-]]}) & & ([ or ])) or (YS+ & {Dmu-}) or (GN+ & (DD- or [()])) or Up-)); % US state names and abbreviations % NM N.M. NY N.Y. NC N.C. ND N.D. Ohio Okla. /en/words/entities.us-states.sing: or ({G-} & {DG- or [[GN-]] or [[{@A-} & {D-}]]} & (({MG+} & {@MX+} & (JG- or or )) or G+ or ({[[MG+]]} & (AN+ or YS+ or YP+)))) or (Xc+ & Xd- & G- & AN+); % SINGULAR ENTITIES FOR ENTITY EXTRACTION % This must appear after other categories so it doesnt interfere with those. /en/words/entities.national.sing: or ; % Enable parsing of "Mother likes her" aunt.f auntie.f brother.m dad.m daddy.m father.m grandmother.f granny.f granddad.m grandfather.m grandpa.f grandpop.m mom.f mommy.f mother.f pop.m papa.m poppy.m pops.m sis.f sister.f uncle.m: ; alter_ego au_pair mise_en_scene faux_pas non_sequitur fait_accompli modus_vivendi head_of_state tour_de_force: ( & ((Ds- & & ( or )) or ({Ds-} & ) or Us- or (YS+ & Ds-) or (GN+ & (DD- or [()])))) or AN+; kung_fu joie_de_vivre op_art noblesse_oblige lese_majesty a_must time_of_day time_of_year force_majeure top_dollar year_end skim_milk breach_of_contract sleight_of_hand power_of_attorney word_of_mouth carte_blanche: ( & (({Dmu-} & & ( or )) or ({Dmu-} & ) or Um- or (YS+ & {Dmu-}) or (GN+ & (DD- or [()])))) or AN+; % title nouns (president, chairman) % auditor.t bailiff.t broker.t buyer.t candidate.t captain.t cardinal.t /en/words/words.n.t: & {@M+} & (BIt- or (Xd- & (Xc+ or ) & MX-) or TI-); % Almost identical to below. majority.n minority.n bunch.n batch.n bulk.n handful.n group.n: ( & ((Ds- & & ( or B*x+)) or ({Ds-} & ) or Us- or (YS+ & Ds-) or (GN+ & (DD- or [()])))) or AN+; % Almost identical to above. number.n: ( & ((Ds- & {NM+} & & ( or B*x+)) or ({Ds-} & {NM+} & ) or Us- or (YS+ & Ds-) or (GN+ & (DD- or [()])))) or AN+; % number appreviations: no.x No.x No.x no.x Num.x num.x: (Xi+ or [[()]]) & AN+; kind_of: ({{@AN-} & @A-} & U+ & ((Ds- & & ( or )) or ({Ds-} & ) or Us-)) or EA+ or EE+; type_of sort_of breed_of: {{@AN-} & @A-} & U+ & ((Ds- & & ( or )) or ({Ds-} & ) or Us-); kinds_of types_of sorts_of breeds_of: {{@AN-} & @A-} & U+ & (({Dmc-} & & ( or )) or ({Dmc-} & ) or Up-); percent.u: ( & ((ND- & {DD-} & & ( or B*x+)) or (ND- & {DD-} & ) or U-)) or (ND- & (OD- or AN+ or YS+)); % This set of disjuncts should probably be split up and refined. % "shame.n", "crux.n" are here because they need the Ss*t connector % to pick up "that" in "The crux of it is that we must act first." % However, report.n and sign.n and remark.n, etc. do not seem to % need this connector ... argument.n report.n sign.n impression.n conclusion.n complaint.n allegation.n announcement.n position.n restriction.n notion.n remark.n assertion.n proclamation.n reassurance.n saying.n accusation.n possibility.n idea.n problem.n claim.n result.n statement.n hunch.n assumption.n concept.n hypothesis.n implication.n message.n premonition.n prerequisite.n indication.n truism.n fallacy.n proposition.n prospect.n presupposition.n inkling.n supposition.n finding.n amount.n answer.n crux.n shame.n: ( & ((Ds- & {@M+} & {(TH+ or (R+ & Bs+)) & {[[@M+]]}} & {@MXs+} & ( or (Ss*t+ & ) or SIs*t- or )) or ({Ds-} & ) or Us- or (YS+ & Ds-) or (GN+ & (DD- or [()])))) or AN+; proof.n doubt.n suspicion.n hope.n knowledge.n relief.n disclosure.n fear.n acknowledgment.n acknowledgement.n principle.n concern.n philosophy.n risk.n threat.n understanding.n conviction.n theory.n assurance.n speculation.n awareness.n news.n opinion.n belief.n contention.n thought.n myth.n discovery.n rumor.n probability.n fact.n explanation.n feeling.n comment.n expectation.n perception.n sense.n realization.n view.n insistence.n consensus.n notification.n rule.n danger.n warning.n suggestion.n: ( & (({D*u-} & {@M+} & {(TH+ or (R+ & Bs+)) & {[[@M+]]}} & {@MXs+} & ( or (Ss*t+ & ) or SIs*t- or )) or ({D*u-} & ) or Us- or (YS+ & {D*u-}) or (GN+ & (DD- or [()])))) or AN+; evidence.n reasoning.n likelihood: ( & (({Dmu-} & {@M+} & {(TH+ or (R+ & Bs+)) & {[[@M+]]}} & {@MXs+} & ( or (Ss*t+ & ) or SIs*t- or )) or ({Dmu-} & ) or Up- or (YS+ & {Dmu-}) or (GN+ & (DD- or [()])))) or AN+; ideas.n opinions.n statements.n beliefs.n facts.n arguments.n principles.n theories.n philosophies.n signs.n impressions.n conclusions.n contentions.n complaints.n proofs.n doubts.n suspicions.n allegations.n reports.n claims.n announcements.n positions.n risks.n hopes.n explanations.n restrictions.n threats.n thoughts.n myths.n feelings.n discoveries.n rumors.n comments.n realizations.n probabilities.n remarks.n notions.n convictions.n hunches.n assumptions.n concepts.n hypotheses.n assertions.n expectations.n implications.n perceptions.n proclamations.n reassurances.n fears.n sayings.n senses.n messages.n disclosures.n accusations.n views.n concerns.n understandings.n acknowledgments.n acknowledgements.n possibilities.n premonitions.n prerequisites.n provisos.n truisms.n fallacies.n assurances.n speculations.n propositions.n prospects.n presuppositions.n inklings.n suppositions.n findings.n amounts.n rules.n dangers.n warnings.n indications.n answers.n suggestions.n: ( & (({Dmc-} & {@M+} & {(TH+ or (R+ & Bp+)) & {[[@M+]]}} & {@MXp+} & ( or (Sp*t+ & ) or SIp*t- or )) or ({Dmc-} & ) or Up- or (YP+ & {Dmc-}) or (GN+ & (DD- or [()])))) or [[AN+]]; request.n requirement.n condition.n recommendation.n provision.n stipulation.n: ( & (({D*u-} & {@M+} & {(TH+ or TS+ or (R+ & Bs+)) & {[[@M+]]}} & {@MXs+} & ( or (Ss*t+ & ) or SIs*t- or )) or ({D*u-} & ) or Us- or (YS+ & {D*u-}) or (GN+ & (DD- or [()])))) or AN+; requests.n requirements.n conditions.n recommendations.n provisions.n stipulations.n: ( & (({Dmc-} & {@M+} & {(TH+ or TS+ or (R+ & Bp+)) & {[[@M+]]}} & {@MXp+} & ( or (Sp*t+ & ) or SIp*t- or )) or ({Dmc-} & ) or Up- or (YP+ & {Dmc-}) or (GN+ & (DD- or [()])))) or [[AN+]]; excuse.n decision.n proposal.n attempt.n plan.n plot.n pledge.n urge.n mission.n right.n desire.n mandate.n promise.n option.n campaign.n offer.n vow.n permit.n impetus.n proclivity.n propensity.n move.n vote.n bill.n: ( & ((Ds- & {@M+} & {(TOn+ or (R+ & Bs+)) & {[[@M+]]}} & {@MXs+} & ( or )) or ({Ds-} & ) or Us- or (YS+ & Ds-) or (GN+ & (DD- or [()])))) or AN+; failure.n haste.n refusal.n reluctance.n pressure.n willingness.n responsibility.n intent.n temptation.n readiness.n effort.n determination.n capacity.n unwillingness.n need.n will.n eagerness.n opportunity.n commitment.n ambition.n ability.n order.n obligation.n incentive.n: ( & (({D*u-} & {@M+} & {(TOn+ or (R+ & Bs+)) & {[[@M+]]}} & {@MXs+} & ( or )) or ({D*u-} & ) or Us- or (YS+ & {D*u-}) or (GN+ & (DD- or [()])))) or AN+; excuses.n decisions.n proposals.n failures.n efforts.n attempts.n refusals.n pledges.n urges.n missions.n rights.n desires.n needs.n ambitions.n capacities.n mandates.n promises.n abilities.n options.n commitments.n intents.n opportunities.n plans.n plots.n responsibilities.n chances.n campaigns.n offers.n pressures.n obligations orders.n temptations.n vows.n permits.n impetuses.n proclivities.n propensities.n moves.n votes.n bills.n incentives.n: ( & (({Dmc-} & {@M+} & {(TOn+ or (R+ & Bp+)) & {[[@M+]]}} & {@MXp+} & ( or )) or ({Dmc-} & ) or Up- or (YP+ & {Dmc-}) or (GN+ & (DD- or [()])))) or [[AN+]]; chance.n: ( & (({D*u-} & {@M+} & {(TOn+ or TH+ or (R+ & Bs+)) & {[[@M+]]}} & {@MXs+} & ( or )) or ({D*u-} & ) or Us- or (YS+ & {D*u-}) or (GN+ & (DD- or [()])))) or AN+; question.n issue.n: ( & ((Ds- & {@M+} & {R+ & Bs+ & {[[@M+]]}} & {@MXs+} & ( or (Ss*q+ & ) or SIs*q- or )) or ({Ds-} & ) or Us- or (YS+ & Ds-) or (GN+ & (DD- or [()])))) or AN+; questions.n issues.n: ( & (({Dmc-} & {@M+} & {R+ & Bp+ & {[[@M+]]}} & {@MXp+} & ( or (Sp*q+ & ) or SIp*q- or )) or ({Dmc-} & ) or Up- or (YP+ & {Dmc-}) or (GN+ & (DD- or [()])))) or AN+; reason.n: ( & (({D*u-} & {@M+} & {TH+ or Ce+ or TOn+ or WY+ or (R+ & Bs+)} & {@MXs+} & ( or (Ss*t+ & ) or SIs*t- or )) or ({D*u-} & ) or Us- or (YS+ & {D*u-}) or (GN+ & (DD- or [()])))) or AN+; reasons.n: ( & (({Dmc-} & {@M+} & {TH+ or Ce+ or TOn+ or WY+ or (R+ & Bp+)} & {@MXp+} & ( or )) or ({Dmc-} & ) or Up- or (YP+ & {Dmc-}) or (GN+ & (DD- or [()])))) or [[AN+]]; way.n: ( & ((Ds- & {@M+} & {TOn+ or TH+ or Ce+ or (R+ & Bs+)} & {@MXs+} & (MVa- or or )) or ({Ds-} & ) or Us- or (YS+ & {D*u-}) or (GN+ & (DD- or [()])))) or AN+; place.n: ( & ((Ds- & {@M+} & {TOn+ or TH+ or Ce+ or (R+ & Bs+)} & {@MXs+} & ([[MVa-]] or or )) or ({Ds-} & ) or or Us- or (YS+ & {D*u-}) or (GN+ & (DD- or [()])))) or AN+; time.n: ( & (({D*u-} & {@M+} & {TOn+ or WN+ or TH+ or Ce+ or (R+ & Bs+)} & {@MXs+} & ([[MVa-]] or or )) or ({D*u-} & ) or Us- or (YS+ & {D*u-}) or (GN+ & (DD- or [()])))) or AN+; ways.n: ( & (({Dmc-} & {@M+} & {TOn+ or TH+ or Ce+ or (R+ & Bp+)} & {@MXp+} & (MVa- or or )) or ({Dmc-} & ) or Up- or (YP+ & {Dmc-}) or (GN+ & (DD- or [()])))) or [[AN+]]; places.n: ( & (({Dmc-} & {@M+} & {TOn+ or TH+ or Ce+ or (R+ & Bp+)} & {@MXp+} & ([[MVa-]] or or )) or ({Dmc-} & ) or Up- or (YP+ & {Dmc-}) or (GN+ & (DD- or [()])))) or [[AN+]]; times.n: ( & (({Dmc-} & {@M+} & {TOn+ or WN+ or TH+ or Ce+ or (R+ & Bp+)} & {@MXp+} & ([[MVa-]] or or )) or ({Dmc-} & ) or Up- or (YP+ & {Dmc-}) or (GN+ & (DD- or [()])))) or [[AN+]]; %PRONOUNS she he: {[[R+ & Bs+]]} & ((Ss+ & ) or SIs- or SJls+ or (Dn- & SJn+)); % The E- is for "It's either us or them" ... not ideal, but OK me him them us: J- or Ox- or ({[[E-]]} & SJl+) or SJr-; myself yourself himself herself itself themselves ourselves yourselves: J- or O- or E+ or MVa-; each_other: J- or O- or YS+; her.d: ({AL-} & {@L+} & (D+ or DD+)) or DP+; her.p: J- or Ox-; its my your their our: ({AL-} & {@L+} & (D+ or DD+)) or DP+; his: DP+ or ({AL-} & {@L+} & (D+ or DD+)) or []; you: J- or Ox- or (Sp+ & ) or SIp- or SJlp+ or (Dn- & SJn+); it: J- or Ox- or ((Ss+ or SFsi+) & ) or SIs- or SFIsi- or OXi- or Vp- or SJls+ or SJrs- or (Dn- & SJn+); % O*c: "we will go faster than they" they: ({[[R+ & Bp+]]} & ((Sp+ & ) or SIp-)) or Ox- or SJlp+ or SJrp- or (Dn- & SJn+); we: (Sp+ & ) or Ox- or SIp- or SJlp+ or SJrp- or (Dn- & SJn+); % XXX why is this marked plural (Sp, SIp) ?? a cheap hack to make I've work? % We use here to prevent lower-case magnling by % the tokenizer. % SJrp-: allows only "...and I", disallows "I and ..." % Ds- & SJl+: "Either I or ..." % Dn- & SJn+: "Neither I not ..." I.p: or ((Sp*i+ or SX+) & ) or SIp*i- or SJr- or (Ds- & SJl+) or (Dn- & SJn+) or SXI-; them_all us_all you_all: Ox- or J-; % it_all gets a cost when used as direct object (Ox) to avoid % inappropriate parse "Please paint it all white" it_all: [[Ox-]] or J-; %we're they're I'm you're: %(({@EBm+} & (((O*t+ or K+ or BI+ or OF+ or Pp+) & {@MV+}) or TO+ or Pa+)) or %({N+} & (Pg+ or Pv+))) & ; ’m 'm: SX- & (({@EBm+} & (((O*t+ or K+ or BI+ or OF+ or Pp+) & {@MV+}) or TO+ or Pa+)) or ({N+} & (Pg+ or Pv+))); ’re 're: Spx- & (({@EBm+} & (((O*t+ or K+ or BI+ or OF+ or Pp+) & {@MV+}) or TO+ or Pa+)) or ({N+} & (Pg+ or Pv+))); %I've they've you've we've: PP+ & ; ’ve 've: Sp- & PP+; %we'd they'd I'd he'd she'd you'd: (PP+ or ({Vw+} & I+)) & ; %I'll he'll she'll we'll they'll you'll it'll: I+ & ; ’d 'd: S- & (PP+ or I+); ’ll 'll: S- & I+; something someone somebody: {EL+} & (({Pa+} & & {@MXs+} & ) or or YS+); nothing no_one nobody: {EN-} & {EL+} & (({Pa+} & & {@MXs+} & ) or or YS+); everything everyone anyone everybody anybody anything: {EN-} & {EL+} & (((({Pa+} & ) or CX+) & {@MXs+} & ) or or YS+); else: EL-; others: {Dmc-} & (( & ) or ); mine.p yours theirs hers ours: or SJl+ or SJr- or (Dn- & SJn+); % DETERMINERS % (L+ & (AJld+ or AJrd-)): "the biggest and the baddest ..." the: ({AL-} & {@L+} & (D+ or DD+)) or DG+ or (TR- & U+) or (L+ & (AJld+ or AJrd-)); those: ({AL-} & (Dmc+ or DD+)) or ( & ( or RJlr+ or RJrr-)) or ; this.p: or ; this.d: ({AL-} & D*u+) or DTn+; these: or or ({AL-} & (Dmc+ or DD+)); both.d: Dmc+ or E+ or ({M+ or (ALx+ & Jp+)} & ) or ; both.a: Paf- or AJra-; % half: prefer NJ+ over noun-main-x, because half is almost surely % modifying something, instead of being a direct object, subject, etc. half: {EN-} & (NJ+ or [(({DD-} & {@Mp+ or (R+ & B+)}) or (AL+ & J+)) & ]); % "How many years" -- prefer TQ+ over Dmc+ many: (H- & ([[Dmc+]] or ND+ or NIn+ or TQ+)) or (AM- & (Dmcy+ or Oy- or Jy-)) or ({EE-} & (ND+ or NIn+)) or ({DD-} & {EAx-} & Dmc+) or ((({EAx-} & {DD-}) or H-) & & ( or )); all.a: ({EN-} & (E+ or Dm+ or NIc+ or ({@M+ or (ALx+ & (Jp+ or Ju+)) or (R+ & B+) or EL+} & ( or (S**t+ & ) or SI**t-)) or )) or DTa+; all_that: EA+ or EE+ or ( & ); all_this: ( & ) or ; all_those all_these: ( & ) or ; one: NA+ or NMw- or NN+ or ({EN-} & NIfn+) or ({NA-} & {EN-} & (({DD-} & Ds+) or ({{@A- & {[[@AN-]]}} & Ds-} & (YS+ or ( & ( or )) or )))) or NIm+ or NSn+ or (NA- & ND+) or DTi+ or (NA- & Xd- & TY- & Xc+); ones: {@A- & {[[@AN-]]}} & {Dmc-} & (YP+ or ( & ) or ); any: ({EN-} & (D+ or DD+ or ( & ) or )) or EC+; % XXX why doesn't this clash with a.eq ?? a an: ({(AA- & HA-) or ALa- or [[Lf+]]} & Ds+) or NN+ or NSa+ or NIm+; such: (ND- & Dmc+) or Dm*k+; such_a such_an: Ds*k+; % "all of the time". These are all temporal modifiers: use MVw ("when") : MVw- & OF+; a_lot: ( & ) or or EC+ or MVa- or ; few: {EA- or EF+ or ({EA-} & DD-)} & (Dmc+ or ( & ) or ); a_couple: ( & ) or ; a_couple_of: NN+ or ND+ or NIn+; a_few: NN+ or ND+ or NIn+ or ({EN-} & (Dmc+ or ND+ or NIn+ or ( & ))); some: D+ or EN+ or MF+ or ( & ) or or ; little.i: ({EE-} & (MVa- or Ca+ or Qe+)) or ({EEx- or H-} & (Dmu+ or ( & ( or )) or )) or (AM- & (Dmuy+ or MVy- or Oy- or Jy-)) or ({Ds-} & ); % "he likes you most" has no determiner, just uses MVa-. most: Dm+ or [EE+] or EA+ or MF+ or ( & ) or or or [{DD-} & MVa- & {Mp+}]; part.i: (OF+ & ) or or ({Ds-} & ); all.e: ; the_most: MVa- or EE+ or Dm+ or ( & ); % "he likes you least of all" has no determiner, just uses MVa-. least.a: EA+; least.e: {DD-} & MVa- & {Mp+}; none: ( & ) or or ; % rest.i: DG ??? huh? what's the example ?? rest.i: (DG- & & ) or (DD- & ); plenty: ({@M+} & ( or )) or or [MVa-]; other: Dmu+ or ({ND-} & {DD-} & Dmc+) or (DD- & (Ds+ or DD+ or or )); one_other every_other: or or Ds+; any_other no_other: or or D+; all_other: Dm+; most_other: Dmc+; quite_a quite_an one_such not_every: Ds+; some_other no_such: D+; every.d: {EN-} & (Ds+ or DTn+ or [[NIc+]]); another: Ds+ or NIc+ or ( & ) or or YS+; one_another: ( & ) or or YS+; each: Ds+ or ( & ) or or DTn+ or E+ or MVa-; no.misc-d: ({EN-} & D+) or EC+; a_little: Dmu+ or ( & ) or or EA+ or EC+ or EE+ or MVa-; a_great_deal: EC+ or MVa- or ( & ) or ; many_more a_few_more a_couple_more plenty_more a_lot_more: Dmcc+ or ( & ) or ; some_more: MVa- or Dm+ or ( & ) or ; one_more: Ds+ or ( & ) or ; not_many: Dmc+ or ( & (Sp+ & )); not_all not_everything: Dm+ or (((ALx+ & Jp+) or ) & (S+ & )); not_one: Ds+ or ( & (Ss+ & )); enough.n: ({OF+} & ) or ; enough.r: EF- or MVa-; enough.a: ({@E-} & Pa- & {Pg+ or Os+ or @MV+}) or ({@E-} & Dm+); enough.ij: Wi- & {Pg+}; not_enough: ({OF+} & ) or or Dm+; % NUMERICAL EXPRESSIONS % Numeric ranges, e.g. "15 to 20". The "to" (or hyphen) acts as a % number in a range, and the requirements should match NUMBER. % The NIf connectors (second subscript position is "n" for number % and "u" for unit) allow "15 to 20", "15 to 20 kDa" and % "15 kDa to 20 kDa", but not "15 kDa to 20". % Allowing EC+ for "two to threefold more abundant". This allows also the % nonsense "two to three more abundant", but this is likely harmless. -.j-ru --.j-ru ---.j-ru or.j-ru to.j-ru ->.j-ru -->.j-ru: (NIfn- & {NIr-} & NItn+ & (NM- or EC+ or (NN+ or [[NF+]] or ({EN- or NIc-} & (ND+ or OD- or ({{@L+} & DD-} & (Dmcn+ or ( & [])))))))) or (NIfu- & {NIr-} & NItu+ & ((( & ( or Bsm+)) or (Us- & {Mp+})) or AN+ or Yd+ or Ya+)) or (NIfp- & {NIr-} & NItp+ & (NM- or AN+ or ({Xc+ & Xd-} & Ma-) or (Wq- & PF+) or MVp- or Pp- or FM- or (Xc+ & Xd- & (MVx- or MX-)))); and.j-ru: (NIfn- & {NIr-} & NItn+ & (NM- or (NN+ or [[NF+]] or ({EN- or NIc-} & (ND+ or OD- or ({{@L+} & DD-} & (Dmcn+ or ( & [])))))))) or (NIfu- & {NIr-} & NItu+ & ((( & ( or Bsm+)) or (Us- & {Mp+})) or AN+ or Yd+ or Ya+)); % and.j-sum is used in numerical sums: "It's a hundred and two in the shade." % It's a hundred 'n two in the shade." and.j-sum 'n.j-sum: NA- & NA+; % For number, cost is added to the roles to prioritize % postmodifier and numeric determiner roles. two three four five six seven eight nine ten eleven twelve thirteen fourteen fifteen sixteen seventeen eighteen nineteen twenty twenty-one twenty-two twenty-three twenty-four twenty-five twenty-six twenty-seven twenty-eight twenty-nine thirty thirty-one thirty-two thirty-three thirty-four thirty-five thirty-six thirty-seven thirty-eight thirty-nine forty forty-one forty-two forty-three forty-four forty-five forty-six forty-seven forty-eight forty-nine fifty fifty-one fifty-two fifty-three fifty-four fifty-five fifty-six fifty-seven fifty-eight fifty-nine sixty sixty-one sixty-two sixty-three sixty-four sixty-five sixty-six sixty-seven sixty-eight sixty-nine seventy seventy-one seventy-two seventy-three seventy-four seventy-five seventy-six seventy-seven seventy-eight seventy-nine eighty eighty-one eighty-two eighty-three eighty-four eighty-five eighty-six eighty-seven eighty-eight eighty-nine ninety ninety-one ninety-two ninety-three ninety-four ninety-five ninety-six ninety-seven ninety-eight ninety-nine oh-one oh-two oh-three oh-four oh-five oh-six oh-seven oh-eight oh-nine o-one o-two o-three o-four o-five o-six o-seven o-eight o-nine zero-one zero-two zero-three zero-four zero-five zero-six zero-seven zero-eight zero-nine several: NA+ or NMw- or ({EN-} & (NIfn+ or NItn-)) or NN+ or NW+ or ({EN- or NIc- or NA-} & (ND+ or NIn+ or ({{@L+} & DD-} & (Dmc+ or ( & []))))) or (NA- & { & }) or (NA- & Xd- & TY- & Xc+); oh.zero: (NA- & NA+); zero.n: (NA- & NA+) or NN+ or Ds+ or ( & ); % the generic "number" category % AN+ is needed for date-ranges % FRACTIONS are simple fractions % Ditto for fractions ... % Not clear why we use Dmcn+ here, instead of allowing nouns to take ND- % as effectively Dmcn and ND are the "same thing" more or less. NUMBERS FRACTION: NMn- or ({EN-} & (NIfn+ or NItn-)) or NN+ or [[NF+]] or [[AN+]] or ({EN- or NIc-} & (ND+ or NIn+ or OD- or ({{@L+} & DD-} & (Dmcn+ or ( & []))))) or EQt+ or EQt-; % HMS-TIME consists of HH:MM:SS(AM|PM) type expressions % and should probably have a narrower set of parse patterns than numbers in % general. e.g. should not have EQ links XXX todo -- fix this. HMS-TIME: NUMBERS & {TZ+}; % Allowing postposed roman numerals only for now. % e.g "Pope Pious XII" ROMAN-NUMERAL-WORDS.rn: NMr-; % nouns that look like roman numerals. Limited requirements to avoid % excessive ambiguity. ROMAN-NUMERAL-WORDS.n: {@MX+} & (); % Allow post-posed letter moifiers: e.g. "Vitamin A" A.id B.id C.id D.id E.id F.id G.id H.id J.id K.id L.id M.id N.id O.id P.id Q.id R.id S.id T.id U.id V.id W.id X.id Y.id Z.id: NMa-; % Avoid having I.id interfere with pronoun I. I.id: [[NMa-]]; % Days of month % Note, however, this over-rides generic numbers in this range % and so is a superset of the generic numbers disjuncts % The following should match NUMBERS with the addition of "or TM-". 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31: NUMBERS or TM- or [[G+]]; % Ordinals - day-of-month expressions. % Used only in espressions such as "December 2nd" % Must use regex here as well, to avoid conflict with other regexes first.ti second.ti third.ti fourth.ti fifth.ti sixth.ti seventh.ti eighth.ti ninth.ti tenth.ti eleventh.ti twelfth.ti thirteenth.ti fourteenth.ti fifteenth.ti sixteenth.ti seventeenth.ti eighteenth.ti nineteenth.ti twentieth.ti twenty-first.ti twenty-second.ti twenty-third.ti twenty-fourth.ti twenty-fifth.ti twenty-sixth.ti twenty-seventh.ti twenty-eighth.ti twenty-ninth.ti thirtieth.ti thirty-first.ti DAY-ORDINALS.ti: TM-; % Years w/o apostrophe: e.g. 47 Ford Fairlane or 57 Chevy 01 02 03 040 05 06 07 08 09: or [[G+]]; 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99: NUMBERS or or [[G+]]; % year numbers % 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 /en/words/words.y: or [[G+]]; % Years: e.g. '47 Ford Fairlane or '57 Chevy '00 '01 '02 '03 '04 '05 '06 '07 '08 '09 '10 '11 '12 '13 '14 '15 '16 '17 '18 '19 '20 '21 '22 '23 '24 '25 '26 '27 '28 '29 '30 '31 '32 '33 '34 '35 '36 '37 '38 '39 '40 '41 '42 '43 '44 '45 '46 '47 '48 '49 '50 '51 '52 '53 '54 '55 '56 '57 '58 '59 '60 '61 '62 '63 '64 '65 '66 '67 '68 '69 '70 '71 '72 '73 '74 '75 '76 '77 '78 '79 '80 '81 '82 '83 '84 '85 '86 '87 '88 '89 '90 '91 '92 '93 '94 '95 '96 '97 '98 '99: or [[G+]]; 1: NMn- or ({EN-} & (NIfn+ or NItn-)) or NN+ or [[NF+]] or ({EN- or NIc-} & (ND+ or NIm+ or OD- or ({{@L+} & DD-} & (D**n+ or ( & []))))) or TM- or NSn+ or EQt+ or EQt-; %%%%% or [[G- & (({MXs+} & ) or G+ or AN+ or YS+)]] 0: NMn- or ({EN-} & (NIfn+ or NItn-)) or NN+ or [[NF+]] or ({EN- or NIc-} & (ND+ or NIn+ or OD- or ({{@L+} & DD-} & (Dmcn+ or [[Ds+]] or ( & []))))) or NSn+; %%%%% or [[G- & (({MXs+} & ) or G+ or AN+ or YS+)]] % TODO: no numers or related expressions below this point take the new NM % connector, although e.g. "point 1/2" would appear reasonable. Go through % these and add NM- analogously to other numbers as applicable. % the DECADE-TIME regex matches 1950s 1950's 1950’s etc. DECADE-TIME '20s '30s '40s '50s '60s '70s '80s '90s ‘20s ‘30s ‘40s ‘50s ‘60s ‘70s ‘80s ‘90s: {TA-} & DG- & (IN- or [[]]); twenties thirties, forties fifties sixties seventies eighties nineties hundreds.cnt: {NA-} & {TA-} & DG- & (IN- or [[]]); % teens could be above or teenagers (words.n.2) teens: ({TA-} & DG- & (IN- or )) or ; hundred thousand half-thousand million half-million quarter-million billion half-billion quarter-billion trillion half-trillion quarter-trillion dozen half-dozen bajillion bazillion gadzillion gagillion gajillion gazillion godzillion jillion jizillion kabillion kajillion katrillion killion umptillion zillion: NN- & (NNy+ or NMw- or NA+ or ({EN- or NIc-} & (ND+ or NIn+ or OD- or ({{@L+} & DD-} & (Dmcn+ or ( & )))))); half_a_dozen half_a_million: ({EN- or NIc-} & (ND+ or NIn+ or OD- or ({{@L+} & DD-} & (Dmcn+ or ( & ))))); hundreds.a thousands millions billions trillions dozens bajillions bazillions gadzillions gagillions gajillions gazillions godzillions jillions jizillions kabillions kajillions katrillions killions umptillions zillions: ({DD- or Dmc-} & & ); tens: {DD-} & OF+ & ; dozens_of tens_of hundreds_of thousands_of millions_of billions_of trillions_of bajillions_of bazillions_of gadzillions_of gagillions_of gajillions_of gazillions_of godzillions_of jillions_of jizillions_of kabillions_of kajillions_of katrillions_of killions_of umptillions_of zillions_of: ND+ or NIn+; 1/2 3/4 2/3 1/3 1/4 1/8 3/8 5/8 7/8 ½ ⅓ ⅔ ¼ ¾ ⅛ ⅜ ⅝ ⅞: ({NNx-} & NNy+) or NF+ or NIe+ or ({NNx-} & {EN- or NIc-} & (ND+ or NIn+ or OD- or ({DD-} & ([[Ds+]] or Dmcn+ or ( & ))))); and_a_half: (NW- or NSn-) & (NNy+ or ({EN- or NIc-} & (ND+ or NIn+ or ({DD-} & (Dmcn+ or ( & )))))); quarter.i: NS- & {EN-} & (NF+ or ( & )); thirds.m fourths.m quarters.m fifths.m sixths.m sevenths.m eighths.m ninths.m tenths.m: NW- & {EN-} & (NF+ or ( & )); first.a: L- or Pa- or E+ or MVa- or ({Xc+ & {Xd-}} & CO+) or A+ or [Jp-] or TT+ or ((DD- or [[NSa-]]) & & {TOn+} & ); last.a dead_last: L- or Pa- or MVa- or ({Xc+ & {Xd-}} & CO+) or [Jp-] or DTi+ or TT+ or (DD- & & {TOn+} & ) or A+; second.a: L- or Pa- or MVa- or ({Xc+ & {Xd-}} & CO+) or (DD- & & {TOn+} & ) or NR+ or A+; % This uses the L link for superlatives, but leads to strange parses: % "We celebrated their eleventh anniversary" parses differently % than "tenth anniversary". XXX this should be fixed, I suppose ... % A+: "fifteenth century Italy" % Jp-: "Mike finished in first place, and John in third." third.a fourth.a fifth.a sixth.a seventh.a eighth.a ninth.a tenth.a : L- or Pa- or MVa- or ({Xc+ & {Xd-}} & CO+) or (NS- & {EN-} & NF+) or (((NS- & & {EN-}) or (DD- & & {TOn+})) & ) or NR+ or A+ or Jp-; % NS-: "I gave him a third of the loot." eleventh.a twelfth.a thirteenth.a fourteenth.a fifteenth.a sixteenth.a seventeenth.a eighteenth.a nineteenth.a twentieth.a twenty-first.a twenty-second.a twenty-third.a twenty-fourth.a twenty-fifth.a twenty-sixth.a twenty-seventh.a twenty-eighth.a twenty-ninth.a thirtieth.a thirty-first.a thirty-second.a thirty-third.a thirty-fourth.a thirty-fifth.a thirty-sixth.a thirty-seventh.a thirty-eighth.a thirty-ninth.a fourtieth.a fourty-first.a fourty-second.a fourty-third.a fourty-fourth.a fourty-fifth.a fourty-sixth.a fourty-seventh.a fourty-eighth.a fourty-ninth.a fiftieth.a fifty-first.a fifty-second.a fifty-third.a fifty-fourth.a fifty-fifth.a fifty-sixth.a fifty-seventh.a fifty-eighth.a fifty-ninth.a sixtieth.a sixty-first.a sixty-second.a sixty-third.a sixty-fourth.a sixty-fifth.a sixty-sixth.a sixty-seventh.a sixty-eighth.a sixty-ninth.a seventieth.a seventy-first.a seventy-second.a seventy-third.a seventy-fourth.a seventy-fifth.a seventy-sixth.a seventy-seventh.a seventy-eighth.a seventy-ninth.a eightieth.a eighty-first.a eighty-second.a eighty-third.a eighty-fourth.a eighty-fifth.a eighty-sixth.a eighty-seventh.a eighty-eighth.a eighty-ninth.a ninetieth.a ninety-first.a ninety-second.a ninety-third.a ninety-fourth.a ninety-fifth.a ninety-sixth.a ninety-seventh.a ninety-eighth.a ninety-ninth.a: Pa- or MVa- or ({Xc+ & {Xd-}} & CO+) or (NS- & {EN-} & NF+) or (((NS- & & {EN-}) or (DD- & & {TOn+})) & ) or NR+ or A+ or Jp-; % Miscellaneous ordinal numbers, adjectival usage % prefer G+ over A+ in general, as these are typically parts of names. 1º.a 2º.a 3º.a 4º.a 5º.a 6º.a 7º.a 8º.a 9º.a DAY-ORDINALS.a ORDINALS.a: Pa- or MVa- or ({Xc+ & {Xd-}} & CO+) or (DD- & & {TOn+} & ) or NR+ or G+ or [A+] or AJla+ or ({Ds-} & AJra-) or (Dn- & AJn+); % "Next on our list..." are ordinals. % XXX should be converted to regex... % Note also another list of ordinals below, used for time expressions. first.ord next.ord last.ord second.ord third.ord fourth.ord fifth.ord sixth.ord seventh.ord eighth.ord ninth.ord tenth.ord eleventh.ord twelfth.ord thirteenth.ord fourteenth.ord fifteenth.ord sixteenth.ord seventeenth.ord eighteenth.ord nineteenth.ord twentieth.ord twenty-first.ord twenty-second.ord twenty-third.ord twenty-fourth.ord twenty-fifth.ord twenty-sixth.ord twenty-seventh.ord twenty-eighth.ord twenty-ninth.ord thirtieth.ord thirty-first.ord thirty-second.ord thirty-third.ord thirty-fourth.ord thirty-fifth.ord thirty-sixth.ord thirty-seventh.ord thirty-eighth.ord thirty-ninth.ord fourtieth.ord fourty-first.ord fourty-second.ord fourty-third.ord fourty-fourth.ord fourty-fifth.ord fourty-sixth.ord fourty-seventh.ord fourty-eighth.ord fourty-ninth.ord fiftieth.ord fifty-first.ord fifty-second.ord fifty-third.ord fifty-fourth.ord fifty-fifth.ord fifty-sixth.ord fifty-seventh.ord fifty-eighth.ord fifty-ninth.ord sixtieth.ord sixty-first.ord sixty-second.ord sixty-third.ord sixty-fourth.ord sixty-fifth.ord sixty-sixth.ord sixty-seventh.ord sixty-eighth.ord sixty-ninth.ord seventieth.ord seventy-first.ord seventy-second.ord seventy-third.ord seventy-fourth.ord seventy-fifth.ord seventy-sixth.ord seventy-seventh.ord seventy-eighth.ord seventy-ninth.ord eightieth.ord eighty-first.ord eighty-second.ord eighty-third.ord eighty-fourth.ord eighty-fifth.ord eighty-sixth.ord eighty-seventh.ord eighty-eighth.ord eighty-ninth.ord ninetieth.ord ninety-first.ord ninety-second.ord ninety-third.ord ninety-fourth.ord ninety-fifth.ord ninety-sixth.ord ninety-seventh.ord ninety-eighth.ord ninety-ninth.ord DAY-ORDINALS.ord ORDINALS.ord : (Wd- & {M+} & Ss*o+); % EQUATIONS ETC. % The below is just barely enough to parse just very simple equation % and expressions, nothing complex -- no general math or anything like % that. Relations are treated as "transitive verbs", taking a subject % and requiring an object. % Relations % "verb" use, e.g. "( p < 0.01 )" for "( p is less than 0.01 )" =.v <.v >.v =<.v >=.v ==.v eq.v ne.v lt.v lte.v le.v gt.v gte.v ge.v equiv.v sim.v simeq.v approx.v ~.v: ([S-] or EQ*r-) & ([O+] or EQ*r+) & (Xd- & (Xc+ or ) & (MX- or MVa-)); % Binary operators: % these occur in "simple" expressions *.v "/.v" +.v -.v x.v: ([S-] or EQ-) & ([O+] or EQ+) & (Xd- & (Xc+ or ) & (MX- or MVa-)); % Allows parsing of "dollars per day" or "mL/sec" but is somewhat % inconsistent with the equation persing otherwise described below. % XXX overall, eqn parsing could be strengthened. per "/.per": Us+ & Mp-; % Binary operators, strict: % Here EQt attaches only to terms, which may be numbers or letters. % By contrast, EQrr can only attach to relations (=, < > etc.) +.eq -.eq *.eq "/.eq" x.eqn: (EQt+ & EQt-) & (EQrr- or EQrr+ or AN+); ->.eq -->.eq: (S- & O+) & (AN+ or (Xd- & Xc+ & MX-)); % "adverb" use, e.g. "< 10" for "less than 10" =.e <.e =<.e <=.e >.e >=.e +.e -.e x.e: EN+; % TODO: un-parenthesized cases, e.g. % - preparations of 5 x 10(8) cfu/ml are made % - the strength was in the order of gerE > cotD > yfhP P2 > yfhP P1 % also remember "-->" A.eq B.eq C.eq D.eq E.eq F.eq G.eq H.eq I.eq J.eq K.eq L.eq M.eq N.eq O.eq P.eq Q.eq R.eq S.eq T.eq U.eq V.eq W.eq X.eq Y.eq Z.eq a.eq b.eq c.eq d.eq e.eq f.eq g.eq h.eq i.eq j.eq k.eq l.eq m.eq n.eq o.eq p.eq q.eq r.eq s.eq t.eq u.eq v.eq w.eq x.eq y.eq z.eq: EQt+ or EQt-; fiscal.i: TY+ & ; or_so: ND- & {{@L+} & DD-} & (Dmcn+ or ( & )); %VERBS : Xd- & (Xc+ or ) & (MX*p- or MVg-); : {Xd-} & Xc+ & COp+; % These are the verb-form expressions for ordinary verbs. % % is a marker which should never be used in a link. % It is used to flag past-tense forms in the dictionary. It's only use % is to supply an answer to the "isPastTense" call in the Java API. % which is needed by relex-version 1.2.0 and earlier. Newer versions % use the v-d, w-d, and q-d tags to identify past-tense verbs, and so % the Java API is no longer needed. It should be marked obsolete/deprecated % as soon as possible, and removed by late-2010/early-2011 : XXXPAST+; : {@E-} & ((I- & {@E-} & {Wi-}) or ({CO-} & Wi-)); : ({@E-} & (Sp- or (RS- & Bp-))) or ; : {@E-} & (Sp- or (RS- & Bp-)); : {@E-} & (Ss- or (RS- & Bs-)); : {@E-} & I-; : or ({@E-} & (S- or (RS- & B-) or PP-)); : or ({@E-} & (S- or (RS- & B-))); : {@E-} & PP-; : {@E-} & (Pg- or Mg-); : {@E-} & (Pv- or Mv-) & {@MV+}; : {@E-} & (Pv- or Mv-); : {@E-} & ( or or ({[DP-]} & ((Ss*g+ & ) or SIs*g- or )) or [DP- & J-] or [[Wq- & PF+]]); % ({[[Ds-]]} & OF+) : "a running of the bulls" "a polishing of prose" % AJ: allows use of gerunds as adjectives: "described as smooth and obliging" % : allows use of gerunds as nouns. % VJ*g: ??? this is commented out, where would this occur? : ( & (Dmu- or [[()]]) & (({[[Ds-]]} & OF+) or [[()]]) & (( & {@MXs+} & ((Ss+ & ) or SIs- or Os- or J-)) or AJra- or AJla+ or )) or [[AN+]]; : {@E-} & ( ({[DP-]} & ((Ss*g+ & ) or SIs*g- or )) or Mg- or Pg- or or or [DP- & J-] or [[Wq- & PF+ & {@MV+}]]); : {@E-} & {@MV+} & ( or or [[Wq- & PF+ & {@MV+} & {CC+}]]); % These are the verb-form expressions for special verbs that can take % filler-"it" as a subject. : {@E-} & (Sp- or If- or (RS- & Bp-) or Wi-); : {@E-} & (Ss- or SFsi- or (RS- & Bs-)); : or ({@E-} & (S- or SFsi- or PPf- or (RS- & B-))); : or ({@E-} & (S- or SFsi- or (RS- & B-))); : {@E-} & PPf-; : {@E-} & (Pgf- or Mg-); : {@E-} & (Pvf- or Mv-) & {@MV+}; : {@E-} & (Pvf- or Mv-); % These are the verb-form expressions for special verbs that can take % either filler-"it" or filler-"there" as a subject. : {@E-} & (Sp- or SFp- or If- or (RS- & Bp-) or Wi-); : {@E-} & (Ss- or SFs- or (RS- & Bs-)); : {@E-} & (Ss- or SFs- or SFu- or (RS- & Bs-)); : or ({@E-} & (S- or SF- or (RS- & B-) or PPf-)); : or ({@E-} & (S- or SF- or (RS- & B-))); : {@E-} & PPf-; : {@E-} & (Pgf- or Mg-); : {@E-} & (Pgf- or Mg- or ({[DP-]} & ((Ss*g+ & ) or SIs*g- or )) or or or [DP- & J-] or [[Wq- & PF+ & {@MV+}]]); % conjoined verbs. % VJr == left % VJl == right % VJb == but % VJd == ditransitive % VJn == neither-nor % % VJ*s == singular subject % VJ*p == plural subject % VJ*g == conjoined gerunds "He was running and jumping" % VJ*h == past participle (PP- link) "He had run and jumped" % % The following control whether the conjunction can take an object. % The conjunction should take an object if both verbs are transitive, % e.g. "I saw and greeted Sue", which should parse as % "I (saw and greeted) Sue". % VJ**i == intranstive % VJ**t == transitive % % s == singluar, pl == plural, sp == singular or plural % g == gerund : {@E-} & VJrs-; : {@E-} & VJls+; : {@E-} & VJrp-; : {@E-} & VJlp+; : {@E-} & VJr-; : {@E-} & VJl+; : {@E-} & VJr*i-; : ({@E-} & VJl*i+) or (VJn*i+ & Dn-) or (VJb*i+ & Db-); : {@E-} & VJr*t-; : {@E-} & VJl*t+; : {@E-} & VJrg-; : {@E-} & VJlg+; : {@E-} & VJrh-; : {@E-} & VJlh+; : or or (VJn*t+ & Dn-); % Verb macros making use of above connectors. % plural-infinitive macro; the cost on $1 encourages any MV links to % attach to the "and.j-v" instead of to the individual verb. define(`VERB_PLI',`' (( & ($1)) or ( & ([($1)] or ())) or (($1) & ))) % singular present tense macro; same comments as above... define(`VERB_S_I',`' (( & ($1)) or ( & ([($1)] or ())) or (($1) & ))) % present tense, but allows transitive connectinos to 'and' define(`VERB_S_T',`' (( & ($1)) or ( & (([$1]) or ())) or (($1) & ) or )) % past tense macro, intransitive variation define(`VERB_SPPP_I',`' (( & ($1)) or ( & (([$1]) or ())) or (($1) & ))) % past tense macro, transitive variation define(`VERB_SPPP_T',`' (( & ($1)) or ( & (([$1]) or ())) or (($1) & )) or ) % Same as above, but without the PP link define(`VERB_SP_I',`' (( & ($1)) or ( & (([$1]) or ())) or (($1) & ))) define(`VERB_SP_T',`' (( & ($1)) or ( & (([$1]) or ())) or (($1) & )) or ) % as above but for past participles define(`VERB_PP',`' (( & ($1)) or ( & (([$1]) or ())) or (($1) & ))) % the filler-it variation of the above rules. define(`VERB_S_PLI',`' (( & ($1)) or ( & ([($1)] or ())) or (($1) & )) or ) % XXX TODO need to provide macro-ized versions for , % and the variants as well. % AUXILIARY VERBS %: (((B- or O+ or [[@MV+ & O*n+]] or Vd+ or ({N+} & (CX- or [[()]]))) & {@MV+}) %or ({N+} & I*d+)); %do.v: ({@E-} & (Sp- or SFp- or (RS- & Bp-) or Wi-) & ) %or ((SIp+ or SFIp+) & (({Q-} & I*d+) or CQ-)) or %({@E-} & I- & ((B- or O+ or [[@MV+ & O*n+]] or CX-) & {@MV+})); %does.v: ( & ) or ((SIs+ or SFIs+) & (({Q-} & I*d+) or CQ-)); %did.v: ( & ) or ((SI+ or SFI+) & (({Q-} & I*d+) or CQ-)); %done.v: ( & (B- or O+ or [[@MV+ & O*n+]] or Vd+)) or or ; %doing.v: & (O+ or B- or [[@MV+ & O*n+]] or Vd+) & {@MV+}; %doing.g: ((O+ or B- or [[@MV+ & O*n+]] or Vd+) & {@MV+} & ) or ; % %don't: (({Q-} & (SIp+ or SFIp+) & I*d+) or ({@E-} & (Sp- or SFp- or %(RS- & Bp-) or Wi-))) & (I*d+ or [[()]]); %doesn't: (({Q-} & (SIs+ or SFIs+) & I*d+) or ) & %(I*d+ or [[()]]); %didn't: or ((({Q-} & (SI+ or SFI+)) or ({@E-} & (S- or SF- or %(RS- & B-)))) & (I*d+ or [[()]])); %Mike replaced "{Q-}" with "(Rw- or Q- or [()])" : (((B- or O+ or [[@MV+ & O*n+]] or Vd+ or ({N+} & (CX- or [[()]]))) & {@MV+}) or ({N+} & I*d+)); do.v: ({@E-} & (Sp- or SFp- or (RS- & Bp-) or ({Ic-} & Wi-)) & ) or ((SIp+ or SFIp+) & (((Rw- or ({Ic-} & Q-) or [()]) & I*d+) or CQ-)) or ({@E-} & I- & ((B- or O+ or [[@MV+ & O*n+]] or CX-) & {@MV+})); does.v: ( & ) or ((SIs+ or SFIs+) & (((Rw- or ({Ic-} & Q-) or [()]) & I*d+) or CQ-)); did.v-d: ( & ) or ((SI+ or SFI+) & (((Rw- or ({Ic-} & Q-) or [()]) & I*d+) or CQ-)); % % XXX why not here ? % verb-pv-b: "I want it done." "I want the job done" : B- or O+ or [[@MV+ & O*n+]] or Vd+; done.v: VERB_PP() or or or S-; % adjectival modifier: "I am done working", "I am through being mad" done.a finished.a through.a: ({@E-} & Pa- & {Pg+ or Os+ or @MV+}) or (AJra- & {@MV+}) or ({@MV+} & AJla+); doing.v: & (O+ or B- or [[@MV+ & O*n+]] or Vd+) & {@MV+}; doing.g: ((O+ or B- or [[@MV+ & O*n+]] or Vd+) & {@MV+} & ) or ; better.i fine.i ok.i okay.i OK.i poorly.i well.i: {EE-} & Vd-; don't don’t: (((Rw- or ({Ic-} & Q-) or [()]) & (SIp+ or SFIp+) & I*d+) or ({@E-} & (Sp- or SFp- or (RS- & Bp-) or ({Ic-} & Wi-)))) & (I*d+ or [[()]]); doesn't doesn’t: (((Rw- or ({Ic-} & Q-) or [()]) & (SIs+ or SFIs+) & I*d+) or ) & (I*d+ or [[()]]); didn't.v-d didn’t.v-d: or ((((Rw- or ({Ic-} & Q-) or [()]) & (SI+ or SFI+)) or ({@E-} & (S- or SF- or (RS- & B-)))) & (I*d+ or [[()]])); : ({@MV+} & TO+) or ((B- or O+) & {@MV+} & {[I*j+ or Pv+]}) or (([[@MV+ & O*n+]] or CX- or [[()]]) & {@MV+}) or ({N+} & PP+); have.v: ((SIp+ or SFIp+) & (((Rw- or ({Ic-} & Q-) or [()]) & PP+) or CQ-)) or ( & ); has.v: ((SIs+ or SFIs+) & (((Rw- or ({Ic-} & Q-) or [()]) & PP+) or CQ-)) or ( & ) or ( & ) or ( & ); % XXX probably should be verb-and-sp-i- etc !? had.v-d: ((SI+ or SFI+) & (((Rw- or ({Ic-} & Q-) or [()]) & PP+) or CQ-)) or ( & ) or ( & ) or ( & ) or ( & (TO+ or ((B- or O+) & {@MV+} & {[I*j+ or Pv+]}) or (([[@MV+ & O*n+]] or CX-) & {@MV+}))) or [[(SI*j+ or SFI**j+) & PP+ & ((Xd- & CCq- & Xc+) or CCq- or ({{Xd-} & Xc+} & COp+))]]; having.v: & ; having.g: ( & ) or ; hasn't hasn’t: (((Rw- or ({Ic-} & Q-) or [()]) & (SIs+ or SFIs+)) or ()) & (PP+ or ([[O+]] & {@MV+}) or [[()]]); haven't haven’t: (((Rw- or ({Ic-} & Q-) or [()]) & (SIp+ or SFIp+)) or ({@E-} & (Sp- or SFp- or (RS- & Bp-)))) & (PP+ or ([[O+]] & {@MV+}) or [[()]]); hadn't.v-d hadn’t.v-d: or ((((Rw- or ({Ic-} & Q-) or [()]) & (SI+ or SFI+)) or ({@E-} & (S- or SFs- or SFp- or (RS- & B-)))) & (PP+ or ([[O+]] & {@MV+}) or [[()]])); % Give [K+] a cost so as to prefer Pp+ in general %: % ({@EBm+} & (((O*t+ or [B**t-] or [K+] or BI+ or OF+ or PF- or % (Osi+ & R+ & Bs+) or % (Opi+ & R+ & Bp+) or % [[()]]) & {@MV+}) or % (Pp+ & {THi+ or @MV+}) or % THb+ or % TO+ or % Pa+)) or % ({N+} & (AF- or Pv+ or I*v+)) or % (({N+} or {Pp+}) & Pg*b+); : ({@EBm+} & ((([B**t-] or [K+] or BI+ or OF+ or PF- or (Osi+ & R+ & Bs+) or (Opi+ & R+ & Bp+) or [[()]]) & {@MV+}) or (Pp+ & {THi+ or @MV+}) or THb+ or TO+ or Pa+)) or ({N+} & (AF- or Pv+ or I*v+)) or (({N+} or {Pp+}) & Pg*b+); : {@EBm+} & O*t+ & {@MV+}; : {@EBm+} & (Ost+ or Opt+) & {@MV+}; : {@EBm+} & Out+ & {@MV+}; : or ; : or ; % Colon can be used as a synonym for "is" % "The answer to your question: yes" % "The capital of Germany: Berlin" ":.v": & ; % verb-x-s,u: "there is blood on his hands" % Unfortunately, this allows "There is chasing dogs", which pairs SFu to Op % and has to be removed via post-processing. is.v: ( & ) or ( & ) or ( & ) or (((Rw- or ({Ic-} & Q-) or [()]) & (SIs+ or SFIs+)) & ); 's.v ’s.v: [[( & (({@EBm+} & (((O*t+ or [K+] or BI+ or OF+ or (Osi+ & R+ & Bs+) or (Opi+ & R+ & Bp+)) & {@MV+}) or (Pp+ & {THi+ or @MV+}) or THb+ or TO+ or Pa+)) or ({Pp+} & Pg+) or Pv+ or PP+)) or (SIs+ & PF-)]]; % are.v: % (({@E-} & (Spx- or SFp- or (RS- & Bp-))) or % ((Rw- or ({Ic-} & Q-) or [()]) & (SIpx+ or SFIp+))) & ; % Don't allow are.v with uncountable noun objects. are.v: ({@E-} & (Spx- or SFp- or (RS- & Bp-)) & ) or ((Rw- or ({Ic-} & Q-) or [()]) & (SIpx+ or SFIp+) & ); was.v-d: or ( & ) or ( & ) or ( & ) or ({@E-} & SX- & ) or (((Rw- or ({Ic-} & Q-) or [()]) & (SFIs+ or SIs+ or SXI+)) & ); % XXX probably should be verb-and-sp-i- etc !? were.v-d: or (({@E-} & (Spx- or SFp- or [[Ss-]] or [[SX-]] or (RS- & Bp-))) & ) or ((Rw- or ({Ic-} & Q-) or [()]) & (SIpx+ or SFIp+) & ) or ( & ) or ( & ) or [[(SI*j+ or SFI**j+) & & ((Xd- & CCq- & Xc+) or CCq- or ({{Xd-} & Xc+} & COp+))]]; % XXX the verb-and construction is probably too broad. am.v: ((({@E-} & SX-) or ((Rw- or ({Ic-} & Q-) or [()]) & SXI+)) & ) or ( & ) or ( & ); % S*x- used for passive participles: "this action be taken". be.v: {@E-} & (Ix- or ({Ic-} & Wi-) or [S*x-]) & ; been.v: {@E-} & PPf- & ; being.v: ((({@EBm+} & (((O*t+ or [B**t-] or Pp+ or K+ or OF+ or BI+ or TO+ or THb+) & {@MV+}) or Pa+)) or AF- or Pv+) & ) or ; isn't isn’t: ( or ((Rw- or ({Ic-} & Q-) or [()]) & (SIs+ or SFIs+))) & ; wasn't.v-d wasn’t.v-d: or ((({@E-} & (Ss- or SX- or SFs- or (RS- & Bs-))) or ((Rw- or ({Ic-} & Q-) or [()]) & (SI*+ or SXI+ or SFIs+))) & ); aren't aren’t: (({@E-} & (Spx- or SFp- or (RS- & Bp-))) or ((Rw- or ({Ic-} & Q-) or [()]) & (SIpx+ or SFIp+))) & ; weren't.v-d weren’t.v-d: or ((({@E-} & (Spx- or SFp- or (RS- & Bp-))) or ((Rw- or ({Ic-} & Q-) or [()]) & (SIpx+ or SFIp+))) & ); % XXX probably should be verb-and-sp-i- etc !? will.v can.v may.v must.v could.v might.v shall.v: ((SI+ or SFI+) & (((Rw- or ({Ic-} & Q-) or [()]) & I+) or CQ-)) or ({N+} & {@E-} & (S- or SF- or (RS- & B-)) & (I+ or (CX- & {@MV+}) or [[()]])) or ( & {N+} & {@E-} & I+) or ({N+} & {@E-} & I+ & ); should.v: ((SI+ or SFI+) & (((Rw- or ({Ic-} & Q-) or [()]) & I+) or CQ-)) or ({N+} & {@E-} & (S- or SF- or (RS- & B-)) & (I+ or (CX- & {@MV+}) or [[()]])) or ( & I+) or (I+ & ) or [[(SI*j+ or SFI**j+) & I+ & ((Xd- & CCq- & Xc+) or CCq- or ({{Xd-} & Xc+} & COp+))]]; would.v: ((SI+ or SFI+) & (((Rw- or ({Ic-} & Q-) or [()]) & {Vw+} & I+) or CQ-)) or ({N+} & {@E-} & (S- or SF- or (RS- & B-)) & (({RT+} & I+) or (CX- & {@MV+}) or [[()]])) or ( & I+) or (I+ & ); ought.v: (((Rw- or ({Ic-} & Q-) or [()]) & (SI+ or SFI+)) or ({@E-} & (S- or SF- or (RS- & B-))) or ) & (TO+ or (N+ & I+)); won't can't mustn't couldn't shouldn't cannot needn't won’t can’t mustn’t couldn’t shouldn’t needn’t: ((Rw- or ({Ic-} & Q-) or [()]) & (SI+ or SFI+) & I+) or ({@E-} & (S- or SF- or (RS- & B-)) & (I+ or [[()]])) or ( & {@E-} & I+) or ({@E-} & I+ & ); wouldn't wouldn’t: ((Rw- or ({Ic-} & Q-) or [()]) & (SI+ or SFI+) & {RT+} & I+) or ({@E-} & (S- or SF- or (RS- & B-)) & (({RT+} & I+) or [[()]])) or ( & {@E-} & (({RT+} & I+) or [[()]])) or ({@E-} & (({RT+} & I+) or [[()]]) & ); % =================================================================== % COMMON VERB CATEGORIES (The last number of the file name indicates % the verb form: 1=plural-infinitive, 2=singular, 3=past("ed"), % 4=progressive("-ing"), 5=gerund("-ing".) % abbreviations for ditransitive and optionally ditranstive verbs % ditranstive verbs take a direct and indirect object % e.g. "I gave her a rose" : (O+ & {[[@MV+]]} & O*n+ & {VJd+}); : (O+ & {{[[@MV+]]} & O*n+ & {VJd+}}); : (O+ & {{[[@MV+]]} & [O*n+] & {VJd+}}); % common intransitive verbs : {@MV+}; % XXX Hmmm. There is a fair number of verbs in here that are "weakly" % transitive, i.e. are transitive in various rare usages: % "I ambled the horse", "I hydroplaned the car", etc. Per theory of % functional grammar and related, transitivity should be taken as % variable, so e.g. we could assign a high cost to the transitive use % of some of these verbs ... % % accrue.v ache.v acquiesce.v ad-lib.v adhere.v adjoin.v alight.v /en/words/words.v.1.1: VERB_PLI(); % accounts.v accrues.v aches.v acquiesces.v ad-libs.v adheres.v /en/words/words.v.1.2: VERB_S_I(); % accounted.v accrued.v ached.v acquiesced.v ad-libbed.v adhered.v /en/words/words.v.1.3: VERB_SPPP_I(); fundheld.v-d strove.v-d: VERB_SPPP_I(); % accruing.v aching.v acquiescing.v ad-libbing.v adhering.v adjoining.v /en/words/words.v.1.4: ( & ) or ({@E-} & A+) or ; arisen.v: {@E-} & PP- & {@MV+}; % -------------------------------------------------------------- % intransitive verbs that can take particles like "up" and "out" : {K+} & {@MV+}; % barge.v booze.v bottom.v bow.v branch.v breeze.v brim.v bulge.v cave.v /en/words/words.v.5.1: VERB_PLI(); /en/words/words.v.5.2: VERB_S_I(); /en/words/words.v.5.3: VERB_SPPP_I() or ({@E-} & A+); slunk.v-d: VERB_SPPP_I(); lay.v-d: VERB_SP_I(); lain.v: VERB_PP(); /en/words/words.v.5.4: ( & ) or ({@E-} & A+) or ; % -------------------------------------------------------------- % irregular -- coming is in words.v.5.4 ... : {(K+ & {Pa+}) or [[Pg+]]} & {@MV+}; come.v: VERB_PLI() or VERB_PP() or ({@E-} & Ix- & O*t+); comes.v: VERB_S_I(); came.v-d: VERB_SPPP_I(); % -------------------------------------------------------------- % optionally transitive verbs % abdicate.v abide.v abort.v accelerate.v acclimate.v acclimatize.v : {O+ or B- or [[@MV+ & O*n+]]} & {@MV+}; /en/words/words.v.2.1: VERB_PLI(`'); /en/words/words.v.2.2: VERB_S_T(`'); /en/words/words.v.2.3: VERB_SPPP_T(`') or or ({@E-} & A+) or ; shrank.v-d withdrew.v-d sank.v-d forgave.v-d hove.v-d spoilt.v-d unbent.v-d overfed.v-d: VERB_SPPP_T(`') or ({@E-} & A+); shrunk.v withdrawn.v sunk.v forgiven.v: VERB_PP(`') or or ({@E-} & A+) or ; bid.v-d hurt.v-d thrust.v-d broadcast.v-d outbid.v-d sublet.v-d: VERB_SPPP_T(`') or ( & ) or or ({@E-} & A+) or ; /en/words/words.v.2.4: & ; /en/words/words.v.2.5: ( & ) or ({@E-} & A+) or ; % -------------------------------------------------------------- % vc-judge: a lot like vc-delcare, except optionally transitive. : or ((B- or O+) & ({@MV+} & Pa**j+)); judge.v: VERB_PLI(`'); judges.v: VERB_S_T(`'); judged.v-d: VERB_SPPP_T(`') or ( & {{@MV+} & Pa+}) or ({@E-} & A+) or ; judging.v: & ; judging.g: ( & ) or ({@E-} & A+) or ; % -------------------------------------------------------------- : {K+ or OD+} & {@MV+}; rise.v fall.v:VERB_PLI(); rises.v falls.v: VERB_S_I(); rose.v-d fell.v-d: VERB_SPPP_I(); risen.v: VERB_PP(); fallen.v: VERB_PP() or ({@E-} & A+); rising.v falling.v: ( & ) or ({@E-} & A+) or ; % words.v.6: Optionally transitive verbs that can take particles % like "up" and "out" -- see also words.v.8 % average.v back.v bail.v bang.v beam.v beef.v bellow.v bend.v bind.v % The [[@MV+ & O*n+]] term allows some bad parses, e.g. allows: % "she walked out of the room two minutes" % % Pa**j link: "The thugs beat him senseless" "You are driving me crazy" % XXX However, very few of these verbs actually take the Pa**j link ... % and so should be reclaased. : ((K+ & {[[@MV+]]} & O*n+) or ({O+ or B-} & {K+}) or ((B- or O+) & ({@MV+} & Pa**j+)) or [[@MV+ & O*n+]]) & {@MV+}; /en/words/words.v.6.1: VERB_PLI(); /en/words/words.v.6.2: VERB_S_T(); /en/words/words.v.6.3: VERB_SPPP_T() or ( & {K+} & {@MV+}) or ({@E-} & A+) or ({K+} & ); split.v-d spread.v-d beat.v-d fit.v-d shut.v-d cast.v-d: VERB_SPPP_T() or ( & ) or ( & {K+}) or ({@E-} & A+) or ({K+} & ); ate.v-d bit.v-d blew.v-d broke.v-d drank.v-d drove.v-d flew.v-d froze.v-d hid.v-d ran.v-d rang.v-d rode.v-d sprang.v-d stalked.v-d woke.v-d test-drove.v-d forbore.v-d oversaw.v-d throve.v-d shrove.v-d countersank.v-d outgrew.v-d strode.v-d offsetted.v-d overthrew.v-d partook.v-d begot.v-d overdid.v-d smote.v-d stank.v-d quick-froze.v-d backbit.v-d awoke.v-d redid.v-d chidded.v-d reran.v-d rived.v-d befell.v-d outrode.v-d betrode.v-d outdid.v-d ridded.v-d deep-froze.v-d forbad.v-d deep-freezed.v-d retook.v-d interwove.v-d bespoke.v-d underwent.v-d slew.v-d overdrew.v-d overcame.v-d outwore.v-d foreknew.v-d wove.v-d trod.v-d outwent.v-d: VERB_SPPP_T(); beaten.v bitten.v blown.v broken.v driven.v drunk.v eaten.v flown.v frozen.v hidden.v ridden.v rung.v sprung.v stricken.v swum.v woken.v befallen.v interwoven.v overborne.v outgone.v outgrown.v test-driven.v outdone.v shrunken.v countersunk.v bespoken.v underlain.v partaken.v redone.v overdone.v outridden.v deep-frozen.v bestrid.v undergone.v outbidden.v shorn.v outworn.v bestridden.v stunk.v borne.v slain.v woven.v riven.v backbitten.v overlain.v bestrewn.v forborne.v quick-frozen.v browbeaten.v aquitted.v overseen.v smitten.v overdrawn.v striven.v thriven.v shriven.v backslidden.v retaken.v trodden.v chidden.v begotten.v sown.v sewn.v sawn.v hewn.v cloven.v foreknown.v overthrown.v strewn.v awoken.v bidden.v stridden.v slain_dead: VERB_PP() or ( & {K+}) or ({@E-} & A+) or ({K+} & ); run.v: VERB_PLI() or VERB_PP() or ( & {K+}) or ({@E-} & A+) or ({K+} & ); /en/words/words.v.6.4: ( & ) or or ; /en/words/words.v.6.5: ( & ) or or ({@E-} & A+); frizz.v frizzle.v prink.v slough.v scuff.v tog.v swot.v: VERB_PLI(); % just like & , except that "and" is the one % XXX TODO review this ... and.v-fill: ((VJlg- & VJrg+) & (Pg- or Mg- or ({Xd-} & VJrg-))) & ; % ------------------------------------------------------------ % common transitive verbs % abandon.v abase.v abbreviate.v abduct.v abet.v abhor.v abolish.v : (O+ or B- or [[@MV+ & O*n+]]) & {@MV+}; /en/words/words.v.4.1 : VERB_PLI(); /en/words/words-medical.v.4.1: VERB_PLI(); /en/words/words.v.4.2: VERB_S_T(); /en/words/words-medical.v.4.2: VERB_S_T(); /en/words/words.v.4.3: VERB_SPPP_T() or or (({@E-} or {@EA-} or {@AN-}) & A+) or ; % !?XXX many of the new additions fail some common sentences, such as: % The candle guttered. It plummeted to the bottom. Prices plummeted! /en/words/words-medical.v.4.3: VERB_SPPP_T() or or (({@E-} or {@EA-}) & A+) or ; forsook.v-d overrode.v-d overtook.v-d rewrote.v-d undid.v-d overran.v-d mistook.v-d underwrote.v-d: VERB_SP_T(); hit.v-d misread.v-d shed.v-d rid.v-d overcome.v-d offset.v-d overrun.v-d upset.v-d undercut.v-d: VERB_SPPP_T() or ( & ) or or ({@E-} & A+) or ; forsaken.v overridden.v overtaken.v rewritten.v undone.v beset.v mistaken.v underwritten.v: VERB_PP() or or ({@E-} & A+) or ; /en/words/words.v.4.4 /en/words/words-medical.v.4.4: & ; /en/words/words.v.4.5 /en/words/words-medical.v.4.5: ( & ) or ; % ----------------------------------------------------------------- % words.v.8: Transitive verbs that can take particles like "up" and "out" % auction.v bandy.v bar.v batten.v bite.v block.v blot.v blurt.v % See also words.v.6 for optionally transitive verbs. % XXX TODO: should be reviewed, as some of them are optionally transitive % : ((K+ & {[[@MV+]]} & O*n+) or ((O+ or B-) & {K+}) or [[@MV+ & O*n+]]) & {@MV+}; /en/words/words.v.8.1: VERB_PLI(); /en/words/words.v.8.2: VERB_S_T(); stole.v-d threw.v-d tore.v-d wore.v-d overate.v-d over-ate.v-d forewent.v-d oversewed.v-d forswore.v-d foreswore.v-d forwent.v-d: VERB_SPPP_T(); stolen.v shaken.v thrown.v torn.v worn.v forgone.v curretted.v forsworn.v oversewn.v over-eaten.v foresworn.v overeaten.v: VERB_PP() or ( & {K+} & {@MV+}) or ({@E-} & A+) or ({K+} & ); /en/words/words.v.8.3: VERB_SPPP_T() or ( & {K+} & {@MV+}) or ({@E-} & A+) or ({K+} & ); cut.v: VERB_SPPP_T() or ( & ) or ( & {K+} & {@MV+}) or ({@E-} & A+) or ({K+} & ); /en/words/words.v.8.4: & ; /en/words/words.v.8.5: ( & ) or ; % -------------------------------------------------------------- : (((O+ or B-) & {OD+}) or [[@MV+ & O*n+]]) & {@MV+}; raise.v lower.v up.v: VERB_PLI(); raises.v lowers.v ups.v: VERB_S_T(); raised.v-d lowered.v-d upped.v-d: VERB_SPPP_T() or or ({@E-} & A+) or ; raising.v lowering.v upping.v: & ; raising.g lowering.g upping.g: ( & ) or ; % much like words.v.2.1, except can have "TO" link. % tending.g remains in words.v.2.5 % I tended for years to believe that shepherds tend sheep. : & {TO+}; tend.v: VERB_PLI(); tends.v: VERB_S_T(); tended.v-d: VERB_SPPP_T() or or ({@E-} & A+) or ; tending.v: & ; % INTRANSITIVE COMPLEX VERBS (those that do not take O+) : {@MV+} & {TO+}; consent.v endeavor.v hesitate.v proceed.v aspire.v purport.v: VERB_PLI(); consents.v endeavors.v hesitates.v proceeds.v aspires.v purports.v: VERB_S_I(); consented.v-d endeavored.v-d hesitated.v-d proceeded.v-d aspired.v-d purported.v-d: VERB_SPPP_I(); consenting.v endeavoring.v hesitating.v proceeding.v aspiring.v purporting.v: ( & ) or ; : {@MV+} & TO+; endeavour.v condescend.v deign.v: VERB_PLI(); endeavours.v condescends.v deigns.v: VERB_S_I(); endeavoured.v-d condescended.v-d deigned.v-d: VERB_SPPP_I(); endeavouring.v condescending.v deigning.v: ( & ) or ; : {@MV+} & {TO+ or THi+}; happen.v: VERB_PLI(); happens.v: VERB_S_I(); happened.v-d: VERB_SPPP_I(); happening.v: ( & ) or ; % ditransitve : ({@MV+} & {TH+ or Ce+ or RSe+ or TO+}) or ; wish.v: VERB_PLI(); wished.v-d: VERB_SPPP_I(); wishes.v: VERB_S_I(); wishing.v: ( & ) or ; % The O+ target is to handle "I hope so", but really, we should have % a special-case for this (i.e. a new minor letter). % See also for the same problem. : ({@MV+} & {TH+ or Ce+ or RSe+ or TO+}) or [[O+ & {@MV+}]]; hope.v agree.v pretend.v swear.v pray.v vow.v vote.v: VERB_PLI(); hopes.v agrees.v pretends.v swears.v prays.v vows.v votes.v: VERB_S_I(); pretended.v-d prayed.v-d: VERB_SPPP_I(); % The ( & THi+) allows "it is hoped that ..." to parse. hoped.v-d voted.v-d vowed.v-d: VERB_SPPP_T() or ( & THi+); agreed.v-d: VERB_SPPP_T() or ( & TH+); swore.v-d: VERB_SP_T(); sworn.v: VERB_PP() or ({@E-} & A+); hoping.v agreeing.v pretending.v swearing.v praying.v vowing.v voting.v: ( & ) or ; : {@MV+} & {Pa+ or TOf+ or THi+ or AF- or [[Pv+]]}; appear.v: & ; appears.v: & ; appeared.v-d: & ; appearing.v: ( & ) or ; : {@MV+} & (Pa+ or TOf+ or LI+ or THi+ or AF- or [[Pv+]]); seem.v: & ; seems.v: & ; seemed.v-d: & ; seeming.v: ( & ) or ; : {@MV+} & {TO+ or QI+}; care.v: VERB_PLI(); cares.v: VERB_S_I(); cared.v-d: VERB_SPPP_I(); caring.v: ( & ) or ; : ({@MV+} & (TH+ or RSe+ or Z- or Ce+)); assert.v contend.v remark.v retort.v intimate.v exclaim.v conjecture.v allege.v surmise.v opine.v insinuate.v suppose.v: VERB_PLI(); asserts.v contends.v remarks.v retorts.v intimates.v exclaims.v conjectures.v alleges.v surmises.v opines.v insinuates.v supposes.v: VERB_S_T(); retorted.v intimated.v exclaimed.v conjectured.v surmised.v-d opined.v-d insinuated.v-d: VERB_SPPP_I(); asserted.v-d contended.v-d remarked.v-d: VERB_SPPP_T() or ( & THi+); alleged.v-d: VERB_SPPP_T() or ( & THi+) or ({@E-} & A+); supposed.v-d: VERB_SPPP_T() or ( & {TOf+ or THi+ or Z-}) or ({@E-} & A+); asserting.v contending.v remarking.v retorting.v intimating.v exclaiming.v conjecturing.v alleging.v surmising.v opining.v insinuating.v supposing.v: ( & ) or ; : {@MV+} & {TH+}; theorize.v attest.v fantasize.v muse.v speculate.v concur.v: VERB_PLI(); theorizes.v attests.v fantasizes.v muses.v speculates.v concurs.v: VERB_S_I(); attested.v-d fantasized.v-d mused.v-d speculated.v-d concurred.v-d: VERB_SPPP_I(); theorized.v-d: VERB_SPPP_I() or ( & THi+); theorizing.v attesting.v fantasizing.v musing.v speculating.v concurring.v: ( & ) or ; : ({@MV+} & {TH+ or Ce+}); reply.v whisper.v argue.v sigh.v mutter.v testify.v comment.v respond.v hint.v reason.v brag.v: VERB_PLI(); replies.v whispers.v argues.v sighs.v mutters.v testifies.v comments.v responds.v hints.v reasons.v brags.v: VERB_S_T(); replied.v-d sighed.v-d commented.v-d responded.v-d bragged.v-d: VERB_SPPP_I(); % The ( & THi+) allows "it is reasoned that ..." to parse. argued.v-d hinted.v-d muttered.v-d reasoned.v-d testified.v-d whispered.v-d: VERB_SPPP_T() or ( & THi+); replying.v whispering.v arguing.v sighing.v muttering.v testifying.v commenting.v responding.v hinting.v reasoning.v bragging.v: ( & ) or ; : {@MV+} & {Ce+ or TH+ or RSe+ or (OF+ & {@MV+}) or BW-}; dream.v complain.v: VERB_PLI(); dreams.v complains.v: VERB_S_I(); dreamt.v-d dreamed.v-d complained.v-d: VERB_SPPP_I(); dreaming.g complaining.g: ( & ) or ; dreaming.v complaining.v: & ; % The O+ is to handle "do you think so, too?", however, a special % target for objects like "so" or "it" would be better... % "hope.v" has the same problem. : ({@MV+} & {Ce+ or TH+ or RSe+ or Z- or (OF+ & {@MV+}) or BW-}) or [[O+ & {@MV+}]]; think.v: VERB_PLI(); thinks.v: VERB_S_T(); thought.v-d: VERB_SPPP_T() or ( & {THi+ or Z-}); thinking.g: ( & ) or ; thinking.v: & ; : {@MV+} & {THi+ or QIi+}; matter.v: VERB_S_PLI(); matters.v: & ; mattered.v-d: VERB_SPPP_I(); mattering.v: ( & ) or ; : {@MV+} & {THi+}; suffice.v: VERB_PLI(); suffices.v: VERB_S_I(); sufficed.v-d: VERB_SPPP_I(); sufficing.v: ( & ) or ; : ({@MV+} & {TH+ or Zs- or TS+ or Ce+}) or (SI*j+ & I*j+); insist.v: VERB_PLI(); insists.v: VERB_S_I(); insisted.v-d: VERB_SPPP_I(); insisting.v: ( & ) or ; : {@MV+} & {QI+}; wonder.v inquire.v: VERB_PLI(); wonders.v inquires.v: VERB_S_I(); wondered.v-d inquired.v-d: VERB_SPPP_I(); wondering.v inquiring.v: ( & ) or ; % Imperative go: "go play ball", "go take a walk", "go swimming" % Similar pattern to "please.r" -- "please play ball" etc. % "You and Rover go play with the ball." requires an S- link. % Hmm ... changes to go.v seem to have obsoleted the need for this ... % go.w: {E-} & (Wi- or S-) & I+; : {K+ or [[Pa+]] or [Pg+] or I*g+} & {@MV+}; go.v: VERB_PLI(); % SFs-: "There goes the cutest guy ever!", needs O*t to survive PP. % However, prefer Pg over O*t when possible... goes.v: ( & ( or [[O*t+ & {@MV+}]])) or ( & ) or ( & ); went.v-d: ( & ( or [[O*t+ & {@MV+}]])) or ( & ) or ( & ); % XXX TODO maybe need VJ and-able links for gone, going etc. ??? gone.v: VERB_PP(); % The keys are gone. The popcorn is all gone. gone.a: ({@E-} & Pa-) or (AJra- & {@MV+}) or ({@MV+} & AJla+); going.v: ((TOf+ or ({K+ or [[Pa+]]} & {@MV+})) & ) or ({@E-} & A+) or ; % transitive: "stay the prisoner's execution" : {({@MV+} & (Pa+ or AF-)) or ({K+} & {@MV+}) or (O+ & {@MV+})}; stay.v: VERB_PLI(); stays.v: VERB_S_T(); stayed.v-d: VERB_SPPP_T(); staying.v: ( & ) or ; : {({@MV+} & Pa+) or ({O+ or B-} & {K+} & {@MV+})}; stand.v sit.v: VERB_PLI(); stands.v sits.v: VERB_S_T(); stood.v-d sat.v-d: VERB_SPPP_T(); standing.v sitting.v: & ; standing.g sitting.g: ( & ) or or ({@E-} & A+); : ({@MV+} & {LI+ or Pa+ or AF-}) or {O+ & K+ & {@MV+}}; sound.v: VERB_PLI(); sounds.v: VERB_S_T(); sounded.v-d: VERB_SPPP_T(); sounding.v: ( & ) or ; : {({@MV+} & (LI+ or Pa+)) or ({K+ or AF-} & {@MV+})}; act.v: VERB_PLI(); acts.v: VERB_S_I(); % "be acted upon quikly" acted.v-d: VERB_SPPP_I() or ( & {K+} & {@MV+}); acting.v: ( & ) or ; % O+ & K+: She looked him over. : {({@MV+} & (LI+ or Pa+)) or ({K+ or AF-} & {@MV+}) or ((O+ & K+) & {@MV+})}; look.v: VERB_PLI(); looks.v: VERB_S_T(); looked.v-d: VERB_SPPP_T(); looking.v: ( & ) or ; : {{@MV+ or ({Xc+} & @EB+)} & OF+}; repent.v disapprove.v: VERB_PLI(); repents.v disapproves.v: VERB_S_I(); repented.v-d disapproved.v-d: VERB_SPPP_I(); repenting.v disapproving.v: ( & ) or ; : & ; talk.v: VERB_PLI(); talks.v: VERB_S_T(); talked.v-d: VERB_SPPP_T(); talking.v: ( & & ) or ; : {@MV+ or @EB+} & OF+; consist.v: VERB_PLI(); consists.v: VERB_S_I(); consisted.v-d: VERB_SPPP_I(); consisting.v: ( & ) or ; : {K+ or OF+} & {@MV+}; die.v: VERB_PLI(); dies.v: VERB_S_I(); died.v-d: VERB_SPPP_I(); dying.v: ( & ) or ; : {({[[@MV+]]} & OT+) or BT-} & {@MV+}; last.v wait.v: VERB_PLI(); lasts.v waits.v: VERB_S_I(); lasted.v-d waited.v-d: VERB_SPPP_I(); lasting.v waiting.v: & ; lasting.g waiting.g: ( & ) or ; % TRANSITIVE COMPLEX VERBS (Those that take O+) : or ({@MV+} & TO+); attempt.v undertake.v deserve.v manage.v plot.v prefer.v neglect.v afford.v commit.v profess.v desire.v: VERB_PLI(); attempts.v undertakes.v deserves.v manages.v plots.v prefers.v neglects.v affords.v commits.v professes.v desires.v: VERB_S_T(); attempted.v deserved.v managed.v plotted.v preferred.v neglected.v afforded.v committed.v professed.v-d desired.v-d: VERB_SPPP_T() or or ({@E-} & A+) or ; undertook.v-d: VERB_SP_T(); undertaken.v: VERB_PP() or ; attempting.g undertaking.g deserving.g plotting.g preferring.g neglecting.g affording.g committing.g professing.g desiring.g: ( & ) or ; managing.g: ( & ) or or ({@E-} & A+); attempting.v undertaking.v deserving.v managing.v plotting.v preferring.v neglecting.v affording.v committing.v professing.v desiring.v: & ; % like but with particle : ({@MV+} & TO+) or ((((O+ or B-) & {K+}) or (K+ & {[[@MV+]]} & O*n+) or ([[@MV+ & O*n+]])) & {@MV+}); seek.v: VERB_PLI(); seeks.v: VERB_S_T(); sought.v-d: VERB_SPPP_T() or or ; seeking.g: ( & ) or ; seeking.v: & ; : {} or ({@MV+} & TO+); decline.v fail.v hasten.v volunteer.v aim.v: VERB_PLI(); declines.v fails.v hastens.v volunteers.v aims.v: VERB_S_T(); declined.v-d hastened.v-d volunteered.v-d aimed.v-d: VERB_SPPP_T() or or ; failed.v-d: VERB_SPPP_T() or or ({@E-} & A+); declining.g failing.g hastening.g volunteering.g: ( & ) or or ({@E-} & A+); declining.v failing.v hastening.v volunteering.v aiming.v: & ; % like but with particle : ({@MV+} & TO+) or ({({O+ or B-} & {K+}) or (K+ & {[[@MV+]]} & O*n+) or [[@MV+ & O*n+]]} & {@MV+}); fight.v: VERB_PLI(); fights.v: VERB_S_T(); fought.v-d: VERB_SPPP_T() or ( & {K+} & {@MV+}) or ({K+} & ); fighting.g: ( & ) or ; fighting.v: & ; : or ({@MV+} & (TO+ or TH+ or Zs- or Ce+)); threaten.v mean.v arrange.v pledge.v: VERB_PLI(); threatens.v means.v arranges.v pledges.v: VERB_S_T(); threatened.v-d meant.v-d arranged.v-d pledged.v-d: VERB_SPPP_T() or or ({@E-} & A+) or ; meaning.g arranging.g threatening.g pledging.g: ( & ) or ; meaning.v arranging.v threatening.v pledging.v: & ; : or ({@MV+} & {TO+ or TH+ or Zs- or Ce+}); plan.v confess.v: VERB_PLI(); plans.v confesses.v: VERB_S_T(); planned.v-d confessed.v-d: VERB_SPPP_T() or or ({@E-} & A+) or ; planning.g confessing.g: ( & ) or ; planning.v confessing.v: & ; : or ({@MV+} & {QI+ or TH+ or TO+ or Ce+ or RSe+ or Zs-}); decide.v resolve.v: VERB_PLI(); decides.v resolves.v: VERB_S_T(); decided.v-d resolved.v-d: VERB_SPPP_T() or ( & {THi+}) or ; deciding.v resolving.v: & ; deciding.g resolving.g: ( & ) or ; : {} or ({@MV+} & (QI+ or TH+ or TO+ or Ce+ or RSe+ or Zs- or Pg+)); remember.v forget.v: VERB_PLI(); remembers.v forgets.v: VERB_S_T(); remembered.v-d: VERB_SPPP_T() or or ; forgot.v-d: VERB_SP_T(); forgotten.v: VERB_PP() or or ({@E-} & A+) or ; remembering.g forgetting.g: ( & ) or ; remembering.v forgetting.v: & ; : {} or ({@MV+} & (TH+ or TO+ or Ce+ or RSe+ or Zs- or QI+ or (OF+ & {@MV+}))); learn.v: VERB_PLI(); learns.v: VERB_S_T(); learned.v-d: VERB_SPPP_T() or ( & {THi+}) or ; learning.g: ( & ) or ; learning.v: & ; : or ({@MV+} & (TO+ or TH+ or Ce+ or RSe+ or Z- or Pg+ or TS+ or (SI*j+ & I*j+))); propose.v: VERB_PLI(); proposes.v: VERB_S_T(); proposed.v-d: VERB_SPPP_T() or ( & {THi+ or TSi+ or Z-}) or ({@E-} & A+) or ; proposing.g: ( & ) or ; proposing.v: & ; : or ({@MV+} & ((TO+ or TH+ or Z- or TS+ or ((SI*j+ or SFI**j+) & I*j+)))); demand.v: VERB_PLI(); demands.v: VERB_S_T(); demanded.v-d: VERB_SPPP_T() or or ; demanding.v: & ; demanding.g: ( & ) or ; : {} or ({@MV+} & ((TO+ or TH+ or Z- or TS+ or ((SI*j+ or SFI**j+) & I*j+)))); beg.v plead.v: VERB_PLI(); begs.v pleads.v: VERB_S_T(); begged.v-d pleaded.v-d: VERB_SPPP_T() or or ; begging.v pleading.v: & ; begging.g pleading.g: ( & ) or ; : ; bear.v: ( & ( or ({@MV+} & (Pg+ or TH+ or TO+)))) or ( & ); bears.v: VERB_S_T(); bore.v-d: VERB_SPPP_T(); born.v: VERB_PP() or or ; bearing.g: ( & ) or ; bearing.v: & ; : or ({@MV+} & (TO+ or Pg+)); love.v dislike.v hate.v: VERB_PLI(); loves.v dislikes.v hates.v: VERB_S_T(); loved.v-d disliked.v-d hated.v-d: VERB_SPPP_T() or or ; loving.g disliking.g hating.g: ( & ) or ; loving.v disliking.v hating.v: & ; % "It begins here" : {} or ({@MV+} & ({TO+} or Pg+)); begin.v continue.v cease.v: VERB_PLI(); begins.v continues.v ceases.v: VERB_S_T(); ceased.v-d: VERB_SPPP_T() or or ; continued.v-d: VERB_SPPP_T() or or or ({@E-} & A+); began.v-d: VERB_SP_T(); begun.v: VERB_PP() or or ; beginning.g ceasing.g: ( & ) or ; continuing.g: ( & ) or or ({@E-} & A+); beginning.v continuing.v ceasing.v: & ; % with particle : ((({O+ or B-} & {K+}) or (K+ & {[[@MV+]]} & O*n+) or [[@MV+ & O*n+]]) & {@MV+}) or ({@MV+} & (TO+ or Pg+)); start.v stop.v try.v: VERB_PLI(); starts.v stops.v tries.v: VERB_S_T(); started.v-d stopped.v-d tried.v-d: VERB_SPPP_T() or ( & {K+} & {@MV+}) or ({K+} & ); starting.g stopping.g trying.g: ( & ) or ; starting.v stopping.v trying.v: & ; % The Pg+ doesn't really apply to all of these ... : or ({@MV+} & (TH+ or Zs-)) or ({@MV+} & Pg+); recognize.v dispute.v accept.v calculate.v record.v deduce.v envision.v recount.v signify.v clarify.v disclose.v recollect.v adduce.v posit.v reiterate.v infer.v presuppose.v: VERB_PLI(); recognizes.v disputes.v calculates.v records.v deduces.v accepts.v envisions.v recounts.v signifies.v clarifies.v discloses.v recollects.v adduces.v posits.v reiterates.v infers.v presupposes.v: VERB_S_T(); recognized.v-d disputed.v-d accepted.v-d calculated.v-d recorded.v-d deduced.v-d envisioned.v-d recounted.v-d signified.v-d clarified.v-d disclosed.v-d recollected.v-d adduced.v-d posited.v-d reiterated.v-d inferred.v-d presupposed.v-d: VERB_SPPP_T() or ( & {THi+}) or ({@E-} & A+) or ; recognizing.g disputing.g accepting.g calculating.g deducing.g recording.g envisioning.g recounting.g signifying.g clarifying.g disclosing.g recollecting.g adducing.g positing.g reiterating.g inferring.g presupposing.g: ( & ) or ; recognizing.v disputing.v accepting.v calculating.v deducing.v recording.v envisioning.v recounting.v signifying.v clarifying.v disclosing.v recollecting.v adducing.v positing.v reiterating.v inferring.v presupposing.v: & ; undisputed.v: ( & {THi+}); : {} or ({@MV+} & TH+); repeat.v reflect.v provide.v counter.v signal.v: VERB_PLI(); repeats.v reflects.v provides.v counters.v signals.v: VERB_S_T(); repeated.v-d reflected.v-d countered.v-d signaled.v-d signalled.v-d: VERB_SPPP_T() or or or ({@E-} & A+); provided.v-d: VERB_SPPP_T() or or or ({@E-} & A+) or ((TH+ or Ce+) & (({{Xd-} & Xc+} & CO+) or ({Xd- & Xc+} & MVs-))); repeating.v reflecting.v providing.v countering.v signaling.v signalling.v: & ; repeating.g reflecting.g countering.g signaling.g signalling.g: ( & ) or ; providing.g: ( & ) or or ((TH+ or Ce+) & (({{Xd-} & Xc+} & CO+) or ({Xd- & Xc+} & MVs-))); : or ({@MV+} & (Ce+ or TH+ or RSe+ or Pg+)); sense.v doubt.v reaffirm.v reckon.v regret.v proclaim.v ascertain.v discern.v stipulate.v affirm.v certify.v trust.v postulate.v ensure.v imply.v verify.v boast.v: VERB_PLI(); senses.v reaffirms.v doubts.v reckons.v regrets.v proclaims.v stipulates.v ascertains.v discerns.v affirms.v certifies.v trusts.v postulates.v ensures.v implies.v verifies.v boasts.v: VERB_S_T(); doubted.v-d reaffirmed.v-d sensed.v-d reckoned.v-d regretted.v-d stipulated.v-d proclaimed.v-d ascertained.v-d discerned.v-d affirmed.v-d certified.v-d trusted.v-d postulated.v-d ensured.v-d implied.v-d verified.v-d boasted.v-d: VERB_SPPP_T() or ( & {THi+}) or ({@E-} & A+) or ; reaffirming.g sensing.g doubting.g stipulating.g reckoning.g regretting.g proclaiming.g ascertaining.g discerning.g affirming.g certifying.g trusting.g postulating.g ensuring.g implying.g verifying.g boasting.g: ( & ) or ; sensing.v doubting.v reckoning.v reaffirming.v stipulating.v regretting.v proclaiming.v ascertaining.v discerning.v affirming.v certifying.v trusting.v postulating.v ensuring.v implying.v verifying.v boasting.v: & ; % Pv+ link: "John imagines himself lost in the woods." % Pg+ link: "John imagines himself singing from a mountaintop" % AZ+ link: "John imagined Mary as innocent as a lamb" % similar to vc-see : or ({@MV+} & (Ce+ or TH+ or RSe+ or Z-)) or ((B- or O+) & {@MV+} & {Pg+ or AZ+ or Pv+}) or ({@MV+} & Pg+); imagine.v: VERB_PLI(); imagines.v: VERB_S_T(); imagined.v: VERB_SPPP_T() or ( & {THi+}) or ({@E-} & A+) or ; imagining.g: ( & ) or ; imagining.v: & ; % Pa**j link: The doctor declared him insane. : or ({@MV+} & (Ce+ or TH+ or RSe+ or Pg+ or Z-)) or ((B- or O+) & ({@MV+} & Pa**j+)); declare.v fear.v conclude.v suspect.v concede.v presume.v foresee.v emphasize.v maintain.v acknowledge.v note.v confirm.v stress.v assume.v: VERB_PLI(); declares.v fears.v concludes.v suspects.v concedes.v presumes.v foresees.v emphasizes.v maintains.v acknowledges.v notes.v confirms.v stresses.v assumes.v: VERB_S_T(); declared.v feared.v concluded.v suspected.v conceded.v presumed.v emphasized.v maintained.v acknowledged.v noted.v confirmed.v-d stressed.v-d assumed.v-d: VERB_SPPP_T() or ( & {THi+ or ({@MV+} & Pa+) }) or ({@E-} & A+) or ; foresaw.v-d: VERB_SP_T(); foreseen.v: VERB_PP() or ( & {@MV+ or THi+}) or ({@E-} & A+) or ; declaring.g fearing.g concluding.g suspecting.g conceding.g presuming.g foreseeing.g emphasizing.g maintaining.g acknowledging.g noting.g confirming.g stressing.g assuming.g: ( & ) or ; declaring.v fearing.v concluding.v suspecting.v conceding.v presuming.v foreseeing.v emphasizing.v maintaining.v acknowledging.v noting.v confirming.v stressing.v assuming.v: & ; : {} or ({@MV+} & (Ce+ or TH+ or RSe+)); believe.v answer.v worry.v protest.v: VERB_PLI(); believes.v answers.v worries.v protests.v: VERB_S_T(); believed.v-d answered.v-d worried.v-d protested.v-d: VERB_SPPP_T() or ( & {THi+ or TOf+}) or ; believing.g answering.g worrying.g protesting.g: ( & ) or ; believing.v answering.v worrying.v protesting.v: & ; % with particle : ({@MV+} & (Ce+ or TH+ or RSe+)) or ((({O+ or B-} & {K+}) or (K+ & {[[@MV+]]} & O*n+) or [[@MV+ & O*n+]]) & {@MV+}); rule.v add.v: VERB_PLI(); rules.v adds.v: VERB_S_T(); ruled.v-d added.v-d: VERB_SPPP_T() or ( & {({@MV+} & (THi+ or TOf+)) or ({K+} & {@MV+})}) or ({K+} & ) or ({@E-} & A+); ruling.g adding.g: ( & ) or ; ruling.v adding.v: & ; % with particle : ({@MV+} & (TH+ or Zs- or Ce+)) or ((((O+ or B-) & {K+}) or (K+ & {[[@MV+]]} & O*n+)) & {@MV+}) or ([[@MV+ & O*n+]]); figure.v: VERB_PLI(); figures.v: VERB_S_T(); figured.v-d: VERB_SPPP_T() or ( & {K+} & {@MV+}) or ({K+} & ); figuring.g: ( & ) or ; figuring.v: & ; % (QI+ & {MV+}): "I did not say why until recently" : or ({@MV+} & (Ce+ or TH+ or RSe+ or Zs-)) or ({@MV+} & (QI+ & {MV+})); predict.v realize.v discover.v determine.v announce.v say.v mention.v admit.v recall.v reveal.v state.v observe.v indicate.v analyse.v analyze.v assess.v establish.v evaluate.v examine.v question.v test.v hypothesize.v hypothesise.v document.v envisage.v: VERB_PLI(); predicts.v realizes.v discovers.v determines.v announces.v says.v mentions.v admits.v recalls.v reveals.v states.v observes.v indicates.v analyses.v analyzes.v assesses.v establishes.v evaluates.v examines.v questions.v tests.v hypothesizes.v hypothesises.v envisages.v documents.v: VERB_S_T(); predicted.v realized.v discovered.v determined.v announced.v mentioned.v admitted.v recalled.v revealed.v stated.v observed.v indicated.v analysed.v analyzed.v assessed.v established.v evaluated.v examined.v questioned.v tested.v hypothesized.v-d hypothesised.v-d well-established.v-d documented.v-d envisaged.v-d: VERB_SPPP_T() or ( & {THi+}) or ({@E-} & A+) or ; said.v-d: VERB_SPPP_T() or ({@E-} & (Pvf- or [[Mv-]]) & {@MV+} & {THi+}) or [[{@E-} & A+]] or [[]]; predicting.g realizing.g discovering.g determining.g announcing.g saying.g mentioning.g admitting.g recalling.g revealing.g stating.g observing.g indicating.g analysing.g analyzing.g assessing.g establishing.g evaluating.g examining.g questioning.g testing.g hypothesizing.g hypothesising.g documenting.g envisaging.g: ( & ) or ; predicting.v realizing.v discovering.v determining.v announcing.v saying.v mentioning.v admitting.v recalling.v revealing.v stating.v observing.v indicating.v analysing.v analyzing.v assessing.v establishing.v evaluating.v examining.v questioning.v testing.v hypothesizing.v hypothesising.v documenting.v envisaging.v: & ; : {} or ({@MV+} & (TH+ or QI+ or Ce+ or RSe+ or Zs-)); guess.v estimate.v understand.v notice.v explain.v demonstrate.v: VERB_PLI(); guesses.v estimates.v understands.v notices.v explains.v demonstrates.v: VERB_S_T(); guessed.v-d understood.v-d noticed.v-d explained.v-d demonstrated.v-d: VERB_SPPP_T() or ( & {THi+}) or ; estimated.v-d: VERB_SPPP_T() or ( & {THi+}) or or ({@E-} & A+); guessing.g estimating.g understanding.g noticing.g explaining.g demonstrating.g: ( & ) or ; guessing.v estimating.v understanding.v noticing.v explaining.v demonstrating.v: & ; % (QI+ & {MV+}): "I did not know why until recently" : {} or ({@MV+} & (((OF+ or QI+)& {@MV+}) or Ce+ or TH+ or RSe+ or Zs-)); know.v: VERB_PLI(); knows.v: VERB_S_T(); knew.v-d: VERB_SP_T(); known.v: VERB_PP() or ( & {THi+ or TOf+ or QIi+}) or or ({@E-} & A+); knowing.g: ( & ) or ; knowing.v: & ; : or ({@MV+} & (TH+ or Ce+ or RSe+ or Zs- or TS+ or ((SI*j+ or SFI**j+) & I*j+))); request.v: VERB_PLI(); requests.v: VERB_S_T(); requested.v-d: VERB_SPPP_T() or ( & {THi+ or TSi+}) or ({@E-} & A+) or ; requesting.g: ( & ) or ; requesting.v: & ; : or ({@MV+} & (Pa+ or TH+ or Ce+ or RSe+ or AF- or Vf+ or (LI+ or {@MV+}) or [[Pv+]])); feel.v: VERB_PLI(); feels.v: VERB_S_T(); felt.v-d: VERB_SPPP_T() or ( & {THi+}) or ; feeling.g: ( & ) or ; feeling.v: & ; : {} or ({@MV+} & (QI+ or TH+ or Pg+)); mind.v: VERB_PLI(); minds.v: VERB_S_T(); minded.v-d: VERB_SPPP_T() or or ; minding.g: ( & ) or ; minding.v: & ; : {} or ({@MV+} & QI+); study.v: VERB_PLI(); studies.v: VERB_S_T(); studied.v-d: VERB_SPPP_T() or or ({@E-} & A+) or ; studying.g: ( & ) or ; studying.v: & ; % QI+ link: "I will discuss which vitamins I take" : or ({@MV+} & (Pg+ or QI+)); discuss.v: VERB_PLI(); discusses.v: VERB_S_T(); discussed.v-d: VERB_SPPP_T() or or ({@E-} & A+) or ; discussing.g: ( & ) or ; discussing.v: & ; : or ({@MV+} & Pg+); oppose.v enjoy.v advocate.v contemplate.v entail.v necessitate.v justify.v risk.v avoid.v involve.v favor.v: VERB_PLI(); opposes.v enjoys.v advocates.v contemplates.v entails.v necessitates.v justifies.v risks.v avoids.v involves.v favors.v: VERB_S_T(); opposed.v-d enjoyed.v-d advocated.v-d contemplated.v-d entailed.v-d necessitated.v-d justified.v-d risked.v-d avoided.v-d involved.v-d favored.v-d: VERB_SPPP_T() or or ({@E-} & A+) or ; opposing.g enjoying.g advocating.g contemplating.g entailing.g necessitating.g justifying.g risking.g avoiding.g favoring.g involving.g: ( & ) or ; opposing.v enjoying.v advocating.v contemplating.v entailing.v necessitating.v justifying.v risking.v avoiding.v involving.v favoring.v: & ; : {} or ({@MV+} & Pg+); finish.v practice.v resist.v: VERB_PLI(); finishes.v practices.v resists.v quits.v: VERB_S_T(); % : "I want it finished" finished.v-d practiced.v-d resisted.v-d quitted.v-d: VERB_SPPP_T() or or ({@E-} & A+) or ; quit.v-d: VERB_PLI() or VERB_SPPP_T() or or ({@E-} & A+) or ; finishing.g practicing.g resisting.g quitting.g: ( & ) or ; finishing.v practicing.v resisting.v quitting.v: & ; % Pv-: "I want it over with" over_with: ; % with particle % and also Pa**j for "The witch turned him green" : ((O+ or (K+ & {[[@MV+]]} & O*n+) or ({O+ or B-} & {K+}) or ((O+ or B-) & Pa**j+) or [[@MV+ & O*n+]]) & {@MV+}) or ({@MV+} & (Pa+ or AF-)); turn.v: VERB_PLI(); turns.v: VERB_S_T(); turned.v-d: VERB_SPPP_T() or ( & {K+} & {@MV+}) or ({K+} & ); turning.v: & ; turning.g: ( & ) or ; % plus TI : ((O+ or B- or TI+ or [[@MV+ & (O*n+ or TI+)]] or [[Pv+]]) & {@MV+}) or ({@MV+} & (AF- or Pa+)); become.v: VERB_S_PLI() or ( & ) or ; becomes.v: & ; became.v-d: & ; becoming.g: ( & ) or ; becoming.v: & ; % plus TI : ({@MV+} & (AF- or Pa+)) or ({O+ or B- or TI+ or [[@MV+ & (O*n+ or TI+)]] or [[Pv+]]} & {@MV+}); remain.v: VERB_PLI(); remains.v: VERB_S_T(); remained.v-d: VERB_SPPP_T(); remaining.g: ( & ) or or ({@E-} & A+); remaining.v: & ; % plus particle : ({@MV+} & (AF- or Pa+)) or ((({O+ or B-} & {K+}) or (K+ & {[[@MV+]]} & O*n+) or [[@MV+ & O*n+]]) & {@MV+}); grow.v: VERB_PLI(); grows.v: VERB_S_T(); grew.v-d: VERB_SP_T(); grown.v: VERB_PP() or ( & {K+} & {@MV+}) or ({@E-} & A+) or ({K+} & ); growing.g: ( & ) or ({@E-} & A+) or ; growing.v: & ; % plus OF : {O+ or B- or [[@MV+ & O*n+]] or ({@MV+} & OF+)} & {@MV+}; approve.v: VERB_PLI(); approves.v: VERB_S_T(); approved.v-d: VERB_SPPP_T() or or ({@E-} & A+) or ; approving.g: ( & ) or ; approving.v: & ; % plus OF : (O+ or B- or [[@MV+ & O*n+]] or ({@MV+} & OF+)) & {@MV+}; dispose.v conceive.v: VERB_PLI(); disposes.v conceives.v: VERB_S_T(); disposed.v-d conceived.v-d: VERB_SPPP_T() or or ({@E-} & A+) or ; disposing.g conceiving.g: ( & ) or ; disposing.v conceiving.v: & ; % plus particle : ((K+ & {[[@MV+]]} & O*n+) or ({O+ or B-} & {K+}) or [[@MV+ & O*n+]] or OF+) & {@MV+}; speak.v: VERB_PLI(); speaks.v: VERB_S_T(); spoke.v-d: VERB_SP_T(); spoken.v: VERB_PP() or ( & {K+} & {@MV+}) or ({K+} & ) or ({@E-} & A+); speaking.v: & ; speaking.g: ( & ) or or ({@E-} & A+); : or ({@MV+} & ((LI+ & {@MV+}) or AF- or Pa+ or OF+)); taste.v: VERB_PLI(); tastes.v: VERB_S_T(); tasted.v-d: VERB_SPPP_T() or or ; tasting.g: ( & ) or ; tasting.v: & ; : {} or ({@MV+} & ((LI+ & {@MV+}) or AF- or Pa+ or OF+)); reek.v smell.v: VERB_PLI(); reeks.v smells.v: VERB_S_T(); reeked.v-d smelled.v-d: VERB_SPPP_T() or or ; reeking.g smelling.g: ( & ) or ; reeking.v smelling.v: & ; % plus partcle and Vt : (((K+ & {[[@MV+]]} & O*n+) or ((O+ or B-) & {K+ or Vt+}) or [[@MV+ & O*n+]]) & {@MV+}) or ({O+} & (OT+ or BT-) & {@MV+} & {(TOt+ & B+) or TOi+}) or (OXii+ & Vtg+ & {@MV+} & TH+) or @MV+; take.v: VERB_S_PLI(); takes.v: & ; took.v-d: & ; taken.v: ( & ) or ( & {K+} & {@MV+}) or ({@E-} & A+) or ({K+} & ) or (Pvf- & Vtg+ & THi+); taking.v: & ; taking.g: ( & ) or ; for_granted: Vtg-; % VERBS TAKING [OBJ] + [OTHER COMPLEMENT] % basically, all these are plus mess : ((K+ & {[[@MV+]]} & O*n+) or ((O+ or B-) & (K+ or Pp+ or WR-)) or (Vp+ & (Zs- or MVa+))) & {@MV+}; put.v-d: VERB_SPPP_T() or ( & ) or ( & (K+ or Pp+ or WR-) & {@MV+}) or ((K+ or Pp+) & ); puts.v: VERB_S_T(); putting.v: & ; putting.g: ( & ) or ; % K+ & O*n+: "He costed out the plan" : (( or (K+ & O*n+) or (B- & {O+})) & {@MV+} & {TOi+}) or ([[@MV+ & O*n+]]); cost.v-d: VERB_S_PLI() or ( & ); costed.v-d: VERB_SPPP_T() or ( & (({K+} & {@MV+}) or Pa+ or Pg+)) or ({K+ or Pa+ or Pg+} & ); costs.v: & ; costing.v: & ; costing.g: ( & ) or ; % ditransitive : ( & {@MV+}) or (K+ & {[[@MV+]]} & O*n+) or (B- & O+) or ((O+ or B-) & (({@MV+} & (Pa+ or AF- or Pg+)) or ({K+} & {@MV+}))) or ([[@MV+ & O*n+]]) or ({@MV+} & (TH+ or Ce+ or RSe+)); find.v: VERB_PLI(); finds.v: VERB_S_T(); found.v-d: VERB_SPPP_T() or ( & (({K+ or AF-} & {@MV+}) or Pa+ or Pg+)) or ({K+ or Pa+ or Pg+} & ); finding.v: & ; finding.g: ( & ) or ; % ditranstive : ((O+ or B-) & (({K+} & {@MV+}) or ({@MV+} & (Pa+ or AF- or Pv+)))) or (( or (K+ & {[[@MV+]]} & O*n+) or K+ or (B- & O+) ) & {@MV+}) or ({@MV+} & (Pa+ or AF- or Pv+ or Pp+ or TO+)); get.v: VERB_PLI(); gets.v: VERB_S_T(); got.v-d: VERB_SPPP_T(); gotten.v: VERB_PP() or ( & {K+ or Pp+} & {@MV+}) or ({K+ or Pp+} & ); getting.v: & ; getting.g: ( & ) or ; : ((O+ or B-) & (({K+} & {@MV+}) or ({@MV+} & {Pa+ or AF- or Pv+ or Pg+}))) or ({(K+ & {[[@MV+]]} & O*n+) or ([[@MV+ & O*n+]])} & {@MV+}); leave.v: VERB_PLI(); leaves.v: VERB_S_T(); left.v-d: VERB_SPPP_T() or ( & (({K+ or AF-} & {@MV+}) or Pv+ or Pa+ or Pg+)) or ({K+ or ({@MV+} & (Pv+ or Pa+ or Pg+))} & ); leaving.v: & ; leaving.g: ( & ) or ; : ((O+ or (K+ & {[[@MV+]]} & O*n+) or [[@MV+ & O*n+]] or Vk+) & {@MV+}) or ({O+ or B-} & ((K+ & {@MV+}) or ({@MV+} & (Pa+ or AF- or Pg+ or Pv+)))); keep.v: VERB_PLI(); keeps.v: VERB_S_T(); kept.v-d: VERB_SPPP_T() or ( & (({K+ or AF-} & {@MV+}) or Pa+ or Pg+ or Pv+)) or ({K+ or ({@MV+} & (Pa+ or Pg+ or Pv+))} & ); keeping.v: & ; keeping.g: ( & ) or ; watch.i vigil.i pace.i: Vk-; track.i: Vk- & {OF+}; : ((K+ & {[[@MV+]]} & O*n+) or ({O+ or B-} & {K+ or Vs+}) or [[@MV+ & O*n+]]) & {@MV+}; set.v-d: VERB_SPPP_T() or ( & ) or ( & {K+ or Vs+} & {@MV+}) or ({@E-} & A+) or ({K+ or Vs+} & ); sets.v: VERB_S_T(); setting.v: & ; setting.g: ( & ) or or ({@E-} & A+); free.i straight.i loose.i: Vs- & {MV+}; : ((K+ & {[[@MV+]]} & O*n+) or ({O+ or B-} & {K+ or Vh+}) or [[@MV+ & O*n+]]) & {@MV+}; hold.v: VERB_PLI(); holds.v: VERB_S_T(); held.v-d: VERB_SPPP_T() or ( & {K+ or Vh+} & {@MV+}) or ({@E-} & A+) or ({K+ or Vh+} & ); holding.v: & ; holding.g: ( & ) or ; hostage.i captive.i: Vh- or Vth-; : ({@MV+} & (Ce+ or TH+ or RSe+ or Z- or TO+)) or ((O+ or OX+ or B-) & {@MV+} & {TOo+}) or ([[@MV+ & O*n+]]); expect.v claim.v: VERB_PLI(); expects.v claims.v: VERB_S_T(); expected.v-d claimed.v-d: VERB_SPPP_T() or ( & {TOf+ or THi+ or Z-}) or ({@E-} & A+) or ({@MV+} & {TO+} & ); expecting.g claiming.g: ( & ) or ; expecting.v claiming.v: & ; : ({@MV+} & (TH+ or Z- or TO+)) or ((O+ or OX+ or B-) & {@MV+} & TOo+); intend.v: VERB_PLI(); intends.v: VERB_S_T(); intended.v-d: VERB_SPPP_T() or ( & {TO+ or Z- or @MV+}) or ({@E-} & A+) or ({@MV+} & {TO+} & ); intending.g: ( & ) or ; intending.v: & ; : (N+ & I+) or ({@MV+} & TO+) or ((O+ or B-) & {@MV+} & TOo+); dare.v: VERB_PLI(); dares.v: VERB_S_T(); dared.v-d: VERB_SPPP_T() or ( & TO+) or ({@MV+} & TO+ & ); daring.g: ( & ) or ; daring.v: & ; : ({@MV+} & (TO+ or Pg+)) or ((O+ or B- or OX+) & {@MV+} & {TOo+}) or ([[@MV+ & O*n+]]); like.v: VERB_PLI(); likes.v: VERB_S_T(); liked.v-d: VERB_SPPP_T() or or ; liking.g: ( & ) or ; liking.v: & ; % ditranstive : (( or (B- & {O+})) & {@MV+}) or ({@MV+} & TO+) or ([[@MV+ & O*n+]]); offer.v: VERB_PLI(); offers.v: VERB_S_T(); offered.v-d: VERB_SPPP_T() or ( & {O+ or B- or [[@MV+ & O*n+]]} & {@MV+}) or ({O+ or [[@MV+ & O*n+]]} or ); offering.g: ( & ) or ; offering.v: & ; % ditransitive % unlike vc-offer, "to" is optional. : (( or (B- & {O+})) & {@MV+}) or ({@MV+} & {TO+}) or ([[@MV+ & O*n+]]); refuse.v: VERB_PLI(); refuses.v: VERB_S_T(); refused.v-d: VERB_SPPP_T() or ( & {O+ or B- or [[@MV+ & O*n+]]} & {@MV+}) or ({O+ or [[@MV+ & O*n+]]} & ); refusing.g: ( & ) or ; refusing.v: & ; % Pa**j+: predicative adjective -- "I want it green", "I want it very shiny." : ({@MV+} & TO+) or ((O+ or OX+ or B-) & {@MV+} & {TOo+ or Pv+ or Pa**j+}) or ([[@MV+ & O*n+]]) or [[CX- & {@MV+}]]; want.v need.v: VERB_PLI(); need.i: {@E-} & (S- or (RS- & B-)) & (N+ & I+); wants.v needs.v: VERB_S_T(); wanted.v-d needed.v-d: VERB_SPPP_T() or or ({@E-} & A+) or ; wanting.g needing.g: ( & ) or ; wanting.v needing.v: & ; : ({@MV+} & {TO+}) or ((O+ or B-) & {@MV+} & {TOo+}) or ([[@MV+ & O*n+]]); choose.v: VERB_PLI(); chooses.v: VERB_S_T(); chose.v-d: VERB_SP_T(); chosen.v: VERB_PP() or ( & {TO+}) or ({@E-} & A+) or ({@MV+} & {TO+} & ); choosing.g: ( & ) or ; choosing.v: & ; % is identical to : ({@MV+} & {TO+}) or ((O+ or B-) & {@MV+} & {TOo+}) or ([[@MV+ & O*n+]]); prepare.v press.v: VERB_PLI(); prepares.v presses.v: VERB_S_T(); prepared.v-d pressed.v-d: VERB_SPPP_T() or or ({@E-} & A+) or ; preparing.g pressing.g: ( & ) or ; preparing.v pressing.v: & ; : ((O+ or B-) & {@MV+} & {TOo+}) or ({@MV+} & (TH+ or Ce+ or TS+ or (SI*j+ & I*j+))) or Zs- or ([[@MV+ & O*n+]]); require.v: VERB_PLI(); requires.v: VERB_S_T(); required.v-d: VERB_SPPP_T() or ( & {TO+ or TSi+}) or ({@E-} & A+) or ({@MV+} & {TO+} & ); requiring.g: ( & ) or ; requiring.v: & ; : ({@MV+} & (TH+ or Zs- or TS+ or Ce+)) or ((O+ or B-) & {@MV+} & {TOo+}) or ([[@MV+ & {O*n+}]]); command.v order.v urge.v: VERB_PLI(); commands.v orders.v urges.v: VERB_S_T(); : VERB_SPPP_T() or ( & {TO+ or TH+ or TS+}) or ({@MV+} & {TH+ or TO+ or TS+} & ); commanded.v-d urged.v-d: ; % An "ordered list" ordered.v: or ({@E-} & A+); commanding.g ordering.g urging.g: ( & ) or ; commanding.v ordering.v urging.v: & ; % ditransitive : ({@MV+} & (TH+ or Pg+)) or ((O+ or OX+ or B-) & {@MV+} & {TOo+ or Pa+}) or (((O+ & (B- or ({[[@MV+]]} & O*n+))) or ([[@MV+ & O*n+]])) & {@MV+}); consider.v: VERB_PLI(); considers.v: VERB_S_T(); considered.v-d: VERB_SPPP_T() or ( & (({@MV+} & (TOf+ or Pa+)) or ({O+ or B- or [[@MV+ & O*n+]]} & {@MV+}))) or ((({@MV+} & (TOf+ or Pa+)) or ({O+ or [[@MV+ & O*n+]]})) & ); considering.g: ( & ) or ; considering.v: & ; : ({@MV+} & (TH+ or Ce+)) or ((O+ or OX+ or B-) & {@MV+} & {TOo+}) or ([[@MV+ & O*n+]]); perceive.v: VERB_PLI(); perceives.v: VERB_S_T(); perceived.v-d: VERB_SPPP_T() or ( & {TO+}) or ({@E-} & A+) or ({@MV+} & {TO+} & ); perceiving.g: ( & ) or ; perceiving.v: & ; : ({@MV+} & {TH+ or Z- or Ce+}) or ((O+ or B-) & {@MV+} & {TOo+}) or ([[@MV+ & O*n+]]); report.v: VERB_PLI(); reports.v: VERB_S_T(); reported.v-d: VERB_SPPP_T() or ( & {TOf+ or Z-}) or ({@E-} & A+) or ({@MV+} & {TO+} & ); reporting.g: ( & ) or ; reporting.v: & ; : ((O+ or B-) & {@MV+} & {TH+ or Ce+ or TOo+}) or ({@MV+} & {TH+ or Zs-}) or ([[@MV+ & O*n+]]); caution.v: VERB_PLI(); cautions.v: VERB_S_T(); cautioned.v-d: VERB_SPPP_T() or ( & ((O+ or B-) & {@MV+} & {TH+ or Ce+ or Zs- or TO+})) or ({@MV+} & {TH+ or Ce+ or TO+} & ); cautioning.g: ( & ) or ; cautioning.v: & ; : ((O+ or B-) & {@MV+} & {TH+ or Ce+ or TOo+ or (OF+ & {@MV+})}) or ({@MV+} & {TH+ or Zs- or (OF+ & {@MV+})}) or ([[@MV+ & O*n+]]); warn.v advise.v: VERB_PLI(); warns.v advises.v: VERB_S_T(); warned.v-d advised.v-d: VERB_SPPP_T() or ( & {TH+ or Ce+ or Zs- or TO+ or (OF+ & {@MV+})}) or ({@MV+} & {TH+ or Ce+ or TO+ or OF+} & ); warning.g advising.g: ( & ) or ; warning.v advising.v: & ; : ((B- or O+) & {@MV+} & {I*j+ or Pg+}) or ({@MV+} & {TH+ or Zs- or Ce+ or (OF+ & {@MV+})}) or ([[@MV+ & O*n+]]); hear.v: VERB_PLI(); hears.v: VERB_S_T(); heard.v-d: VERB_SPPP_T() or ( & {Pg+}) or ({@MV+} & {Pg+} & ); hearing.g: ( & ) or ; hearing.v: & ; : ((B- or O+) & {@MV+} & {I*j+ or Pg+ or AZ+ or Pv+}) or ({@MV+} & {TH+ or Zs- or QI+ or Ce+}) or ([[@MV+ & O*n+]]); see.v: VERB_PLI(); sees.v: VERB_S_T(); saw.v-d: VERB_SP_T(); seen.v: VERB_PP() or ( & {Pg+ or AZ+}) or ({@MV+} & {Pg+ or AZ+} & ); seeing.g: ( & ) or ; seeing.v: & ; % ditranstive verbs -- taking direct and indirect objects : ( or (B- & {O+}) or ([[@MV+ & O*n+]])) & {@MV+}; owe.v deliver.v accord.v award.v term.v grant.v begrudge.v assign.v rename.v repay.v dub.v entitle.v fine.v: VERB_PLI(); owes.v delivers.v accords.v awards.v terms.v grants.v begrudges.v assigns.v renames.v repays.v dubs.v entitles.v fines.v: VERB_S_T(); owed.v delivered.v accorded.v awarded.v granted.v-d begrudged.v-d assigned.v-d repaid.v-d fined.v-d: VERB_SPPP_T() or ( & {O+ or B- or [[@MV+ & O*n+]]} & {@MV+}) or ({O+ or [[@MV+ & O*n+]]} & ); owing.v delivering.v according.v awarding.v terming.v granting.v begrudging.v assigning.v renaming.v repaying.v dubbing.v entitling.v fining.v: & ; owing.g delivering.g according.g awarding.g terming.g granting.g begrudging.g assigning.g renaming.g repaying.g dubbing.g entitling.g fining.g: ( & ) or ; % extended linking requirements based on the above termed.v-d dubbed.v-d entitled.v-d renamed.v-d: VERB_SPPP_T() or ( & {O+ or B- or [[@MV+ & O*n+]]} & {@MV+}) or ({O+ or [[@MV+ & O*n+]]} & ) or ({@E-} & A+); % ditransitive % 'Give' requires both direct *and* indirect object: X gave Y a Z. % 'sent', 'poured': optional indirect object. : ((B- & {O+ or K+}) or or (O+ & K+) or (K+ & ({[[@MV+]]} & O*n+)) or ([[@MV+ & O*n+]])) & {@MV+}; give.v send.v buy.v bring.v lend.v issue.v hand.v pour.v telegraph.v wire.v: VERB_PLI(); gives.v sends.v buys.v brings.v lends.v issues.v hands.v pours.v telegraphs.v wires.v: VERB_S_T(); sent.v-d bought.v-d brought.v-d lent.v-d handed.v-d: VERB_SPPP_T() or ( & {O+ or B- or K+ or [[@MV+ & O*n+]]} & {@MV+}) or ({O+ or K+ or [[@MV+ & O*n+]]} & ); issued.v-d poured.v-d telegraphed.v-d wired.v-d: VERB_SPPP_T() or ({@E-} & A+) or ( & {O+ or B- or K+ or [[@MV+ & O*n+]]} & {@MV+}) or ({O+ or K+ or [[@MV+ & O*n+]]} & ); gave.v-d: VERB_SP_T(); given.v: VERB_PP() or ({@E-} & A+) or ( & {O+ or B- or K+ or [[@MV+ & O*n+]]} & {@MV+}) or ({O+ or K+ or [[@MV+ & O*n+]]} & ); giving.g sending.g buying.g bringing.g lending.g issuing.g handing.g pouring.g telegraphing.g wiring.g: ( & ) or ; giving.v sending.v buying.v bringing.v lending.v issuing.v handing.v pouring.v telegraphing.v wiring.v: & ; % ditransitive : {(B- & {O+ or K+}) or or (O+ & K+) or (K+ & {{[[@MV+]]} & O*n+}) or ([[@MV+ & O*n+]])} & {@MV+}; pass.v pay.v sell.v deal.v: VERB_PLI(); passes.v pays.v sells.v deals.v: VERB_S_T(); passed.v-d paid.v-d payed.v-d sold.v-d dealt.v-d: VERB_SPPP_T() or ( & {O+ or B- or K+ or [[@MV+ & O*n+]]} & {@MV+}) or ({O+ or K+ or [[@MV+ & O*n+]]} & ); passing.g paying.g selling.g dealing.g: ( & ) or ; passing.v paying.v selling.v dealing.v: & ; % ditransitive : {(B- & {O+ or Pa+ or K+}) or or (O+ & (Pa+ or K+)) or (K+ & {{[[@MV+]]} & O*n+}) or ([[@MV+ & O*n+]])} & {@MV+}; call.v shout.v: VERB_PLI(); calls.v shouts.v: VERB_S_T(); called.v-d shouted.v-d: VERB_SPPP_T() or ( & {O+ or B- or K+ or Pa+ or [[@MV+ & O*n+]]} & {@MV+}) or ({O+ or K+ or Pa+ or [[@MV+ & O*n+]]} & ); calling.g shouting.g: ( & ) or ; calling.v shouting.v: & ; % Minimal ditransitive extenstion of words.v.6 % ditransitive: "Please paint it lime green" : or ; color.v colour.v paint.v: VERB_PLI(); colors.v colours.v paints.v: VERB_S_T(); colored.v-d coloured.v-d painted.v-d: VERB_SPPP_T() or ( & {O+ or K+} & {@MV+}) or ({K+} & ) or ({@E-} & A+); coloring.v colouring.v painting.v: ( & ) or or ; coloring.g colouring.g painting.g: ( & ) or ; % ditransitive % Writing -- direct and indirect object are optional: % 'he wrote' 'he wrote a letter' 'he wrote me a letter' 'he wrote me' % 'he wrote me that S' but '*he drew me that S' : ({(B- & {O+ or K+}) or or (O+ & K+) or (K+ & {{[[@MV+]]} & O*n+}) or ([[@MV+ & O*n+]])} & {@MV+}) or ({@MV+} & (TH+ or Ce+)); write.v charge.v draw.v: VERB_PLI(); writes.v reads.v charges.v draws.v: VERB_S_T(); wrote.v-d drew.v-d: VERB_SP_T(); read.v-d: VERB_SPPP_T() or ( & ) or ( & {O+ or B- or K+ or [[@MV+ & O*n+]]} & {@MV+}) or ({O+ or K+ or [[@MV+ & O*n+]]} & ); charged.v-d: VERB_SPPP_T() or ( & {O+ or B- or K+ or [[@MV+ & O*n+]]} & {@MV+}) or ({O+ or K+ or [[@MV+ & O*n+]]} & ); written.v drawn.v: VERB_PP() or ( & {O+ or B- or K+ or [[@MV+ & O*n+]]} & {@MV+}) or ({O+ or K+ or [[@MV+ & O*n+]]} & ) or ({@E-} & A+); writing.g reading.g charging.g drawing.g: ( & ) or ; writing.v reading.v charging.v drawing.v: & ; % ditransitive % Singing: if there's an indirect object, then a direct object is % mandatory: '*she sang me' % but then: 'she sang soprano' : ({(B- & {O+ or K+}) or or (O+ & K+) or (K+ & {{[[@MV+]]} & O*n+}) or ([[@MV+ & O*n+]])} & {@MV+}); sing.v dance.v cry.v: VERB_PLI(); sings.v dances.v cries.v: VERB_S_T(); sang.v-d danced.v-d cried.v-d: VERB_SP_T(); sung.v-d: VERB_SPPP_T(); singing.g dancing.g crying.g: ( & ) or ; singing.v dancing.v crying.v: & ; % : ; % shout.v: VERB_PLI(); % shouts.v: VERB_S_T(); % shouted.v: VERB_SP_T(); % shouting.g: ( & ) or ; % shouting.v: & ; % ditransitive : (( or ([[@MV+]] & O*n+)) & {@MV+}) or ((O+ or B-) & {@MV+} & {B- or TOo+}); allow.v: VERB_PLI(); allows.v: VERB_S_T(); allowed.v-d: VERB_SPPP_T() or ( & (({O+ or B- or [[@MV+ & O*n+]]} & {@MV+}) or ({@MV+} & TO+))) or ({O+ or [[@MV+ & O*n+]] or ({@MV+} & TO+)} & ); allowing.g: ( & ) or ; allowing.v: & ; % ditransitive : ({O+ or B-} & {@MV+} & {B- or TO+ or Ce+ or TH+ or RSe+ or Zs-}) or (( or ([[@MV+ & O*n+]])) & {@MV+}); promise.v: VERB_PLI(); promises.v: VERB_S_T(); promised.v-d: VERB_SPPP_T() or ( & (({O+ or B- or [[@MV+ & O*n+]]} & {@MV+}) or ({@MV+} & (TO+ or Ce+ or TH+ or RSe+ or Zs-)))) or ({@E-} & A+) or ({O+ or [[@MV+ & O*n+]] or ({{@MV+} & (TO+ or Ce+ or TH+)})} & ); promising.g: ( & ) or ; promising.v: & ; % ditransitive : ({O+ or B-} & ({@MV+} & (QI+ or Ce+ or TH+ or RSe+ or Zs- or B-))) or (( or (O+ & K+) or (K+ & (B- or ({[[@MV+]]} & O*n+))) or ([[@MV+ & O*n+]]) or [[()]]) & {@MV+}); show.v: VERB_PLI(); shows.v: VERB_S_T(); showed.v-d: VERB_SP_T(); shown.v: VERB_PP() or ( & (({O+ or K+ or B- or [[@MV+ & O*n+]]} & {@MV+}) or ({@MV+} & (QI+ or Ce+ or TH+ or RSe+ or Zs-)))) or ({O+ or K+ or [[@MV+ & O*n+]] or ({@MV+} & (QI+ or Ce+ or TH+))} & ); showing.g: ( & ) or ; showing.v: & ; % ditransitive : ((O+ or B-) & ({@MV+} & (QI+ or Ce+ or TH+ or RSe+ or Zs- or B- or TOo+))) or ({ or (B- & {[[@MV+]]} & O*n+) or ([[@MV+ & O*n+]])} & {@MV+}); teach.v: VERB_PLI(); teaches.v: VERB_S_T(); taught.v-d: VERB_SPPP_T() or ( & (({O+ or B- or [[@MV+ & O*n+]]} & {@MV+}) or ({@MV+} & (QI+ or Ce+ or TH+ or RSe+ or Zs- or TO+)))) or ({O+ or [[@MV+ & O*n+]] or ({@MV+} & (QI+ or Ce+ or TH+))} & ); teaching.g: ( & ) or ; teaching.v: & ; : ((O+ or B-) & {@MV+} & TOo+); compel.v: VERB_PLI(); compels.v: VERB_S_T(); compelled.v-d: VERB_SPPP_T() or ( & TO+) or ({@MV+} & TO+ & ); compelling.v: & ; compelling.g: ( & ) or ; : (((O+ or B-) & (({@MV+} & TOo+) or K+ or [()])) or (K+ & O*n+) or ([[{K+} & @MV+ & O*n+]])) & {@MV+}; force.v: VERB_PLI(); forces.v: VERB_S_T(); forced.v-d willed.v-d: VERB_SPPP_T() or ( & ((K+ & {@MV+}) or ({@MV+} & TO+))) or ((K+ or ({@MV+} & TO+)) & ) or ({@E-} & A+); forcing.g: ( & ) or ; forcing.v: & ; % ----------------------------------------- : ((O+ or B-) & {@MV+} & {TOo+}) or ([[@MV+ & O*n+ & {@MV+}]]); design.v permit.v authorize.v use.v cause.v enable.v pressure.v train.v sentence.v prompt.v spur.v disincline.v invite.v reelect.v encourage.v draft.v hire.v entice.v inspire.v aid.v forbid.v employ.v educate.v tempt.v condemn.v commission.v counsel.v induce.v instruct.v license.v incite.v nominate.v destine.v provoke.v challenge.v exhort.v implore.v motivate.v impel.v: VERB_PLI(); designs.v permits.v pressures.v trains.v sentences.v causes.v enables.v authorizes.v uses.v prompts.v spurs.v disinclines.v invites.v reelects.v encourages.v drafts.v hires.v entices.v inspires.v aids.v forbids.v employs.v educates.v tempts.v condemns.v commissions.v counsels.v induces.v instructs.v licenses.v incites.v nominates.v destines.v provokes.v challenges.v exhorts.v implores.v motivates.v impels.v: VERB_S_T(); designed.v-d permitted.v-d pressured.v-d trained.v-d sentenced.v-d caused.v-d enabled.v-d authorized.v-d prompted.v-d spurred.v-d invited.v-d disinclined.v-d reelected.v-d encouraged.v-d drafted.v-d hired.v-d enticed.v-d inspired.v-d aided.v-d employed.v-d educated.v-d tempted.v-d condemned.v-d commissioned.v-d counseled.v-d induced.v-d instructed.v-d licensed.v-d incited.v-d nominated.v-d destined.v-d provoked.v-d challenged.v-d exhorted.v-d implored.v-d motivated.v-d impelled.v-d: VERB_SPPP_T() or ( & {TO+}) or ({@E-} & A+) or ({{@MV+} & TO+} & ); forbade.v-d: VERB_SP_T(); forbidden.v: VERB_PP() or ( & {TO+}) or ({@E-} & A+) or ({{@MV+} & TO+} & ); designing.g permitting.g pressuring.g causing.g enabling.g training.g sentencing.g authorizing.g prompting.g spurring.g inviting.g disinclining.g reelecting.g encouraging.g drafting.g hiring.g enticing.g inspiring.g aiding.g employing.g educating.g tempting.g condemning.g commissioning.g counseling.g inducing.g instructing.g licensing.g inciting.g nominating.g destining.g provoking.g challenging.g exhorting.g imploring.g motivating.g impelling.g: ( & ) or ; designing.v permitting.v pressuring.v causing.v enabling.v training.v sentencing.v authorizing.v using.v prompting.v disinclining.v spurring.v inviting.v reelecting.v encouraging.v drafting.v hiring.v enticing.v inspiring.v aiding.v employing.v educating.v tempting.v condemning.v commissioning.v counseling.v inducing.v instructing.v licensing.v inciting.v nominating.v destining.v provoking.v challenging.v exhorting.v imploring.v motivating.v impelling.v: & ; used.v-d: VERB_SPPP_T() or ( & {TOo+}) or ( & TO+) or ({@MV+} & {TOo+} & ) or ({@E-} & A+); using.g: ( & ( or MVs-)) or ; % -------------------------------------------------- : ((O+ or B-) & (({@MV+} & {TOo+}) or ({[[@MV+]]} & (O*n+ or TI+)))) or ([[@MV+ & O*n+ & {@MV+}]]); elect.v appoint.v: VERB_PLI(); elects.v appoints.v: VERB_S_T(); elected.v-d appointed.v-d: VERB_SPPP_T() or ( & (({B- or (O+ or TI+ or [[@MV+ & (O*n+ or TI+)]])} & {@MV+}) or ({@MV+} & TO+))) or (({O+ or TI+ or [[@MV+ & (O*n+ or TI+)]]} or ({@MV+} & TO+)) & ) or ({@E-} & A+); electing.g appointing.g: ( & ) or ; electing.v appointing.v: & ; % vc-name is a ditransitive extension of vc-trans (with an extra TI+) : ( or (O+ & {[[@MV+]]} & TI+) or (B- & {O+ or TI+}) or ([[@MV+ & O*n+]])) & {@MV+}; name.v designate.v label.v: VERB_PLI(); names.v designates.v labels.v: VERB_S_T(); named.v-d designated.v-d labelled.v-d labeled.v-d: VERB_SPPP_T() or ( & ({B- or (O+ or TI+ or [[@MV+ & (O*n+ or TI+)]])}) & {@MV+}) or ({O+ or TI+ or [[@MV+ & (O*n+ or TI+)]]} & ) or ({@E-} & A+); naming.g designating.g labelling.g labeling.g: ( & ) or ; naming.v designating.v labelling.v labeling.v: & ; % optionally ditransitive, modeled on "name.v" : or ; tag.v: VERB_PLI(); tags.v: VERB_S_T(); tagged.v-d: VERB_SPPP_T() or (( & ({B- or (O+ or TI+ or [[@MV+ & (O*n+ or TI+)]])}) & {@MV+}) or ) or ({O+ or TI+ or [[@MV+ & (O*n+ or TI+)]]} & ) or ({@E-} & A+); tagging.g: ( & ) or ({@E-} & A+) or ; tagging.v: & ; : {((O+ or B-) & {@MV+} & {TOo+}) or @MV+ or ([[@MV+ & O*n+ & {@MV+}]])}; program.v oblige.v: VERB_PLI(); programs.v obliges.v: VERB_S_T(); programed.v-d programmed.v-d obliged.v-d: VERB_SPPP_T() or ( & {TO+}) or ({@E-} & A+) or ({{@MV+} & TO+} & ); programing.g programming.g obliging.g: ( & ) or ; programing.v programming.v obliging.v: & ; : ((O+ or B-) & {@MV+} & {TOo+ or TH+ or Ce+}) or ([[@MV+ & O*n+ & {@MV+}]]); convince.v persuade.v: VERB_PLI(); convinces.v persuades.v: VERB_S_T(); convinced.v-d persuaded.v-d: VERB_SPPP_T() or ( & {TO+ or TH+ or Ce+}) or ({{@MV+} & (TO+ or TH+ or Ce+)} & ); convincing.g persuading.g: ( & ) or ; convincing.v persuading.v: & ; % K+ is for "tell him off" % bare MVp+ for "Today, we will tell about ..." % OF+ for "They have told of the soldiers' fear" % (QI+ & {MV+}): "I did not tell why until recently" : (((O+ & {O*n+ or K+}) or B-) & {@MV+} & {TH+ or Ce+ or RSe+ or Zs- or TOo+ or QI+ or BW-}) or OF+ or (QI+ & {MV+}) or ([[@MV+ & {O*n+} & {@MV+}]]); tell.v: VERB_PLI(); tell.w: {@E-} & I- & {@MV+} & (QI+ or TH+ or Ce+ or RSe+ or Zs-); tells.v: VERB_S_T(); told.v-d: VERB_SPPP_T() or ( & {TH+ or Ce+ or RSe+ or Zs- or TO+ or QI+ or BW-}) or ( & O+ & {@MV+}) or ({{@MV+} & (Ce+ or TO+ or QI+ or TH+)} & ); telling.g: ( & ) or ; telling.v: & ; % (QI+ & {MV+}): "I did not ask why until recently" : ({(O+ & {O*n+}) or B-} & {@MV+} & {TS+ or TOo+ or (QI+ & {MV+}) or BW-}) or ([[@MV+ & O*n+ & {@MV+}]]); ask.v: VERB_PLI(); asks.v: VERB_S_T(); asked.v-d: VERB_SPPP_T() or ( & {TO+ or QI+ or BW- or TH+ or TS+}) or ( & O+ & {@MV+}) or ({{@MV+} & (TO+ or QI+ or TH+ or TS+)} & ); asking.g: ( & ) or ; asking.v: & ; : ({O+ or B-} & {@MV+} & {TO+ or I+}) or ([[@MV+ & O*n+ & {@MV+}]]); help.v: VERB_PLI(); helps.v: VERB_S_T(); helped.v-d: VERB_SPPP_T() or ( & {TO+}) or ({{@MV+} & TO+} & ); helping.g: ( & ) or ; helping.v: & ; : ((O+ or B-) & {@MV+} & (TOo+ or TH+ or Ce+ or (OF+ & {@MV+}))) or ([[@MV+ & O*n+ & {@MV+}]]); remind.v: VERB_PLI(); reminds.v: VERB_S_T(); reminded.v-d: VERB_SPPP_T() or ( & {TO+ or TH+ or Ce+ or (OF+ & {@MV+})}) or ({{@MV+} & (Ce+ or TO+ or TH+ or (OF+ & {@MV+}))} & ); reminding.g: ( & ) or ; reminding.v: & ; : ((O+ or B-) & {@MV+} & {(OF+ & {@MV+}) or TH+ or Zs- or Ce+}) or ([[@MV+ & O*n+ & {@MV+}]]); inform.v reassure.v alert.v guarantee.v notify.v forewarn.v: VERB_PLI(); informs.v reassures.v alerts.v guarantees.v notifies.v forewarns.v: VERB_S_T(); informed.v-d reassured.v-d alerted.v-d guaranteed.v-d notified.v-d forewarned.v-d: VERB_SPPP_T() or ( & {Ce+ or TH+ or Zs- or (OF+ & {@MV+})}) or ({{@MV+} & (Ce+ or TH+ or OF+)} & ) or ({@E-} & A+); informing.g reassuring.g alerting.g guaranteeing.g notifying.g forewarning.g: ( & ) or ; informing.v reassuring.v alerting.v guaranteeing.v notifying.v forewarning.v: & ; : ((O+ or B-) & {@MV+} & {(OF+ & {@MV+}) or TH+ or Zs- or Ce+}) or ([[@MV+ & O*n+ & {@MV+}]]) or ({@MV+} & (TH+ or Ce+)); assure.v: VERB_PLI(); assures.v: VERB_S_T(); assured.v-d: VERB_SPPP_T() or ( & {(OF+ & {@MV+}) or Ce+ or TH+ or Zs-}) or ({{@MV+} & (Ce+ or TH+ or OF+)} & ); assuring.g: ( & ) or ; assuring.v: & ; : ((B- or O+) & {@MV+} & {I+ or ((K+ or Pp+) & {@MV+})}) or ([[@MV+ & O*n+ & {@MV+}]]); let.v-d: VERB_SPPP_T() or ( & ) or ( & ((K+ or Pp+) & {@MV+})) or ((K+ or Pp+) & ); lets.v: VERB_S_T(); letting.g: ( & ) or ; letting.v: & ; let's let’s: ({Ic-} & Wi- & {N+} & I+) or ({Ic-} & Wi- & N+); : ((B- or O+) & {@MV+} & {I*j+ or Pg+}) or ([[@MV+ & O*n+ & {@MV+}]]) or {@MV+}; watch.v: VERB_PLI(); watches.v: VERB_S_T(); watched.v-d: VERB_SPPP_T() or or ; watching.g: ( & ) or ; watching.v: & ; : ((B- or O+) & {@MV+} & {Pg+}) or ([[@MV+ & O*n+ & {@MV+}]]); appreciate.v spend.v: VERB_PLI(); appreciates.v spends.v: VERB_S_T(); appreciated.v-d spent.v-d: VERB_SPPP_T() or ( & {Pg+}) or ({{@MV+} & Pg+} & ); appreciating.g spending.g: ( & ) or ; appreciating.v spending.v: & ; % Pa**j is used for predicative adjectives % ditransitive : ((B- or O+ or OX+) & {({@MV+} & {I*j+ or Pa**j+ or B-}) or ((K+ or AF-) & {@MV+})}) or (( or (K+ & {[[@MV+]]} & O*n+) or K+ or Vm+ or ([[{K+} & @MV+ & O*n+]])) & {@MV+}) or [[()]]; make.v: VERB_PLI(); makes.v: VERB_S_T(); made.v-d: VERB_SPPP_T() or ( & (({@MV+} & Pa+) or ({K+} & {@MV+}))) or ({({@MV+} & Pa+) or K+} & ); built_of built_up_of composed_of constructed_of formed_of made_of made_up_of: ( & (B- or O+) & {@MV+}) or (O+ & ); making.g: ( & ) or ; making.v: & ; : (((B- or O+) & {({@MV+} & Pa+) or AF-}) or ([[@MV+ & O*n+]])) & {@MV+}; render.v deem.v: VERB_PLI(); renders.v deems.v: VERB_S_T(); rendered.v-d deemed.v-d: VERB_SPPP_T() or ( & {Pa+ or AF-}) or ({{@MV+} & Pa+} & ); rendering.g deeming.g: ( & ) or ; rendering.v deeming.v: & ; : (((O+ or B-) & {{@MV+} & OF+}) or ([[@MV+ & O*n+]])) & {@MV+}; deprive.v accuse.v acquit.v purge.v disabuse.v exonerate.v absolve.v rob.v convict.v: VERB_PLI(); deprives.v accuses.v acquits.v purges.v disabuses.v exonerates.v absolves.v robs.v convicts.v: VERB_S_T(); deprived.v accused.v acquitted.v purged.v disabused.v exonerated.v absolved.v robbed.v convicted.v-d: VERB_SPPP_T() or ( & {OF+} & {@MV+}) or ({@E-} & A+) or ({{@MV+} & OF+} & ); depriving.g accusing.g acquitting.g purging.g disabusing.g exonerating.g absolving.g robbing.g convicting.g: ( & ) or ; depriving.v accusing.v acquitting.v purging.v disabusing.v exonerating.v absolving.v robbing.v convicting.v: & ; : (((O+ or B-) & {({@MV+} & OF+) or K+}) or ({K+} & O*n+) or K+ or ([[{K+} & @MV+ & O*n+]])) & {@MV+}; clear.v: VERB_PLI(); clears.v: VERB_S_T(); cleared.v-d: VERB_SPPP_T() or ( & {({@MV+} & OF+) or K+} & {@MV+}) or ({K+ or ({@MV+} & OF+)} & ); clearing.g: ( & ) or ; clearing.v: & ; : ({(O+ & {O*n+}) or (B- & {O+})} & {@MV+} & {TH+ or Ce+ or RSe+}) or ([[@MV+ & O*n+ & {@MV+}]]); bet.v-d: VERB_SPPP_T() or ( & ) or ( & {O+ or B-} & {@MV+} & {TH+ or Ce+ or RSe+ or @MV+}); bets.v: VERB_S_T(); betted.v-d: VERB_SPPP_T() or ( & {O+ or B-} & {@MV+} & {TH+ or Ce+ or RSe+ or @MV+}) or ({O- or [[@MV+ & O*n+]] or TH+ or Ce+} & ); betting.g: ( & ) or ; betting.v: & ; : ({@MV+} & TO+) or ((O+ or B-) & {@MV+} & {THi+}) or ([[@MV+ & O*n+ & {@MV+}]]); bother.v: VERB_S_PLI(); bothers.v: & ; bothered.v-d: ( & ) or or ; bothering.v: & ; bothering.g: ( & ) or ; : ((O+ or B-) & {@MV+} & {THi+}) or ([[@MV+ & O*n+]]); surprise.v alarm.v amaze.v amuse.v astonish.v astound.v excite.v depress.v disgust.v distress.v dismay.v irritate.v embarrass.v annoy.v: VERB_S_PLI(); surprises.v alarms.v amazes.v amuses.v astonishes.v astounds.v excites.v depresses.v disgusts.v distresses.v dismays.v irritates.v embarrasses.v annoys.v: & ; surprised.v alarmed.v amazed.v amused.v astonished.v astounded.v excited.v depressed.v disgusted.v distressed.v dismayed.v irritated.v embarrassed.v annoyed.v-d: ( & ) or or ; surprising.v alarming.v amazing.v amusing.v astonishing.v astounding.v exciting.v depressing.v disgusting.v distressing.v dismaying.v embarrassing.v annoying.v: & ; surprising.g alarming.g amazing.g amusing.g astonishing.g astounding.g exciting.g depressing.g disgusting.g distressing.g dismaying.g embarrassing.g annoying.g: ( & ) or ; : ((O+ or B- or [[@MV+ & O*n+]]) & {@MV+}) or ((O+ or OX+ or B-) & {@MV+} & (TOo+ or [[Pa+]])) or ({@MV+} & (TOf+ or TH+ or Ce+ or RSe+ or Zs- or Pa+)); prove.v: & ; proves.v: & ; proved.v-d: ( & ) or ( & {THi+ or TOf+}) or ({@E-} & A+) or ({{@MV+} & Pa+} & ); proven.v: ( & ) or ( & {THi+ or TOf+ or Pa+}) or ({@E-} & A+) or ({{@MV+} & Pa+} & ); proving.g: ( & ) or ; proving.v: & ; : ((O+ or B- or [[@MV+ & O*n+]]) & {@MV+}) or ({@MV+} & (Pg+ or TH+ or Ce+ or RSe+ or Zs- or TS+ or ((SI*j+ or SFI**j+) & I*j+))); suggest.v anticipate.v recommend.v: VERB_PLI(); suggests.v anticipates.v recommends.v: VERB_S_T(); suggested.v-d anticipated.v-d recommended.v-d: VERB_SPPP_T() or ( & {THi+ or TSi+ or Z-}) or ({@E-} & A+) or ; suggesting.g anticipating.g recommending.g: ( & ) or ; suggesting.v anticipating.v recommending.v: & ; % ditransitive : (( or (B- & {O+}) or [[@MV+ & O*n+]]) & {@MV+}) or ({@MV+} & (Pg+ or TH+ or Ce+ or RSe+)); deny.v: VERB_PLI(); denies.v: VERB_S_T(); denied.v-d: VERB_SPPP_T() or ( & {O+ or B- or [[@MV+ & O*n+]]} & {@MV+}) or ({O+ or ([[@MV+ & O*n+]])} & ); denying.g: ( & ) or ; denying.v: & ; : ((O+ or B-) & {@MV+} & {AZ+}) or ({@MV+} & (QI+ or Z-)) or ([[@MV+ & O*n+ & {@MV+}]]); describe.v: VERB_PLI(); describes.v: VERB_S_T(); described.v-d: VERB_SPPP_T() or ( & {AZ+ or Z-}) or ({@E-} & A+) or ({@MV+} & {AZ+} & ); describing.g: ( & ) or ; describing.v: & ; : ((O+ or B-) & {@MV+} & {AZ+}) or ([[@MV+ & O*n+ & {@MV+}]]); portray.v depict.v regard.v view.v characterize.v: VERB_PLI(); portrays.v depicts.v regards.v views.v characterizes.v: VERB_S_T(); portrayed.v-d depicted.v-d regarded.v-d viewed.v-d characterized.v-d: VERB_SPPP_T() or ( & {AZ+}) or ({@E-} & A+) or ({@MV+} & {AZ+} & ); portraying.g depicting.g regarding.g viewing.g characterizing.g: ( & ) or ; portraying.v depicting.v regarding.v viewing.v characterizing.v: & ; % ------------------------------------------------------------------------------- % IDIOMATIC VERBS do_so take_place show_up take_office do_battle give_way make_way take_part catch_up catch_on file_suit pick_up take_off break_free take_over jump_ship see_fit take_note: VERB_PLI(); does_so takes_place shows_up pleads_guilty pleads_innocent takes_office does_battle gives_way makes_way takes_part catches_up catches_on files_suit picks_up takes_off breaks_free takes_over jumps_ship sees_fit lets_go takes_note comes_true comes_clean comes_of_age: VERB_S_T(); showed_up pleaded_guilty pleaded_innocent made_way caught_up caught_on filed_suit picked_up jumped_ship: VERB_SPPP_I(); plead_guilty plead_innocent: VERB_SPPP_I() or ( & ); let_go: VERB_SPPP_I() or ( & ) or ; did_so took_place took_office did_battle gave_way took_part took_off broke_free took_over saw_fit took_note came_true came_clean came_of_age: VERB_SP_I(); done_so taken_place shown_up taken_office done_battle given_way taken_part taken_off broken_free taken_over seen_fit taken_note: VERB_PP(); come_true come_clean come_of_age: VERB_PLI() or VERB_PP(); doing_so taking_place showing_up pleading_guilty pleading_innocent taking_office doing_battle giving_way making_way taking_part catching_up catching_on filing_suit picking_up taking_off breaking_free taking_over jumping_ship seeing_fit letting_go taking_note coming_true coming_clean coming_of_age: ( & ) or ; : (O+ or B- or [[@MV+ & O*n+]]) & {@MV+}; allow_for bring_about get_rid_of let_go_of take_note_of: VERB_PLI(); puts_up_with allows_for brings_about gets_rid_of lets_go_of takes_note_of: VERB_S_T(); put_up_with let_go_of: VERB_SPPP_T() or ( & ); allowed_for brought_about got_rid_of took_note_of: VERB_SPPP_T(); gotten_rid_of taken_note_of: VERB_PP(); putting_up_with allowing_for bringing_about getting_rid_of letting_go_of taking_note_of: ( & ( or )) or ; : {[@MV+]} & TH+; take_it make_out point_out give_notice serve_notice: VERB_PLI(); takes_it makes_out points_out gives_notice serves_notice: VERB_S_I(); made_out pointed_out served_notice: VERB_SPPP_I() or or ; took_it gave_notice: VERB_SP_I(); taken_it given_notice: VERB_PP(); taking_it making_out pointing_out giving_notice serving_notice: ( & ) or ; : {[@MV+]} & THi+; turn_out: VERB_S_PLI(); turns_out: & ; turned_out: & ; turning_out: & ; % (QI+ & {MV+}): "I did not figure out why until recently" : {[@MV+]} & (TH+ or (QI+ & {MV+}) or Ce+); find_out figure_out: VERB_PLI(); finds_out figures_out: VERB_S_I(); found_out figured_out: VERB_SPPP_I() or or ; finding_out figuring_out: ( & ) or ; : {Pg+ or @MV+}; keep_on give_up go_around: VERB_S_PLI(); keeps_on gives_up goes_around: & ; kept_on: & ; gave_up went_around: & ; given_up gone_around: & ; keeping_on giving_up going_around: ( & ) or ; % XXX TODO need to provide and-able links for these. : Pg+ or Pa+ or ({AF-} & {@MV+}); end_up: VERB_S_PLI(); ends_up: & ; ended_up: & ; ending_up: ( & ) or ; /en/words/words.v.1.p: or ; % two-word passives % done_for accounted_for adhered_to arrived_at barked_at belched_at catered_to : {@MV+} & (((Xd- or Xq-) & (Xc+ or ) & (COq+ or (CP- & {CC+}) or Eq+)) or [(Xc+ or Xe+) & Ce+]); : {@MV+} & (((Xd- or Xq-) & (Xc+ or ) & (COq+ or (CPx- & {CC+}) or Eq+)) or [(Xc+ or Xe+) & Ce+]); : {@MV+} & (Xd- or Xq-) & (Xc+ or ) & (COqi+ or (CPi- & {CC+}) or Eqi+); % paraphrasing verbs like "say", "reply" % acknowledge.q add.q admit.q affirm.q agree.q announce.q argue.q /en/words/words.v.10.1: [[{@E-} & (((Sp- or I-) & ) or (SIpj+ & ))]]; /en/words/words.v.10.2: [[{@E-} & ((Ss- & ) or (SIsj+ & ))]]; /en/words/words.v.10.3: or ({@E-} & (((S- or PP-) & ) or (SI*j+ & ) or [[Pvf- & ]])); read.q-d: or ({@E-} & (((S- or I- or PP-) & ) or (SI*j+ & ))); wrote.q-d: or ({@E-} & ((S- & ) or (SI*j+ & ))); written.q: {@E-} & PP- & ; /en/words/words.v.10.4: [[{@E-} & Pg- & ]]; seem.q appear.q: [[{@E-} & (SFp- or If-) & ]]; seems.q appears.q: [[{@E-} & SFs- & ]]; seemed.q-d appeared.q-d: or ({@E-} & (SF- or PPf-) & ); seeming.q appearing.q: [[{@E-} & Pgf- & ]]; say.q: {@E-} & (((Sp- or I-) & ) or (SIpj+ & )); says.q: {@E-} & ((Ss- & ) or (SIsj+ & )); said.q-d: or ({@E-} & (((S- or PP-) & ) or (SI*j+ & ))); saying.q: {@E-} & Pg- & ; tell.q: [[{@E-} & (Sp- or I- or SIpj+) & O+ & ]]; tells.q: [[{@E-} & (Ss- or SIsj+) & O+ & ]]; told.q-d: or ({@E-} & (((S- or PP- or SI*j+) & O+) or Pv-) & ); telling.q: [[{@E-} & Pg- & O+ & ]]; ask.q: [[{@E-} & (((Sp- or I-) & {O+}) or SIpj+) & ]]; asks.q: [[{@E-} & ((Ss- & {O+}) or SIsj+) & ]]; asked.q-d: or ({@E-} & (((S- or PP-) & {O+}) or Pv- or SI*j+) & ); asking.q: [[{@E-} & Pg- & {O+} & ]]; % idiomatic "voted yes/no" expressions using the V link. : Vv+ & {@MV+}; say.w vote.w: VERB_PLI(); says.w votes.w: VERB_S_I(); said.w-d voted.w-d: VERB_SPPP_I(); saying.w voting.w: ( & ); yes.misc-vote no.misc-vote: Vv-; double.v triple.v quadruple.v quintuple.v: {EN-} & VERB_PLI(); doubles.v triples.v quadruples.v quintuples.v: {EN-} & VERB_S_T(); doubled.v-d tripled.v-d quadrupled.v-d quintupled.v-d: {EN-} & (VERB_SPPP_T() or or ({@E-} & A+) or ); doubling.v tripling.v quadrupling.v quintupling.v: {EN-} & ( & ); doubling.g tripling.g quadrupling.g quintupling.g: {EN-} & (( & ) or ({@E-} & A+) or ); % =================================================================== % PREPOSITIONS % conjoin preps: "prep and prep": "the coverage on TV and on the radio..." : MJrp- or MJlp+; % alter-preps: "it is somewhere in or near the house" % The "or" must take a prep object. % XXX TODO: most preps below need this rule. : MJrj- or MJlj+; : or [Mp-] or Pp- or MVp- or [({Xc+ & {Xd-}} & CO+)] or (Xd- & Xc+ & (MX*x- or MVx-)); : or (Cs+ & (Mj- or (Xd- & Xc+ & MX*j-))) or (Wj- & Qd+) or [Wq- & PF+]; : or [Mpn-] or Pp- or MVpn- or [({Xc+ & {Xd-}} & CO*n+)] or (Xd- & Xc+ & (MX- or MVx-)); : or [Mp-] or Pp- or MVa- or [({Xc+ & {Xd-}} & CO+)] or (Xd- & Xc+ & (MX*x- or MVx-)); under beneath: ({Yd-} & {JQ+} & J+ & ( or FM-)) or (MVp- & B-) or (Yd- & Pp-); below above behind.p: ({Yd-} & {{JQ+} & J+} & ( or FM-)) or (MVp- & B-); within: ({JQ+} & J+ & ) or (MVp- & B-); during: ({JQ+} & J+ & ( or UN-)) or (MVp- & B-); from: ({Yd-} & {JQ+} & (FM+ or J+ or Mgp+) & ) or (MVp- & B-) or MVp- or NIr+; at toward towards without: ({JQ+} & (J+ or Mgp+) & ) or (MVp- & B-); % % XXX fixme: MVp- & J+ is wrong: "*I saw John except Fred" except but.misc-ex: ({JQ+} & (J+ or Mgp+) & ) or (MVp- & B-) or ((MVp+ or TO+) & ); against beyond beside: ({JQ+} & (J+ or Mgp+) & ) or (MVp- & B-); between: ({JQ+} & (J+ or Mgp+) & ) or (MVp- & B-) or NIr+; with: ({JQ+} & (J+ or Mgp+) & ( or RJrv-)) or (Jw+ & (RJrj- or RJlj+)) or (MVp- & B-) or (J+ & {EBm+} & ([P+] or [[O*n+]]) & ([({Xc+ & {Xd-}} & CO+)] or MVp- or (Xd- & Xc+ & (MX*x- or MVx-)))); among: ({JQ+} & (J+ or Mgp+) & ( or FM-)) or (MVp- & B-); for.p: ({JQ+} & (J+ or Mgp+ or TI+) & ) or (J+ & (RJrj- or RJlj+)) or (MVp- & B-) or (MG- & JG+) or (MVp- & FL+); into: ({JQ+} & (J+ or Mgp+ or QI+) & ) or (MVp- & B-); about: ({JQ+} & (J+ or Mgp+ or QI+) & ) or EN+ or EZ+ or (MVp- & B-) or (TOf+ & (Mp- or MVp- or Pp-)) or MVa-; through.r: ({JQ+} & J+ & ( or FM-)) or (MVp- & B-); : ({JQ+} & J+ & ( or FM-)) or K- or (MVp- & B-); across along: ; off: or (MVp+ & {Xc+ & {Xd-}} & COp+); past.p: ({Yd-} & {JQ+} & J+ & ( or FM-)) or K- or (MVp- & B-); around: or ({JQ+} & (J+ or Mgp+) & ( or FM-)) or K- or (MVp- & B-) or [EN+] or MVa-; out up.r down.r: ({Yd-} & {JQ+} & ([J+] or [[MVp+]]) & (({Xd- & Xc+} & MVa-) or FM-)) or K- or ({Yd-} & Pp-) or (MVp- & B-); by: or ({JQ+} & (J+ or Mgp+ or JT+) & ( or FM-)) or K- or (MVp- & B-); in: or ({JQ+} & (J+ or Mgp+ or IN+) & ( or FM-)) or K- or (MVp- & B-) or (MG- & JG+); on upon: or ({JQ+} & (J+ or Mgp+ or ON+ or [QI+]) & ) or K- or (MVp- & B-); over: ({Yd-} & {JQ+} & (J+ or Mgp+ or QI+ or [[MVp+]]) & ( or FM-)) or K- or EN+ or (MVp- & B-) or (Yd- & Pp-); just_over just_under well_over: EN+; % XXX original LG recommends using the LI link, however the % sort of clobbers this. Should this be "fixed"? like.p: ({[EA-]} & (((J+ or Mgp+ or [[Mp+ or MVs+]]) & ) or (Vf- & Mgp+) or (LI- & (J+ or Cs+)))) or (MVp- & B-); unlike: J+ & (MVp- or Pp- or [({Xc+ & {Xd-}} & CO+)] or (Xd- & Xc+ & (E+ or MVx-))); of: ({JQ+} & (J+ or Mgp+ or QI+) & (Mp- or OF- or (Xd- & Xc+ & MX*x-) or (Cs+ & (Mj- or (Xd- & Xc+ & MX*j-))) or [[({Xc+ & {Xd-}} & CO+)]])) or ((OF- or Mp-) & B-) or (MG- & JG+) or (NF- & NJ+) or (Mp- & TI+); of_them: (ND- or MF-) & (J+ or Pa+) & Xd- & (MX*x- or MVx-) & Xc+; % MX-PHRASE: The blah, to be blahed, will be blah. % TO- & Xc+: "I'd like to, I want to." (null infinitive) to.r: ({@E-} & {NT-} & I+ & (TO- or [{Xd- & Xc+} & MVi-] or or [] or [[R-]] or (SFsx+ & ))) or (TO- & Xc+) or I*a+ or ({JQ+} & (J+ or Mgp+) & ) or VJ+ or [MVp- & B-]; so_as_to: I+ & {Xd- & Xc+} & MVi-; besides: {J+ or Mgp+} & ([({Xc+ & {Xd-}} & CO+)] or MVp- or [Wq- & PF+]); throughout: {J+} & ([({Xc+ & {Xd-}} & CO+)] or MVp- or [Wq- & PF+]); inside.r outside.r underneath alongside: {J+} & ( or FM-); amid plus.p minus.p via onto: J+ & ( or [Wq- & PF+]); versus: (J+ & Mp-) or (G- & G+); vs: {Xi+} & G- & G+; worth.p: (Mp- & (J+ or OF+)) or (Paf- & Mgp+) or (Pa- & (J+ or B-)); opposite.p: J+ & ; better_off worse_off: {EC-} & Pa- & {Pg+}; off_of out_of: ({JQ+} & J+ & ) or (MVp- & B-); despite notwithstanding other_than apart_from aside_from: (J+ or Mgp+) & (MVp- or (Xd- & Xc+ & (MVx- or E+)) or [({Xc+ & {Xd-}} & CO+)]); rather_than: (J+ or Mgp+ or Mp+ or I+) & ((Xd- & Xc+ & (E+ or MVx-)) or MVp- or [({Xc+ & {Xd-}} & CO+)]); instead_of because_of prior_to: (J+ or Mgp+) & (MVp- or Pp- or [({Xc+ & {Xd-}} & CO+)] or (Xd- & Xc+ & (E+ or MVx-))); as_well_as: (J+ or Mgp+) & (MG- or Mp- or MVp- or [({Xc+ & {Xd-}} & CO+)] or (Xd- & Xc+ & (MX*x- or MVx-))); according_to as_of in_case_of in_response_to unbeknownst_to thanks_to: J+ & (MVp- or Pp- or [({Xc+ & {Xd-}} & CO+)] or (Xd- & Xc+ & (E+ or MVx-))); due_to along_with en_route_to in_connection_with: J+ & ; regardless_of as_to irrespective_of: (J+ or QI+) & (MVp- or [({Xc+ & {Xd-}} & CO+)] or (Xd- & Xc+ & (E+ or MVx-))); overhead.r midway in_public in_private en_route a_la_mode a_la_carte side_by_side from_coast_to_coast: ; abroad upstairs.r downstairs.r overseas.r next_door: or FM-; elsewhere: or FM- or [[J-]]; ahead at_hand in_store in_reverse in_place in_town under_way in_office out_of_office out_of_reach in_reach within_reach on_guard at_large in_hand on_hand for_free on_file in_line on_line in_loco_parentis on_board en_route in_bed out_of_bed on_strike on_top from_afar at_stake in_question at_issue on_lease on_trial in_league in_cahoots in_front in_back on_break on_camera in_command in_concert by_association in_association on_deck on_disk on_file on_foot on_location on_line online.r: MVp- or Mp- or Pp- or (Xc+ & Xd- & (MX*x- or MVx-)); uptown downtown.r offshore.r underground.r out_of_town: MVp- or Mp- or Pp- or FM- or (Xc+ & Xd- & MVx-); : MVp- or Pp- or (Xc+ & Xd- & MVx-); forward.r backward forwards.r backwards sideways ashore abreast aft half-way two-fold downhill southward underfoot westward eastward northward overnight.r on_hold on_track in_situ in_toto off_balance in_check on_course off_course under_oath at_end by_example on_holiday by_invitation on_patrol on_stage in_step in_tempo on_schedule behind_schedule ahead_of_schedule for_good for_keeps in_phase out_of_step out_of_phase in_tune out_of_tune in_session out_of_session in_phase neck_and_neck under_contract: ; /en/words/words-medical.prep.1: ; % 5' 3' are DNA ends upstream downstream 5' 3': A+ or NIfp+ or NItp- or ({Yd- or EZ- or EE- or EI-} & {MVp+ or OF+} & (({Xc+ & Xd-} & (Ma- or MJra-)) or MJra+ or (Wq- & PF+) or MVp- or Pp- or FM- or (Xc+ & Xd- & (MVx- or MX-)))); %upstream downstream 3' 5': %A+ or %((EZ- or Y-) & (MVp+ or OF+) & (MV- or MV+)) or %(EI- or EZ- or Y- & Ma- & (MVp+ or OF+)) or %(EE- or Y- & (FM- or TO-) & MVp+ or OF+); indoors outdoors underwater.r: MVp- or Pp- or FM- or (Xc+ & Xd- & MVx-); everywhere anywhere: {EL+} & ((Cs+ & (({Xc+ & {Xd-}} & CO+) or ({Xd- & Xc+} & MVs-))) or (MVp- or Pp- or FM- or (Xc+ & Xd- & MVx-))); somewhere someplace: ({EL+} & (MVp- or Pp- or FM- or [({Xc+ & {Xd-}} & CO+)] or (Xc+ & Xd- & MVx-)) & Mp+) or ({EL+} & {Xc+ & {Xd-}} & MVp+ & {Xc+ & {Xd-}} & COp+) or [[{EL+} & {Xc+ & {Xd-}} & CO+]]; nowhere: {EL+} & (MVp- or Pp- or FM- or (Xc+ & Xd- & MVx-)); as_usual to_date on_average in_turn so_far in_particular in_response in_general thus_far in_reply: MVp- or Mp- or ({Xc+ & {Xd-}} & CO+) or (Xc+ & Xd- & (MVx- or MX*x-)); recently: {EE- or EF+} & (({Xd- & Xc+} & MVp-) or Pp- or E+ or ({Xc+ & {Xd-}} & CO+) or EB- or JT- or Ca+ or Qe+ or [[Mp-]]); now.r: ({Xd- & Xc+} & MVp-) or Pp- or E+ or ({Xc+ & {Xd-}} & CO+) or EB- or [[Mp-]]; then.r: ({Xd- & Xc+} & MVp-) or Pp- or E+ or ({Xc+ & {Xd-}} & CO+) or EB- or (S+ & Xd- & Xc+ & MVs-) or [[Mp-]]; later earlier: ({ECa- or Yt-} & (E+ or Mp- or Pp- or MVb- or [({Xc+ & {Xd-}} & CO+)] or (Xd- & Xc+ & (MX*x- or MVx-)) or ({[[@Ec-]]} & {Xc+} & A+) or AJrc- or AJlc+)) or (Yt- & (Ca+ or Qe+)); away: ({Yd-} & (MVp- or Pp- or ({Xc+ & {Xd-}} & CO+))) or K-; aboard: ((MVp- or Mp- or Pp-) & {J+}) or K-; apart: {Yd-} & K-; % wtf ?? what is home.i for ?? home.i: [[K-]]; % Bare-naked MVp-: "I want it back" back.r: ({Yd-} & K-) or (MVp+ & (MVp- or FM-)) or MVp-; forth aside.p: K- or MVa-; % SF*p+: "nearby is another temple" (using p for 'prep') % SFpp+: "nearby are more ruins" nearby: A+ or MVp- or Pp- or FM- or (SF*p+ & ); close_by: (SF*p+ & ); next_to in_back_of in_front_of close_to on_top_of outside_of inside_of atop: or (J+ & ( or FM- or [Wq- & PF+])); ahead_of by_way_of akin_to betwixt vis-a-vis in_lieu_of on_account_of in_place_of in_search_of: or (J+ & ( or [Wq- & PF+])); near.p: {EE- or EF+} & ( or (J+ & ( or FM- or [Wq- & PF+]))); all_over all_around: {J+} & (Pp- or MVp- or [({Xc+ & {Xd-}} & CO+)] or FM- or Mp-); such_as: J+ & (MVa- or Mp- or (Xc+ & Xd- & (MVx- or MX*x-))); % Consider "Here's the ball." We have two choices: SFst+ as a filler-it, % or the more questionable [Wq- & PF+]. Note that (Wd- & PF+) is barred % by the post-processing rules. Maybe PF is reasonable.. but SFst seems % better at the moment. here: J- or or (SFst+ & ); there.r: J- or or ((SFst+ or SFp+ or SFut+) & ) or SFIst- or SFIp- or OXt- or Wi-; % Patronymics and misc french/spanish/german connectives % Many of these are already in the adjectives list à auf aus aux comte comtes dans de de_la del della delle der des du duc la las le.c los nach noch och os ou på por sans te über un une vom von zum zur zu: {G-} & G+; y.and: G- & G+; % TIME AND PLACE EXPRESSIONS this_time this_one_time this_once that_time these_days: or [[E+]]; last_time next_time: or JT- or YS+ or [[]]; day.r week.r month.r year.r weekend.r morning.r afternoon.r evening.r night.r semester.r term.r season.r session.r: ((DTn- or DTi-) & ( or [[E+]])) or (DTi- & (JT- or [[]] or YS+)) or (DTa- & ); the_next the_previous the_following this_past: DTn+; today tonight: or JT- or [[E+]] or YS+ or [[]]; yesterday: {TD+} & ( or JT- or [[E+]] or YS+ or [[]]); tomorrow: {TD+} & ( or JT- or YS+ or [[]]); Monday Tuesday Wednesday Thursday Friday Saturday Sunday.i: ((DTn- or DTie- or [()]) & {G-} & {TD+ or TW+} & (YS+ or or JT- or ON- or [[]])) or [[AN+]]; morning.i afternoon.i night.i evening.i: TD-; January.i February March April.i May.i June.i July August.i September.i October November December: ((DTn- or DTie- or ({TA-} & {TY+})) & (JT- or IN- or [[]] or [] or YS+)) or ((DTn- or DTie-) & ) or (TM+ & {TY+} & ((Xd- & Xc+ & TW-) or ON- or JT- or [[ or MVp- or Mp- or AN+]])) or AN+; AM.ti PM.ti am.ti pm.ti a.m. p.m. o'clock: ND- & {@MX+} & & {TZ+} ; % Time-zone names A.tz ACDT.tz ACST.tz ADT.tz AEDT.tz AEST.tz AKDT.tz AKST.tz AST.tz AWDT.tz AWST.tz B.tz BST.tz C.tz CDT.tz CEDT.tz CEST.tz CET.tz CST.tz CXT.tz D.tz E.tz EDT.tz EEDT.tz EEST.tz EET.tz EST.tz F.tz G.tz GMT.tz H.tz HAA.tz HAC.tz HADT.tz HAE.tz HAP.tz HAR.tz HAST.tz HAT HAY.tz HNA.tz HNC.tz HNE.tz HNP.tz HNR.tz HNT.tz HNY.tz I.tz IST.tz K.tz L.tz M.tz MDT.tz MESZ.tz MEZ.tz MSD MSK.tz MST.tz N.tz NDT.tz NFT.tz NST.tz O.tz P.tz PDT.tz PST.tz Q.tz R.tz S.tz T.tz U.tz UTC.tz V.tz W.tz WDT.tz WEDT WEST.tz WET.tz WST.tz X.tz Y.tz Z.tz: {Xd-} & TZ-; % Abbreviated month names. Jan.x Feb.x Mar.x Apr.x May.x Jun.x Jul.x Aug.x Sep.x Sept.x Oct.x Nov.x Dec.x: {Xi+} & TM+ & {TY+} & ((Xd- & Xc+ & TW-) or ON- or JT- or [[ or MVpn- or Mp- or AN+]]); fall.i spring.i winter.i summer.i: ((DTn- or DTi-) & ) or (DTi- & (JT- or YS+ or [[]])); weeks.i days.i hours.i minutes.i seconds.i months.i years.i decades.i centuries.i semesters.i terms.i nights.i: ((ND- or [[EN-]] or [()]) & (Yt+ or (OT- & {Mp+}))) or (ND- & Ye-) or (TQ- & BT+); week.i day.i hour.i minute.i second.i month.i year.i decade.i century.i semester.i term.i night.u: (NS- & (({NJ-} & {EN-} & (Yt+ or OT-)) or (EN- & J-))) or (NSa- & [[Mp- or Ys-]]) or ({NR- or TT-} & DG- & ((Cs+ & (({Xc+ & {Xd-}} & CO+) or MVp- or (Xd- & Xc+ & MVx-))) or Yt+)); year_and_a_half: NSa- & {EN-} & (Yt+ or OT-); moment.u: (NS- & (({EN-} & (Yt+ or OT-)) or (EN- & J-))) or ({NR- or TT-} & DG- & ((Cs+ & (({Xc+ & {Xd-}} & CO+) or MVp- or (Xd- & Xc+ & MVx-))) or Yt+)); a_while: J- or Yt+ or OT- or MVa-; now.i then.i: JT- or FM-; now_on then_on there_on: FM-; from_now: Yt- & ; a_long_time some_time a_few_moments moments.u: Yt+ or OT-; ago: Yt- & ( or Ca+ or Qe+ or JT-); every.i: {EN-} & Ye+ & ; times.i x.i: (ND- & (({Xc+ & {Xd-}} & CO+) or MVp- or EC+ or EZ+ or Ca+ or Qe+)) or (((({ND-} & DG-) & {Cs+}) or (ND- & Ys+)) & (({Xc+ & {Xd-}} & CO+) or MVp- or (Xd- & Xc+ & MVx-))); time.i: {TT- or NR-} & DG- & {Cs+} & (({Xc+ & {Xd-}} & CO+) or MVp- or (Xd- & Xc+ & MVx-)); the_year: TY+ & ; every_time: {EN-} & (Cs+ & (({Xc+ & {Xd-}} & CO+) or MVp- or (Xd- & Xc+ & MVx-))); week.n moment.n hour.n minute.n year.n instant.n period.n month.n second.n decade.n century.n: {NM+} & (( & ((Ds- & {@M+} & {WN+ or TH+ or [[Ce+]] or (R+ & Bs+)} & {@MXs+} & ( or or )) or Us- or (YS+ & Ds-) or (GN+ & (DD- or [()])))) or AN+); day.n night.n: {NM+} & (( & (({D*u-} & {@M+} & {WN+ or TH+ or [[Ce+]] or (R+ & Bs+)} & {@MXs+} & ( or or )) or Us- or (YS+ & {D*u-}) or (GN+ & (DD- or [()])))) or AN+); days.n weeks.n moments.n hours.n minutes.n years.n instants.n periods.n months.n nights.n seconds.n decades.n centuries.n: {NM+} & (( & (({Dmc-} & {@M+} & {WN+ or TH+ or Ce+ or (R+ & Bp+)} & {@MXp+} & ( or or )) or Up- or (YP+ & {Dmc-}) or (GN+ & (DD- or [()])))) or [[AN+]]); % XXX A major problem here is that the dict entries for miles.n, feet.n % create a mass of parses that are wrong & interfere with the below. : ((ND- or [()] or [[EN-]]) & (Yd+ or Ya+ or EC+ or [[MVp-]] or OD-)) or (ND- & (NIfu+ or NItu- or EQt+ or EQt-)); % AU is abbreviation for "astronomical units" blocks.i feet.i miles.i yards.i inches.i meters.i millimeters.i centimeters.i micrometers.i kilometers.i microns.i Angstroms.i wavelengths.i AU.i au.i astronomical_units light-years.i: ; block.i foot.i mile.i yard.i inch.i meter.i millimeter.i centimeter.i micrometer.i kilometer.i micron.i Angstrom.i wavelength.i astronomical_unit light-year.i: (NS- & {NJ-} & {EN-} & (Yd+ or EC+ or [[MVp-]] or Ya+ or OD-)) or Us-; % make sure that mile.i always has precedence over mile.n % XXX TODO: probably same for the other .i's above... mile.n: or []; a_long_way: Yd+; point.i percentage_point: (NS- or NIe-) & {NJ-} & (Yd+ or OD-); points.u percentage_points: ND- & (Yd+ or MVp-); dollars.i cents.i: NIn- & (EC+ or Yd+ or OD-); 1_dollar one_dollar a_dollar 1_cent one_cent a_cent: {NJ-} & (EC+ or Yd+ or OD-); share.i pound.i ounce.i gallon.i barrel.i head.x: NSa- & Mp-; dollar.i cent.i: ((NIm- or NIn- or NIe-) & AN+) or (NS- & {NJ-} & (EC+ or Yd+ or OD-)); twofold threefold fourfold fivefold sixfold sevenfold eightfold ninefold tenfold a_hundredfold a_thousandfold: {EN-} & (MVp- or Em+ or EC+ or [Pa-] or A+ or (Xd- & (Xc+ or ) & MX-) or NIfn+ or NItn-); % Add cost to Op-, try to use any other linkage before making % a unit be a plain-old object. : ((ND- or NS- or NIe-) & (NIfu+ or NItu-)) or ((ND- or NS- or NIe-) & (AN+ or EQt+ or EQt-)) or ((ND- or NS- or NIe-) & (DD- or EN-) & {Wd-} & ({Mp+} & Sp+ )) or ((ND- or NS- or NIe-) & ([[{DD-} & Op-]] or Jp-) & {Mp+}) or ((ND- or NS- or NIe-) & Xd- & MX- & Xc+) or ((ND- or NS-) & {NJ-} & (EC+ or Y+ or OD- or (Us- & {Mp+}))) or Us-; % Abbreviations of scientific units that follow numbers % km².u mi².u in².u ft².u m².u cm².u /en/words/units.1: ; UNITS: ; % Units abbreviations that can be followed by a period: % ft. tbsp. yds. /en/words/units.1.dot: {Xi+} & ; % Abbreviations that form noun-like things "degrees_Fahrenheit" etc. /en/words/units.3: ND- & ; % Time unit abbreviations: : or ((ND- or NS-) & {NJ-} & OT-); /en/words/units.4: ; /en/words/units.4.dot: {Xi+} & ; % money, similar to units, above. /en/words/currency: ((NIm- or NIn- or NIe-) & AN+) or ((NIm- or NIn- or NIe-) & (Op- or Jp-) & {Mp+}) or ((NIm- or NIn-) & {NJ-} & (EC+ or Yd+ or OD-)) or Us-; /en/words/currency.p: ((NIn- or NIe-) & AN+) or ((NIn- or NIe-) & (Op- or Jp-) & {Mp+}) or ((NIn-) & {NJ-} & (EC+ or Yd+ or OD-)) or Us-; % number-and-unit combinations, such as "50-kDa". The linking requirements % should largely follow those for units except not allowing a numeric % determiner. % TODO: the linking requirements are likely rarely used, and % it might be beneficial to cost them. If this is done, make the same % modification for unit ranges also. % NUMBER-AND-UNIT: % ((({D*u-} or {Dmc-}) & & % ( or Bsm+)) or (({D*u-} or {Dmc-}) & Us- & {Mp+})) or A+; % Above screw up the usual units processing. %QUESTION WORDS & CONJUNCTIONS %who: (R- & (({MVp+ or MVx+} & RS+) or Cr+)) or %({EL+} & (S**w+ or B*w+) & (Ws- or Wq- or QI*d- or BIqd-)) or %({MVp+ or MVx+} & (S**w+ or B*w+) & (Xd- & (Xc+ or ) & MX*r-)); % QI- & (): "I do not know who" who: (R- & (({MVp+ or MVx+} & RS+) or Cr+)) or [QI-] or ({EL+} & (S**w+ or (R+ & B*w+)) & (Ws- or Wq- or QI*d- or BIqd-)) or ({MVp+ or MVx+} & (S**w+ or (R+ & B*w+)) & (Xd- & (Xc+ or ) & MX*r-)); % "what are the answers?" takes Sp+ what: ({EL+} & (D**w+ or Ss*w+ or Sp*w+ or (R+ & (Bsw+ or BW+))) & (Wq- or Ws- or QI*d- or BIqd- or QJ+ or QJ-)) or ((Ss*d+ or (R+ & (Bsd+ or BW+))) & ( or (Ss*t+ & ) or SIs*t-)) or (D+ & JQ-); % QI- & (): "I do not know which" which: ((Jr- or R-) & (({MVp+ or MVx+} & RS+) or Cr+)) or [QI-] or ((D**w+ or ({OF+} & (S**w+ or (R+ & B*w+)))) & (Wq- or Ws- or QI*d- or BIqd-)) or Jw- or (JQ- & D+) or ({MVp+ or MVx+} & (S**w+ or B*w+) & ((Xc+ or ) & Xd- & MX*r-)); whom: (R- & Cr+) or (R+ & B*w+ & (Wq- or QI*d- or BIqd- or ((Xc+ or ) & Xd- & MX*r-))) or (Jr- & (RS+ or Cr+)) or Jw-; whose: (D**w+ & (Mr- or Wq- or Ws- or QI*d- or BIqd- or ((Xc+ or ) & Xd- & MX*d-))) or (JQ- & D+) or (U+ & Jr- & (RS+ or Cr+)); whoever: {EL+} & (((Ss*d+ or Bsd+ or [[CX+]]) & ( or SJr- or (Xc+ & {Xd-} & CO+) or ({Xd- & Xc+} & MVs-))) or [[(O- or J-) & CX+]]); whatever.c: ({EL+} & (((Ss*d+ or Bsd+ or BW+ or D**w+) & ( or (Xc+ & {Xd-} & CO+) or ({Xd- & Xc+} & MVs-))) or [[(O- or J-) & CX+]])) or ((ALx+ & J+) & (({Xd-} & Xc+ & CO+) or ({Xd- & Xc+} & MVs-))); whenever wherever however.c: {EL+} & (Cs+ & (({Xc+ & {Xd-}} & CO+) or ({Xd- & Xc+} & MVs-))); no_matter: QI+ & ((Xc+ & {Xd-} & CO+) or ({Xd- & Xc+} & MVs-)); that.j-c: (Cet+ & ([SFsx+ & ] or TH- or [[MVh-]] or RJ*t+ or RJ*t-)) or (TS- & (SI*j+ or SFI**j+) & I*j+); that.j-d: [{AL-} & D*u+]; that.j-r: (R- & (({MVp+ or MVx+} & RS+) or Cr+)) or EE+ or (EA+ & {HA+}) or DTn+; that.j-p: ({[[M+]]} & ) or ; % (Rnx+ & ): "Because I said so" because: (Cs+ & (({Xc+ & {Xd-}} & CO*s+) or BIh- or ({Xd- & Xc+} & MVs-))) or (OF+ & (({Xc+ & {Xd-}} & CO+) or BIh- or ({Xd- & Xc+} & MVa-))) or (Rnx+ & ); now_that just_as if_only in_case whereby whereupon insofar_as inasmuch_as ere on_the_grounds_that on_grounds_that in_that in_the_event_that in_the_event: Cs+ & (({Xc+ & {Xd-}} & CO*s+) or ({Xd- & Xc+} & MVs-)); on_condition: (TH+ or TS+) & (({Xc+ & {Xd-}} & CO*s+) or ({Xd- & Xc+} & MVs-)); unless though.c even_though: (Cs+ or Mgp+ or Mv+) & (({Xc+ & {Xd-}} & CO*s+) or ({Xd- & Xc+} & MVs-) or (Xd- & Xc+ & E+)); as_if as_though: ((Cs+ or Mgp+ or Mv+ or Mp+) & (({Xc+ & {Xd-}} & CO*s+) or ({Xd- & Xc+} & MVs-) or (Xd- & Xc+ & E+))) or ((BIh- or LI-) & Cs+); as_soon_as: Cs+ & {Xc+ & {Xd-}} & CO*s+; until 'til ’til ‘til ``til til: ((Mgp+ or J+ or JT+ or UN+) & (({Xc+ & {Xd-}} & CO+) or ({Xd- & Xc+} & MVp-) or [Mp-])) or (Cs+ & (({Xc+ & {Xd-}} & CO*s+) or ({Xd- & Xc+} & MVs-))); since: ((Mgp+ or J+ or JT+ or UN+) & (({Xc+ & {Xd-}} & CO+) or ({Xd- & Xc+} & MVp-) or [Mp-])) or (Cs+ & (({Xc+ & {Xd-}} & CO*s+) or ({Xd- & Xc+} & MVs-))) or [[MVa-]] or [[E+]]; ever_since: (J+ or Mgp+ or Cs+) & (({Xc+ & {Xd-}} & CO*s+) or ({Xd- & Xc+} & MVs-)); after: {EI- or Yt-} & (((Mgp+ or J+ or JT+) & ( or UN- or Ca+ or Qe+)) or (Cs+ & (({Xc+ & {Xd-}} & CO*s+) or ({Xd- & Xc+} & MVs-)))); before: ({EI- or Yt-} & (({Mgp+ or J+ or JT+} & ( or UN-)) or (Cs+ & (({Xc+ & {Xd-}} & CO*s+) or ({Xd- & Xc+} & MVs-))))) or (Yt- & (Ca+ or Qe+)); if: (Cs+ & {Xc+ & {Xd-}} & (Wd- & (Qd+ or Ws+ or Wq+))) or ((Cs+ or [Mgp+] or [Mv+]) & (({Xd- & Xc+} & MVs-) or ({Xc+ & {Xd-}} & CO*s+))) or (QI- & Cs+); if_possible if_necessary: MVp- or (Xd- & Xc+ & (MVx- or E+)) or ({Xc+ & {Xd-}} & CO+); if_so: ({Xc+ & {Xd-}} & CO+); if_only: ((MVp+ or MVa+ or MVs+) & ({Xd- & Xc+} & MVp-)) or (Wd+ & Wc-); no_wonder: Wd+ & Wc-; while: ((Cs+ or Mgp+ or Mp+) & (({Xc+ & {Xd-}} & CO*s+) or ({Xd- & Xc+} & MVs-) or (Xd- & Xc+ & E+))); : RJlv+ or RJrv-; % once as adverb once.e: ({Cs+ or Mp+} & (({Xc+ & {Xd-}} & CO*s+) or ({Xd- & Xc+} & MVs-) or (Xd- & Xc+ & E+))) or or E+ or EB-; % -------------------------------------------------------------------------- % Conjunctions % Should these be treated as clause-openers (taking CO link)? % e.g. "Also on this list is the Colossus of Rhodes." % Currently, they take Wc- as they are "coordinating conjuctions" % that are tied to previous sentences (i.e. to the left-wall). % Another possibility: (Rnx+ & ) "Because I say so" but.ij and.ij or.ij not.ij also.ij but_not and_not: [[(({Xd-} & CC-) or Wc-) & {Xc+} & (Wdc+ or Qd+ or Ws+ or Wq+)]]; and/or: [(({Xd-} & CC-) or Wc-) & (Wdc+ or Qd+ or Ws+ or Wq+)]; % and used as a conjunction in proper names: % The Great Southern and Western Railroad % Hmm, Maybe should use MG- & JG+ here, to be consistent with "of", "for": % "The Society of Engineers", "The League for Abstinence" and.j-g: [[G- & G+]]; % Conjoined adjectival modifiers. % The black and white cat sleeps % She ran hot and cold. % The EB+ link handles "not", "yet" after the "and" -- "blah and not blah" % See also for similar structures. % The {Xd-} allows "blah blah, and blah" % MVa is given a cost, so that Pa is used, if possible. % (In general, we want to never use MVa if Pa is possible... ) % AJla- & AJr*+ allows "he is clever and funnier than Mike." % % AJ*a: ordinary adjectives % AJ*c: comparative adjectives % AJ*s: superlative adjectives % and.j-a but.j-a yet.j-a: ({Xd-} & AJla- & {EB+} & AJr+) & (A+ or Pa- or [MVa-] or AJra-); or.j-a: ({Xd-} & AJla- & AJra+) & (A+ or Pa- or [MVa-] or AJra-); % The SJn, Dn links are propagated through the linkage, guaranteeing that % "neither" will be used together with "nor". nor.j-a: AJn- & AJ+ & (A+ or Pa- or [MVa-]); % compartives: % he is bigger, and badder, than the pope. % If one comma is there, then the other must be also. and.j-c or.j-c but.j-c yet.j-c: ((AJlc- & AJrc+) or (Xd- & AJlc- & AJrc+ & Xc+)) & (((Pam- or Mam- or AFm+) & {@MV+}) or ({[ECa-]} & MVb-) or Am+); and.j-s: (AJls- & AJrs+ & La-) or (AJld- & AJrd+ & (D+ or DD+)); % conjoined post-nominal modifiers % [Ma-]: it is more grammatically correct to have commas ... but.j-m and.j-m or.j-m: (({Xd-} & MJla- & MJra+) & ([Ma-] or (Xd- & Xc+ & MX*a-))) or (({Xd-} & MJlp- & MJrp+) & (Mp- or MVp- or (Xc+ & CO+))) or (({Xd-} & MJlj- & MJrj+ & {Xc+}) & J+ & ([Mp-] or Pp- or MVp-)); % Conjoined question words. % When and where is the party? % How and why did you do that? and.j-q: (QJ- & QJ+) & ((Wq- & (Q+ or PF+)) or QI-); % conjoined adverbs/prepositional phrases % RJ*v: adverbs % RJ*t: that "He said that ... and that ..." % RJ*c: subordinate clauses: "Although he said ... and he did ..., ..." % RJ*j: prep-object-relative (Mj): "the man for whom and with whom ..." % RJ*r: "those" relative clauses: "...: those who do and those who don''t" and.j-r or.j-r: ((RJlv- & RJrv+) & MVr-) or ((RJlt- & RJrt+) & TH-) or ((RJlc- & RJrc+) & Cs-) or ((RJlj- & RJrj+) & Mj- & Cs+) or (({Xd-} & RJlr- & RJrr+) & J-); % Conjoined nouns/noun phrases. % "The cost and reliability were questioned" (Spx+) % "He wrote for piano and flute." (Ju-) % "Where is the sickle and hammer?" (SIs-) % Op- has a cost, so that "they verbed X and verbed Y" gets the VJ link % at zero cost, and the SJ link at higher cost (since a "verbed Y" can be % understood as a modified noun). Acutally, should probably have some % post-processing rule to disallow this XXX to do fix above. Example of % bad SJ usage: "He bangs drums and played piano" i.e "he bangs a played piano" % % : ({Xd-} & SJl- & SJr+) & etc. % would allow "X , and Y" constructions, but these have tricky rules... % % noun-conj-dep-s & SI-: Are a dog and a cat here? % % XXX There should be a noun-sub-u but this requires a lot of work ... : ({Xd-} & SJls- & SJrs+ & {[[Xc+]]}); : ({Xd-} & SJlp- & SJr+ & {[[Xc+]]}) or ({Xd-} & SJls- & SJrp+ & {[[Xc+]]}); : ({Xd-} & SJlu- & SJr+ & {[[Xc+]]}) or ({Xd-} & SJlp- & SJru+ & {[[Xc+]]}) or ({Xd-} & SJls- & SJru+ & {[[Xc+]]}); % Give AN+ a cost, because in general, we don't want to conjoind nouns, % and then use the resulting phrase to modify another noun ... : Ju- or SJl+ or [[AN+]]; and.j-n but_not: ( & & ( or (Spx+ & ) or SIp- or [Os-] or )) or ( & & ( or (Spx+ & ) or SIp- or [Op-] or )) or ( & & ( or (Sux+ & ) or SIu- or [Ou-] or )); or.j-n: ( & & ( or (S*x+ & ) or SI- or [Os-] or )) or ( & & ( or (Spx+ & ) or SIp- or [Op-] or )); % The SJn, Dn links are propagated through the linkage, guaranteeing that % "neither" will be used together with "nor". nor.j-n: SJn- & SJ+ & ((Wd- & S*x+) or SI- or Os- or SJn+); % The Dn- link is used for both nouns, as above, and on neither..nor for verbs % e.g. "We neither ate nor drank" neither.j: Dn+; % Force use of commas: "Mary, but not Louise, is coming to the party" % Not John, but Mary led the way. but.j-n: ((Xd- & SJl- & EBx+ & SJr+ & Xc+) & (Wd- & Ssx+)) or ((Xd- & SJl- & EBy- & SJr+) & (Wd- & Ssx+)) or ((SJl- & EBy- & SJr+) & Ou-); % -------------------------------------------------------------------------- % Conjoined verbs/verb phrases % "Oscar Peterson played piano and wrote music." % Pass through singular/plural agreement of subject. % The weirdo (B- & {B+}) allows the following to parse: % "This is a problem Moscow created and failed to solve." : (({Xd-} & VJlsi- & VJrsi+) & (({@MV+} & Ss-) or (I- & {@MV+}) or ({Xd-} & VJrsi-))) or (({Xd-} & VJlpi- & VJrpi+) & (({@MV+} & Sp-) or (I- & {@MV+}) or ({Xd-} & VJrpi-))) or (({Xd-} & VJlst- & VJrst+) & ((({@MV+} & Ss-) or (I- & {@MV+})) & (O+ or (B- & {B+})))) or (({Xd-} & VJlpt- & VJrpt+) & ((({@MV+} & Sp-) or (I- & {@MV+})) & (O+ or (B- & {B+})))) or (({Xd-} & VJlh- & VJrh+) & (PP- & {@MV+})) or ((VJlg- & VJrg+) & (J-)); and.j-v or.j-v: ; % ditransitive conjunction: "I gave Bob a doll and Mary a gun" : {Xd-} & VJd- & O+ & O*n+; and.j-o or.j-o: ; % The VJn- gaurentees that nor.j-v is used with neither.j-v nor.j-v: (VJn*i- & VJr*i+ & ({@MV+} & S-)) or (VJn*t- & VJr*t+ & ({@MV+} & S- & O+)); % Similar to and, but allows optional comma before "but" % "blah blah, but blah" but.j-v: ((({Xd-} & VJls-) & VJrs+) & (Ss- or ({Xd-} & VJrs-))) or ((({Xd-} & VJlp-) & VJrp+) & (Sp- or ({Xd-} & VJrp-))) or ((VJl- & VJr+) & (I-)); % The VJb- guarentees that bit.j-b is used with not_only % "We not only X'ed but also Y'ed". % This is the same pattern as the neither..nor... pattern above. but.j-b: (VJb*i- & VJr*i+ & ({@MV+} & S-)); not_only: Db+; % XJ: collocations with holes, i.e. "... blah blah X um um Y" % where "blah blah" is always used with "um um". % XJ*i: with infinitives % ... not only X, but Y % "you should not only ask for your money back, but demand it" not_only: I- & I+ & XJi+; but.j-r: {Xd-} & XJi- & I+; % XXX to-do: should have special linkage for either... or .... % instead of dependeingg on the E+ link. See neither..nor... for examples. either.r: Ds+ or E+ or ({OF+} & ) or ({Xd+ & Xc-} & MVa-); neither.r: Ds+ or E+ or ({OF+} & ); nor.r: ((Xd- & CC-) or Wd-) & Qd+; for.r: [[(({Xd-} & CC-) or Wc-) & (Wd+ or Qd+ or Ws+ or Wq+)]]; yet.r: ((({Xd-} & CC-) or Wc-) & Wd+) or E+ or MVa- or ({Xd-} & Xc+ & CO+); thus therefore: ({Xc+ & {Xd-}} & CO+) or ({Xd-} & CC- & Wd+) or ({Xd- & Xc+} & (E+ or EB-)) or (Xd- & Xc+ & MVa-); % QI- & (): "I do not know when" when: ((WN- or BIh-) & Cs+) or ((PF+ or TOn+ or Cs+) & (BIq- or QI- or (SFsx+ & ))) or [QI-] or QJ- or QJ+ or (Wq- & (Q+ or PF+)) or ((Cs+ or Mp+ or Mgp+ or Mv+) & (({Xd- & Xc+} & MVs-) or ({Xc+ & {Xd-}} & CO*s+) or (Xd- & Xc+ & E+))); % QI- & (): "I do not know why" why: ({EL+} & ((Wq- & Q+) or (QI- & (Cs+ or TOn+ or [()])) or (Cs+ & ((SFsx+ & ) or WY- or BIq- or QJ+ or QJ-)))) or QJ- or QJ+ or [[{@CO-} & Wc- & Wi+]]; why_not: [[{@CO-} & Wc- & Wi+]]; % QI- & (): "I do not know where" % R+ & Bsw+: "Where does it go to?" where: {EL+} & ( (Wq- & ((Rw+ & WR+) or (R+ & Bsw+) or ({Rw+} & PF+) or Q+)) or [QI-] or QJ- or QJ+ or ((WR+ or Cs+ or TOn+ or PF+) & (BIq- or QI- or (SFsx+ & ))) or ((Cs+ or PF+ or WR+) & )); whether: (((QI- or BIq-) & (Cs+ or TOn+)) or (Cs+ & SFsx+ & )) or [[(Cs+ or MV+) & (({Xd- & Xc+} & MVs-) or ({Xc+ & {Xd-}} & CO*s+))]]; whether_or_not: ((QI- or BIq-) & (Cs+ or TOn+)) or (Cs+ & (({Xd- & Xc+} & MVs-) or ({Xc+ & {Xd-}} & CO*s+))); % QI- & (): "I do not know how" how: ((((EAh+ or EEh+) & {HA+}) or H+ or AFh+) & (BIqd- or QI*d- or Wq- or Ws-)) or (Wq- & (Q+ or AF+)) or [QI-] or QJ- or QJ+ or ((Cs+ or TOn+) & (QI- or BIq- or (SFsx+ & ))); % EBy+ link is for "verbed not X but Y" not.e: EB- or ({@E-} & N-) or NT+ or EBy+ or [[((Ma+ or Mg+ or Mv+ or Mp+) & CO+) or (Mg- & Mgn+) or (Mv- & Mvn+) or (Mp- & Mp+) or (Ma- & Ma*n+)]]; % We include this, though it's not one of the strippable strings n't n’t: N- or EB-; %ADJECTIVES % Common disjuncts shared by virtually all adjectives. % Dn- & AJn+: for neither...nor constructions. : [[{@E-} & Wq- & {@MV+} & PF+ & {@MV+} & {CC+}]] or (AJra- & {@MV+}) or ({@MV+} & AJla+) or (Dn- & AJn+) or ({@E-} & {@MV+} & ([[]] or (Xd- & Xc+ & MX*a-))); % Ordinary adjectives % abject.a abnormal.a abominable.a abortive.a abrasive.a abrupt.a % "the rich and powerful": [[{DD-} & ]] : {EA- or EF+} & (({[[@Ec-]]} & {Xc+} & A+) or ((Pa- or AF+ or Ma- or MJra-) & {@MV+}) or ({@MV+} & MJla+) or AA+ or [[DD- & ]] or [[{DD-} & ]] or ); /en/words/words.adj.1: or ; HYPHENATED-WORDS.a: ({EA- or EF+} & (({[[@Ec-]]} & {Xc+} & Ah+) or (Pa- & {@MV+}))) or [[AN+]]; % "We caught a through flight", "its a done job" - adjective -- !? probably over-broad. : {EA- or EF+} & (({[[@Ec-]]} & {Xc+} & A+) or ((AF+ or Ma- or MJra-) & {@MV+}) or ({@MV+} & MJla+) or AA+ or [[DD- & ]] or [[{DD-} & ]]); done.c gone.c through.c: ; responsible.a accountable.a: {EA- or EF+} & (({[[@Ec-]]} & {Xc+} & A+) or ((Pa- or AF+ or Ma- or Vh- or MJra-) & {@MV+}) or ({@MV+} & MJla+) or AA+ or [[DD- & ]] or [[{DD-} & ]] or ); long.a: or ((Ya- or Yt-) & (Pa- or Ma- or MJra- or MJla+)) or (H- & (BT+ or Yt+)); % Hmm does distant really belong here? % "The river is a mile wide here": Ya- & Pa- & MVp+ wide.a tall.a deep.a distant.a: or (Ya- & (Pa- or Ma- or MJra- or ) & {@MV+}) or (Ya- & {@MV+} & MJla+); old.a: or (Ytm- & (Pa- or Ma- or or MJra- or MJla+)); % ??? adj-op already has MX*a- in it, why do we need a bar MX- here ? aged.i: NM+ & (Pa- or Max- or or (Xd- & MX- & Xc+) or MJra- or MJla+); % The following all have a very regular pattern, with just one variable % part, the TO TH type section. This regularity should be exploted so % simplify the expressions ... easy.a hard.a simple.a difficult.a fun.a expensive.a: {EA- or EF+} & (({[[@Ec-]]} & {Xc+} & A+) or ((Paf- or AF+ or Ma- or MJra-) & {@MV+} & {((TOt+ & B+) or TOi+) & {LE+}}) or ({@MV+} & {((TOt+ & B+) or TOi+) & {LE+}} & MJla+) or AA+ or [[DD- & ]] or [[{DD-} & ]] or ({TOt+ & B+} & )); ready.a: {EA- or EF+} & (({[[@Ec-]]} & {Xc+} & A+) or ((Pa- or AF+ or Ma- or MJra-) & {@MV+} & {((TOt+ & B+) or TO+) & {LE+}}) or ({@MV+} & {((TOt+ & B+) or TO+) & {LE+}} & MJla+) or AA+ or [[DD- & ]] or [[{DD-} & ]] or ({TO+ or (TOt+ & B+)} & )); silly.a nasty.a pleasant.a unpleasant.a dangerous.a cruel.a standard.a safe.a legal.a illegal.a: {EA- or EF+} & (({[[@Ec-]]} & {Xc+} & A+) or ((Paf- or AF+ or Ma- or MJra-) & {@MV+} & {((TOt+ & B+) or TOi+) & {LE+}}) or ({@MV+} & {((TOt+ & B+) or TOi+) & {LE+}} & MJla+) or AA+ or [[DD- & ]] or [[{DD-} & ]] or ({TOt+ & B+} & )); : {EA- or EF+} & (({[[@Ec-]]} & {Xc+} & A+) or ((Paf- or AF+ or Ma- or MJra-) & {@MV+} & {((TOt+ & B+) or THi+ or TOi+) & {LE+}}) or ({@MV+} & {((TOt+ & B+) or THi+ or TOi+) & {LE+}} & MJla+) or AA+ or [[DD- & ]] or [[{DD-} & ]] or ({TOt+ & B+} & )); good.a bad.a unusual.a useful.a a_bitch nice.a strange.a wonderful.a terrible.a possible.a impossible.a annoying.a fair.a unfair.a tough.a: ; great.a: or ; important.a essential.a crucial.a necessary.a imperative.a vital.a: or ({EA- or EF+} & (({[[@Ec-]]} & {Xc+} & A+) or ((Paf- or AF+ or Ma- or MJra-) & (({@MV+} & {(THi+ or TOi+ or TSi+) & {LE+}}) or (TOt+ & B+))) or ((({@MV+} & {(THi+ or TOi+ or TSi+) & {LE+}}) or (TOt+ & B+)) & MJla+) or AA+ or [[DD- & ]] or [[{DD-} & ]] or ({TOt+ & B+} & ))); common.a practical.a original.a normal.a helpful.a striking.a confusing.a frustrating.a disturbing.a logical.a illogical.a elegant.a efficient.a awful.a just.a unjust.a absurd.a natural.a alarming.a acceptable.a unacceptable.a deplorable.a detestable.a scary.a shocking.a poetical.a: or ({EA- or EF+} & (({[[@Ec-]]} & {Xc+} & A+) or ((Paf- or AF+ or Ma- or MJra-) & {@MV+} & {(THi+ or TOi+) & {LE+}}) or ({@MV+} & {(THi+ or TOi+) & {LE+}} & MJla+) or AA+ or [[DD- & ]] or [[{DD-} & ]] or )); surprising.a interesting.a odd.a remarkable.a amazing.a exciting.a depressing.a rare.a embarrassing.a: {EA- or EF+} & (({[[@Ec-]]} & {Xc+} & A+) or ((Paf- or AF+ or Ma- or MJra-) & {@MV+} & {(THi+ or Ci+ or TOi+) & {LE+}}) or ({@MV+} & {(THi+ or Ci+ or TOi+) & {LE+}} & MJla+) or AA+ or [[DD- & ]] or [[{DD-} & ]] or ); crazy.a sane.a insane.a stupid.a ridiculous.a wrong.a curious.a: {EA- or EF+} & (({[[@Ec-]]} & {Xc+} & A+) or ((Paf- or AF+ or Ma- or MJra-) & {@MV+} & {(TO+ or TOi+ or THi+) & {LE+}}) or ({@MV+} & {(TO+ or TOi+ or THi+) & {LE+}} & MJla+) or AA+ or [[DD- & ]] or [[{DD-} & ]] or ({TO+} & )); wise.a unwise.a smart.a intelligent.a: {EA- or EF+} & (({[[@Ec-]]} & {Xc+} & A+) or ((Paf- or AF+ or Ma- or MJra-) & {@MV+} & {(TO+ or TOi+) & {LE+}}) or ({@MV+} & {(TO+ or TOi+) & {LE+}} & MJla+) or AA+ or [[DD- & ]] or [[{DD-} & ]] or ({TO+} & )); unlikely.a: {EA- or EF+} & (({[[@Ec-]]} & {Xc+} & A+) or ((Paf- or AF+ or Ma- or MJra-) & {@MV+} & {(TOf+ or THi+ or Ci+) & {LE+}}) or ({@MV+} & {(TOf+ or THi+ or Ci+) & {LE+}} & MJla+) or AA+ or [[DD- & ]] or [[{DD-} & ]] or ({TO+} & )); likely.a: {EA- or EF+} & (({[[@Ec-]]} & {Xc+} & A+) or ((Paf- or AF+ or Ma- or MJra-) & {@MV+} & {(TOf+ or THi+ or Ci+) & {LE+}}) or ({@MV+} & {(TOf+ or THi+ or Ci+) & {LE+}} & MJla+) or AA+ or [[DD- & ]] or [[{DD-} & ]] or ({TO+} & ) or [E+]); apparent.a false.a official.a strict.a significant.a funny.a notable.a untrue.a tragic.a plain.a urgent.a a_drag a_bummer definite.a evident.a impressive.a incredible.a inevitable.a mysterious.a pathetic.a probable.a admirable.a commendable.a conceivable.a insignificant.a miraculous.a self-evident.a undeniable.a plausible.a understandable.a demonstrable.a hilarious.a improbable.a inexcusable.a outrageous.a paradoxical.a shameful.a inconceivable.a unbelievable.a astonishing.a disgraceful.a debatable.a arguable.a lamentable.a regrettable.a well-known.a: {EA- or EF+} & (({[[@Ec-]]} & {Xc+} & A+) or ((Paf- or AF+ or Ma- or MJra-) & {@MV+} & {(THi+ or Ci+) & {LE+}}) or ({@MV+} & {(THi+ or Ci+) & {LE+}} & MJla+) or AA+ or [[DD- & ]] or [[{DD-} & ]] or ); clear.a unclear.a relevant.a irrelevant.a obvious.a immaterial.a: {EA- or EF+} & (({[[@Ec-]]} & {Xc+} & A+) or ((Paf- or AF+ or Ma- or MJra-) & {@MV+} & {(THi+ or QIi+) & {LE+}}) or ({@MV+} & {(THi+ or QIi+) & {LE+}} & MJla+) or AA+ or [[DD- & ]] or [[{DD-} & ]] or ); clear.i: {EA- or EF+} & Vm- & TH+; sure.i certain.i: {EA- or EF+} & Vm- & (TH+ or TO+ or (OF+ & {@MV+})); tactful.a conventional.a advisable.a prudent.a sensible.a tactless.a polite.a impolite.a arrogant.a conceited.a obnoxious.a valuable.a reasonable.a unreasonable.a traditional.a unnecessary.a tempting.a usual.a inadvisable.a lovely.a a_mistake ethical.a unethical.a immoral.a childish.a awkward.a appropriate.a costly.a customary.a desirable.a dumb.a effective.a fashionable.a foolish.a healthy.a hip.a okay.a OK.a ok.a painful.a selfish.a sufficient.a advantageous.a boring.a inappropriate.a insufficient.a irrational.a irresponsible.a mandatory.a meaningless.a preferable.a senseless.a trivial.a wrongheaded.a premature.a risky.a dishonest.a hypocritical.a enjoyable.a idiotic.a inconvenient.a unkind.a pointless.a: {EA- or EF+} & (({[[@Ec-]]} & {Xc+} & A+) or ((Paf- or AF+ or Ma- or MJra-) & {@MV+} & {TOi+ & {LE+}}) or ({@MV+} & {TOi+ & {LE+}} & MJla+) or AA+ or [[DD- & ]] or [[{DD-} & ]] or ); unknown.a questionable.a: {EA- or EF+} & (({[[@Ec-]]} & {Xc+} & A+) or ((Paf- or AF+ or Ma- or MJra-) & {@MV+} & {QIi+}) or ({@MV+} & {QIi+} & MJla+) or AA+ or [[DD- & ]] or [[{DD-} & ]] or ); certain.a: {EA- or EF+} & (({[[@Ec-]]} & {Xc+} & A+) or ((Paf- or AF+ or Ma- or MJra-) & {@MV+} & {(Ce+ or TOf+ or TH+ or QI+ or (OF+ & {@MV+})) & {LE+}}) or ({@MV+} & {(Ce+ or TOf+ or TH+ or QI+ or (OF+ & {@MV+})) & {LE+}} & MJla+) or AA+ or [[DD- & ]] or [[{DD-} & ]] or ({Ce+ or TO+ or TH+ or QI+ or OF+} & )); sure.a unsure.a uncertain.a careful.a: {EA- or EF+} & (({[[@Ec-]]} & {Xc+} & A+) or ((Pa- or AF+ or Ma- or MJra-) & {@MV+} & {(Ce+ or TO+ or TH+ or QI+ or (OF+ & {@MV+})) & {LE+}}) or ({@MV+} & {(Ce+ or TO+ or TH+ or QI+ or (OF+ & {@MV+})) & {LE+}} & MJla+) or AA+ or [[DD- & ]] or [[{DD-} & ]] or ({Ce+ or TO+ or TH+ or QI+ or OF+} & )); % common adjectives, taking "to", "that" e.g. "was incorrect that" correct.a incorrect.a right.a excited.a disappointed.a upset.a sorry.a content.a determined.a amused.a amazed.a astonished.a astounded.a pleased.a disgusted.a distressed.a dismayed.a irritated.a embarrassed.a alarmed.a: {EA- or EF+} & (({[[@Ec-]]} & {Xc+} & A+) or ((Pa- or AF+ or Ma- or MJra-) & {@MV+} & {(TO+ or TH+) & {LE+}}) or ({@MV+} & {(TO+ or TH+) & {LE+}} & MJla+) or AA+ or [[DD- & ]] or [[{DD-} & ]] or ({TO+ or TH+} & )); glad.a fortunate.a unfortunate.a lucky.a unlucky.a happy.a sad.a surprised.a delighted.a overjoyed.a: {EA- or EF+} & (({[[@Ec-]]} & {Xc+} & A+) or ((Pa- or AF+ or Ma- or MJra-) & {@MV+} & {(Ce+ or TO+ or TH+) & {LE+}}) or ({@MV+} & {(Ce+ or TO+ or TH+) & {LE+}} & MJla+) or AA+ or [[DD- & ]] or [[{DD-} & ]] or ({Ce+ or TO+ or TH+} & )); % common adjectives, taking "to", "of", "that" e.g. "proud that" proud.a scared.a: {EA- or EF+} & (({[[@Ec-]]} & {Xc+} & A+) or ((Pa- or AF+ or Ma- or MJra-) & {@MV+} & {(TO+ or TH+ or (OF+ & {@MV+})) & {LE+}}) or ({@MV+} & {(TO+ or TH+ or (OF+ & {@MV+})) & {LE+}} & MJla+) or AA+ or [[DD- & ]] or [[{DD-} & ]] or ({TO+ or TH+ or OF+} & )); % common adjectives, taking "of" e.g. "tired of", "sick of" etc. tired.a pooped.a full.a sick.a critical.a guilty.a innocent.a typical.a capable.a contemptuous.a incapable.a reminiscent.a scornful.a mindful.a short.a appreciative.a complimentary.a born.a worthy.a free.a terrified.a unworthy.a prognostic.a dead.a: {EA- or EF+} & (({[[@Ec-]]} & {Xc+} & A+) or ((Pa- or AF+ or Ma- or MJra-) & {@MV+} & {OF+ & {@MV+}}) or ({@MV+} & {OF+ & {@MV+}} & MJla+) or AA+ or [[DD- & ]] or [[{DD-} & ]] or ({OF+ & {@MV+}} & )); fond.a: {EA- or EF+} & (({[[@Ec-]]} & {Xc+} & A+) or ((Pa- or AF+ or Ma- or MJra-) & OF+ & {@MV+}) or (OF+ & {@MV+} & MJla+) or (OF+ & )); afraid.a ashamed.a unafraid.a unashamed.a: {EA- or EF+} & (((Pa- or AF+ or Ma- or MJra-) & {@MV+} & {((OF+ & {@MV+}) or Ce+ or TH+ or TO+) & {LE+}}) or ({@MV+} & {((OF+ & {@MV+}) or Ce+ or TH+ or TO+) & {LE+}} & MJla+) or ({OF+ or Ce+ or TH+ or TO+} & )); apprehensive.a secure.a optimistic.a pessimistic.a annoyed.a confused.a offended.a insulted.a concerned.a depressed.a doubtful.a grateful.a mad.a mistaken.a hopeful.a unhappy.a: {EA- or EF+} & (({[[@Ec-]]} & {Xc+} & A+) or ((Pa- or AF+ or Ma- or MJra-) & {@MV+} & {TH+ & {LE+}}) or ({@MV+} & {TH+ & {LE+}} & MJla+) or AA+ or [[DD- & ]] or [[{DD-} & ]] or ({TH+} & )); aware.a unaware.a: {EA- or EF+} & (((Pa- or AF+ or Ma- or MJra-) & {@MV+} & {(TH+ or (OF+ & {@MV+})) & {LE+}}) or ({@MV+} & {(TH+ or (OF+ & {@MV+})) & {LE+}} & MJla+) or AA+ or [[DD- & ]] or [[{DD-} & ]] or ({TH+ or OF+} & )); true.a conscious.a confident.a skeptical.a jealous.a suspicious.a envious.a desirous.a convinced.a unconvinced.a: {EA- or EF+} & (({[[@Ec-]]} & {Xc+} & A+) or ((Pa- or AF+ or Ma- or MJra-) & {@MV+} & {(TH+ or (OF+ & {@MV+})) & {LE+}}) or ({@MV+} & {(TH+ or (OF+ & {@MV+})) & {LE+}} & MJla+) or AA+ or [[DD- & ]] or [[{DD-} & ]] or ({TH+ or OF+} & )); eager.a reluctant.a able.a unable.a impatient.a eligible.a brave.a anxious.a apt.a desperate keen.a prepared.a willing.a hesitant.a: {EA- or EF+} & (({[[@Ec-]]} & {Xc+} & A+) or ((Pa- or AF+ or Ma- or MJra-) & {@MV+} & {TO+ & {LE+}}) or ({@MV+} & {TO+ & {LE+}} & MJla+) or AA+ or [[DD- & ]] or [[{DD-} & ]] or ({TO+} & )); former.a: A+ or G+ or (DG- & ); latter.a: DG- & ; overall.a onetime.a outboard.a pinstripe.a goddam.a de_facto de_jure erstwhile.a foster.a outright.a online.a: A+; pro_forma ad_hoc bona_fide: A+ or Pa-; a_priori a_posteriori: A+ or MVa- or ({Xc+ & {Xd-}} & CO+); asleep.a awake.a alike.a alive.a ablaze.a adrift.a afire.a aflame.a afloat.a afoot.a aghast.a aglow.a agog.a ajar.a amiss.a askew.a astir.a awash.a awry.a de_rigeur rife.a fraught.a lacking.a: ((Ma- or Pa- or MJra-) & {@MV+}) or ({@MV+} & MJla+) or ; alone.a: ((Ma- or Pa- or MJra-) & {@MV+}) or ({@MV+} & MJla+) or or MVp- or E+; outstanding.a available.a: {EA- or EF+} & (({[[@Ec-]]} & {Xc+} & A+) or ((Pa- or AF+ or Max- or MJra-) & {@MV+}) or ({@MV+} & MJla+) or AA+ or [[DD- & ]] or [[{DD-} & ]] or ); due.i effective.i: (TY+ or JT+) & ; north.a south.a east.a west.a northeast.a northwest.a southeast.a southwest.a: or A+ or ({Yd-} & {OF+} & (Pp- or MVp- or Mp- or (Xc+ & Xd- & (MVx- or MX*x-)))) or [[DD- & ]]; northern.a southern.a eastern.a western.a northeastern.a northwestern.a southeastern.a southwestern.a: or A+ or G+; % ------------------------------------------------------------------------- %COMPARATIVES AND SUPERLATIVES more: ({ECa-} & (EAm+ or EEm+ or [MVm-] or [EB*m-] or Qe+ or Ca+ or AJrc- or AJlc+)) or ({OF+} & (({ECn-} & (Dmum+ or (Ss+ & ) or Bsm+)) or ({ECx- or ND-} & (Dmcm+ or (Sp+ & ) or Bpm+)) or ({ECn- or ECx- or ND-} & (Om- or Jm- or (Xd- & MVt+ & Xc+ & MX*m-))))) or (DG- & (({MVa+} & Cs+) or B+ or Dm*w+ or EA+) & (ER- or (Wd- & Xc+ & ER+))); more_of_a more_of_an: Ds*m+; less: ({ECn-} & (Dmum+ or Om- or Jm- or (Ss+ & ) or Bsm+)) or ({ECa-} & (EAm+ or EEm+ or [MVm-] or [EB*m-] or AJrc- or AJlc+)) or (DG- & (({MVa+} & Cs+) or B+ or Dm*w+ or EA+) & (ER- or (Wd- & Xc+ & ER+))); fewer: ({ECn-} & (Dmcm+ or Om- or Jm- or (Sp+ & ) or AJrc- or AJlc+)) or (DG- & Dm*w+ & (ER- or (Wd- & Xc+ & ER+))); farther: ({ECa-} & {K+} & (MVb- or Qe+ or Ca+ or AJrc- or AJlc+)) or A+; further.r: ({ECa-} & {K+} & (MVb- or Qe+ or Ca+ or AJrc- or AJlc+)) or A+ or E+ or ({Xd-} & Xc+ & CO+); % links to adverbs on left.. % Hmm, probably want to give EAy a cost, to avoid its use in % "William is described as smooth, yet thoughtful" as.e-y: {EZ-} & ((EAy+ & {HA+}) or EEy+ or AM+); % uses comparative links as.e-c: (MVz- & (((O*c+ or S**c+ or ({SFsic+} & Zc+)) & {Mp+}) or Mpc+ or Cc+)) or (MVzo- & Ct+ & Bc+ & {U+}) or (MVzp- & (CX+ or CQ+)) or (MVza- & Cta+ & ((AFd+ & {Pa+}) or PFc+)); % prepositional, mostly as.e: ((J+ or Mp+ or TI+ or ({SFsic+} & Zs+)) & (({Xc+ & {Xd-}} & CO+) or ({Xd- & Xc+} & MVp-))) or (Cs+ & (({Xc+ & {Xd-}} & CO+) or ({Xd- & Xc+} & MVs-))) or ((J+ or Mp+ or BIt+) & ([Mp-] or (Xd- & Xc+ & MX*x-))) or (AZ- & Pa+) or [[(PFc+ or CQ+) & ({Xd- & Xc+} & MVs-)]]; as_possible: MVz-; as_expected as_reported as_imagined as_suspected as_anticipated as_predicted as_realized as_proposed as_intended as_supposed as_hypothesized as_hypothesised as_discussed as_established as_compared as_determined as_measured as_assessed as_demonstrated as_evidenced as_indicated as_revealed as_judged as_detected as_opposed as_observed as_defined as_reflected as_evaluated as_suggested as_monitored as_described as_confirmed as_assayed as_estimated as_analyzed as_identified as_deduced as_documented as_related as_studied as_inferred as_exemplified as_used as_expressed as_visualized as_tested as_manifested as_illustrated as_applied as_mediated as_characterized as_affected as_examined as_ascertained as_quantified as_influenced as_represented as_marked as_induced as_concluded as_calculated as_verified as_required as_recognized as_probed as_presented as_obtained as_needed as_indexed as_derived as_based as_analysed as_supported as_restricted as_recorded as_recommended as_quantitated as_produced as_postulated as_noted as_caused as_summarized as_prepared as_outlined as_occurred as_modified as_localized as_involved as_implied as_gauged as_exhibited as_encountered as_displayed as_contained as_catalyzed as_advocated as_achieved: MVz- or (({Xc+ & {Xd-}} & CO+) or ({Xd- & Xc+} & MVs-)); % MODIFIED 'THAN' so that it links to the clause following it % using 'C' links -- like a relative clause than: (MVt- & (((O*c+ or ({SFsic+} & Zc+) or U*c+) & {Mp+}) or Mpc+ or S**c+ or MVat+ or MVpt+ or Cc+ or Pafc+)) or ((MVta- or LE-) & Cta+ & ((AFd+ & {Pa+}) or PFc+)) or ((MVti- or LEi-) & AFdi+ & {Pa+}) or (((LE- & {AFd+}) or (LEi- & {AFdi+})) & (THc+ or TOic+ or TOfc+ or (TOtc+ & B+))) or (((MVto- & Ct+ & Bc+ & {U+}) or (MVtp- & (CX+ or CQ+))) & {Mp+}); % cost on MVa-: "we will arrive much sooner", want "much" to modify "sooner". much: ({EE-} & ([[MVa-]] or ECa+ or Ca+ or Qe+)) or ({EEx- or H-} & (ECn+ or Dmu+ or ( & ( or Bsm+)))) or (AM- & (Dmuy+ or MVy- or Oy- or Jy- or EB*y-)); slightly somewhat: EC+ or EA+ or MVa- or Em+; far.c infinitely: EC+; significantly substantially: ({EE- or EF+} & (EC+ or E+ or MVa- or ({Xc+ & {Xd-}} & CO+))) or ({EE-} & EB-); % comparative adjectives % angrier.a balder.a balmier.a baser.a bawdier.a bigger.a blacker.a : ({ECa-} & (((Pam- or Mam- or AFm+ or AJrc-) & {@MV+}) or ({[[@Ec-]]} & {Xc+} & Am+) or AJlc+)) or (DG- & (TR+ or AF+) & {@MV+} & (ER- or (Wd- & Xc+ & ER+))); /en/words/words.adj.2: ; easier.a-c: ({ECa-} & (({[[@Ec-]]} & {Xc+} & Am+) or ((Pafm- or AFm+ or Mam- or AJrc-) & {@MV+} & {((TOt+ & B+) or TOi+) & {LE+}}) or AJlc+)) or (DG- & (TR+ or AF+) & {@MV+} & {(TOt+ & B+) or TOi+} & (ER- or (Wd- & Xc+ & ER+))); harder.a-c: ({ECa-} & (({[[@Ec-]]} & {Xc+} & Am+) or ((Pafm- or AFm+ or Mam- or AJrc-) & {@MV+} & {((TOt+ & B+) or TOi+) & {LE+}}) or MVb- or AJlc+)) or (DG- & (TR+ or AF+) & {@MV+} & {(TOt+ & B+) or TOi+} & (ER- or (Wd- & Xc+ & ER+))); higher.a-c deeper.a-c lower.a-c faster.a-c quicker.a-c: ({ECa-} & (((Pam- or AFm+ or Mam- or AJrc-) & {@MV+}) or ({[[@Ec-]]} & {Xc+} & Am+) or MVb- or Qe+ or Ca+ or AJlc+)) or (DG- & (TR+ or AF+ or Cs+) & {@MV+} & (ER- or (Wd- & Xc+ & ER+))); sooner.a-c: ({ECa- or Yt-} & (((Pam- or AFm+ or Mam- or AJrc-) & {@MV+}) or ({[[@Ec-]]} & {Xc+} & Am+) or MVb- or Qe+ or Ca+ or AJlc+)) or (DG- & (TR+ or AF+ or Cs+) & {@MV+} & (ER- or (Wd- & Xc+ & ER+))); longer.a-c: ({ECa- or Yt-} & (((Pam- or AFm+ or Mam- or AJrc-) & {@MV+}) or ({[[@Ec-]]} & {Xc+} & Am+) or MVb- or Qe+ or Ca+ or OT- or FL- or AJlc+)) or (DG- & (TR+ or AF+ or Cs+) & {@MV+} & (ER- or (Wd- & Xc+ & ER+))); smarter.a-c nicer.a-c worse.a-c: ({ECa-} & (({[[@Ec-]]} & {Xc+} & Am+) or ((Pafm- or AFm+ or Mam- or AJrc-) & {@MV+} & {(TOi+ or THi+) & {LE+}}) or AJlc+)) or (DG- & (TR+ or AF+) & {@MV+} & {TOi+ or THi+} & (ER- or (Wd- & Xc+ & ER+))); better.a-c: ({ECa-} & (({[[@Ec-]]} & {Xc+} & Am+) or ((Pafm- or AFm+ or Mam- or AJrc-) & {@MV+} & {(TOi+ or THi+) & {LE+}}) or MVb- or E+ or Qe+ or Ca+ or AJlc+)) or (DG- & (TR+ or AF+) & {@MV+} & {TOi+ or THi+} & (ER- or (Wd- & Xc+ & ER+))); different.a: ({ECa- or EA- or EF+} & (({[[@Ec-]]} & {Xc+} & Am+) or ((Pafm- or AFm+ or Mam- or AJrc-) & {@MV+}) or AA+ or [[DD- & ]] or )); than_expected than_imagined than_proposed than_suspected than_realized than_intended than_supposed than_reported than_ever than_usual than_normal than_suggested than_anticipated than_recommended: MVt-; more_than no_more_than fewer_than less_than as_many_as an_estimated an_additional up_to as_much_as no_fewer_than no_less_than greater_than: EN+; at_least: EN+ or CO+ or [[{Xd- & Xc+} & MVa-]] or EB-; % This is not quite right, since there may be other words in between % "all ... but": "All was lost but for one tree." % "Everything but one tree remained." % nothing_but all_but: EN+ or E+; all_but: EN+ or E+; nothing_but: Vd- & I+; % -------------------------------------------------------------------------- % superlative adjectives % angriest.a baldest.a balmiest.a basest.a bawdiest.a biggest.a : ({Xc+} & {NR-} & {[[@Ec-]]} & La-) or ({NR- or ND-} & DD- & & {TOn+} & ) or AJrs- or AJls+; /en/words/words.adj.3: ; favorite.a favourite.a: or ({Xc+} & {[[@Ec-]]} & [[Lf-]]) or ([[Ds-]] & & {TOn+} & ); sole.a main.a: {Xc+} & {NR-} & {[[@Ec-]]} & L-; same.a own.a: ({Xc+} & {NR-} & {[[@Ec-]]} & La-) or (DD- & & {TOn+} & ); the_same: {EZ-} & (D**y+ or Oy- or Jy- or MVy-); next.a: ({Xc+ & {Xd-}} & CO+) or MVp- or DTi+ or NR+ or ({Xc+} & {[[@Ec-]]} & L-) or (DD- & & {TOn+} & ); past.a previous.a: ({[[@Ec-]]} & {Xc+} & A+) or L- or (Pa- & {@MV+}); following.a remaining.a top.i: L-; hardest.a easiest.a: ({Xc+} & {NR-} & {[[@Ec-]]} & La-) or ({NR- or ND-} & DD- & & {TOt+ & B+} & ) or AJrs- or AJls+; worst.a longest.a fastest.a furthest.a farthest.a: ({Xc+} & {NR-} & {[[@Ec-]]} & La-) or ({NR- or ND-} & DD- & (( & {TOn+} & ) or MVa-)) or AJrs- or AJls+; % "he likes you best of all" has no determiner, just uses MVa-. best.a: ({Xc+} & {NR-} & {[[@Ec-]]} & La-) or ({NR- or ND-} & DD- & (( & {TOn+} & ) or (MVa- & {Mp+}))) or [[E+]] or [MVa- & {Mp+}] or AJrs- or AJls+; % =========================================================================== %ADVERBS %ADVERBS WHOSE MAIN USE IS ADJECTIVAL far_from: {EE-} & EA+; a_bit a_little_bit a_little_while: ({EE-} & EA+) or EC+ or EE+ or ({Xd- & Xc+} & MVa-) or ; % pretty.e extremely very_very very_very_very exceptionally unbelievably incurably extraordinarily jolly.e mighty.e damn.e exceedingly overly downright plumb vitally abundantly chronically frightfully genuinely humanly patently singularly supremely unbearably unmistakably unspeakably awfully decidedly demonstrably fashionably frighteningly horrifyingly indescribably intolerably laughably predominantly unalterably undisputedly unpardonably unreasonably unusually hugely infernally: ({EE-} & EA+) or EE+; notoriously.e: ({EE-} & EA+) or EE+ or Em+; % Adverbs whose main use is adjectival, but can be used with % adverbs such as "faster", "dumber", etc. % "That one is marginally better". (thus EBm+) % "It's an inherently better method" thus E+ link fabulously incomparably inherently marginally moderately relatively ridiculously unacceptably unarguably undeniably unimaginably: ({EE-} & EA+) or EE+ or ({EE-} & EBm-) or E+; wide.e: EE+; very.e way.e: ({EE-} & EA+) or EE+ or [[La-]]; real.e: [[EA+ or EE+]]; quite: ({EE-} & EA+) or EE+ or EZ+ or [[Em+]]; amazingly strangely incredibly: ({EE-} & EA+) or EE+ or ({Xd- & Xc+} & Em+) or ({Xc+ & {Xd-}} & CO+) or EBm- or (Xd- & Xc+ & MVa-); rather: EA+ or EE+ or Vw- or ({Xc+ & {Xd-}} & CO+); particularly: EA+ or EE+ or Em+ or EB- or (MVl- & (MVp+ or MVa+ or MVs+)) or ({Xc+ & {Xd-}} & CO+); notably: EB- or EA+ or EE+ or ({Xc+ & {Xd-}} & CO+); almost nearly: EA+ or EE+ or EN+ or EZ+ or Em+ or EBm-; just_about: Em+ or EN+ or EZ+ or EA+; entirely reasonably highly fairly totally completely terribly: EA+ or EE+ or ({EE- or EF+} & (({Xd- & Xc+} & MVa-) or Em+ or Qe+ or Ca+)); absolutely: EA+ or EE+ or EBm- or ({EE- or EF+} & (({Xd- & Xc+} & MVa-) or Em+ or Qe+ or Ca+)); % allowing as opener also altogether equally: EA+ or EE+ or ({EE- or EF+} & (({Xd- & Xc+} & MVa-) or Em+ or Qe+ or Ca+)) or ({Xc+ & {Xd-}} & CO+); really: EA+ or EE+ or Em+ or EBm-; surprisingly: EA+ or EE+ or ({Xc+ & {Xd-}} & CO+) or ({Xd- & Xc+} & E+) or (Xd- & Xc+ & MVa-); especially: EA+ or EE+ or EB- or Em+ or (MVl- & (MVp+ or MVa+ or MVs+)) or ({Xc+ & {Xd-}} & CO+); virtually: EA+ or EE+ or EN+ or EZ+ or Em+; wholly fully critically greatly grossly duly unduly: EA+ or ({EE- or EF+} & (({Xd- & Xc+} & MVa-) or Em+ or Qe+ or Ca+)); seemingly utterly: EA+ or Em+; barely scarcely hardly merely truly practically: Em+ or EBm- or EA+; partly.e largely.e mostly.e chiefly.e simply.e1 purely.e solely.e: Em+ or EA+ or EB- or (MVl- & (MVp+ or MVa+ or MVs+)); % "It sure is great" sure.ee: Em+; more_and_more less_and_less more_or_less: Em+; % Adverbs like "biochemically". These tend to answer the question "how?" % with a noun-form (as opposed to being verb-derived) A lot of these are % of the "-ically" form /en/words/words.adv.3: EA+ or ({Xd- & Xc+} & (E+ or MVa-)) or EBm- or ({{Xd-} & Xc+} & CO+); in_part: EB- or (MVl- & (MVp+ or MVa+ or MVs+)); % academically administratively aesthetically %ADVERBS WHOSE ONLY (MAIN) USE IS POST_VERBAL barefoot.e willy-nilly quarterly.e madly.e outright.e staccato.e legato.e all_the_way all_the_time anymore.e aloud.e upwards.e downwards.e upward.e downward.e inward.e outward.e inwards.e outwards.e anytime.e live.e wholesale.e anew.e forever.e awhile.e aback.e afoul.e afresh.e aloft.e amok.e amuck.e onstage.e apiece.e askance.e astern.e asunder.e inter_alia mutatis_mutandis par_excellence upside-down.e ab_initio ad_infinitum ad_lib ad_libitum ad_nauseum en_masse aground.e astray.e into_account into_effect to_market to_bid from_scratch to_office for_office for_good at_once to_normal to_bed to_town into_office in_advance to_trial by_lot in_stride by_credit_card by_ear by_foot in_kind en_masse to_mind in_mind in_pencil in_pen to_scale for_trial all_right full_time part_time by_proxy: {Xd- & Xc+} & MVa-; % Adjectives that appear post-verbally e.g. "she wiped the table dry" % "we will arrive exhausted" % comparative link *must* have EE- to "more", "less" % These are more or less adverbs ... dry.e flat.e blind.e tired.e refreshed.e fresh.e exhausted.e rejuvenated.e: ({EE- or EF+ } & (MVa- or AJra- or AJla+)) or (EE- & (AJrc- or AJlc+)); wild.e rampant.e shut.e tight.e open.e loud.e hot.e cold.e free.e: {EE- or EF+} & (({Xd- & Xc+} & MVa-) or Ca+); hard.e wrong.e: {EE- or EF+} & (({Xd- & Xc+} & MVa-) or Qe+ or Ca+); early.e late.e: {EE- or EF+} & (({Xd- & Xc+} & MVa-) or TA+ or Qe+ or Ca+); far.e: {EE- or EF+} & (({Xd- & Xc+} & MVa-) or Ca+ or Qe+ or Yd+); yet.e: ({Xd- & Xc+} & MVa-) or EBm-; %ADVERBS USABLE POST-VERBALLY OR PRE-VERBALLY properly.e: ({Xd- & Xc+} & MVa-) or Em+; finely specially literally heavily alternately severely dearly voluntarily dramatically flatly purposely jointly narrowly universally thickly widely: {EE- or EF+} & (({Xd- & Xc+} & MVa-) or Em+ or Qe+ or Ca+ or [[EA+]]); respectively: ({Xd- & Xc+} & MVa-) or ({Xd- & Xc+} & E+) or ({Xd- & Xc+} & EB-); long.e: E+ or ({EE- or EF+} & (({Xd- & Xc+} & MVa-) or OT- or FL- or Yt+)); daily.e nightly.e weekly.e monthly.e yearly.e hourly.e partially: ({Xd- & Xc+} & MVa-) or E+ or EB-; exactly.e: E+ or ({Xd- & Xc+} & MVa-) or EB- or EN+ or EZ+; well.e: ({EE- or EF+} & (({Xd- & Xc+} & MVa-) or Qe+ or Ca+ or [E+])) or [{EA- or EF+} & (Pa- or AF+)] or Yd+; roughly approximately: EA+ or ({EE- or EF+} & (EN+ or EZ+ or ({Xd- & Xc+} & MVa-) or E+)) or ({Xc+ & {Xd-}} & CO+); together: ({Xd- & Xc+} & MVa-) or E+ or K- or [Mp-] or ({Xc+ & {Xd-}} & CO+); definitely: {EE-} & (E+ or EB- or (Xd- & Xc+ & MVa-)); by_far: EB- or E+ or MVa-; hereby thereby reputedly: E+ or ({Xd- & Xc+} & EB-) or ({Xc+ & {Xd-}} & CO+); %ADVERBS USABLE POST-VERBALLY, PRE-VERBALLY, OR AS OPENERS initially already somehow again once_again nowadays sometimes nevertheless nonetheless at_first at_best at_present of_late indeed: ({Xd- & Xc+} & MVa-) or E+ or ({Xc+ & {Xd-}} & CO+) or EBm-; twice.e: ({Xd- & Xc+} & MVa-) or E+ or ({Xc+ & {Xd-}} & CO+) or EBm- or or ({EN-} & EZ+); hence: (Yt- & ({Xd- & Xc+} & MVa-)) or E+ or ({Xc+ & {Xd-}} & CO+) or EBm-; otherwise formerly lately: ({Xd- & Xc+} & MVa-) or E+ or ({Xc+ & {Xd-}} & CO+) or EB-; also.e: ({Xd- & Xc+} & (E+ or MVa-)) or ({Xc+ & {Xd-}} & CO+) or EB-; gradually.e sadly.e broadly.e clearly.e annually.e characteristically.e comparatively.e confidentially.e currently.e fundamentally.e hypothetically.e ironically.e justifiably.e momentarily.e mercifully.e nominally.e ominously.e periodically.e precisely.e realistically.e simultaneously.e subsequently.e superficially.e thankfully.e unofficially.e effectively.e traditionally.e briefly.e eventually.e ultimately.e mysteriously.e naturally.e oddly.e plainly.e truthfully.e appropriately.e simply.e2: {EE- or EF+} & (({Xd- & Xc+} & (MVa- or E+)) or ({Xc+ & {Xd-}} & CO+) or EB- or Qe+ or Ca+ or [[EA+]]); occasionally.e often.e specifically.e generally.e originally.e: {EE- or EF+} & (({Xd- & Xc+} & (MVa- or E+)) or ({Xc+ & {Xd-}} & CO+) or EB- or Qe+ or Ca+); % ordinary manner adverbs % abjectly ably abnormally abortively abruptly absent-mindedly absently : {EE- or EF+} & (({Xd- & Xc+} & MVa-) or Em+ or ({Xc+ & {Xd-}} & CO+) or Qe+ or Ca+ or or [[EA+]]); /en/words/words.adv.1: ; /en/words/words-medical.adv.1: ; % words.adv.4 contains "prepositional" adverbs, e.g. lingually % meidally subdermally ... Right now we treat these as ordinary % adverbs, and add the Pp- link .. but is this link actually used % anywhere? /en/words/words.adv.4: or Pp-; differently: {EE- or EF+} & (({MVp+} & {Xd- & Xc+} & MVa-) or Em+ or ({MVp+} & {Xc+ & {Xd-}} & CO+) or Qe+ or Ca+ or [[EA+]]); independently: {EE- or EF+} & (({(MVp+ or OF+)} & {Xd- & Xc+} & MVa-) or Em+ or ({(MVp+ or OF+)} & {Xc+ & {Xd-}} & CO+) or Qe+ or Ca+ or [[EA+]]); shortly: {EE- or EF+} & (({Xd- & Xc+} & MVa-) or E+ or EI+ or ({Xc+ & {Xd-}} & CO+) or Qe+ or Ca+); immediately stat.e: ({Xd- & Xc+} & MVa-) or E+ or EI+ or ({Xc+ & {Xd-}} & CO+) or EB-; soon: ({EE- or EF+} & (({Xd- & Xc+} & MVa-) or E+ or EI+ or ({Xc+ & {Xd-}} & CO+) or EB- or Qe+ or Ca+)) or ({EA- or EF+} & (Pa- or AF+)); certainly possibly probably importantly remarkably interestingly: {EE-} & (E+ or (Xd- & Xc+ & (E+ or MVa-)) or ({Xc+ & {Xd-}} & CO+) or ({Xc+ & {Xd-}} & EB-)); /en/words/words.adv.2: % ordinary clausal adverbs E+ or (Xd- & Xc+ & (E+ or MVa-)) or ({Xc+ & {Xd-}} & CO+) or EBm-; % absurdly actually additionally admittedly allegedly alternatively % These are taken from words.adv.2 and allowed EB- when separated by % commas. however.e consequently.e moreover.e potentially.e conversely.e finally.e actually.e thusly.e: E+ or (Xd- & Xc+ & (E+ or MVa-)) or ({Xc+ & {Xd-}} & CO+) or ({Xc+ & {Xd-}} & EBm-); % TODO: "similarly" and "differently" get very different linking requirements. % see if these should be made the same. similarly.e: ({MVp+} & {Xd- & Xc+} & (E+ or MVa-)) or ({MVp+} & {Xc+ & {Xd-}} & CO+) or ({Xc+ & {Xd-}} & EBm-); not_suprisingly if_nothing_else: E+ or (Xd- & Xc+ & (E+ or MVa-)) or ({Xc+ & {Xd-}} & CO+) or EBm-; though.e: (Xd- & Xc+ & (E+ or MVa-)) or ({Xc+ & {Xd-}} & CO+); still.e presumably undoubtedly evidently apparently usually typically perhaps: E+ or (Xd- & Xc+ & (E+ or MVa-)) or ({Xc+ & {Xd-}} & CO+) or EB-; in_fact of_course in_effect for_example for_instance e.g. i.e. : E+ or (Xd- & Xc+ & (E+ or MVa-)) or ({Xc+ & {Xd-}} & CO+) or (EB- & {Xc+}) or (Xd- & EB- & Xc+) or ({Xd-} & CC- & Wd+); % ADVERBS USABLE POST_VERBALLY OR AS OPENERS % Note that similar interjective openers will be given COp+ links % by the UNKNOWN-WORD.a rule -- "Umm, I think he did it." no.e nope.e nah.e no_way yes.e yeah.e yep.e yup.e ok.e okay.e OK.e fine.e sure.e whatever.e someday.e sometime.e thereafter.e anyhow.e anyway.e overall.e afterwards.e afterward.e lengthwise.e worldwide.e nationwide.e statewide.e world-wide.e nation-wide.e state-wide.e industrywide.e instead.e prima_facie before_long by_hand by_car by_plane by_boat by_bus by_train by_phone by_telephone in_person at_long_last on_cue on_arrival by_request in_total in_turn over_and_over time_and_again later_on for_now day_by_day day_after_day step_by_step one_by_one for_sure for_certain even_so more_often_than_not all_of_a_sudden: ({Xd- & Xc+} & MVa-) or ({Xc+ & {Xd-}} & CO+); % Openers to directives, commands (Ic+ connection to infinitives) % or single-word interjections. These are semantically important, % so they've got to parse! no.ij nope.ij nah.ij no_way yes.ij yeah.ij yep.ij yup.ij ok.ij okay.ij OK.ij fine.ij exactly.ij sure.ij whatever.ij hah.ij hey.ij well.ij: Wi- or ; % Openers to directives, commands (Ic+ connection to infinitives) anyhow.ij anyway.ij afterwards.ij afterward.ij instead.ij by_hand by_car by_plane by_boat by_bus by_train by_phone by_telephone in_person at_long_last on_cue on_arrival by_request in_total in_turn over_and_over later_on for_now day_by_day day_after_day step_by_step one_by_one for_sure for_certain even_so more_often_than_not all_of_a_sudden: ; % sort-of-like given names ... stop.misc-inf sir.misc-inf madam.misc-inf ma'am: ; high.e deep.e low.e: {EE- or EF+} & (({Xd- & Xc+} & MVa-) or ({Xc+ & {Xd-}} & CO+) or Ca+ or Qe+); left.e right.e straight.e: ({EE- or EF+} & (({Xd- & Xc+} & MVa-) or ({Xc+ & {Xd-}} & CO+) or Qe+ or Ca+)) or (Kx- & Ky+) or (Pp- & Pp+); short.e: {Yd- or EE- or EF+} & {OF+} & ({Xd- & Xc+} & MVa-); %ADVERBS USABLE ONLY PRE-VERBALLY (OR PRE-/OPENER) newly: E+; rightly: {EE-} & E+; necessarily no_longer: E+ or EBm-; ever: E+ or EBm- or EC+ or MVa-; never.e always: {EN-} & (E+ or EB-); seldom rarely.e: {EE-} & (E+ or EB-); % MVa-: "He did just what you asked." just.e: E+ or EB- or (MVl- & (MVa+ or MVp+ or MVs+)) or EN+ or EZ+ or MVa-; maybe: CO+; meantime.e secondly thirdly in_brief in_short in_sum in_essence: ({Xd- & Xc+} & E+) or ({Xc+ & {Xd-}} & CO+); furthermore: ({Xd- & Xc+} & E+) or ({Xc+ & {Xd-}} & CO+) or EB-; mainly primarily: E+ or ({Xc+ & {Xd-}} & CO+) or EB- or (MVl- & (MVa+ or MVp+ or MVs+)); only: La- or E+ or EN+ or EB- or (MVl- & (MVp+ or MVa+ or MVs+)) or MVa- or (Rnx+ & ) or (MVp+ & Wq- & Q+); never.i at_no_time not_once rarely.i since_when: {MVp+} & Wq- & Q+ & {CC+}; not_since: (J+ or Cs+) & Wq- & Q+ & {CC+}; even.e: E+ or EC+ or EB- or ((MVp+ or MVa+ or MVs+) & (MVl- or ({Xc+ & {Xd-}} & CO+))) or (Rnx+ & ); not_even: Rnx+ & ; too: {ECa-} & (EA+ or EE+ or ({Xd- & Xc+} & MVa-) or (Xd- & Xc+ & E+)); so: (EAxk+ & {HA+}) or ({EZ-} & EExk+) or ((({Xd-} & CC-) or ({Xc+} & Wc-)) & (Wd+ or Qd+ or Ws+ or Wq+)) or (Wq- & (PF+ or CQ+)) or O- or Js-; % original % sufficiently: {EE-} & (EAxk+ or EExk+ or MVak-); % modified sufficiently: {EE-} & (EAxk+ or EExk+ or ({Xd- & Xc+} & MVa-) or E+); so_that such_that: Cs+ & {Xd- & Xc+} & MVs-; % much like an ordinary adverb, except even more commas allowed % please.e: ; please.e: {EE- or EF+} & (({Xd- & Xc+} & MVa-) or ({Xc+ & {Xd-}} & (Em+ or CO+)) or Qe+ or Ca+ or [[EA+]]); % polite command verb please.w thank_you: {Ic-} & Wi- & {{Xc+} & Vv+}; % MISCELLANEOUS WORDS AND PUNCTUATION etc: {Xi-} & Xd- & Xc+ & (MX- or MVa-); so_on the_like vice_versa v.v.: ( & ) or or (( or or or ) & {@MV+}) or M- or MV-; % Assorted interjections, treat like unknown adjectives. er err.ij errr um.ij umm uh uhh oh.ij ohh ooo woo_hoo gee gosh wow.ij ah ahh eh ehh hmm hmmm hoo zowie goody.ij jeepers Jee-sus hubba Kee-reist oops amen huh howdy dammit whammo shucks.ij heck anyways honey.ij golly man.ij baby.ij hush.ij sonuvabitch aw aww awww oh_great oh_wow emoticonID0 emoticonID1 emoticonID2 emoticonID3 emoticonID4 emoticonID5 emoticonID6 emoticonID7 emoticonID8 emoticonID9 emoticonID10 emoticonID11 emoticonID12 emoticonID13 emoticonID14 emoticonID15 emoticonID16 emoticonID17 emoticonID18 emoticonID19 emoticonID20 emoticonID21 emoticonID22 emoticonID23 emoticonID24 emoticonID25 emoticonID26 emoticonID27 emoticonID28 emoticonID29 emoticonID30 emoticonID31 emoticonID32 emoticonID33 emoticonID34 emoticonID35 emoticonID36 emoticonID37 emoticonID38 emoticonID39 emoticonID40 emoticonID41 emoticonID42 emoticonID43 emoticonID44 emoticonID45 emoticonID46 emoticonID47 emoticonID48 emoticonID49 emoticonID50 emoticonID51 emoticonID52 emoticonID53 emoticonID54 emoticonID55 emoticonID56 emoticonID57 emoticonID58 emoticonID59: or ({{Ic-} & [[Wi-]]} & {{Xd-} & Xc+} & Ic+); ".": ((Xp- or ({@Xca-} & Xc-)) & RW+) or Xi-; "!" "?": ((Xp- or ({@Xca-} & Xc-)) & RW+) or ({@Xca-} & Xq+); : {@Xca-} & Xx- & (W+ or Qd+) & {Xx+}; ";": ; % comma, as a conjunction -- "They taste bitter, not sweet" % Give MVa a cost, so that Pa is used preferentially, if possible. : ((AJla- & EBx+ & AJra+) & (Pa- or [[MVa-]])) or (AJla- & AJra+ & AJla+); : (RJlv- & RJrv+ & RJlv+); % sometimes comma is used as if it were a semicolon % Allow post-comma adverbial modifiers, but discourage these % because the modifier my be long to a following phrase. % e.g. "The blah, soon to be blah, will be blah." should not % get an EBx link to "soon". % XXX the correct solution to this is to add a new domain rule ! XXX % % Comma can conjoin nouns only if used in a list of 3 or more items: % "This, that and the other thing" % However, this is given a cost, so that geographic names are prefered: % "He went to Gaeta, Italy, and to Paris, France." % ",": ({@Xca- or [[[@Xc-]]]} & (({[EBx+]} & Xd+) or Xc-)) or [[]] or or or or [[SJl- & SJr+ & SJl+]] or (SJn- & SJr+ & SJn+); "…" ":.j" "•": ({@Xca-} & ((Xx- & (W+ or J+ or Qd+ or TH+ or TOn+) & {Xx+}) or Xe-)); % The percent sign following a number % Also -- see above, for handling of 12ft. 12in. not just 12% "%": (ND- & {DD-} & & ) or (ND- & (OD- or AN+)); % See also /en/words/currency for curency names that follow a number. $ USD.c US$.c C$.c AUD.c AUD$.c HK.c HK$.c £ ₤ € ₳ ฿ ¢ ₵ ₡ ₢ ₫ ₣ ₴ ₭ ℳ ₥ ₦ ₧ ₰ ₨ ₪ ৳ ₮ ₩ ¥ 호점 † †† ‡ § ¶ © № "#": NM*x+ & (AN+ or NM*y- or [[G+]] or (NIfu+ or NItu-) or ({EN- or NIc- or [[A- & NSa-]]} & {@MX+} & (OD- or ({DD-} & {[[@M+]]} & ( or or [[(Ss+ & ) or SIs-]]))))); "&": G- & {Xd- & G-} & G+; "’" "'": YP- & (({AL-} & {@L+} & (D+ or DD+)) or [[]] or DP+); "'s.p" "’s.p": YS- & (({AL-} & {@L+} & (D+ or DD+)) or [[]] or DP+); % lparen, rparen, etc. is to be generated by the entity detector, and % substituted, at will. This helps avoid screw-ups in the constituent % tree, and in other places where things can get wrecked by raw % punctuation. % lparenID0 lparenID1 lparenID2 lparenID3 lparenID4 lparenID5 lparenID6 lparenID7 lparenID8 lparenID9 lparenID10 lparenID11 lparenID12 lparenID13 lparenID14 lparenID15 lparenID16 lparenID17 lparenID18 lparenID19 lparenID20 lparenID21 lparenID22 lparenID23 lparenID24 lparenID25 lparenID26 lparenID27 lparenID28 lparenID29 lparenID30 lparenID31 lparenID32 lparenID33 lparenID34 lparenID35 lparenID36 lparenID37 lparenID38 lparenID39 lparenID40 lparenID41 lparenID42 lparenID43 lparenID44 lparenID45 lparenID46 lparenID47 lparenID48 lparenID49 lparenID50 lparenID51 lparenID52 lparenID53 lparenID54 lparenID55 lparenID56 lparenID57 lparenID58 lparenID59 lbracketID0 lbracketID1 lbracketID2 lbracketID3 lbracketID4 lbracketID5 lbracketID6 lbracketID7 lbracketID8 lbracketID9 lbracketID10 lbracketID11 lbracketID12 lbracketID13 lbracketID14 lbracketID15 lbracketID16 lbracketID17 lbracketID18 lbracketID19 lbracketID20 lbracketID21 lbracketID22 lbracketID23 lbracketID24 lbracketID25 lbracketID26 lbracketID27 lbracketID28 lbracketID29 lbracketID30 lbracketID31 lbracketID32 lbracketID33 lbracketID34 lbracketID35 lbracketID36 lbracketID37 lbracketID38 lbracketID39 lbracketID40 lbracketID41 lbracketID42 lbracketID43 lbracketID44 lbracketID45 lbracketID46 lbracketID47 lbracketID48 lbracketID49 lbracketID50 lbracketID51 lbracketID52 lbracketID53 lbracketID54 lbracketID55 lbracketID56 lbracketID57 lbracketID58 lbracketID59 "(" "[": {EBx+} & Xd+; rparenID0 rparenID1 rparenID2 rparenID3 rparenID4 rparenID5 rparenID6 rparenID7 rparenID8 rparenID9 rparenID10 rparenID11 rparenID12 rparenID13 rparenID14 rparenID15 rparenID16 rparenID17 rparenID18 rparenID19 rparenID20 rparenID21 rparenID22 rparenID23 rparenID24 rparenID25 rparenID26 rparenID27 rparenID28 rparenID29 rparenID30 rparenID31 rparenID32 rparenID33 rparenID34 rparenID35 rparenID36 rparenID37 rparenID38 rparenID39 rparenID40 rparenID41 rparenID42 rparenID43 rparenID44 rparenID45 rparenID46 rparenID47 rparenID48 rparenID49 rparenID50 rparenID51 rparenID52 rparenID53 rparenID54 rparenID55 rparenID56 rparenID57 rparenID58 rparenID59 rbracketID0 rbracketID1 rbracketID2 rbracketID3 rbracketID4 rbracketID5 rbracketID6 rbracketID7 rbracketID8 rbracketID9 rbracketID10 rbracketID11 rbracketID12 rbracketID13 rbracketID14 rbracketID15 rbracketID16 rbracketID17 rbracketID18 rbracketID19 rbracketID20 rbracketID21 rbracketID22 rbracketID23 rbracketID24 rbracketID25 rbracketID26 rbracketID27 rbracketID28 rbracketID29 rbracketID30 rbracketID31 rbracketID32 rbracketID33 rbracketID34 rbracketID35 rbracketID36 rbracketID37 rbracketID38 rbracketID39 rbracketID40 rbracketID41 rbracketID42 rbracketID43 rbracketID44 rbracketID45 rbracketID46 rbracketID47 rbracketID48 rbracketID49 rbracketID50 rbracketID51 rbracketID52 rbracketID53 rbracketID54 rbracketID55 rbracketID56 rbracketID57 rbracketID58 rbracketID59 ")" "]": {@Xca-} & Xc-; – --.r -.r: [[{@Xca-} & Xx- & (W+ or J+ or Qd+ or TH+ or TO+) & {Xx+}]] or ({@Xca-} & (({EBx+} & Xd+) or Xc-)); foo: F+; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Morphology guessing for unknown words. % Given a particular kind of ending to a word, try to guess % its part-of-speech. % ING-WORDS.g: ( & ) or ( & ) % or ({@E-} & A+) or ; ING-WORDS.g: [( & )] or [( & )] or [({@E- or EA-} & A+)] or [] or (( & (({D*u-} & & ( or Bsm+)) or or (YS+ & {D*u-}) or (GN+ & (DD- or [()])) or Us-)) or AN+ or {AN-}); ED-WORDS.v-d: VERB_SPPP_T(`') or or ({@E-} & A+); S-WORDS.v: VERB_S_T(`'); S-WORDS.n: ( & (({NM+ or Dmc-} & & ( or Bpm+)) or ({NM+ or Dmc-} & ) or (YP+ & {Dmc-}) or (GN+ & (DD- or [()])) or Up-)) or [[AN+]]; LY-WORDS.e: {EE- or EF+} & (({Xd- & Xc+} & MVa-) or Em+ or ({Xc+ & {Xd-}} & CO+) or Qe+ or Ca+ or [[EA+]]); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Morphology guessing extension rules from BioLG-1.1.12 % Words guessed based on morphology. % These occur primarily in biomedical and chemistry texts. % These are processed via regular-expression matching, in 4.0.regex %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% MC-NOUN-WORDS.n: % guessed nouns that can be mass or countable (-in, -ine, -ion, -yl, -ose, -ol, -ide, -ity) ( & (({NM+ or D*u-} & & ( or Bsm+)) or ({NM+ or D*u-} & ) or (YS+ & {D*u-}) or (GN+ & (DD- or [()])) or Us-)) or AN+; C-NOUN-WORDS.n: % guessed nouns that are countable (-on, -or) ( & (((NM+ or Ds-) & & ( or Bsm+)) or ({NM+ or Ds-} & ) or (YS+ & Ds-) or (GN+ & (DD- or [()])) or Us-)) or AN+; ADJ-WORDS.a: % guessed adjectives (-ous, -ar, -ic) ; % guessed adjectives/adverbs suffixed by "fold" with or without hyphen FOLD-WORDS: ({EN-} & (MVp- or EC+ or A+)) or Em+; % latin (postposed) adjectives considered as mass nouns % in the current version LATIN-ADJ-WORDS.a: ( & (({NM+ or D*u-} & & ( or Bsm+)) or ({NM+ or D*u-} & ) or (YS+ & {D*u-}) or (GN+ & (DD- or [()])) or Us-)) or AN+; % latin (postposed) adjectives or latin plural noun always considered % as nouns in the current version LATIN-ADJ-P-NOUN-WORDS: ( & (({NM+ or Dmc-} & & ( or Bpm+)) or ({NM+ or Dmc-} & ) or (YS+ & {Dmc-}) or (GN+ & (DD- or [()])) or Up-)) or AN+; % latin (postposed) adjectives or latin singular noun always % considered as nouns in the current version LATIN-ADJ-S-NOUN-WORDS: ( & (({NM+ or D*u-} & & ( or Bsm+)) or ({NM+ or D*u-} & ) or (YS+ & {D*u-}) or (GN+ & (DD- or [()])) or Us-)) or AN+; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Guessing of unknown words, if none of the above rules applied. UNKNOWN-WORD.n: & (AN+ or ({NM+ or D*u-} & & ( or Bsm+)) or ({NM+ or D*u-} & ) or (YS+ & {D*u-}) or (GN+ & (DD- or [()])) or U-); UNKNOWN-WORD.v: {@E-} & (Sp- or (RS- & Bp-) or I- or ({Ic-} & Wi-)) & {B- or O+} & {@MV+}; UNKNOWN-WORD.a: ; LEFT-WALL: (Wd+ or Wq+ or Ws+ or Wj+ or Wc+ or Wi+ or Qd+) & {CP+} & {Xx+} & {RW+ or Xp+}; RIGHT-WALL: RW- or ({@Xca-} & Xc-); % XXX ANDABLE-CONNECTORS is now deprecated, needs to be removed for version 5.0 ANDABLE-CONNECTORS: % these are the connectors that can be combined by % conjunctions. They are listed alphabetically. A+ & A- & AF- & AN+ & B+ & B- & BI- & C+ & C- & CC+ & CO+ & CO- & D+ & D- & DD- & DT- & E+ & E- & EA- & G+ & GN+ & GN- & I+ & I- & IN- & J+ & J- & JT- & K- & L- & M+ & M- & MV- & MV+ & MX- & ND+ & NM+ & NIn+ & O+ & O- & ON- & QI+ & QI- & P- & PP- & Q- & R+ & RS- & S+ & S- & SI- & TA- & TD+ & TD- & TH+ & TH- & TI- & TM- & TO- & TS- & U- & Wd- & Wi- & Wq- & Ws- & Xc+ & Xd- & YP+ & YS+ & Z-; UNLIMITED-CONNECTORS: % These are the link-types that are not subject % to the length limit. Always use "+" for these. S+ & CO+ & C+ & Xc+ & MV+ & CC+ & TH+ & W+ & RW+ & Xp+ & Xx+ & CP+ & SFsx+; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Extensions by Peter Szolovits, psz@mit.edu, as a part of the work for % "Adding a Medical Lexicon to an English Parser. Proc. AMIA 2003 Annual % Symposium, xx-yy. % Visit http://www.medg.lcs.mit.edu/projects/text/ for more information. % although in_as_much_as whilst whereas whereof wherein: (Cs+ & (({Xc+ & {Xd-}} & CO*s+) or ({Xd- & Xc+} & MVs-))) or ({Xd-} & CC- & Wd+); benumbed.a bespattered.a non_compos_mentis dead_on_arrival bedimmed.a null_and_void bedewed.a au_fait dead_of_other_causes right_sacrotransverse above_board K/O.a SGA.a TBA.a DOA.a asialo.a syntonic.a loco.a haywire.a: ((Ma- or Pa- or MJra-) & {@MV+}) or ({@MV+} & MJla+) or ; subject_to status_post in_conjunction_with sensu in_relation_to neath amidst across_from circa astride previous_to together_with as_regards s/p aka amongst unto apropos_of w.i W.i: ({JQ+} & (J+ or Mgp+) & ) or (MVp- & B-); oftenest correctliest soonest disquietingliest: EA+; proof-reads.v proof_reads gells.v O.K.'s.v OK's.v O.K.’s OK’s: VERB_S_I(); propension.n: ( & ((Ds- & {@M+} & {(TOn+ or (R+ & Bs+)) & {[[@M+]]}} & {@MXs+} & ( or Bsm+)) or Us- or (YS+ & Ds-) or (GN+ & (DD- or [()])))) or AN+; avow.q: [[{@E-} & (((Sp- or I-) & ) or (SIpj+ & ))]]; longest-term.a: ({Xc+} & {NR-} & {[[@Ec-]]} & La-) or ({NR- or ND-} & DD- & (( & {TOn+} & ) or MVa-)); daren't mayn't shan't oughtn't mightn't daren’t mayn’t shan’t oughtn’t mightn’t: ({{Ic-} & Q-} & (SI+ or SFI+) & I+) or ({@E-} & (S- or SF- or (RS- & B-)) & (I+ or [[()]])); longer-term.a: ({ECa-} & (({[[@Ec-]]} & {Xc+} & Am+) or ((Pafm- or AFm+ or Mam-) & {@MV+} & {(TOi+ or THi+) & {LE+}}))) or (DG- & (TR+ or AF+) & {@MV+} & {TOi+ or THi+} & (ER- or (Wd- & Xc+ & ER+))); attestation.n: ( & (({D*u-} & {@M+} & {(TH+ or (R+ & Bs+)) & {[[@M+]]}} & {@MXs+} & ( or (Ss*t+ & ) or SIs*t- or Bsm+)) or Us- or (YS+ & {D*u-}) or (GN+ & (DD- or [()])))) or AN+; O.K.'d.v-d OK'd.v-d O.K.’d.v-d OK’d.v-d: VERB_SPPP_I(); whence whither: {EL+} & (Cs+ & (({Xc+ & {Xd-}} & CO+) or ({Xd- & Xc+} & MVs-))); % Strange -- the JT- is a time-expression link .. .is that right here ?? articulo_mortis intra_vitam in_articulo_mortis in_extremis post_cibum post_coitum: or JT- or [[E+]] or YS+ or [[]]; lest: (Cs+ or Mgp+ or Mv+) & (({Xc+ & {Xd-}} & CO*s+) or ({Xd- & Xc+} & MVs-) or (Xd- & Xc+ & E+)); whyever: ({EL+} & ((Wq- & Q+) or (QI- & (Cs+ or TOn+)) or (Cs+ & ((SFsx+ & ) or WY- or BIq-)))) or [[{@CO-} & Wc- & Wi+]]; albeit: (Cs+ & {Xc+ & {Xd-}} & CO*s+) or ({Xd-} & CC- & Wd+); whichever: ({EL+} & (((Ss*d+ or Bsd+ or BW+ or D**w+) & ( or (Xc+ & {Xd-} & CO+) or ({Xd- & Xc+} & MVs-))) or [[(O- or J-) & CX+]])) or ((ALx+ & J+) & (({Xd-} & Xc+ & CO+) or ({Xd- & Xc+} & MVs-))); proof-reading.v proof_reading O.K.'ing.v OK'ing.v O.K.’ing.v OK’ing.v: ( & ) or ({@E-} & A+) or ; % "I'll hire whomever I can find": Os- whomever: (R- & Cr+) or (B*w+ & (Wq- or QI*d- or BIqd- or ((Xc+ or ) & Xd- & MX*r-))) or (Os- & Bsd+) or (Jr- & (RS+ or Cr+)) or Jw-; thyself oneself one's one’s: J- or O- or E+ or MVa-; % Handy test % grrr: (A- & B- & C+ & D+) or [(E- & @F+ & @G+ & H+)] or [[(I- & J- & @K- & @L+)]]; link-grammar-4.7.4/data/en/4.0.constituent-knowledge0000644000175000017500000000307210204377537021215 0ustar bloombloomDOMAIN_STARTER_LINKS: S##* S##i SF SX Ce* Cet RS O OX Js Jp J* MVp Mp R* Rn Pa TH Pg Pv I PP Cr Cs MX#* Wc Wd Wi TI BIt MVs TO Mv Mg* MVa OF ON IN QI Ma CP* CPi CPx MVt S##w MX#r Pp MVi MVg Mgp MVx SI MX#p Cc S##t S##h S##b S##q L MX#a MG JG MX#x U S##d JT MVh Mr B#w B#d MVb COq Mj OD CX S##g PF Zc MX#d Bc K NIax DOMAIN_CONTAINS_LINKS: URFL_ONLY_DOMAIN_STARTER_LINKS: LEFT_DOMAIN_STARTER_LINKS: A EA E CO#s CO* COd* YS YP Yt Yd GN DTie CO#n COp D##n ND STARTING_LINK_TYPE_TABLE: S##* v S##i v S##t v S##h v S##b v S##q v S##d z S##g v SF v SX v Wd s Wc s Wi z Ce* s Cet s TH b RS z O n OX n Js n Jp n J* n MVp p Mp p R* b Rn s Pa a A u Pg v Pv v I v PP v Cr s Cs s MX#* n TI n BIt n MVs b EA e E e TO t MVi t Mv v Mg* v CO#s f CO* g COd* g CO#n g MVa i MVb i OF p YS y YP y IN n ON n QI b Ma a CP* s CPi s CPx q MVt p MX#r b S##w z Pp p MVg z Mgp z MVx p SI n MX#p v Cc s L a MX#a a Yt y Yd y MG p JG n GN y MX#x p U n JT n MVh b Mr b MX#d b B#w s B#d s DTie e COq s Mj b OD n CX s COp c PF v Zc s Bc s K k D##n d ND d NIax h ; ---------------------------------------------------------------------- ; These links are not put in the word/link graph. They also cannot be the ; starter links for a domain. IGNORE_THESE_LINKS: Xca HA ; ---------------------------------------------------------------------- ; these links are not traced further if they point back before the root word RESTRICTED_LINKS: B#* D##w B#w B#d AFh MVt Xx HL SFsic AFd Bc CX EAh H HA PFc B#j Wd PF Z BW link-grammar-4.7.4/data/en/4.0.biolg.batch0000644000175000017500000003054511246213504017030 0ustar bloombloom!verbosity=1 !echo !limit=1000 !batch !short=20 !constituents=1 !spell=0 %UNITS % Some basic cases The 50 kDa protein is examined The protein ( 50 kDa ) is examined The mass is 50 kDa A protein of 50 kDa is examined The rate is 10 nm per msec The rate is 10 nm per one msec of time The last 195 bp of the DNA are examined % These should work also if the tokens are "merges" of number and unit The 50-kDa protein is examined The 50kDa protein is examined The mass is 50kDa A protein of 50kDa is examined The rate is 10nm per msec The rate is 10nm per 1msec of time The last 195bp of the DNA are examined % A number derived units are also recognized The rate is 10 mg/sec The rate is 10 mol/day The rate is 10 micrograms/mouse/day % Units previously in the dictionary have not been modified, and are % not allowed all the necessary roles. The 10 foot distance is examined % The following dont work yet, and would require special ".p" definitions % of the units, similar to, for example, feet.p and seconds.p. % This would require an OD- connectors (see feet.p) It fell 10 nm % This would require an OT- connector (see seconds.p) It lasted 10 msec % This would require Yd+ (see feet.p) It happened 10 nm away % This would require Yt+ (see seconds.p) It happened 10 msec later % This would require EC+ to have the intended parse (compare feet.p) The 10 bp longer sequence is examined % This one doesn't work because of "leftmost" The leftmost 195 bp of the DNA are examined % NUMERIC RANGES The 50 to 100 kDa protein is examined Exons 40 to 50 were examined It was submitted in the period 1990 to 1995 The range is 0 to 1 The range is nine to twenty % ambiguities are mainly due to the bracketed part The production is low in rich media ( 50 to 300 LrpC molecules per cell ) The enzyme has a weight of 125,000 to 130,000 The domain ( residues 73 to 90 ) was shown The analysis revealed a transcript after 6 to 7.5 h CSF reached 50 to 100 nM A shift from 37 to 20 degrees C resulted in an increase An operon showed at 310 to 320 kb The sequence shows 28.2 to 34.6 % identities In the past 4 to 5 years results have advanced One is the region 1911 to 1917 % unnecessary (?) ambiguity with the range linking to "are" The segment includes the pacL from which genes 1 to 7 are transcribed The gene 1 to 7 mRNA synthesis was reduced There are deviations of 2 to 3 A % the range should link to the verb with MVp (~ "north"): to much ambiguous ? These transcripts are located 5 to 3 These transcripts are located 5' to 3' % Ranges with hyphens The 50 - 100 kDa protein is examined Exons 40 -- 50 were examined It was submitted in the period 1990 --- 1995 % Cases with "from" (e.g. "from 10 to 20") (TODO): % shifts The number of repeats was increased from 7 to 11 . Experiments revealed an increase from 0 to 5 min postinduction The transfer of cells from 37 to 50 degrees C repressed synthesis . The concentration increased from 125 to 325 microgram per assay . % ranges We inserted sequences from 5 to 21 bp in length The start point ranged from 17 to 18 base pairs The promoter contained a sequence near the region ( from 60 to 73 % ) A region extending from 183 to 118 base pairs was required % Cases with "between" Transcription sets in ( between 8 and 16 h of culture ) . The pH optimum is between 5 and 7 concentrations were measured between 0 and 3 h after the beginning it shows activity at a temperature between 60 and 70 degrees C The activity is stable between pH 6 and 12 % Numeric ranges with "merged" units (or "fold") also occur An 80 to 100-fold increase was observed Antigens ranged 82 to 90% % FOLD-WORDS This included an up to threefold increase There were increases in proteins, including actin (twofold to threefold) The association rate constant is also increased about 2-fold The affinity is approximately 30-fold weaker Leaves display a 2-fold accumulation This was about 10-fold higher % correct parse ranked second sigmaF was some twofold higher than sigmaE % does not parse It was two to threefold more abundant I found an at least twofold reduction It showed a fivefold anaerobic induction loci increased more than twofold % correct parse ranked fourth It corresponds to one- , two- and threefold phosphorilated proteins The structure shows a fold consisting of a beta-sheet % EQUATIONS ETC. non-denaturing gradient gel electrophoresis (r = 0.859) was used preparations of 5 x 10(8) cfu/ml are made phosphorylation was observed (P = 0.06) bacteria with low G + C DNA content contain genes the strength was in the order of gerE > cotD > yfhP P2 > yfhP P1 delta binds RNAP with an affinity of 2.5 x 10(6) M-1 % "x" between numbers denoting multiplication A single cell inside a pool of 5 x 10000 lymphocytes could be quantified A single cell inside a pool of 5 x 10(4) could be quantified % "Arrows" We consider the MPO --> PAG pathway Codon 311 (Cys --> Ser) polymorphism is associated with apolipoprotein E4 % GREEK LETTERS minicells revealed the expression of both lambda and SPP1 genes We cloned a new gene encoding an alternative sigma factor The sigma factor sigma 35 of B. thuringiensis is homologous Each polymerase had a subunit composition analogous to beta beta2 alpha sigma delta omega 1 omega 2 % SOME ADVERB CASES % compare patients are treated, therefore, even if they are negative patients are treated, however, even if they are negative % related? the results indicated, therefore, that it is required they prefer studies that are, however, open more importantly , they are open % i.e., e.g. and related they were not side-by-side (i.e., stacked) antagonists (e.g. WEB-2086) were examined receptors, e.g. GluR5 and GluR, have been examined there is genetic heterogeneity, i.e. there are several genes % UPSTREAM, DOWNSTREAM, 3', 5' The soil from the river banks is washed downstream. He was making his way upstream. The view is upstream and the discharge is about 5.0 m3/s. It will require more information from upstream. The inverted repeat is found upstream of the promoter. The promoter is located immediately upstream of ftsY. The cryIAb gene was located 3 kb upstream of its initiator codon. mphR is located downstream from mrx. These transcripts are oriented 5' to 3' % MISCELLANIA (commented out not to confuse) % the patient tested negative % "MADE OF" VARIANTS the protein films have a microstructure formed of woven sheaves The sheaves are composed of well-defined whisker crystallites Different conjugates, composed of a peptide carrier and a cytotoxic moiety, have been investigated A study was made of the stability a protein made of the luminal domain fused to the tail the intracellular pool of enzyme is formed of newly synthesized molecules % "DESIGNATED" ETC. Mice that express epitope tagged SF-1 are being used The method labelled FAXS is rapid % ATTACH TO Isolated eosinophils from healthy donors rapidly attach to ASMC Dystrophin can attach to the cytoskeleton % INVESTIGATED, EXAMINED WHETHER this study examined whether AQP1 is present in HPMC % from PASBio % abolish.01 % MEDLINE No.1 This mutation abolishes splicing % EMBO No.1 (passive) Transcription is completely abolished % alter.01 % MEDLINE No.1 Mutations alter splice sites % EMBO No.3 Phosphorylation was not altered by treating the cells % begin.01 ("start existing") % EMBO No.1 The density begins between amino acids 136 and 140 % begin.02 ("start doing") % EMBO No.1 The levels begin to return % block.01 % MEDLINE No.1 ('the' was manually added to "step") Mutations block the step II % EMBO No.3 (passive) Labeling is blocked by pre-incubation % catalyse.01, ("catalyze") is unknown % EMBO No.2 enzymes catalyze the unwinding % MEDLINE No.1 (passive) The metabolism is most likely catalysed by P450 % confer.01 % MEDLINE No.2 The variant does not confer a risk % EMBO No.1 (passive) The phenotype can be conferred by replacing the C-terminus with Stat5 % decrease.01 % MEDLINE No.1 Treatment decreased synthesis % EMBO No.2 (passive) The protection is decreased % delete.01 % MEDLINE No.1 Transcripts delete exons % EMBO No.4 (passive) the binding was deleted % develop.01 % MEDLINE No.1 ('a' was manually added to "deficiency") The son developed a deficiency % disrupt.01 % MEDLINE No.1 A mutation disrupted a sequence % eliminate.01 % MEDLINE No.1 Deletion would eliminate a residue within a domain % EMBO No.4 (passive) All three sites are eliminated % encode.01 % MEDLINE No.1 Supt4h2 encodes a protein % EMBO No.1 SBP2 may be encoded by three transcripts % express.01 % MEDLINE No.1 (passive) ('the' was manually added to "brain") The enzyme was expressed exclusively in the brain % MEDLINE No.7 Retroelements express Pol % generate.01 % MEDLINE No.1 Prnd generates transcripts % MEDLINE No.7 Molecules are generated by an alternative splicing % inhibit.01 MEDLINE No.1 This peptide inhibited binding % inhibit.01 MEDLINE No.2 (passive) Isoforms are inhibited by rolipram % initiate.01 MEDLINE No.1 (?) Tumours had altered mRNAs , initiated within intron 1 % initiate.01 MEDLINE No.2 Cells initiate transcription at multiple sites % initiate.01 MEDLINE No.3 (intransitive) Translation initiates from an internal codon % lead.01 MEDLINE No.1 A mutation leads to ligation % lead.01 ? (passive) % lose.01 MEDLINE No.1 A variant which lost a site has been characterized % lose.01 EMBO No.3 (passive) Anchoring ability was lost % modify.01 MEDLINE No.1 (passive) Genes were modified % modify.01 EMBO No.2 Factors that can modify the binding may regulate binding % mutate.01 MEDLINE No.1 (adj?) % [there may be a problem here with "deficiency"] The mutated allele resulted in deficiency % mutate.01 MEDLINE No.2 (passive participle postmodifier) The gene mutated in mice encodes a protein % mutate.01 EMBO No.4 The fragments were mutated by the sequence % mutate.01 ? (active) % proliferate.01 MEDLINE No.1 Cells are characterized by an ability to proliferate % proliferate.01 MEDLINE No.2 Cells proliferate % proliferate.01 ? (passive) % recognize.01 MEDLINE No.1 (passive participle postmodifier) The protein would lack epitopes recognized by the serum % recognize.01 MEDLINE No.3 A number recognized by cells have been isolated % recognize.01 MEDLINE No.5 Antibodies recognize specifically a polypeptide % result.01 MEDLINE No.1 We report the existence of isoforms which result from splicing % result.01 MEDLINE No.2 Both mutations result in high proportions of mRNAs % result.01 ? (passive) % skip.01 MEDLINE No.1 sequencing revealed a mutation, which skipped exon 3 % skip.01 MEDLINE No.2 An exon can be skipped by splicing % splice.01 MEDLINE No.1 exon 30 is spliced together with the intron % splice.01 PNAS No.4 3I spliced 20% as efficiently as 3F % splice.01 PNAS No.4 (oversimplified?) 3I spliced % splice.02 MEDLINE No.1 CD1c has a form that is thought to be spliced out % splice.02 MEDLINE No.2 One exon is spliced out of the transcript % splice.02 MEDLINE No.9 Exon 16 can be spliced out % transcribe.01 MEDLINE No.1 The gene is transcribed % transcribe.01 MEDLINE No.2 KLK41 transcribes two alternative transcripts % transform.01 MEDLINE No.1 FGF8b can transform the midbrain into a cerebellum fate % transform.01 MEDLINE No.3 Phospholipase D is known to transform cells into tumorigenic forms % transform.02 MEDLINE No.1 The DNA was used to transform E. coli % translate.01 MEDLINE No.1 Splicing results in a transcript which would be translated into a protein % translate.01 EMBO No.1 Stat1 was translated % translate.01 EMBO No.2 (oversimplified? slightly modified) Stat1 translated can become a dimer % translate.02 MEDLINE No.1 This review examines technologies that can be used to translate information % translate.02 MEDLINE No.3 Acj6 translates information into specificity % translate.03 MEDLINE No.1 The functions translate into modulations % truncate.01 MEDLINE No.1 Changes were predicted to truncate the protein % truncate.01 MEDLINE No.2 The domains were truncated % verbs taking particles The recombinant plasmid was screened out The adenine bulge is looped out A monomer is built up of strands % "in gel" % should have been in-gel to be grammatical -- could a spell cheker guess this? They were measured by in gel kinase assays % IMPORTANT: CAPITALIZED-WORDS SHOULD ALLOW "that" ETC. ( missing) it encodes a GPCR that is homologous to the chemokine % compare it encodes a gPCR that is homologous to the chemokine % "ORDERED" as an adjective The complex plays a role in the construction of ordered multicellular structures % CONCENTRATED as an adjective the genes were most concentrated in the cell link-grammar-4.7.4/data/en/4.0.voa.batch0000644000175000017500000002070211270113315016507 0ustar bloombloom !verbosity=1 !echo !limit=1000 !batch !short=20 !constituents=1 !spell=0 Finally, cover the cut with a clean bandage while it heals. As the wound heals, inspect for signs of infection including increased pain, redness and fluid around the cut. To learn more about first aid, contact a hospital or local organization like a Red Cross or Red Crescent society. King Nebuchadnezzar the Second probably built the gardens about two thousand six hundred years ago. Also on this list is the Colossus of Rhodes. Next on our list is the statue of the Greek God Zeus in a temple at Olympia, Greece. The Temple of Artemis at Ephesus is another ancient wonder of the world. Number six on our list was also built in what is now Turkey. It was so famous that all large burial places, or tombs, became known as mausoleums. The fifth Mughal emperor, Shah Jahan, ordered it built in Agra in sixteen thirty-one. They were built to honor an ancient king of Egypt, Ramses the Second, and his wife, Nefertari. In front of the main temple are four huge statues of Ramses the Second. Nearby is another temple that honors his wife, Nefertari. It too is beautifully carved out of solid rock. It, too, is beautifully carved out of solid rock. Today, we complete the story of the American Revolution against Britain in the late seventeen seventies. Washington knows that if Howe attacks, the British will be able to go all the way to Philadelphia. Washington wants to surprise the enemy early in the morning the day after the Christmas holiday, December twenty-sixth. The crossing takes longer than Washington thought it would. A few days later, he marches his captured prisoners through the streets of the city of Philadelphia. And in August, seventeen seventy-seven, General Howe captured Philadelphia. British general John Burgoyne surrenders at Saratoga, New York, in October 1777, as painted by Percy Moran. He surrendered to George Washington on October seventeenth, seventeen eighty-one. The Massachusetts Institute of Technology became an early leader with its OpenCourseWare project, first announced in two thousand one. These range from physics and linear algebra to anthropology, political science -- even scuba diving. Still, M.I.T. says the site has had forty million visits by thirty-one million visitors from almost every country. This followed a money-raising effort linked to the two hundredth anniversary of the United States. The first one airs on Sunday. Oscar Peterson played piano and wrote music. The International Monetary Fund estimated growth at five and two-tenths percent. In October the I.M.F. cut its estimate for global growth this year by almost half a percentage point, to four and eight-tenths percent. There are worries of an economic slowdown or possibly a recession in the United States. Another major issue for two thousand eight is what effect energy prices will have on economic growth. The violence this week in Kenya has thrown the usually peaceful country into crisis. On Friday Kenya's main opposition party, the Orange Democratic Movement, called for a new election. But Kikuyus have long ruled the country, both politically and financially. Kenyans on the streets feel discriminated against the equal share of the national cake and they are determined to equal the playing field in a democratic manner. After leaving the army, he worked for Playboy magazine for almost twenty years. The young man did just that, and the tree was happy. Shel Silverstein once said that he wanted to go everywhere, look at and listen to everything. Arkansas is rich in natural resources and has become a favorite place for older people to retire. Hawaii, far out in the Pacific Ocean, is the Aloha State. And in Rwanda, Engineers Without Borders is rebuilding areas destroyed during the nineteen ninety-four genocide. Her first project there was to photograph John Lennon, a member of the British band the Beatles. Leibovitz had imagined photographing the couple without clothes. Influenza is a common infection of the nose and throat, and sometimes the lungs. The virus spreads through the air when an infected person expels air suddenly. But the flu can kill. But they did not really know why until recently. American researchers say they now know why the influenza virus spreads in the winter and not in the summer. Researchers in New York carried out twenty experiments with guinea pigs to investigate how the virus spreads. A person who has suffered one kind of flu cannot develop that same kind again. The World Health Organization holds meetings in which experts discuss what kinds of flu viruses to include in the next vaccine. People in fifteenth century Italy thought sicknesses were caused by the influence of the stars. The flu spread in Asia in eighteen twenty-nine, then again in eighteen thirty-six. Experts say two hundred fifty thousand people died in Europe in that flu pandemic. The deadliest spread of influenza ever reported involved a flu that first appeared in Spain. Wild and farm birds often have a flu virus. Two hundred eight of them died. Two hundred and eight of them died. People would become infected with a virus their bodies have never before experienced. Bob Frydenlund says having a round barn means keeping alive part of the history of American farming. Last week, we told about structures built hundreds or thousands of years ago. A crown of white snow covers the top of the mountain most of the year. Or you could climb the mountain to get an even better look. In fifteen forty, Spanish explorer Garcia Lopez de Cardenas was searching this desert area for gold. The sunlight made deep shadows and seemed to change the shape of things every minute. Often, some areas of the deep canyon appeared bright red. Next we travel across the Pacific Ocean. Or doctors may misdiagnose it as asthma or another infection. It was not until after Lincoln was murdered, however, that the states approved the Thirteenth Amendment to ban slavery everywhere in the country. Another amendment proposed in the early nineteen hundreds was designed to change the method of electing United States Senators. But not everyone used it. If you look -- and smell -- carefully, you will realize that the wrapped forms contain several kilograms of spices such as cinnamon and turmeric. Mister Neto often creates works like this one that visitors can step into and explore using different senses. He shared an Emmy Award for outstanding movie made for television. Some experts say it could slow down service at McDonald's restaurants. But a year ago he warned that its fast growth had led to what he called the watering down of the Starbucks experience. Some neighborhoods have a Starbucks on every block or two. Testers from Consumer Reports thought it tasted better than Starbucks, and it cost less. Senator Hillary Clinton won the Democratic vote in the first primary state, New Hampshire, on Tuesday. The New York senator and former first lady hopes to become the country’s first female president. New Mexico Governor Bill Richardson dropped out of the Democratic race this week. Every week we tell about a person important in the history of the United States. No end to the lines of soldiers marching across the land. They have told of the soldiers’ fear and terror. How they suffered and died. And how they sang before and after battle. A woman lay asleep in her hotel room. It had just the right words for the great marching music. Illinois is The Land of Lincoln. The midwestern state of Indiana is called the Hoosier State, but nobody is quite sure why. No wonder the state legislature instead calls Indiana The Crossroads of America. North Dakota gets its nickname, The Flickertail State not from some bird, but from a little squirrel. This report says the Kenyan parliament has 126 seats and that the opposition won 95 of them in recent elections. As a young man, Jack Benny played violin in a vaudeville theater in his home state of Illinois. This week, we tell about vitamins. They are known as vitamins A, the B group, C, D, E and K. And, they said vitamin D supplements and calcium can protect the bones of older women. They said people should be sure to discuss what vitamins they take with their doctors. They found that those taking vitamin A, vitamin E or beta carotene supplements had an increased risk of dying at an early age. Grasslands need time to rest when cattle and other animals feed on them. In earlier programs, we told about ancient structures and beautiful natural places. But the cost could not be compared to the cost of a ship that had to sail from ports on the Atlantic Ocean to ports in Asia. link-grammar-4.7.4/data/en/4.0.affix0000644000175000017500000000177511246575207015767 0ustar bloombloom% % Affixes get stripped off the left and right side of words % i.e. spaces are inserted between the affix and the word itself. % % Some of the funky UTF-8 parenthesis are used in Asian texts. % In order to allow single straight quote ' and double straight quote '' % to be sttripped off rom both the left and the right, they are % distinguished by the suffix .x and .y (as as Mr.x Mrs.x or Jr.y Sr.y) % % 。is an end-of-sentence marker used in Japanese texts. ")" "}" "]" ">" » 〉 〕 》 】 』 "’’" "’" ''.y '.y "%" "," "." 。 ":" ";" "?" "!" "…" "”" "–" "‐" 's 're 've 'd 'll 'm ’s ’re ’ve ’d ’ll ’m ¢ ™: RPUNC+; "(" "{" "[" "<" « 〈 〔 《 【 『 `` „ “ ‘ ''.x '.x "$" US$ USD C$ £ ₤ € ₳ ฿ ₵ ₡ ₢ ₫ ₣ ₴ ₭ ℳ ₥ ₦ ₧ ₰ ₨ ₪ ৳ ₮ ₩ ¥ 호점 † †† ‡ § ¶ © № "#": LPUNC+; /en/words/units.1: UNITS+; /en/words/units.1.dot: UNITS+; /en/words/units.3: UNITS+; /en/words/units.4: UNITS+; /en/words/units.4.dot: UNITS+; link-grammar-4.7.4/data/en/4.0.fixes.batch0000644000175000017500000025642211526022265017061 0ustar bloombloom !verbosity=1 !echo !limit=1000 !batch !short=20 !constituents=1 !spell=0 !use-fat=0 % Example sentences showing BUG FIXES since link-grammar 4.1b % as well as demonstating bugs that remain to be fixed. % % Missing nouns. He picked up the game die. People use espresso to make other coffee drinks. Espresso is a coffee drink. % Pronoun fixes I'll hire whomever I can find. % Misc stuff I know which book he read. I know what book he read. Mommy loves me. Mother likes her. I am pooped. John is bigger than Dave is. John wants more cookies than Dave wants. It was covered with bites. Alice took a bite out of it. % phantom commas I have no idea, what that is. I have no idea what that is. % Phantom-and: % the comma implies an "and", which is not actually voiced: His shout had been involuntary, something anybody might have done. % gone The position we talked about is gone. The keys are gone. The popcorn is all gone. The good times are done and gone. It's now a gone desire. He slunk over to the water-fountain. % tend I tended to believe that shepherds tend sheep. I often tended, for years at a time, to believe that shepherds quietly tend sheep. % misc nouns, verbs The smelter weighs 30 tonnes. He wears a mustache on the sitcom. She's sharp-witted and funny. He resigned that post. Exxon discovers gas offshore. The line extends 10 miles offshore. Give it a shake. Take the two shakes over to table five. There was wind and rain. % "saw" w/ particle He tried to saw the wood. He tried to saw up the wood. We were sawing wood when it happened. We were sawing up the wood when it happened. % Assorted adverbial modifiers It has been unbelievably poorly managed. It has been notoriously managed. It has been notoriously badly managed. The store was poorly stocked. The play was dreadfully written. % Adverbial modifiers with EBm- There is absolutely no reason to believe American companies cannot compete overseas. There are rumours of a tightening of credit There are rumours of a collapse of credit What exactly do you want? What, exactly, do you want? What precisely do you want? % suddenly is a "manner adverb", sometimes clausal He sat up suddenly. He suddenly found soup in his lap. % double-commas on of_course It was, of course, his fault. It reduced chances that profits could equal thier earlier performance The motor ran flat out It happened during the 1988 first half % so He did not perform nearly so well. The price didn't drop nearly so fast. The price didn't drop nearly as fast. It went almost so well that we thought we won! % ready Is it ready? Do you have it ready? Do you have a more complex example ready? % enough We have quite enough work already, thank you! That'll be quite enough. That is quite enough rough-housing. That is enough rough-housing. Enough rough-housing! Enough! % other expletives What a lousy example sentence! % Proper names (entities) in the form of noun modifiers % The problem is that some of these appear in entity names % and thus must be explicitly listed in the dictionary. My name is Gilles de la Tourette. I live in New York City. I work for the First National Bank. I live near the San Gabriel River. I was born in the Armenian Soviet Socialist Republic. I was born in the Soviet Union. My insurance carrier is United Healthcare. We took the ferry to Block Island. The man from Federated Conglomerates is here. I work for the Great Southern and Western Railroad. Central Texas is hot. North Sea crude was up. Korea First Advertising Co. stock is up. Quantum shares were up in trading. The Orange Democratic Movement called for a new election. It lies in the western Pacific Ocean. It is in the Gulf Territory I live near the Orkney Islands He is the man from Syndicated Features He represents the Undersea Exploration Company He represents the Equatorial Antarctic Bank % Some given names can be proper names The late Mr. Tom will be sorely missed. % Proper name modifiers It dates back to fifteenth century France. % Biological texts commonly have adj-noun-adj-noun chains We extracted human umbilical vein endothelial cells. We extracted smooth muscle myosin heavy chain protein. We extracted peripheral blood mononuclear cells. It is located on the nuclear envelope inner membrane. We extracted simian virus large T-antigen. We collected HTLV-I infected T-cells. They are a three times defeated team. % Verbs taking prepositions He dished it out at the unsuspecting onlookers. I ladled it carefully into a bowl. You should ladle it out. He ladles it with a large wooden spoon. He was ladling the molten steel when the crucible tipped. He ladled the molten hot metal into the mold. It was molten hot. It was piping hot. It was devilishly hot. % mass nouns that were incorrectly classified as count nouns. % Nouns that can be used in an indefinite manner. I will give you a piece of armament. I will give you a piece of bagel. I will give you a bit of courtesy. Give me a piece of almond. Give me a bit of anaesthetic. Give me a piece of apple. He broke off a piece of bagel and gave it to me. A piece of asteroid broke off. Add one spoonful of avocado. I ate a bit of biscuit. She exposed a bit of bikini to us. A piece of cactus went sailing through the air. There were three cacti in front of us. Add a cup of finely shredded carrot. A length of chain was wrapped around the tree. He left town early next morning. I gave her a check for deposit. % More nouns that can be indefinite .. magazine, crisis, % musical instruments. He wrote for Playboy magazine. I know how to play guitar. The violence has thrown the country into crisis. The violence has created a crisis. % level as indefinite noun, adjective, etc. % Unfortunately, this leads to a combinatoric explostion when % 'level' is a modifier: "He keeps a level head in an emergency" The process uses abrB transcription as an indicator of Spo0A~P level The platform was at knee level. % 'family' as a mass noun They are like family to us. He is like family to us. % Test cases for noun countable/uncountable nouns: I have much furniture. *I have many furniture. % Test cases for a/an usage with vowels/consonants: *I ate a apple. I ate an apple. I ate a little apple. *I ate an little apple. I ate a banana. *I ate an banana. *He has quite a imagination. He has quite an imagination. *He has such a imagination. He has such an imagination. *That is more of an challenge. That is more of a challenge. % nouns not in words.n.1 *an majority agree a majority agree *an number agree a number agree *it's an kind of test it's a kind of test *it's an sort of test it's a sort of test there's an argument brewing *there's a argument brewing he gave me an excuse *he gave me a excuse That is an issue *That is a issue *There is an way There is a way *There is an place There is a place That bitch did it! % Special-case superlative adjectives % "favorite" can take determiner "a" Arkansas has become a favorite place for older people to retire. Global Trotter, a favorite, seems unlikely to place. % Superlatives without preceeding determiners. He likes you best. He bores you most. He bores you the most. He likes you least. He likes you plenty. Mr. Bingley may like you the best of the party. He may like you best of all. He may like you the best of all. He may like you least of all. He may like you the least of all. He may like you most of all. He may like you the most of all. % Interuptives with preps. These probably should take CO links. You, least of all, should know. You, most of all, should know. You, out of everyone, should know. You, at least, should know. This is the man who, in some ways, I would like to hire % Color names can be nouns as well as adjectives: She prefers red. Blue is the new black. % bright.e in an adverbial role: some areas appear bright red. some areas look bright red. % Verbs acting as adjectival modifiers (A+ link): % Everything in v.2.3, v.4.3, v.6.3 and v.8.3, and special cases: This has become a very politicized deal. You need to provide an ordered list. The given reference is incorrect. The provided reference is incorrect. The allied army is on the move. The adjusted balance is incorrect. The poured concrete slowly hardened. The wired connection has gone bad. The telegraphed orders never arrived. Do you have any ruled paper? I gave him some ruled paper. % Pg+ links between verbs and gerunds He imagined hitting the ball. She imagined photographing the couple. He feared hitting the wall. I emphasize hitting your targets in my lectures. He confirmed missing his targets He regretted firing the man. I regret really smashing it. He disputed punching the man. I recollect raising the bar for that team. I envision building a very tall building. He tried stopping the man. I enjoy running the show. % Here a Ce+ link is used to attach to the subject % i.e. the gerund, acting as a noun. e.g pushing, trusting He conceded pushing the button was a mistake. We concluded trusting him was a mistake. We concluded that trusting him was a mistake. % come, came with gerunds The dog came running at the master's call. The dog comes running when he's called. The ball came flying at his head. % gerunds with determiners It's a polishing of prose. It is a thinning of the herd The event features a running of the bulls % assorted mis-classified verbs. He is allied with the Reds. % Sentence openers % Some of these need to take the Z- link, when % the "I" is optional. But others take the Cs+ link. % Said, guessed do the right thing here... As guessed, he was lying. As I guessed, he was lying. As I reckon, it won't happen here. As I sensed, it was all a lie. As I said, it was all a lie. As I verified, the switch was off. As I trust, it's all over now? It's all over, I trust? Sure enough, there it was, as I had sensed. Sure enough, there it was, as I had guessed. There it was, just as I had said. % zero-subject/phantom-subject in sentence opener As mentioned before, we are creating a business service. % Buggy opening clauses Some days, the trains run on time. Some of the time, I really hate it. The rest of the time, we goof off. Part of the year, we goof off. % up as prep vs. up as verb He forced it up the stairs. He willed it up the stairs. He jammed it down his throat. He jammed it up into a corner. He upped the bid. We are planning to up the bid. Ante up! % Optionally transitive verbs taking particles that were mis-classified. Water and oil don't mix. The computer doesn't boot. The computer doesn't boot up. Canvas is for painting on. Use a piece of paper to write upon. A piece of paper can be used to write upon. Once he goes, we can clean up. He really cleaned up! I watched the bomb blow up. We pushed the button, then it blew up % stay, bite is optionally transitive The judge stayed the prisoner's execution Michael stayed his anger I stayed the week with my parents We stayed the duration of the game. Mere rain will not stay the mailman. That dog will bite! % resolve can be intranstive He resolved on a course of action He decided on a course of action % drink is optionally transitive we drank we drank up we drank up all the milk Drink up! % null-of -- "of" is sometimes elided; use the ALx link. he has drunk all of the ale. he has drunk all the ale. he has eaten all the chocolate. % Some ditransitive verbs of various complexity He poured me a glass of champagne. *He poured me. He sang me a song. *He sang me. He sung me a song. He had sung a song. *He had sang a song. He will sing you good night. She was singing me a song. She sang soprano for the Philharmonic. Oscar Peterson played piano and wrote music. He wrote for piano and flute. He plays marimba and a lot of cowbell on that track. % more ditransitive and etc. I stared him down. We shouted him down We shouted him down off the stage. He pushed him down. He shouted out. He shouted out in pain. He cried out. He cried out in pain. He was shouted off the stage. They yelled and booed him off. She stalked off. She stalked off in a huff. She stalked him all day. She stalked him day and night. *She stared him She looked him over. She carefully looked him over when he got back to London. She carefully looked him over in London. *She looked him. *She shouted him. *She cried him. She sounded him out. She sounded him out when he got back to London. He drew me a picture. She bore me a child. She bore me. I dare you. She dared me. She dared me to jump. She had written him off. She had told him off. He will draw you a check later today. He wired me the money yesterday. He telegraphed me the go-ahead. She waved me off. The policeman waved me on. We danced 'til dawn. We danced the samba 'til dawn. They danced the whole night through We danced the night away. They danced up a storm. She danced me a little dance. They danced away on a cloud. They danced off on a cloud. We danced it up. She waved me goodbye. She waved me good bye. He bid me hello He bid me goodnight He bid me farewell. He bid me welcome. She shouted him goodnight. She kissed him goodnight. She wished me a happy birthday. We will have to sit it out The waitress sat us down at the table The coach sat me out for the inning. She is going to stand you up. % More verbs taking prepositions We will party until dawn. We will party hardy until dawn. We will party on 'til dawn. Let's party! We boozed the night away. We boozed it up. We will booze it up until dawn! We clowned the night away. We dozed 'til noon. % imagine is a lot like vc-see, vc-watch. John imagines himself lost in the woods. John imagines himself singing from a mountaintop I imagined myself dozing on a sunny beach John imagined Mary as innocent as a lamb. % sit, stand must take Pa+ link ... The house now sits vacant The house now stands vacant The house now sits empty The dog sat very still The dog sat up. The dog stood still. The dog looked tired. Stay a little while. Stay a while. % More Pa+ links: He was presumed innocent He was presumed innocent of the crime He was made aware of the crime He was declared dead He was declared dead after a cursory examination. he was declared dead of suffocation. He was judged innocent we judged him as innocent as a lamb He was judged innocent of the crime % turn - ditransitive with adjective (predicative adjective) Pa**j link The thought was turning him green with envy. The cancer treatment was turning John bald. The cancer treatment was making John bald. The treatment turned him bald in an instant. Who did you turn envious today? The witch turned him green. % more Pa**j links: The doctor declared him dead on arrival. The doctor declared him insane. The doctor made him insane. After that failure, we feared him untrainable. We presumed him innocent, for now. We suspect him incompetent in such matters. The loud music drove him insane. You are driving me crazy. You are making me crazy. The thugs beat him senseless. The cold froze the mud solid. % Like the above, but can only be used with "dead" He was slain dead by the arrows. % paint, color, with color names; constructions like % "pale yellow" mean that the color names are nouns (O*n) and % not predicative adjectives (Pa**j) Just paint it white Just paint it all white Just color it black Please paint it pale yellow Paint the car bright green. The house is painted all white The house was painted pale yellow The house was painted a fading yellow The house was painted a faded yellow The house is painted a sublime shade of yellow % act out, act up He is going to act out until he gets what he wants. Call me if it acts up. The motor was acting up. He is acting out. He is acting out his fantasies. % beckon She beckoned to him. She beckoned him over. She was beckoning in that dress. % More verbs taking prepositions He pulled himself upright. He uprighted the fallen vase. It flexed once or twice in her hand. The economy weakened as prices spiraled up. Shares slid $2.66 in Big Board trading. Issues tumbled 4.2% last week. % Begin, began It began in Germany. It begins here. It begins now. It has begun in Cincinatti; it won't be long now. It really began in Chicago in the spring. It really began in Chicago last spring. % subject-verb number agreement *She are going shopping. % Assorted prepositional difficulties. A bucket of chum sat near the tackle box. It was a sad bit of commentary to read. His works disclose a mastery of composition. There's a lot of cowbell in that song. There is a bit of cowboy in him. There's a bit of creep in the mission statement. He had to eat a bit of crow. A length of cutlass gleamed in the sunlight. I had a bite of donut before going out. He had a bit of egg on his face. It was as frail as eggshell. The ice was green as emerald. He ruled by fiat. We saw a school of flounder in front of us. There was a bit of gaudiness to the show. He had a bit of gumshoe in his cleverness. There was a lot of gyration in the Senator's words. I asked for half-a-pound of hamburger. There was a tone of harlot in her voice. There was a pretense of hero in his swagger. He ladled out a bowl of homily in his sermon. We played a game of hoop. The truck carried 2 tons of nitrate. He nibbled on oatcake. Miles of ocean lay before him. It was painted in drab olive and oat. We ate omelet for lunch. He suddenly found pancake in his lap. A pinch of parsnip finished the recipe. We ate pate on crackers. It was made of pearl and oystershell. He spoke pidgin. The platter was swept with an ocean of prawn. A plate of quiche drifted by, followed by a tub of quince. Then we moved on to rabbit and rarebit and a salad drowning in ranch. We drank sake all night. A wall of shrubbery faced us. She fried breaded smelt for dinner. We went hunting squirrel. A bit of swimsuit glittered under her tank top. Thunderclap upon thunderclap rattled the windows. Waterfowl filled the sky. Some Jolly Rogers taste like watermelon. It smells like someone is smoking weed. It tastes of yam. He clutched a purseful of złoty. A chair is something you sit in. A bed is something you sleep in. He breaded the chicken in a mixture of flour and breadcrumbs. I had an off day. Kim eats pizza with chopsticks. % Somewhere is broken ... Off in the distance, a dog barked. Far in the distance, a dog barked. Somewhere in the distance, a dog barked. Somewhere, far away, a dog barked. Somewhere else, a cat meowed. The ticking came from somewhere near. We are finally getting somewhere. The record skips somewhere about halfway through. % strong.e adverb The Miami market is coming back strong His approaches were coming on strong. The party was going on strong The party is still going strong % post-verbal adjectives (really, adverbs ... ) The crisis is bleeding the bank dry He slowly bled the helium tank He bled off some speed with a sharp banking maneuver She slowly wrung the towel dry She slowly wrung the towel out She wiped it clean She wiped the table dry enough. She ironed it flat He combed his hair straight back He nailed it flat to the wall He pushed him flat against the wall He hit it flat on the head He hit me hard on the head She knocked me blind off my feet He robbed me blind. I liked her well enough % tired, fresh, refreshed in a post-verbal use We will arrive sooner than they We will arrive more tired than they. We will arrive a lot more tired than they. We will arrive a great deal more tired than they. We will arrive a little more tired than they. We will arrive less refreshed than they. We will arrive less happy than they. We will arrive less fresh than they. We will arrive tired. We will arrive exhausted. % clean.e as a bona-fide adverb She clean forgot to take it back % drug culture vocabulary It smells like someone is smoking maryjane. It smells like someone is smoking pot. We brought back a kilo of boo from Mexico. He took a gram of snort to the party. % Problems with "that" % VP that CLAUSE: The response was that there are several barriers that have to come down. % "The thing that VP is that CLAUSE" The only thing that has prevented a collapse in the dollar so far is that it is the currency reserve of the world. The thing that has prevented a collapse is that it is the currency reserve. The thing that is funny is that it is wrong. % shame commonly used as a count noun. He felt a deep shame. The shame of it is that it was a good idea. I say it's a damn shame that he left. It's a shame that the deal collapsed. The whole thing is a crying shame. The whole thing is a fucking shame. The shame of it is that it was a good idea. The shame of it is, is that it was a good idea. The shame of it is that the lynchpin failed. The crux of it is that the lynchpin doesn't do anything. The crux of the plan is to take the fort. The shame of the priest is on all our minds. The idea of it is to act first. The shame of it is that we must act first. The crux of it is that we must act first. The crux of the plan is that we must act first. The idea of it is that we must act first. % However, words.n.3 needs to be culled: *A shame is easy to understand. It demonstrated a certain aloofness. It demonstrated a certain adroitness. It demonstrated a certain aggressiveness. *It demonstrated a certain acetylene. *It demonstrated a certain aluminum. The acetylene exploded. *The adroitness exploded. % bug fixes for google-code bug tracker issue 13 John is pretty insanely stupid. John is rather excrutiatingly dull. John is rather exceptionally dull. John is rather unbearably dull. John is rather far from smart. John is rather incredibly dull. John is altogether incredibly dull. John is altogether amazingly quick. John is altogether stunningly dull. John is altogether stunningly inept. John is very atrociously gluttonous. John is rather quite dull. John is notably rather dull. John is plainly rather dull. John is obviously quite dull. John is quite fashionably late. John is so infernally frustrating. John is very unacceptably insubordinate. John is rather very insubordinate. John is rather far from dumb. John is rather quite dumb. John is altogether a bit boring, wouldn't you say? John is incomparably smarter. John is unflinchingly direct. John is undisputably the king. John is undeniably the winner. John is unarguably the winner. The car is unimaginably faster. The car is ridiculously faster. The Wehrmacht is unacceptably more dangerous. Rockefeller is fabulously richer. This computer is relatively more expensive. It's an inherently better method. It's a marginally less productive well. That one is a marginally better choice. It's a moderately faster way of doing things. John is rather incomparably smarter. It's a rather inherently better method. John is quite certainly a better choice. % Similar buggy sentences: *John is nimbly strongly dull. *John is boundlessly charmingly polite. John is boundlessly, charmingly polite. John is stupidly, insanely dull. % done, finished, started I have started working. I will start working. I am done working. I am done being angry. I am done with being angry. I am finished being angry. I am through being angry. We took a through flight. It's a done deed. % Some idiomatic expressions involving "doing" % Somewhat inconsistent, though. I am doing fine. I am doing poorly. He is doing ok. He is doing okay. He has done very well. I am doing much better, thank you. It is going terribly. It is going well. I'm feeling awful. % Expressions with direct and indirect objects I asked him a question. I told Jim a story. I want it back. I want the book back. I want it now. I want the book now. I want the book here, now. I want it green. I want it shiny. I wish it was shiny. I want it brilliant. I want the review to be brilliant. I want it done. I want the job done. I want it finished. I want the job finished. I want it over with. I want these troubles over with. I wish it was over with. I want it completed. I wish it was completed. I want it fixed. I want it fixed up. I want it cleaned up. I want it gone. I wish it was gone. I want to be rid of it. % Passive subjects with objects. I was asked a number of questions. I was told that crap, too. I was told all about it. I was told the whole story by Maybeline. He enquired my whereabouts. He inquired at the door. % threat.n singular and mass. The old system is in threat of breakdown. The area remains under severe threat of fire. He poses a threat to security. % Good sentences ... I heard a bark in the distance. % verb modifiers for talk, consist, etc. He talked quietly of revolt. He disapproved passionately of sex. He talks, mostly of revolution. It consists largely of sand. He talks mostly about the weather. He talked up a storm. he talked mostly to Ann. he talked a mean streak longer than I'd hoped He is talking up some chicks. He talks a lot. % Problems with "nightly" He eats with me nightly. He eats with me daily. He prays with me daily. He barks at me nightly. He sits near me nightly. He sits near me occasionally. My boyfriend dresses very simply. % Buggy classification of words.n.3 vs. words.n.4: There was an abundance of poverty. There was a continuity of action. There was a certain crudity to his actions. It showed a certain abundance. He had a certain panache. He sank into a delirium. It was a detriment to further action. He demonstrated a certain ignorance. We were unable to find a common ground. % Time-related verb modifier He does that sometimes. He does that some of the time. He does that all the time. He does that all of the time. He does that a lot of the time. He does it all of the time. He does it all of the day. He does it a little of the time. He does it a little bit of the time. That happens none of the time. That's what happens plenty of the time. That's what happens the rest of the time. That happens the rest of the time. That's what goes on the rest of the time. Long hair hides his eyes all of the time. Sunglasses hide his eyes all the time. Sunglasses hide her eyes a lot of the time. Sunglasses hide her eyes a bit of the time. A hat covers his head some of the time. A crown of snow covers the mountain most of the year A crown of snow covers the mountain a part of the year The trains run on time part of the day He is a part of the problem. Part of the problem is his attitude. It happens every other time. It happens every time. It happens each time. It happens each time I hit the brake. It happens not every time I hit the brake. It happens ever place I go. Let's do it some other time. Let's do it some other way. Let's do it some other place. That's what happens most other times. I see that happen most places I go. % Filler-it and the SF link: It is reasoned that the vast concentration of the business information market in EMEA resides within Europe. It is whispered that the vast concentration of the business information market in EMEA resides within Europe. it is reasoned that this statement is true. it is hoped that this statement is true. It was hinted that our actions were inappropriate. % buggy coppula and copula contractions % % Consider "Here's the ball." We have two choices: SFst+ as a filler-it, % or the more questionable [Wq- & PF+]. Note that (Wd- & PF+) is barred % by the post-processing rules. Maybe PF is reasonable.. but SFst seems % better at the moment. % Here is the ball. Here's the ball. There is the ball! Where's the ball? Here's Johnny! Nearby is another temple that honors his wife. Close by is another temple. Nearby are more ruins. There goes the neighborhood! There goes the cutest guy ever! There goes one of the strongest competitors this sport has seen. There goes the biggest loser ever. There went the cutest guy ever! Oh great, there went my ride. Here goes nothing. But for the grace of God, there go I. % copulas with verb target: All he ever does is bark. All he ever does is whine. All he ever does is complain. All he ever does is drink. All he ever does is schmooze. All he ever does is lounge. All he ever does is watch TV. All he ever does is listen to the radio. All he ever does is sit in front of the computer. All he will ever do is complain. All he will ever do is go drinking. One of the things you do when you sleep is dream. One of the things you do when you sleep is to dream. Something you might do while attending school is learn. *Something you might do while attending school is to learn. Something you need to do before you watch TV is turn on the TV. One of the things you do when you stop your bicycle is apply the brake % Copulas with noun target: All he wants is luck. All he wants is a big cigar. All he ever wants is to get lucky. All he ever touched turned to gold. % Contractions. He's out jogging. He is out jogging. He's out biking. He's out running. He's out for lunch. He's out on the town. % "I need help with that." I need help w/that. % as .... It is no longer portrayed as having the power to protect against sin. You are portrayed as having the power to make decisions. You are portrayed as wanting the power to make decisions. You are portrayed as needing the power to make decisions. Information on the Internet may come across as authoritative. You are as authoritative as he is. You come across as authoritative. He was so foolish as to lie. Ridiculous as it seems, the tale is true. % Problems with "go": Let's go shop. Let's go shopping. Let's not go shop. Let's not go shopping. Let's not go. Let's not. Let's go sailing! Let's go drinking! Let's go smoke up that joint! Let's go smoke that joint! Let's go drink up that bottle! Let's go drink that bottle! Let's go sail up that lake! Let's go swim. Let's go for a swim. Let's go for a drink. Let's go for a smoke. Let's go eat. Let's go talk to him now. Let us go, then, you and I. Why don't you go jump in a lake? Why don't you just go jump in a lake? Why don't you go fall in a lake? Oh, go jump in a lake! Let's go fall in the water! Let's go jump in the water! Let's go hike that trail. Let's go hike up that trail. Let's blow this pop-stand. Go bring me that ball. Just go bring me the paper. I'm going drinking. I'm going running. I do see it now. % Buggy parsing of "all but", "nothing but" Nothing but ocean lay before. We heard nothing but silence. Nothing but scorched earth remained. All was lost but one table. All was lost, save for one chair. All but one tree remained untouched. But for want of a nail, the shoe was lost. All but one tree was lost. Everything but one tree remained. We hoped for the best, but were disappointed. There was nothing but pain. % Prepositional difficulties It fell when the clock chimed. % Inverted subject-object The treasure lay below the ground. Below the ground lay the treasure. In Xanadu did Kubla Kahn a stately pleasure dome decree. % Confusion between K- and MVa- links -- % "He turned left." uses the MVa- link. % "He turned around", "he jumped around", "he jumped up" use "K" % as a particle link. % "He dodged sideways." uses MVp He turned left. He angled left. He angled sharply left. He angled around. He dodged left. He jumped left. % about can be particle (K- link), except that "about quickly" % and "quickly about" are both allowed, and K- only allows the first, % and not the second. He looked about. He turned about. The sailboat swung about, coming to a new bearing. He jumped about. % double-prepostion type constructions % adverbs w/ reversed preposition locations % Using MVa- seems like the only solution... People glanced fearfully around at the impassive troops. He looked around fearfully. He looked fearfully around. He looked about fearfully. He looked fearfully about. % Set phrases involving "so" -- this is an exhaustive list ! % There are no other verbs that take "so" -- should there be % a special link for this ??? I assume so I believe so I fear so I hope so I imagine so I presume so I say so. I suspect so. I think so % Third-persom -- idiomatic It seems so. % Particles w/ various optionally transitive verbs % XXX Many of these are wrong, esp the "up to" "down to" % these should be properly marked as prepositional, since % up/down/in/out really are action-direction modifiers. % constructions He walked the dog. He walked up to the counter. He walked out of the house. He sailed the boat into the pier. He sailed up to the bar. He clicked the mouse. *He clicked up the mouse. He zeroed the counter. He zeroed out the counter. He marched his prisoners through town. Elvis was all shook up. Elvis was all shaken up. He will kill again. The flu can kill. Let's kill some time on Sunday. I will kill him. The show airs on Sunday. The show will air again on Sunday. We've chosen to adopt We will adopt We will adopt again. We will adopt a child from Uruguay. % feed taking particle Horeses feed on hay. People eat but animals feed. % tell taking prep Today, we will tell about ancient structures. Yesterday, we told about ancient structures. They have told of the soldiers' fear They have talked of the soldiers' fear % More particles Your grammar should be worked on. Your grammar should be worked upon. % Transitive sports activities I biked Johnson Creek. We walked Shoal Creek. We kayaked Town Lake. We skied Big Sur. We're kayaking Shoal Creek tomorrow. Biking feels good. He wants to go surfing. He has gone to Hawaii to go surfing. We will canoe the rapids today. I will swim the sea. He swam three laps. He has swum the English Channel. We have swum out to the island before. Let's swim. Today, we will snorkel the reef. Today, we will snorkel out to the reef. Today, we will go snorkelling. Today, we will go skin-diving. He dove down to the bottom of the sea. Roselyn et al. wrote about manga. He went on and on, etc. The v.v. is true. Whenever he comes, she goes, and v.v. It was he that did it. John likes joking around. He's right, isn't he? Who am I? I don't think so. I, uhh, don't think you're right. Gosh darn it! % Rnx+ on because, only. Because I want to talk. Because I said so. Only I say so. This sentence parses badly. The bad parse was due to the improper parsing of the sentence. I would not choose to. Not that I would choose to. It sure is. It sure is great. The book sure is great. The sushi was best. How about the bubble tea? How 'bout them Cowboys? The results bear out the method The results bear looking at. It bears looking at. He talked longer than usual. He is taking longer than usual. He is working harder than usual. He hit harder. He hits hard. % verbs taking prepositions We're going to bike over. We'll jet on by. They sailed on by. Just scroll down. That just reeks. That is just the cat's meow. He stands accused of misconduct. % Awake and asleep as adverbs He was jarred awake. We shook him awake. He jerked awake at the sound. The sound left him awake. We left him asleep in the tent. We left him sleeping in the tent. % Similar to the above, but with preps We stood it upright. We stood it up. He picked up the fallen lamp and stood it up. It was obvious that he would do it. It was obvious that he'd do it. % "is" copula with mass/uncountable nouns There's barf on the seat. There is water on the table. there is a glass on the table. There is dirt on the floor. there is egg on your face there is a rumour going around. there is dirt going around. There is blood on his hands There will be blood on your hands There is a wart on his hands There are warts on his hands What the beep was that? We'll cab on over to the restaurant later. He waited in the check-out line. The wind gusted from the north. He must pee into the bottle. He'll stride up to the bar, pretending he didn't see a thing. We'll uplink tonight. That will reek tomorrow. That reeks of favoritism. Kids will frolic in the summer. He would labor over it for hours. That circuit will jitter intermittently. % Idiomatic usage of "of" You must beware of the tiger. You must be wary of the tiger. You must be afraid of the tiger. You must be cautious of the tiger. You must be cautious around this apparatus. You must be careful with this apparatus. You must be curious about the process. You just scrolled past it. What have you gotten into? What have you gotten yourself into? % Questions that want "from", "to" as prep. Where did the car come from? Where do the words come from? Who have bought your flat from? Where was she from? Where is the figure taken from? But where will you get them from? Where has this letter come from? my father asked. If the student does not recover the animal from anaesthesia, where will the experience of post-operative care come from? Where can I possibly get them from? Can you tell us where those strange ideas came from? Where are you coming from? Where were you coming from? Where is she coming from? Where am I coming from? Where does she come from? % These need R+ & Bsw+ in "where" to parse Where did they go to? Where have they gone to? *They have gone to. So, where did they come to? Where does it go to? What does it come to? What does it go to? *I want to thought about this. So, what does it all come to? So, what does it all come to, now? So, what does it all come to, brother? *Does it all come to? *Does it come from? Does it come from France? Where did that book go to? Where did that book get to? % Zappa/Grand Wazoo Where did they come from? Where did they go to? What has become of them now? How much was the leakage from the drain in the night? Who are those dudes in the back seat of Calvin's car? What did they do when they got off the car? Did they go get a sandwich? Did they eat in the dark? What did they do with the waxed-paper bundles? % Sentences ending in "to", null infinitive % i.e. "I want to infinitive" but the verb is missing/implied. % Fixed by forcing "to" to be at end of sentence I want to, also. I want to, too. Because I have to. Because I want to. But I want to. I wanted to, but I didn't. I want. Yes, I'd like to. Yes, I'd love to. No, I wouldn't. Thank you, I'd love to. I'd like to, I want to. *I like to pliers. *I like to purple. *I like to many. % Clausal complements, fairly idiomatic in form ... The emperor ordered it made The emperor suggested it sold The advisor urged compromise The advisor urged for compromise The advisor argued for compromise The advisor urged it done I assumed it done. % Hmm. Things following a comma, but in a different register ... % I think the clause needs to be its own domain ?? % Missing/implied subject He stepped forward, gun raised. He stepped forward, hand out. He stepped forward, his hand out. He looked up, heart racing. He glanced away, hands trembling. The monkey reached, stick extended, for the banana. He stepped forward, smile broadening. He stepped forward, his white teeth glittering. % Even when it does parse, the MV link looks wrong to me ... % the clause needs to be its own funky domain, I think. He glanced away, looking pale. He stepped forward, putting his hand out. % Post-nominal modifiers with TO+ link: The inability to laugh signifies trouble The inability to laugh signifies mental illness The disability of John means he is slow The inability for the rejected to laugh signifies their paranoia at being noticed. % Post-nominal modifiers, MX- link to "to be" The drill, to be provided, will be use to take soil samples. The drill, soon to be provided, will be use to take soil samples. The stock, to be purchased on the open market, will be added to assets. The parts, being obtained as we speak, will arrive this afternoon. % zero-copula (missing "to be") post-nominal MX broken-ness: The event, being historically insignificant, will soon be forgotten The event, historically insignificant, will soon be forgotten The event, historically important , will be long commemorated the argument, fundamentally flawed, was soon destroyed the argument, being fundamentally flawed, was soon destroyed % Impersonal, passive "be" linking to passive participle. It is normal that such directives be worked upon. It is normal that such directives are worked upon. It is normal that such directives be acted upon. It is normal that such directives are acted upon. It is normal that such directives be acted upon quickly. It is normal that such directives be quickly acted upon. It is normal that such actions are taken. It is normal that this action is taken. It is normal that this action be taken. % problems with "once" (once as adjective, noun) Once will have to do. You can go just this once. You can go just this one time. It was the once capital of the nation. % Archaic, idiomatic "be" Peace be unto you. % Archaic use of "be" with passive participles: Where be those roses gone which sweetened so our eyes? They be shooting and fishing out at the Forestry Lakes. % Archaic fairy-tale / children's book registers (inverted subject/object) Far out in the sea lived a fish. A fish lived far out in the sea. % old as noun The seven year old kicked me in the shins. He is a seven year old. The seven year olds ran rampant. The seven year olds ran wild. % Named days of week. The market fell 156.83, or 8%, a week after Black Monday. We'll party all night on Fat Tuesday. We'll come for dinner on Ash Wednesday. % Adverbs that typically follow a verb. The horses run free now. The horses run hard. He runs hot and cold. The engine is running very hot. The door is locked tight. The window is wedged open. The window is wedged wide open. He blew the case wide open. The door swung wide open. The door slammed shut behind me. The bolt is screwed in tight. The bolt is frozen hard in the engine block. He cranked up the volume loud. He cranked up the volume way loud. He hit the nail pretty hard. He wacked the ball pretty far. I wonder how hot the motor ran. I wonder how open he plans to be about the truth. He is very tight with his friends. Will he be free with his praise? How free will he be with his praise? How open will he be with the truth? How tight is that connection? How loose is that connection? % Measurement units There is a nineteen minute gap in the tapes. There is a 12 year gap in the records. There is a 10 millenium gap in the geological records. The explosion blew out a 12 inch hole in the side of the tank. It shoots 12 picosecond pulses. It shoots a 12 picosecond pulse. It is a 12 watt motor. She screwed in a 40 watt light bulb. She screwed in a forty watt light bulb. It is a 12 m² apartment. The rent is $150 per m² per month. The cost is $150 per meter. The cost is $150 per yard. The rate is 10nm per msec. The differential rate is 5 volts per MeV. He queued up another 45 rpm record. India is building a 450MW nuclear plant. The temperature rose by 12°C. It is 12°C outside. My El Camino gets about 12 MPG. My El Camino gets about 12 mpg. We bought a 12 pound pumpkin for Halloween. We bought a 12 dollar pumpkin for Halloween. He got himself a 50 dollar haircut. That car goes 90 MPH. Give him 5 cc's of morphine, stat. The crystal is growing at a rate of 2mm per millisecond. The slew rate is 12mV per microsecond. He raced off at 90 miles an hour. The aircraft was moving 90 miles per hour. It goes 90 miles an hour. It moves 90 miles an hour. It went 90 miles an hour. That will cost you very nearly 12 drachma. It goes for 12 to the drachma. We sell them for 12 per drachma. That will cost ¥2400. That will cost 2400 yen. We bought 200ft. of lumber. We bought the last 200ft. of lumber. We bought 200sq.ft. of plywood. It is 12ft. long. The voltage fell almost 50mV. That will cost hundreds of lira. That will cost zillions of lira. The ferrite core is wrapped with 24gauge wire. The last 50 ft. are bad. Some 50 ft. are bad. Nearly 50 ft. are bad. The last 50 ft. of the cable are bad. The leftmost 50 ft. of the cable are bad. The protein (50 kDa) is examined. The protein (20 to 50 kDa) is examined The protein (1 kDa) is examined A miner's inch is defined as 1/60 ft³/s. A miner's inch is defined as 1/60 ft³ / s. A miner's inch is defined as 1 / 60 ft³/s. A miner's inch is defined as 1 / 60 ft³ / s. A miner's inch is defined as 472 mL/s. A miner's inch is defined as 472 mL / s. % Lack of space between numbers and letters causes problems It was 10:30AM in the morning. It was 10AM in the morning. *It was 10:555:88 in the morning. Bids must be received by 1 p.m. EDT Bids must be received by 1 PM, CST Bids must be received by 1PM, CST % Poorly parsed date expressions. I saw him on January 21, 1990 I saw him on January 21st, 1990 It happened on October 17th, 1781. It happened on October seventeenth, seventeen eighty-one. It happened on October seventeenth, seventeen oh-one. It happened on October seventeenth, seventeen oh one. It was produced by 21st Century Fox It is a two cent needle That's a one dollar cigar That's a 1 dollar cigar That's a $1 cigar The IMF estimated growth at five and two-tenths percent. % XXX FIXME: % Note that the handling of prepositions is incorrect with regard to % measurements: the linkage should be to lumber, not feet. That is, % "12 feet of" is a modifier. Similarly, "hundreds of" should be a % modifier to "hours". But this can also be ambiguous: consider: % "The rate is 10 nm per one msec of time" -- here "of time" is % indeed the modifier. Hmmm ... % % Note also: parse confusion between "feet.n" and "feet.i" % and so "feet.n" should be removed/trimmed back from dict. We bought hours of time. We bought 12 feet of lumber. That will take hundreds of hours of effort. That will take hours of effort. That will take hundreds of yards of cement. It will take several inches of movement to clear the rigger. It will take several foot-pounds of strain before it cracks. That will require 10 square yards of paint. That engine generates hundreds of foot-pounds of torque. The rate is 10 nm per one msec of time. It cost US$ 14 million. It cost $14 million. % Prepositional modifiers with distances. It is 5 miles distant. It was 3 miles under. It was 3 miles east. It was about 3 miles out. It is a few miles over. % XXX These parse, but there's an explosion of parses generated. % Basically, miles.n is fucking things up -- we ned to trim it down. It is between 5 miles and 15 miles long. It is between 5 miles and 15 miles distant. % post-fixed number handling with NM link It started on day one. The experiments ended on day 22. I fear the number 13. The number 12 is a lucky number. I fear the dirty dozen. % Post-fixed numbers can act as (singular) determiners The exon is spliced with the intron. Exon 30 is spliced with the intron. * Exon is spliced with the intron. Exon 30 is spliced with intron 40. Oven two is not heating evenly. Assembly line 7 had a work stoppage this morning Flight 442 was delayed. John, age 40, is a douchebag. % Can have numerical modifier *and* a determiner simultaneously: The sigma factor sigma 35 is homologous. % Nested modifiers too: The sequence is omega 1 beta 2 alpha. % Post-posed romman numeral modifiers, and letter modifiers: The say that Pope Pious XII takes vitamin D supplements. Vitamin D supplements are good for you. William Petre was Secretary of State to Henry VIII. % Numerical ranges It takes 2 to 3 times the effort. It takes 2 - 3 times the effort. It takes 2 -- 3 times the effort. It takes 2 --- 3 times the effort. It has a 10 to 20 foot range. The account has a $1000 to $2000 limit. It will cost $10 million to $20 million to build. It will cost $10 million or $20 million to build. I have between 5 and 20 dogs. There are from 5 to 20 of them. It will cost between 5 and 10 million. It is between 5 feet and 20 feet long. A DNA segment of 15 kDa to 20 kDa was obtained. It is two to threefold more abundant. % Year date, time and number expressions: % NA, DG links The war of eighteen twelve was notable. It was all over by nineteen nineteen. The first model came out in nineteen oh five. The first model came out in nineteen oh-five. The first model came out in nineteen oh one. The first model came out in nineteen oh-one. The first model came out in nineteen zero five. The house was remodelled in two thousand three. The house was remodelled in two thousand and three. It happened in the late seventeen seventies. The movie was over by nine eighteen. The movie was over by 9:18. The movie was over by 9:18 PM. The movie was over by 9:18 pm. The movie was over by 9:18PM. The movie was over by twelve o'clock. The movie was over by twelve o'clock in the afternoon. The movie was over by midnight. We are moving out at twelve hundred hours. We are moving out at twelve hundred thirty hours. We are moving out at zero hundred hours. Zero hour is approaching. It's a fifty five gallon drum. It's a fifty-five gallon drum. It's a fifty one gallon drum. It's a one gallon can. We just got a hundred of them. We bought two hundred three of them. We bought two hundred and three of them. We bought two hundred 'n three of them. Two hundred twelve now roam wild. It's a hundred and two in the shade. What's two 'n two? press the button when the dial reads zero. % Fix/spell-check "its" Its broken. It's broken. % date ranges are simple modifiers, not numerical mods It was the 1989-90 crop that failed. % However, dashes can appear in model numbers: The plane is a Boeing 747-400 The plane is a 747-400 The 747 jumbo jet came roaring overhead. You want part no. 1234-567. You want part no 1234-567A. You want part no. 1234-567A. You want part num. 1234-567A. % Years as adjectival modifiers: He drove a souped-up '57 Chevy. He drove a souped-up 1957 Chevy. The 47 Ford came screamin' down the track. % Simple mathematical equation parsing: Phosphorylation was observed (P = 0.06). Phosphorylation was observed (probability = 0.06). The sun is distant (L = 1 AU). Bacteria with low G + C DNA content contain genes. % Ordinals as clause openers first on our list is this item. second on our list is this item. third on our list is this item. next on our list is this item. last on our list is this item. 17th on our list is this item. first is this item. second is this item. next is this item. last is this item. % Other misc ordinal usage, including dates. Today is the third of December. Today is the 3rd of December. Today is the 31st of October. Today is the thirty-first of October. He is the third to speak up. Of them all, he ranked third. Of them all, he ranked 3rd. He left on the 20th. He left on the twentieth. We are leaving on December 2nd. He is the 17th Duke of Earl. He belongs to the 43rd regiment. It's a late 19th century artifact. It's a late nineteenth century artifact. I gave him a third of the loot. He gets a twentieth part of the proceeds. He flew with the 101st airborne division. By the 1550s, he was very prosperous. By the 650’s, he was very prosperous. By the 1950's, he was very prosperous. *By the 01950's, he was very prosperous. % This fails due to a bug in tokenize.c where the leading % quote is stripped, but "50s," cannot be found in the dict. By the '50s, he was very prosperous. Mike finished in first place, and John in third. Mike finished in first place, and John in last. He finished the season in first. He finished the season in first place. He finished the season in 3rd place. He finished the season in third place. He finished the season in last. He finished the season last. He finished the season dead last. % problem with "of" in entity names. The National Voter Registration Act of 1993 makes it easy % Spell checker now does a good job of splitting words. Marywent shoppingat thestore. Mary wentshopping atthe store. % quotations can be used for grouping modifiers into an almost-idiom We ate so-called 'brain food' for lunch. % punctuation: sometimes commas are used as if they were semicolons: Sweat stood on his brow, fury was bright in his one good eye. % Sometimes colons are used as synonyms for "is": The capital of France: Paris. Einstein's birthplace: Germany. The answer to your question: yes. % % Institutionalized phrases: % We want the comma to act as a left-wall. By the way, did you have some? By the way, how was it? Since we are talking about it, how was it? Now that you mention it, what happened? While we're on the topic, was it good? Kenny sure is a bastard. % elided "that" (phantom that) Just thought you'd like to know. It was previously thought they were wrong. % elided "to be" (phantom to be) % Need a Ce+ link on "think" ?? She will think it an act of kindness. She will think it to be an act of kindness. She will think it true. She will think it common. % Phantom verbs -- the second doesn't parse, although it % implicitly should have a verb sitting there. an examination conducted when it happened revealed chicanery. an examination when it happened revealed chicanery % misc idioms Not everything looks grim. Not all is lost. % "there on" I'll introduce you to her, but you're on your own from there on. % "such that" They were assigned separate seats such that they had enough space. % Opening idioms % some of these have a phantom-that e.g. "I'm telling you that ..." Listen to me, she'll do it. Take my word, she'll do it. Trust me, she'll do it. If nothing else, she'll do it. I'm telling you, she'll do it. Didn't I tell you that she would do it? Like I said, she'll do it! It's like this, she'll do it. Dude, she'll do it. Mark my words, she'll do it. well, I'll say, she did it! Oh my God, she did it! Can you believe it? % Yes, no as openers No, it wasn't John. No, that isn't true. Surely, that can't be right. No, that can't be right. Yes, that is right. % openers, interjections, linking to infinitive, or post-verbal Yes, please do it again. Yes, please, do it again. Yes, please, I'll have one. Yeah, go fuck yourself! Yeah, dude! Yeah dude! No, please stop. Please, no, stop. No, stop. No, stop that. No, don't do that. Don't do that! No, do not do that. Okay, don't do that. Yes, go. Please, yes. Thank you, no. Yes, sir! Go, dude, go! Umm, I think he did it. That's what I think, yes. On arrival, go to the check-in window. Even so, just do it. Exactly, do it exactly like that. Roughly, it is done like this. No, please don't do that. Okay, stop that. Stop, please don't do that. Sir, please don't do that. % Single-word exclamations! Yes! No! Sure. Whatever. OK. Okay. % Given names can be openers to directives or questions. Ma'am, please don't do that. John, please don't do that. Mary, stop. Mary, can you do this for me? Mary, should I do this? Mary, would you do this for me? Mary, won't you do it? Mary, mightn't you be right? John, do you think so, too? John, do you think it, too? John, do you believe it, too? John, do you believe so, too? John, doesn't that strike you as odd? John, have you thought about it? John, is it true? On arrival, can you do it? Yes, be alert! Yes, go play ball. Yes, go play soccer. Yes, go play tennis. Yes, go play piano. John, go do it. John, please go do it. John, let's go. John, if that's true, then I don't know. John, I am going to give this to you. John, this is it! % Openers to directives First, unbutton the button. Next, pour wine on your shirt. Finally, button the button. % and, or opening coordinating conjunctions. % Currently these take Wc- to the left wall, since they "coordinate" % with previous sentences. This is different than a plain-old CO % link, since they are not 'plain-old' clause openers ... And you can do it this way. Or you can do it this way. Or, you can do it this way. But not everyone used it. And not everyone agrees. And they really loved me! Also on this list is the Colossus of Rhodes. % Broken interjections ... Enough already! Enough of that! Yeah, right. % Broken idiomatic clauses ... (phantom/zero subjects) Heard that before? Just a coincidence? % "just" takes MVa- link (just like "only") They do just that. He did just what you asked. % "so" as object of verb, object of preposition. I don't think so I don't believe so. If you think so. If you say so. I told you so! But I don't agree. Do you think so, too? Because I said so! Do it like so. Do it like this. It must be done exactly like so. How could it be so? % Requests, directives and commands. Go play. Go play ball! You and Rover go play fetch. Fetch the ball. Rover, fetch the ball. Rover, give me the ball. Go fetch the ball. Play fetch with Elena. Teach me fetch. Teach me. Teach me how. Teach me how to do it. Walk tall. Think quick. Think quickly. Act fast. Act smart. Act dumb. Act now. Shout it out. Shout loud. Stand up straight. there shall be an answer. there shall come a time. there shall verily come a time when man will be cleansed of his sins. % WH-words I do not know why I do not know how I do not know when I do not know where I do not know which I do not know who I do not know why they did that I do not know how they did that I do not know when they did that I do not know where they went. I really don't know why I did not know why until recently I did not know how until recently I did not know when until recently I did not know where until recently I did not know which until recently I did not know who until recently I did not ask why until recently I did not tell why until recently I did not say why until recently I did not assess why until recently I did not establish why until recently I did not figure out why until recently I did not find out why until recently % Questions, queries What are your questions? What are the aliases of Jim? % Registers -- Newspaper headline declarations % Missing definite articles (with definite articles, these would parse) % Perhaps a modal parse: if the ordinary parse failed, try another % with definite articles auto-inserted ? Thief invades boathouse. Burglars attack museum. Thief empties pockets of all they hold. % Registers -- Medical speech 7 month old female presents with chest congestion. John, aged 80, is ill. % Technical speech - missing definite articles. Physical Volumes (LUN) allocated from SAN pool zoned to VIOS. % Idiomatic phrases It's a good bet he did it. It's a good bet that he did it. He's not the least bit interested. Let me tell you this: it stank. Halloween is a great time of year. Christmas is a great time of year. Summer is a great time of year. % die-idioms Stay pretty, die young. I don't want to die young. You will die young if you keep smoking. You will die unhappy if you marry her. Grant me this wish and I will die happy. You will live long and happy. They lived happily in that old house. He didn't say. She wouldn't tell anyone. Stopping your bicycle requires using your brakes. You should exercise to stay fit. He is as fit as a fiddle. Watch out that you don't hit your head on the low beam. % clauses embedded parenthetically All he gave was his first name. Pete (all he gave was his first name) was still waiting. % -------------------------------------------------------------------- % Disjunction/conjunction problems % What follows is a large section of conjunction test cases: adjectives, % nouns, verbs and adverbs conjoined with "and", "or", "but", commas, etc. % This spills over to more complex constructions. % % should be disjunction of modifiers ... (disjoined modifiers) % should be (major Eurobond or foreign bond) offerings There were no major Eurobond or foreign bond offerings Friday. Messrs. Malson and Seelenfreund are directors. The effects were less severe and less prolonged % 'but' works as a fat link, leaving 'rather' out to dry ... He didn't do it, but rather went home. % conjunctions treated with thin links: % CJ link in this case. All large burial places, or tombs, became known as mausoleums. % -------------------------------------------------------------------- % conjoined adjectival/adverbial modifiers The music was soft and mellow. She ran hot and cold. The black and white cat sleeps. It was a long and narrow valley. I don't care if the outcome is good or bad. % conjoined adjectives with modifiers The river is wide The river is wide here The river is a mile wide The river is a mile wide here The river is a mile wide and 300 feet deep The river is a mile wide here and 300 feet deep The river is helf a mile wide here and 300 feet deep The river is wide here, and deep, too. Most of the 16th and 17th century leases included husbandry clauses. % Pv links... He is flighty and given to fanciful thoughts. He is thoughtful and not given to many words. He is thoughtful, and not given to many words. % Pa links with adjectives William is described as smooth, yet reserved William is described as smooth, yet thoughtful and reserved William is described as smooth and yet thoughtful William is described as smooth and obliging, yet reserved and resolved William Petre is described as smooth and obliging in manner, yet reserved and resolved, and not given to many words. % comma as a conjunction It tastes bitter, not sweet. It tastes bitter, yet sweet. % neither-nor constructions with adjectives This is neither hip nor groovy He is neither happy nor healthy He is neither very happy nor very healthy % Difficulties with determiners & adjectives According to our records, he is in either the 105th or the 106th battalion According to our records, he is either in the 105th or the 106th battalion According to our records, he is either in the 105th or in the 106th battalion According to our records, he is in neither the 105th nor the 106th battalion According to our records, he is neither in the 105th or the 106th battalion According to our records, he is neither in the 105th nor in the 106th battalion % conjoined comparatives he is bigger and badder than the Pope. he is bigger, and badder, than the Pope. he is much bigger and badder than the Pope. That is the easier but longer way of doing it That is the easier, but longer, way of doing it It will be harder and costlier than last time. This car is lower and faster than theirs. He is smarter, yet snarkier, than the others This brandy is smoother and fuller than the rest He is different, and better, than the others. We will arrive sooner than you We will arrive sooner than they They will arrive sooner than we. It will be harder, and take much longer, than before he is big and badder than the Pope. he is smart and better than the rest. he is clever and funnier than Mike. This one is bigger, yet easier to carry This one is bigger and easier to carry We will arrive sooner, yet more tired, than they. We will arrive sooner, yet more tired, than John. We will arrive much later and more tired we will arrive refreshed and rejuvenated she wiped the table clean and dry we are going farther and farther down that path There will be fewer yet larger fish as a result. There will be a lot fewer yet much larger fish as a result. % some idiomatic comparative-like expressions That will more and more be the case That will less and less be the case That will more or less be the case *That will more and less be the case *That will less or more be the case That will be more and more the case That will be less and less the case That will be more or less the case *That will be more and less the case *That will be less or more the case % conjoined superlatives he is the biggest and baddest thug in town. they are the biggest and baddest three thugs in town he is the biggest and the baddest thug in town. they are the biggest and the baddest three thugs in town it is the third largest and the fifth richest county in the state it is the hardest and worst problem on the list % ------------------------------------------------------------------------- % Conjoined question words When and where is the party? How and why did you do that? % conjoined post-nominal modifiers: MJ*a (in place of Ma and MX*a) Many Democrats unhappy about the economy but doubtful that Clinton can be elected probably won't vote at all Many Democrats, unhappy about the economy but doubtful that Clinton can be elected, probably won't vote at all Many people, unaware of the deception and unfamiliar with the details, won't care. Many people, unaware or unfamiliar with the details, won't care. Many people, unaware of or unfamiliar with the details, won't care. *Many people, unaware and unfamiliar, won't care. The director, responsible for development and accountable for engineering, resigned. The director, responsible and accountable for engineering, resigned. *The director, responsible and accountable, resigned. The car, prone to breakdown and expensive to maintain, was a white elephant. The toy, expensive and fragile, broke immediately % Note: although the first parse for the below is good, the other parses % are nonsense, -- this should be fixed ... XXX The river, ten meters wide and a meter deep, runs swiftly here. The river, ten meters wide and a meter deep here, runs swiftly. The river, dangerous to navigate but important for commerce, has many shoals. The dog, unlikely to bite but still threatening, scared the interloper away. The dog, unlikely to bite but hard to ignore, scared the interloper away. The platform, aflame and adrift on the ocean, soon sank. The platform, aflame and adrift, soon sank. % conjoined post-nominal prep-phrase modifiers: MJ*p (in place of Mp) The coverage on TV and on the radio has been terrible it is hidden somewhere in the yard or near the house. % MJ*p with clause openers By listening and by looking, we can safely cross the street. By this means, and by the shortness of the leases, the Petres managed to keep an element of control % Closely conjoined prepositions (joiner must take prep object) The new building was started about 1540 on, or very near, the old site. The prize is hidden in or near the playground. The Easter eggs are hidden in and around the house. % conjoined adverbs: RJ*v link She handled it quickly and gracefully She handled it skillfully and with compassion She handled it quickly, quietly and gracefully % conjoined that: RJ*t link I told him that I hated him and that I never wanted to see him again % conjoined dependent clauses: RJ*c link Although he likes me and he respects me, he says he needs some privacy % conjoined prep-object-relative clauses: RJ*j link (instead of Mj- & Cs+) That is the man for whom and with whom Joe works % conjoined nouns % count nouns The dog and cat ran. The dog and the cat ran. The big dog and fat cat ran. The dog, cat and mouse ran. We took my dog and cat to the vet We took my heifer and John's cow to the fair We took my heifer and goat and John's cow to the fair Where is the sickle and hammer now? where did the hammer and sickle go? % number agreement for conjoined nouns There is a dog and a cat here. *There are a dog and a cat here. There is a dog or a cat here. there are two dogs and a cat here. *there is two dogs and a cat here. % ??there (is/are) a dog and two cats here. the dog and cat run *the dog and cat runs *The either dog or cat ran % conjoined mass nouns Cost and reliability were questioned. The cost and reliability were questioned. The mounting cost and reliability were questioned. The mounting cost and faltering reliability were questioned. The cost and lack of reliability were questioned The lack of reliability and cost were questioned The mounting debt and dearth of solutions have fueled the continuing crisis He wrote for piano and flute. % conjoined gerunds He enjoyed many rewards, such as free board and lodging at court. % conjoined proper names John and Mike left the party. actress Whoopi Goldberg and singer Michael Jackson attended the ceremony. John and I are friends. *I and John are friends. He and I are friends. Sims visited Golfe Juan, France, and Gaeta, Italy. Sims visited Gaeta, Italy, and Golfe Juan, France. % differences in number agreement for and, or: Are a dog and a cat here? Is John or I invited? *Is John and I invited? Are John and I invited? *John and I is invited % conjoined nouns as objects I heard a car and a train. I heard a car or a train. I heard a car but not a train *I heard a car but a train I heard a car nor a train I heard neither car nor train I heard neither a car nor a train % conjoined pronouns, misc nouns, other oddities this one and the others got broken hers and ours were mashed. yours and mine were damaged. let me know about this one and any others these ones and those over there got mashed these and those over there got mashed these both and those over there got mashed % XXX "these both got mashed" parses, but not correctly. *these both got mashed both of those, and this one, got mashed You'll find it at the corner of Gee Ave. and First St. You'll find it at the corner of Gee Ave. and 1st St. Let me introduce John Miller, AIA and Micheal Boost, Esq. Please give me the swizzle-stick and the torque-wrench I've been to Delaware and Maryland Let me introduce you to my alter ego and nemesis I am a master of kung fu and sleight of hand The majority and a number of others agree It was my insistence and reassurance that changed his mind It was my insistence and my reassurance that changed his mind It was my insistence and my reassurances that changed his mind It was my request and recommendations that changed his mind This is the time and place for it This is the right time and place for it This is neither the time nor the place for it This is neither the time nor the place for it Neither she nor I will go It's either us or them It is hers and mine. you and it have to go We and they agree Neither we nor they will do it. Neither you nor I will ever agree Everything and everyone must leave neither yours nor mine got damaged this and the others were damaged this one and many others were damaged this one and all these were damaged this one and all of these were damaged this one and a few others were damaged There is little or none left There is very little or none left Some or all of it remains Some or most of it remains Part or all of it remains this one and the other were damaged this one and the rest were damaged this one and plenty of others were damaged this one and one other were damaged this one and another were damaged this one and another one were damaged this one and one more were damaged He talks of this and that % conjunctions of date and time expressions. These normally take NI, % but can also take SJ when used as common nouns. January and February are the coldest months I am working day and night It will happen in the weeks and months ahead % conjoined guessed nouns we went asdfing and qrwerting The howzas and the ufdahs are broken again The Howzas and the Ufdahs are in revolt The halide and chloride ions do this the stator and rotor collided % relative clauses with conjoined nouns The dog and the cat I saw were black % conjoined nouns in clauses I think John and Dave ran. % conjoined post-nominal modifiers Sue, a teacher and scholar, is here. % conjoined negations Neither Mary nor Louise are coming to the party Neither Mary Kate nor Louise Anne are coming to the party *either Mary nor Louise are coming to the party Neither Mary, Joe nor Louise are coming to the party *either Mary, Joe nor Louise are coming to the party Either Mary or Louise will come. Neither I nor John will come. neither I nor my friend knows what happened neither I nor my friend know what happened Either Mary or my friend know what happened Either Mary or my friend knows what happened Either I or my friend knows what happened Either I or my friend know what happened % Neither-nor with mass nouns Neither snow nor rain stays these couriers Neither snow nor rain nor heat stays these couriers gloom of night and heat will not stop me heat and gloom of night will not stop me Neither snow nor rain nor heat nor gloom of night stays these couriers from the swift completion of their appointed rounds % neither-nor with count nouns (verify number agreement) There is neither a dog nor a cat here *There are neither a dog nor a cat here % conjoined numbers Give me six or seven of those. Just give me six or seven. I'm only going to have one or two beers. It starts one or two hours later. % But for joining adjectives He is tired but happy. % But for joining nouns Mary, but not Louise, is coming to the party Mary Kate, but not Louise Anne, is coming to the party The plan caused not prosperity but ruin Not John, but Mary led the way % But for joining verbs She organized her work but accomplished very little No one but she saw the prowler. He would have joined the band but he couldn't spare the time The brothers would have resisted but that they lacked courage. It never rains but it pours. There is no doubt but right will prevail. There never is a tax law presented but someone will oppose it. Ten to one but the police have got them They had no sooner arrived but they turned around and left. % conjoined verbs He tried and failed. He tried but failed. He tried but failed acheive his goal. Oscar Peterson played piano and wrote music. % Conjoind verb test cases -- artificial sentences illustrating various forms. Oscar banged drums and tinkled piano Oscar really banged drums and righteously tinkled piano They banged drums and tinkled piano Oscar bangs drums and tinkles piano Oscar bangs drums and tinkled piano They bang drums and tinkled piano % conjoined transitive and intransitive verbs I idolized and idealized the man. *I idolized and grimaced the man. I grimaced and idolized the man. % correct parse is "I (saw and greeted) Sue" I saw and greeted Sue. we sang and danced the night away He shrank and withdrew from the crowd The boat lurched forward and sank She will blush and start blathering at the mention of his name She will blush and begin blathering at the mention of his name The water rises and falls with the tides Do not surprise or alarm him I went to the store and got a gallon of milk I am going to the store and will get a gallon of milk I went to the store and returned the eggs I went to the store, got a gallon of milk, and returned the eggs We ate popcorn and watched movies on TV for three days. She arrived and left on Tuesday. He broke off a piece of bagel and gave it to me. He broke off a piece and gave it to me. He breaks off a piece and gives it to me. He broke off a piece and has given it to me. He had broken off a piece and had given it to me. He is breaking off a piece and will give it to me He is breaking off a piece and should give it to me He is breaking off a piece and would give it to me if I asked. He is breaking off a piece and ought to give it to me if I asked. He ought to break off a piece and give it to me We hoped for the best, but were disappointed. We hoped for the best and were disappointed. He obtained the lease of the manor of Great Burstead Grange (near East Horndon) from the Abbey of Stratford Langthorne, and purchased the manor of Bayhouse in West Thurrock. He rose rapidly in the royal service and was knighted. He rose rapidly in the royal service and, in 1543, was knighted. He was sent abroad and resided on the continent, chiefly in France, for more than four years. John describes and analyzes literature. Chief describes and analyzes the character of the families in a village, remarking that they all act completely the same. % conjoined verbs with modifiers, negation He cannot change the beliefs of popular society as a whole. He can not change the beliefs of popular society as a whole. He can't change the beliefs of popular society as a whole. He can challenge John, but cannot change the outcome. He can challenge John, but can't change the outcome. He realizes that he and McMurphy can challenge Big Nurse, but cannot change the beliefs of popular society as a whole. % conjoined verbs in relative clauses This is not the man we know and love. *This is not the man we know and love him This is not the man we knew and loved. This is a problem Moscow created and avoided This is a problem Moscow created but avoided fixing This is a problem Moscow created and failed to solve. % conjoined ditransitive objects I gave Bob a doll and Mary a gun. I found Bob a doll and Mary a gun for Chirstmas I got Bob a doll and Mary a gun for Chirstmas I offered Bob a doll and Mary a gun as an apology I refused Bob a raise and Mary a vacation I owe Bob some money and Mary a favor I called Bob a jerk and Mary a dork I painted the living room red and the bedroom green I wrote her a love song and him a hate letter I taught these mice to freeze, and those mice to jump. % conjoined past particples the water had risen and fallen with the tides he had lain, and soon forgotten his vow % neither-nor constructions with verbs: we ate popcorn or watched movies we either ate popcorn or watched movies we neither ate popcorn nor watched movies *we either ate popcorn nor watched movies *we both ate popcorn nor watched movies *we ate popcorn nor watched movies we both ate popcorn and watched movies we not only ate popcorn but watched movies We neither ate nor drank for three days we neither saw nor heard what happened % lots of conjunctions, commas, lists mashed up ... The problem is, or rather one of the problems, for there are many, a sizeable proportion of which are continually clogging up the civil, commercial, and criminal courts in all areas of the Galaxy, and especially, where possible, the more corrupt ones, this. The problem is, or rather one of the problems, this. The problem, or rather one of the problems, is this. % idiomatic "or rather" The problem, or rather, one of the problems, is this. The problems are clogging up the courts, and, where possible, the corrupt ones The problems are clogging up the courts, and, wherever possible, the corrupt ones % lists: % List of gerunds: He has three jobs: counting, measuring and listing. % List of relative clauses: RJ*r link There are 10 kinds of people: those who understand binary, and those who don't. % Collocations with holes: XJ links you should not only ask for your money back, but demand it % broken lexical chunk recognition: % ... not only, ... but also ... The deal includes not only junk, but also crap. % Split "if .. only" idiomatic expressions If there was only more left! If there were only more! If there were only more like you! If only there was more left! If only there were more! If only there was more! % If... then ... lexical constructs are broken. % Registers: Typical language used in instruction manuals, directives. If paid weekly, bring the last six pay stubs. If paid weekly, then bring six stubs. If it is broken, then remove it. If broken, then remove. Check the lid; if cracked, then replace. Check the valve, replace if cracked. % Then is optional: If it is raining, stay inside! If you bought after the crash, you won. If you sold before the peak, you got lucky % Someone... who... Someone is outside who wants to see you. % Compound queries % Typically, the two subphrases parse correctly, but, % put together, they do not. What is a motor, and how does it work? What is a motor; how does it work? Who invented sliced bread, and when did they do it? Who invented sliced bread; when did they do it? % Coordinating conjunctions These are the snippers and those are the cutters. Grant me this wish and I will die happy. Tell me what to do and I will show him The brothers would have resisted but that they lacked courage It never rains but it pours. They had no sooner arrived but they turned around and left. % XXX Misc conjunction constructions that are still broken in the current parser: He is flighty and given to fanciful thoughts He is thoughtful, and not given to many words William Petre is described as smooth and obliging in manner, yet reserved and resolved, and not given to many words. He rose rapidly in the royal service and, in 1543, was knighted He was twice summoned before the Privy Council, first for a violent assault on Sir John Conway, then, ten years later, for fraud. From his youth he must have been a capable, pushing, insinuating man. % conjunction breakage: dangling MVp links needed to Ju They feel a "normal" person conforms to, and becomes imperceptible in, society. Grant me this wish and I will die happy. What did you tell her and what did she say *I saw John but Fred He talked to Steve and, apparently, Fred *He talked to, apparently, Fred I cannot discern any reason, other than some sort of historical blindness, for why the "fat link" mechanism was created. John; my advisor, Steve; and several other people are coming No one but she saw the prowler. % The two below are valid sentences, but they parse incorrectly just right now % so we will put a * in front of them, for now, till the parse is fixed. *Mike finished in first place, and John in third. *Mike finished in first place, and John in last % -------------------------------------------------------------------- % non-planar graph: "saw" and "yesterday" should link, but don't. % "dog" and "which" do link (and that is correct). *John saw a dog yesterday which was a Yorkshire terrier. % incorrect parses -- INCORRECT PARSES -- bad disjunct usage % These sentences typically parse just fine, but generate % incorrect linkages. % Sentence parses, but incorrectly -- "of" links to "bill", should link % to 12th. % Put a star in front of this -- the sentence is good, but the parses are bad. *Senator Johnson introduced a bill on the 12th of July. *Senator Johnson introduced a bill of July. % "one to two" should modify hours. It starts one to two hours later. It starts one or two hours later. % None of the generated parses are correct; all are garbage. % Put a star in front of this -- the sentence is good, the parses are bad. *Bill went over the river and right through the woods. % More crazy parses due to bad conjunction handling Whenever he comes, she goes, and v.v. The market fell 156.83, or 8%, a week after Black Monday. % Hmm conjunctions .. these are tricky to get right ... Mike finished in first place, and John in third. Mike finished in first place, and John in last. % Rules should select "shouting.g" gerund, not "shouting.v" (participle) % Now fixed. The teacher's shouting startled the student. % "and so" is linked with Wq, should not be. Rama ate the apple, and so did Mohan. % Automatic possesive guessing broken when entity is in the dictionary: % "to run" is a verb, this breaks identification of "Ran" as entity; % fix by adding Ran explicitly as name to dictionary. % "hooker" is a noun ... but now works. % These are all working now. Flumblqwerty's shoes are red. Run's shoes are red. Ran's shoes are red. Asdf's philosophy was to build and sell Hooker's philosophy was to build and sell John's remark was awkward. John's sudden outburst was awkward. Lady's dress was awkward. % Some plural capitalized words are singular entities. Treat them well. % e.g. last name Johns, or Hotchkiss are not actually plurals ... Johns gave it to me. Hotchkiss gave it to me. % Sue (female given name) vs. "to sue" (verb). Sue answered the door. % Tom as a mass noun interferes with far-more-likely common-name "Tom". Could we add some tom-tom to that track? % 123A, the "A" suffix is assumed to be a unit, leading to a bad parse. You want part no. 123A You want part no. 123ABC % ... or both -- drunk wants Pa link, both wants Opt link Was the man drunk or crazy or both? % Broken comparatives: He is nothing less than inspired! He is less than bright! That is a less than optimal plan He is more than capable! He is more than qualified! they report less earnings than before they report less robust earnings than before they report less robust earnings than previously they report less robust earnings than they did previously They report much less robust earnings than they did earlier. They report much less robust earnings than they did for the third quarter. It takes longer than that. It takes more than that. The crossing takes longer than Washington thought it would. This allows companies to realize revenues quicker. This allows companies to realize revenues faster. % This works, notice the TR link: The better the computer, the faster the program. The bigger they are, the harder they fall. Florida is the balmier of the two. % problems with anticipated/suggested/expected, etc. The defenses have proved more formidable than was anticipated. The defenses have proven more formidable than was expected. The defenses were designed more formidably than was suggested. The defenses were designed more formidably than was expected. The earnings were lowered more strongly than was suggested. The rates were lowered more than suggested. The bolt was tightened more than was recommended. The bolt was tightened more than recommended. % -------------------------------------------------------------------- % setences that parse, but not correctly: You are as sweet as sugar. The situation is not so bad as you suggest. I slipped on the ice as I ran home. He was so foolish as to lie. Ridiculous as it seems, the tale is true. the hotel is quite comfortable as such establishments go I don't know as I can answer your question. % -------------------------------------------------------------------- % assorted unclassified breakages, wating for a fix: Although society has excluded the patients in the ward for their unique qualities, they feel 'safer' trying to fit in because they receive approval from nurses and the representatives of society. % -------------------------------------------------------------------- % Sentence containing UTF8 chars that can lead to i/o or % word-boundary problems *Bitter gourdはにがうりだそうであってるのかはちょっと不安ですが翻訳ソフトでやくしてみました。 *Синтезируется из глюкозы в тканях и органах, например в сердце, печени, почках. % Crashes of various sorts. His convalescence was relatively brief and he was able to return and fight at The Wilderness, Spotsylvania and Cold Harbor. Hot runners usually make the mold more expensive to manufacture and run, but allow savings by reducing plastic waste and by reducing the cycle time. Dietrich A. Loeber, ‘“Socialist” Features of Soviet Copyright Law’, Columbia Journal of Transnational Law, vol. 23, pp 297--313, 1984. % Overly long sentences leading to overflow I think one of the chief differences between the main Filipino language, which is Tagalog, and English, when I hear Tagalog speakers speaking English, is that they tend to place the stress on the wrong syllable of a word or they stress the wrong word in the sentence or in the question. % long sentence leading to crash. Cortes in his various letters again and again claims the Emperor's patronage of his bold defiance of the Emperor's officers on the ground that the latter in their action were moved solely by considerations of their personal gain, whereas he, Cortes, was striving to endow his sovereign with a rich new empire and boundless treasure whilst carrying into the dark pagan land, at the sword's point, the gentle creed of the Christian God. % A no-canonical-parses error Well, say, Joe, you can be Friar Tuck or Much the miller's son, and lam me with a quarter-staff; or I'll be the Sheriff of Nottingham and you be Robin Hood a little while and kill me. % When constituent tree printing is enabled, this causes % a cascade of and-list overflow errors: I have not seen the grysbok, or the suni, or the dibitag, or the lechwi, or the aoul, or the gerenuk, or the blaauwbok, or the chevrotain, or lots of others, but who in the world could guess what they were or what they looked like, judging only from the names? % Overflow + no complete linakges. In 1608 he wrote a treatise of the Errors, False Gods, and Other Superstitions of the Indians of the Provinces of Huarochiri, Mama, and Chaclla, of which unfortunately only the first six chapters are known to exist and have been translated into English. The strongest rain ever recorded in India shut down the financial hub of Mumbai, snapped communication lines, closed airports and forced thousands of people to sleep in their offices or walk home during the night, officials said today. % No complete linkages found. New York Post: The new Mel Brooks/Susan Stroman musical extravaganza ... is nearly very good indeed - but it is not the The Producers ... this story ... does not lend itself to stage adaptation in the way of the earlier movie ... Now for the good news ... Brooks and Stroman pull out every stop. % Combinatorial explosion However, the few tracts, the poetry, and the novels that embodied the social vision of Young England were directed to a New Generation of educated, religious, and socially conscious conservatives, who, like Young Englanders, were appalled at the despiritualizing effects of industrialization and the perceived amorality of Benthamite philosophy, which they blamed equally for Victorian social injustices. In vivo studies of the activity of four of the kinases, KinA, KinC, KinD (ykvD) and KinE (ykrQ), using abrB transcription as an indicator of Spo0A~P level, revealed that KinC and KinD were responsible for Spo0A~P production during the exponential phase of growth in the absence of KinA and KinB. link-grammar-4.7.4/data/en/4.0.regex0000644000175000017500000002317111526022265015766 0ustar bloombloom %***************************************************************************% % % % Copyright (C) 2005, 2006 Sampo Pyysalo, Sophie Aubin % % See file "LICENSE" for information about commercial use of this system % % % %***************************************************************************% % This file contains regular expressions that are used to match % tokens not found in the dictionary. Each regex is given a name which % determines the disjuncts assigned when the regex matches; this name % must be defined in the dictionary along with the appropriate disjuncts. % Note that the order of the regular expressions matters: matches will % be attempted in the order in which the regexs appear in this file, % and only the first match will be used. % Numbers. % XXX, we need to add utf8 U+00A0 "no-break space" % % Allows at most two colons in hour-muinute-second HH:MM:SS expressions % Allows at most two digits between colons HMS-TIME: /^[0-9][0-9]?(:[0-9][0-9]?(:[0-9][0-9]?)?)?(AM|PM|am|pm)?$/ % e.g. 1950's leading number can be higher, for science fiction. % Must be four digits, or possible three. Must end in s, 's ’s DECADE-TIME: /^([1-4][0-9][0-9]|[1-9][0-9])0(s|'s|’s)$/ % Day-of-month names; this regex will match before the one below. DAY-ORDINALS: /^(1st|2nd|3rd|[4-9]th|1[0-9]th|2(0th|1st|2nd|3rd|[4-9]th)|30th|31st)$/ % Ordinal numbers; everything except 1st through 13th % is handled by regex. ORDINALS: /^[1-9][0-9]*(0th|1st|2nd|3rd|[4-9]th)$/ % Allows any number of commas or periods % Be careful not match the period at the end of a sentence; % for example: "It happened in 1942." NUMBERS: /^[0-9,.]*[0-9]$/ % This parses signed numbers and ranges, e.g. "-5" and "5-10" and "9+/-6.5" NUMBERS: /^[0-9.,-]*[0-9](\+\/-[0-9.,-]*[0-9])?$/ % Parses simple fractions e.g. "1/60" with no decimal points or anything fancy FRACTION: /^[0-9]+\/[0-9]+$/ % "10(3)" exponent (used in PubMed) NUMBERS: /^[0-9.,-]*[0-9][0-9.,-]*\([0-9:.,-]*[0-9][0-9.,-]*\)$/ % Roman numerals % The first expr has the potential(?) problem that it matches an empty % string. Thus, the next three rules specify that at least one section % is non-empty. ROMAN-NUMERAL-WORDS: /^M*(CM|D?C{0,3}|CD)(XC|L?X{0,3}|XL)(IX|V?I{0,3}|IV)$/ % ROMAN-NUMERAL-WORDS: /^M*(CM|D?C{0,3}|CD){1}(XC|L?X{0,3}|XL)(IX|V?I{0,3}|IV)$/ % ROMAN-NUMERAL-WORDS: /^M*(CM|D?C{0,3}|CD)(XC|L?X{0,3}|XL){1}(IX|V?I{0,3}|IV)$/ % ROMAN-NUMERAL-WORDS: /^M*(CM|D?C{0,3}|CD)(XC|L?X{0,3}|XL)(IX|V?I{0,3}|IV){1}$/ % Strings of initials. e.g "Dr. J.G.D. Smith lives on Main St." INITIALS: /^([A-Z]\.)+$/ % Greek letters with numbers GREEK-LETTER-AND-NUMBER: /^(alpha|beta|gamma|delta|epsilon|zeta|eta|theta|iota|kappa|lambda|mu|nu|xi|omicron|pi|rho|sigma|tau|upsilon|phi|chi|psi|omega)\-?[0-9]+$/ PL-GREEK-LETTER-AND-NUMBER: /^(alpha|beta|gamma|delta|epsilon|zeta|eta|theta|iota|kappa|lambda|mu|nu|xi|omicron|pi|rho|sigma|tau|upsilon|phi|chi|psi|omega)s\-?[0-9]+$/ % Some "safe" derived units. Simple units are in dictionary. % The idea here is for the regex to match something that is almost % certainly part of a derived unit, and allow the rest to be % anything; this way we can capture difficult derived units such % as "mg/kg/day" and even oddities such as "micrograms/mouse/day" % without listing them explicitly. % TODO: add more. % Some (real) misses from these: % micrograms.kg-1.h-1 microM-1 J/cm2 %/day mN/m cm/yr % m/s days/week ml/s degrees/sec cm/sec cm/s mm/s N/mm (is that a unit?) % cuts/minute clicks/s beats/minute x/week W/kg/W %/patient-year % microIU/ml degrees/s counts/mm2 cells/mm3 tumors/mouse % mm/sec ml/hr mJ/cm(2) m2/g amol/mm2 animals/group % h-1 min-1 day-1 cm-1 mg-1 kg-1 mg.m-2.min-1 ms.cm-1 g-1 % sec-1 ms-1 ml.min.-1kg-1 ml.hr-1 % also, both kilometer and kilometers seem to be absent(!) % remember "mm"! UNITS: /^([npmk]|nano|pico|milli|micro|kilo)?(g|grams?)\// % grams/anything UNITS: /^([fnmp]|femto|nano|micro|pico|mu)?mol(es)?\// % mol/anything UNITS: /^[a-zA-Z\/.]+\/((m|micro)?[lLg]|kg|mol|min|day|h)$/ % common endings % common endings, except in the style "mg.kg-1" instead of "mg/kg". UNITS: /^[a-zA-Z\/.1-]+\.((m|micro)?[lLg]|kg|mol|min|day|h)(-1|\(-1\))$/ % combinations of numbers and units, e.g. "50-kDa", "1-2h" % TODO: Clean up and check that these are up-to-date wrt the % dictionary-recognized units; this is quite a mess currently. % TODO: Extend the "number" part of the regex to allow anything % that the NUMBER regex matches. % One problem here is a failure to split up the expression ... % e.g. "2hr" becomes 2 - ND - hr with the ND link. But 2-hr is treated % as a single word ('I is a 2-hr wait') % NUMBER-AND-UNIT: /^[0-9.,-]+(msec|s|min|hour|h|hr|day|week|wk|month|year|yr|kDa|kilodalton|base|kilobase|base-pair|kD|kd|kDa|bp|nt|kb|mm|mg|cm|nm|g|Hz|ms|kg|ml|mL|km|microm|\%)$/ % Comment out above, it screws up handling of unit suffixes, for % example: "Zangbert stock fell 30% to $2.50 yesterday." % fold-words. Matches NUMBER-fold, where NUMBER can be either numeric % or a spelled-out number, and the hyphen is optional. Note that for % spelled-out numbers, anything is allowed between the "initial" number % and "fold" to catch e.g. "two-to-three fold" ("fourteen" etc. are absent % as the prefix "four" is sufficient to match). FOLD-WORDS: /^[0-9.,:-]*[0-9]([0-9.,:-]|\([0-9.,:-]*[0-9][0-9.,:-]*\)|\+\/-)*-?fold$/ FOLD-WORDS: /^(one|two|three|four|five|six|seven|eight|nine|ten|eleven|twelve|thirteen|fifteen|twenty|thirty|fifty|hundred|thousand|million).*fold$/ % Plural proper nouns. % Make sure that apostrophe-s is split out correctly. PL-CAPITALIZED-WORDS: /^[[:upper:]].*[^iuoys'’]s$/ % Other proper nouns. % We demand that these end with an alphanumeric, i.e. explicitly % reject punctuation. We don't want this regex to "swallow" any trailing % commas, colons, or periods/question-marks at the end of sentences. % In addition, this must not swallow words ending in 's 'll etc. % (... any affix, for that matter ...) and so no embedded apostrophe CAPITALIZED-WORDS: /^[[:upper:]][^'’]*[^[:punct:]]$/ % SUFFIX GUESSING % For all suffix-guessing patterns, we insist that the pattern start % with an alphanumeric. This is needed to guarentee that the % prefix-stripping code works correctly, as otherwise, the regex will % gobble the prefix. So for example: "We left (carrying the dog) and % Fred followed." Since "(carrying" is not in the dict, we need to be % sure to not match the leading paren so that it will get tripped. % ING-WORDS: /^\w.+ing$/ % Plurals or verb-s. Make sure that apostrophe-s is split out correctly. % e.g. "The subject's name is John Doe." should be % +--Ds--+---YS--+--Ds-+ % | | | | % the subject.n 's.p name.n S-WORDS: /^\w.+[^iuoys'’]s$/ % Verbs ending -ed. ED-WORDS: /^\w.+ed$/ % Advebs ending -ly. LY-WORDS: /^\w.+ly$/ % Nouns ending in -ism, -asm (chiliasm .. ) Usualy mass nouns % Stubbed out for now; I'm not convinced this improves accuracy. % ISM-WORDS: /^\w.+asm$/ % ISM-WORDS: /^\w.+ism$/ % Corresponding count noun version of above (chiliast...) % AST-WORDS: /^\w.+ast$/ % AST-WORDS: /^\w.+ist$/ % Corresponding adjectival form of above ADJ-WORDS: /^\w.+astic$/ ADJ-WORDS: /^\w.+istic$/ % Nouns ending -ation stubbed out in BioLG, stub out here ... %ATION-WORDS: /^\w.+ation$/ % Extension by LIPN 11/10/2005 % nouns -- typically seen in (bio-)chemistry texts % synthetase, kinase % 5-(hydroxymethyl)-2’-deoxyuridine % hydroxyethyl, hydroxymethyl % septation, reguion % isomaltotetraose, isomaltotriose % glycosylphosphatidylinositol % iodide, oligodeoxynucleotide % chronicity, hypochromicity MC-NOUN-WORDS: /^\w.+ase$/ MC-NOUN-WORDS: /^\w.+ine?$/ MC-NOUN-WORDS: /^\w.+yl$/ MC-NOUN-WORDS: /^\w.+ion$/ MC-NOUN-WORDS: /^\w.+ose$/ MC-NOUN-WORDS: /^\w.+ol$/ MC-NOUN-WORDS: /^\w.+ide$/ MC-NOUN-WORDS: /^\w.+ity$/ % replicon, intron C-NOUN-WORDS: /^\w.+o[rn]$/ % adjectives % exogenous, heterologous % intermolecular, intramolecular % glycolytic, ribonucleic, uronic % ribosomal, ribsosomal % nonpermissive, thermosensitive % inducible, metastable ADJ-WORDS: /^\w.+ous$/ ADJ-WORDS: /^\w.+ar$/ ADJ-WORDS: /^\w.+ic$/ ADJ-WORDS: /^\w.+al$/ ADJ-WORDS: /^\w.+ive$/ ADJ-WORDS: /^\w.+ble$/ % latin (postposed) adjectives % influenzae, tarentolae % pentosaceus, luteus, carnosus LATIN-ADJ-WORDS: /^\w.+ae$/ LATIN-ADJ-WORDS: /^\w.+us$/ % must appear after -ous in this file % latin (postposed) adjectives or latin plural noun % brevis, israelensis % japonicum, tabacum, xylinum LATIN-ADJ-P-NOUN-WORDS: /^\w.+is?$/ LATIN-ADJ-S-NOUN-WORDS: /^\w.+um$/ % Hyphenated words. In the original LG morpho-guessing system that % predated the regex-based system, hyphenated words were detected % before ING-WORDS, S-WORDS etc., causing e.g. "cross-linked" to be % treated as a HYPHENATED-WORD (a generic adjective/noun), and % never a verb. To return to this ordering, move this regex just % after the CAPITALIZED-WORDS regex. HYPHENATED-WORDS: /^[[:alpha:][:digit:],.][[:alpha:][:digit:],.-]*-[[:alpha:][:digit:],.-]*[[:alpha:][:digit:],.]$/ % proteins often end "ase", so we'll assume those things are names. % removed, too many false positives. % NAME: /ase$/ % Sequence of punctuation marks. If some mark appears in the affix table % such as a period, comma, dash or underscore, and there's a sequence of % these, then treat it as a "fill-in-the-blank" placeholder. % This matters only for punc. appearing in the affix table, since the % tokenizer explicitly mangles based on these punctution marks. % % Look for at least four in a row. UNKNOWN-WORD: /^[.,-]{4}[.,-]*$/ link-grammar-4.7.4/data/en/.cvsignore0000644000175000017500000000004510772523445016434 0ustar bloombloomMakefile.in Makefile svn-commit.tmp* link-grammar-4.7.4/data/en/words/0000755000175000017500000000000011531775727015601 5ustar bloombloomlink-grammar-4.7.4/data/en/words/entities.given-male.sing0000644000175000017500000003423211400351220022303 0ustar bloombloomAb.m Abbot.m Abbott.m Abdul.m Abdullah.m Abe.m Abel.m Abner.m Abraham.m Abram.m Absalom.m Ace.m Acher.m Achilles.m Achmad.m Achmed.m Acie.m Adair.m Adalberto.m Adan.m Addison.m Addulla.m Adel.m Adelbert.m Aden.m Adlai.m Adler.m Adolf.m Adolfo.m Adolph.m Adolpho.m Adolphus.m Adrain.m Agustin.m Agustus.m Ahmad.m Ahmed.m Aiden.m Ajay.m Ajit.m Akar.m Akbar.m Akim.m Akio.m Akira.m Akule.m Al.m Alain.m Alan.m Alaric.m Alastair.m Alban.m Alben.m Alberto.m Albertus.m Albin.m Albion.m Albrecht.m Alby.m Alcide.m Alden.m Alder.m Aldo.m Aldous.m Aldy.m Alec.m Alejandro.m Alek.m Aleksander.m Aleksandr.m Aleksandre.m Alex.m Alexandr.m Alexandre.m Alf.m Alfonse.m Alfonso.m Alfonzo.m Alford.m Alfred.m Alfredo.m Algar.m Algernon.m Algie.m Algir.m Alim.m Aliphont.m Alistair.m Alister.m Allan.m Allessandro.m Almer.m Almeric.m Almon.m Alois.m Alonso.m Alonza.m Alonzo.m Aloysius.m Alpheus.m Alphonse.m Alphonso.m Alrik.m Alroy.m Alton.m Alvah.m Alvaro.m Alvia.m Alvie.m Alvin.m Alvis.m Alwin.m Alwyn.m Alyn.m Amadeus.m Amado.m Amando.m Ambrose.m Ameer.m Ameet.m Americo.m Amin.m Amir.m Amit.m Ammon.m Amos.m Anand.m Ananda.m Anastacio.m Anatole.m Anders.m Anderson.m Andrae.m Andre.m Andreas.m Andrei.m Andrej.m Andres.m Andrey.m Andrius.m Andrzej.m André.m Andy.m Angus.m Anibal.m Annada.m Annan.m Anselm.m Anson.m Antanas.m Antione.m Antoine.m Anton.m Antonas.m Antone.m Antony.m Antos.m Antwain.m Antwan.m Antwon.m Archer.m Archibald.m Archie.m Arden.m Ari.m Arian.m Aric.m Aries.m Aristide.m Arkadi.m Arkady.m Arlan.m Arlen.m Arley.m Arlie.m Arlin.m Arlington.m Arlis.m Arlo.m Arlyn.m Arman.m Armand.m Armando.m Armin.m Armon.m Armond.m Armondo.m Arnaldo.m Arne.m Arnie.m Arnold.m Arnoldo.m Arnulfo.m Aron.m Arron.m Arslan.m Art.m Arther.m Arthuro.m Artin.m Artis.m Artur.m Arturas.m Arturo.m Arun.m Arunas.m Arvel.m Arvid.m Arvil.m Arvin.m Arvydas.m Asa.m Asberry.m Asbury.m Asfar.m Ashby.m Asher.m Ashfar.m Ashir.m Ashur.m Asif.m Atman.m Atsuhiko.m Atsushi.m Attila.m Auberon.m Aubert.m August.m Auguste.m Augustin.m Augustus.m Aurelio.m Aurelius.m Aurthur.m Auther.m Authur.m Autry.m Avi.m Avraham.m Axel.m Ayaz.m Aylwin.m Azad.m Azfar.m Azi.m Azis.m Babe.m Bahia.m Baldwin.m Ballard.m Barnett.m Barney.m Barnie.m Barrett.m Barry.m Bart.m Bartholomew.m Bartley.m Barton.m Basil.m Baton.m Baxter.m Bayard.m Beau.m Bedford.m Belo.m Ben.m Benedict.m Benito.m Benjaman.m Benjamin.m Benjamine.m Benjiman.m Bennett.m Benny.m Benton.m Bernard.m Bernardo.m Bernhard.m Bert.m Berton.m Bertram.m Bertrand.m Bill.m Birt.m Bishop.m Bjorn.m Blaine.m Blas.m Bo.m Bob.m Booker.m Boris.m Boston.m Boyce.m Boyd.m Brad.m Braden.m Bradford.m Bradley.m Bradly.m Brady.m Brain.m Brandan.m Branden.m Brannon.m Brant.m Brendan.m Brenden.m Brendon.m Brennan.m Brent.m Brenton.m Bret.m Brice.m Britton.m Brock.m Broderick.m Brody.m Bronson.m Brooks.m Bruce.m Bruno.m Bryan.m Bryant.m Bryce.m Bryon.m Bryson.m Buck.m Bud.m Budd.m Buddie.m Buddy.m Buford.m Burdette.m Burl.m Burley.m Burnell.m Burnett.m Burr.m Burt.m Burton.m Buster.m Butler.m Byrd.m Byron.m Caesar.m Cal.m Cale.m Caleb.m Calvin.m Candido.m Carleton.m Carlo.m Carlton.m Carlyle.m Carmelo.m Carmine.m Carson.m Carter.m Casimer.m Casimir.m Casper.m Cassius.m Cato.m Ceasar.m Cedric.m Cedrick.m Cesar.m Ceylon.m Chad.m Chadd.m Chadrick.m Chadwick.m Chalmer.m Chalmers.m Chance.m Chancy.m Charley.m Chas.m Chase.m Chauncey.m Chaz.m Chesley.m Chester.m Chet.m Chiang.m Christoper.m Chuck.m Cicero.m Clarance.m Clark.m Clarke.m Claud.m Claudio.m Claudius.m Claus.m Clay.m Clayton.m Clem.m Clemens.m Clement.m Clemente.m Cleon.m Cletus.m Cleve.m Cleveland.m Cliff.m Clifford.m Clifton.m Clint.m Clinton.m Clopton.m Clovis.m Cloyd.m Coby.m Cole.m Coleman.m Colin.m Collin.m Collins.m Collis.m Colton.m Columbus.m Conley.m Conor.m Conrad.m Constantin.m Constantine.m Cordell.m Cornelious.m Cornelius.m Cornell.m Cortez.m Coy.m Craig.m Crawford.m Creed.m Cristian.m Cristobal.m Cristopher.m Crockett.m Cullen.m Curley.m Curt.m Curtiss.m Cyril.m Cyrus.m Dalton.m Dameon.m Damian.m Damien.m Damion.m Damon.m Dan.m Dane.m Danial.m Danilo.m Danny.m Dante.m Darell.m Daren.m Darian.m Darin.m Dario.m Darius.m Darold.m Daron.m Darrel.m Darrell.m Darren.m Darrick.m Darrin.m Darron.m Darryl.m Darvin.m Darwin.m Dave.m Davie.m Davin.m Davis.m Davon.m Dayton.m Deandre.m Deangelo.m Dedrick.m Deimos.m Dejuan.m Del.m Delano.m Delbert.m Delmar.m Delmer.m Delos.m Delton.m Delvin.m Demarco.m Demarcus.m Demario.m Demond.m Dempsey.m Denis.m Dennie.m Denver.m Denzil.m Derald.m Dereck.m Derek.m Deric.m Derick.m Derik.m Derrell.m Derrick.m Deshaun.m Deshawn.m Desmond.m Dewayne.m Dewey.m Dewitt.m Dexter.m Dick.m Dickie.m Diego.m Dillard.m Dillon.m Dino.m Dirk.m Doc.m Dock.m Dolphus.m Domenic.m Domenick.m Domingo.m Dominic.m Dominick.m Don.m Donal.m Donn.m Donnell.m Donny.m Donovan.m Donta.m Donte.m Dorsey.m Doss.m Doug.m Douglas.m Douglass.m Dow.m Doyle.m Duane.m Dudley.m Duff.m Duke.m Duncan.m Durward.m Durwood.m Dustan.m Dustin.m Duwayne.m Dwain.m Dwaine.m Dwayne.m Dwight.m Dylan.m Earl.m Earle.m Earnest.m Eben.m Eber.m Ed.m Edd.m Eddy.m Edgar.m Edgardo.m Edison.m Edmond.m Edmund.m Edmundo.m Edouard.m Edsel.m Edson.m Eduardo.m Edwardo.m Edwin.m Efrain.m Efren.m Egbert.m Elam.m Elbert.m Elden.m Elder.m Eldon.m Eldred.m Eldridge.m Elgin.m Eli.m Elias.m Elick.m Elie.m Eliga.m Eligah.m Elige.m Elihu.m Elijah.m Eliseo.m Elliot.m Elliott.m Ellsworth.m Ellwood.m Elmo.m Elmore.m Eloy.m Elroy.m Elton.m Elvin.m Elvis.m Elwin.m Elwood.m Elwyn.m Ely.m Elzie.m Emanuel.m Emerson.m Emery.m Emil.m Emile.m Emilio.m Emmanuel.m Emmet.m Emmett.m Emmit.m Emmitt.m Emory.m Ennis.m Enoch.m Enos.m Enrique.m Ephraim.m Ephriam.m Erasmo.m Erasmus.m Erastus.m Erich.m Erick.m Erik.m Erling.m Ernest.m Ernesto.m Ernie.m Ernst.m Errol.m Ervin.m Erwin.m Esau.m Esteban.m Estel.m Estevan.m Eston.m Ethan.m Etienne.m Eugenio.m Eusebio.m Evans.m Everett.m Everette.m Evert.m Ewell.m Ezekiel.m Ezell.m Ezequiel.m Ezra.m Fabian.m Farrell.m Farris.m Faustino.m Fausto.m Fayette.m Federico.m Felipe.m Felix.m Felton.m Ferd.m Ferdinand.m Fermin.m Fernando.m Ferris.m Fidel.m Filiberto.m Finley.m Firman.m Fitzhugh.m Flem.m Fleming.m Fletcher.m Florencio.m Florentino.m Florian.m Floyd.m Ford.m Forest.m Forrest.m Foster.m Foy.m Francesco.m Franco.m Franklin.m Franklyn.m Franz.m Freddy.m Frederic.m Frederick.m Frederik.m Fredric.m Fredrick.m Freeman.m Friedel.m Friedrich.m Fritz.m Fulgence.m Furman.m Gabe.m Gaetano.m Galen.m Gardner.m Garett.m Garfield.m Garland.m Garold.m Garret.m Garrett.m Garrick.m Garry.m Garth.m Gaston.m Gavin.m Gaylon.m Gaylord.m Gearld.m Gee.m Genaro.m Geo.m Geoffrey.m Geraldo.m Gerard.m Gerardo.m Gerhard.m German.m Gerold.m Gideon.m Gil.m Gilbert.m Gilberto.m Giles.m Gilles.m Gino.m Giovanni.m Giuseppe.m Glen.m Glendon.m Glenwood.m Glynn.m Godfrey.m Goebel.m Gonzalo.m Gorden.m Gordon.m Gorge.m Gottlieb.m Grady.m Graham.m Graig.m Grant.m Granville.m Greg.m Gregg.m Greggory.m Gregorio.m Grover.m Guido.m Guillaume.m Guillermo.m Gus.m Guss.m Gustaf.m Gustav.m Gustave.m Gustavo.m Gustavus.m Guy.m Hai.m Hal.m Halsey.m Hamilton.m Hamp.m Hampton.m Hank.m Hans.m Hardie.m Hardin.m Harding.m Hardy.m Harl.m Harlan.m Harland.m Harlen.m Harley.m Harlow.m Harman.m Harmon.m Harrell.m Harrie.m Harris.m Harrison.m Harry.m Harve.m Harvey.m Harvie.m Haskell.m Hassan.m Hayden.m Hayes.m Hays.m Hayward.m Haywood.m Heath.m Heber.m Hector.m Heinrich.m Helmer.m Henderson.m Henery.m Henri.m Herb.m Herbert.m Heriberto.m Herman.m Hermann.m Hermon.m Herschel.m Hershel.m Hervey.m Hezekiah.m Hilario.m Hilbert.m Hillard.m Hilliard.m Hilton.m Hipolito.m Hiram.m Hiroshi.m Hobart.m Hobert.m Hobson.m Holmes.m Homer.m Horace.m Horacio.m Horatio.m Hosea.m Hosie.m Hosteen.m Houston.m Howard.m Howell.m Hoy.m Hoyt.m Hubert.m Hudson.m Huey.m Hugh.m Hugo.m Humberto.m Humphrey.m Hung.m Hunt.m Hunter.m Huston.m Hyman.m Hyrum.m Ian.m Ignacio.m Ignatius.m Ike.m Irven.m Irvin.m Irving.m Irwin.m Isaac.m Isadore.m Isaiah.m Isaias.m Isam.m Isham.m Ishmael.m Isiah.m Isidore.m Isidro.m Ismael.m Isom.m Israel.m Isreal.m Issac.m Ivan.m Jabari.m Jabez.m Jace.m Jacinto.m Jackson.m Jacky.m Jacob.m Jacques.m Jake.m Jamaal.m Jamal.m Jamar.m Jameel.m Jamel.m Jamil.m Jamin.m Jamison.m Janus.m Jarad.m Jared.m Jarod.m Jaron.m Jarred.m Jarret.m Jarrett.m Jarrod.m Jarvis.m Jasen.m Jasper.m Javier.m Javon.m Jayson.m Jc.m Jed.m Jedediah.m Jedidiah.m Jeff.m Jefferey.m Jefferson.m Jeffery.m Jeffry.m Jehovah.m Jennings.m Jerad.m Jerald.m Jeramiah.m Jeramie.m Jeramy.m Jere.m Jered.m Jereme.m Jeremey.m Jeremiah.m Jeremie.m Jerimiah.m Jermain.m Jermaine.m Jermey.m Jerod.m Jerold.m Jerome.m Jeromy.m Jerrel.m Jerrell.m Jerrod.m Jerrold.m Jess.m Jessee.m Jessy.m Jim.m Joaquin.m Job.m Joeseph.m Joesph.m Johann.m John.m Johnathan.m Johnathon.m Johnpaul.m Johnson.m Jonah.m Jonas.m Jonathan.m Jonathon.m Jones.m Jordon.m Jorge.m Josef.m Josh.m Josiah.m Jospeh.m Josue.m Judd.m Judge.m Judson.m Jules.m Julious.m Julius.m Junior.m Junious.m Junius.m Jupiter.m Justen.m Justice.m Juston.m Justus.m Kaleb.m Kareem.m Keegan.m Keenan.m Kelvin.m Ken.m Kendrick.m Keneth.m Kennith.m Kenny.m Kent.m Kenton.m Kenyon.m Keon.m Kermit.m Keven.m Kieth.m Kip.m Kirk.m Kiyoshi.m Knute.m Kody.m Korey.m Kory.m Kraig.m Kristofer.m Kristoffer.m Kristopher.m Kurt.m Kurtis.m Lafayette.m Lafe.m Lamar.m Lambert.m Lamont.m Lance.m Landon.m Lanny.m Larkin.m Laron.m Lars.m Laurance.m Lavar.m Lawerence.m Lawson.m Layton.m Lazaro.m Leamon.m Leander.m Leandro.m Leeroy.m Leif.m Leland.m Lem.m Lemmie.m Lemuel.m Len.m Lenard.m Lenny.m Lenord.m Lenwood.m Leonard.m Leonardo.m Leonel.m Leonidas.m Leopold.m Leopoldo.m Leroy.m Les.m Levar.m Levi.m Levy.m Lew.m Liam.m Lige.m Linas.m Lincoln.m Lindell.m Lino.m Linus.m Linwood.m Lionel.m Llewellyn.m Lloyd.m Lon.m Long.m Lonny.m Lonzo.m Loran.m Lorenzo.m Lorin.m Lowell.m Loy.m Loyd.m Lucas.m Lucian.m Luciano.m Lucien.m Lucio.m Lucious.m Lucius.m Ludwig.m Luigi.m Lukas.m Luke.m Lum.m Luther.m Lyle.m Lyman.m Lyndon.m Lynwood.m Mac.m Mack.m Mahlon.m Major.m Mal.m Malachi.m Malcolm.m Malcom.m Malik.m Malvin.m Manford.m Manley.m Mannie.m Manual.m Manuel.m Marc.m Marcel.m Marcelino.m Marcellus.m Marcelo.m Marco.m Marcos.m Marcus.m Margarito.m Mariano.m Markus.m Marlon.m Marmaduke.m Marques.m Marquis.m Marshal.m Mart.m Marvin.m Masao.m Mason.m Mathew.m Mathias.m Matt.m Mauricio.m Mauro.m Max.m Maximo.m Maxwell.m Maynard.m Mckinley.m Mearl.m Mel.m Melton.m Melville.m Melvyn.m Merl.m Merlin.m Merritt.m Merton.m Mervin.m Meyer.m Michale.m Miguel.m Mikel.m Milan.m Milburn.m Miles.m Milford.m Millard.m Milo.m Milton.m Minoru.m Miquel.m Mitch.m Mitchel.m Modesto.m Mohamed.m Mohammad.m Mohammed.m Moises.m Monroe.m Mont.m Monte.m Monty.m Moody.m Morris.m Mortimer.m Morton.m Mose.m Moses.m Moshe.m Muhammad.m Murl.m Murphy.m Murray.m Murry.m Myles.m Myron.m Napoleon.m Nat.m Nathan.m Nathanael.m Nathanial.m Nathaniel.m Nathen.m Neal.m Ned.m Neil.m Nels.m Nelson.m Nestor.m Neville.m Newell.m Newt.m Newton.m Nicholas.m Nicholaus.m Nick.m Nickolas.m Nicolas.m Nigel.m Nikolas.m Noah.m Noble.m Noe.m Nolan.m Norbert.m Norberto.m Normand.m Norris.m Norton.m Norval.m Norwood.m Nunzio.m Oakley.m Obed.m Obie.m Octavio.m Odie.m Odis.m Olaf.m Olan.m Ole.m Olen.m Olin.m Oliver.m Omar.m Omari.m Omer.m Oneal.m Oral.m Oran.m Oren.m Orie.m Orin.m Orland.m Orlando.m Orley.m Orren.m Orrin.m Orson.m Orval.m Orvil.m Orville.m Osborne.m Osvaldo.m Oswald.m Oswaldo.m Otho.m Otis.m Ottis.m Otto.m Owen.m Pablo.m Palmer.m Park.m Parker.m Pasquale.m Pedro.m Percival.m Percivall.m Percy.m Perley.m Pete.m Phil.m Philip.m Phillip.m Pierce.m Pierre.m Pinkney.m Ples.m Porfirio.m Porter.m Prentice.m Preston.m Prince.m Quentin.m Quincy.m Quintin.m Quinton.m Rafael.m Rafe.m Raheem.m Raleigh.m Ralph.m Ramiro.m Ramon.m Ramsey.m Ram.m Ran.m Randal.m Randall.m Randell.m Randolph.m Raoul.m Raphael.m Rashad.m Rashawn.m Rasheed.m Raul.m Rayburn.m Rayford.m Raymon.m Raymundo.m Redden.m Reed.m Reese.m Reggie.m Reginald.m Regis.m Reid.m Reinaldo.m Reinhold.m Renaldo.m Renato.m Reuben.m Rex.m Rey.m Reyes.m Reynaldo.m Reynold.m Rhett.m Ricardo.m Riccardo.m Rice.m Rich.m Richie.m Richmond.m Rick.m Rickey.m Ricky.m Rico.m Rigoberto.m Riley.m Rob.m Robby.m Robt.m Rocco.m Rocky.m Rod.m Roderick.m Rodger.m Rodney.m Rodolfo.m Rodrick.m Rodrigo.m Rogelio.m Roger.m Rogers.m Roland.m Rolando.m Rolf.m Rolla.m Rolland.m Rollie.m Rollin.m Roman.m Romeo.m Ron.m Ronny.m Roosevelt.m Roscoe.m Rosendo.m Rosevelt.m Ross.m Rowland.m Royal.m Rube.m Ruben.m Rubin.m Rudolf.m Rudolph.m Rueben.m Rufus.m Rupert.m Rush.m Russ.m Russel.m Rustin.m Rusty.m Rutherford.m Sal.m Salomon.m Salvador.m Salvatore.m Samir.m Sampson.m Samson.m Samual.m Sanders.m Sanford.m Santiago.m Santo.m Saul.m Schin.m Schuyler.m Scot.m Scotty.m Sebastian.m Sedrick.m Seneca.m Sergio.m Seth.m Seward.m Seymour.m Shad.m Shedrick.m Sheldon.m Shelton.m Sherman.m Sherwood.m Shon.m Sid.m Sigmund.m Silas.m Silvio.m Sim.m Simeon.m Simon.m Smith.m Soloman.m Solomon.m Solon.m Sonny.m Spencer.m Spurgeon.m Squire.m Stan.m Stanford.m Stanley.m Stanton.m Stefan.m Stephan.m Sterling.m Steve.m Stewart.m Stonewall.m Stuart.m Sullivan.m Sumner.m Sylvan.m Sylvester.m Tad.m Tallie.m Talmadge.m Tanner.m Tavares.m Ted.m Teddy.m Teodoro.m Terence.m Terrance.m Terrence.m Tex.m Thad.m Thaddeus.m Theadore.m Theodore.m Theron.m Thornton.m Thurman.m Thurston.m Tilden.m Tillman.m Tim.m Timmy.m Titus.m Tobe.m Tobias.m Tod.m Todd.m Tom.m Tomas.m Toney.m Torrance.m Torrey.m Tremaine.m Tremayne.m Trent.m Trenton.m Trever.m Trevor.m Trey.m Truman.m Tuan.m Tucker.m Ty.m Tyree.m Tyrell.m Tyron.m Tyrone.m Tyson.m Ulysses.m Uriah.m Valentin.m Vance.m Vaughan.m Vaughn.m Vergil.m Verl.m Verle.m Verlin.m Vern.m Verne.m Verner.m Vester.m Vicente.m Vince.m Vincent.m Vincenzo.m Virgilio.m Virgle.m Vishnu.m Vito.m Volney.m Von.m Wade.m Waldo.m Walker.m Wallace.m Wally.m Walton.m Ward.m Wardell.m Warner.m Warren.m Watson.m Watt.m Waverly.m Wayland.m Waylon.m Wayman.m Waymon.m Wayne.m Weaver.m Webb.m Webster.m Weldon.m Wellington.m Welton.m Wendel.m Wendell.m Werner.m Wes.m Westley.m Weston.m Wheeler.m White.m Wilber.m Wilbert.m Wilbur.m Wilburn.m Wiley.m Wilford.m Wilfred.m Wilfredo.m Wilfrid.m Wilhelm.m Wilkie.m Will.m Willam.m Willard.m Williams.m Willian.m Willis.m Willy.m Wilmer.m Wilson.m Wilton.m Windell.m Winfield.m Winford.m Winfred.m Winston.m Winton.m Wm.m Wong.m Woodie.m Woodrow.m Woodson.m Woody.m Wyatt.m Wylie.m Xavier.m Yoel.m Yoshio.m Zachariah.m Zachary.m Zachery.m Zack.m Zackary.m Zackery.m Zane.m Zeb.m Zebulon.m Zeke.m Zollie.m link-grammar-4.7.4/data/en/words/words.n.2.s0000644000175000017500000040250111526022265017503 0ustar bloombloomAfghans.n Africans.n Albanians.n Alberians.n Algerians.n Americans.n Andorrans.n Angentinians.n Angolans.n Antiguans.n Arabs.n Armenians.n Aserbaijanis.n Asians.n Attorneys.n Australians.n Austrians.n Bahamians.n Bangladeshis.n Barbadians.n Belarusians.n Belgians.n Belizians.n Bhutanians.n Bolivians.n Bosnians.n Brazilians.n Britons.n Bruneians.n Buddhists.n Bulgarians.n Burundians.n CDs.n Cambodians.n Cameroonians.n Canadians.n Catholics.n Chileans.n Christians.n Colombians.n Communists.n Corsicans.n Croatians.n Croats.n Cubans.n Cypriotes.n Czechs.n Danes.n Democrats.n Djiboutians.n Dominicans.n Ecuadorians.n Egyptians.n Eritreans.n Estonians.n Ethiopians.n Europeans.n Fijians.n Filipinos.n Finns.n Gabonians.n Gambians.n Georgians.n Germans.n Ghanaians.n Governors.n Greeks.n Grenadans.n Guatemalans.n Guineans.n Haitians.n Hindus.n Hondurans.n Hungarians.n Indians.n Indonesians.n Iranians.n Iraqis.n Israelis.n Italians.n Ivorians.n Jamaicans.n Jews.n Jordanians.n Justices.n Kazakhis.n Kenyans.n Koreans.n Kuwaitis.n Laotians.n Latvians.n Liberians.n Libyans.n Lithuanians.n Luxembourians.n Macedonians.n Madagascans.n Malawians.n Malaysians.n Malians.n Marxists.n Mauritanians.n Mauritians.n Mayors.n Mexicans.n Micronesians.n Ministers.n Moldovans.n Mongolians.n Moroccans.n Mozambicans.n Muslims.n Namibians.n Nauruans.n Nicaraguans.n Nigerians.n Nigeriens.n Norwegians.n Omanis.n Pakistanis.n Panamanians.n Paraguayans.n Peruvians.n Poles.n Presidents.n Protestants.n Qataris.n Represenatives.n Republicans.n Romanians.n Russians.n Rwandans.n Salvadorans.n Samoans.n Scots.n Secretarys.n Senators.n Serbians.n Sicilians.n Slovakians.n Slovenians.n Somalians.n Spaniards.n Swedes.n Syrians.n TVs.n Tanzanians.n Texans.n Trinidadians.n Tunisians.n Turks.n Ugandans.n Ukrainians.n Uruguayans.n VCRs.n Venezuelans.n Yemenis.n Yugoslavians.n Yugoslavs.n abacuses.n abbes.n abbesses.n abbeys.n abbots.n abbreviations.n abdomens.n abductions.n aberrations.n ablauts.n abnormalities.n abodes.n abolitionists.n abominations.n aboriginals.n aborigines.n abortionists.n abortions.n abrasions.n abrasives.n abridgements.n abridgments.n abscesses.n absences.n absentees.n absorbents.n abstentions.n abstractions.n abstracts.n absurdities.n abuses.n abutments.n abysses.n acacias.n academicians.n academics.n academies.n accelerandos.n accelerators.n accents.n accessories.n accidents.n accolades.n accommodations.n accompaniments.n accompanists.n accomplices.n accomplishments.n accordances.n accordions.n accords.n accountants.n accounts.n accretions.n accumulations.n accusatives.n accusers.n aces.n acetates.n aches.n achievements.n acids.n acolytes.n acorns.n acoustics.n acquaintances.n acquaintanceships.n acquiescences.n acquisitions.n acquittals.n acres.n acrobats.n acronyms.n acropolises.n acrostics.n actions.n activists.n activities.n actors.n actresses.n acts.n actualities.n actuaries.n adages.n adagios.n adaptations.n adapters.n adaptors.n adders.n addictions.n addicts.n additions.n additives.n addressees.n addresses.n adherences.n adherents.n adhesions.n adhesives.n adjectives.n adjournments.n adjudicators.n adjuncts.n adjusters.n adjustments.n adjutants.n administrations.n administrators.n admirals.n admiralties.n admissions.n admixtures.n admonitions.n adolescents.n adoptions.n adornments.n ads.n adulterers.n adulteresses.n adulteries.n adulthoods.n adults.n advancers.n advances.n advantages.n advents.n adventurers.n adventures.n adverbs.n adversaries.n adversities.n advertisements.n advertisers.n adverts.n advisers.n advisors.n advocates.n aegises.n aerations.n aerials.n aerodromes.n aeronauts.n aeroplanes.n aerosols.n aesthetes.n affairs.n affectations.n affections.n affidavits.n affiliates.n affiliations.n affinities.n affirmations.n affirmatives.n affixes.n afflictions.n affluents.n affronts.n aftereffects.n afternoons.n afterthoughts.n agencies.n agendas.n agents.n ages.n agglomerations.n aggrandizements.n aggravations.n aggregates.n aggregations.n aggressions.n aggressors.n agidigbos.n agitations.n agitators.n agnostics.n agonies.n agoras.n agreements.n agronomists.n aides.n aids.n ailments.n aims.n airbeds.n airbrakes.n aircrafts.n aircrews.n airfields.n airflows.n airings.n airliners.n airlines.n airplanes.n airports.n airs.n airships.n airstrips.n airwaves.n airways.n aisles.n alarmists.n alarms.n albatrosses.n albinos.n albums.n alchemists.n alcoholics.n alcoves.n alerts.n ales.n algorithms.n aliases.n alibis.n aliens.n alignments.n alkalis.n allegories.n allegrettos.n allegros.n allergens.n allergies.n alleviations.n alleys.n alleyways.n alliances.n allies.n alligators.n allocations.n allotments.n allowances.n alloys.n allures.n allusions.n almanacs.n almonds.n alphabets.n alphas.n alphorns.n alsatians.n altars.n alterations.n altercations.n alternates.n alternations.n alternatives.n altimeters.n altitudes.n altos.n altruists.n alveolars.n amalgamations.n amalgams.n amateurs.n ambassadors.n ambiguities.n ambits.n ambulances.n ambushes.n amendments.n amenities.n amnesties.n amoebas.n amortizations.n amours.n amperes.n amphetamines.n amphibians.n amphitheatres.n amphoras.n amplifications.n amplifiers.n amps.n amputations.n amulets.n amusements.n anachronisms.n anacondas.n anaesthetics.n anaesthetists.n anagrams.n analgesics.n analogies.n analogs.n analogues.n analyses.n analysts.n anapaests.n anarchists.n anatomists.n ancestors.n ancestries.n anchorages.n anchorites.n anchors.n anchovies.n andantes.n anecdotes.n aneroids.n anesthetics.n anesthetists.n angels.n anglers.n angles.n anglicisms.n angoras.n animals.n animosities.n anises.n ankles.n anklets.n annexes.n anniversaries.n annotations.n announcers.n annoyances.n annuals.n annuities.n annunciations.n anodes.n anointments.n anomalies.n anoraks.n antagonisms.n antagonists.n antecedents.n antechambers.n antelopes.n anterooms.n antes.n anthems.n anthologies.n anthropoids.n anthropologists.n antibiotics.n antibodies.n anticlimaxes.n antics.n antidotes.n antipathies.n antiquarians.n antiquaries.n antiques.n antiquities.n antiseptics.n antitoxins.n antlers.n antonyms.n ants.n anuses.n anvils.n anxieties.n aortas.n apaches.n apartments.n aperitifs.n apertures.n apes.n apexes.n aphorisms.n aphrodisiacs.n apiaries.n apocalypses.n apogees.n apologies.n apologists.n apostates.n apostles.n apostrophes.n apothecaries.n apparatuses.n apparitions.n appeals.n appearances.n appellants.n appellations.n appendages.n appendectomies.n appendixes.n appetites.n appetizers.n apples.n appliances.n applicants.n applications.n applicators.n appointees.n appointments.n appraisals.n appraisers.n appreciations.n apprehensions.n apprentices.n apprenticeships.n approaches.n appropriations.n approvals.n approximations.n apricots.n aprons.n apses.n aptitudes.n aqualungs.n aquaplanes.n aquariums.n aqueducts.n arabesques.n arachnids.n arbiters.n arbitragers.n arbitrations.n arbitrators.n arbours.n arcades.n archaeologists.n archaisms.n archangels.n archbishoprics.n archbishops.n archdeaconries.n archdeacons.n archdioceses.n archdukes.n archers.n arches.n archetypes.n archipelagos.n architects.n archivists.n archlutes.n archways.n arcs.n areas.n arenas.n ares.n arias.n aristocracies.n aristocrats.n arithmeticians.n arks.n armadas.n armadillos.n armaments.n armatures.n armbands.n armchairs.n armfuls.n armies.n armistices.n armlets.n armouries.n armpits.n arms.n aromas.n arpeggiones.n arpeggios.n arraignments.n arrangements.n arrays.n arrears.n arresters.n arrests.n arrivals.n arrowheads.n arrows.n arseholes.n arsenals.n arses.n artefacts.n arteries.n artichokes.n articles.n articulations.n artifacts.n artifices.n artisans.n artistes.n artists.n arts.n artworks.n ascendants.n ascendents.n ascensions.n ascents.n ascetics.n ascriptions.n ashes.n ashtrays.n asides.n aspects.n aspens.n aspersions.n aspirants.n aspirates.n aspirations.n aspirins.n asps.n assailants.n assassinations.n assassins.n assaults.n assays.n assemblages.n assemblies.n assents.n asses.n assessments.n assessors.n assets.n assholes.n assignments.n assistants.n associates.n associations.n assortments.n asterisks.n asteroids.n astrodomes.n astrologers.n astronauts.n astronomers.n asylums.n asymptotes.n atheists.n athletes.n atlases.n atmospheres.n atolls.n atomizers.n atoms.n atrocities.n attaches.n attachments.n attackers.n attacks.n attainments.n attendants.n attics.n attitudes.n attorneys.n attractions.n attributes.n attributions.n aubergines.n auctioneers.n auctions.n audiences.n auditions.n auditoriums.n auditors.n audits.n augmentations.n auguries.n aunties.n aunts.n auras.n aureoles.n auricles.n auroras.n autarchies.n authoritarians.n authorities.n authorizations.n authors.n autobahns.n autobiographies.n autocracies.n autocrats.n autographs.n automatics.n automatons.n automats.n automobiles.n autopsies.n autos.n autostradas.n autumns.n auxiliaries.n avalanches.n avatars.n avengers.n avenues.n averages.n aversions.n aviaries.n aviators.n avocados.n avocations.n avowals.n awards.n awls.n awnings.n axes.n axioms.n axles.n azaleas.n azimuths.n babels.n babes.n babies.n baboons.n babysitters.n baccalaureates.n bacchanals.n bachelors.n backaches.n backbenchers.n backbenches.n backbiters.n backboards.n backbones.n backdoors.n backdrops.n backers.n backgrounds.n backings.n backlashes.n backlogs.n backrooms.n backs.n backscratchers.n backseats.n backsides.n backstrokes.n backups.n backwaters.n bacteriologists.n badgers.n badges.n badlands.n baffles.n bagatelles.n bagels.n bagpipes.n bags.n baileys.n bailiffs.n bailouts.n bails.n baits.n bakeries.n bakers.n balalaikas.n balances.n balconies.n bales.n balks.n ballades.n ballads.n ballbearings.n ballcocks.n ballerinas.n ballets.n balloonists.n balloons.n ballots.n ballpens.n ballpoints.n ballrooms.n balls.n balustrades.n bambinos.n banalities.n bananas.n bandages.n bandannas.n bandits.n bandleaders.n bandmasters.n bandoneóns.n bands.n bandstands.n banduras.n bandwagons.n bangers.n bangles.n bangs.n banisters.n banjos.n bankers.n banknotes.n bankrolls.n bankruptcies.n banks.n banners.n bannisters.n banquets.n bans.n banshees.n baptisms.n barbarians.n barbarisms.n barbarities.n barbecues.n barbels.n barbers.n barbicans.n barbiturates.n barbs.n barcaroles.n barcarolles.n bards.n bargains.n bargepoles.n barges.n baritones.n barkers.n barmaids.n barnacles.n barns.n barnstormers.n barnyards.n barometers.n baronages.n baronesses.n baronetcies.n baronets.n baronies.n barons.n barracks.n barracudas.n barrages.n barrels.n barricades.n barriers.n barristers.n barrows.n bars.n bartenders.n barytons.n bas-reliefs.n baseballs.n baseboards.n basements.n bases.n bashes.n basilicas.n basilisks.n basins.n basketballs.n baskets.n basses.n bassinets.n bassoons.n bassos.n bastards.n bastions.n batches.n bathers.n bathrobes.n bathrooms.n baths.n bathtubs.n batons.n bats.n battalions.n battens.n batteries.n batters.n battledores.n battlefields.n battlegrounds.n battles.n battleships.n baubles.n bawus.n bayans.n bayonets.n bayous.n bays.n bazaars.n bazookas.n beachcombers.n beaches.n beachheads.n beacons.n beadles.n beads.n beagles.n beakers.n beaks.n beams.n beanfeasts.n beanos.n beans.n beanstalks.n beards.n bearers.n bearings.n bears.n bearskins.n beasts.n beaters.n beatings.n beatniks.n beats.n beauticians.n beauties.n beavers.n becks.n bedbugs.n bedfellows.n bedpans.n bedposts.n bedrocks.n bedrolls.n bedrooms.n beds.n bedsides.n bedsits.n bedsitters.n bedsores.n bedspreads.n bedsteads.n bedtimes.n beeches.n beefeaters.n beefsteaks.n beehives.n beepers.n beeps.n beers.n bees.n beetles.n beetroots.n beets.n beggars.n beginners.n beginnings.n begonias.n behaviors.n behaviourists.n behinds.n beholders.n beings.n belches.n belfries.n believers.n bellboys.n belles.n bellhops.n bellies.n belligerents.n bells.n bellwethers.n bellyaches.n bellyflops.n bellyfuls.n bellylaughs.n belts.n benches.n benchmarks.n bends.n benedictions.n benefactions.n benefactors.n benefactresses.n beneficiaries.n benefits.n bequests.n bereavements.n berets.n berries.n berths.n beryls.n bestiaries.n bestowals.n betas.n betrayals.n betrayers.n betrothals.n betrotheds.n bets.n bettors.n bevels.n beverages.n bevies.n biases.n bibliographers.n bibliographies.n bibliophiles.n bibs.n bicentenaries.n bicentennials.n biceps.p bicycles.n bidders.n bidets.n bids.n biennials.n biffs.n bifurcations.n bigamists.n bigots.n bigwigs.n bikes.n bikinis.n bilabials.n bilinguals.n billboards.n billets.n billfolds.n billies billings.n billionaires.n billionths.n billows.n binaries.n binderies.n binders.n binds.n bings.n bins.n biochemicals.n biographers.n biographies.n biologists.n bioscopes.n bipeds.n biplanes.n birches.n birdcages.n birds.n birdwatchers.n biros.n birthdays.n birthmarks.n birthplaces.n birthrates.n birthrights.n births.n biscuits.n bisexuals.n bishoprics.n bishops.n bison.p bistros.n bites.n bits.n bitches.n bivouacs.n blabbermouths.n blackamoors.n blackberries.n blackbirds.n blackboards.n blackcurrants.n blackguards.n blackheads.n blacklists.n blackmailers.n blackouts.n blacks.n blacksmiths.n bladders.n blades.n blancmanges.n blandishments.n blankets.n blanks.n blasphemers.n blasphemies.n blasts.n blazers.n blazes.n bleats.n bleeps.n blemishes.n blends.n blessings.n blighters.n blights.n blimps.n blindfolds.n blinks.n blips.n blisters.n blitzes.n blitzkriegs.n blizzards.n blobs.n blockades.n blockages.n blockbusters.n blockheads.n blockhouses.n blocks.n blocs.n blokes.n blondes.n blonds.n bloodhounds.n bloodsheds.n bloodstains.n bloodsuckers.n bloomers.n blooms.n blossoms.n blotches.n blots.n blotters.n blouses.n blowers.n blowflies.n blowholes.n blowlamps.n blowouts.n blowpipes.n blows.n blowtorches.n bludgeons.n bluebells.n bluebottles.n blueprints.n blues.n bluestockings.n bluffers.n bluffs.n blunderbusses.n blunderers.n blunders.n blurbs.n blurs.n blushes.n boarders.n boardings.n boardrooms.n boards.n boardwalks.n boars.n boas.n boasters.n boasts.n boaters.n boathouses.n boats.n boatswains.n bobbies.n bobsleds.n bobsleighs.n bobtails.n bodegas.n bodices.n bodies.n bodyguards.n bogeys.n bogies.n bogs.n bohemians.n boilers.n boils.n boleros.n bollocks.n bolsters.n bolts.n bombardes.n bombardiers.n bombers.n bombings.n bombs.n bombshells.n bonanzas.n bonbons.n bondholders.n bonds.n boners.n bones.n boneshakers.n bonfires.n bongos.n bonnets.n bonuses.n boobies.n boobs.n boogies.n bookcases.n bookclubs.n bookies.n bookkeepers.n booklets.n bookmakers.n bookmarkers.n bookmarks.n bookmobiles.n books.n booksellers.n bookshops.n bookstalls.n bookworms.n boomerangs.n boomers.n booms.n boons.n boors.n boos.n boosters.n boosts.n booths.n bootlaces.n bootleggers.n boots.n boozers.n borderlands.n borderlines.n borders.n bordonuas.n bores.n boroughs.n borrowers.n borrowings.n borzois.n bosoms.n bosses.n bosuns.n botanists.n bottlenecks.n bottles.n bottoms.n boudoirs.n boughs.n boulders.n boulevards.n bounces.n boundaries.n bounders.n bounds.n bounties.n bouquets.n bourbons.n bourgeoisies.n bournes.n bourses.n boutiques.n bouts.n bouzoukis.n bowels.n bowers.n bowlers.n bowls.n bows.n boxers.n boxes.n boxfuls.n boycotts.n boyfriends.n boys.n bracelets.n braces.n brackets.n braggarts.n braids.n brains.n brainstorms.n brainwaves.n brakes.n brambles.n branches.n brandies.n brands.n bras.n brasseries.n brasses.n brassieres.n brats.n braves.n brawlers.n brawls.n brays.n braziers.n breaches.n breadbaskets.n breadcrumbs.n breadlines.n breadths.n breadwinners.n breakages.n breakaways.n breakdowns.n breakers.n breakfasts.n breaks.n breakthroughs.n breakups.n breakwaters.n breasts.n breathalysers.n breathers.n breaths.n breeches.n breeders.n breeds.n breezes.n breves.n breviaries.n breweries.n brewers.n brews.n briars.n bribes.n brickbats.n brickkilns.n bricklayers.n bricks.n bridals.n bridegrooms.n brides.n bridesmaids.n bridgeheads.n bridges.n bridles.n briefcases.n briefers.n briefs.n brigades.n brigands.n brigs.n brims.n brinks.n brioches.n briquets.n briquettes.n bristles.n broadcasters.n broadcasts.n broads.n broadsheets.n broadsides.n brocades.n brochures.n brogues.n broilers.n brokerages.n brokers.n brollies.n bromides.n broncos.n bronzes.n brooches.n broods.n brooks.n brooms.n broomsticks.n brothels.n brotherhoods.n brothers.n brouhahas.n brownies.n brownstones.n brows.n browses.n bruins.n bruisers.n bruises.n brunches.n brunettes.n brunts.n brushes.n brushworks.n brutalities.n brutes.n bubbles.n buccaneers.n bucketfuls.n buckets.n bucklers.n buckles.n bucks.n buddies.n budgerigars.n budgets.n budgies.n buds.n buffaloes.n buffers.n buffets.n buffoons.n buffs.n bugaboos.n bugbears.n buggers.n buggies.n buglers.n bugles.n bugs.n builders.n buildings.n bulbs.n bulges.n bulldogs.n bulldozers.n bulletins.n bullets.n bullfighters.n bullfights.n bullfinches.n bullfrogs.n bullies.n bullocks.n bullrings.n bullroarers.n bulls.n bulwarks.n bumblebees.n bumpers.n bumpkins.n bumps.n bums.n bunches.n bundles.n bungalows.n bunglers.n bungs.n bunions.n bunkers.n bunks.n bunnies.n buns.n buoys.n burdens.n bureaucracies.n bureaucrats.n bureaus.n burettes.n burgesses.n burghers.n burghs.n burglaries.n burglars.n burgomasters.n burgs.n burials.n burlesques.n burners.n burns.n burps.n burritos.n burros.n burrows.n burrs.n bursaries.n bursars.n bursts.n burthens.n buses.n bushels.n bushes.n businesses.n buskers.n busters.n bustles.n busts.n busybodies.n butchers.n butlers.n buttercups.n butterflies.n butteries.n buttocks.n buttonholes.n buttonhooks.n buttons.n buttresses.n butts.n buyers.n buyouts.n buzzards.n buzzers.n buzzes.n by-products.n byes.n bygones.n bylaws.n bypasses.n byproducts.n byroads.n bystanders.n bytes.n byways.n bywords.n C-bands.n cabals.n cabarets.n cabbages.n cabbies.n cabers.n cabinets.n cabins.n cablegrams.n cables.n caboodles.n cabooses.n cabs.n cabstands.n caches.n cackles.n cacophonies.n cactuses.n cadavers.n caddies.n cadences.n cadenzas.n cadets.n cadres.n cads.n caesuras.n cafes.n cafeterias.n caftans.n cages.n cairns.n cakes.n calamities.n calculations.n calculators.n caldrons.n calendars.n calfs.n calibrations.n calibres.n califs.n caliphates.n caliphs.n callers.n callings.n calliopes.n calls.n calories.n calumnies.n calves.n calypsos.n camels.n cameos.n cameras.n campaigners.n campers.n camps.n campuses.n canals.n canapes.n canards.n canaries.n cancans.n cancellations.n cancers.n candidacies.n candidates.n candies.n candles.n candlesticks.n canes.n canisters.n canneries.n cannibals.n cannons.n canoes.n canons.n canopies.n cans.n cantaloupes.n cantatas.n canteens.n canters.n canticles.n cantilevers.n cantons.n cantors.n cantos.n canvases.n canvasses.n canyons.n capabilities.n capers.n capes.n capillaries.n capitalists.n capitals.n capons.n cappuccinos.n caprices.n caps.n capsules.n captains.n captions.n captives.n captors.n captures.n carafes.n caramels.n carats.n caravans.n caravansaries.n caravanserais.n caraways.n carbides.n carbines.n carbohydrates.n carbons.n carbuncles.n carburettors.n carcasses.n cardigans.n cardinals.n cardmembers.n cards.n careerists.n careers.n cares.n caresses.n caretakers.n carets.n cargoes.n caribou.p caricatures.n caricaturists.n carillons.n carloads.n carmines.n carnations.n carnivals.n carnivores.n carols.n carousels.n carp.p carpenters.n carpetbaggers.n carpets.n carports.n carriages.n carriageways.n carriers.n carrots.n cars.n cartels.n carters.n carthorses.n cartilages.n cartloads.n cartographers.n cartons.n cartoonists.n cartoons.n cartridges.n carts.n cartwheels.n carvers.n cascades.n casebooks.n casements.n cases.n cashews.n cashiers.n casinos.n caskets.n casseroles.n cassettes.n castaways.n castes.n castings.n castles.n castors.n castrations.n castratos.n casts.n casualties.n cataclysms.n catalogs.n catalogues.n catalysts.n catamarans.n catapults.n cataracts.n catastrophes.n catcalls.n catchers.n catches.n catchments.n catchwords.n catechisms.n categories.n caterers.n caterpillars.n catfish.p cathedrals.n cathodes.n catkins.n cats.n catsups.n catwalks.n caucuses.n cauldrons.n cauliflowers.n causes.n causeways.n cautions.n cavalcades.n cavaliers.n cavalries.n caveats.n caverns.n caves.n cavities.n ceasefires.n cedars.n cedillas.n ceilings.n celebrants.n celebrations.n celebrities.n celestas.n cellars.n cellists.n cellos.n cells.n cemeteries.n censors.n censorships.n censures.n censuses.n centaurs.n centenarians.n centenaries.n centennials.n centerpieces.n centers.n centiliters.n centilitres.n centimes.n centimeters.n centimetres.n centipedes.n centiseconds.n centiwatts.n centrepieces.n centres.n centrexes.n centrifuges.n centurions.n cereals.n ceremonials.n ceremonies.n certainties.n certificates.n certifications.n cervixes.n cesspits.n cesspools.n chaffinches.n chains.n chairs.n chaises.n chalets.n chalices.n chalkpits.n chalks.n challengers.n challenges.n chalumeaus.n chamberlains.n chambermaids.n chamberpots.n chambers.n chameleons.n chamoises.n champagnes.n champions.n championships.n champs.n chancelleries.n chancellors.n chancels.n chanceries.n chandeliers.n chandlers.n changelings.n changeovers.n changes.n channels.n chants.n chapels.n chaperons.n chaplains.n chaps.n chapterhouses.n chapters.n charabancs.n characters.n charades.n chargers.n charges.n charioteers.n chariots.n charities.n charladies.n charlatans.n charmers.n charms.n charters.n charts.n chasers.n chases.n chasms.n chassis.p chasubles.n chats.n chatterboxes.n chauffeurs.n chauvinists.n cheats.n checkbooks.n checkers.n checklists.n checkmates.n checkouts.n checkpoints.n checkrooms.n checks.n checkups.n cheekbones.n cheeks.n cheeps.n cheerleaders.n cheers.n cheesecakes.n cheesecloths.n cheetahs.n chefs.n chemicals.n chemises.n chemists.n chequebooks.n cheques.n cherries.n cherubs.n chessboards.n chesterfields.n chestnuts.n chests.n chews.n chickens.n chickpeas.n chicks.n chiefs.n chieftains.n childhoods.n chile_poblanos chile_rellenos chile_verdes chiles.n chiles_poblanos chiles_rellenos chiles_verdes chills.n chimeras.n chimes.n chimneypots.n chimneys.n chimneysweepers.n chimneysweeps.n chimpanzees.n chimps.n chinchillas.n chinks.n chins.n chipmunks.n chips.n chiropodists.n chiropractors.n chirps.n chirrups.n chisels.n chitarras.n chits.n chives.n chocolates.n chocs.n choices.n choirboys.n choirs.n chokers.n chokes.n choppers.n chops.n chopsticks.n chorales.n chords.n choreographers.n chores.n choristers.n chortles.n choruses.n chows.n christenings.n chromosomes.n chroniclers.n chronicles.n chronologies.n chronometers.n chrysalises.n chrysanthemums.n chuckles.n chucks.n chugs.n chumps.n chums.n chunks.n churches.n churchgoers.n churchwardens.n churchyards.n churns.n chutes.n cicadas.n ciders.n cigarettes.n cigars.n cimbaloms.n cinctures.n cinders.n cinemas.n ciphers.n circles.n circuits.n circulars.n circulations.n circumferences.n circumflexes.n circumlocutions.n circumstances.n circuses.n cissies.n cisterns.n citadels.n citations.n cities.n citizens.n citrons.n citterns.n civilians.n civilities.n civilizations.n claimants.n clairvoyants.n clambakes.n clamours.n clamps.n clams.n clangs.n clanks.n clans.n clapboards.n clapperboards.n clappers.n claps.n clarets.n clarinetists.n clarinets.n clarinettists.n clarions.n clashes.n clasps.n classes.n classicists.n classics.n classifications.n classmates.n classrooms.n clauses.n clavichords.n clavicles.n clavinets.n claws.n cleaners.n cleansers.n cleanups.n clearances.n clearings.n cleats.n cleavages.n cleavers.n clefs.n clefts.n clerestories.n clergies.n clerics.n clerks.n cliches.n clicks.n clienteles.n clients.n cliffs.n climates.n climaxes.n climbers.n climes.n clinchers.n clinches.n clinics.n clinks.n clippers.n clips.n cliques.n clitorises.n cloakrooms.n cloaks.n clocks.n clodhoppers.n clods.n clogs.n cloisters.n clones.n closets.n clothes.n clotheshorses.n clotheslines.n clothiers.n cloths.n clots.n cloudbursts.n clouds.n cloves.n clowns.n clubbers.n clubhouses.n clubs.n clucks.n clues.n clumps.n clunks.n clusters.n clutches.n clutters.n co-operatives.n co-ops.n coaches.n coalfields.n coalitions.n coalmines.n coalpits.n coals.n coasters.n coastguards.n coastlines.n coasts.n coatings.n coats.n cobblers.n cobbles.n cobblestones.n cobras.n cobs.n cobwebs.n cochleas.n cockatoos.n cockerels.n cockers.n cockhorses.n cockleshells.n cockneys.n cockpits.n cockroaches.n cocks.n cockscombs.n cocktails.n coconuts.n cocoons.n cocos.n codas.n codes.n codfish.p codgers.n codifications.n codpieces.n cods.n coefficients.n coffees.n coffers.n coffins.n cognates.n cogs.n cogwheels.n cohorts.n coiffeurs.n coiffures.n coifs.n coils.n coinages.n coincidences.n coins.n cokes.n colas.n colds.n collaborationists.n collaborators.n collages.n collapses.n collarbones.n collars.n colleagues.n collections.n collectors.n colleges.n collieries.n colliers.n collies.n collisions.n colloquialisms.n colloquies.n colonels.n colonialists.n colonials.n colonies.n colonists.n colonizers.n colonnades.n colons.n colors.n colours.n colts.n columbines.n columnists.n columns.n comas.n combatants.n combinations.n combines.n combs.n comebacks.n comedians.n comediennes.n comedies.n comedowns.n comers.n comets.n comforters.n comforts.n comics.n commandants.n commanders.n commandments.n commandos.n commands.n commas.n commencements.n commendations.n commentaries.n commentators.n commercials.n commissariats.n commissaries.n commissars.n commissionaires.n commissioners.n commissions.n committees.n commodes.n commodities.n commodores.n commonplaces.n commonwealths.n commotions.n communes.n communicants.n communications.n communions.n communiques.n communists.n communities.n commutations.n commuters.n compacts.n companies.n companions.n comparatives.n compares.n comparisons.n compartments.n compasses.n compatriots.n compendiums.n compensations.n competitions.n competitors.n compilations.n compilers.n complainants.n complements.n complexes.n complexions.n complexities.n complications.n compliments.n components.n comportments.n composers.n composites.n compositions.n compotes.n compounds.n compressors.n compromises.n comptrollers.n computations.n computers.n comrades.n comradeships.n concatenations.n concavities.n conceits.n concentrates.n concentrations.n conceptions.n concertinas.n concertos.n concerts.n concessionaires.n concessions.n conches.n conchs.n concierges.n conclaves.n concoctions.n concordances.n concordats.n concords.n concourses.n concubines.n concurrences.n concussions.n condemnations.n condensations.n condiments.n conditioners.n condolences.n condominiums.n condors.n conductivities.n conductors.n conductresses.n conduits.n cones.n coneys.n confabs.n confabulations.n confectioners.n confections.n confederacies.n confederates.n confederations.n conferences.n confessionals.n confessions.n confessors.n confidantes.n confidants.n configurations.n confirmations.n conflagrations.n conflicts.n confluences.n conformations.n conformists.n confreres.n confrontations.n confutations.n congas.n conglomerates.n conglomerations.n congratulations.n congregations.n congresses.n conifers.n conjectures.n conjugates.n conjugations.n conjunctions.n conjunctives.n conjurers.n conjurors.n conkers.n conks.n connections.n connectives.n connectors.n connexions.n connoisseurs.n connotations.n conquerors.n conquests.n conquistadors.n cons.n consciences.n conscripts.n consecrations.n consequences.n conservancies.n conservatives.n conservatoires.n conservatories.n considerations.n consistencies.n consolations.n consoles.n consolidations.n consommes.n consonants.n consorts.n conspectuses.n conspiracies.n conspirators.n constables.n constabularies.n constants.n constellations.n constituencies.n constituents.n constitutionalists.n constitutions.n constraints.n constrictions.n constructions.n constructors.n constructs.n consulates.n consuls.n consulships.n consultants.n consultations.n consumers.n consummations.n consumptives.n contacts.n contagions.n containers.n contaminants.n contemporaries.n contenders.n contents.n contestants.n contests.n contexts.n continents.n contingencies.n contingents.n continuations.n contortionists.n contortions.n contours.n contrabasses.n contrabassoons.n contraceptives.n contractions.n contractors.n contracts.n contradictions.n contraltos.n contraptions.n contraries.n contrasts.n contraventions.n contretemps.p contributions.n contributors.n contrivances.n controllers.n controls.n controversies.n contusions.n conundrums.n conurbations.n convalescents.n conveniences.n conventions.n convents.n conversationalists.n conversations.n conversions.n converters.n convertibles.n converts.n conveyances.n conveyers.n conveyors.n convicts.n convocations.n convolutions.n convoys.n convulsions.n cookbooks.n cookers.n cookies.n cooks.n coolants.n coolers.n coolies.n coons.n coopers.n coops.n coordinates.n coordinators.n coos.n coots.n copartners.n copartnerships.n copes.n copies.n coppersmiths.n cops.n copses.n copulas.n copycats.n copyists.n copywriters.n coquettes.n corals.n cordials.n cordons.n cords.n coreligionists.n cores.n corgis.n corkers.n corks.n corkscrews.n cormorants.n corncobs.n corneas.n corners.n cornerstones.n cornets.n cornetts.n cornflakes.n cornflowers.n cornices.n cornucopias.n corollaries.n corollas.n coronaries.n coronas.n coronations.n coroners.n coronets.n corporals.n corporates.n corporations.n corps.p corpses.n corpuscles.n corrals.n corrections.n correctives.n correlations.n correlatives.n correspondences.n correspondents.n corridors.n corrosives.n corsages.n corsets.n cortexes.n coruscations.n corvettes.n cosies.n cosines.n cosmeticians.n cosmetics.n cosmonauts.n cosmopolitans.n costs.n costumes.n costumiers.n coteries.n cotillions.n cots.n cottages.n cottontails.n couches.n couchettes.n cougars.n coughs.n councillors.n councils.n counsellors.n counselors.n counsels.n countdowns.n countenances.n counterattacks.n counterbalances.n counterblasts.n counterclaims.n counterfeiters.n counterfeits.n counterfoils.n counteroffers.n counterparts.n counterplots.n counterpoints.n counterproposals.n counters.n countertenors.n countesses.n counties.n countries.n counts.n coupes.n couples.n couplets.n couplings.n coupons.n coups.n couriers.n courses.n courtesans.n courtesies.n courtiers.n courtrooms.n courts.n courtships.n courtyards.n cousins.n covenants.n coverings.n coverlets.n covers.n coverts.n coves.n cowards.n cowbells.n cowboys.n cowcatchers.n cowhands.n cowherds.n cowhides.n cows.n cowslips.n coxcombs.n coxes.n coxswains.n coyotes.n crabs.n crackdowns.n crackers.n crackpots.n cracks.n cradles.n crafts.n cramps.n cranberries.n cranes.n craniums.n cranks.n crankshafts.n crannies.n craps.n crashes.n craters.n crates.n cravats.n cravens.n cravings.n crawfishes.n crayfishes.n crayons.n crazes.n creaks.n creameries.n creams.n creases.n creations.n creators.n creatures.n creches.n creditors.n credits.n credos.n creeds.n creeks.n creepers.n creeps.n cremations.n crematoriums.n crescendos.n crescents.n crests.n cretins.n crevasses.n crevices.n crews.n cribs.n cricketers.n crickets.n cricks.n criers.n cries.n crimes.n criminals.n crimsons.n crinkles.n crinolines.n cripples.n crises.n crisps.n criterions.n criticisms.n critics.n critiques.n croaks.n crocks.n crocodiles.n crocuses.n croissants.n cromornes.n crones.n cronies.n crooks.n crooners.n croppers.n crops.n crossbars.n crossbeams.n crossbows.n crossbreeds.n crosschecks.n crosscurrents.n crosscuts.n crosses.n crossings.n crosswalks.n crosswords.n crotches.n crotchets.n crouches.n crowbars.n crowds.n crowns.n crows.n crucibles.n crucifixes.n crucifixions.n crudes.n cruelties.n cruisers.n cruises.n crumbs.n crumhorns.n crumpets.n crunches.n cruppers.n crusaders.n crusades.n crushes.n crustaceans.n crusts.n crutches.n cruxes.n crwths.n crybabies.n cryptograms.n crypts.n crystallizations.n crystallophones.n crystals.n cuatros.n cubbyholes.n cubes.n cubicles.n cubists.n cubs.n cuckolds.n cuckoos.n cucumbers.n cuddles.n cudgels.n cues.n cuffs.n cullenders.n culminations.n culprits.n cults.n cultures.n cummerbunds.n cunts.n cupboards.n cupfuls.n cupolas.n cuprophones.n cups.n curates.n curators.n curbs.n curds.n cure-alls.n cures.n curfews.n curios.n curiosities.n curlers.n curls.n curmudgeons.n currants.n currencies.n currents.n curriculums.n curries.n curs.n curses.n curtailments.n curtains.n curtseys.n curtsies.n curves.n cushions.n cuspidors.n cusps.n cusses.n custards.n custodians.n customers.n customs.n cutbacks.n cuticles.n cutlasses.n cutlets.n cuts.n cutters.n cuttings.n cuttlefishes.n cycles.n cyclists.n cyclones.n cyclopaedias.n cyclostyles.n cyclotrons.n cygnets.n cylinders.n cymbals.n cymbalums.n cynics.n cyphers.n cypresses.n cysts.n czarinas.n czars.n dabblers.n dabs.n dachas.n dachshunds.n dactyls.n daddies.n dads.n daemons.n daffodils.n daggers.n dagos.n daguerreotypes.n dahlias.n dailies.n dainties.n dairies.n dairymaids.n daises.n daisies.n dales.n dalmatians.n damages.n dames.n dams.n damselflies damsels.n dancers.n dances.n dandelions.n dandies.n daredevils.n dares.n darkrooms.n darlings.n darns.n darts.n dashboards.n dashes.n datelines.n dates.n daughters.n dauphins.n davenports.n dawdlers.n dawns.n daybooks.n dayboys.n daydreams.n daygirls.n daytimes.n deaconesses.n deacons.n deadlines.n deadlocks.n dealers.n dealings.n deals.n deaneries.n deans.n deathbeds.n deathblows.n deaths.n deathtraps.n debacles.n debaters.n debates.n debauchees.n debaucheries.n debentures.n debits.n debtors.n debts.n debutantes.n debuts.n decanters.n deceits.n deceptions.n decibels.n deciliters.n decilitres.n decimeters.n decimetres.n deciseconds.n deciwatts.n deckers.n decks.n declarations.n declensions.n declines.n declivities.n decoders.n decorations.n decorators.n decoys.n decreases.n decrees.n dedications.n deductions.n deeds.n deerskins.n deerstalkers.n defaulters.n defeatists.n defeats.n defections.n defectors.n defects.n defences.n defendants.n defenders.n defenses.n deficiencies.n deficits.n definitions.n defoliants.n deformities.n defrosters.n degenerates.n degradations.n degrees.n deities.n delays.n delegates.n delegations.n deletions.n deliberations.n delicacies.n delicatessens.n delights.n delineations.n delinquents.n deliverances.n deliveries.n dells.n deltas.n deluges.n delusions.n demagogues.n demands.n demarches.n demeanours.n demerits.n demigods.n demises.n democracies.n democrats.n demolitions.n demoniacs.n demons.n demonstrations.n demonstrators.n demos.n demotions.n denials.n denizens.n denominations.n denominators.n denouements.n dens.n densities.n dentists.n dents.n dentures.n denunciations.n deodorants.n departments.n departures.n dependants.n dependencies.n dependents.n depictions.n deportations.n deportees.n depositions.n depositories.n depositors.n deposits.n depots.n depravities.n depressions.n depressives.n deprivations.n depths.n deputies.n derailments.n derbies.n derivations.n derivatives.n dermatologists.n derricks.n dervishes.n descants.n descendants.n descents.n descriptions.n deserters.n desertions.n deserts.n designations.n designers.n designs.n desks.n despatches.n desperadoes.n despotisms.n despots.n desserts.n dessertspoonfuls.n dessertspoons.n destinations.n destinies.n destroyers.n detachments.n details.n detainees.n detectives.n detectors.n detentions.n detergents.n deteriorations.n determinants.n determinations.n determiners.n deterrents.n dethronements.n detonations.n detonators.n detours.n detractors.n deuces.n devaluations.n developers.n developments.n deviants.n deviations.n devices.n devils.n devotees.n devotions.n dholaks.n dhows.n diabetics.n diacritics.n diagnoses.n diagonals.n diagrams.n dialecticians.n dialectics.n dialects.n dialogues.n dials.n diameters.n diamonds.n diapers.n diaphragms.n diaries.n diarists.n diatribes.n dichotomies.n dickeys.n dickybirds.n dictates.n dictations.n dictators.n dictatorships.n dictionaries.n dictums.n didgeridoos.n diesels.n dieticians.n diets.n differences.n differentials.n differentiations.n difficulties.n diffractions.n digestions.n digests.n diggers.n digits.n dignitaries.n digressions.n digs.n dikes.n dilemmas.n dilettantes.n dilutions.n dimensions.n dimes.n diminuendos.n diminutions.n diminutives.n dimples.n dinars.n diners.n dinghies.n dinners.n dinosaurs.n dints.n diocesans.n dioceses.n dioxides.n diphthongs.n diplomas.n diplomatists.n diplomats.n dippers.n dips.n dipsticks.n diptychs.n directions.n directives.n directorates.n directories.n directors.n directorships.n dirges.n dirigibles.n dirndls.n disabilities.n disadvantages.n disagreements.n disappearances.n disappointments.n disassembblies disasters.n disbursements.n discards.n discharges.n disciples.n disciplinarians.n disciplines.n disclaimers.n discomforts.n discontinuities.n discords.n discos.n discotheques.n discounts.n discouragements.n discourses.n discourtesies.n discoverers.n discrepancies.n discs.n discuses.n discussions.n diseases.n disfigurements.n disguises.n dishcloths.n dishes.n dishfuls.n dishwashers.n disillusionments.n disincentives.n disinclinations.n disinfectants.n disks.n dislocations.n disloyalties.n dismemberments.n dismissals.n disorders.n disparagements.n disparities.n dispatches.n dispensaries.n dispensations.n dispensers.n dispersals.n dispersions.n displacements.n displays.n dispositions.n disproofs.n disputants.n disputations.n disputes.n disquisitions.n disruptions.n dissections.n dissemblers.n dissensions.n dissenters.n dissents.n dissertations.n disservices.n dissidents.n dissimilarities.n dissolutions.n dissonances.n distances.n distastes.n distensions.n distillations.n distilleries.n distillers.n distinctions.n distortions.n distractions.n distributions.n distributors.n districts.n disturbances.n ditches.n ditties.n divans.n divergences.n divers.n diversions.n dives.n divestitures.n dividends.n divinations.n diviners.n divines.n divinities.n divisions.n divisors.n divorcees.n djembes.n dockets.n docks.n dockyards.n doctorates.n doctors.n doctrinaires.n doctrines.n documents.n dodderers.n dodgers.n dodges.n dodos.n doers.n doges.n dogfish.p doggies.n doghouses.n dogmas.n dogs.n dogsbodies.n dogwoods.n doilies.n dollhouses.n dollies.n dollops.n dolls.n dolmens.n dolphins.n dolts.n domains.n domes.n domiciles.n dominions.n dominos.n donations.n donkeys.n donors.n dons.n donuts.n doodlebugs.n dooms.n doorbells.n doorcases.n doorframes.n doorhandles.n doorkeepers.n doorknobs.n doorknockers.n doormats.n doornails.n doorposts.n doors.n doorsteps.n doorstoppers.n doorways.n dopes.n dories.n dormers.n dormitories.n dosages.n doses.n dossiers.n dots.n doubles.n doublets.n doubloons.n douches.n doughnuts.n doulophones.n dovecotes.n doves.n dovetails.n dowagers.n dowels.n dowers.n downbeats.n downgrades.n downpours.n downturns.n dowries.n doyens.n doylies.n dozes.n drachmas.n draftees.n draftings.n drafts.n dragnets.n dragonflies.n dragons.n dragoons.n drags.n drainpipes.n drains.n drakes.n dramas.n dramatists.n dramatizations.n draperies.n drapers.n drapes.n draughts.n drawbridges.n drawers.n drawing-rooms.n drawings.n drawls.n draws.n dreadnoughts.n dreamers.n dreamlands.n dreams.n dreamworlds.n dressers.n dresses.n dressings.n dressmakers.n driers.n drifters.n drifts.n drills.n drinkers.n drinks.n drips.n drivers.n drives.n driveways.n dromedaries.n drones.n dropoffs.n dropouts.n droppings.n drops.n droughts.n droves.n drudges.n druggists.n drugs.n drugstores.n druids.n drummers.n drums.n drumsticks.n drunkards.n drunks.n dryers.n ducats.n duchesses.n duchies.n duckies.n duckings.n ducklings.n ducks.n ducts.n dudes.n duds.n duelists.n duellists.n duels.n duets.n duffers.n dugouts.n dukedoms.n dukes.n dulcians.n dulcimers.n dullards.n dulzainas.n dumbbells.n dumbwaiters.n dumdums.n dummies.n dumplings.n dumps.n dunces.n dunderheads.n dunes.n dungeons.n dunghills.n dupes.n duplicates.n duplications.n duplicators.n durations.n dustbins.n dustcarts.n dusters.n dustpans.n dutars.n duties.n duvets.n dwarfs.n dwellers.n dwellings.n dyers.n dyes.n dykes.n dynamics.n dynamos.n dynasties.n dyspeptics.n eagles.n earaches.n eardrops.n eardrums.n earfuls.n earldoms.n earls.n earmarks.n earnings.n earphones.n earpieces.n earrings.n ears.n earthquakes.n earthworms.n easels.n eaters.n eavesdroppers.n ebbs.n ebbtides.n eccentricities.n eccentrics.n ecclesiastics.n echelons.n echoes.n eclairs.n eclipses.n ecologists.n economies.n economists.n ecosystems.n ecstasies.n eddies.n edges.n edgings.n edicts.n edifices.n editions.n editorials.n editors.n educators.n eels.n effects.n efficiencies.n effigies.n effluents.n effronteries.n effusions.n egalitarians.n eggheads.n eggplants.n eggs.n eggshells.n egoists.n egos.n egotists.n egotrips.n egrets.n eiderdowns.n ejaculations.n ejections.n elaborations.n elbows.n elders.n elections.n electorates.n electors.n electricians.n electrocardiograms.n electrocardiographs.n electrocutions.n electrodes.n electrolytes.n electromagnets.n electrons.n elegies.n elements.n elephants.n elevations.n elevators.n eliminations.n elisions.n elites.n elitists.n elixirs.n elks.n ellipses.n elms.n elocutionists.n elongations.n emanations.n embankments.n embargoes.n embarkations.n embarrassments.n embassies.n embellishments.n embers.n emblems.n embodiments.n embraces.n embryos.n emendations.n emeralds.n emergencies.n emigrants.n emigres.n eminences.n emirates.n emirs.n emissaries.n emissions.n emotions.n emperors.n empires.n empiricists.n employees.n employers.n emporiums.n empresses.n emulsions.n emus.n enactments.n encampments.n enchantments.n enchantresses.n enchiladas.n enchiladas_rancheros enchiladas_verdes enclaves.n enclosures.n encomiums.n encounters.n encouragements.n encroachments.n encumbrances.n encyclicals.n encyclopædias.n encyclopaedias.n encyclopedias.n endeavours.n endemics.n endings.n endives.n endorsements.n endowments.n ends.n enemas.n enemies.n energies.n enforcers.n engagements.n engineers.n engines.n engravers.n engravings.n enigmas.n enjoyments.n enlargements.n enlistments.n enormities.n enquirers.n enquiries.n ensembles.n ensigns.n enslavements.n entanglements.n ententes.n enterprises.n entertainers.n enthronements.n enthusiasts.n enticements.n entities.n entitlements.n entomologists.n entractes.n entrances.n entrants.n entrees.n entrepots.n entrepreneurs.n entries.n envelopes.n envelopments.n environmentalists.n environments.n envois.n envoys.n enzymes.n eons.n epaulets.n epaulettes.n epicentres.n epics.n epicureans.n epicures.n epidemics.n epidemiologists.n epiglottises.n epigrams.n epileptics.n epilogues.n episcopalians.n episodes.n epistles.n epitaphs.n epithets.n epitomes.n epochs.n equalizers.n equals.n equations.n equators.n equestrians.n equinoxes.n equities.n equivalences.n equivalents.n equivocations.n eradications.n eras.n erasers.n erasures.n erections.n errands.n errors.n eruptions.n escalations.n escalators.n escapades.n escapees.n escapements.n escapes.n escapists.n escapologists.n escorts.n escritoires.n escutcheons.n esophaguses.n esplanades.n espressos.n essayists.n essays.n essences.n essentials.n establishments.n estates.n esthetes.n esthetics.n estimates.n estrangements.n estuaries.n etchings.n eternities.n ethics.p ethnographers.n ethnologists.n ethyls.n etymologies.n etymologists.n eucalyptuses.n eulogies.n eulogists.n eunuchs.n euphemisms.n euphoniums.n evacuations.n evacuees.n evaders.n evaluations.n evangelists.n evaporations.n evenings.n events.n eventualities.n evergreens.n eves.n evictions.n evils.n evolutions.n ewes.n exacerbations.n exaggerations.n examinations.n examiners.n examples.n exams.n excavations.n excavators.n exceptions.n excerpts.n excesses.n exchanges.n exchequers.n excitements.n exclamations.n excommunications.n excrescences.n excretions.n excursions.n executants.n executioners.n executions.n executives.n executors.n exemplifications.n exemptions.n exercises.n exertions.n exhausts.n exhibitioners.n exhibitionists.n exhibitions.n exhibitors.n exhibits.n exhortations.n exigencies.n exiles.n existences.n existentialists.n exits.n exoduses.n exonerations.n expanses.n expansions.n expatriates.n expectancies.n expectorants.n expedients.n expeditions.n expenditures.n expenses.n experiences.n experimenters.n experiments.n experts.n expletives.n exploits.n explorations.n explorers.n explosions.n explosives.n exponents.n exporters.n exports.n expos.n exposes.n expositions.n exposures.n expresses.n expressionists.n expressions.n expressways.n expulsions.n extensions.n exteriors.n extinguishers.n extracts.n extraditions.n extras.n extravagances.n extravaganzas.n extremes.n extremists.n extremities.n extroverts.n eyeballs.n eyebrows.n eyefuls.n eyeglasses.n eyelashes.n eyelets.n eyelids.n eyepieces.n eyes.n eyesores.n eyewitnesses.n fables.n fabrications.n fabrics.n facades.n faces.n facets.n facials.n facilitators.n facilities.n facsimiles.n factions.n factories.n factors.n factotums.n faculties.n fads.n faeries.n faggots.n faglongs.n fags.n failings.n fairgrounds.n fairies.n fairs.n fairways.n fairylands.n fairytales.n faiths.n fajitas.n fakes.n fakirs.n falcons.n falsehoods.n falsettos.n falsifications.n falsities.n familiarities.n families.n famines.n fanaticisms.n fanatics.n fanciers.n fancies.n fandangos.n fanfares.n fangs.n fanlights.n fannies.n fans.n fantasias.n fantasies.n farces.n fares.n farewells.n farmers.n farmhands.n farmhouses.n farms.n farmsteads.n farmyards.n farthings.n farts.n fascinations.n fascists.n fashions.n fasteners.n fasts.n fatalists.n fatalities.n fates.n fatheads.n fatherlands.n fathers.n fathoms.n fatigues.n fats.n faucets.n faults.n fauns.n favors.n favourites.n favours.n fawns.n faxes.n feasts.n featherbeds.n feathers.n featherweights.n feats.n features.n federalists.n federations.n feeders.n feelers.n fees.n fegerengs.n feints.n felicities.n fellows.n fellowships.n felonies.n felons.n females.n feminists.n femtoliters.n femtolitres.n femtometers.n femtometres.n femtoseconds.n femtowatts.n femurs.n fencers.n fences.n fenders.n fens.n ferments.n ferns.n ferrets.n ferries.n ferryboats.n fertilizers.n festivals.n festivities.n fetes.n fetishes.n fetuses.n feuds.n fevers.n fezes.n fiancees.n fiances.n fiascos.n fiats.n fibbers.n fibres.n fibs.n fictions.n fiddlers.n fiddles.n fiddlesticks.n fiefs.n fielders.n fields.n fiends.n fiestas.n fifes.n fighters.n fights.n figments.n figs.n figureheads.n figures.n filaments.n filberts.n files.n filibusters.n filings.n fillets.n fillies.n fillings.n films.n filters.n finales.n finalists.n finals.n finances.n financiers.n finches.n finders.n finds.n fines.n finesses.n finger-posts.n fingerboards.n fingermarks.n fingernails.n fingerprints.n fingers.n fingertips.n finishes.n fins.n fiords.n firearms.n fireballs.n firebirds.n firebombs.n fireboxes.n firebrands.n firebugs.n firecrackers.n fireflies.n firelights.n fireplaces.n fires.n firesides.n fireworks.n firmaments.n firms.n firs.n firstborns.n firsts.n fish.p fishbones.n fishcakes.n fisheries.n fishers.n fishes.n fishmongers.n fissures.n fists.n fistulas.n fits.n fitters.n fittings.n fivers.n fixations.n fixatives.n fixers.n fixes.n fixtures.n fjords.n flageolets.n flagpoles.n flags.n flagships.n flagstaffs.n flairs.n flakes.n flames.n flamethrowers.n flamingos.n flanges.n flanks.n flannels.n flans.n flapjacks.n flappers.n flaps.n flares.n flashbacks.n flashbulbs.n flashes.n flashlights.n flashpoints.n flasks.n flatfish.p flats.n flatterers.n flatteries.n flautas.n flautists.n flavors.n flavourings.n flavours.n flaws.n fleas.n flecks.n fledgelings.n fledglings.n fleets.n flexes.n flickers.n flicks.n fliers.n flies.n flights.n flings.n flints.n flippers.n flips.n flirtations.n flirts.n floatations.n floats.n flocks.n floodgates.n floods.n floorboards.n floors.n floozies.n flops.n florins.n florists.n flotations.n flotillas.n flounders.n flourishes.n flowerbeds.n flowerpots.n flowers.n flows.n fluctuations.n flues.n flugelhorns.n fluidities.n fluids.n flukes.n flunkeys.n flunkies.n fluorescences.n fluorides.n flurries.n flushes.n flutes.n flutists.n flutters.n fluxes.n flycatchers.n flyers.n flyovers.n flytraps.n flyweights.n flywheels.n foals.n foams.n focuses.n foes.n fogeys.n foghorns.n fogs.n foibles.n foils.n folders.n folds.n folgerphones.n folios.n folks.n folksongs.n folktales.n follies.n followers.n followings.n fonts.n foods.n foodstuffs.n fools.n footballers.n footballs.n footboards.n footbridges.n footers.n footfalls.n footfaults.n footholds.n footmarks.n footnotes.n footpaths.n footprints.n footsteps.n footstools.n forays.n forces.n fords.n forearms.n forebodings.n forecasters.n forecastles.n forecasts.n foreclosures.n forecourts.n forefathers.n forefingers.n forefronts.n foregrounds.n foreheads.n foreigners.n forelegs.n forelocks.n foremasts.n forenames.n forerunners.n foreskins.n foresters.n forests.n foretastes.n forewords.n forfeits.n forgeries.n forgers.n forges.n formalisms.n formalities.n formations.n formats.n forms.n formulas.n formulations.n fortepianos.n fortes.n fortifications.n fortnights.n fortresses.n forts.n fortunes.n forums.n forwards.n fossilizations.n fossils.n fouls.n foundations.n founders.n foundlings.n foundries.n fountains.n founts.n foursomes.n fowlers.n fowls.n foxes.n foxgloves.n foxholes.n foxhounds.n foxhunts.n foxtrots.n foyers.n fractions.n fractures.n fragmentations.n fragments.n fragrances.n frames.n frameworks.n franchises.n frankfurters.n fraternities.n fratricides.n frauds.n frays.n frazzles.n freaks.n freckles.n freebooters.n freedoms.n freeholders.n freeholds.n freeways.n freezers.n freezes.n freighters.n frequencies.n frescos.n frets.n friars.n fricassees.n fricatives.n fridges.n friends.n friendships.n fries.n friers.n friezes.n frigates.n frights.n frills.n fringes.n frissons.n fritters.n frivolities.n frocks.n frogs.n frolics.n frontages.n frontiers.n frontispieces.n fronts.n frosts.n frowns.n fruitcakes.n fruits.n frustrations.n fryers.n fuchsias.n fuckers.n fuels.n fugitives.n fuglungs.n fugues.n fuhrers.n fulcrums.n fullbacks.n fullers.n fumbles.n fumes.n functionalists.n functionaries.n functions.n fundamentalists.n fundamentals.n funds.n funerals.n fungicides.n funguses.n funks.n funnels.n furies.n furlongs.n furloughs.n furnaces.n furriers.n furrows.n furs.n fuselages.n fuses.n fusiliers.n fusillades.n fusions.n fusses.n fusspots.n futilities.n futures.n futurists.n gables.n gadflies.n gadgets.n gaffers.n gaffes.n gaffs.n gages.n gaggles.n gags.n gains.n gaits.n galas.n galaxies.n gales.n gallantries.n gallants.n galleons.n galleries.n galleys.n gallicisms.n gallons.n gallops.n galls.n gallstones.n galoshes.n gals.n gambits.n gamblers.n gambles.n gambols.n gamekeepers.n games.n gammas.n gammons.n gamuts.n ganders.n ganglions.n gangplanks.n gangs.n gangsters.n gantries.n gaolbirds.n gaolbreaks.n gaolers.n gaols.n gaps.n garages.n gardeners.n gardenias.n gardens.n gargles.n gargoyles.n garlands.n garments.n garnets.n garnishes.n garottes.n garrets.n garrisons.n garrottes.n garters.n gasbags.n gases.n gashes.n gaskets.n gaslights.n gasmasks.n gasometers.n gasps.n gasworks.p gateaus.n gatecrashers.n gatehouses.n gateposts.n gates.n gateways.n gatherers.n gatherings.n gaudies.n gauges.n gauntlets.n gavels.n gavottes.n gays.n gazelles.n gazes.n gazetteers.n gazettes.n gearboxes.n gears.n gearshifts.n geckos.n geezers.n geishas.n geldings.n gels.n gems.n gemshorns.n gendarmeries.n gendarmes.n genders.n genealogies.n genealogists.n generalissimos.n generalities.n generalizations.n generals.n generations.n generators.n genes.n geneticists.n genies.n geniuses.n genres.n gentiles.n gents.n geographers.n geologists.n geraniums.n geriatricians.n germicides.n germs.n gerunds.n gesticulations.n gestures.n getaways.n geysers.n gherkins.n ghettos.n ghosts.n ghouls.n giantesses.n giants.n gibbets.n gibbons.n gibes.n gifts.n gigabytes.n gigawatts.n giggles.n gigolos.n gigs.n gilders.n gills.n gimmicks.n gins.n gipsies.n giraffes.n girders.n girdles.n girlfriends.n girlies girls.n gists.n giveaways.n gizzards.n glaciers.n glades.n gladiators.n glances.n glands.n glares.n glasschords.n glasses.n glassfuls.n glasshouses.n glassworks.p glazes.n gleams.n glees.n glens.n gliders.n glides.n glimmers.n glimpses.n glints.n glissades.n glitches.n globes.n globetrotters.n globules.n glockenspiels.n glooms.n glories.n glossaries.n glosses.n glottises.n gloves.n glues.n gluts.n gluttons.n gnats.n gnomes.n gnus.n goalies.n goalkeepers.n goals.n goatees.n goatherds.n goats.n goatskins.n goblets.n goblins.n gobs.n goddaughters.n goddesses.n godfathers.n godmothers.n godparents.n gods.n godsends.n godsons.n goitres.n goldfinches.n goldfish.p goldmines.n goldsmiths.n golfers.n golliwogs.n gondolas.n gondoliers.n goners.n gongs.n goodies.n goods.n goofs.n goons.n gooseberries.n gophers.n gorges.n gorillas.n goslings.n gospels.n gossips.n goulashes.n gourds.n gourmands.n gourmets.n governesses.n governments.n governors.n gowns.n grabs.n graces.n gradations.n grades.n gradients.n graduates.n graduations.n grafts.n grails.n grains.n grammarians.n grammars.n gramophones.n grams.n granaries.n granddads.n granddaughters.n grandfathers.n grandmas.n grandmothers.n grandparents.n grandpas.n grandsons.n grandstands.n granges.n grannies.n grants.n granules.n grapefruits.n grapes.n grapevines.n graphics.n graphs.n grasps.n grasses.n grasshoppers.n graters.n grates.n gratifications.n gratuities.n graves.n gravestones.n graveyards.n greatcoats.n greenbacks.n greengages.n greengroceries.n greengrocers.n greenhorns.n greenhouses.n greenwoods.n greetings.n gremlins.n grenades.n grenadiers.n greybeards.n greyhounds.n griddles.n gridirons.n grids.n grievances.n griffins.n grilles.n grills.n grimaces.n grinders.n grinds.n grindstones.n grins.n grips.n grizzlies.n groans.n groceries.n grocers.n groins.n grooms.n grooves.n grotesques.n grottos.n grouches.n groundings.n grounds.n groupies.n groups.n grouse.p groves.n growers.n growls.n growths.n grubs.n grudges.n grumblers.n grumbles.n grunts.n guarantees.n guaranties.n guarantors.n guardians.n guardianships.n guardrails.n guardrooms.n guards.n guerillas.n guerrillas.n guesses.n guesthouses.n guestrooms.n guests.n guffaws.n guidebooks.n guidelines.n guides.n guilders.n guildhalls.n guilds.n guillotines.n guineas.n guises.n guitarists.n guitarróns.n guitars.n guitjos.n gulches.n gulfs.n gullets.n gullies.n gulls.n gulps.n gums.n gumshoes.n gunboats.n gunners.n gunrunners.n guns.n gunshots.n gunsmiths.n gurus.n gushers.n gusts.n guts.n gutters.n guttersnipes.n gutturals.n guvnors.n guys.n guzzlers.n gymnasiums.n gymnasts.n gyms.n gynaecologists.n gynecologists.n gyps.n gyrations.n gyros.n gyroscopes.n haberdashers.n habitations.n habitats.n habits.n hacks.n hacksaws.n haddock.p haemophiliacs.n haemorrhages.n haggises.n hags.n hails.n hailstones.n hairbrushes.n haircuts.n hairdos.n hairdressers.n hairlines.n hairnets.n hairpieces.n hairpins.n hairs.n hairstyles.n hairstylists.n halberdiers.n halberds.n half-breeds.n half-hours.n halfbacks.n halfwits.n halibut.p halliards.n hallmarks.n halls.n hallucinations.n hallways.n halos.n halters.n halts.n halyards.n hamburgers.n hamlets.n hammers.n hammocks.n hampers.n hams.n hamsters.n hamstrings.n handbags.n handbills.n handbooks.n handbrakes.n handcarts.n handclaps.n handcuffs.n handfuls.n handicaps.n handicrafts.n handkerchiefs.n handlebars.n handlers.n handles.n handmaids.n handouts.n handrails.n hands.n handsaws.n handshakes.n handstands.n hangars.n hangers.n hangings.n hangnails.n hangovers.n hankerings.n hankies.n hansoms.n happenings.n harbingers.n harbors.n harbours.n hardbacks.n hardcovers.n hardliners.n hardships.n harelips.n harems.n hares.n harlequins.n harlots.n harmonicas.n harmonicos.n harmonics.n harmonies.n harmoniums.n harmonizations.n harnesses.n harpers.n harpists.n harpoons.n harps.n harpsichordists.n harpsichords.n harrows.n harts.n harvesters.n harvests.n hassles.n hatbands.n hatches.n hatchets.n hatchways.n hatfuls.n hatpins.n hatreds.n hats.n hatters.n haunches.n haunts.n havens.n haversacks.n hawkers.n hawks.n hayforks.n haymakers.n haystacks.n hazards.n hazels.n hazes.n headaches.n headbands.n headdresses.n headers.n headings.n headlamps.n headlights.n headlines.n headmasters.n headmistresses.n headquarters.p headrests.n heads.n headsets.n headwinds.n healers.n heaps.n hearers.n hearings.n hearses.n heartaches.n heartbeats.n hearthrugs.n hearths.n hearts.n heaters.n heathens.n heathers.n heaths.n heatwaves.n heavens.n heaves.n heavyweights.n heckelphones.n hecklers.n hectares.n hedgehogs.n hedgerows.n hedges.n hedonists.n heels.n heifers.n heights.n heiresses.n heirlooms.n heirs.n heists.n helicopters.n heliographs.n heliotropes.n heliports.n hellcats.n hells.n helmets.n helms.n helpers.n helpings.n helpmates.n hemispheres.n hemlines.n hemophiliacs.n hemorrhages.n hems.n hencoops.n henhouses.n hens.n heptagons.n heralds.n herbalists.n herbs.n herds.n heresies.n heretics.n heritages.n hermaphrodites.n hermitages.n hermits.n hernias.n heroes.n heroines.n herons.n herrings.n hertz.p hesitations.n heterosexuals.n hexagons.n hexameters.n heydays.n hiatuses.n hiccoughs.n hiccups.n hickories.n hicks.n hideaways.n hides.n hidings.n hierarchies.n hieroglyphs.n highballs.n highfliers.n highflyers.n highlands.n highlights.n highnesses.n highroads.n highs.n highways.n hijackers.n hijacks.n hikers.n hikes.n hillbillies hillocks.n hills.n hillsides.n hilts.n hindrances.n hinds.n hinges.n hinterlands.n hints.n hippies.n hippodromes.n hippopotamuses.n hippos.n hips.n hisses.n histograms.n historians.n histories.n hitches.n hitchhikers.n hits.n hitters.n hives.n hoarders.n hoards.n hoaxes.n hobbies.n hobbyhorses.n hobgoblins.n hobnails.n hobos.n hocchikus.n hodgepodges.n hoes.n hogs.n holders.n holdings.n holdups.n holes.n holidays.n hollows.n hollyhocks.n holocausts.n holographs.n holsters.n homecomings.n homelands.n homeopaths.n homeowners.n homes.n homesteads.n hometowns.n homicides.n homilies.n homonyms.n homophones.n homos.n homosexuals.n hones.n honeybees.n honeycombs.n honeymoons.n honks.n honorariums.n honorifics.n honors.n honours.n hoodlums.n hoods.n hoofs.n hookers.n hooks.n hooligans.n hoops.n hooters.n hoots.n hopefuls.n hoppers.n hops.n hordes.n horizons.n hormones.n hornets.n hornpipes.n horns.n horoscopes.n horrors.n horseflies.n horseraces.n horseradishes.n horses.n horseshoes.n horsewhips.n horticulturists.n hosepipes.n hoses.n hosiers.n hospices.n hospitalizations.n hospitals.n hostages.n hostelries.n hostels.n hostesses.n hostilities.n hosts.n hotbeds.n hotdogs.n hoteliers.n hotels.n hotheads.n hothouses.n hotplates.n hounds.n hourglasses.n houseboats.n housebreakers.n housedogs.n houseflies.n housefuls.n householders.n households.n housekeepers.n housemaids.n housemasters.n houses.n housetops.n housewares.n housewives.n hovels.n hovercraft.p howitzers.n howlers.n howls.n hubbies.n hubbubs.n hubs.n huckleberries.n hucksters.n huddles.n hues.n huffs.n hugs.n hulas.n hulks.n hullabaloos.n hulls.n humanists.n humanitarians.n humans.n humdingers.n humiliations.n hummingbirds.n hummocks.n humorists.n humourists.n humours.n humpbacks.n humps.n hums.n hunchbacks.n hunks.n hunters.n hunts.n hurdles.n hurdy_gurdys hurls.n hurricanes.n husbands.n hushes.n huskies.n husks.n hussars.n hussies.n hustlers.n huts.n hyacinths.n hyaenas.n hybrids.n hydrants.n hydras.n hydraulophones.n hydrocarbons.n hydrofoils.n hydroplanes.n hyenas.n hymens.n hymnals.n hymns.n hyperbolas.n hyperboles.n hypermarkets.n hyphens.n hypnotists.n hypochondriacs.n hypocrites.n hypodermics.n hypotenuses.n iambs.n ibises.n icebergs.n iceboxes.n icebreakers.n icecaps.n icecubes.n icehouses.n icepacks.n icepicks.n icerinks.n icicles.n iconoclasts.n icons.n idealists.n idealizations.n ideals.n identities.n ideologies.n ideologues.n idiolects.n idioms.n idiosyncrasies.n idiots.n idols.n idylls.n igloos.n ignoramuses.n iguanas.n illegalities.n illnesses.n ills.n illuminations.n illusions.n illustrations.n illustrators.n images.n imaginations.n imams.n imbalances.n imbeciles.n imbroglios.n imitations.n imitators.n immensities.n immersions.n immigrants.n immolations.n immortals.n impacts.n impalements.n impasses.n impeachments.n impediments.n imperfections.n imperialists.n impersonations.n impersonators.n impertinences.n implementations.n implements.n implosions.n imponderables.n importations.n importers.n imports.n impositions.n impossibilities.n impostors.n impresarios.n impressionists.n imprimaturs.n imprints.n improbabilities.n impromptus.n improprieties.n improvements.n improvisations.n imps.n impulses.n impurities.n imputations.n inaccuracies.n inadequacies.n inanities.n inaugurals.n inaugurations.n incantations.n incarnations.n inceptions.n inches.n incidences.n incidents.n incinerators.n incisions.n incisors.n incitements.n incivilities.n inclinations.n inclines.n incomes.n incongruities.n inconsistencies.n inconveniences.n increases.n increments.n incubations.n incubators.n incumbencies.n incumbents.n incurables.n incursions.n indemnities.n indentations.n indentures.n independents.n indexes.n indicators.n indictments.n indignities.n indiscretions.n individualists.n individualities.n individuals.n inducements.n inductions.n indulgences.n industrialists.n industrials.n industries.n inefficiencies.n inequalities.n inequities.n infancies.n infantries.n infants.n infatuations.n infections.n inferences.n inferiors.n infernos.n infestations.n infidelities.n infidels.n infinitives.n infinitudes.n infirmaries.n infirmities.n inflammations.n inflections.n inflictions.n inflows.n influences.n influxes.n informalities.n informants.n informers.n infractions.n infringements.n infusions.n ingenues.n ingots.n ingredients.n inhabitants.n inheritances.n inheritors.n inhibitions.n inhibitors.n iniquities.n initials.n initiates.n initiatives.n injections.n injunctions.n injuries.n injustices.n inks.n inkstands.n inkwells.n inlays.n inlets.n inmates.n innings.n innkeepers.n innovations.n innovators.n inns.n innuendoes.n inoculations.n inputs.n inquests.n inquirers.n inquiries.n inquisitions.n inquisitors.n inroads.n inscriptions.n insects.n insertions.n inserts.n insets.n insiders.n insides.n insights.n insinuations.n insoles.n insolvencies.n insomniacs.n inspections.n inspectors.n inspirations.n installations.n installments.n instalments.n instances.n insteps.n instigators.n instincts.n institutes.n institutions.n instructions.n instructors.n instrumentalists.n instruments.n insubordinations.n insulators.n insults.n insurances.n insurers.n insurgents.n insurrections.n intakes.n integers.n integuments.n intellects.n intellectuals.n intelligentsias.n intensifications.n intensities.n intentions.n interactions.n interceptions.n interceptors.n intercessions.n interchanges.n intercoms.n interconnections.n interdependences.n interests.n interfaces.n interiors.n interjections.n interlocutors.n interlopers.n interludes.n intermarriages.n intermediaries.n intermediates.n interments.n intermezzos.n intermissions.n intermixtures.n internationales.n internationalists.n internes.n interns.n interpolations.n interpositions.n interpretations.n interpreters.n interregnums.n interrelations.n interrelationships.n interrogations.n interrogatives.n interrogators.n interrupters.n interruptions.n intersections.n interstices.n intervals.n interventions.n interviewers.n interviews.n intestines.n intimacies.n intimates.n intimations.n intoxicants.n intricacies.n intrigues.n introductions.n introverts.n intruders.n intrusions.n intuitions.n invaders.n invalidations.n invalids.n invasions.n inventions.n inventories.n inventors.n inversions.n invertebrates.n investigations.n investigators.n investments.n investors.n invitations.n invocations.n invoices.n involutions.n involvements.n ionospheres.n ions.n iotas.n irises.n ironies.n ironmongers.n irons.n ironworks.n ironworks.p irregularities.n irrelevances.n irrelevancies.n irritants.n irruptions.n islanders.n islands.n isles.n isolationists.n isotopes.n issuers.n isthmuses.n itches.n items.n iterations.n itineraries.n jabberers.n jabs.n jackals.n jackasses.n jackboots.n jackdaws.n jackets.n jackpots.n jacks.n jades.n jaguars.n jailers.n jailors.n jails.n jalopies.n jamborees.n jambs.n jamjars.n jampots.n jams.n janitors.n jarfuls.n jars.n jaunts.n javelins.n jawbones.n jawbreakers.n jaws.n jays.n jaywalkers.n jeeps.n jeers.n jellies.n jellyfish.p jennies.n jeremiads.n jerks.n jerries.n jerseys.n jesters.n jests.n jets.n jetties.n jewellers.n jewels.n jibes.n jibs.n jiffies.n jiggers.n jigs.n jigsaws.n jihads.n jimmies.n jingles.n jinxes.n jitterbugs.n jitters.n jobbers.n jobs.n jockeys.n joggers.n jogs.n joiners.n joins.n joints.n joists.n jokers.n jokes.n jollities.n jolts.n joules.n journalists.n journals.n journeys.n jovialities.n jowls.n joys.n jubilees.n judgements.n judges.n judgments.n judiciaries.n jugfuls.n juggernauts.n jugglers.n jugs.n juices.n jukeboxes.n juleps.n jumbles.n jumpers.n jumps.n junctions.n junctures.n jungles.n juniors.n junipers.n junkets.n junkies.n juntas.n juries.n jurists.n jurors.n justices.n justifications.n juveniles.n kaleidoscopes.n kalimbas.n kangaroos.n karats.n katzenklaviers.n kayaks.n kazoos.n kebabs.n keels.n keepers.n keepsakes.n kegs.n kellies kennels.n kerbs.n kerbstones.n kerchiefs.n kernels.n kettledrums.n kettles.n keyboards.n keyholes.n keynotes.n keyrings.n keys.n keystones.n keytars.n keywords.n khalams.n khans.n kickbacks.n kickoffs.n kicks.n kiddies.n kidnappers.n kidnappings.n kidneys.n kids.n killers.n killings.n killjoys.n kilns.n kilobytes.n kilograms.n kiloliters.n kilolitres.n kilometres.n kilos.n kiloseconds.n kilowatts.n kilts.n kimonos.n kindergartens.n kinds.n kingdoms.n kingfishers.n kingpins.n kings.n kinks.n kiosks.n kippers.n kirks.n kisanjis.n kissers.n kisses.n kitchenettes.n kitchens.n kites.n kits.n kittens.n kitties.n kiwis.n kleenexes.n kleptomaniacs.n knacks.n knapsacks.n knaves.n kneecaps.n knees.n knighthoods.n knights.n knives.n knobs.n knockers.n knockouts.n knocks.n knolls.n knots.n knuckles.n koalas.n kolas.n kopecks.n koras.n kotos.n kouxians.n labels.n laboratories.n labourers.n labours.n labs.n laburnums.n labyrinths.n lacerations.n laces.n lackeys.n lacquers.n lacunas.n ladders.n laddies.n ladies.n ladles.n lads.n ladybirds.n lagers.n laggards.n lagoons.n lags.n lairds.n lairs.n laities.n lakes.n lambs.n lambskins.n lamellaphones.n lamentations.n laments.n lamplighters.n lampoons.n lampposts.n lampreys.n lamps.n lampshades.n lancers.n lances.n lancets.n landaus.n landfalls.n landholders.n landings.n landladies.n landlords.n landlubbers.n landmarks.n landmines.n landowners.n lands.n landscapes.n landslides.n lanes.n languages.n lanterns.n lapels.n laps.n lapses.n larcenies.n larches.n larders.n largos.n larks.n larkspurs.n larynxes.n lasers.n lashes.n lashings.n lasses.n lassos.n latches.n latchkeys.n lathes.n laths.n latitudes.n latrines.n lattices.n laughs.n launchers.n launches.n launderettes.n laundries.n laureates.n laurels.n lavatories.n lavs.n lawbreakers.n lawgivers.n lawmakers.n lawns.n laws.n lawsuits.n lawyers.n laxatives.n layabouts.n laybys.n layers.n layoffs.n layovers.n leaders.n leads.n leaflets.n leagues.n leaks.n lean-tos.n leaps.n learners.n leaseholders.n leaseholds.n leases.n leashes.n leathernecks.n leave-takings.n leaves.n lechers.n lecterns.n lecturers.n lectures.n lectureships.n ledgers.n ledges.n leeches.n leeks.n leers.n leftists.n legacies.n legends.n legionaries.n legions.n legislators.n legislatures.n legs.n lemmings.n lemons.n lemurs.n lenders.n lengths.n lenses.n lentils.n leopards.n lepers.n leprechauns.n lesbians.n lesions.n lessees.n lessons.n lessors.n letterheads.n letters.n lettuces.n levees.n levellers.n levels.n levers.n levies.n levitations.n lexicographers.n lexicons.n liabilities.n liaisons.n liars.n libations.n libels.n liberalities.n liberals.n liberations.n liberators.n libertarians.n liberties.n libertines.n libidos.n librarians.n libraries.n librettists.n librettos.n licences.n licensees.n licenses.n lichees.n lichgates.n licks.n lids.n liens.n lies.n lieutenants.n lifebelts.n lifeboats.n lifebuoys.n lifeguards.n lifelines.n lifers.n lifetimes.n liftoffs.n ligaments.n ligatures.n lighters.n lighthouses.n lights.n lightships.n lightweights.n likenesses.n likings.n lilacs.n lilies.n lilts.n limbos.n limbs.n limericks.n limes.n limeys.n limitations.n limits.n limousines.n limps.n linchpins.n lindens.n lineages.n liners.n lines.n lineups.n lingerers.n lingoes.n linguists.n linings.n linkages.n links.n linkups.n linotypes.n lionesses.n lions.n lips.n lipsticks.n liqueurs.n liquidations.n liquidators.n liquidizers.n liquids.n liras.n lirones.n lisps.n listeners.n listings.n lists.n litanies.n literals.n lithographs.n litigants.n litigators.n litres.n litterbins.n litters.n liturgies.n livelihoods.n liveries.n livers.n lives.n livings.n lizards.n llamas.n loads.n loafers.n loans.n loaves.n lobbies.n lobbyists.n lobes.n lobsters.n locales.n localities.n localizations.n locals.n locations.n lochs.n lockers.n lockets.n lockouts.n locks.n locksmiths.n lockups.n locomotives.n locusts.n locutions.n lodestars.n lodgers.n lodges.n lofts.n loganberries.n logarithms.n logbooks.n logicians.n logjams.n logos.n logs.n loincloths.n loins.n loiterers.n lollies.n lollipops.n longboats.n longbows.n longings.n lookouts.n looks.n looms.n loonies.n loons.n loonybins.n loopholes.n loos.n looters.n lords.n lordships.n lorgnettes.n lorries.n losers.n losses.n lotions.n lots.n lotteries.n lotuses.n loudspeakers.n lounges.n louts.n louvres.n lovebirds.n lovers.n lowbrows.n lowlanders.n lows.n loyalists.n loyalties.n lozenges.n lubricants.n lugs.n lullabies.n lulls.n lumberjacks.n lumberyards.n luminaries.n lumps.n lunatics.n luncheons.n lunches.n lunges.n lungs.n lupins.n lurches.n lures.n lushes.n lutenists.n lutes.n luxuries.n lycees.n lyceums.n lychgates.n lymphocytes.n lynchpins.n lynxes.n lyras.n lyres.n lyricists.n lyrics.n macaroons.n macaws.n machetes.n machinations.n machines.n machinists.n mackerel.p mackintoshes.n macrocosms.n macs.n madams.n madhouses.n madrigals.n maelstroms.n maestros.n magazines.n maggots.n magicians.n magistrates.n magnates.n magnets.n magnifications.n magnifiers.n magnolias.n magnums.n magpies.n mahoganies.n maidenhoods.n maidens.n maids.n maidservants.n mailbags.n mailboats.n mailboxes.n mainlands.n mainmasts.n mains.n mainsprings.n mainstays.n maisonnettes.n majorities.n majors.n make-ups.n makers.n makeshifts.n makings.n maladies.n malaises.n malapropisms.n malcontents.n maledictions.n malefactors.n males.n malformations.n malfunctions.n malignancies.n malingerers.n mallards.n mallets.n malls.n mamas.n mambas.n mammals.n mammas.n mammoths.n manacles.n managements.n managers.n mandarins.n mandatories.n mando-basses.n mandocellos.n mandolas.n mandolins.n mandrakes.n manes.n maneuvers.n mangers.n mangos.n mangroves.n manholes.n maniacs.n manias.n manicures.n manicurists.n manifestations.n manifestos.n manifests.n manifolds.n manikins.n manipulations.n mannequins.n mannerisms.n manners.n manoeuvrers.n manoeuvres.n manors.n mansards.n manservants.n mansions.n mantelpieces.n mantels.n mantises.n mantles.n manuals.n manufacturers.n manuscripts.n maples.n maps.n maracass.n maraschinos.n marathons.n marauders.n marbles.n marchers.n marches.n mares.n margins.n marigolds.n marimbaphones.n marimbas.n marinas.n mariners.n marines.n marionettes.n markdowns.n markers.n marketplaces.n markets.n markings.n marks.n maroons.n marquees.n marquesses.n marquises.n marriages.n marrowbones.n marshals.n marshes.n marshmallows.n marsupials.n martinets.n martinis.n martins.n marts.n martyrs.n marvels.n marzipans.n mascots.n mashes.n masks.n masochists.n masons.n masquerades.n masques.n massacres.n massages.n masses.n masseurs.n masseuses.n masterminds.n masterpieces.n masters.n masterstrokes.n mastheads.n mastiffs.n mastodons.n masts.n matadors.n matchboxes.n matches.n matchmakers.n materialists.n materials.n mates.n mathematicians.n matinees.n matriarchies.n matriarchs.n matricides.n matrixes.n matrons.n mats.n matters.n mattresses.n mausoleums.n mavericks.n mavises.n maws.n maxims.n maximums.n maydays.n mayflies.n mayoralties.n mayoresses.n mayors.n maypoles.n mazes.n mazurkas.n mbiras.n meadows.n meads.n meals.n mealtimes.n meanies.n meanings.n means.n measurements.n measures.n meatballs.n meats.n mechanics.n mechanisms.n mechanizations.n medalists.n medallions.n medallists.n medals.n meddlers.n medians.n mediators.n medications.n medicines.n medics.n mediocrities.n meditations.n mediums.n medleys.n meetings.n meets.n megabytes.n megalomaniacs.n megaphones.n megatons.n megawatts.n melanges.n melees.n mellophones.n mellotrons.n melodeons.n melodicas.n melodies.n melodramas.n melons.n meltdowns.n members.n membranes.n mementos.n memoirs.n memorandums.n memorials.n memories.n memos.n menaces.n menageries.n menages.n mendicants.n mends.n menials.n menopauses.n mentalities.n mentions.n mentors.n menus.n mercenaries.n merchants.n mergers.n meridians.n meringues.n meritocracies.n merits.n mermaids.n merry-go-rounds.n merrymakers.n meshes.n messengers.n messes.n metallophones.n metallurgists.n metals.n metalworkers.n metalworks.n metaphors.n metatarsals.n meteorites.n meteorologists.n meteors.n meters.n methodologies.n methods.n methyls.n metiers.n metres.n metronomes.n metropolises.n mews.n mews.p mezzanines.n mezzo-sopranos.n miaous.n miaows.n miasmas.n microbes.n microcosms.n microfiches.n microfilms.n microliters.n microlitres.n micrometers.n micrometres.n microns.n microphones.n microscopes.n microseconds.n microwatts.n microwaves.n middies.n middles.n middleweights.n midges.n midgets.n midlands.n midriffs.n miens.n migraines.n migrants.n migrations.n mikados.n mikes.n mileages.n mileometers.n miles.n milestones.n milieus.n militants.n militarists.n militias.n milkmaids.n milkshakes.n milksops.n millenarians.n milleniums.n millepedes.n millers.n milligrams.n milliliters.n millilitres.n millimeters.n millimetres.n milliners.n millionaires.n millionairesses.n millipedes.n milliseconds.n milliwatts.n millponds.n mills.n millstones.n millwheels.n milometers.n milords.n mimeographs.n mimes.n mimics.n mimosas.n minarets.n mincers.n minds.n minefields.n minelayers.n mineralogists.n minerals.n miners.n mines.n minesweepers.n mineworkers.n miniatures.n miniaturists.n minims.n minimums.n minions.n ministers.n ministries.n minivans.n minks.n minnows.n minorities.n minors.n minsters.n minstrels.n mints.n minuets.n minuses.n minxes.n miracles.n mirages.n mirrors.n misanthropes.n misapplications.n miscalculations.n miscarriages.n miscellanies.n misconceptions.n miscounts.n miscreants.n misdeals.n misdeeds.n misdemeanours.n misdoings.n misers.n misfires.n misfits.n misfortunes.n misgivings.n mishaps.n mishmashes.n misinterpretations.n misnomers.n misogynists.n misprints.n mispronunciations.n misquotations.n misreadings.n misrepresentations.n misses.n missies.n missiles.n missionaries.n missives.n misspellings.n misstatements.n mistakes.n mistranslations.n mistresses.n mistrials.n mists.n misunderstandings.n misuses.n mites.n mitres.n mittens.n mixers.n mixes.n mixtures.n moans.n moats.n mobiles.n mobilizations.n mobs.n mobsters.n moccasins.n mockeries.n mocks.n modalities.n modelers.n modellers.n models.n modems.n moderates.n moderators.n modernists.n modes.n modifications.n modifiers.n mods.n modulations.n modules.n moguls.n molars.n molds.n molecules.n molehills.n moles.n molluscs.n monarchies.n monarchists.n monarchs.n monasteries.n moneyboxes.n moneychangers.n moneylenders.n mongers.n mongols.n mongooses.n mongrels.n monitors.n monkeys.n monks.n monochromes.n monocles.n monogamists.n monograms.n monographs.n monoliths.n monologues.n monopolies.n monorails.n monosyllables.n monotones.n monsoons.n monsters.n monstrosities.n montages.n monthlies.n monuments.n moods.n moonbeams.n moons.n moors.n moos.n moose.p mopeds.n mops.n moralists.n morals.n morasses.n moratoriums.n morgues.n morns.n morons.n morphemes.n morrows.n morsels.n morsings.n mortals.n mortarboards.n mortars.n mortgages.n morticians.n mortuaries.n mosaics.n mosques.n mosquitoes.n motels.n mothballs.n motherlands.n mothers.n moths.n motifs.n motions.n motivations.n motives.n motorbikes.n motorboats.n motorcades.n motorcars.n motorcoaches.n motorcycles.n motorcyclists.n motorists.n motors.n motorways.n mottos.n mouldings.n moulds.n mounds.n mountaineers.n mountains.n mounts.n mourners.n mousetraps.n mousses.n moustaches.n mouthfuls.n mouthpieces.n mouths.n movements.n movers.n movies.n mowers.n muckrakers.n muddles.n mudguards.n mudslingers.n muffins.n mufflers.n muffs.n muggers.n muggings.n mugs.n mugwumps.n mulattos.n mulberries.n mulches.n mules.n mullahs.n multimillionaires.n multinationals.n multiples.n multiplexers.n multitudes.n mummies.n municipalities.n munitions.n murals.n murderers.n murders.n murmurs.n muscles.n muses.n musetes.n museums.n mushrooms.n musicals.n musicians.n musketeers.n muskets.n muskrats.n mussels.n mustachios.n mustangs.n musters.n mutations.n mutes.n mutilations.n mutineers.n mutinies.n mutterers.n mutts.n muzzles.n mynahs.n mynas.n myriads.n mysteries.n mystics.n mystiques.n mythologies.n mythologists.n nachos.n nadaswarams.n nadirs.n nailfiles.n nails.n nameplates.n names.n namesakes.n nannies.n nanoliters.n nanolitres.n nanometers.n nanometres.n nanoseconds.n nanowatts.n napes.n napkins.n nappies.n naps.n narcotics.n narrations.n narratives.n narrators.n nasals.n nationalists.n nationalities.n nationalizations.n nationals.n nations.n natives.n nativities.n naturalists.n naturals.n natures.n naughts.n nautiluses.n navels.n naves.n navies.n navigators.n nearsides.n nebulas.n necessities.n neckbands.n necklaces.n necklines.n necks.n neckties.n necromancers.n necropolises.n nectarines.n needles.n negatives.n negligees.n negliges.n negotiations.n negotiators.n neighborhoods.n neighbors.n neighbourhoods.n neighbours.n neighs.n neologisms.n neophytes.n nephews.n nerves.n nestlings.n nests.n nets.n nettles.n networks.n neurologists.n neurotics.n neutralizations.n neutrons.n newcomers.n newlyweds.n newsagents.n newsboys.n newscasters.n newscasts.n newsdealers.n newsflashes.n newsletters.n newsmongers.n newspapers.n newsreels.n newsrooms.n newssheets.n newsstands.n newsvendors.n newts.n nexuses.n neys.n nibbles.n niceties.n niches.n nickels.n nicknacks.n nicknames.n nicks.n nieces.n nightcaps.n nightclubs.n nightdresses.n nightgowns.n nighties.n nightingales.n nightmares.n nightshirts.n nihilists.n nincompoops.n ninnies.n nipples.n nips.n nitrates.n nits.n nitwits.n nobles.n nocturnes.n nodes.n nods.n noggins.n nohkans.n noises.n nomads.n nomenclatures.n nominations.n nominees.n nonces.n noncombatants.n nonconformists.n nondescripts.n nonentities.n nonevents.n nonsmokers.n nonstarters.n noodles.n nooks.n nooses.n norms.n northeasters.n northerners.n northwesters.n nosebleeds.n nosedives.n nosegays.n noserings.n noses.n nostrils.n nostrums.n notables.n notaries.n notations.n notches.n notebooks.n notes.n notices.n nougats.n nouns.n novelettes.n novelists.n novels.n novelties.n novices.n nozzles.n nuances.n nubs.n nucleotides.n nudes.n nudges.n nudists.n nuggets.n nuisances.n numberplates.n numbers.n numerals.n numerators.n numskulls.n nuncios.n nunneries.n nuns.n nursemaids.n nurseries.n nurses.n nurturers.n nuthouses.n nutmegs.n nutritionists.n nuts.n nutshells.n nylons.n nymphomaniacs.n nymphos.n nymphs.n oafs.n oaks.n oars.n oatcakes.n oaths.n obbligatos.n obelisks.n obituaries.n objections.n objectives.n objectors.n objects.n oblongs.n oboes.n oboists.n obscenities.n observances.n observations.n observatories.n observers.n obsessions.n obstacles.n obstetricians.n obstructionists.n obstructions.n obverses.n ocarinas.n occasions.n occupancies.n occupants.n occupations.n occupiers.n occurrences.n oceans.n octagons.n octapads.n octaves.n octavins.n octets.n octogenarians.n octopuses.n oculists.n oddities.n oddments.n odds.n odes.n odours.n odysseys.n offences.n offenders.n offenses.n offensives.n offerings.n offertories.n officers.n offices.n officials.n offprints.n offshoots.n offspring.p ogres.n ohms.n oilcans.n oilfields.n ointments.n olds.n oligarchies.n oligopolies.n olives.n omegas.n omelets.n omelettes.n omens.n omissions.n omnibuses.n onions.n onlookers.n onrushes.n onsets.n onslaughts.n opals.n openers.n openings.n operas.n operations.n operatives.n operators.n operettas.n ophicleides.n opiates.n opossums.n opponents.n opportunists.n opposites.n oppressors.n opticians.n optimists.n optimums.n oracles.n orals.n oranges.n orations.n oratories.n oratorios.n orators.n orbits.n orbs.n orchards.n orchestras.n orchids.n ordeals.n orderings.n orderlies.n ordinals.n ordinances.n ordinations.n ores.n organisms.n organists.n organizations.n organizers.n organs.n orgasms.n orgies.n oriels.n orientalists.n orientals.n orifices.n originals.n originators.n origins.n orioles.n ornaments.n ornithologists.n orphanages.n orphans.n orthodontists.n orthodoxies.n orthographies.n oscillations.n oscillators.n oscillographs.n oscilloscopes.n ospreys.n osteopaths.n ostriches.n otters.n ottomans.n ounces.n ousters.n outbreaks.n outbursts.n outcasts.n outcomes.n outcries.n outfielders.n outfields.n outfits.n outfitters.n outflows.n outgrowths.n outhouses.n outings.n outlaws.n outlays.n outlets.n outliers.n outlines.n outlooks.n outpatients.n outposts.n outpourings.n outrages.n outriggers.n outsets.n outsiders.n outsides.n outskirts.n ovals.n ovaries.n ovations.n ovens.n overalls.n overcoats.n overdoses.n overdrafts.n overexposures.n overflows.n overgrowths.n overhangs.n overhauls.n overlaps.n overlays.n overlords.n overpasses.n overpayments.n overreactions.n overseers.n overshoes.n oversights.n overstatements.n overthrows.n overtones.n overtures.n overviews.n owls.n owners.n oxides.n oxtails.n oysters.n pacemakers.n paces.n pacesetters.n pachyderms.n pacifists.n packages.n packets.n packhorses.n packs.n pacts.n paddles.n paddocks.n padlocks.n padres.n pads.n paeans.n pagans.n pageants.n pages.n pagodas.n pailfuls.n pails.n painkillers.n pains.n paintboxes.n paintbrushes.n painters.n paintings.n paints.n pairs.n paixiaos.n pajamas.n palaces.n palaeontologists.n palates.n palatinates.n palefaces.n palendags.n paleontologists.n pales.n palettes.n palindromes.n pallbearers.n palliatives.n palls.n palms.n palpitations.n pals.n pamphleteers.n pamphlets.n pan_pipes panaceas.n panamas.n pancakes.n pancreases.n pandas.n pandemics.n panegyrics.n panelists.n panels.n panes.n pangs.n panhandles.n panoplies.n panoramas.n pans.n pansies.n pantheists.n pantheons.n panthers.n pantographs.n pantomimes.n pantries.n pants.n papacies.n papas.n papayas.n paperbacks.n paperclips.n papermills.n papers.n paperweights.n papists.n papooses.n papyruses.n parables.n parabolas.n parachutes.n parachutists.n parades.n paradigms.n paradises.n paradoxes.n paragons.n paragraphs.n parakeets.n parallelisms.n parallelograms.n parallels.n parameters.n paramours.n paranoiacs.n parapets.n paraplegics.n parasites.n parasols.n paratroopers.n parcels.n parchments.n pardons.n parents.n pariahs.n parishes.n parishioners.n parkas.n parks.n parlances.n parleys.n parliamentarians.n parliaments.n parlors.n parlours.n parodies.n parodists.n paroxysms.n parricides.n parrots.n pars.n parses.n parsers.n parsnips.n parsonages.n parsons.n participants.n participles.n particles.n particulars.n parties.n partings.n partisans.n partitions.n partners.n partnerships.n partridges.n parts.n parvenus.n pashas.n passages.n passageways.n passbooks.n passengers.n passes.n passions.n passives.n passports.n passwords.n pastels.n pasterns.n pastes.n pastiches.n pasties.n pastilles.n pastimes.n pastorals.n pastors.n pastries.n pasts.n pastures.n patches.n patellas.n patents.n pates.n pathogens.n pathologists.n paths.n pathways.n patients.n patinas.n patios.n patisseries.n patriarchies.n patriarchs.n patricians.n patricides.n patrimonies.n patriots.n patrols.n patronesses.n patrons.n patronymics.n pats.n patterns.n patties.n paunches.n paupers.n pauses.n pavements.n pavilions.n pawnbrokers.n pawns.n pawnshops.n paws.n paydays.n payees.n payers.n payloads.n paymasters.n payments.n payoffs.n payouts.n payphones.n payrolls.n paysheets.n payslips.n peacemakers.n peaches.n peacocks.n peaks.n peanuts.n pearls.n pears.n peas.n peasantries.n peasants.n peashooters.n pebbles.n pecans.n peccadillos.n peckers.n pecks.n peculiarities.n pedagogues.n pedals.n pedants.n peddlers.n pederasts.n pedestals.n pedestrians.n pediatricians.n pedicures.n pedigrees.n pedometers.n peeks.n peelers.n peepholes.n peeps.n peepshows.n peerages.n peeresses.n peers.n pees.n pegs.n pekinese.p pelicans.n pellets.n pelts.n pelvises.n penalties.n penchants.n pencils.n pendants.n pendulums.n penguins.n peninsulas.n penises.n penitentiaries.n pennants.n pens.n pensioners.n pensions.n pentagons.n penthouses.n penumbras.n peonies.n peons.n peoples.n peppercorns.n peppermints.n peppers.n perambulators.n percentages.n perches.n percolators.n percussionists.n percussions.n perennials.n perfectionists.n perforations.n performances.n performers.n perfumes.n perils.n perimeters.n periodicals.n periodicities.n peripheries.n periscopes.n perjurers.n perjuries.n perks.n perms.n permutations.n perorations.n peroxides.n perpendiculars.n perpetrators.n perpetuations.n perquisites.n persecutions.n persecutors.n personages.n personalities.n personas.n personifications.n persons.n perspectives.n persuasions.n perturbations.n perusals.n perversions.n perversities.n perverts.n pessimists.n pesticides.n pestilences.n pestles.n pests.n petabytes.n petals.n petards.n petitioners.n petitions.n pets.n petticoats.n petunias.n pews.n pfennigs.n phalanxes.n phalluses.n phantasies.n phantasmagorias.n phantasms.n phantoms.n pharmaceuticals.n pharmacies.n pharmacists.n pharmacologists.n pharynxes.n phases.n pheasants.n philanderers.n philanthropists.n philatelists.n philologists.n philosophers.n phobias.n phoenixes.n phonebooths.n phonecalls.n phonemes.n phones.n phoneticians.n phoneys.n phonies.n phonographs.n phosphates.n photocopiers.n photocopies.n photoflashes.n photographers.n photographs.n photometers.n photons.n photos.n photostats.n phrases.n phrenologists.n physicians.n physicists.n physiognomies.n physiologists.n physiotherapists.n physiques.n pianists.n pianofortes.n pianolas.n pianos.n piazzas.n pibgorns.n pica.p picadors.n piccolos.n pick-ups.n pickaxes.n pickerel.p pickers.n pickets.n pickles.n pickpockets.n picks.n pickups.n picnickers.n picnics.n picoliters.n picolitres.n picometers.n picometres.n picoseconds.n picowatts.n pictorials.n pictures.n pidgins.n pieces.n piers.n pies.n pieties.n pigeons.n piggies.n piggybacks.n piglets.n pigments.n pigmies.n pigs.n pigsties.n pigtails.n pike.p pikestaffs.n piles.n pilgrimages.n pilgrims.n pillages.n pillars.n pillboxes.n pillowcases.n pillows.n pills.n pilots.n pimentos.n pimples.n pimps.n pinafores.n pincers.n pinches.n pincushions.n pineapples.n pines.n pings.n pinheads.n pinks.n pinnacles.n pinpoints.n pinpricks.n pins.n pints.n pioneers.n pipedreams.n pipefuls.n pipelines.n pipers.n pipes.n pipettes.n pips.n pipsqueaks.n piques.n piranhas.n pirates.n pirouettes.n pisses.n pistachios.n pistils.n pistols.n pistons.n pitchers.n pitches.n pitchforks.n pitfalls.n pitheads.n pities.n pits.n pittances.n pituitaries.n pivots.n pixies.n pizzas.n placards.n placebos.n placements.n placeseekers.n plagiarists.n plagues.n plaice.p plains.n plaintiffs.n planes.n planetariums.n planets.n planks.n planners.n plantains.n plantations.n planters.n plants.n plaques.n plasters.n plastics.n plateaus.n platefuls.n plates.n platforms.n platitudes.n platoons.n platters.n platypuses.n plaudits.n playbills.n playboys.n players.n playgoers.n playgrounds.n playhouses.n playmates.n playoffs.n playpens.n playrooms.n plays.n playschools.n playthings.n playwrights.n plazas.n pleas.n pleasantries.n pleasures.n pleats.n plebeians.n plebiscites.n plectrums.n plenipotentiaries.n plenums.n plethoras.n plexus.p pliers.n plights.n plodders.n plops.n plotters.n ploughboys.n ploughs.n ploughshares.n plows.n ploys.n plucks.n plugholes.n plugs.n plumbers.n plumbs.n plumes.n plumps.n plums.n plunderers.n plungers.n plunges.n pluperfects.n pluralists.n pluralities.n plurals.n pluses.n plutocracies.n plutocrats.n poachers.n pocketfuls.n pockets.n podiums.n pods.n poems.n poets.n pogroms.n poinsettias.n pointers.n points.n poisons.n pokers.n pokes.n polarities.n polarizations.n poleaxes.n polecats.n polemics.n poles.n policies.n polishes.n politburos.n politicians.n politics.p polities.n polkas.n polls.n pollsters.n pollutants.n polonaises.n poltergeists.n polygamists.n polyglots.n polygons.n polynomials.n polyps.n polysyllables.n polytechnics.n pomegranates.n pompons.n ponchos.n ponds.n ponies.n pontiffs.n pontoons.n ponytails.n poodles.n poofs.n poolrooms.n pools.n poops.n poorhouses.n popes.n popinjays.n poplars.n poppies.n pops.n populaces.n popularizations.n populations.n populists.n porches.n porcupines.n pores.n porkers.n pornographers.n porosities.n porpoises.n porringers.n portals.n portcullises.n porterhouses.n porters.n portfolios.n portholes.n porticos.n portions.n portmanteaus.n portraitists.n portraits.n portrayals.n ports.n posers.n poses.n positivists.n posses.n possessions.n possums.n postbags.n postboxes.n postcards.n postcodes.n posteriors.n posters.n postgraduates.n postmarks.n postmasters.n postponements.n posts.n postscripts.n postulates.n postures.n potatoes.n potbellies.n potboilers.n potencies.n potentates.n potentialities.n potentials.n potheads.n potholes.n potions.n potpourris.n pots.n potteries.n potters.n potties.n pouches.n poultices.n pounces.n pounds.n pouts.n powders.n powerboats.n powerhouses.n powers.n powwows.n practicalities.n practices.n practitioners.n praesidiums.n pragmatists.n prairies.n praises.n prams.n prances.n pranks.n pranksters.n prattlers.n prawns.n prayers.n preachers.n preambles.n prearrangements.n prebendaries.n precautions.n precedents.n preceptors.n precepts.n precessions.n precincts.n precipices.n precis.p preconceptions.n preconditions.n precursors.n predators.n predecessors.n predeterminations.n predicaments.n predicates.n predictions.n predictors.n predilections.n predispositions.n prefabrications.n prefaces.n prefects.n prefectures.n preferences.n prefixes.n pregnancies.n prejudgements.n prejudices.n prelates.n preliminaries.n prelims.n preludes.n premieres.n premiers.n premierships.n premises.n premisses.n premiums.n preoccupations.n preparations.n preponderances.n prepositions.n preps.n prerogatives.n prescriptions.n presences.n presentations.n presentiments.n presents.n preservatives.n preservers.n preserves.n presidencies.n presidents.n presidiums.n presses.n pressings.n prestidigitators.n presumptions.n pretences.n pretenders.n pretenses.n pretensions.n pretexts.n pretzels.n previews.n previsions.n pricelists.n prices.n pricetags.n prickles.n pricks.n priestesses.n priesthoods.n priests.n prigs.n primacies.n primaries.n primates.n primers.n primes.n primings.n primitives.n primroses.n princedoms.n princes.n princesses.n principalities.n principals.n printers.n printings.n printouts.n prints.n priories.n priorities.n priors.n prisms.n prisoners.n prisons.n privateers.n privates.n privations.n privatizations.n privies.n privileges.n prizes.n probates.n probes.n problems.n proboscises.n procedures.n proceedings.n proceeds.n processes.n processions.n processors.n proconsulates.n proconsuls.n procreations.n proctors.n procurers.n prodigies.n prods.n producers.n productions.n products.n profanities.n professionals.n professions.n professoriates.n professors.n professorships.n profiles.n profiteers.n profits.n profundities.n progenitors.n prognoses.n prognostications.n programmers.n programmes.n programs.n progressions.n progressives.n prohibitionists.n prohibitions.n projectiles.n projectionists.n projections.n projectors.n projects.n proletarians.n proletariats.n proliferations.n prologues.n prolongations.n promenades.n promontories.n promoters.n promotions.n prompters.n prompts.n proms.n prongs.n pronouncements.n pronouns.n proofreaders.n propagandists.n propagators.n propellants.n propellents.n propellers.n properties.n prophecies.n prophets.n prophylactics.n proponents.n proportions.n proprietors.n props.n pros.n prosceniums.n proscriptions.n prosecutions.n prosecutors.n prospectors.n prospectuses.n prostates.n prostitutes.n protagonists.n protectionists.n protections.n protectorates.n protectors.n protegees.n proteges.n proteins.n protestations.n protesters.n protests.n protocols.n protons.n prototypes.n protractors.n protrusions.n protuberances.n proverbs.n providers.n provinces.n provincialisms.n provocations.n provosts.n prowlers.n prowls.n prows.n proxies.n prudes.n prunes.n psalmists.n psalms.n psalteries.n psalters.n psalterys.n pseudonyms.n pseuds.n psyches.n psychiatrists.n psychics.n psychoanalysts.n psychologists.n psychopaths.n psychotics.n pterodactyls.n publications.n publicists.n publishers.n pubs.n pucks.n puddings.n puddles.n pueblos.n puffins.n puffs.n pulalus.n pulleys.n pullovers.n pulpits.n pulps.n pulsars.n pulsations.n pulses.n pumas.n pumpkins.n pumps.n punchballs.n punchbowls.n punches.n punctures.n pundits.n punishments.n punks.n puns.n punsters.n punts.n pupils.n puppeteers.n puppets.n puppies.n pups.n purchasers.n purchases.n purees.n purgatories.n purges.n purifications.n purifiers.n purists.n puritans.n purposes.n purrs.n purses.n pursefuls.n pursuers.n pursuits.n purveyors.n purviews.n pushcarts.n pushers.n pushes.n pushovers.n pussies.n pussycats.n putsches.n putts.n puzzles.n pygmies.n pylons.n pyramids.n pyres.n pythons.n quacks.n quadrangles.n quadrants.n quadrilaterals.n quadrupeds.n quadruplets.n quads.n quagmires.n quails.n quakes.n qualifications.n qualifiers.n qualities.n qualms.n quandaries.n quantities.n quarantines.n quarks.n quarrels.n quarries.n quarterbacks.n quarterfinals.n quarterlies.n quarters.n quartets.n quarts.n quasars.n quatercentenaries.n quatrains.n quatros.n quavers.n quays.n queens.n queers.n queries.n quesadillas.n questioners.n questionnaires.n quests.n queues.n quibbles.n quiches.n quickies.n quicksteps.n quid.p quietists.n quills.n quilts.n quincentenaries.n quinces.n quintessences.n quintets.n quinticlaves.n quintuplets.n quips.n quirks.n quitters.n quivers.n quizes.n quizmasters.n quorums.n quotas.n quotations.n quotes.n quotients.n rabbis.n rabbits.n rabbles.n raccoons.n racecourses.n racehorses.n racers.n races.n racists.n racketeers.n rackets.n racks.n raconteurs.n racoons.n racquets.n radials.n radiations.n radiators.n radicals.n radicles.n radiograms.n radioisotopes.n radiologists.n radios.n radishes.n raffles.n rafters.n rafts.n ragamuffins.n rags.n ragtags.n raiders.n raids.n railcars.n railheads.n railings.n railroads.n rails.n railways.n rainbows.n raincoats.n raindrops.n rainfalls.n rainsticks.n raises.n raisins.n rakes.n rallies.n ramblers.n rambles.n ramifications.n rampages.n ramparts.n ramps.n ramrods.n rams.n ranchers.n ranches.n rangefinders.n rangers.n ranges.n ranks.n ransoms.n rapes.n rapids.n rapiers.n rapists.n rapports.n rapprochements.n raps.n rapscallions.n raptures.n rarebits.n rarities.n rascals.n rashers.n rashes.n raspberries.n rasps.n ratchets.n ratepayers.n rates.n ratifications.n ratings.n rationales.n rationalists.n rationalizations.n rations.n ratios.n rats.n rattles.n rattlesnakes.n ravens.n raves.n ravines.n rays.n razorbacks.n razorblades.n razors.n re-elections.n reaches.n reactionaries.n reactions.n reactors.n readers.n readerships.n readings.n readjustments.n reagents.n realignments.n realists.n realities.n realms.n realties.n realtors.n reams.n reapers.n reappearances.n reappraisals.n rearguards.n rears.n reassessments.n rebates.n rebecs.n rebellions.n rebels.n rebirths.n rebounds.n rebuffs.n rebukes.n rebuttals.n recalls.n recapitulations.n recaps.n receipts.n receivables.n receivers.n receiverships.n receptacles.n receptionists.n receptions.n recesses.n recessionals.n recessions.n recidivists.n recipes.n recipients.n recitals.n recitations.n recitatives.n reckonings.n recluses.n recognizances.n recoils.n recollections.n recompenses.n reconciliations.n reconnaissances.n reconstructions.n recorders.n recordings.n records.n recoveries.n recreations.n recriminations.n recruiters.n recruitments.n recruits.n rectangles.n rectifiers.n rectories.n rectors.n rectums.n recurrences.n recyclers.n redbreasts.n redcaps.n redcoats.n redeemers.n redevelopments.n redheads.n rediscoveries.n redoubts.n redskins.n reductions.n redundancies.n redwoods.n reeds.n reefers.n reefs.n reels.n refectories.n referees.n references.n referendums.n referrals.n refills.n refinements.n refineries.n refiners.n reflections.n reflectors.n reflexes.n reflexives.n reformations.n reformatories.n reformers.n reforms.n refractions.n refrains.n refreshers.n refreshments.n refrigerants.n refrigerators.n refugees.n refuges.n refunds.n refutations.n regards.n regattas.n regencies.n regents.n regicides.n regimens.n regiments.n regimes.n regions.n registers.n registrars.n registrations.n registries.n regressions.n regrets.n regularities.n regulars.n regulations.n regulators.n rehabilitations.n rehashes.n rehearings.n rehearsals.n reigns.n reimbursements.n reimpositions.n reincarnations.n reindeer.p reinforcements.n reins.n reinterpretations.n reissues.n reiterations.n rejections.n rejects.n rejoinders.n relapses.n relations.n relationships.n relatives.n relaxations.n relays.n releases.n relics.n religions.n rellenos.n remainders.n remains.n remakes.n remarriages.n remedies.n remembrances.n reminders.n reminiscences.n remissions.n remittances.n remnants.n remonstrances.n removals.n removers.n renaissances.n renascences.n renderings.n rendezvous.p renditions.n renegades.n renewals.n renovations.n rentals.n rents.n reorganizations.n repairs.n reparations.n repasts.n repayments.n repeals.n repeaters.n repeats.n repercussions.n repertoires.n repertories.n repetitions.n replacements.n replays.n replicas.n replies.n reporters.n repositories.n representations.n representatives.n reprieves.n reprimands.n reprints.n reprisals.n reproaches.n reprobates.n reproductions.n reproofs.n reptiles.n republicans.n republics.n repudiations.n repurchases.n reputations.n requiems.n requisitions.n reruns.n resales.n rescuers.n rescues.n researchers.n researches.n resemblances.n reservations.n reserves.n reservoirs.n resettlements.n reshuffles.n residences.n residencies.n residents.n residues.n resignations.n resins.n resisters.n resistors.n resolutions.n resonators.n resorts.n resources.n respectabilities.n respects.n respirations.n respirators.n respites.n respondents.n responses.n restatements.n restauranteurs.n restaurants.n restaurateurs.n restorations.n restoratives.n restorers.n restraints.n restructurings.n rests.n results.n resumes.n resumptions.n resurgences.n retailers.n retails.n retainers.n retardations.n retards.n retinas.n retinues.n retirees.n retirements.n retorts.n retractions.n retreads.n retreats.n retrenchments.n retrials.n retrievers.n returns.n reunions.n reveilles.n revelations.n revellers.n revels.n revenues.n reverberations.n reverends.n reveries.n reversals.n reverses.n reversions.n reviewers.n reviews.n revisionists.n revisions.n revivalists.n revivals.n revocations.n revolts.n revolutionaries.n revolutions.n revolvers.n revs.n revues.n rewards.n rewrites.n rhapsodies.n rheostats.n rheumatics.n rhinoceros.p rhinos.n rhododendrons.n rhombuses.n rhymes.n rhythms.n ribbons.n ribs.n rickshaws.n ricochets.n riddles.n riders.n rides.n ridges.n riffs.n rifles.n rifts.n riggers.n rightists.n rigidities.n rigs.n rims.n ringers.n ringleaders.n ringlets.n ringmasters.n rings.n ringsides.n rinks.n rinses.n rioters.n riots.n ripostes.n ripples.n rips.n risers.n risottos.n rites.n rituals.n rivalries.n rivals.n riverbeds.n rivers.n riversides.n rivets.n rivulets.n roach.p roadbeds.n roadblocks.n roadhouses.n roads.n roadsides.n roadsters.n roadways.n roars.n roasters.n roasts.n robberies.n robbers.n robes.n robins.n robots.n rockeries.n rockers.n rockets.n rocks.n rodents.n rodeos.n rods.n roe.p roebucks.n rogues.n roles.n rollers.n rolls.n romances.n romantics.n romps.n rondeaus.n rondos.n roofs.n rookeries.n rookies.n rooks.n roomfuls.n rooms.n roosters.n roosts.n roots.n ropes.n rosaries.n rosebuds.n roses.n rosters.n rostrums.n rotaries.n rotas.n rotations.n rotisseries.n rotors.n rotters.n rotundas.n roues.n roughnecks.n roughriders.n roundabouts.n roundelays.n roundhouses.n rounds.n roundups.n routes.n routines.n routs.n rovers.n rowboats.n rowdies.n rowers.n rows.n royalists.n royalties.n rubbernecks.n rubbers.n rubies.n rubrics.n rubs.n rucksacks.n ruckuss.n rudders.n rudiments.n ruffians.n ruffles.n ruffs.n rugs.n ruins.n rulers.n rulings.n rumbas.n rumbles.n rumours.n rumps.n run-ups.n runaways.n rundowns.n runes.n rungs.n runners.n runoffs.n runs.n runts.n runways.n ruptures.n ruses.n rushes.n rusks.n rustics.n rustlers.n ruts.n ryutekis.n sabbaticals.n sables.n saboteurs.n sabres.n sachets.n sackbuts.n sacks.n sacraments.n sacrifices.n sacs.n saddlebags.n saddles.n sadists.n safaris.n safecrackers.n safeguards.n safes.n sagas.n sages.n sags.n sahibs.n sailors.n sails.n saints.n sakes.n salaams.n salads.n salamanders.n salaries.n salerooms.n sales.n salines.n sallies.n salons.n saloons.n salts.n saltworks.p salutations.n salutes.n salvers.n salves.n salvos.n sambas.n samovars.n sampans.n samplers.n samples.n samponias.n sanatoriums.n sanctions.n sanctities.n sanctuaries.n sanctums.n sandals.n sandbags.n sandbanks.n sandglasses.n sandpipers.n sandpits.n sands.n sandstorms.n sandwiches.n saplings.n sappers.n sapphires.n saps.n sarabands.n sardines.n saris.n sarongs.n sashes.n satchels.n satellites.n satires.n satirists.n satisfactions.n satraps.n satyrs.n saucepans.n saucers.n sauces.n saunas.n sausages.n savages.n savannahs.n savannas.n savants.n savers.n savings.p saviours.n savoys.n sawhorses.n sawmills.n saws.n sawyers.n saxes.n saxhorns.n saxonettes.n saxophones.n saxophonists.n scabbards.n scabs.n scaffolds.n scalawags.n scales.n scallops.n scallywags.n scalpels.n scalps.n scamps.n scams.n scandalmongers.n scandals.n scanners.n scapegoats.n scapulas.n scarcities.n scarecrows.n scaremongers.n scares.n scarfs.n scarlets.n scars.n scatterbrains.n scatters.n scavengers.n scenarios.n scenes.n scents.n sceptics.n sceptres.n schedules.n schemas.n schemers.n schemes.n scherzos.n schisms.n schizophrenics.n schnitzels.n scholars.n scholarships.n schoolbooks.n schoolboys.n schoolfellows.n schoolfriends.n schoolgirls.n schoolhouses.n schoolmasters.n schoolmates.n schoolmistresses.n schoolrooms.n schools.n schoolteachers.n schooners.n schottisches.n schwas.n sciences.n scientists.n scimitars.n scintillas.n scions.n scolds.n scollops.n scones.n scoopfuls.n scoops.n scooters.n scorchers.n scoreboards.n scorebooks.n scorecards.n scorers.n scores.n scorpions.n scotches.n scoundrels.n scourges.n scoutmasters.n scouts.n scowls.n scrambles.n scrapbooks.n scrapers.n scrapes.n scrapheaps.n scraps.n scratches.n scrawls.n screams.n screenplays.n screens.n screwballs.n screwdrivers.n screws.n scribblers.n scribbles.n scribes.n scrimmages.n scripts.n scriptures.n scriptwriters.n scriveners.n scrolls.n scrotums.n scroungers.n scrubs.n scruffs.n scrunches.n scruples.n scuds.n sculleries.n sculptors.n sculptures.n scythes.n seabeds.n seabirds.n seaboards.n seafarers.n seafronts.n seagulls.n seals.n seams.n seamstresses.n seances.n seaplanes.n seaports.n searchers.n searches.n searchlights.n seas.n seascapes.n seashells.n seashores.n seasides.n seasonings.n seasons.n seats.n seaways.n seaweeds.n secessionists.n secessions.n seconders.n secretariats.n secretaries.n secretions.n secrets.n secs.n sectarians.n sections.n sectors.n sects.n securities.n sedans.n sedatives.n seducers.n seductions.n seedbeds.n seedlings.n seeds.n seekers.n seers.n seesaws.n segmentations.n segments.n seigniors.n seismographs.n seismologists.n seizures.n selections.n selectors.n self-examinations.n self-sacrifices.n sellers.n selloffs.n sellouts.n semblances.n semesters.n semibreves.n semicircles.n semicolons.n semiconductors.n semifinalists.n semifinals.n seminaries.n seminars.n semiquavers.n semitones.n semivowels.n senates.n senators.n senders.n sendoffs.n seniors.n senoras.n senoritas.n sensationalists.n sensations.n sensibilities.n sensitivities.n sentences.n sentiments.n sentinels.n sentries.n separations.n separatists.n septets.n septuagenarians.n sepulchres.n sequels.n sequences.n sequins.n sequoias.n serenades.n serfs.n sergeants.n serials.n series.p sermons.n serpents.n servants.n servers.n serves.n services.n serviettes.n servings.n sessions.n setbacks.n sets.n settees.n setters.n settings.n settlements.n settlers.n sewers.n sexagenarians.n sexes.n sexists.n sextants.n sextets.n sextons.n shackles.n shacks.n shades.n shadings.n shadows.n shafts.n shahs.n shakes.n shakedowns.n shakeouts.n shakers.n shakuhachis.n shampoos.n shamrocks.n shandies.n shanks.n shanties.n shantytowns.n shapes.n shards.n sharecroppers.n shareholders.n shareholdings.n shares.n sharks.n sharpeners.n sharpers.n sharps.n sharpshooters.n shavers.n shaves.n shawls.n sheathings.n sheaths.n sheds.n sheepdogs.n sheepskins.n sheets.n shehnais.n sheikdoms.n sheikhdoms.n sheikhs.n sheiks.n shekeres.n shellfish.p shells.n shelters.n shengs.n shepherds.n sherbets.n sheriffs.n sherries.n shibboleths.n shields.n shifts.n shimmers.n shinbones.n shindigs.n shingles.n shinguards.n shinobues.n shins.n shipbuilders.n shiploads.n shipmates.n shipments.n shipowners.n shippers.n ships.n shipwrecks.n shipwrights.n shipyards.n shires.n shirkers.n shirts.n shirtwaists.n shivers.n shoals.n shockers.n shocks.n shoehorns.n shoelaces.n shoemakers.n shoes.n shoestrings.n shoetrees.n shoguns.n shooters.n shootings.n shopkeepers.n shoplifters.n shoppers.n shops.n shopwindows.n shores.n shortages.n shortcomings.n shortcuts.n shortfalls.n shortlists.n shorts.n shortstops.n shotguns.n shots.n shoulders.n shouts.n shovelfuls.n shovels.n shoves.n showboats.n showcases.n showdowns.n showers.n showgirls.n showings.n showplaces.n showrooms.n shows.n shreds.n shrews.n shrieks.n shrimps.n shrines.n shrinks.n shrouds.n shrubberies.n shrubs.n shrugs.n shudders.n shuffles.n shutdowns.n shutters.n shuttlecocks.n shuttles.n shysters.n sibilants.n siblings.n sickbays.n sickbeds.n sickles.n sicknesses.n sideboards.n sidecars.n sidelights.n sidelines.n sides.n sideshows.n sidesteps.n sidetracks.n sidewalks.n sidings.n sieges.n sierras.n siestas.n sieves.n sifters.n sighs.n sightings.n sights.n sightseers.n signals.n signatories.n signatures.n signers.n signoras.n signorinas.n signors.n signposts.n sikus.n silencers.n silences.n silhouettes.n silks.n silkworms.n sills.n silos.n silversmiths.n similarities.n similes.n similitudes.n simpletons.n simplifications.n simulations.n simulators.n sinecures.n sines.n sinews.n singers.n singles.n singletons.n singsongs.n singularities.n singulars.n sinkers.n sinkings.n sinks.n sinners.n sins.n sinuses.n siphons.n sips.n sirens.n sirloins.n sirs.n sirups.n sissies.n sisters.n sitars.n sites.n sitters.n sittings.n situations.n sixpences.n sizes.n skateboarders.n skateboards.n skaters.n skates.n skeets.n skeletons.n skeptics.n sketches.n skewers.n skids.n skiers.n skies.n skiffs.n skillets.n skills.n skinflints.n skinheads.n skins.n skippers.n skips.n skirmishes.n skirts.n skis.n skits.n skullcaps.n skulls.n skunks.n skylarks.n skylights.n skylines.n skyscrapers.n slabs.n slacks.n slams.n slanderers.n slanders.n slants.n slaps.n slashes.n slates.n slats.n slaughterers.n slaughterhouses.n slaves.n slayers.n sledgehammers.n sleds.n sleepers.n sleepwalkers.n sleeves.n sleighs.n sleights.n sleuths.n slices.n slickers.n slicks.n slides.n slights.n slingers.n slings.n slipcovers.n slipknots.n slippers.n slips.n slits.n slivers.n slobs.n sloes.n slogans.n sloops.n slopes.n slops.n sloths.n slots.n slowcoaches.n slowdowns.n sluggards.n slugs.n sluicegates.n sluices.n slumbers.n slumps.n slums.n slurs.n sluts.n smackers.n smacks.n smallholders.n smallholdings.n smashes.n smatterings.n smears.n smells.n smelts.n smiles.n smirks.n smithies.n smiths.n smocks.n smokers.n smokestacks.n smorgasbords.n smudges.n smugglers.n snacks.n snags.n snails.n snakes.n snapdragons.n snaps.n snapshots.n snares.n snarls.n snatchers.n snatches.n sneaks.n sneers.n sneezes.n snickers.n sniffs.n sniggers.n snipers.n snippers.n snippets.n snips.n snobs.n snoopers.n snoozes.n snorers.n snores.n snorkels.n snorts.n snouts.n snowballs.n snowdrifts.n snowdrops.n snowfalls.n snowflakes.n snowploughs.n snowstorms.n snubs.n snuffboxes.n snugs.n soapboxes.n sobriquets.n sobs.n socialists.n socialites.n socials.n societies.n sociologists.n sockets.n socks.n sodomites.n sods.n sofas.n softeners.n softies.n soirees.n sojourners.n solaces.n soldiers.n soles.n solicitors.n solids.n soliloquies.n solitudes.n soloists.n solos.n solstices.n solutions.n solvents.n sombreros.n somersaults.n somnambulists.n sonars.n sonatas.n songbirds.n songbooks.n songs.n sonnets.n sonnies.n sonorities.n sons.n soothsayers.n sopapillas.n sophisms.n sophists.n sophomores.n sopranos.n sops.n sorbets.n sorcerers.n sorceresses.n sores.n sororities.n sorrels.n sorrows.n sorters.n sorties.n sorts.n soubriquets.n souffles.n souls.n sounds.n soundtracks.n soupcons.n soups.n sources.n sousaphones.n southeasters.n southerners.n southpaws.n southwesters.n souvenirs.n sovereigns.n soviets.n sowers.n sows.n soybeans.n spacecraft.p spaces.n spaceships.n spacesuits.n spadefuls.n spades.n spaniels.n spankings.n spanners.n spans.n spares.n sparklers.n sparkles.n sparks.n sparrows.n spars.n spas.n spasms.n spastics.n spates.n spatulas.n speakerphones.n speakers.n spears.n specialists.n specialities.n specializations.n specials.n specialties.n species.p specifications.n specifics.n specimens.n speckles.n specks.n specs.n spectacles.n spectaculars.n spectators.n specters.n spectres.n spectroscopes.n spectrums.n speculators.n speeches.n speedboats.n speedometers.n speeds.n speedways.n spellers.n spellings.n spells.n spenders.n spendthrifts.n spermicides.n sperms.n spheres.n sphinxes.n spices.n spiders.n spiels.n spies.n spigots.n spikes.n spills.n spindles.n spines.n spinets.n spinoffs.n spins.n spinsters.n spirals.n spires.n spirits.n spirituals.n spitfires.n spittoons.n splashes.n spleens.n splices.n splinters.n splints.n splits.n splotches.n spoils.n spoilsports.n spokes.n spokespersons.n spondees.n spongers.n sponges.n sponsors.n sponsorships.n spoofs.n spooks.n spools.n spoonerisms.n spoonfuls.n spoons.n spores.n sporrans.n sports.n spotlights.n spots.n spotters.n spouses.n spouts.n sprains.n sprawls.n sprayers.n sprays.n spreaders.n spreads.n sprees.n sprigs.n springboards.n springboks.n springs.n springtimes.n sprinklers.n sprinters.n sprints.n sprockets.n sprouts.n spruces.n spuds.n spurs.n spurts.n sputniks.n squabbles.n squabs.n squadrons.n squads.n squalls.n squares.n squatters.n squawks.n squaws.n squeakers.n squeaks.n squealers.n squeals.n squeegees.n squeezers.n squeezes.n squibs.n squids.n squiggles.n squints.n squires.n squirrels.n squirts.n stabilizations.n stableboys.n stablemates.n stables.n stabs.n stacks.n stadiums.n staffers.n staffs.n stagecoaches.n stages.n staggers.n stagings.n stags.n stains.n staircases.n stairs.n stairways.n stakes.n stalactites.n stalagmites.n stalemates.n stalkers.n stalks.n stallions.n stalls.n stalwarts.n stamens.n stammerers.n stammers.n stampedes.n stamps.n stances.n standards.n standbys.n standoffs.n standpipes.n standpoints.n stands.n standstills.n stanzas.n staplers.n staples.n stares.n starfish.p stargazers.n starlets.n starlings.n stars.n starters.n starts.n startups.n states.n stationers.n stationmasters.n stations.n statisticians.n statistics.n statues.n statuettes.n statutes.n staves.n stays.n steaks.n steamboats.n steamers.n steamrollers.n steamships.n steeds.n steelmakers.n steelpans.n steelworks.p steelyards.n steeplechasers.n steeplechases.n steeplejacks.n steeples.n steers.n stems.n stenches.n stencils.n stenographers.n stepbrothers.n stepdaughters.n stepfathers.n stepladders.n stepmothers.n stepparents.n steppes.n steps.n stepsisters.n stepsons.n stereos.n stereoscopes.n stereotypes.n sterns.n sternums.n stethoscopes.n stetsons.n stevedores.n stewardesses.n stewards.n stews.n stickers.n sticklers.n sticks.n sties.n stiffs.n stigmas.n stiles.n stilettos.n stillbirths.n stills.n stilts.n stimulants.n stingers.n stingrays.n stings.n stinkers.n stinks.n stints.n stipends.n stirrups.n stirs.n stitches.n stoats.n stockades.n stockbrokers.n stockcars.n stockfish.p stockholders.n stockholdings.n stocking.n stockings.n stockpiles.n stockrooms.n stocks.n stockyards.n stoics.n stomachs.n stonemasons.n stones.n stooges.n stools.n stoops.n stopgaps.n stopovers.n stoppages.n stoppers.n stops.n stopwatches.n storehouses.n storerooms.n stores.n storeys.n stories.n storks.n storms.n storytellers.n stoves.n stowaways.n stragglers.n strainers.n strains.n straitjackets.n straits.n strands.n strangers.n strangleholds.n straphangers.n straps.n stratagems.n strategies.n strategists.n stratifications.n stratospheres.n strawberries.n straws.n strays.n streaks.n streamers.n streamlets.n streams.n streetcars.n streets.n streetwalkers.n strengths.n stresses.n stretchers.n stretches.n strictures.n strides.n strikebreakers.n strikers.n strikes.n strings.n stripes.n strippers.n strips.n stroboscopes.n strokes.n strollers.n strolls.n strongboxes.n strongholds.n strophes.n structures.n strudels.n struggles.n struts.n stubs.n stuccos.n students.n studies.n studios.n studs.n stuffs.n stumbles.n stumps.n stunners.n stunts.n stupors.n sturgeons.n stutterers.n stutters.n styles.n stylists.n stylizations.n styluses.n subalterns.n subcommittees.n subcontinents.n subcontractors.n subcontracts.n subdivisions.n subeditors.n subfamilies subgroups.n subheadings.n subjects.n subjugations.n subleases.n sublimates.n sublimations.n submarines.n submissions.n subordinates.n subpoenas.n subs.n subscribers.n subscriptions.n subscripts.n subsections.n subsets.n subsidiaries.n subsidies.n substances.n substantives.n substitutes.n substitutions.n substrates.n subterfuges.n subtitles.n subtleties.n subtractions.n suburbs.n subversives.n subways.n successes.n successors.n suckers.n sucklings.n sufferers.n suffixes.n suffrages.n suffragettes.n sugarlumps.n suicides.n suitcases.n suites.n suitors.n suits.n sultanas.n sultanates.n sultans.n summaries.n summations.n summerhouses.n summers.n summits.n summonses.n sums.n sunbeams.n sunblinds.n sunbonnets.n sunburns.n sundaes.n sundials.n sunfish.p sunflowers.n sunglasses.n sunhats.n sunlamps.n sunrises.n sunroofs.n suns.n sunsets.n sunshades.n sunspots.n suntans.n supercomputers.n superconductors.n superfamilies superficialities.n superfluities.n superintendents.n superiors.n superlatives.n supermarkets.n supernumeraries.n superpowers.n supers.n superstars.n superstitions.n superstructures.n supervisors.n suppers.n supplements.n supplicants.n supplications.n suppliers.n supplies.n supporters.n supports.n suppositories.n suppressions.n suppressors.n surcharges.n surfaces.n surfboards.n surfboats.n surfeits.n surgeons.n surgeries.n surges.n surnames.n surpluses.n surprises.n surrealists.n surrenders.n surrogates.n surtaxes.n surveyors.n surveys.n survivals.n survivors.n susceptibilities.n suspects.n suspenders.n sutures.n suzerains.n swabs.n swaggers.n swallows.n swamps.n swans.n swaps.n swarms.n swashbucklers.n swastikas.n swathes.n swaths.n swearwords.n sweatbands.n sweaters.n sweats.n sweatshops.n sweepers.n sweeps.n sweetenings.n sweethearts.n sweeties.n swells.n swerves.n swigs.n swimmers.n swimsuits.n swindlers.n swindles.n swine.p swineherds.n swings.n swipes.n swirls.n switchboards.n switches.n swivels.n swoons.n swoops.n swordfish.p swords.n sycamores.n sycophants.n syllables.n syllabuses.n syllogisms.n symbolisms.n symbolizations.n symbols.n sympathies.n sympathizers.n symphonies.n symposiums.n symptoms.n synagogues.n synclaviers.n syncopations.n syndicates.n syndromes.n synods.n synonyms.n synthesizers.n syphons.n syringes.n syrups.n systems.n tabbies.n tabernacles.n tablecloths.n tablemats.n tables.n tablespoonfuls.n tablespoons.n tablets.n tabloids.n taboos.n tabs.n tabulations.n tacitos.n tackles.n tacks.n tacos.n tacticians.n tactics.n tadpoles.n taffies.n tags.n tailgates.n tailors.n tailpieces.n tails.n tailspins.n take-offs.n takeoffs.n takeovers.n takers.n talents.n tales.n talismans.n talkers.n talkies.n talks.n tallboys.n tallies.n talons.n tamales.n tamarinds.n tamborils.n tambourines.n tamburitzas.n tangents.n tangerines.n tangles.n tangos.n tangs.n tankards.n tankers.n tanks.n tanneries.n tanners.n tans.n tantrums.n tapers.n tapes.n tapestries.n tapeworms.n taprooms.n taproots.n taps.n tarantellas.n tarantulas.n targets.n tariffs.n tarogatos.n tarpaulins.n tars.n tartans.n tarts.n taskmasters.n tasks.n tassels.n tasters.n tastes.n tatters.n tattlers.n tattoos.n taunts.n tautologies.n taverns.n taxes.n taxicabs.n taxidermists.n taximeters.n taxis.n taxonomies.n taxpayers.n teacakes.n teachers.n teachings.n teacups.n teahouses.n teammates.n teams.n teamsters.n teapots.n tearooms.n tears.n teasers.n teases.n teashops.n teaspoonfuls.n teaspoons.n teats.n technicalities.n technicians.n techniques.n technocracies.n technocrats.n technologies.n technologists.n techs.n teddies.n teenagers.n tees.n teetotallers.n telecasts.n telefaxes.n telegrams.n telegraphers.n telegraphs.n telephones.n teleprinters.n teleprompters.n telescopes.n televisions.n telexes.n tellers.n tellies.n telltales.n temperaments.n temperatures.n tempers.n tempests.n templates.n temples.n tempos.n temps.n temptresses.n tenancies.n tenants.n tendencies.n tenderfoots.n tenders.n tendons.n tendrils.n tenements.n tenets.n tenners.n tenoroons.n tenors.n tenses.n tensions.n tentacles.n tents.n tenures.n tepees.n tercentenaries.n tercentennials.n terabytes.n terminals.n terminations.n terminologies.n terminuses.n termites.n terms.n terns.n terraces.n terriers.n territories.n terrorists.n terrors.n testaments.n testers.n testicles.n testimonials.n testimonies.n tests.n tethers.n textbooks.n textiles.n texts.n textures.n thalamuses.n thanks.n thaws.n theaters.n theatregoers.n theatres.n thefts.n theists.n themes.n theocracies.n theologians.n theologies.n theorems.n theoreticians.n theorists.n therapists.n theremins.n thermals.n thermometers.n thermoses.n thermostats.n thesauruses.n thickets.n thicknesses.n thieves.n thighbones.n thighs.n thimblefuls.n thimbles.n thingmabobs.n thingmajigs.n things.n thingumabobs.n thingumajigs.n thingummies.n thinkers.n thistles.n thongs.n thoraxes.n thorns.n thoroughbreds.n thoroughfares.n thralls.n thrashings.n threads.n threesomes.n threnodies.n threshers.n thresholds.n thrifts.n thrillers.n thrills.n throats.n throbs.n throes.n thrones.n throngs.n throttles.n throwaways.n throwbacks.n thrushes.n thrusters.n thrusts.n thuds.n thugs.n thumbs.n thumbscrews.n thumbtacks.n thumps.n thunderbolts.n thunderclaps.n thunderstorms.n thwarts.n thyroids.n tiaras.n tickets.n ticks.n tics.n tidbits.n tides.n tiers.n ties.n tiffs.n tigers.n tightropes.n tildes.n tiles.n tillers.n tills.n tilts.n timbers.n timbres.n timekeepers.n timepieces.n timers.n timetables.n timings.n timpanis.n timpanists.n tinderboxes.n tinges.n tingles.n tinkers.n tins.n tints.n tipplers.n tips.n tirades.n tires.n tissues.n titans.n titbits.n tithes.n titles.n tits.n tizzies.n toads.n toadstools.n toasters.n toastmasters.n toastracks.n toasts.n tobacconists.n toboggans.n toccatas.n toddlers.n toeholds.n toenails.n toes.n toffees.n togas.n toggles.n toilets.n tokens.n tolerances.n tollbooths.n tollgates.n tollhouses.n tolls.n tomahawks.n tomatoes.n tomboys.n tombs.n tombstones.n tomcats.n tomes.n toms.n tom-toms.n tomtoms.n tones.n tonettes.n tongues.n tonics.n tonnages.n tonnes.n tons.n tonsils.n tonsures.n tools.n toothaches.n toothbrushes.n toothpicks.n toots.n topcoats.n topics.n topmasts.n toppers.n toppings.n tops.n topsails.n torches.n toreadors.n tormentors.n torments.n tornadoes.n torpedoes.n torpors.n torques.n torrents.n torsos.n tortillas.n tortoises.n torturers.n tortures.n tosses.n tostadas.n totals.n totems.n tots.n toucans.n touchdowns.n touches.n touchstones.n toughies.n toughs.n toupees.n tourists.n tournaments.n tourneys.n tourniquets.n tours.n towels.n towers.n towns.n townships.n towpaths.n towropes.n toxicologists.n toxins.n toys.n toyshops.n tracers.n traces.n tracks.n tractors.n tracts.n trademarks.n traders.n trades.n traditions.n traffickers.n tragedies.n tragicomedies.n trailers.n trails.n trainbearers.n trainees.n trainers.n trainloads.n trains.n traitors.n traits.n trajectories.n tramlines.n tramples.n trampolines.n tramps.n trams.n tramways.n trances.n tranquillizers.n transactions.n transcendentalists.n transcriptions.n transcripts.n transepts.n transferences.n transfers.n transformations.n transformers.n transfusions.n transgressions.n transgressors.n transients.n transistors.n transitions.n translations.n translators.n transmissions.n transmitters.n transmutations.n transoms.n transparencies.n transplantations.n transplants.n transporters.n transports.n transpositions.n transsexuals.n transshipments.n transvestites.n trapezes.n trapezoids.n trappers.n traps.n traumas.n travails.n travellers.n travelogues.n travels.n traverses.n travesties.n trawlers.n trays.n treadles.n treadmills.n treads.n treasurers.n treasures.n treasuries.n treaties.n treatises.n treatments.n treats.n trebles.n trees.n treks.n trellises.n trembles.n tremolos.n tremors.n trenches.n trends.n trespassers.n trestles.n triads.n trials.n triangles.n tribes.n tribulations.n tribunals.n tribunes.n tributaries.n tributes.n trices.n trickles.n tricks.n tricksters.n tricolours.n tricycles.n tridents.n triennials.n tries.n trifles.n triggers.n trills.n trilogies.n trimmers.n trimmings.n trims.n trinities.n trinkets.n trios.n triplets.n tripods.n trippers.n trips.n triptychs.n triumphs.n triumvirates.n trivets.n trivialities.n trochees.n troglodytes.n troikas.n trolleys.n trolls.n trombones.n trombonists.n tromboons.n trompetas.n troopers.n troops.n tropes.n trophies.n tropics.n trots.n trotters.n troubadours.n troublemakers.n troubles.n troubleshooters.n troughs.n troupers.n troupes.n trousers.n trout.p troves.n trowels.n truancies.n truants.n truces.n truckers.n trucks.n trueloves.n truffles.n trumpeters.n trumpets.n trumps.n truncheons.n trunks.n trustees.n trusts.n truths.n trychels.n trysts.n tsetses.n tubas.n tubaxes.n tubers.n tubes.n tubfuls.n tubs.n tuckers.n tucks.n tufts.n tugboats.n tugs.n tulips.n tumblers.n tumbles.n tumbleweeds.n tummies.n tumors.n tumours.n tumults.n tuna.p tuners.n tunes.n tunics.n tunnels.n turbans.n turbines.n turbojets.n turboprops.n turbot.p turbulences.n turds.n turfs.n turkeys.n turmoils.n turnarounds.n turncoats.n turners.n turnings.n turnips.n turnkeys.n turnouts.n turnovers.n turnpikes.n turns.n turnstiles.n turntables.n turquoises.n turrets.n turtledoves.n turtles.n tusks.n tussles.n tutorials.n tutors.n tutus.n tuxedos.n tweeds.n tweeters.n tweets.n twelfths.n twentieths.n twerps.n twigs.n twinges.n twins.n twirls.n twisters.n twists.n twitches.n twits.n twitters.n tycoons.n tykes.n tympanums.n typefaces.n types.n typescripts.n typesetters.n typewriters.n typhoons.n typists.n typographers.n tyrannies.n tyrants.n tyres.n tzarinas.n tzars.n udders.n ukuleles.n ulcers.n ultimatums.n ululations.n umbers.n umbrellas.n umlauts.n umpires.n unbelievers.n uncertainties.n uncles.n underbellies.n undercarriages.n underclasses.n undercurrents.n underdogs.n underestimates.n underestimations.n undergarments.n undergrads.n undergraduates.n undergrounds.n underlines.n underlings.n underpasses.n underpayments.n undersecretaries.n undersides.n understatements.n understudies.n undertakers.n undertakings.n undertones.n undertows.n undervaluations.n underworlds.n underwriters.n undesirables.n undoings.n unicorns.n uniforms.n unionists.n unions.n units.n universes.n universities.n untouchables.n untruths.n upbraidings.n updates.n upgrades.n upheavals.n upholsterers.n uplands.n uppercuts.n uppers.n uprights.n uprisings.n uproars.n upsets.n upshots.n upstarts.n upsurges.n uptakes.n upturns.n urchins.n urinals.n urns.n usages.n users.n uses.n ushers.n usurpations.n usurpers.n utensils.n uteruses.n utilitarians.n utilities.n utmosts.n utopias.n utterances.n uttermosts.n vacancies.n vacationers.n vacations.n vaccinations.n vaccines.n vacillations.n vacuums.n vagabonds.n vagaries.n vaginas.n vagrants.n valedictions.n valences.n valentines.n vales.n valets.n valleys.n valuables.n valuations.n values.n valves.n vampires.n vamps.n vandals.n vanes.n vanguards.n vanities.n vans.n vantages.n vapours.n variables.n variants.n variations.n varieties.n varnishes.n vasectomies.n vases.n vassals.n vats.n vaulters.n vaults.n vectors.n vegetables.n vegetarians.n vehicles.n veils.n veins.n velocipedes.n velocities.n vendettas.n vendors.n veneers.n venerations.n ventilators.n ventricles.n ventriloquists.n vents.n ventures.n venues.n verandahs.n verandas.n verbs.n verdicts.n verges.n verifications.n verities.n vermilions.n vermouths.n vernaculars.n verses.n versions.n vertebrates.n verticals.n vesicles.n vessels.n vestibules.n vestiges.n vestments.n vestries.n vests.n veterans.n vetoes.n vetos.n vets.n viaducts.n vials.n vibraphones.n vibraslaps.n vibrations.n vibrators.n vibratos.n vicarages.n vicars.n viceroys.n vices.n vicinities.n vicissitudes.n victims.n victories.n victors.n victuals.n videocameras.n videocassettes.n videos.n videotapes.n vielles.n viewers.n viewfinders.n viewpoints.n vigilantes.n vigils.n vignettes.n vihuelas.n villagers.n villages.n villains.n villas.n vindications.n vinegars.n vines.n vineyards.n vintages.n violas.n violations.n violets.n violinists.n violins.n violoncellos.n violottas.n viols.n vipers.n virginals.n virgins.n virtues.n virtuosos.n viruses.n visages.n visas.n viscountcies.n viscountesses.n viscounts.n visionaries.n visions.n visitations.n visitors.n visits.n visors.n vistas.n vitamins.n vixens.n viziers.n vocabularies.n vocalists.n vocations.n vocatives.n vodkas.n vogues.n voices.n voids.n volcanos.n volleyballs.n volleys.n voltages.n volts.n volumes.n voluntaries.n volunteers.n vortexes.n voters.n vouchers.n vowels.n voyagers.n voyages.n voyeurs.n vulgarisms.n vulgarities.n vulnerabilities.n vultures.n vulvas.n wads.n wafers.n waffles.n wagers.n wages.n waggoners.n waggons.n wagons.n wags.n waifs.n wails.n waistbands.n waistcoats.n waistlines.n waists.n waiters.n waitresses.n waits.n waivers.n wakes.n walkers.n walkouts.n walkovers.n walks.n walkways.n wallabies.n wallets.n wallflowers.n wallops.n walls.n walnuts.n walruses.n waltzes.n wanderers.n wands.n wanks.n wantons.n warblers.n warbles.n wardens.n warders.n wardrobes.n wards.n warehouses.n wares.n warheads.n warhorses.n warlords.n warmers.n warmongers.n warpaths.n warps.n warrantees.n warranties.n warrants.n warrens.n warriors.n wars.n warships.n warthogs.n warts.n washbasins.n washboards.n washbowls.n washcloths.n washers.n washouts.n washrooms.n washstands.n washtubs.n wasps.n wassails.n wastebaskets.n wastebins.n wastelands.n wastes.n watchdogs.n watchers.n watches.n watchmakers.n watchtowers.n watchwords.n watercolours.n waterfalls.n waterfowls.n waterfronts.n watermarks.n watermelons.n watermills.n waterproofs.n waters.n watersheds.n watersides.n waterspouts.n watertables.n waterways.n waterworks.p watts.n wavelengths.n waves.n waxworks.n wayfarers.n waypoints.n waysides.n weaklings.n weaknesses.n weapons.n weasels.n weathercocks.n weavers.n weaves.n webs.n websites.n weddings.n wedges.n weedkillers.n weeds.n weekdays.n weekends.n weeklies.n weevils.n weights.n weirs.n welcomes.n welders.n welds.n wellingtons.n wells.n wellsprings.n welshers.n welterweights.n welts.n wenches.n westerners.n westerns.n whackings.n whacks.n whales.n wharfs.n wheelbarrows.n wheelchairs.n wheels.n wheelwrights.n whiffs.n whimpers.n whims.n whines.n whinnies.n whippersnappers.n whippets.n whippoorwills.n whips.n whirligigs.n whirlpools.n whirlwinds.n whiskers.n whiskeys.n whiskies.n whisks.n whispers.n whistles.n whites.n whiting.p whizzes.n whodunits.n wholes.n wholesalers.n whoppers.n whores.n wickets.n wicks.n widowers.n widows.n widths.n wiggles.n wigs.n wigwams.n wildebeests.n willows.n wills.n windbags.n windbreakers.n windfalls.n windmills.n windowpanes.n windows.n windowsills.n windpipes.n winds.n windscreens.n windshields.n wineglasses.n wines.n wings.n wingspans.n wingspreads.n winks.n winners.n wins.n winters.n wipers.n wipes.n wirelesses.n wires.n wiseacres.n wisecracks.n wishbones.n wishes.n wisps.n witches.n withdrawals.n witnesses.n wits.n witticisms.n wives.n wizards.n wolfhounds.n wolves.n womanizers.n wombats.n wombs.n wonderlands.n wonders.n woodcuts.n woodcutters.n woodlands.n woodpeckers.n woodpiles.n woods.n woodsheds.n woodwinds.n woofers.n woofs.n words.n workbenches.n workbooks.n workdays.n workers.n workforces.n workings.n workouts.n workplaces.n workrooms.n works.n workshops.n worlds.n wormholes.n worms.n worries.n worshippers.n wounds.n wrappers.n wraps.n wreaths.n wreckers.n wrecks.n wrenches.n wrens.n wrestlers.n wretches.n wrights.n wringers.n wrinkles.n wristbands.n wrists.n wristwatches.n writers.n writings.n writs.n wrongdoers.n wrongs.n xalams.n xylophones.n xylorimbas.n yachts.n yaks.n yams.n yanks.n yardarms.n yards.n yardsticks.n yarns.n yawns.n yearbooks.n yearlings.n yearnings.n yeas.n yells.n yeomanries.n yetis.n yews.n yields.n yobs.n yodellers.n yodels.n yoghourts.n yoghurts.n yogis.n yogurts.n yokels.n yokes.n yolks.n youngsters.n youths.n yuppies.n zealots.n zebras.n zeniths.n zephyrs.n zeppelins.n zeros.n zippers.n zips.n zithers.n zodiacs.n zombies.n zones.n zoologists.n zoos.n zuchinis.n link-grammar-4.7.4/data/en/words/words.v.2.30000644000175000017500000004336411526022265017423 0ustar bloombloomabdicated.v-d abided.v-d aborted.v-d abraded.v-d accelerated.v-d acclimated.v-d acclimateed.v-d acclimatized.v-d acculturated.v-d accumulated.v-d acidified.v-d adapted.v-d adjourned.v-d adjudicated.v-d adjusted.v-d advanced.v-d advertised.v-d aerosolized.v-d affiliated.v-d aged.v-d agglutinated.v-d aggregated.v-d agitateed.v-d aglomerated.v-d ailed.v-d aligned.v-d alimented.v-d alkalified.v-d allied.v-d altered.v-d alternated.v-d amalgamated.v-d Americanized.v-d anastomosed.v-d anchored.v-d anergized.v-d ankylosed.v-d anteverted.v-d apostrophized.v-d appealed.v-d applauded.v-d applicated.v-d applied.v-d approached.v-d approximated.v-d arbitrated.v-d arborized.v-d arched.v-d articulated.v-d arylated.v-d ascended.v-d assembled.v-d assimilated.v-d assisted.v-d associated.v-d attached.v-d attended.v-d auditioned.v-d augured.v-d autoactivated.v-d autocatalyzed.v-d autocorrelated.v-d autodigested.v-d autolyzed.v-d automatized.v-d autophosphorylated.v-d autosensitized.v-d autotransfused.v-d availed.v-d awakened.v-d axenized.v-d bagged.v-d banded.v-d banked.v-d bargained.v-d bartered.v-d bathed.v-d batted.v-d baulked.v-d benefited.v-d benefitted.v-d berthed.v-d bicompartmentalized.v-d bifurcated.v-d bioaccumulated.v-d biotested.v-d blabbed.v-d blackened.v-d blackleged.v-d blacklegged.v-d blanched.v-d blasphemed.v-d blasphemeed.v-d bleached.v-d blended.v-d blinked.v-d blistered.v-d bluffed.v-d blurred.v-d boggled.v-d bonded.v-d boned.v-d bootleged.v-d bootlegged.v-d boped.v-d bopped.v-d bordered.v-d borrowed.v-d botanized.v-d bottle-feeded.v-d bowdlerized.v-d breastfed.v-d bred.v-d brewed.v-d bridled.v-d bridleed.v-d broadcasted.v-d broadened.v-d broiled.v-d bronchodilated.v-d browned.v-d bruxed.v-d budged.v-d buffeted.v-d buggered.v-d bullied.v-d burglarized.v-d burgled.v-d burnished.v-d burrowed.v-d cabled.v-d calcified.v-d calcifiesed.v-d calcined.v-d cambered.v-d cancelled.v-d cancerized.v-d canvassed.v-d capitalized.v-d capsized.v-d carped.v-d catabolized.v-d catenated.v-d cationized.v-d celebrated.v-d centered.v-d centred.v-d chanted.v-d charred.v-d chelated.v-d circled.v-d circulated.v-d clanged.v-d clapped.v-d clasped.v-d clavelized.v-d cleaved.v-d clicked.v-d clinched.v-d clinked.v-d cloied.v-d clotted.v-d cloyed.v-d clutched.v-d coacervated.v-d coached.v-d coagglutinated.v-d coaggregated.v-d coagulated.v-d coamplified.v-d coarctated.v-d coarsened.v-d coaxed.v-d codistributed.v-d coextracted.v-d cofractionated.v-d cogitated.v-d coincubated.v-d coinjected.v-d coinsured.v-d collapsed.v-d collimated.v-d co-localised.v-d colocalised.v-d co-localized.v-d colocalized.v-d combined.v-d cometabolized.v-d commenced.v-d commingled.v-d communicated.v-d commuted.v-d compared.v-d compensated.v-d composed.v-d computed.v-d concentrated.v-d conceptualized.v-d condensed.v-d conducted.v-d confederated.v-d conferred.v-d confided.v-d congested.v-d conjoined.v-d conjugated.v-d consolidated.v-d constipated.v-d consulted.v-d contested.v-d contrasted.v-d contributed.v-d convened.v-d converted.v-d copartitioned.v-d coprecipitated.v-d copurified.v-d coregistered.v-d correlated.v-d corroded.v-d corrugated.v-d corrupted.v-d cosedimented.v-d costained.v-d costared.v-d co-starred.v-d couched.v-d counter-attacked.v-d counterattacked.v-d counterindicated.v-d countermined.v-d crashed.v-d crash-landed.v-d craved.v-d creased.v-d creosoted.v-d cribbed.v-d crinkled.v-d crisscrossed.v-d crocheted.v-d crooned.v-d cross-checked.v-d crosschecked.v-d cross_fertilized crosslinked.v-d cryosectioned.v-d crystallized.v-d cuddled.v-d cumulated.v-d curdled.v-d cursed.v-d curved.v-d dabbed.v-d damped.v-d dangled.v-d daped.v-d dapped.v-d darkened.v-d darned.v-d dated.v-d de-acidified.v-d deacidified.v-d de-adapted.v-d deadapted.v-d de-aggregated.v-d deaggregated.v-d de-alcoholized.v-d dealcoholized.v-d de-allergized.v-d deallergized.v-d debarked.v-d debated.v-d de-bonded.v-d debonded.v-d de-branched.v-d debranched.v-d decelerated.v-d de-cidualized.v-d decidualized.v-d de-clamped.v-d declamped.v-d decomposed.v-d de-condensed.v-d decondensed.v-d de-conditioned.v-d deconditioned.v-d de-congested.v-d decongested.v-d de-conjugated.v-d deconjugated.v-d de-constructed.v-d deconstructed.v-d decreased.v-d de-crepitated.v-d decrepitated.v-d de-differentiated.v-d dedifferentiated.v-d deepened.v-d de-epithelialized.v-d deepithelialized.v-d de-fibrinogenated.v-d defibrinogenated.v-d deflected.v-d de-fluorinated.v-d defluorinated.v-d de-gloved.v-d degloved.v-d de-glycosylated.v-d deglycosylated.v-d de-granulated.v-d degranulated.v-d de-humidified.v-d dehumidified.v-d de-iodinated.v-d deiodinated.v-d delayed.v-d delighted.v-d de-masculinized.v-d demasculinized.v-d democratized.v-d de-morphinized.v-d demorphinized.v-d de-naturated.v-d denaturated.v-d departmentalized.v-d de-phased.v-d dephased.v-d de-polarized.v-d depolarized.v-d de-polymerized.v-d depolymerized.v-d de-proteinized.v-d deproteinized.v-d de-quenched.v-d dequenched.v-d derailed.v-d derived.v-d derogated.v-d de-saturated.v-d desaturated.v-d descended.v-d de-squamated.v-d desquamated.v-d de-stabilized.v-d destabilized.v-d de-synchronized.v-d desynchronized.v-d detonated.v-d de-toxified.v-d detoxified.v-d developed.v-d de-vitrified.v-d devitrified.v-d dialyzed.v-d dichotomized.v-d dictated.v-d differentiated.v-d diffused.v-d digested.v-d digitalized.v-d digitilized.v-d dilated.v-d dimerized.v-d diminished.v-d dimmed.v-d dinned.v-d dipped.v-d disarmed.v-d disarticulated.v-d disbanded.v-d discased.v-d discharged.v-d discolored.v-d discontinued.v-d disengaged.v-d disentangled.v-d disincorporated.v-d disinflated.v-d disjoined.v-d dismounted.v-d dispensed.v-d dispersed.v-d dissimulated.v-d dissipated.v-d dissolved.v-d distended.v-d distilled.v-d distinguished.v-d disunited.v-d dive-bombed.v-d diversified.v-d diverticulized.v-d divined.v-d docked.v-d dodged.v-d dogmatized.v-d dorsalized.v-d dorsiflexed.v-d double-clicked.v-d downsized.v-d dreaded.v-d dribbled.v-d drilled.v-d dripped.v-d drooped.v-d dulled.v-d dynamized.v-d dysmyelinated.v-d echoed.v-d effluxed.v-d effused.v-d ejaculated.v-d ejected.v-d elaborated.v-d electrobloted.v-d electrocoagulated.v-d electrodialyzed.v-d electroejaculated.v-d electrofocused.v-d electrofocussed.v-d electrotyped.v-d elongated.v-d embolized.v-d embrittled.v-d embroidered.v-d emplaned.v-d encapsidated.v-d encysted.v-d ended.v-d endocytosed.v-d endothelialized.v-d endured.v-d engaged.v-d engorged.v-d enlisted.v-d enroled.v-d enrolled.v-d entered.v-d entertained.v-d entrenched.v-d enunciated.v-d epimerized.v-d epoxidated.v-d eroded.v-d escalated.v-d escaped.v-d esterized.v-d etched.v-d etiolated.v-d euhydrated.v-d evacuated.v-d evolved.v-d exaggerated.v-d excysted.v-d exercised.v-d exfoliated.v-d exhaled.v-d exogastrulated.v-d expanded.v-d expectorated.v-d exploded.v-d explored.v-d expounded.v-d expressed.v-d extemporized.v-d extended.v-d extrapolated.v-d extravasated.v-d exuviated.v-d famished.v-d farrowed.v-d fastened.v-d feasted.v-d federated.v-d fermented.v-d ferried.v-d fibrillated.v-d fiddled.v-d fielded.v-d filmed.v-d fissurated.v-d fistulized.v-d fitted.v-d fixated.v-d flagged.v-d flapped.v-d flashed.v-d fledged.v-d fled.v-d flexed.v-d flocced.v-d flocculated.v-d floced.v-d flossed.v-d fluidified.v-d fluorinated.v-d focalized.v-d focused.v-d focussed.v-d foliated.v-d footed.v-d force-landed.v-d foreclosed.v-d formed.v-d foundered.v-d foveated.v-d fractured.v-d frayed.v-d fronted.v-d frosted.v-d fructified.v-d fudged.v-d fuelled.v-d fulgurated.v-d fumbled.v-d furled.v-d fused.v-d gagged.v-d gained.v-d gambled.v-d gamed.v-d gammed.v-d ganted.v-d gargled.v-d gasified.v-d gasped.v-d gazumped.v-d gelatinized.v-d generalized.v-d germinated.v-d gestated.v-d gimped.v-d glanced.v-d globalized.v-d glossed.v-d glucoronized.v-d glucosylated.v-d gnashed.v-d gnawed.v-d governed.v-d granulated.v-d grasped.v-d grated.v-d grieved.v-d groaned.v-d groped.v-d grounded.v-d ground.v-d grouped.v-d growled.v-d grumbled.v-d grunted.v-d hailed.v-d haploidized.v-d hardened.v-d harmonized.v-d hatched.v-d heaved.v-d heckled.v-d hectored.v-d hedged.v-d heightened.v-d hemagglutinated.v-d hemmed.v-d hemoagglutinated.v-d hemocoagulated.v-d hemolyzed.v-d heterotransplanted.v-d hoarded.v-d hoed.v-d honked.v-d hooted.v-d howled.v-d hugged.v-d humidified.v-d hummed.v-d hushed.v-d hustled.v-d hybridized.v-d hydrated.v-d hydrolyzed.v-d hyperarticulated.v-d hypercoagulated.v-d hyperhydrated.v-d hyperinflated.v-d hypermodified.v-d hyperphosphorylated.v-d hyperpolarized.v-d hyperproliferated.v-d hypersensitized.v-d hyperventilated.v-d hypohydrated.v-d hypomethylated.v-d hyposecreted.v-d hypoventilated.v-d iced.v-d idled.v-d ignited.v-d immunomodulated.v-d immunoprecipitated.v-d imploded.v-d imprecated.v-d improved.v-d improvised.v-d incepted.v-d inclined.v-d incorporated.v-d increased.v-d incubated.v-d indented.v-d indulged.v-d indurated.v-d industrialized.v-d infibulated.v-d infolded.v-d infringed.v-d inhaled.v-d initiated.v-d inosculated.v-d insonated.v-d intensified.v-d interbred.v-d interconnected.v-d intercorrelated.v-d interlocked.v-d intermixed.v-d interned.v-d interpenetrated.v-d interpreted.v-d interrelated.v-d interrupted.v-d intersected.v-d intertwined.v-d interviewed.v-d intravasated.v-d intrigued.v-d intussuscepted.v-d invaginated.v-d invested.v-d investigated.v-d invigilated.v-d iodized.v-d ionized.v-d isografted.v-d isomerized.v-d jabbed.v-d jaged.v-d jangled.v-d jeered.v-d jigged.v-d jiggled.v-d jingled.v-d jolted.v-d jostled.v-d juggled.v-d keratinized.v-d kidded.v-d kindled.v-d knitted.v-d labilized.v-d labored.v-d laboured.v-d lactonized.v-d lamented.v-d landed.v-d latched.v-d lateralized.v-d launched.v-d lectured.v-d left-clicked.v-d lengthened.v-d lessened.v-d levitated.v-d liganded.v-d lighted.v-d liquefied.v-d liquidated.v-d litigated.v-d littered.v-d lobbied.v-d lobulated.v-d localised.v-d localized.v-d located.v-d lodged.v-d luminesced.v-d lunched.v-d luteinized.v-d lysed.v-d macerated.v-d mainlined.v-d maldigested.v-d malrotated.v-d maneuvered.v-d manoeuvred.v-d marbleized.v-d marinated.v-d massed.v-d masturbated.v-d mated.v-d medialized.v-d mediated.v-d melded.v-d meliorated.v-d mended.v-d merged.v-d meshed.v-d metallized.v-d metricized.v-d met.v-d micellized.v-d microembolized.v-d microencapsulated.v-d milled.v-d mimed.v-d mined.v-d misaligned.v-d misarticulated.v-d miscalculated.v-d miscarried.v-d miscounted.v-d misdealt.v-d misfolded.v-d misjudged.v-d misted.v-d mistimed.v-d misunderstanded.v-d misunderstood.v-d moaned.v-d mobilized.v-d moderated.v-d modernized.v-d moistened.v-d mooned.v-d mottled.v-d moulded.v-d moulted.v-d mounted.v-d mourned.v-d mowed.v-d muddled.v-d multimerized.v-d multiplicated.v-d multiplied.v-d mumbled.v-d munched.v-d murmured.v-d muscularized.v-d mutated.v-d myelinated.v-d narrowed.v-d navigated.v-d neared.v-d necrotized.v-d negotiated.v-d nephrectomized.v-d nibbled.v-d nipped.v-d nitrogenized.v-d nucleated.v-d nuzzled.v-d obeyed.v-d obsessed.v-d occluded.v-d ogled.v-d opacified.v-d operated.v-d opsonized.v-d orbited.v-d originated.v-d ossified.v-d outspaned.v-d outspanned.v-d overarched.v-d overbalanced.v-d overcalled.v-d overcharged.v-d overclouded.v-d overdressed.v-d overfeeded.v-d overfilled.v-d overflowed.v-d overheated.v-d over-indulged.v-d overindulged.v-d overlapped.v-d overproduced.v-d overproliferated.v-d overreached.v-d overreplicated.v-d oversecreted.v-d overspent.v-d overstretched.v-d overtrained.v-d overtranscribed.v-d overtrumped.v-d overturned.v-d overworked.v-d oviposited.v-d oxidated.v-d oxidized.v-d paced.v-d paddled.v-d paraded.v-d parked.v-d parsed.v-d parted.v-d particularized.v-d passivized.v-d pathergized.v-d pealed.v-d pecked.v-d peculated.v-d pedaled.v-d pedalled.v-d peddled.v-d pended.v-d penetrated.v-d peptonized.v-d perched.v-d performed.v-d peroxidized.v-d petitioned.v-d petrified.v-d phenolized.v-d phlebotomized.v-d photodegraded.v-d photodissociated.v-d photoisomerized.v-d photolyzed.v-d photooxidized.v-d photoreactivated.v-d picketed.v-d pillaged.v-d pinocytosed.v-d pioneered.v-d pitched.v-d placered.v-d plasticized.v-d plundered.v-d poached.v-d poised.v-d polled.v-d posed.v-d power-dived.v-d practised.v-d preached.v-d preactivated.v-d precontracted.v-d preincubated.v-d preplaned.v-d preplanned.v-d presurfaced.v-d pretested.v-d pringled.v-d privatized.v-d projected.v-d promenaded.v-d pronated.v-d propagated.v-d protonated.v-d prowled.v-d pseudonormalized.v-d puked.v-d punctured.v-d punted.v-d purled.v-d pustulated.v-d putted.v-d puzzled.v-d qualified.v-d quickened.v-d quietened.v-d raced.v-d racemized.v-d radiated.v-d radioed.v-d rallied.v-d ramified.v-d rancidified.v-d ranged.v-d ranked.v-d rapped.v-d rated.v-d rattled.v-d raveled.v-d ravelled.v-d reactivated.v-d reacylated.v-d readapted.v-d readjusted.v-d reannealed.v-d reapplied.v-d reared.v-d rearmed.v-d rearrested.v-d reassembled.v-d reawakened.v-d rebleeded.v-d rebreathed.v-d rebred.v-d rebreeded.v-d rebuilt.v-d recalculated.v-d recanted.v-d recapitulated.v-d recapped.v-d received.v-d recemented.v-d recharged.v-d reciprocated.v-d recolonized.v-d recommenced.v-d recomputed.v-d reconfirmed.v-d reconnected.v-d reconvened.v-d reconverted.v-d recovered.v-d recrossed.v-d recruited.v-d recrystallized.v-d recurved.v-d reddened.v-d redifferentiated.v-d redissolved.v-d redoubled.v-d reelevated.v-d reendothelialized.v-d reentered.v-d reepithelialized.v-d reequilibrated.v-d reeved.v-d reexpanded.v-d refed.v-d referred.v-d refited.v-d refitted.v-d reflated.v-d refloated.v-d refocused.v-d refocussed.v-d re-formed.v-d reformed.v-d refreezed.v-d refueled.v-d refuelled.v-d regenerated.v-d registered.v-d regrouped.v-d regrowed.v-d rehearsed.v-d rehydrated.v-d reincorporated.v-d reincubated.v-d reinduced.v-d reinflated.v-d reinfused.v-d reinvested.v-d reinvestigated.v-d reirradiated.v-d rekindled.v-d related.v-d relaxed.v-d relocated.v-d remarried.v-d remeasured.v-d remineralized.v-d remitted.v-d remobilized.v-d remounted.v-d renegotiated.v-d reoccluded.v-d re-opened.v-d reopened.v-d reoperated.v-d reordered.v-d reorganized.v-d reoxidized.v-d repacked.v-d repaired.v-d rephosphorylated.v-d repolarized.v-d reprised.v-d reprobed.v-d reproduced.v-d reseeded.v-d resensitized.v-d resettled.v-d resigned.v-d respirated.v-d restarted.v-d restituted.v-d resumed.v-d resuscitated.v-d retailed.v-d retested.v-d rethrombosed.v-d retired.v-d retooled.v-d retrotransposed.v-d retruded.v-d returned.v-d reunified.v-d reunited.v-d reventilated.v-d reversed.v-d revived.v-d rhymed.v-d ricocheted.v-d right-clicked.v-d rigidified.v-d ringed.v-d roamed.v-d roared.v-d roasted.v-d rotated.v-d roused.v-d rowed.v-d ruffled.v-d ruptured.v-d rustled.v-d sacrificed.v-d saluted.v-d saponified.v-d scanned.v-d scattered.v-d scissored.v-d sclerosed.v-d scoffed.v-d scolded.v-d scored.v-d scrambled.v-d scrawled.v-d scribbled.v-d scrubbed.v-d sculled.v-d sculptured.v-d searched.v-d seized.v-d senesced.v-d separated.v-d serrated.v-d severed.v-d shaded.v-d shamed.v-d shammed.v-d shattered.v-d shelled.v-d shop-lifted.v-d shoplifted.v-d short-circuited.v-d shortened.v-d shoved.v-d showered.v-d shrieked.v-d shuffled.v-d sifted.v-d singed.v-d sinusoidalized.v-d sipped.v-d skeletonized.v-d skewed.v-d slammed.v-d slanted.v-d sledged.v-d slenderized.v-d sloshed.v-d smacked.v-d smeared.v-d smoked.v-d smudged.v-d snarled.v-d snipped.v-d snorted.v-d snuggled.v-d socialized.v-d solidified.v-d somatized.v-d sowed.v-d spalted.v-d spattered.v-d spawned.v-d spied.v-d spiralized.v-d splashed.v-d splayed.v-d splintered.v-d spoiled.v-d sponged.v-d sported.v-d spouted.v-d spreadeagled.v-d spring-cleaned.v-d squashed.v-d stabilised.v-d stabilized.v-d stained.v-d stalled.v-d stammered.v-d stampeded.v-d steadied.v-d steeped.v-d steepened.v-d steered.v-d stewed.v-d stifled.v-d stinted.v-d stippled.v-d stonewalled.v-d strained.v-d stratified.v-d streaked.v-d strengthened.v-d strobed.v-d strummed.v-d stumped.v-d stung.v-d subcontracted.v-d subdivided.v-d subducted.v-d subleased.v-d subleted.v-d submerged.v-d submitted.v-d substituted.v-d succeeded.v-d sued.v-d suffered.v-d suffocated.v-d summated.v-d superheated.v-d superinfected.v-d superovulated.v-d supervised.v-d supinated.v-d supplicated.v-d surrendered.v-d survived.v-d swallowed.v-d swapped.v-d swayed.v-d sweated.v-d swished.v-d swiveled.v-d swivelled.v-d synchronized.v-d synergized.v-d tackled.v-d tanned.v-d tapped.v-d tarnished.v-d tautomerized.v-d telephoned.v-d terminated.v-d tetramerized.v-d thawed.v-d thermalized.v-d thieved.v-d thrashed.v-d threshed.v-d thrilled.v-d thrombosed.v-d thronged.v-d throttled.v-d thrumed.v-d thrummed.v-d thumped.v-d thundered.v-d tickled.v-d tilted.v-d tined.v-d tinged.v-d titivated.v-d titrated.v-d toasted.v-d tooted.v-d traced.v-d traded.v-d transaminated.v-d transcomplemented.v-d transcytosed.v-d transferred.v-d transgressed.v-d translated.v-d transplanted.v-d trawled.v-d treated.v-d trebled.v-d triaged.v-d trimerized.v-d trotted.v-d troubleshooted.v-d trumped.v-d trumpeted.v-d tuberculized.v-d tugged.v-d tumed.v-d tummed.v-d twanged.v-d twirled.v-d ulcerated.v-d umpired.v-d unbended.v-d uncoated.v-d uncoiled.v-d uncurled.v-d undercorrected.v-d underfeeded.v-d underprescribed.v-d underreported.v-d underspent.v-d undressed.v-d unfastened.v-d unfolded.v-d unhitched.v-d unified.v-d unionized.v-d united.v-d unknoted.v-d unloaded.v-d unlocked.v-d unpacked.v-d unraveled.v-d unrolled.v-d unscrewed.v-d unstressed.v-d untied.v-d untwisted.v-d unwound.v-d unwrapped.v-d uploaded.v-d urbanized.v-d vaporized.v-d varicellized.v-d varied.v-d vasodilated.v-d ventured.v-d versified.v-d verted.v-d vesicated.v-d vesiculated.v-d vested.v-d vibrated.v-d visited.v-d vitrified.v-d vituperated.v-d vociferated.v-d volatilized.v-d volleyed.v-d vomited.v-d waded.v-d wagged.v-d waggled.v-d wailed.v-d wakened.v-d warped.v-d watered.v-d waxed.v-d weakened.v-d wedded.v-d welded.v-d whealed.v-d wheeled.v-d whined.v-d whirled.v-d whistled.v-d whitened.v-d whittled.v-d whorled.v-d widened.v-d wiggled.v-d worsened.v-d worshiped.v-d worshipped.v-d wrestled.v-d wrinkled.v-d yelled.v-d yielded.v-d yodelled.v-d link-grammar-4.7.4/data/en/words/words.n.30000644000175000017500000022635111526022265017252 0ustar bloombloomanaesthetic.n-u anesthetic.n-u abandonment.n-u abandon.n-u abasement.n-u abdication.n-u aberration.n-u abeyance.n-u abhorrence.n-u abnegation.n-u abnormality.n-u abolition.n-u abortion.n-u abrasive.n-u abridgement.n-u abridgment.n-u abrogation.n-u abruptness.n-u abscess.n-u absenteeism.n-u absinthe.n-u absolution.n-u absolutism.n-u absorption.n-u abstention.n-u abstinence.n-u abstraction.n-u absurdity.n-u abundance.n-u abuse.n-u academia.n-u acceleration.n-u accentuation.n-u acceptability.n-u acceptance.n-u accessibility.n-u accession.n-u access.n-u acclaim.n-u acclamation.n-u acclimatization.n-u accommodation.n-u accomplishment.n-u accordance.n-u accordion.n-u accord.n-u accountability.n-u accountancy.n-u accretion.n-u accumulation.n-u accuracy.n-u acetylene.n-u acidity.n-u acid.n-u acne.n-u acquaintance.n-u acquisition.n-u acquittal.n-u acreage.n-u acrimony.n-u acrylic.n-u action.n-u activation.n-u activism.n-u activity.n-u actuality.n-u acuity.n-u acumen.n-u acupuncture.n-u acuteness.n-u adaptability.n-u adaptation.n-u addiction.n-u addition.n-u adequacy.n-u adhesion.n-u adhesive.n-u adjudication.n-u adjustment.n-u administration.n-u admiration.n-u admissibility.n-u admission.n-u admittance.n-u adobe.n-u adobo.n-u adolescence.n-u ado.n-u adoption.n-u adoration.n-u adornment.n-u adrenaline.n-u adrenalin.n-u adroitness.n-u adulation.n-u adulteration.n-u adultery.n-u adulthood.n-u advancement.n-u advantage.n-u adventure.n-u adversity.n-u advertisement.n-u advertising.n-u advice.n-u advisability.n-u advisement.n-u advocacy.n-u aerosol.n-u aerospace.n-u affability.n-u affectation.n-u affection.n-u affiliation.n-u affinity.n-u affirmation.n-u affluence.n-u Afghan.n-u African.n-u aftercare.n-u aftermath.n-u afternoon.n-u agar.n-u ageing.n-u age.n-u agglomeration.n-u aggravation.n-u aggregation.n-u aggression.n-u aggressiveness.n-u aggro.n-u agidigbo.n-u agility.n-u agitation.n-u ag.n-u agnosticism.n-u agony.n-u agoraphobia.n-u agreement.n-u agribusiness.n-u agriculture.n-u agronomy.n-u aid.n-u aim.n-u aircraft.n-u airmail.n-u air.n-u alabaster.n-u alacrity.n-u alarm.n-u Albanian.n-u Alberian.n-u albumen.n-u alchemy.n-u alcoholism.n-u alcohol.n-u ale.n-u alertness.n-u alfalfa.n-u algebra.n-u Algerian.n-u alienation.n-u alignment.n-u alimony.n-u alizarin.n-u alkali.n-u allegiance.n-u alleviation.n-u alliance.n-u alliteration.n-u allocation.n-u allotment.n-u alloy.n-u allspice.n-u allure.n-u almond.n-u aloofness.n-u alpha.n-u alphorn.n-u alteration.n-u alternation.n-u altitude.n-u alto.n-u altruism.n-u aluminium.n-u aluminum.n-u alum.n-u amalgamation.n-u amaranth.n-u amateurism.n-u amazement.n-u amber.n-u ambiguity.n-u ambivalence.n-u ambrosia.n-u ambush.n-u amelioration.n-u amendment.n-u American.n-u amethyst.n-u amiability.n-u amicability.n-u amity.n-u ammonia.n-u ammunition.n-u amnesia.n-u amortization.n-u amphetamine.n-u amplification.n-u amplitude.n-u amputation.n-u amusement.n-u anaemia.n-u anaesthesia.n-u analgesia.n-u analogy.n-u analysis.n-u anarchism.n-u anarchy.n-u anathema.n-u anatomy.n-u Andorran.n-u Angentinian.n-u anger.n-u angina.n-u Angolan.n-u angora.n-u angst.n-u anguish.n-u animation.n-u anime.n-u animism.n-u animosity.n-u animus.n-u aniseed.n-u anisette.n-u annexation.n-u annihilation.n-u annotation.n-u annoyance.n-u annulment.n-u anonymity.n-u antagonism.n-u antecedence.n-u anthracite.n-u anthrax.n-u anthropology.n-u anticipation.n-u antifreeze.n-u Antiguan.n-u antimony.n-u antipathy.n-u antiquity.n-u anxiety.n-u apartheid.n-u apathy.n-u aphasia.n-u aphrodisiac.n-u aplomb.n-u apoplexy.n-u apostasy.n-u apparel.n-u appeal.n-u appeasement.n-u appendicitis.n-u appetite.n-u applause.n-u apple.n-u applicability.n-u application.n-u applique.n-u appointment.n-u apportionment.n-u apposition.n-u appreciation.n-u apprehension.n-u approbation.n-u appropriation.n-u approval.n-u approximation.n-u apricot.n-u aptitude.n-u aptness.n-u aquamarine.n-u aqua.n-u Arab.n-u arbitration.n-u archaeology.n-u archeology.n-u archery.n-u architecture.n-u archlute.n-u ardor.n-u ardour.n-u area.n-u argon.n-u argot.n-u argumentation.n-u aridity.n-u aristocracy.n-u arithmetic.n-u armament.n-u Armenian.n-u armor.n-u armour.n-u arpeggione.n-u arrangement.n-u arrest.n-u arrogance.n-u arroz_blanco arroz_con_pollo arroz.n-u arsenic.n-u arson.n-u arteriosclerosis.n-u arthritis.n-u artichoke.n-u articulation.n-u artifice.n-u artillery.n-u artistry.n-u art.n-u artwork.n-u asbestos.n-u ascendancy.n-u ascendency.n-u asceticism.n-u Aserbaijani.n-u asexuality.n-u ash.n-u Asian.n-u asparagus.n-u asperity.n-u asphalt.n-u asphyxia.n-u asphyxiation.n-u aspic.n-u aspiration.n-u aspirin.n-u assassination.n-u assault.n-u assemblage.n-u assessment.n-u assimilation.n-u assistance.n-u assonance.n-u asteroid.n-u asthma.n-u astigmatism.n-u astonishment.n-u astringency.n-u astrology.n-u astronomy.n-u astuteness.n-u asylum.n-u asymmetry.n-u atavism.n-u atheism.n-u atonality.n-u atonement.n-u atrophy.n-u attachment.n-u attack.n-u attainment.n-u attendance.n-u attention.n-u attentiveness.n-u attenuation.n-u attire.n-u attitude.n-u attribution.n-u attrition.n-u auction.n-u audacity.n-u audibility.n-u audition.n-u aught.n-u augmentation.n-u austerity.n-u Australian.n-u Austrian.n-u autarchy.n-u autarky.n-u authentication.n-u authenticity.n-u authoritarianism.n-u authority.n-u authorization.n-u authorship.n-u autism.n-u autobiography.n-u autocracy.n-u automation.n-u autonomy.n-u autumn.n-u availability.n-u avail.n-u avarice.n-u aversion.n-u aviation.n-u avocado.n-u avoidance.n-u avowal.n-u awe.n-u awkwardness.n-u azure.n-u baba_ganoush baba_ghanoush babble.n-u backbone.n-u backgammon.n-u backing.n-u backlash.n-u backstroke.n-u backtalk.n-u backwash.n-u bacon.n-u bacteriology.n-u badinage.n-u badminton.n-u badness.n-u bagel.n-u baggage.n-u bagpipe.n-u Bahamian.n-u bail.n-u bait.n-u balance.n-u balderdash.n-u baldness.n-u ballast.n-u ballet.n-u ball.n-u ballyhoo.n-u balm.n-u baloney.n-u balsam.n-u balsa.n-u bamboo.n-u banality.n-u banana.n-u banditry.n-u bandoneón.n-u bandura.n-u bane.n-u Bangladeshi.n-u banishment.n-u banjo.n-u bankholding.n-u banking.n-u bankruptcy.n-u banter.n-u baptism.n-u barbacoa.n-u Barbadian.n-u barbarity.n-u barbiturate.n-u barf.n-u baritone.n-u barium.n-u barleycorn.n-u barley.n-u barrenness.n-u barstar.n-u barter.n-u baryton.n-u basalt.n-u baseball.n-u basil.n-u basketball.n-u basketry.n-u bas-relief.n-u bassoon.n-u basso.n-u bass.n-u bathos.n-u batter.n-u battery.n-u batting.n-u battle.n-u bauxite.n-u bawdy.n-u bawu.n-u bayan.n-u bazooka.n-u beachwear.n-u beatification.n-u beauty.n-u beaver.n-u bedding.n-u bedlam.n-u beech.n-u beef.n-u beer.n-u beeswax.n-u beet.n-u beggary.n-u begging.n-u behalf.n-u behavior.n-u behaviourism.n-u behaviour.n-u beige.n-u Belarusian.n-u Belgian.n-u Belizian.n-u belligerency.n-u beneficence.n-u benevolence.n-u Beninese.n-u benzene.n-u benzine.n-u benzol.n-u bequest.n-u bereavement.n-u beryl.n-u bestiality.n-u bestowal.n-u beta.n-u betrayal.n-u betterment.n-u bewilderment.n-u bezique.n-u Bhutanian.n-u bias.n-u bibliography.n-u bicarbonate.n-u bidding.n-u bifurcation.n-u bigamy.n-u bigotry.n-u bikini.n-u bilateralism.n-u bile.n-u bilge.n-u billing.n-u binary.n-u bingo.n-u biochemistry.n-u biology.n-u biotechnology.n-u birch.n-u birdseed.n-u birth.n-u biscuit.n-u bisection.n-u bisexuality.n-u bismuth.n-u bistre.n-u bitterness.n-u bitumen.n-u biz.n-u blackmail.n-u blackness.n-u blame.n-u blancmange.n-u blandness.n-u blare.n-u blasphemy.n-u blather.n-u bleach.n-u bleeding.n-u blight.n-u blindness.n-u bliss.n-u blitzkrieg.n-u bloodlust.n-u blood.n-u bloodshed.n-u bloodthirstiness.n-u bloom.n-u blossom.n-u blubber.n-u blueberry.n-u bluff.n-u bluntness.n-u bluster.n-u board.n-u boarding.n-u bodywork.n-u boldness.n-u Bolivian.n-u bombarde.n-u bombardment.n-u bombast.n-u bondage.n-u bond.n-u bonhomie.n-u boogie.n-u bookkeeping.n-u boo.n-u booty.n-u booze.n-u borax.n-u bordonua.n-u boredom.n-u boron.n-u borrowing.n-u Bosnian.n-u botany.n-u bother.n-u botulism.n-u bouillon.n-u bounce.n-u bounty.n-u bourbon.n-u bouzouki.n-u bovril.n-u bowing.n-u bowling.n-u boyhood.n-u bracken.n-u braille.n-u brain.n-u bramble.n-u brandy.n-u bran.n-u brass.n-u bravado.n-u bravery.n-u brawn.n-u Brazilian.n-u bread.n-u breadth.n-u breakdown.n-u breakfast.n-u breaststroke.n-u breathing.n-u breath.n-u brevity.n-u briar.n-u bribery.n-u bric-a-brac.n-u brick.n-u brickwork.n-u brightness.n-u brilliance.n-u brimstone.n-u brine.n-u brinkmanship.n-u brisket.n-u British.n-u brocade.n-u broccoli.n-u bromide.n-u bromine.n-u bronchitis.n-u bronze.n-u brotherhood.n-u broth.n-u brownstone.n-u brunch.n-u Bruneian.n-u brush.n-u brushwork.n-u brutality.n-u bubbly.n-u buckshot.n-u buckskin.n-u buckwheat.n-u budget.n-u buffoonery.n-u buff.n-u buggery.n-u bugle.n-u Bulgarian.n-u bullion.n-u bull.n-u bullroarer.n-u bullshit.n-u bum.n-u bunk.n-u bunkum.n-u bun.n-u buoyancy.n-u burden.n-u bureaucracy.n-u burglary.n-u burgundy.n-u burial.n-u burlap.n-u burlesque.n-u burrito.n-u Burundian.n-u bush.n-u business.n-u bustle.n-u butane.n-u butchery.n-u butterfat.n-u buttermilk.n-u butter.n-u butterscotch.n-u cabbage.n-u cable.n-u cachet.n-u cactus.n-u cadmium.n-u caffeine.n-u cajolery.n-u cake.n-u calcium.n-u calculation.n-u calculus.n-u calibration.n-u calibre.n-u calico.n-u calligraphy.n-u calliope.n-u callousness.n-u calm.n-u calmness.n-u calumny.n-u camaraderie.n-u Cambodian.n-u Cameroonian.n-u camomile.n-u camouflage.n-u camping.n-u campus.n-u Canadian.n-u cancellation.n-u cancer.n-u candlelight.n-u candor.n-u candour.n-u candy.n-u cane.n-u canker.n-u cannabis.n-u cannibalism.n-u canonization.n-u cantaloupe.n-u cant.n-u Cantonese.n-u canvas.n-u capability.n-u capitalism.n-u capitalization.n-u capital.n-u capitulation.n-u cappuccino.n-u captivity.n-u capture.n-u caramel.n-u carbohydrate.n-u carbonization.n-u carbon.n-u carcinoma.n-u cardamom.n-u cardboard.n-u card.n-u careerism.n-u carefulness.n-u carelessness.n-u care.n-u cargo.n-u caricature.n-u carillon.n-u carmine.n-u carnage.n-u carne_asada carne_gisada carne_guisada carne.n-u carnitas.n-u carpentry.n-u carrion.n-u carrot.n-u carsickness.n-u cartage.n-u cartilage.n-u cartography.n-u casework.n-u cashmere.n-u cash.n-u castanets.n-u caste.n-u castigation.n-u castration.n-u castrato.n-u catarrh.n-u catastrophe.n-u catchup.n-u catechism.n-u catgut.n-u catholicity.n-u catsup.n-u cattle.n-u cauliflower.n-u causality.n-u causation.n-u caution.n-u caviar.n-u cayenne.n-u CD.n-u cedar.n-u celadon.n-u celebration.n-u celebrity.n-u celerity.n-u celery.n-u celesta.n-u celibacy.n-u cello.n-u cellophane.n-u celluloid.n-u cellulose.n-u cement.n-u censure.n-u centralization.n-u centrex.n-u ceramic.n-u cereal.n-u ceremonial.n-u ceremony.n-u cerise.n-u certainty.n-u certification.n-u certitude.n-u cerulean.n-u cessation.n-u chaff.n-u chagrin.n-u chain.n-u chairmanship.n-u chalk.n-u chalumeau.n-u champagne.n-u championship.n-u change.n-u chaos.n-u characterization.n-u character.n-u charcoal.n-u charge.n-u charisma.n-u charity.n-u charm.n-u chartreuse.n-u chastisement.n-u chastity.n-u château.n-u chattel.n-u chatter.n-u chauvinism.n-u cheapness.n-u cheek.n-u cheerfulness.n-u cheesecake.n-u cheesecloth.n-u cheese.n-u chemistry.n-u chemotherapy.n-u chess.n-u chestnut.n-u chiaroscuro.n-u chicanery.n-u chickenfeed.n-u chicken.n-u chickenpox.n-u chic.n-u chicory.n-u chiffon.n-u childbirth.n-u childhood.n-u Chilean.n-u chile_con_carne chile_con_queso chili_con_carne chili_con_queso chili.n-u china.n-u chinaware.n-u Chinese.n-u chintz.n-u chi.n-u chiropody.n-u chitarra.n-u chivalry.n-u chive.n-u chloride.n-u chlorination.n-u chlorine.n-u chloroform.n-u chlorophyll.n-u chocolate.n-u choice.n-u cholera.n-u cholesterol.n-u choreography.n-u chorizo.n-u chowder.n-u chow.n-u chrome.n-u chromium.n-u chronology.n-u church.n-u chutney.n-u cider.n-u cimbalom.n-u cinematography.n-u cinnabar.n-u cinnamon.n-u circularity.n-u circulation.n-u circumcision.n-u circumlocution.n-u circumnavigation.n-u circumspection.n-u circumvention.n-u cirrhosis.n-u citation.n-u citizenship.n-u citrus.n-u cittern.n-u civility.n-u civilization.n-u clairvoyance.n-u clamour.n-u claptrap.n-u claret.n-u clarification.n-u clarinet.n-u clarity.n-u classicism.n-u classification.n-u class.n-u claustrophobia.n-u claves.n-u clavichord.n-u clavinet.n-u clay.n-u cleaner.n-u cleanliness.n-u cleanser.n-u clearance.n-u clemency.n-u cleverness.n-u climatology.n-u clockwork.n-u closeness.n-u closure.n-u clothing.n-u cloth.n-u clout.n-u clover.n-u clumsiness.n-u clutter.n-u coagulation.n-u coalescence.n-u coal.n-u cobalt.n-u cocaine.n-u cockfighting.n-u cocoa.n-u coconut.n-u codeine.n-u code.n-u cod.n-u coeducation.n-u coercion.n-u coexistence.n-u coffee.n-u cogency.n-u cogeneration.n-u cogitation.n-u cognac.n-u cognition.n-u cognizance.n-u cohabitation.n-u coherence.n-u cohesion.n-u coinage.n-u coincidence.n-u coin.n-u coitus.n-u coke.n-u cola.n-u coldness.n-u cold.n-u coleslaw.n-u colic.n-u colitis.n-u collaboration.n-u collage.n-u collateral.n-u collation.n-u collectivization.n-u college.n-u collision.n-u colloquy.n-u collusion.n-u Colombian.n-u colonialism.n-u colonization.n-u coloratura.n-u color.n-u colouring.n-u colour.n-u combat.n-u comb.n-u combustion.n-u comedy.n-u comeliness.n-u comfort.n-u commemoration.n-u commendation.n-u commentary.n-u commerce.n-u commercialism.n-u commiseration.n-u commission.n-u commotion.n-u communication.n-u communion.n-u communism.n-u commutation.n-u compactness.n-u companionship.n-u company.n-u comparability.n-u comparison.n-u compassion.n-u compatibility.n-u compensation.n-u competence.n-u competition.n-u competitiveness.n-u compilation.n-u complacence.n-u complacency.n-u completeness.n-u completion.n-u complexity.n-u compliance.n-u complicity.n-u composition.n-u compost.n-u composure.n-u compote.n-u compound.n-u comprehensibility.n-u comprehension.n-u comprehensiveness.n-u compression.n-u compromise.n-u compulsion.n-u computation.n-u concatenation.n-u concavity.n-u concealment.n-u conceit.n-u concentrate.n-u concentration.n-u conception.n-u concertina.n-u conch.n-u conciliation.n-u conciseness.n-u concordance.n-u concord.n-u concrete.n-u concurrence.n-u concussion.n-u condemnation.n-u condensation.n-u condescension.n-u condiment.n-u conditioner.n-u condolence.n-u conduction.n-u conductivity.n-u conduct.n-u confectionery.n-u confection.n-u confederation.n-u conferment.n-u confession.n-u confidence.n-u confidentiality.n-u confinement.n-u confirmation.n-u confiscation.n-u conflict.n-u conformity.n-u confrontation.n-u confusion.n-u conga.n-u congestion.n-u Congolese.n-u congregation.n-u conjecture.n-u conjugation.n-u conjunction.n-u connexion.n-u connivance.n-u consanguinity.n-u conscientiousness.n-u consciousness.n-u conscription.n-u consecration.n-u consent.n-u conservation.n-u conservatism.n-u consideration.n-u consistency.n-u consolation.n-u consolidation.n-u consomme.n-u consonance.n-u consortium.n-u constancy.n-u consternation.n-u constipation.n-u constitutionality.n-u constraint.n-u constriction.n-u construction.n-u consultation.n-u consummation.n-u consumption.n-u contact.n-u contagion.n-u containment.n-u contamination.n-u contemplation.n-u contempt.n-u contentment.n-u content.n-u context.n-u contiguity.n-u continence.n-u contingency.n-u continuation.n-u continuity.n-u contraband.n-u contrabassoon.n-u contraception.n-u contraction.n-u contradiction.n-u contradistinction.n-u contralto.n-u contrary.n-u contrast.n-u contravention.n-u contrition.n-u control.n-u controversy.n-u convalescence.n-u convection.n-u convenience.n-u convergence.n-u conversation.n-u conversion.n-u convertibility.n-u convexity.n-u conveyance.n-u convocation.n-u cookery.n-u cooking.n-u cookware.n-u coolant.n-u coolness.n-u co-operation.n-u cooperation.n-u co-ordination.n-u coordination.n-u copper.n-u copra.n-u copulation.n-u copyright.n-u coral.n-u cordiality.n-u cordial.n-u cord.n-u corduroy.n-u cork.n-u cornet.n-u cornett.n-u cornflour.n-u corn.n-u cornstarch.n-u coronation.n-u corpulence.n-u correction.n-u correctness.n-u correspondence.n-u corroboration.n-u corrosion.n-u corruption.n-u Corsican.n-u cortisone.n-u cosmology.n-u cost.n-u costume.n-u cotton.n-u council.n-u counseling.n-u counsel.n-u countenance.n-u counteraction.n-u counterespionage.n-u counterintelligence.n-u counterpoint.n-u countertenor.n-u courage.n-u courtesy.n-u court.n-u courtship.n-u coverage.n-u covetousness.n-u cowardice.n-u cowbell.n-u cowboy.n-u cowhide.n-u cowpox.n-u coyness.n-u crab.n-u crackle.n-u craft.n-u craftsmanship.n-u crap.n-u craziness.n-u cream.n-u creation.n-u credence.n-u credibility.n-u credit.n-u credulity.n-u creep.n-u cremation.n-u crepe.n-u cricket.n-u crime.n-u criminology.n-u crimson.n-u crinoline.n-u crisis.n-u crispness.n-u criticism.n-u Croatian.n-u Croat.n-u crochet.n-u crockery.n-u cromorne.n-u croquet.n-u crossfire.n-u crosstalk.n-u crow.n-u crucifixion.n-u crude.n-u crudity.n-u cruelty.n-u crumhorn.n-u crumpet.n-u crust.n-u crwth.n-u crystallization.n-u crystallography.n-u crystallophone.n-u crystal.n-u cuatro.n-u Cuban.n-u cubism.n-u cucumber.n-u cuisine.n-u culpability.n-u cultivation.n-u culture.n-u cunning.n-u cuprophone.n-u curd.n-u cure-all.n-u cure.n-u curiosity.n-u curling.n-u currency.n-u curry.n-u curtailment.n-u curvature.n-u custard.n-u custody.n-u custom.n-u cutlass.n-u cutlery.n-u cuttlefish.n-u cyanide.n-u cyan.n-u cymbal.n-u cymbalum.n-u cynicism.n-u Cypriote.n-u Czech.n-u dalliance.n-u damage.n-u damask.n-u damnation.n-u dampness.n-u damselfish.n-u dance.n-u dancing.n-u dandruff.n-u Danish.n-u daring.n-u darkness.n-u dash.n-u data.n-u dative.n-u dawn.n-u daybreak.n-u daylight.n-u dayspring.n-u dazzle.n-u deadlock.n-u deafness.n-u dearth.n-u death.n-u debarkation.n-u debasement.n-u debate.n-u debauchery.n-u debenture.n-u debility.n-u debris.n-u debt.n-u decadence.n-u decapitation.n-u decay.n-u deceit.n-u decency.n-u decentralization.n-u deception.n-u decimalization.n-u declamation.n-u declassification.n-u declension.n-u decolonization.n-u decomposition.n-u decompression.n-u decontamination.n-u decoration.n-u decorum.n-u decrease.n-u decrepitude.n-u dedication.n-u deductibility.n-u deduction.n-u deerskin.n-u defacement.n-u defamation.n-u default.n-u defeatism.n-u defeat.n-u defecation.n-u defection.n-u defence.n-u defense.n-u deference.n-u deferment.n-u defiance.n-u deficiency.n-u defilement.n-u definition.n-u deflation.n-u deflection.n-u defoliation.n-u deformity.n-u deftness.n-u degeneration.n-u degradation.n-u deification.n-u deism.n-u dejection.n-u delay.n-u delectation.n-u delegation.n-u deletion.n-u deliberation.n-u delicacy.n-u delight.n-u delimitation.n-u delineation.n-u delinquency.n-u delirium.n-u deliverance.n-u delivery.n-u delta.n-u delusion.n-u demagnetization.n-u demagogy.n-u demand.n-u demarcation.n-u demeanour.n-u dementia.n-u demerara.n-u demise.n-u demobilization.n-u democracy.n-u democratization.n-u demography.n-u demolition.n-u demoralization.n-u demotion.n-u denationalization.n-u denial.n-u denigration.n-u denim.n-u density.n-u dentistry.n-u denunciation.n-u dependence.n-u dependency.n-u depiction.n-u depletion.n-u deployment.n-u depopulation.n-u deportation.n-u deportment.n-u deposit.n-u deposition.n-u depravity.n-u deprecation.n-u depreciation.n-u depredation.n-u depression.n-u deprival.n-u deprivation.n-u depth.n-u derailment.n-u deregulation.n-u dereliction.n-u derision.n-u derivation.n-u dermatology.n-u derogation.n-u desalination.n-u desalinization.n-u descent.n-u desecration.n-u desegregation.n-u desensitization.n-u desertion.n-u desert.n-u deshabille.n-u designation.n-u design.n-u desirability.n-u desolation.n-u despair.n-u despatch.n-u desperation.n-u despondency.n-u despotism.n-u dessert.n-u destabilization.n-u destiny.n-u destitution.n-u destruction.n-u detachment.n-u detail.n-u detection.n-u detente.n-u detention.n-u detergent.n-u deterioration.n-u deterrent.n-u detestation.n-u detriment.n-u detritus.n-u devaluation.n-u devastation.n-u development.n-u deviation.n-u devolution.n-u devotion.n-u dew.n-u dexterity.n-u dextrose.n-u dholak.n-u diabetes.n-u diagnosis.n-u dialect.n-u dialogue.n-u diamond.n-u diarrhea.n-u diarrhoea.n-u dictation.n-u dictatorship.n-u diction.n-u didgeridoo.n-u diesel.n-u differentiation.n-u difficulty.n-u diffidence.n-u diffusion.n-u digestion.n-u dignity.n-u dilapidation.n-u dilation.n-u diligence.n-u dill.n-u dilution.n-u diminution.n-u din.n-u dinner.n-u dint.n-u dioxide.n-u diphtheria.n-u diplomacy.n-u dip.n-u dipsomania.n-u direction.n-u directness.n-u dirt.n-u disability.n-u disablement.n-u disadvantage.n-u disaffection.n-u disagreeableness.n-u disagreement.n-u disappointment.n-u disapproval.n-u disarmament.n-u disarray.n-u disaster.n-u disavowal.n-u disbandment.n-u disbelief.n-u disbursement.n-u discernment.n-u discharge.n-u discipline.n-u discomfiture.n-u discomfort.n-u discontent.n-u discontinuity.n-u discord.n-u discouragement.n-u discourse.n-u discourtesy.n-u discredit.n-u discrepancy.n-u discreteness.n-u discretion.n-u discrimination.n-u discussion.n-u disdain.n-u disease.n-u disembarkation.n-u disenchantment.n-u disengagement.n-u disentanglement.n-u disequilibrium.n-u disestablishment.n-u disfavour.n-u disfigurement.n-u disfranchisement.n-u disgrace.n-u disguise.n-u disgust.n-u disharmony.n-u dishonesty.n-u dishonour.n-u dishwater.n-u disillusionment.n-u disinclination.n-u disinfectant.n-u disintegration.n-u disinterment.n-u dislocation.n-u disloyalty.n-u dismay.n-u dismissal.n-u disobedience.n-u disorder.n-u disorganization.n-u dispatch.n-u dispensation.n-u dispersal.n-u displacement.n-u display.n-u displeasure.n-u disposal.n-u disposition.n-u disproof.n-u disproportion.n-u disputation.n-u dispute.n-u disqualification.n-u disquiet.n-u disquietude.n-u disregard.n-u disrepair.n-u disrepute.n-u disrespect.n-u disruption.n-u dissatisfaction.n-u dissection.n-u dissemination.n-u dissension.n-u dissent.n-u dissidence.n-u dissimilarity.n-u dissipation.n-u dissociation.n-u dissolution.n-u dissonance.n-u distaste.n-u distemper.n-u distillation.n-u distinction.n-u distortion.n-u distraction.n-u distress.n-u distribution.n-u disturbance.n-u disunity.n-u disuse.n-u divergence.n-u diversification.n-u diversion.n-u diversity.n-u divestiture.n-u divination.n-u divinity.n-u division.n-u divorce.n-u dizziness.n-u djembe.n-u Djiboutian.n-u docility.n-u doctrine.n-u documentation.n-u doggerel.n-u dogma.n-u dogmatism.n-u dole.n-u domestication.n-u domesticity.n-u dominance.n-u domination.n-u Dominican.n-u dominion.n-u donation.n-u donut.n-u dopamine.n-u dope.n-u dosage.n-u dotage.n-u dough.n-u doughnut.n-u doulophone.n-u downtown.n-u drainage.n-u drama.n-u dramatization.n-u drapery.n-u draught.n-u drawing.n-u dread.n-u dressage.n-u dressmaking.n-u drinking.n-u drink.n-u drivel.n-u drizzle.n-u drone.n-u dross.n-u drought.n-u drowsiness.n-u drudgery.n-u drum.n-u drunkenness.n-u dryness.n-u duck.n-u dudgeon.n-u duffel.n-u dulcian.n-u dulzaina.n-u dung.n-u duplication.n-u duplicity.n-u durability.n-u duration.n-u duress.n-u dusk.n-u dust.n-u dutar.n-u duty.n-u dye.n-u dynamism.n-u dynamite.n-u dysentery.n-u dyslexia.n-u dyspepsia.n-u earnest.n-u earshot.n-u earthenware.n-u earth.n-u earwax.n-u ease.n-u ebony.n-u ebullience.n-u eccentricity.n-u eclecticism.n-u ecology.n-u econometrics.n-u economics.n-u ecru.n-u ecstasy.n-u ectoplasm.n-u Ecuadorian.n-u edification.n-u education.n-u effacement.n-u effectiveness.n-u effect.n-u effervescence.n-u efficacy.n-u efficiency.n-u efflorescence.n-u effluent.n-u effrontery.n-u effusiveness.n-u egalitarianism.n-u egg.n-u eggplant.n-u eggshell.n-u egoism.n-u egotism.n-u Egyptian.n-u ejaculation.n-u ejection.n-u elaboration.n-u elan.n-u elasticity.n-u elastic.n-u elation.n-u electioneering.n-u election.n-u electricity.n-u electrification.n-u electrochemistry.n-u electrocution.n-u electrolysis.n-u electrolyte.n-u electromagnetism.n-u electronics.n-u electrophoresis.n-u elegance.n-u elevation.n-u elicitation.n-u eligibility.n-u elimination.n-u elision.n-u elitism.n-u elixir.n-u elm.n-u elocution.n-u elongation.n-u elopement.n-u eloquence.n-u elucidation.n-u email.n-u emanation.n-u emancipation.n-u emasculation.n-u embarkation.n-u embarrassment.n-u embellishment.n-u embezzlement.n-u embroidery.n-u emendation.n-u emerald.n-u emergency.n-u emigration.n-u eminence.n-u emission.n-u emotion.n-u empathy.n-u emphasis.n-u empiricism.n-u employment.n-u emptiness.n-u emulation.n-u emulsion.n-u enactment.n-u enamel.n-u encephalitis.n-u enchantment.n-u encirclement.n-u enclosure.n-u encouragement.n-u encroachment.n-u encryption.n-u endive.n-u endorsement.n-u endowment.n-u endurance.n-u energy.n-u enervation.v enforcement.n-u enfranchisement.n-u engagement.n-u engineering.n-u English.n-u engraving.n-u enhancement.n-u enjoyment.n-u enlargement.n-u enlightenment.n-u enlistment.n-u enmity.n-u ennoblement.n-u ennui.n-u enormity.n-u enquiry.n-u enrichment.n-u enrolment.n-u enslavement.n-u entanglement.n-u enterprise.n-u entertainment.n-u enthusiasm.n-u enticement.n-u entirety.n-u entitlement.n-u entomology.n-u entrance.n-u entrenchment.n-u entropy entry.n-u enumeration.n-u enunciation.n-u envy.n-u epidemic.n-u epidemiology.n-u epidermis.n-u epilepsy.n-u epsilon.n-u equality.n-u equalization.n-u equanimity.n-u equation.n-u equilibrium.n-u equipment.n-u equipoise.n-u equity.n-u equivalence.n-u equivocation.n-u erasure.n-u erection.n-u Eritrean.n-u erosion.n-u eroticism.n-u error.n-u erudition.n-u eruption.n-u escalation.n-u escape.n-u escapism.n-u eschatology.n-u espionage.n-u espousal.n-u espresso.n-u esprit.n-u essence.n-u establishment.n-u estate.n-u esteem.n-u estimation.n-u Estonian.n-u estrangement.n-u eta.n-u eternity.n-u ether.n-u ethics.n-u Ethiopian.n-u ethnicity.n-u ethnography.n-u ethnology.n-u ethyl.n-u etiology.n-u etiquette.n-u etymology.n-u euphonium.n-u euphoria.n-u European.n-u euthanasia.n-u evacuation.n-u evanescence.n-u evangelism.n-u evaporation.n-u evasion.n-u evening.n-u evenness.n-u evensong.n-u eventide.n-u eviction.n-u evil.n-u evocation.n-u evolution.n-u exacerbation.n-u exactitude.n-u exactness.n-u exaggeration.n-u exaltation.n-u examination.n-u exasperation.n-u excavation.n-u excellence.n-u excelsior.n-u excess.n-u exchange.n-u excise.n-u excitability.n-u excitement.n-u exclamation.n-u exclusion.n-u exclusivity.n-u excommunication.n-u excoriation.n-u excrement.n-u excretion.n-u execution.n-u exegesis.n-u exemplification.n-u exercise.n-u exertion.n-u exhalation.n-u exhaustion.n-u exhaust.n-u exhibitionism.n-u exhibition.n-u exhilaration.n-u exhortation.n-u exile.n-u existence.n-u existentialism.n-u exoneration.n-u expansion.n-u expansiveness.n-u expectancy.n-u expediency.n-u expenditure.n-u expense.n-u experience.n-u experimentation.n-u expertise.n-u expiation.n-u expiration.n-u explicitness.n-u exploitation.n-u exploration.n-u exportation.n-u exposition.n-u exposure.n-u expressionism.n-u expression.n-u express.n-u expropriation.n-u expulsion.n-u expurgation.n-u exquisiteness.n-u extension.n-u extent.n-u extermination.n-u extinction.n-u extirpation.n-u extortion.n-u extraction.n-u extract.n-u extradition.n-u extrapolation.n-u extravagance.n-u extrication.n-u extroversion.n-u exuberance.n-u exultation.n-u eyesight.n-u eyestrain.n-u eyewash.n-u fable.n-u fabrication.n-u fabric.n-u facility.n-u faction.n-u faglong.n-u faintness.n-u fairness.n-u faithfulness.n-u faith.n-u falafel.n-u falconry.n-u fallibility.n-u fallout.n-u fall.n-u falsehood.n-u falsetto.n-u falsification.n-u falsity.n-u fame.n-u familiarity.n-u family.n-u famine.n-u fanaticism.n-u fancy.n-u fanfare.n-u fantasy.n-u farce.n-u fare.n-u farmland.n-u fascination.n-u fascism.n-u fashion.n-u fastidiousness.n-u fatalism.n-u fate.n-u fatherhood.n-u fatigue.n-u fat.n-u fauna.n-u favor.n-u favouritism.n-u favour.n-u fealty.n-u feasibility.n-u fecundity.n-u federalism.n-u feedback.n-u feed.n-u fegereng.n-u felicity.n-u fellowship.n-u felt.n-u femininity.n-u feminism.n-u fencing.n-u fennel.n-u fermentation.n-u ferocity.n-u fertility.n-u fertilization.n-u fertilizer.n-u fervour.n-u festivity.n-u fetch.n-u fettucini.n-u feudalism.n-u fever.n-u fianchetto.n-u fiat.n-u fiber.n-u fibreboard.n-u fibreglass.n-u fibre.n-u fiction.n-u fiddle.n-u fidelity.n-u fieldwork.n-u fife.n-u Fijian.n-u filbert.n-u filigree.n-u Filipino.n-u film.n-u filth.n-u filtration.n-u finality.n-u finance.n-u financing.n-u finery.n-u finesse.n-u Finnish.n-u firebrick.n-u fire.n-u firewood.n-u firmness.n-u fir.n-u fishing.n-u fish.n-u fission.n-u fitness.n-u fixation.n-u fizz.n-u flaccidity.n-u flageolet.n-u flair.n-u flak.n-u flamboyance.n-u flame.n-u flannel.n-u flare.n-u flatness.n-u flattery.n-u flatulence.n-u flavor.n-u flavouring.n-u flavour.n-u flax.n-u fleece.n-u flesh.n-u flexibility.n-u flex.n-u flight.n-u flimsy.n-u flint.n-u flintstone.n-u flippancy.n-u flirtation.n-u floatation.n-u flooding.n-u flooring.n-u flotation.n-u flotsam.n-u flour.n-u flow.n-u fluctuation.n-u fluency.n-u fluff.n-u flugelhorn.n-u fluidity.n-u fluid.n-u fluorescence.n-u fluoridation.n-u fluoride.n-u fluoridization.n-u fluorine.n-u flu.n-u flush.n-u flute.n-u flutter.n-u flux.n-u flypaper.n-u foam.n-u focus.n-u fodder.n-u fog.n-u foil.n-u folgerphone.n-u foliage.n-u folklore.n-u folly.n-u fondness.n-u food.n-u foolhardiness.n-u foolishness.n-u footage.n-u football.n-u footwear.n-u footwork.n-u forage.n-u forbearance.n-u force.n-u foreboding.n-u foreclosure.n-u foreknowledge.n-u fore.n-u foresight.n-u forest.n-u forestry.n-u forethought.n-u forfeiture.n-u forgery.n-u forgetfulness.n-u forgiveness.n-u formaldehyde.n-u formalism.n-u formality.n-u formation.n-u format.n-u form.n-u formulation.n-u fornication.n-u fortepiano.n-u fortification.n-u fortitude.n-u fortune.n-u fossilization.n-u foul.n-u fowl.n-u fragility.n-u fragmentation.n-u fragrance.n-u frailty.n-u frankincense.n-u frankness.n-u fraternity.n-u fraternization.n-u fratricide.n-u fraud.n-u freedom.n-u freestyle.n-u freight.n-u French.n-u frenzy.n-u frequency.n-u fresco.n-u freshness.n-u friction.n-u friendliness.n-u friendship.n-u fright.n-u frigidity.n-u frijoles.n-u frivolity.n-u frostbite.n-u frost.n-u froth.n-u frugality.n-u fruitcake.n-u fruition.n-u fruit.n-u frustration.n-u fuel.n-u fuglung.n-u fulfilment.n-u fullness.n-u fumigation.n-u functionalism.n-u functionality.n-u fundamentalism.n-u fungicide.n-u fungus.n-u fun.n-u furlough.n-u furniture.n-u fur.n-u furtherance.n-u fury.n-u fusion.n-u fuss.n-u futility.n-u futurism.n-u fuzz.n-u gab.n-u Gabonian.n-u gadgetry.n-u gaiety.n-u gallantry.n-u gall.n-u Gambian.n-u gambling.n-u gamboge.n-u game.n-u gamesmanship.n-u gamma.n-u gammon.n-u gangrene.n-u gaol.n-u garbage.n-u garb.n-u gardening.n-u garlic.n-u garnet.n-u gaslight.n-u gasoline.n-u gas.n-u gaspacho.n-u gastronomy.n-u gaudiness.n-u gauze.n-u gear.n-u gelatine.n-u gelatin.n-u gel.n-u gemshorn.n-u gender.n-u genealogy.n-u generality.n-u generalization.n-u generation.n-u generosity.n-u geniality.n-u genius.n-u genocide.n-u gentility.n-u gentleness.n-u genuflection.n-u genus.n-u geography.n-u geology.n-u geometry.n-u Georgian.n-u German.n-u germination.n-u gerontology.n-u gestation.n-u Ghanaian.n-u gibberish.n-u gilt.n-u gingerbread.n-u ginger.n-u gingham.n-u gin.n-u girlhood.n-u girth.n-u glacier.n-u gladness.n-u glamorization.n-u glamour.n-u glare.n-u glasschord.n-u glass.n-u glassware.n-u glaucoma.n-u glaze.n-u glee.n-u glitter.n-u glockenspiel.n-u gloom.n-u glorification.n-u glory.n-u glucose.n-u glue.n-u gluttony.n-u glycerine.n-u goatskin.n-u gobbledygook.n-u godspeed.n-u goldenrod.n-u gold.n-u golf.n-u gong.n-u gonorrhea.n-u gonorrhoea.n-u goodness.n-u goodwill.n-u goolash.n-u goo.n-u gore.n-u gospel.n-u gossamer.n-u gossip.n-u goulash.n-u gout.n-u governance.n-u government.n-u grace.n-u graciousness.n-u graduation.n-u graft.n-u grain.n-u grammar.n-u grandeur.n-u grandiloquence.n-u granite.n-u grapefruit.n-u grapeshot.n-u graphite.n-u grassland.n-u grass.n-u gratefulness.n-u gratification.n-u gratitude.n-u gravel.n-u gravitation.n-u gravity.n-u gravy.n-u grease.n-u greasepaint.n-u greatness.n-u greediness.n-u greed.n-u Greek.n-u greenery.n-u Grenadan.n-u grief.n-u grime.n-u gristle.n-u grist.n-u grit.n-u ground.n-u groundwater.n-u groundwork.n-u growth.n-u grub.n-u gruel.n-u guacamole.n-u guac.n-u guano.n-u Guatemalan.n-u guava.n-u guesswork.n-u guidance.n-u guile.n-u guilt.n-u Guinean.n-u guitar.n-u guitarrón.n-u guitjo.n-u gullibility.n-u gumbo.n-u gum.n-u gumption.n-u gumshoe.n-u gunfire.n-u gunmetal.n-u gunnery.n-u gunny.n-u gunpowder.n-u gunrunning.n-u gustation.n-u gusto.n-u Guyanese.n-u gynaecology.n-u gypsum.n-u gyration.n-u haberdashery.n-u habitation.n-u habitat.n-u habit.n-u habituation.n-u haddock.n-u haemoglobin.n-u haemophilia.n-u haemorrhage.n-u hail.n-u hairdressing.n-u hair.n-u hairsplitting.n-u Haitian.n-u half-time.n-u halibut.n-u hallucination.n-u hamburger.n-u ham.n-u handbells.n-u handicraft.n-u handiwork.n-u handling.n-u handwork.n-u handwriting.n-u hanging.n-u happiness.n-u harassment.n-u hardness.n-u hardship.n-u hardware.n-u hardwood.n-u harlot.n-u harm.n-u harmonica.n-u harmonico.n-u harmonium.n-u harmonization.n-u harmony.n-u harp.n-u harpsichord.n-u harrassment.n-u harshness.n-u hashish.n-u hash.n-u hatching.n-u hate.n-u hatred.n-u haven.n-u havoc.n-u hay.n-u hazard.n-u hazel.n-u haze.n-u headache.n-u headgear.n-u headroom.n-u headway.n-u health.n-u hearsay.n-u heartache.n-u heartbreak.n-u heartburn.n-u heart.n-u heather.n-u heath.n-u heating.n-u heat.n-u heatstroke.n-u heaven.n-u heaviness.n-u heckelphone.n-u hedonism.n-u heed.n-u hegemony.n-u height.n-u helium.n-u hell.n-u help.n-u hemlock.n-u hemoglobin.n-u hemophilia.n-u hemorrhage.n-u hemp.n-u hepatitis.n-u heraldry.n-u herbicide.n-u herb.n-u heredity.n-u heresy.n-u heroin.n-u heroism.n-u hero.n-u herringbone.n-u herring.n-u hesitancy.n-u hesitation.n-u hessian.n-u heterodoxy.n-u heterosexuality.n-u hibernation.n-u hibiscus.n-u hickory.n-u hide.n-u highness.n-u hilarity.n-u hindsight.n-u hiring.n-u history.n-u hocchiku.n-u hockey.n-u hock.n-u hogwash.n-u hold.n-u holiness.n-u holly.n-u homage.n-u home.n-u homesickness.n-u homework.n-u homicide.n-u homily.n-u homoeopathy.n-u homogeneity.n-u homophobia.n-u homosexuality.n-u Honduran.n-u honesty.n-u honeycomb.n-u honeydew.n-u honey.n-u honeysuckle.n-u honor.n-u honour.n-u hooey.n-u hooliganism.n-u hoop.n-u hopelessness.n-u hopscotch.n-u horror.n-u horseback.n-u horsehair.n-u horsemanship.n-u horsemeat.n-u horseplay.n-u horsepower.n-u horseracing.n-u horse-radish.n-u horseradish.n-u horticulture.n-u hose.n-u hosiery.n-u hospitality.n-u hospitalization.n-u hostility.n-u hotdog.n-u houseware.n-u housework.n-u housing.n-u hubbub.n-u hubris.n-u huckleberry.n-u humanism.n-u humanitarianism.n-u humanity.n-u humankind.n-u humidity.n-u humiliation.n-u humility.n-u hummus.n-u humor.n-u humour.n-u humus.n-u Hungarian.n-u hunger.n-u hunting.n-u hurdy_gurdy hurry.n-u husbandry.n-u hydraulophone.n-u hydrogen.n-u hydrolysis.n-u hydropathy.n-u hydrophobia.n-u hygiene.n-u hype.n-u hyperbole.n-u hypnotism.n-u hypochondria.n-u hypocrisy.n-u hysteria.n-u iceberg.n-u Icelandish.n-u ice.n-u idealism.n-u idealization.n-u identification.n-u identity.n-u ideology.n-u idiocy.n-u idiom.n-u idleness.n-u idolatry.n-u idolization.n-u ignition.n-u ignominy.n-u ignorance.n-u ilk.n-u illegality.n-u illegibility.n-u illegitimacy.n-u illiteracy.n-u ill.n-u illness.n-u illumination.n-u illusion.n-u illustration.n-u imagery.n-u imagination.n-u imbalance.n-u imbecility.n-u imitation.n-u immanence.n-u immaturity.n-u immediacy.n-u immensity.n-u immersion.n-u immigration.n-u imminence.n-u immobility.n-u immobilization.n-u immodesty.n-u immolation.n-u immorality.n-u immortality.n-u immunity.n-u immunization.n-u immunology.n-u impact.n-u impairment.n-u impartiality.n-u impassivity.n-u impatience.n-u impeachment.n-u imperialism.n-u imperiousness.n-u impermanence.n-u impersonation.n-u impertinence.n-u impiety.n-u impingement.n-u implausibility.n-u implementation.n-u importance.n-u importation.n-u imposition.n-u impossibility.n-u impotence.n-u impoverishment.n-u impracticability.n-u imprecision.n-u impregnability.n-u impressionism.n-u imprisonment.n-u improbability.n-u impropriety.n-u improvement.n-u improvisation.n-u imprudence.n-u impudence.n-u impulse.n-u impunity.n-u impurity.n-u imputation.n-u inability.n-u inaccessibility.n-u inaccuracy.n-u inaction.n-u inactivity.n-u inadequacy.n-u inadvisability.n-u inanity.n-u inaudibility.n-u inauguration.n-u inbreeding.n-u incandescence.n-u incantation.n-u incapability.n-u incapacity.n-u incarceration.n-u incense.n-u incest.n-u incineration.n-u incitement.n-u incivility.n-u inclination.n-u inclusion.n-u incoherence.n-u income.n-u incompatibility.n-u incompetence.n-u incomprehensibility.n-u incomprehension.n-u incongruity.n-u inconsistency.n-u incontinence.n-u inconvenience.n-u incorporation.n-u incorruptibility.n-u incredulity.n-u incursion.n-u indecency.n-u indecision.n-u indemnification.n-u indemnity.n-u independence.n-u indestructibility.n-u indeterminacy.n-u Indian.n-u indictment.n-u indifference.n-u indigestion.n-u indignation.n-u indigo.n-u indiscretion.n-u indispensability.n-u indisposition.n-u individualism.n-u individuality.n-u indoctrination.n-u indolence.n-u Indonesian.n-u inducement.n-u induction.n-u indulgence.n-u industrialization.n-u industry.n-u inebriation.n-u ineffectuality.n-u inefficiency.n-u inelegance.n-u ineligibility.n-u ineptitude.n-u inequality.n-u inequity.n-u inertia.n-u inevitability.n-u inexperience.n-u infallibility.n-u infamy.n-u infancy.n-u infanticide.n-u infantry.n-u infatuation.n-u infection.n-u inference.n-u inferiority.n-u infertility.n-u infestation.n-u infidelity.n-u infield.n-u infighting.n-u infiltration.n-u infinity.n-u infirmity.n-u inflammation.n-u inflation.n-u inflection.n-u inflexibility.n-u infliction.n-u inflow.n-u influence.n-u influenza.n-u info.n-u informality.n-u information.n-u infrastructure.n-u infringement.n-u infusion.n-u ingenuity.n-u ingratitude.n-u inhalation.n-u inheritance.n-u inhibition.n-u inhumanity.n-u iniquity.n-u initiation.n-u initiative.n-u injection.n-u injustice.n-u ink.n-u inlay.n-u innocence.n-u innovation.n-u innuendo.n-u inoculation.n-u input.n-u inquiry.n-u inquisition.n-u insanity.n-u insecticide.n-u insecurity.n-u insemination.n-u insensitivity.n-u insertion.n-u insight.n-u insignificance.n-u insincerity.n-u insinuation.n-u insolence.n-u insolvency.n-u insomnia.n-u inspection.n-u inspiration.n-u instability.n-u installation.n-u instigation.n-u instinct.n-u instruction.n-u instrumentation.n-u insubordination.n-u insufficiency.n-u insularity.n-u insulation.n-u insulin.n-u insult.n-u insurance.n-u insurrection.n-u intake.n-u intangibility.n-u integration.n-u integrity.n-u intellect.n-u intelligence.n-u intelligibility.n-u intemperance.n-u intensification.n-u intention.n-u interaction.n-u interception.n-u intercession.n-u interchange.n-u interconnection.n-u intercourse.n-u interest.n-u interference.n-u interim.n-u intermarriage.n-u interment.n-u internationalization.n-u internment.n-u interplay.n-u interpolation.n-u interposition.n-u interpretation.n-u interrelation.n-u interrelationship.n-u interrogation.n-u interruption.n-u intersection.n-u intervention.n-u intimacy.n-u intimation.n-u intimidation.n-u intolerance.n-u intonation.n-u intoxication.n-u intractability.n-u intransigence.n-u intricacy.n-u intrigue.n-u introduction.n-u introspection.n-u introversion.n-u intrusion.n-u intuition.n-u inundation.n-u invalidation.n-u invalidity.n-u invective.n-u invention.n-u inventory.n-u inverse.n-u inversion.n-u investigation.n-u investiture.n-u investment.n-u invincibility.n-u invisibility.n-u invocation.n-u involvement.n-u inwardness.n-u iodine.n-u ionization.n-u iota.n-u Iranian.n-u Iraqi.n-u irascibility.n-u ire.n-u iridium.n-u Irish.n-u ironmongery.n-u iron.n-u ironware.n-u irony.n-u irregularity.n-u irrelevance.n-u irrelevancy.n-u irresponsibility.n-u irreverence.n-u irreversibility.n-u irrigation.n-u irritability.n-u irritation.n-u isolationism.n-u isolation.n-u Israeli.n-u issuance.n-u Italian.n-u Ivorian.n-u ivory.n-u ivy.n-u jade.n-u jail.n-u Jamaican.n-u jam.n-u Japanese.n-u jargon.n-u jasmine.n-u jaundice.n-u jazz.n-u jealousy.n-u jean.n-u jelly.n-u jeopardy.n-u jetsam.n-u jewellery.n-u jewelry.n-u jingoism.n-u jive.n-u jocularity.n-u jogging.n-u jollity.n-u Jordanian.n-u journalese.n-u journalism.n-u joviality.n-u joy.n-u jubilation.n-u judgement.n-u judgment.n-u judiciary.n-u judo.n-u jug.n-u juice.n-u juju.n-u jumble.n-u junk.n-u jurisdiction.n-u jurisprudence.n-u justice.n-u justification.n-u juxtaposition.n-u kalimba.n-u kappa.n-u karate.n-u karma.n-u katzenklavier.n-u Kazakhi.n-u kazoo.n-u kedgeree.n-u kelp.n-u ken.n-u Kenyan.n-u kerosene.n-u ketchup.n-u keytar.n-u khaki.n-u khalam.n-u kidnapping.n-u kielbasa.n-u killing.n-u kindling.n-u kindness.n-u kindred.n-u kinship.n-u kisanji.n-u kit.n-u kleenex.n-u kleptomania.n-u knavery.n-u knighthood.n-u knitwear.n-u know-how.n-u kora.n-u Korean.n-u koto.n-u kouxian.n-u kudos.n-u Kuwaiti.n-u labor.n-u labour.n-u lace.n-u lack.n-u lacquer.n-u lacrosse.n-u lager.n-u laissez-faire.n-u lambda.n-u lamb.n-u lambskin.n-u lamellaphone.n-u lamentation.n-u lamplight.n-u land.n-u landscape.n-u language.n-u languor.n-u Laotian.n-u lap.n-u larceny.n-u larch.n-u lard.n-u largesse.n-u laryngitis.n-u lasagna.n-u lasciviousness.n-u lassitude.n-u latency.n-u latex.n-u lather.n-u latitude.n-u Latvian.n-u laudanum.n-u laughter.n-u lava.n-u lavender.n-u law.n-u laxity.n-u laziness.n-u leadership.n-u leakage.n-u lean.n-u leapfrog.n-u leasing.n-u leather.n-u Lebanese.n-u lechery.n-u lee.n-u leeway.n-u legality.n-u legalization.n-u legend.n-u legibility.n-u legislation.n-u legitimacy.n-u leisure.n-u lemonade.n-u lemon.n-u lending.n-u length.n-u lenience.n-u leniency.n-u leprosy.n-u lesbianism.n-u lethargy.n-u lettering.n-u lettuce.n-u leukaemia.n-u leukemia.n-u level.n-u leverage.n-u levitation.n-u levity.n-u lexicography.n-u liability.n-u liaison.n-u libel.n-u liberalism.n-u liberality.n-u liberalization.n-u liberation.n-u Liberian.n-u liberty.n-u libido.n-u Libyan.n-u licence.n-u licentiousness.n-u lichen.n-u lieu.n-u lifeblood.n-u life.n-u lifestyle.n-u lightness.n-u lightning.n-u light.n-u lignite.n-u likeness.n-u limbo.n-u limejuice.n-u limelight.n-u lime.n-u limestone.n-u limitation.n-u linage.n-u lineage.n-u linen.n-u lingerie.n-u linkage.n-u linoleum.n-u lint.n-u lipstick.n-u liquidation.n-u liquidity.n-u liquidizer.n-u liquorice.n-u liquor.n-u lirone.n-u literacy.n-u literature.n-u lithography.n-u Lithuanian.n-u litigation.n-u litmus.n-u litotes.n-u litter.n-u liturgy.n-u livelihood.n-u liveliness.n-u liver.n-u liverwurst.n-u livestock.n-u loan.n-u loathing.n-u lobster.n-u locality.n-u localization.n-u lockjaw.n-u locomotion.n-u loggerheads.n-u logging.n-u logic.n-u loneliness.n-u longevity.n-u longhand.n-u longing.n-u longitude.n-u loot.n-u loquaciousness.n-u lordship.n-u lore.n-u loss.n-u lotion.n-u loudness.n-u loveliness.n-u love.n-u lox.n-u loyalty.n-u lubricant.n-u lubrication.n-u lucidity.n-u luck.n-u luggage.n-u lumbago.n-u lumber.n-u luminosity.n-u lunacy.n-u luncheon.n-u lunch.n-u lunchtime.n-u luster.n-u lust.n-u lustre.n-u lute.n-u Luxembourian.n-u luxuriance.n-u luxury.n-u lye.n-u lymph.n-u lyra.n-u lyre.n-u lyricism.n-u macadam.n-u macaroni.n-u Macedonian.n-u mace.n-u machination.n-u machinery.n-u machismo.n-u mackerel.n-u Madagascan.n-u madness.n-u magazine.n-u magenta.n-u magic.n-u magnanimity.n-u magnesia.n-u magnesium.n-u magnetism.n-u magnetization.n-u magnification.n-u magnificence.n-u magnitude.n-u mahjong.n-u mahogany.n-u mail.n-u maintenance.n-u maize.n-u majesty.n-u make-up.n-u malachite.n-u maladjustment.n-u malaria.n-u Malawian.n-u Malaysian.n-u malevolence.n-u malfeasance.n-u malformation.n-u malfunction.n-u Malian.n-u malice.n-u malignancy.n-u malleability.n-u malnutrition.n-u malpractice.n-u Maltese.n-u malt.n-u maltreatment.n-u manageability.n-u management.n-u mandarin.n-u mando-bass.n-u mandocello.n-u mandola.n-u mandolin.n-u manganese.n-u mango.n-u manhood.n-u mania.n-u manipulation.n-u mankind.n-u manner.n-u manoeuvrability.n-u manpower.n-u manslaughter.n-u manufacture.n-u manure.n-u maple.n-u maracas.n-u maraschino.n-u marble.n-u margarine.n-u margin.n-u marihuana.n-u marijuana.n-u marimba.n-u marimbaphone.n-u marinade.n-u marjoram.n-u marketing.n-u marksmanship.n-u marmalade.n-u marriageability.n-u marriage.n-u marrow.n-u marshmallow.n-u marsh.n-u martyrdom.n-u maryjane.n-u marzipan.n-u mascara.n-u masculinity.n-u mash.n-u masochism.n-u masonry.n-u mastery.n-u mastication.n-u mast.n-u masturbation.n-u materialism.n-u materialization.n-u material.n-u maternity.n-u mathematics.n-u matricide.n-u matriculation.n-u matrimony.n-u matter.n-u matting.n-u maturation.n-u maturity.n-u Mauritanian.n-u Mauritian.n-u mauve.n-u maximization.n-u mayhem.n-u mayo.n-u mayonnaise.n-u mbira.n-u meadow.n-u mead.n-u mealtime.n-u meaning.n-u meanness.n-u meantime.n-u measurement.n-u meat.n-u mechanization.n-u media.n-u mediation.n-u medication.n-u medicine.n-u mediocrity.n-u meditation.n-u megalomania.n-u meiosis.n-u melancholia.n-u melancholy.n-u mellophone.n-u mellotron.n-u melodeon.n-u melodica.n-u melodrama.n-u melody.n-u membership.n-u membrane.n-u memory.n-u menace.n-u mending.n-u meningitis.n-u menstruation.n-u mensuration.n-u mentality.n-u menthol.n-u mention.n-u merchandise.n-u mercury.n-u mercy.n-u merger.n-u meringue.n-u merit.n-u merriment.n-u merrymaking.n-u mescaline.n-u mesh.n-u messaging.n-u messiness.n-u mess.n-u metabolism.n-u metallophone.n-u metallurgy.n-u metal.n-u metalware.n-u metaphor.n-u meteorology.n-u meter.n-u methane.n-u methanol.n-u methodology.n-u method.n-u methyl.n-u mettle.n-u Mexican.n-u mezzo-soprano.n-u microbiology.n-u microfiche.n-u microfilm.n-u micromanagement.n-u Micronesian.n-u microscopy.n-u midday.n-u midnight.n-u midsession.n-u midstream.n-u midsummer.n-u midtown.n-u migration.n-u mildew.n-u mildness.n-u militancy.n-u militarism.n-u milk.n-u millennium.n-u milt.n-u mime.n-u mimicry.n-u mimosa.n-u mincemeat.n-u mince.n-u mind.n-u mineralogy.n-u minestrone.n-u minesweeping.n-u miniature.n-u mining.n-u mink.n-u mint.n-u mirth.n-u misanthropy.n-u misbehaviour.n-u miscalculation.n-u miscarriage.n-u mischief.n-u misconception.n-u misconduct.n-u misery.n-u misfortune.n-u misgovernment.n-u mishap.n-u misinformation.n-u misinterpretation.n-u mismanagement.n-u misquotation.n-u misrepresentation.n-u misrule.n-u mistletoe.n-u mist.n-u mistranslation.n-u mistrust.n-u misuse.n-u mitigation.n-u mixture.n-u mobility.n-u mobilization.n-u mocha.n-u mockery.n-u modeling.n-u moderation.n-u modernism.n-u modernity.n-u modernization.n-u modesty.n-u modification.n-u modulation.n-u mohair.n-u moisture.n-u molasses.n-u Moldovan.n-u mole.n-u molestation.n-u molybdenum.n-u momentum.n-u monarchism.n-u monarchy.n-u monasticism.n-u money.n-u Mongolian.n-u monogamy.n-u monotheism.n-u monotony.n-u monoxide.n-u monstrosity.n-u moonlight.n-u moonshine.n-u moorland.n-u morale.n-u morality.n-u morbidity.n-u morning.n-u Moroccan.n-u morphine.n-u morphology.n-u morsing.n-u mortality.n-u mortar.n-u moss.n-u motherhood.n-u motion.n-u motivation.n-u motley.n-u mountaineering.n-u mourning.n-u mousse.n-u movement.n-u Mozambican.n-u muck.n-u muckraking.n-u mucus.n-u mud.n-u muesli.n-u multiplex.n-u multiplication.n-u multiplicity.n-u munificence.n-u mu.n-u murder.n-u muscle.n-u musete.n-u mush.n-u mushroom.n-u musicianship.n-u music.n-u musketry.n-u musk.n-u mustard.n-u mutability.n-u mutation.n-u mutilation.n-u mutiny.n-u mutton.n-u myelitis.n-u myopia.n-u myrrh.n-u myrtle.n-u mystery.n-u mysticism.n-u mythology.n-u nadaswaram.n-u naivete.n-u naivety.n-u Namibian.n-u napalm.n-u narcissism.n-u narration.n-u narrative.n-u narrowness.n-u nationalism.n-u nationality.n-u nationalization.n-u naturalization.n-u nature.n-u naught.n-u Nauruan.n-u nausea.n-u navigability.n-u navigation.n-u neatness.n-u necessity.n-u neckwear.n-u nectar.n-u needlecraft.n-u needlework.n-u negation.n-u neglect.n-u negligence.n-u negotiation.n-u neocolonialism.n-u neon.n-u nephritis.n-u nepotism.n-u nerve.n-u netball.n-u net.n-u neufchatel.n-u neuralgia.n-u neurasthenia.n-u neurology.n-u neutrality.n-u neutralization.n-u newsprint.n-u ney.n-u Nicaraguan.n-u nickel.n-u nicotine.n-u Nigerian.n-u Nigerien.n-u nightfall.n-u nihilism.n-u nil.n-u nirvana.n-u nitrate.n-u nitrogen.n-u nitroglycerine.n-u nitroglycerin.n-u nix.n-u nobility.n-u nohkan.n-u noise.n-u nominative.n-u nonaggression.n-u nonalignment.n-u nonchalance.n-u nonconformity.n-u nonfiction.n-u nonintervention.n-u nonpayment.n-u nonsense.n-u nonviolence.n-u noon.n-u normalcy.n-u normality.n-u normalization.n-u Norwegian.n-u nosh.n-u nostalgia.n-u notation.n-u notepaper.n-u nothingness.n-u notice.n-u notoriety.n-u nougat.n-u nourishment.n-u novella.n-u novelty.n-u nuance.n-u nudism.n-u nudity.n-u nullification.n-u numbness.n-u numeracy.n-u nu.n-u nursing.n-u nurture.n-u nutmeg.n-u nutrition.n-u nylon.n-u nymphomania.n-u oak.n-u oarsmanship.n-u oatcake.n-u oatmeal.n-u oatn-u oat.n-u obduracy.n-u obedience.n-u obeisance.n-u obesity.n-u objectivity.n-u obliteration.n-u oblivion.n-u obnoxiousness.n-u oboe.n-u obscenity.n-u obscurantism.n-u obscurity.n-u observance.n-u observation.n-u obsession.n-u obsolescence.n-u obstinacy.n-u obstructionism.n-u obstruction.n-u ocarina.n-u occurrence.n-u ocean.n-u ochre.n-u octane.n-u octapad.n-u octavin.n-u odour.n-u offence.n-u offense.n-u officialdom.n-u officialese.n-u offset.n-u oilcloth.n-u oil.n-u ointment.n-u okra.n-u olestra.n-u oligarchy.n-u olive.n-u olivine.n-u Omani.n-u omega.n-u omelet.n-u omelette.n-u omicron.n-u omission.n-u omnipotence.n-u omniscience.n-u onion.n-u onomatopoeia.n-u ontology.n-u oomph.n-u ooze.n-u opacity.n-u opal.n-u openness.n-u opera.n-u operation.n-u ophicleide.n-u opiate.n-u opium.n-u opportunism.n-u opposition.n-u oppression.n-u opprobrium.n-u optics.n-u optimism.n-u opulence.n-u opus.n-u orangeade.n-u orange.n-u oratory.n-u orchestration.n-u ordination.n-u ore.n-u organization.n-u organ.n-u orientation.n-u originality.n-u origin.n-u ornamentation.n-u ornament.n-u ornithology.n-u orthodoxy.n-u orthography.n-u oscillation.n-u ossification.n-u ostentation.n-u osteopathy.n-u ostracism.n-u otter.n-u outcry.n-u outlay.n-u output.n-u outrage.n-u ovenware.n-u overcollection.n-u overconfidence.n-u overdrive.n-u overemphasis.n-u overexertion.n-u overexposure.n-u overgrowth.n-u overkill.n-u overlap.n-u overpayment.n-u overpopulation.n-u overproduction.n-u oversight.n-u overstatement.n-u overstrain.n-u overtime.n-u overwork.n-u ownership.n-u oxidation.n-u oxide.n-u oxidization.n-u oxyacetylene.n-u oxygen.n-u oyster.n-u oystershell.n-u ozone.n-u pacification.n-u pacifism.n-u packaging.n-u padding.n-u paederasty.n-u paella.n-u paganism.n-u pageantry.n-u pagination.n-u pain.n-u paint.n-u paisley.n-u paixiao.n-u Pakistani.n-u palaeontology.n-u palendag.n-u paleness.n-u paleontology.n-u pallor.n-u palsy.n-u panache.n-u Panamanian.n-u pancake.n-u pandemonium.n-u panelling.n-u panic.n-u pan_pipen-u pantheism.n-u pantomime.n-u papadam.n-u paper.n-u paperwork.n-u paprika.n-u papyrus.n-u paradise.n-u paraffin.n-u Paraguayan.n-u parallelism.n-u paralysis.n-u paranoia.n-u paraphernalia.n-u parchment.n-u pardon.n-u parentage.n-u parity.n-u parochialism.n-u parody.n-u parole.n-u par.n-u parquet.n-u parricide.n-u parsimony.n-u parsley.n-u parsnip.n-u participation.n-u partisanship.n-u partition.n-u partnership.n-u partridge.n-u passage.n-u passion.n-u passivity.n-u pasta.n-u paste.n-u pasteurization.n-u pastry.n-u pasture.n-u patchwork.n-u pate.n-u paté.n-u paternalism.n-u paternity.n-u pathology.n-u pathos.n-u patience.n-u patricide.n-u patriotism.n-u patronage.n-u patter.n-u paucity.n-u pause.n-u paydirt.n-u payment.n-u pay.n-u payout.n-u peace.n-u peacetime.n-u peach.n-u peanut.n-u pea.n-u pearl.n-u pear.n-u peat.n-u pecan.n-u pectin.n-u peculiarity.n-u pedagogy.n-u pedantry.n-u pederasty.n-u pedigree.n-u peel.n-u pee.n-u penalty.n-u penance.n-u penetration.n-u penicillin.n-u penitence.n-u penmanship.n-u pentamidine.n-u penury.n-u peonage.n-u pep.n-u peppermint.n-u pepper.n-u perceptibility.n-u perch.n-u percussion.n-u perfectibility.n-u perfection.n-u perfidy.n-u perforation.n-u performance.n-u perfume.n-u peril.n-u periwinkle.n-u perjury.n-u permafrost.n-u permanence.n-u permeability.n-u permission.n-u permissiveness.n-u permutation.n-u peroxide.n-u perpetration.n-u perpetuation.n-u perpetuity.n-u perplexity.n-u persecution.n-u perseverance.n-u persimmon.n-u persistence.n-u personality.n-u personification.n-u perspective.n-u perspicacity.n-u perspicuity.n-u perspiration.n-u persuasion.n-u pertinence.n-u perusal.n-u Peruvian.n-u perversion.n-u perversity.n-u pessimism.n-u pesticide.n-u pestilence.n-u petroleum.n-u petrol.n-u pettiness.n-u petulance.n-u pewter.n-u peyote.n-u pharmacology.n-u pheasant.n-u philanthropy.n-u philology.n-u phi.n-u phlegm.n-u phonology.n-u phosphate.n-u phosphorescence.n-u phosphorus.n-u photography.n-u photosynthesis.n-u phraseology.n-u phrenology.n-u phylogeny.n-u phylum.n-u physics.n-u physiognomy.n-u physiology.n-u physiotherapy.n-u physique.n-u pianoforte.n-u piano.n-u pibgorn.n-u piccolo.n-u pickle.n-u pico_de_gaillo pico_de_gallo pide.n-u pidgin.n-u piecework.n-u pie.n-u piety.n-u piffle.n-u pigmentation.n-u pigment.n-u pigskin.n-u pilaf.n-u pimento.n-u pinball.n-u pineapple.n-u pine.n-u pingpong.n-u pi.n-u pipe.n-u piping.n-u piquancy.n-u pique.n-u piracy.n-u piss.n-u pistachio.n-u pitch.n-u pith.n-u pity.n-u pizza.n-u placement.n-u placenta.n-u placidity.n-u plagiarism.n-u plaice.n-u plaid.n-u planking.n-u plankton.n-u planning.n-u plaque.n-u plasma.n-u plaster.n-u plasticine.n-u plasticity.n-u plastic.n-u platinum.n-u plausibility.n-u playback.n-u play.n-u playtime.n-u pleasure.n-u pliancy.n-u pluck.n-u plumage.n-u plumbing.n-u plunder.n-u pluralism.n-u plurality.n-u plush.n-u plutocracy.n-u plutonium.n-u plywood.n-u pneumonia.n-u podiatry.n-u poetry.n-u poignancy.n-u poinsettia.n-u poise.n-u poison.n-u poker.n-u polarity.n-u polarization.n-u police.n-u policy.n-u poliomyelitis.n-u polio.n-u Polish.n-u polish.n-u politeness.n-u politics.n-u pollen.n-u pollination.n-u pollo_con_oregano pollo_con_queso pollo_frito pollo.n-u pollution.n-u polo.n-u polska_kielbasa polygamy.n-u polyphony.n-u polytheism.n-u polythene.n-u pomp.n-u pomposity.n-u popcorn.n-u popery.n-u poplar.n-u pop.n-u poppycock.n-u popularity.n-u popularization.n-u population.n-u populism.n-u porcelain.n-u pork.n-u porn.n-u pornography.n-u porosity.n-u porridge.n-u portability.n-u port.n-u portraiture.n-u Portugese.n-u positivism.n-u possession.n-u postage.n-u posterity.n-u post.n-u postponement.n-u posture.n-u potash.n-u potassium.n-u potato.n-u potency.n-u potentiality.n-u potential.n-u pot.n-u pottery.n-u poultry.n-u poverty.n-u powder.n-u power.n-u practicability.n-u practicality.n-u practice.n-u pragmatism.n-u praise.n-u prattle.n-u prawn.n-u prayer.n-u preachiness.n-u precedence.n-u precipitation.n-u precision.n-u precocity.n-u predestination.n-u predictability.n-u prediction.n-u predominance.n-u preference.n-u preferment.n-u pregnancy.n-u prehistory.n-u prejudice.n-u premeditation.n-u preoccupation.n-u preparation.n-u prep.n-u prescience.n-u prescription.n-u presence.n-u presentation.n-u preservation.n-u press.n-u prestige.n-u presumption.n-u pretence.n-u pretense.n-u pretension.n-u prettiness.n-u prevalence.n-u prevarication.n-u prevention.n-u prevision.n-u price.n-u pride.n-u primacy.n-u prime.n-u primogeniture.n-u principal.n-u printing.n-u print.n-u priority.n-u prison.n-u privacy.n-u privatization.n-u privilege.n-u probate.n-u probation.n-u probity.n-u procedure.n-u procession.n-u procrastination.n-u procurement.n-u produce.n-u production.n-u productivity.n-u profanity.n-u professionalism.n-u proficiency.n-u profile.n-u profitability.n-u profiteering.n-u profit.n-u profligacy.n-u profundity.n-u profusion.n-u prognostication.n-u programming.n-u progression.n-u progress.n-u prohibition.n-u prolixity.n-u prolongation.n-u prominence.n-u promiscuity.n-u promptness.n-u promulgation.n-u pronunciation.n-u propaganda.n-u propagation.n-u propane.n-u propellant.n-u propellent.n-u property.n-u prophecy.n-u prophylaxis.n-u proportion.n-u propriety.n-u propulsion.n-u proscription.n-u prosecution.n-u prose.n-u prosody.n-u prosperity.n-u prostitution.n-u prostration.n-u protectionism.n-u protection.n-u protein.n-u protest.n-u protocol.n-u protoplasm.n-u provenance.n-u providence.n-u provincialism.n-u provocation.n-u prowess.n-u proximity.n-u proxy.n-u prudence.n-u prudery.n-u prurience.n-u psalmody.n-u psaltery.n-u psi.n-u psoriasis.n-u psychiatry.n-u psychoanalysis.n-u psychology.n-u psychotherapy.n-u puberty.n-u publicity.n-u publishing.n-u puce.n-u pudding.n-u pugnacity.n-u puke.n-u pulalu.n-u pulp.n-u pulsation.n-u pumpernickel.n-u pumpkin.n-u punch.n-u punctuality.n-u punctuation.n-u pungency.n-u punishment.n-u punk.n-u purchase.n-u purchasing.n-u purgation.n-u purgatory.n-u purification.n-u puritanism.n-u purity.n-u purpose.n-u pursuit.n-u pusillanimity.n-u pus.n-u putty.n-u puzzlement.n-u Qatari.n-u quackery.n-u qualification.n-u quality.n-u quantity.n-u quarantine.n-u quartz.n-u quatro.n-u queasiness.n-u queso_blanco queso.n-u quiche.n-u quicksand.n-u quicksilver.n-u quietism.n-u quince.n-u quinine.n-u quinticlave.n-u quotation.n-u rabbit.n-u rabies.n-u race.n-u racing.n-u racism.n-u racketeering.n-u racket.n-u radar.n-u radiance.n-u radiation.n-u radicalism.n-u radioactivity.n-u radiography.n-u radiology.n-u radio.n-u radiotherapy.n-u radium.n-u radius.n-u rage.n-u ragtime.n-u rainfall.n-u rain.n-u rainstick.n-u rainwater.n-u ranch.n-u rancour.n-u range.n-u rank.n-u ransom.n-u rapacity.n-u rape.n-u rapidity.n-u rap.n-u rapport.n-u rapture.n-u rarebit.n-u rarity.n-u ratchet.n-u rationalism.n-u rationality.n-u rationalization.n-u rattle.n-u ravioli.n-u rayon.n-u reach.n-u reaction.n-u readability.n-u reading.n-u readjustment.n-u readmission.n-u realignment.n-u realism.n-u reality.n-u reallocation.n-u rearmament.n-u rearrangement.n-u reasonableness.n-u reassessment.n-u rebec.n-u recalcitrance.n-u recall.n-u recapitulation.n-u reception.n-u receptiveness.n-u receptivity.n-u recession.n-u recidivism.n-u reciprocation.n-u reciprocity.n-u recitation.n-u recitative.n-u recklessness.n-u reclamation.n-u recognition.n-u recollection.n-u recompense.n-u reconciliation.n-u reconnaissance.n-u reconsideration.n-u reconstruction.n-u recorder.n-u record.n-u recourse.n-u recovery.n-u recreation.n-u recrimination.n-u recruiting.n-u rectification.n-u rectitude.n-u recuperation.n-u recurrence.n-u redemption.n-u redeployment.n-u redevelopment.n-u rediscovery.n-u redistribution.n-u redness.n-u redress.n-u reduction.n-u redundancy.n-u reduplication.n-u redwood.n-u reed.n-u reek.n-u re-election.n-u reelection.n-u reference.n-u referral.n-u refinancing.n-u refinement.n-u reflection.n-u reforestation.n-u reformation.n-u reform.n-u refraction.n-u refreshment.n-u refrigeration.n-u refuge.n-u refund.n-u refuse.n-u refutation.n-u regard.n-u regeneration.n-u reggae.n-u regicide.n-u regimentation.n-u registration.n-u registry.n-u regression.n-u regret.n-u regularity.n-u regulation.n-u rehabilitation.n-u rehearsal.n-u reimbursement.n-u reimposition.n-u reincarnation.n-u reinforcement.n-u reinstatement.n-u reinterpretation.n-u reiteration.n-u rejection.n-u rejuvenation.n-u relation.n-u relativity.n-u relaxation.n-u relegation.n-u relevancy.n-u reliability.n-u reliance.n-u religion.n-u relish.n-u relocation.n-u remarriage.n-u remembrance.n-u remilitarization.n-u reminiscence.n-u remission.n-u remittance.n-u remonstrance.n-u remorse.n-u removal.n-u remuneration.n-u renewal.n-u renovation.n-u renown.n-u rent.n-u renunciation.n-u reorganization.n-u reorientation.n-u repair.n-u reparation.n-u repartee.n-u repatriation.n-u repayment.n-u repellent.n-u repentance.n-u repetition.n-u replacement.n-u replenishment.n-u reportage.n-u repose.n-u representation.n-u repression.n-u reprisal.n-u reproach.n-u reproduction.n-u reproof.n-u republicanism.n-u repugnance.n-u repulsion.n-u repurchase.n-u reputation.n-u repute.n-u requisition.n-u resale.n-u rescue.n-u research.n-u resemblance.n-u resentment.n-u reservation.n-u reserve.n-u residence.n-u resignation.n-u resilience.n-u resiliency.n-u resin.n-u resistance.n-u resolvability.n-u resolvableness.n-u resolve.n-u resonance.n-u resort.n-u respectability.n-u respect.n-u respiration.n-u respite.n-u resplendence.n-u restitution.n-u restlessness.n-u restoration.n-u rest.n-u restraint.n-u restructuring.n-u resumption.n-u resurrection.n-u resuscitation.n-u retaliation.n-u retardation.n-u retention.n-u reticence.n-u retirement.n-u retraction.n-u retreat.n-u retrenchment.n-u retribution.n-u retrieval.n-u retrogression.n-u retrospect.n-u return.n-u reunification.n-u reunion.n-u revaluation.n-u revelation.n-u revel.n-u revelry.n-u revenge.n-u revenue.n-u reverberation.n-u reverence.n-u reverie.n-u reversal.n-u reverse.n-u reversibility.n-u reversion.n-u review.n-u revisionism.n-u revision.n-u revitalization.n-u revival.n-u revocation.n-u revolt.n-u revolution.n-u revulsion.n-u reward.n-u rhetoric.n-u rheumatism.n-u rho.n-u rhubarb.n-u rhyme.n-u rhythm.n-u ribaldry.n-u riboflavin.n-u rice.n-u richness.n-u riddance.n-u ridicule.n-u rigging.n-u righteousness.n-u right.n-u rightness.n-u rigidity.n-u rigmarole.n-u rigour.n-u rioting.n-u riot.n-u risotto.n-u ritual.n-u rivalry.n-u roast.n-u robbery.n-u rock.n-u roe.n-u romance.n-u Romanian.n-u romanticism.n-u roofing.n-u room.n-u rope.n-u rosemary.n-u rosewood.n-u rosin.n-u rotation.n-u rotgut.n-u rotini.n-u rot.n-u rouge.n-u roughage.n-u roulette.n-u routine.n-u royalty.n-u rubber.n-u rubbish.n-u rubble.n-u rudeness.n-u rue.n-u rugby.n-u rugger.n-u ruin.n-u rummy.n-u rum.n-u rumour.n-u rupture.n-u rush.n-u russet.n-u Russian.n-u rustle.n-u rust.n-u Rwandan.n-u rye.n-u ryuteki.n-u sable.n-u sabotage.n-u saccharin.n-u sackbut.n-u sack.n-u sacrifice.n-u sacrilege.n-u sadism.n-u sadness.n-u sadomasochism.n-u safari.n-u safekeeping.n-u safety.n-u saffron.n-u sagacity.n-u sage.n-u sainthood.n-u sake.n-u salad.n-u salamander.n-u salami.n-u salary.n-u sale.n-u salesmanship.n-u salience.n-u saline.n-u salinity.n-u saliva.n-u salmon.n-u salsa_mexicana salsa.n-u salsa_rojo salsa_verde salt.n-u saltpetre.n-u saltwater.n-u Salvadoran.n-u salvage.n-u salvation.n-u salve.n-u sameness.n-u Samoan.n-u samponia.n-u sanction.n-u sanctity.n-u sanctuary.n-u sandalwood.n-u sand.n-u sandpaper.n-u sandstone.n-u sandwich.n-u sangria.n-u sanitation.n-u sanity.n-u sap.n-u sapphire.n-u sarcasm.n-u sardine.n-u sarrusophone.n-u satiety.n-u satin.n-u satire.n-u satisfaction.n-u saturation.n-u sauce.n-u sauerkraut.n-u sausage.n-u savagery.n-u savory.n-u savoy.n-u savvy.n-u sawdust.n-u saxhorn.n-u saxonette.n-u saxophone.n-u scaffolding.n-u scandal.n-u scansion.n-u scarcity.n-u scarlet.n-u scenery.n-u scent.n-u scepticism.n-u schizophrenia.n-u schmaltz.n-u schmalz.n-u schmear.n-u schnapps.n-u schnitzel.n-u scholarship.n-u scholasticism.n-u schooling.n-u school.n-u schooltime.n-u sciatica.n-u science.n-u scintillation.n-u sclerosis.n-u scone.n-u scope.n-u scorn.n-u scotch.n-u Scottish.n-u scrabble.n-u scrap.n-u scruple.n-u scrutiny.n-u scud.n-u sculpture.n-u scum.n-u scurvy.n-u seafood.n-u seamanship.n-u sea.n-u seasickness.n-u seasoning.n-u seaweed.n-u secession.n-u seclusion.n-u secrecy.n-u secretion.n-u sectarianism.n-u secularism.n-u security.n-u sedation.n-u sediment.n-u sedition.n-u seduction.n-u seepage.n-u seersucker.n-u segmentation.n-u segregation.n-u seismology.n-u seizure.n-u selection.n-u selectivity.n-u self-confidence.n-u self-consciousness.n-u self-control.n-u self-determination.n-u self-esteem.n-u self-examination.n-u self-help.n-u self-indulgence.n-u self-interest.n-u self-pity.n-u self-preservation.n-u self-respect.n-u self-rule.n-u self-sacrifice.n-u self-sufficiency.n-u self-will.n-u semaphore.n-u semblance.n-u semen.n-u semolina.n-u Senegalese.n-u senility.n-u seniority.n-u sensationalism.n-u sensation.n-u sensibility.n-u sensitivity.n-u sensuality.n-u sentimentality.n-u sentiment.n-u separation.n-u sepia.n-u sequence.n-u Serbian.n-u serendipity.n-u serenity.n-u serfdom.n-u serge.n-u seriousness.n-u serum.n-u service.n-u servitude.n-u sesame.n-u set.n-u settlement.n-u severance.n-u severity.n-u sewage.n-u sexism.n-u sex.n-u sexuality.n-u shade.n-u shading.n-u shag.n-u shakuhachi.n-u shale.n-u shampoo.n-u shandy.n-u shape.n-u share.n-u sheen.n-u sheepskin.n-u sheet.n-u shehnai.n-u shekere.n-u shellac.n-u shellfire.n-u shelter.n-u sheng.n-u sherbet.n-u sherry.n-u shimmer.n-u shingle.n-u shinobue.n-u shipbuilding.n-u shipment.n-u shipping.n-u shipwreck.n-u shit.n-u shock.n-u shoemaking.n-u shopping.n-u shortage.n-u shortbread.n-u shortcake.n-u shortening.n-u shorthand.n-u shortness.n-u showbiz.n-u showjumping.n-u showmanship.n-u shrapnel.n-u shrift.n-u shrimp.n-u shrinkage.n-u shuteye.n-u shyness.n-u Sicilian.n-u sickness.n-u siege.n-u sienna.n-u sight.n-u sight-seeing.n-u sightseeing.n-u sigma.n-u significance.n-u signification.n-u siku.n-u silence.n-u silica.n-u silicone.n-u silicon.n-u silk.n-u silliness.n-u silt.n-u silver.n-u similarity.n-u simile.n-u similitude.n-u simplicity.n-u simplification.n-u simulation.n-u simultaneity.n-u sincerity.n-u sin.n-u sirloin.n-u sirup.n-u sisterhood.n-u sitar.n-u size.n-u skateboarding.n-u skepticism.n-u skill.n-u skim.n-u skin.n-u sky.n-u skywriting.n-u slack.n-u slander.n-u slang.n-u slapstick.n-u slate.n-u slaughter.n-u slavery.n-u slaw.n-u sleep.n-u sleet.n-u slew.n-u slime.n-u slippage.n-u sloe.n-u slope.n-u sloth.n-u Slovakian.n-u Slovenian.n-u sludge.n-u slush.n-u smallpox.n-u smalt.n-u smog.n-u smoke.n-u smoking.n-u smuggling.n-u smut.n-u snail.n-u snap.n-u snare.n-u snobbery.n-u snooker.n-u snort.n-u snot.n-u snow.n-u snuff.n-u soap.n-u sobriety.n-u soccer.n-u sociability.n-u socialism.n-u socialization.n-u society.n-u sociology.n-u soda.n-u sodium.n-u sodomy.n-u sod.n-u softness.n-u software.n-u soil.n-u solace.n-u solder.n-u solemnity.n-u solicitation.n-u solicitude.n-u solidarity.n-u solidification.n-u solidity.n-u solipsism.n-u solitaire.n-u solitude.n-u solubility.n-u solvency.n-u Somalian.n-u somnolence.n-u sonority.n-u soot.n-u sophistication.n-u sophistry.n-u soprano.n-u sorbet.n-u sorcery.n-u soreness.n-u sorghum.n-u sorrel.n-u sorrow.n-u soul.n-u sound.n-u soup.n-u sousaphone.n-u sovereignty.n-u soy.n-u space.n-u spaghetti.n-u spam.n-u Spanish.n-u spawn.n-u spearmint.n-u specialization.n-u specie.n-u specification.n-u specificity.n-u spectroscopy.n-u speech.n-u speed.n-u spelling.n-u spending.n-u spermicide.n-u sperm.n-u spice.n-u spillage.n-u spillover.n-u spinach.n-u spin.n-u spinsterhood.n-u spirit.n-u spirituality.n-u spite.n-u spittle.n-u spleen.n-u splendour.n-u spoil.n-u sponge.n-u sponsorship.n-u spontaneity.n-u sport.n-u sportsmanship.n-u sprawl.n-u spray.n-u spring.n-u springtime.n-u spruce.n-u spunk.n-u squalor.n-u squirrel.n-u stability.n-u stabilization.n-u staff.n-u stagecraft.n-u stagflation.n-u staging.n-u stagnation.n-u stain.n-u stalemate.n-u stamina.n-u standardization.n-u standing.n-u starch.n-u stardom.n-u stardust.n-u starlight.n-u starvation.n-u statecraft.n-u statesmanship.n-u stationery.n-u statuary.n-u stature.n-u status.n-u stead.n-u steak.n-u stealth.n-u steam.n-u steelmaking.n-u steel.n-u steelpan.n-u stenography.n-u stereotype.n-u sterility.n-u sterilization.n-u sterling.n-u stewardship.n-u stew.n-u stiffness.n-u stillness.n-u stimulation.n-u stock.n-u stoicism.n-u stone.n-u stoneware.n-u storage.n-u stout.n-u strain.n-u strategy.n-u stratification.n-u straw.n-u strength.n-u stress.n-u stretch.n-u strife.n-u stringency.n-u string.n-u striptease.n-u strontium.n-u structure.n-u strudel.n-u struggle.n-u strychnine.n-u stubble.n-u stubbornness.n-u stucco.n-u study.n-u stuffing.n-u stuff.n-u stupefaction.n-u stupidity.n-u stupor.n-u sturgeon.n-u style.n-u stylization.n-u suavity.n-u subconsciousness.n-u subdivision.n-u subjection.n-u subjectivity.n-u subjugation.n-u subjunctive.n-u sublimation.n-u submergence.n-u submersion.n-u submission.n-u subordination.n-u subscription.n-u subservience.n-u subsidization.n-u subsistence.n-u subsoil.n-u substance.n-u substantiation.n-u substitution.n-u subterfuge.n-u subtlety.n-u subtraction.n-u suburbia.n-u subversion.n-u succession.n-u success.n-u suction.n-u Sudanese.n-u suede.n-u suet.n-u suffering.n-u sufficiency.n-u suffocation.n-u suffrage.n-u sugar.n-u suicide.n-u suitability.n-u sulphate.n-u sulphide.n-u sulphur.n-u summer.n-u summertime.n-u sunburn.n-u sundown.n-u sunlight.n-u sun.n-u sunrise.n-u sunset.n-u sunshine.n-u sunstroke.n-u superconductivity.n-u superego.n-u superficiality.n-u superfluity.n-u superiority.n-u superstition.n-u supervision.n-u supper.n-u supplication.n-u supply.n-u support.n-u suppression.n-u supremacy.n-u surgery.n-u Surinamese.n-u surprise.n-u surrealism.n-u surveillance.n-u surveying.n-u survival.n-u susceptibility.n-u sushi.n-u suspense.n-u suspension.n-u sustenance.n-u swamp.n-u sway.n-u sweat.n-u Swedish.n-u sweetbread.n-u sweetening.n-u sweetmeat.n-u sweetness.n-u swelling.n-u swill.n-u swimsuit.n-u Swiss.n-u swordplay.n-u swordsmanship.n-u sycamore.n-u symbiosis.n-u symbolism.n-u symbolization.n-u symmetry.n-u sympathy.n-u synchronization.n-u synchrony.n-u synclavier.n-u syncopation.n-u syndication.n-u syntax.n-u synthesizer.n-u syphilis.n-u Syrian.n-u syrup.n-u systematization.n-u tabbouleh.n-u tabbouli.n-u tableware.n-u taboo.n-u taboulleh.n-u taboulli.n-u tabulation.n-u tackle.n-u tack.n-u tact.n-u taffeta.n-u taffy.n-u tag.n-u Taiwanese.n-u takeoff.n-u take-up.n-u talcum.n-u talent.n-u talk.n-u tamale.n-u tamarind.n-u tamboril.n-u tambourine.n-u tamburitza.n-u tandem.n-u tangerine.n-u Tanzanian.n-u tape.n-u tapestry.n-u tapioca.n-u tarmac.n-u tarogato.n-u tar.n-u tarragon.n-u tartar.n-u taste.n-u tau.n-u taupe.n-u tautology.n-u taxation.n-u taxidermy.n-u taxonomy.n-u teaching.n-u teak.n-u teal.n-u teamwork.n-u tea.n-u technique.n-u technocracy.n-u technology.n-u tedium.n-u telecommunications.n-u telefax.n-u telemarketing.n-u teleology.n-u telepathy.n-u teletype.n-u television.n-u temerity.n-u temperament.n-u temperance.n-u temperature.n-u temper.n-u temporality.n-u tenacity.n-u tenancy.n-u tenderloin.n-u tenderness.n-u tenné.n-u tennis.n-u tenoroon.n-u tenor.n-u tension.n-u tenure.n-u termination.n-u terminology.n-u terra_cotta terrain.n-u territory.n-u terrorism.n-u terror.n-u testimony.n-u testing.n-u tetanus.n-u Texan.n-u text.n-u texture.n-u Thai.n-u thankfulness.n-u thanksgiving.n-u theater.n-u theatre.n-u theft.n-u theocracy.n-u theology.n-u therapy.n-u theremin.n-u theta.n-u thickness.n-u thinking.n-u thirst.n-u thread.n-u thrift.n-u thrombosis.n-u throttle.n-u thrust.n-u thunderclap.n-u thunder.n-u thyme.n-u tide.n-u tightness.n-u tile.n-u timber.n-u timbre.n-u timeliness.n-u timidity.n-u timing.n-u timpani.n-u tinder.n-u tinfoil.n-u tin.n-u tinsel.n-u tiredness.n-u tissue.n-u titillation.n-u toast.n-u tobacco.n-u toffee.n-u tofu.n-u togetherness.n-u toil.n-u tolerance.n-u tomatillo.n-u tomato.n-u tomfoolery.n-u tomtom.n-u tom-tom.n-u tonality.n-u tone.n-u tonette.n-u tonnage.n-u tonsillitis.n-u toothache.n-u toothpaste.n-u topography.n-u topsoil.n-u torment.n-u torpor.n-u torque.n-u tort.n-u tortoiseshell.n-u torture.n-u totalitarianism.n-u totality.n-u touch.n-u tourism.n-u tow.n-u town.n-u toxicity.n-u toxicology.n-u toxin.n-u trace.n-u traction.n-u trade.n-u trading.n-u traditionalism.n-u tradition.n-u traffic.n-u tragedy.n-u training.n-u tranquility.n-u tranquillity.n-u transaction.n-u transcendence.n-u transcendentalism.n-u transcription.n-u transference.n-u transfer.n-u transfiguration.n-u transformation.n-u transfusion.n-u transgression.n-u transience.n-u transition.n-u transit.n-u translation.n-u translucence.n-u transmigration.n-u transmission.n-u transmutation.n-u transparency.n-u transpiration.n-u transplantation.n-u transportation.n-u transport.n-u transposition.n-u transubstantiation.n-u trash.n-u trauma.n-u travail.n-u travel.n-u treachery.n-u treacle.n-u treason.n-u treasure.n-u treatment.n-u treaty.n-u trepidation.n-u tres.n-u triangle.n-u tribalism.n-u tribute.n-u trickery.n-u trifle.n-u trigonometry.n-u trim.n-u Trinidadian.n-u tripe.n-u triplicate.n-u triumph.n-u triviality.n-u trombone.n-u tromboon.n-u trompeta.n-u trouble.n-u trout.n-u troy.n-u truancy.n-u trucking.n-u truculence.n-u trumpet.n-u trust.n-u truth.n-u trychel.n-u tuba.n-u tubax.n-u tuberculosis.n-u tubing.n-u tuck.n-u tuition.n-u tumbleweed.n-u tumult.n-u tuna.n-u tundra.n-u tungsten.n-u Tunisian.n-u turbot.n-u turbulence.n-u turf.n-u turkey.n-u Turkish.n-u turmeric.n-u turmoil.n-u turnaround.n-u turnout.n-u turpentine.n-u turpitude.n-u turquoise.n-u tutelage.n-u TV.n-u twaddle.n-u tweed.n-u twilight.n-u twine.n-u twinkle.n-u typhoid.n-u typhus.n-u typography.n-u tyranny.n-u ubiquity.n-u Ugandan.n-u ugliness.n-u Ukrainian.n-u ukulele.n-u umbrage.n-u unanimity.n-u uncertainty.n-u unconsciousness.n-u underbrush.n-u underclothing.n-u undercut.n-u underdevelopment.n-u underestimation.n-u underexposure.n-u undergrowth.n-u underpayment.n-u understatement.n-u undervaluation.n-u underwear.n-u unease.n-u uneasiness.n-u unemployment.n-u unfamiliarity.n-u unhappiness.n-u unification.n-u uniformity.n-u uniqueness.n-u unison.n-u unity.n-u universality.n-u unpleasantness.n-u unpopularity.n-u unpredictability.n-u unreality.n-u unrest.n-u unsuitability.n-u untruth.n-u upbringing.n-u upheaval.n-u upholstery.n-u upkeep.n-u uproar.n-u upsilon.n-u uptake.n-u uranium.n-u urbanity.n-u urbanization.n-u urgency.n-u urine.n-u Uruguayan.n-u usage.n-u usefulness.n-u use.n-u usurpation.n-u usury.n-u utilitarianism.n-u utility.n-u utilization.n-u utopia.n-u utterance.n-u vacancy.n-u vacation.n-u vaccination.n-u vaccine.n-u vacillation.n-u vacuity.n-u vagrancy.n-u vainglory.n-u validity.n-u valour.n-u valuation.n-u value.n-u vandalism.n-u vanilla.n-u vanity.n-u vantage.n-u vaporization.n-u vapour.n-u variability.n-u variance.n-u variation.n-u variety.n-u varnish.n-u varsity.n-u vaseline.n-u vaudeville.n-u veal.n-u vegetation.n-u vehemence.n-u velocity.n-u velour.n-u velvet.n-u vending.n-u veneer.n-u veneration.n-u Venezuelan.n-u vengeance.n-u venison.n-u venom.n-u ventilation.n-u ventriloquism.n-u veracity.n-u verbiage.n-u verbosity.n-u verdure.n-u verification.n-u verisimilitude.n-u vermicelli.n-u vermilion.n-u vermillion.n-u vermin.n-u vermouth.n-u versatility.n-u verse.n-u versification.n-u vertex.n-u vertigo.n-u verve.n-u viability.n-u vibraphone.n-u vibraslap.n-u vibration.n-u vibrato.n-u vice.n-u vicinity.n-u victimization.n-u victory.n-u video.n-u vielle.n-u Vietnamese.n-u vigilance.n-u vigor.n-u vigour.n-u vihuela.n-u vilification.n-u vim.n-u vinaigrette.n-u vindication.n-u vinegar.n-u vintage.n-u vinyl.n-u viola.n-u violation.n-u violence.n-u violin.n-u violoncello.n-u violotta.n-u viol.n-u virginity.n-u viridian.n-u virility.n-u virology.n-u virtue.n-u virtuosity.n-u virulence.n-u virus.n-u viscosity.n-u visibility.n-u vision.n-u vitality.n-u vitriol.n-u vivacity.n-u vivisection.n-u vocabulary.n-u vocation.n-u vodka.n-u volatility.n-u volition.n-u volleyball.n-u voltage.n-u volume.n-u vomit.n-u voodoo.n-u vulgarity.n-u vulnerability.n-u wallpaper.n-u walnut.n-u wanderlust.n-u warfare.n-u warmth.n-u war.n-u warpaint.n-u wartime.n-u washboard.n-u washing.n-u waste.n-u watercolour.n-u watercress.n-u watermelon.n-u water.n-u wattage.n-u wax.n-u weakness.n-u wealth.n-u weariness.n-u weather.n-u wedlock.n-u weedkiller.n-u weed.n-u weightlifting.n-u weight.n-u welfare.n-u well-being.n-u Welsh.n-u westernization.n-u whalebone.n-u wheat.n-u whereabouts.n-u wherewithal.n-u whey.n-u whimsy.n-u whip.n-u whiskey.n-u whisky.n-u whistle.n-u whiteness.n-u white.n-u whitewash.n-u whiting.n-u wholemeal.n-u wholesale.n-u wickedness.n-u wicker.n-u wick.n-u width.n-u wilderness.n-u wildfire.n-u wildlife.n-u willow.n-u willpower.n-u wind.n-u wine.n-u winter.n-u wireless.n-u wire.n-u wiring.n-u wisdom.n-u wisteria.n-u witchcraft.n-u withdrawal.n-u wit.n-u wizardry.n-u woe.n-u womanhood.n-u womankind.n-u wonder.n-u wont.n-u woodcraft.n-u woodland.n-u wood.n-u woodwork.n-u wool.n-u workmanship.n-u work.n-u worry.n-u worship.n-u worsted.n-u worthiness.n-u worth.n-u wrath.n-u wreckage.n-u wrestling.n-u writing.n-u wrongdoing.n-u xalam.n-u xenophobia.n-u xi.n-u xylophone.n-u xylorimba.n-u yam.n-u yarn.n-u yarrow.n-u yeast.n-u Yemeni.n-u yew.n-u yield.n-u yoga.n-u yoghourt.n-u yoghurt.n-u yogurt.n-u yolk.n-u yore.n-u youthfulness.n-u youth.n-u Yugoslavian.n-u Yugoslav.n-u yuletide.n-u zeal.n-u zealotry.n-u zest.n-u zeta.n-u zinc.n-u zoology.n-u link-grammar-4.7.4/data/en/words/words.adv.10000644000175000017500000004246111271121644017561 0ustar bloombloomabjectly ably abnormally abortively abruptly absently absent-mindedly abusively abysmally accidentally accordingly accurately accusingly actively acutely adamantly adequately admirably admiringly adoringly adroitly adversely advisedly affably affectionately afield aggressively agreeably aimlessly airily alarmingly allegretto.e alphabetically ambiguously ambitiously amiably amicably amidships amorously amply amusingly.e analogously analytically anciently.e andante.e angelically angrily anon anonymously anticlockwise anxiously anyplace apace apathetically apologetically appreciably appreciatively approvingly aptly arbitrarily archly ardently arduously arrogantly artfully articulately artificially asexually.e asleep.e assertively assiduously astutely asymmetrically asymptotically atrociously attentively attractively attributively audaciously audibly auspiciously austerely authentically authoritatively autocratically automatically avariciously avidly awake.e awesomely.e awkwardly backstage badly baldly barbarously bareback barebacked barefacedly barefooted.e bashfully beautifully becomingly beforehand begrudgingly.e belatedly belligerently beneficially benevolently benignly biennially bilaterally bitterly blandly blankly blasphemously blatantly bleakly blindly blissfully blithely bloodily.e bluntly boastfully boisterously boldly bombastically boundlessly boyishly bravely brazenly.e breathlessly breezily bright.e brightly brilliantly briskly brusquely brutally buoyantly busily callously calmly candidly cantankerously capably capriciously carefully carelessly casually categorically causally caustically cautiously cavalierly ceaselessly centrally ceremonially ceremoniously chaotically charitably charmingly chattily cheaply cheekily cheerfully cheerily childishly chivalrously chronologically classically clean.e cleanly.e cleverly clinically clockwise closely clumsily coarsely coherently cohesively coldly collectively colloquially colorfully combatively comfortably comfortingly comically commercially communally comparably compassionately competently competitively complacently comprehensively compulsively conceitedly concernedly concisely conclusively concretely concurrently condescendingly conditionally confidently confidingly confusingly.e congenially conjugally conscientiously consciously consecutively conservatively considerably considerately consistently conspicuously constantly constitutionally constructively contemporaneously contemporarily.e contemptuously contentedly continually continuously contrariwise contritely controversially conventionally conversationally convincingly convulsively coolly cooperatively co-operatively copiously cordially correctly correspondingly corruptly counterclockwise courageously courteously covertly coyly craftily crassly crazily.e creatively credibly creditably credulously criminally crisply crookedly cross-legged.e crossly crudely cruelly cryptically culturally cumulatively cunningly cursorily curtly cynically daintily damnably dangerously daringly darkly dashingly deceitfully deceivingly decently deceptively decisively decorously deductively.e deeply defectively defensively deferentially defiantly deftly dejectedly deliberately delicately delightedly delightfully deliriously democratically demoniacally demonstratively demurely densely dentally dependably deplorably derisively descriptively deservedly despairingly desperately despicably despondently destructively detestably detrimentally devilishly deviously devotedly devoutly dexterously diabolically diagonally diametrically didactically differentially diffidently diffusely digitally diligently dimly diplomatically directly disagreeably disappointedly disapprovingly disastrously disconcertingly discourteously discreetly discretely discursively disdainfully disgracefully disgustedly disgustingly dishonestly dishonourably disingenuously dismally disobediently disparagingly dispassionately dispiritedly disproportionately disrespectfully distantly distinctively distinctly distractedly distressingly distrustfully disturbingly diversely divinely dizzily doggedly dogmatically dolefully domestically doubly doubtfully dourly drably drastically dreadfully dreamily drearily drily drowsily drunkenly.e dryly dubiously dumbly dutifully dynamically eagarly.e eagerly earnestly easily eastwards ebulliently ecstatically edgewise eerily efficaciously efficiently effortlessly effusively egotistically elaborately electrically electronically elegantly eloquently embarrassingly eminently emotionally emphatically encouragingly endearingly endlessly energetically engagingly enigmatically enormously enquiringly enterprisingly entertainingly enthusiastically enviously epidurally.e eponymously.e equably equitably erratically erroneously eruditely eternally euphemistically evasively evenly evermore excellently excessively excitedly excitingly exclusively excruciatingly exhaustively exorbitantly expansively expectantly experimentally expertly explicitly explosively.e exponentially expressively expressly exquisitely extemporaneously extensively externally extravagantly exuberantly exultantly facetiously facially.e faintly faithfully falsely famously fanatically fantastically fast.e fastidiously fatally fatuously faultlessly favorably favourably fearfully fearlessly feebly ferociously fervently fervidly feverishly fiendishly fiercely figuratively firmly first-class.e first-hand.e fiscally fitfully fittingly.e flagrantly flamboyantly flashily flawlessly flexibly flippantly flirtatiously fluently fondly foolishly forbiddingly forcefully forcibly forgivingly forlornly formally formidably forthwith fortissimo.e fortnightly.e fortuitously frankly frantically fraternally fraudulently freakishly freely frequently freshly fretfully frigidly friskily frivolously frostily frugally fruitfully fruitlessly full-time.e functionally funnily furiously furtively fussily gaily gainfully gallantly galore gamely garishly gaudily generously genially genteelly gently giddily girlishly gladly gleefully glibly gloatingly globally gloomily gloriously glowingly glumly gorgeously gracefully graciously grandly graphically gratefully gratis gratuitously gravely greedily gregariously grievously grimly grotesquely grudgingly gruffly grumpily guardedly guiltily gushingly habitually half-heartedly halfway.e haltingly handily.e handsomely haphazardly happily happy.e harmoniously harshly hastily hatefully haughtily headlong.e head-on.e heartily heartlessly heatedly helpfully helplessly helter-skelter henceforth hereabouts hereafter hermetically heroically hesitantly hesitatingly hideously higgledy-piggledy high-handedly hilariously hither hitherto hoarsely homeward.e homewards honestly honorably.e honourably hopelessly horizontally horribly horrifically.e hospitably hotly huffily humanely humbly humorously hungrily hurriedly huskily hypocritically hysterically icily identically ideologically idiomatically idly illegally illegibly illegitimately illicitly illustriously imaginatively immaculately immeasurably immensely imminently immodestly immorally impartially impassively impatiently impeccably imperceptibly imperfectly imperially imperiously impertinently impetuously impishly implausibly implicitly imploringly impolitely imposingly impossibly.e impractically.e imprecisely impressively improperly imprudently impudently impulsively inaccurately inadequately inadvertantly inadvertently inanely inappropriately inarticulately.e incessantly incisively inclusively incognito.e incoherently incompetently incompletely inconclusively incongruously inconsiderately inconsistently inconspicuously inconveniently incorrectly incredulously indecently indecisively indefinitely indelibly indifferently indignantly indirectly indiscreetly indiscriminately individually indolently industriously ineffably ineffectively ineffectually inefficiently inelegantly ineptly inescapably inexorably inexpensively inexplicably.e inextricably infamously.e inflexibly informally informatively infrequently ingeniously ingratiatingly inhumanely inimitably innately innocently inoffensively inordinately inorganically inquiringly inquisitively insanely insatiably insecurely insensitively insidiously insightfully insinuatingly insipidly insistently insolently instantaneously instantly instinctively insufferably insufficiently insultingly insuperably integrally intellectually intelligently intelligibly intensely intensively intentionally intently interchangeably interdepartmentally interminably intermittently internally internationally interrogatively intimately intransitively intravenously intrepidly intricately intrinsically intuitively inventively inversely invisibly.e invitingly involuntarily inwardly irately irmly irrationally irregularly irrelevantly irreparably.e irresistibly irresponsibly.e irretrievably irreverently irreversibly irritably jarringly jauntily jealously jerkily jestingly jocosely jocularly jokingly jovially joyfully joyously jubilantly judiciously justly keenly knowingly laboriously lackadaisically laconically lamely landward languidly languorously lasciviously laterally latterly.e laudably laughingly lavishly lawfully lazily learnedly legally legibly legislatively legitimately lengthily lengthways leniently lento.e lethargically lewdly lexically liberally licentiously lifelessly light-headedly light-heartedly lightheartedly.e lightly limply linearly listlessly locally loftily logarithmically longingly longitudinally longways loosely loquaciously loudly lovingly loyally lucidly ludicrously lugubriously lukewarmly luridly lustfully lustily luxuriantly luxuriously lyrically magically magisterially magnanimously magnetically magnificently majestically malevolently maliciously malignantly manageably manfully maniacally manifestly manually markedly marvellously marvelously massively masterfully maternally maturely maximally meagrely meaningfully meanly measurably mechanically mechanistically meditatively meekly melodiously melodramatically memorably menacingly menially mentally mercilessly merrily metaphorically methodically meticulously metrically microscopically mightily mildly militarily mindlessly minimally ministerially minorly.e minutely mirthfully mischievously miserably mistakenly mistrustfully mockingly modestly molten.e momentously monetarily monotonously monstrously moodily morosely mortally mournfully municipally musically musingly mutely mutually naively narrow-mindedly nasally nastily nationally neatly needlessly nefariously negatively negligently nervously neurotically nicely nimbly nobly noisily nonchalantly nonstop.e normally northwards nostalgically noticeably numbly numerically obdurately obediently objectionably objectively obligingly obliquely obnoxiously obscenely obscurely obsequiously observantly obsessively obstinately obstreperously obstructively obtrusively obtusely odiously offensively offhand.e offhandedly officially officiously offstage.e onerously onshore.e onward onwards opaquely openly oppressively optimally optimistically optionally opulently orally organically ornately orthogonally ostentatiously outrageously outspokenly outstandingly outwardly overbearingly overboard overtly overwhelmingly painfully painlessly painstakingly palatably palmately.e palpably parentally parenthetically parochially part-time.e passably passim passionately passively paternally pathetically pathologically patiently patriotically patronizingly peaceably peacefully peculiarly pedantically peevishly pejoratively pell-mell penetratingly pensively perceptibly perceptively perchance peremptorily perenially perennially perfectly perfunctorily perilously permanently perniciously perpetually persistently personally persuasively pervasively perversely pessimistically petulantly phenomenally physically pianissimo.e picturesquely piercingly pig-headedly piously piping.e pithily pitifully pizzicato.e placidly plaintively plausibly playfully pleadingly pleasantly ploddingly pneumatically poetically poignantly point-blank.e pointedly polemically politely pompously ponderously poorly.e popularly portentously positively possessively posthumously potently powerfully precariously precipitously pre-eminently prematurely presently prestissimo.e presumptuously pretentiously previously primitively primly privately proactively.e prodigiously productively profanely professionally proficiently profitably profoundly profusely programmatically.e progressively prohibitively prolifically.e prominently promiscuously promptly prophetically proportionally proportionately prosaically protectively proudly providently provincially.e provisionally provocatively prudently prudishly publicly punctually puritanically purportedly.e purposefully quaintly qualitatively quantitatively quick.e quickly quiescently quietly quixotically quizzically radially radiantly radically rampantly randomly rapidly rapturously rarely.a rashly rationally raucously ravenously readily reassuringly recklessly recognizably redundantly reflectively refreshingly regally regionally regretfully regularly relentlessly reliably religiously reluctantly remorsefully remorselessly remotely repeatably.e repeatedly repentantly repetitively reproachfully reprovingly resentfully resignedly resolutely resoundingly resourcefully respectfully responsibly restively restlessly reticently retroactively retrospectively reverentially reverently rhetorically richly righteously rightfully rigidly rigorously riotously robustly romantically roundly routinely rowdily royally rudely ruefully ruggedly ruthlessly sadistically safely sanctimoniously sarcastically sardonically satirically satisfactorily savagely scantily scathingly sceptically schematically scornfully scot-free scrupulously seamlessly.e seasonally seawards secretively secretly securely sedately seductively selectively selfconsciously self-consciously selfishly selflessly.e sensationally senselessly sensibly sensitively sensuously sentimentally separately sequentially serenely serially seriatim seriously severally shabbily shamefully shamelessly sharply sheepishly shockingly shrewdly shrilly shyly side-saddle silently simple-mindedly sincerely single-handed singlehandedly.e singly skeptically skilfully skillfully sky-high.e skyward skywards slavishly sleepily slickly sloppily slowly sluggishly slyly smartly smilingly smoothly smugly sneeringly.e snobbishly snootily snugly soberly sociably softly solemnly solidly somberly sombrely sonorously soothingly sorely sorrowfully soundly sourly southwards spaciously sparingly sparsely spasmodically speciously spectacularly speedily.e spiritually spitefully splendidly spontaneously sporadically spotlessly spuriously squarely staggeringly staidly starkly statically staunchly steadfastly steadily stealthily steeply sternly stiffly stirringly stochastically stoically stonily stoutly straightforwardly strategically strenuously stridently.e strikingly stringently strong.e strongly stubbornly studiously stuffily stunningly stupendously stupidly sturdily stylishly suavely subconsciously subjectively sublimely subserviently subtly successfully successively succinctly suddenly suggestively suitably sullenly summarily sumptuously superbly superciliously superfluously surgically surpassingly surreptitiously suspiciously sustainably.e sweetly swiftly symbolically symmetrically sympathetically synthetically systematically tacitly tactfully tactically tactlessly tall.e tangibly tartly tastefully tastelessly tauntingly tearfully technically tediously tellingly.e temperamentally temporarily tenaciously tenderly tensely tentatively tenuously terminally terrifically tersely testily theatrically thermally thinly thoroughly thoughtfully thoughtlessly threateningly tightly timidly tirelessly tolerably tolerantly topically transitively transparently.e treacherously tremendously trenchantly tritely triumphantly trivially truculently trustfully typographically unabashedly unambiguously unanimously unashamedly unassumingly unawares unceasingly unceremoniously uncomfortably uncommonly uncomplainingly unconditionally unconsciously uncontrollably unconventionally.e unconvincingly.e uncritically underarm.e underhand undiplomatically uneasily unemotionally unenthusiastically unequally unequivocably unequivocally unerringly unethically unevenly uneventfully unexpectedly unfailingly unfairly unfaithfully unfalteringly unfavorably unfavourably unfeelingly unflinchingly unforgivably ungraciously ungrammatically ungratefully ungrudgingly unhappily unhappy.e unhelpfully unhesitatingly unhurriedly uniformly unilaterally unimaginatively unimpressively unintelligibly unintentionally uninterruptedly uniquely unjustifiably unjustly unknowingly unlawfully unmusically unnecessarily unobtrusively unpleasantly unreliably unreservedly unsatisfactorily unscientifically unscrupulously unseasonably unselfconsciously unselfishly unsparingly unsuccessfully unsurprisingly.e unsuspectingly unthinkingly untruthfully unwaveringly unwillingly unwisely unwittingly uphill.e upright.e uproariously upstage.e upwardly urbanely urgently vacantly vaguely vainly valiantly variously varyingly.e vastly vehemently venomously verbally verbosely vertically vibrantly vicariously viciously victoriously vigilantly vigorously vindictively violently virtuously virulently.e visibly visually vivace vivaciously vividly vocally vociferously voraciously vulgarly wanly warily warmly weakly.e wearily weirdly.e westwards whereabout.e whereabouts.e whimsically wholeheartedly wickedly wildly wilfully willingly wisely wistfully wittily woefully wonderfully worriedly wrongfully wrong-headedly wrongly wryly yearningly young.e zealously zestfully link-grammar-4.7.4/data/en/words/words.v.6.40000644000175000017500000001042111526022265017414 0ustar bloombloomadopting.v airing.v airlifting.v angling.v armoring.v authorising.v averaging.v backfilling.v backing.v backpacking.v badging.v bailing.v banging.v beaming.v beating.v beckoning.v beefing.v bellowing.v benchmarking.v bending.v bicycling.v biking.v binding.v biting.v blaring.v bleeding.v blogging.v bloging.v blowing.v bobbing.v bogging.v boiling.v bolting.v booing.v booting.v boozing.v boring.v bouncing.v bounding.v bowling.v boxing.v branching.v breaking.v breathing.v brightening.v bruising.v brushing.v bucking.v buckling.v building.v bulging.v bumming.v bumping.v bunching.v burning.v busting.v butting.v buttoning.v buzzing.v calming.v camping.v canceling.v canoeing.v captioning.v carving.v cashing.v casting.v catching.v chambering.v changing.v chatting.v cheating.v checking.v cheering.v chewing.v chilling.v chipping.v choking.v chopping.v choreographing.v churning.v cleaning.v climbing.v clogging.v closing.v clouding.v clumping.v coffering.v coiling.v combing.v connecting.v contracting.v cooking.v cooling.v copping.v costuming.v coughing.v counting.v cracking.v cramming.v crossing.v crowding.v crumbling.v crumpling.v crunching.v curling.v dashing.v dematerializing.v dialing.v dialling.v digging.v dining.v dragging.v draining.v dressing.v drinking.v driving.v dropkicking.v dropping.v drowning.v drumming.v drying.v ducking.v dumbing.v easing.v eating.v edging.v emailing.v emceing.v emptying.v evangelizing.v evening.v facing.v fanning.v farming.v fattening.v feeding.v fending.v fetching.v feuding.v filing.v filling.v filtering.v firing.v firming.v fishing.v fisting.v flaring.v flattening.v flavoring.v flipping.v floating.v flooding.v flunking.v flushing.v flying.v folding.v following.v forking.v fouling.v freaking.v freezing.v frenching.v freshening.v frizzing.v frizzling.v fucking.v fueling.v galloping.v gathering.v glazing.v gobbling.v gonging.v grinding.v gulping.v hacking.v hammering.v hanging.v hardwiring.v harkening.v hauling.v heading.v healing.v heating.v herding.v hiding.v hiking.v hitching.v homering.v hooking.v hopping.v hunting.v ironing.v jamming.v jerking.v joining.v jumbling.v jumping.v kayaking.v killing.v knocking.v knotting.v lapping.v lashing.v leading.v leaking.v leaning.v leaping.v leveling.v levelling.v licking.v lightening.v lighting.v limbering.v lining.v livening.v logging.v looping.v loosening.v losing.v marching.v marrying.v matching.v melting.v messing.v missing.v mixing.v mopping.v mounding.v mouthing.v moving.v mucking.v nodding.v oozing.v opening.v optioning.v packing.v pairing.v panning.v parlaying.v partying.v peeing.v peeling.v piling.v pissing.v playing.v ploughing.v plowing.v plucking.v plunging.v pointing.v poking.v popping.v pounding.v prinking.v prying.v puckering.v pulling.v pumping.v quieting.v raking.v reaching.v reeling.v renting.v rerecording.v resizing.v reving.v rewinding.v riding.v ringing.v ripping.v rocking.v rolling.v rooting.v rotoscoping.v rounding.v rubbing.v running.v rushing.v sailing.v sawing.v scoping.v scouting.v scraping.v scratching.v screwing.v scuffing.v sealing.v seguing.v serving.v settling.v sewing.v shaping.v shaving.v shifting.v shipping.v shooting.v shorting.v shrugging.v shushing.v shutting.v signing.v silkscreening.v sketching.v skiing.v skin-diving.v skipping.v sliding.v slipping.v sloughing.v slowing.v smartening.v smashing.v smoothing.v snapping.v snatching.v sneaking.v sniffing.v snorkeling.v snorkelling.v snuffing.v soaking.v sobering.v softening.v spacing.v sparking.v speeding.v spelling.v spilling.v spinning.v spiraling.v spiralling.v spitting.v splicing.v splitting.v spreading.v springing.v sprouting.v sprucing.v squaring.v squeezing.v squirting.v staggering.v stalking.v stamping.v staring.v starring.v starving.v steaming.v sticking.v stiffening.v stirring.v stocking.v storming.v straightening.v stretching.v striking.v stripping.v sucking.v summing.v surfing.v swelling.v swimming.v swinging.v switching.v swotting.v tallying.v tangling.v tapering.v tasking.v thickening.v thinning.v ticking.v tidying.v tightening.v tinkling.v tipping.v tiring.v togging.v toning.v toppling.v tossing.v trailing.v treading.v trimming.v tripping.v tucking.v tumbling.v tuning.v twisting.v typing.v waking.v walking.v warming.v weaving.v weeding.v weighing.v whipping.v whooping.v winding.v winning.v wiping.v working.v wrapping.v zeroing.v link-grammar-4.7.4/data/en/words/entities.us-states.sing0000644000175000017500000000045710750170762022232 0ustar bloombloomAla. Alaska Ariz. Ark. Calif. Colo. Conn. Del.s Fla. Ga. Hawaii Idaho Ill. Ind. Iowa Kan. Ky. La. Md. Ma. Mass. Me. Mich. Minn. Miss. Mo. Mont. Neb. Nev. NH N.H. NJ N.J. NM N.M. NY N.Y. NC N.C. ND N.D. Ohio Okla. Ore. Pa. RI R.I. SC S.C. SD S.D. Tenn. Tex. Texas.s Utah Va. Vt. Wash. WV W.V. Wis. Wy. link-grammar-4.7.4/data/en/words/words.v.10.30000644000175000017500000000220511271202331017456 0ustar bloombloomacknowledged.q-d added.q-d admitted.q-d affirmed.q-d agreed.q-d announced.q-d argued.q-d ascertained.q-d asserted.q-d assumed.q-d believed.q-d bragged.q-d calculated.q-d charged.q-d claimed.q-d commanded.q-d commented.q-d complained.q-d conceded.q-d concluded.q-d confessed.q-d confirmed.q-d contended.q-d continued.q-d decided.q-d declared.q-d deduced.q-d determined.q-d discerned.q-d disclosed.q-d discovered.q-d emphasized.q-d envisioned.q-d exclaimed.q-d explained.q-d figured.q-d guessed.q-d hinted.q-d hoped.q-d implied.q-d inquired.q-d insisted.q-d intimated.q-d learned.q-d maintained.q-d mused.q-d muttered.q-d noted.q-d observed.q-d ordered.q-d pledged.q-d postulated.q-d predicted.q-d presumed.q-d proclaimed.q-d proposed.q-d proved.q-d realized.q-d reasoned.q-d recalled.q-d reckoned.q-d recognized.q-d recounted.q-d reflected.q-d related.q-d remarked.q-d remembered.q-d repeated.q-d replied.q-d reported.q-d resolved.q-d responded.q-d retorted.q-d revealed.q-d ruled.q-d shouted.q-d sighed.q-d speculated.q-d stated.q-d stipulated.q-d stressed.q-d suggested.q-d testified.q-d theorized.q-d thought.q-d threatened.q-d whispered.q-d wondered.q-d link-grammar-4.7.4/data/en/words/words.v.6.30000644000175000017500000001100611526022265017413 0ustar bloombloomadopted.v-d aired.v-d airlifted.v-d angled.v-d armored.v-d authorised.v-d averaged.v-d backed.v-d backfilled.v-d backpacked.v-d badged.v-d bailed.v-d banged.v-d beamed.v-d beckoned.v-d beefed.v-d bellowed.v-d benchmarked.v-d bended.v-d bent.v-d bicycled.v-d biked.v-d blared.v-d bled.v-d bloged.v-d blogged.v-d bobbed.v-d bogged.v-d boiled.v-d bolted.v-d booed.v-d booted.v-d boozed.v-d bored.v-d bounced.v-d bounded.v-d bound.w bowled.v-d boxed.v-d branched.v-d breathed.v-d brightened.v-d bruised.v-d brushed.v-d bucked.v-d buckled.v-d built.v-d bulged.v-d bummed.v-d bumped.v-d bunched.v-d burned.v-d busted.v-d butted.v-d buttoned.v-d buzzed.v-d calmed.v-d camped.v-d canceled.v-d canoed.v-d captioned.v-d carved.v-d cashed.v-d caught.v-d chambered.v-d changed.v-d chatted.v-d cheated.v-d checked cheered.v-d chewed.v-d chilled.v-d chipped.v-d choked.v-d chopped.v-d choreographed.v-d churned.v-d cleaned.v-d climbed.v-d clogged.v-d closed clouded.v-d clumped.v-d coffered.v-d coiled.v-d combed.v-d connected.v-d contracted.v-d cooked.v-d cooled.v-d copped.v-d costumed.v-d coughed.v-d counted.v-d cracked.v-d crammed.v-d crossed.v-d crowded.v-d crumbled.v-d crumpled.v-d crunched.v-d curled.v-d dashed.v-d dealed.v-d dematerialized.v-d dialed.v-d dialled.v-d dined.v-d dragged.v-d drained.v-d dressed.v-d dried.v-d dropkicked.v-d dropped.v-d drowned.v-d drummed.v-d ducked.v-d dug.v-d dumbed.v-d eased.v-d edged.v-d emailed.v-d emceed.v-d emptied.v-d evangelized.v-d evened.v-d faced.v-d fanned.v-d farmed.v-d fattened.v-d fed.v-d fended.v-d fetched.v-d feuded.v-d filed.v-d filled.v-d filtered.v-d fired.v-d firmed.v-d fished.v-d fisted.v-d flared.v-d flattened.v-d flavored.v-d flipped.v-d floated.v-d flooded.v-d flunked.v-d flushed.v-d folded.v-d followed.v-d forked.v-d fouled.v-d freaked.v-d frenched.v-d freshened.v-d frizzed.v-d frizzled.v-d fucked.v-d fueled.v-d galloped.v-d gathered.v-d glazed.v-d gobbled.v-d gonged.v-d grinded.v-d gulped.v-d guttered.v-d hacked.v-d hammered.v-d hanged.v-d hardwired.v-d harkened.v-d hauled.v-d headed.v-d healed.v-d heated.v-d herded.v-d hiked.v-d hitched.v-d homered.v-d hooked.v-d hopped.v-d hung.v-d hunted.v-d ironed.v-d jammed.v-d jerked.v-d joined jumbled.v-d jumped.v-d kayaked.v-d killed.v-d knocked.v-d knotted.v-d lapped.v-d lashed.v-d leaked.v-d leaned.v-d leaped.v-d leapt.v-d led.v-d leveled.v-d levelled.v-d licked.v-d lightened.v-d limbered.v-d lined.v-d lit.v-d livened.v-d logged.v-d looped.v-d loosened.v-d lost.v-d marched.v-d married.v-d matched.v-d melted.v-d messed.v-d missed.v-d mixed.v-d mopped.v-d mounded.v-d mouthed.v-d moved.v-d mucked.v-d nodded.v-d oozed.v-d opened.v-d optioned.v-d packed.v-d paired.v-d panned.v-d parlayed.v-d partied.v-d peeed.v-d peeled.v-d piled pissed.v-d played.v-d ploughed.v-d plowed.v-d plucked.v-d plunged.v-d pointed.v-d poked.v-d pooped.v-d popped.v-d pounded.v-d pried.v-d prinked.v-d puckered.v-d pulled.v-d pumped.v-d quieted.v-d raked.v-d reached.v-d reeled.v-d rented.v-d rerecorded.v-d resized.v-d revved.v-d rewound.v-d ripped.v-d rocked.v-d rolled.v-d rooted.v-d rotoscoped.v-d rounded.v-d rubbed.v-d rushed.v-d sailed.v-d sawed.v-d scoped.v-d scouted.v-d scraped.v-d scratched.v-d screwed.v-d scuffed.v-d sealed.v-d segued.v-d served.v-d settled.v-d sewed.v-d shaped.v-d shaved.v-d shifted.v-d shipped.v-d shorted.v-d shot.v-d shrugged.v-d shushed.v-d signed.v-d silkscreened.v-d sketched.v-d skied.v-d skin-dived.v-d skin-dove.v-d skipped.v-d slid.v-d slipped.v-d sloughed.v-d slowed.v-d smartened.v-d smashed.v-d smoothed.v-d snapped.v-d snatched.v-d sneaked.v-d sniffed.v-d snorkeled.v-d snorkelled.v-d snuffed.v-d soaked.v-d sobered.v-d softened.v-d spaced.v-d sparked.v-d spat.v-d sped.v-d speeded.v-d spelled.v-d spelt.v-d spilled.v-d spiraled.v-d spiralled.v-d spitted.v-d spliced.v-d sprouted.v-d spruced.v-d spun.v-d squared.v-d squeezed.v-d squirted.v-d staggered.v-d stamped.v-d stared.v-d starred.v-d starved.v-d steamed.v-d stiffened.v-d stirred.v-d stocked.v-d stormed.v-d straightened.v-d stretched.v-d stripped.v-d struck.v-d stuck.v-d sucked.v-d summed.v-d surfed.v-d swam.v-d swelled.v-d swinged.v-d switched.v-d swotted.v-d swung.v-d tallied.v-d tangled.v-d tapered.v-d tasked.v-d thickened.v-d thinned.v-d ticked.v-d tidied.v-d tightened.v-d tinkled.v-d tipped.v-d tired.v-d togged.v-d toned.v-d toppled.v-d tossed.v-d trailed.v-d treaded.v-d trimmed.v-d tripped.v-d tucked.v-d tumbled.v-d tuned.v-d twisted.v-d typed.v-d waked.v-d walked.v-d warmed.v-d weeded.v-d weighed.v-d whipped.v-d whooped.v-d winded.v-d wiped.v-d won.v-d worked.v-d wound.w wrapped.v-d zeroed.v-d link-grammar-4.7.4/data/en/words/words.v.2.10000644000175000017500000003215011526022265017410 0ustar bloombloomabdicate.v abide.v abort.v abrade.v accelerate.v acclimate.v acclimatize.v acculturate.v accumulate.v acidify.v adapt.v adjourn.v adjudicate.v adjust.v advance.v advertise.v aerosolize.v affiliate.v age.v agglutinate.v aggregate.v agitate.v aglomerate.v ail.v align.v aliment.v alkalify.v ally.v alternate.v alter.v amalgamate.v Americanize.v anastomose.v anchor.v anergize.v ankylose.v antevert.v apostrophize.v appeal.v applaud.v applicate.v apply.v approach.v approximate.v arbitrate.v arborize.v arch.v articulate.v arylate.v ascend.v assemble.v assimilate.v assist.v associate.v attend.v audition.v augur.v autoactivate.v autocatalyze.v autocorrelate.v autodigest.v autolyze.v automatize.v autophosphorylate.v autosensitize.v autotransfuse.v avail.v awaken.v axenize.v bag.v band.v bank.v bargain.v barter.v bathe.v bath.v bat.v baulk.v benefit.v berth.v bicompartmentalize.v bifurcate.v bioaccumulate.v biotest.v blab.v blacken.v blackleg.v blanch.v blaspheme.v bleach.v blend.v blink.v blister.v bluff.v blur.v boggle.v bond.v bone.v bootleg.v bop.v border.v borrow.v botanize.v bottle-feed.v bowdlerize.v breastfeed.v breed.v brew.v bridle.v broaden.v broil.v bronchodilate.v brown.v brux.v budge.v buffet.v bugger.v bully.v burglarize.v burgle.v burnish.v burrow.v cable.v calcify.v calcine.v camber.v cancerize.v canvass.v capitalize.v capsize.v carp.v catabolize.v catenate.v cationize.v celebrate.v center.v centre.v chant.v char.v chelate.v circle.v circulate.v clang.v clap.v clasp.v clavelize.v cleave.v click.v clinch.v clink.v clot.v cloy.v clutch.v coacervate.v coach.v coagglutinate.v coaggregate.v coagulate.v coamplify.v coarctate.v coarsen.v coax.v codistribute.v coextract.v cofractionate.v cogitate.v coincubate.v coinject.v coinsure.v collapse.v collimate.v co-localise.v colocalise.v co-localize.v colocalize.v combine.v cometabolize.v commence.v commingle.v communicate.v commute.v compare.v compensate.v compose.v compute.v concentrate.v conceptualize.v condense.v conduct.v confederate.v confer.v confide.v congest.v conjoin.v conjugate.v consolidate.v constipate.v consult.v contest.v contrast.v contribute.v convene.v convert.v copartition.v coprecipitate.v copurify.v coregister.v correlate.v corrode.v corrugate.v corrupt.v cosediment.v costain.v co-star.v costar.v couch.v counter-attack.v counterattack.v counterindicate.v countermine.v crash-land.v crash.v crave.v crease.v creosote.v crib.v crinkle.v crisscross.v crochet.v croon.v cross-check.v crosscheck.v cross_fertilize crosslink.v cryosection.v crystallize.v cuddle.v cumulate.v curdle.v curse.v curve.v dab.v damp.v dangle.v dap.v darken.v darn.v date.v de-acidify.v deacidify.v de-adapt.v deadapt.v de-aggregate.v deaggregate.v de-alcoholize.v dealcoholize.v de-allergize.v deallergize.v debark.v debate.v de-bond.v debond.v de-branch.v debranch.v decelerate.v de-cidualize.v decidualize.v de-clamp.v declamp.v decompose.v de-condense.v decondense.v de-condition.v decondition.v de-congest.v decongest.v de-conjugate.v deconjugate.v de-construct.v deconstruct.v decrease.v de-crepitate.v decrepitate.v de-differentiate.v dedifferentiate.v deepen.v de-epithelialize.v deepithelialize.v de-fibrinogenate.v defibrinogenate.v deflect.v de-fluorinate.v defluorinate.v de-glove.v deglove.v de-glycosylate.v deglycosylate.v de-granulate.v degranulate.v de-humidify.v dehumidify.v de-iodinate.v deiodinate.v delay.v delight.v de-masculinize.v demasculinize.v democratize.v de-morphinize.v demorphinize.v de-naturate.v denaturate.v departmentalize.v de-phase.v dephase.v de-polarize.v depolarize.v de-polymerize.v depolymerize.v de-proteinize.v deproteinize.v de-quench.v dequench.v derail.v derive.v derogate.v de-saturate.v desaturate.v descend.v de-squamate.v desquamate.v de-stabilize.v destabilize.v de-synchronize.v desynchronize.v detonate.v de-toxify.v detoxify.v develop.v de-vitrify.v devitrify.v dialyze.v dichotomize.v dictate.v differentiate.v diffuse.v digest.v digitalize.v digitilize.v dilate.v dimerize.v diminish.v dim.v din.v dip.v disarm.v disarticulate.v disband.v discase.v discharge.v discolor.v discontinue.v disengage.v disentangle.v disincorporate.v disinflate.v disjoin.v dismount.v dispense.v disperse.v dissimulate.v dissipate.v dissolve.v distend.v distill.v distinguish.v disunite.v dive-bomb.v diversify.v diverticulize.v divine.v dock.v dodge.v dogmatize.v dorsalize.v dorsiflex.v double-click.v downsize.v dread.v dribble.v drill.v drip.v droop.v dull.v dynamize.v dysmyelinate.v echo.v efflux.v effuse.v ejaculate.v eject.v elaborate.v electroblot.v electrocoagulate.v electrodialyze.v electroejaculate.v electrofocus.v electrotype.v elongate.v embolize.v embrittle.v embroider.v emplane.v encapsidate.v encyst.v endocytose.v endothelialize.v endure.v end.v engage.v engorge.v enlist.v enroll.v enrol.v entertain.v enter.v entrench.v enunciate.v epimerize.v epoxidate.v erode.v escalate.v escape.v esterize.v etch.v etiolate.v euhydrate.v evacuate.v evolve.v exaggerate.v excyst.v exercise.v exfoliate.v exhale.v exogastrulate.v expand.v expectorate.v explode.v explore.v expound.v express.v extemporize.v extend.v extrapolate.v extravasate.v exuviate.v famish.v farrow.v fasten.v feast.v federate.v ferment.v ferry.v fibrillate.v fiddle.v field.v film.v fissurate.v fistulize.v fixate.v flag.v flap.v flash.v fledge.v flee.v flex.v flocculate.v floc.v floss.v fluidify.v fluorinate.v focalize.v focus.v foliate.v foot.v forbear.v force-land.v foreclose.v forgive.v form.v founder.v foveate.v fracture.v fray.v front.v frost.v fructify.v fudge.v fulgurate.v fumble.v furl.v fuse.v gag.v gain.v gamble.v gam.v gant.v gargle.v gasify.v gasp.v gazump.v gelatinize.v generalize.v germinate.v gestate.v gimp.v glance.v globalize.v gloss.v glucoronize.v glucosylate.v gnash.v gnaw.v govern.v granulate.v grasp.v grate.v grieve.v groan.v grope.v group.v growl.v grumble.v grunt.v hail.v haploidize.v harden.v harmonize.v hatch.v heave.v heckle.v hector.v hedge.v heighten.v hemagglutinate.v hemoagglutinate.v hemocoagulate.v hemolyze.v hem.v heterotransplant.v hoard.v hoe.v honk.v hoot.v howl.v hug.v humidify.v hum.v hush.v hustle.v hybridize.v hydrate.v hydrolyze.v hyperarticulate.v hypercoagulate.v hyperhydrate.v hyperinflate.v hypermodify.v hyperphosphorylate.v hyperpolarize.v hyperproliferate.v hypersensitize.v hyperventilate.v hypohydrate.v hypomethylate.v hyposecrete.v hypoventilate.v ice.v idle.v ignite.v immunomodulate.v immunoprecipitate.v implode.v imprecate.v improve.v improvise.v incept.v incline.v incorporate.v increase.v incubate.v indent.v indulge.v indurate.v industrialize.v infibulate.v infold.v infringe.v inhale.v initiate.v inosculate.v insonate.v intensify.v interbreed.v interconnect.v intercorrelate.v interlock.v intermix.v intern.v interpenetrate.v interpret.v interrelate.v interrupt.v intersect.v intertwine.v interview.v intravasate.v intrigue.v intussuscept.v invaginate.v investigate.v invest.v invigilate.v iodize.v ionize.v isograft.v isomerize.v jab.v jag.v jangle.v jeer.v jiggle.v jig.v jingle.v jolt.v jostle.v juggle.v keratinize.v kid.v kindle.v knit.v labilize.v labor.v labour.v lactonize.v lament.v land.v latch.v lateralize.v launch.v lecture.v left-click.v lengthen.v lessen.v levitate.v ligand.v liquefy.v liquidate.v litigate.v litter.v lobby.v lobulate.v localise.v localize.v locate.v lodge.v luminesce.v lunch.v luteinize.v lyse.v macerate.v mainline.v maldigest.v malrotate.v maneuver.v manoeuvre.v marbleize.v marinate.v mass.v masturbate.v mate.v medialize.v mediate.v meet.v meld.v meliorate.v mend.v merge.v mesh.v metallize.v metricize.v micellize.v microembolize.v microencapsulate.v mill.v mime.v mine.v misalign.v misarticulate.v miscalculate.v miscarry.v miscount.v misdeal.v misfold.v misjudge.v mistime.v mist.v misunderstand.v moan.v mobilize.v moderate.v modernize.v moisten.v moon.v mottle.v mould.v moult.v mount.v mourn.v mow.v muddle.v multimerize.v multiplicate.v multiply.v mumble.v munch.v murmur.v muscularize.v mutate.v myelinate.v narrow.v navigate.v near.v necrotize.v negotiate.v nephrectomize.v nibble.v nip.v nitrogenize.v nucleate.v nuzzle.v obey.v obsess.v occlude.v ogle.v opacify.v operate.v opsonize.v orbit.v originate.v ossify.v outspan.v overarch.v overbalance.v overcall.v overcharge.v overcloud.v overdraw.v overdress.v overfeed.v overfill.v overflow.v overheat.v over-indulge.v overindulge.v overlap.v overproduce.v overproliferate.v overreach.v overreplicate.v oversecrete.v overspend.v overstretch.v overtrain.v overtranscribe.v overtrump.v overturn.v overwork.v oviposit.v oxidate.v oxidize.v pace.v paddle.v parade.v park.v parse.v particularize.v part.v passivize.v pathergize.v peal.v peck.v peculate.v pedal.v peddle.v pend.v penetrate.v peptonize.v perch.v perform.v peroxidize.v petition.v petrify.v phenolize.v phlebotomize.v photodegrade.v photodissociate.v photoisomerize.v photolyze.v photooxidize.v photoreactivate.v picket.v pillage.v pinocytose.v pioneer.v pitch.v placer.v plasticize.v plunder.v poach.v poise.v poll.v pose.v power-dive.v practise.v preach.v preactivate.v precontract.v preincubate.v preplan.v presurface.v pretest.v pringle.v privatize.v programme.v project.v promenade.v pronate.v proof_read proofread.v propagate.v protonate.v prowl.v pseudonormalize.v puke.v puncture.v punt.v purl.v pustulate.v putt.v puzzle.v qualify.v quicken.v quieten.v racemize.v race.v radiate.v radio.v rally.v ramify.v rancidify.v range.v rank.v rap.v rate.v rattle.v ravel.v reactivate.v reacylate.v readapt.v readjust.v reanneal.v reapply.v rearm.v rearrest.v rear.v reassemble.v reawaken.v rebleed.v rebreathe.v rebreed.v rebuild.v recalculate.v recant.v recapitulate.v recap.v receive.v recement.v recharge.v reciprocate.v recolonize.v recommence.v recompute.v reconfirm.v reconnect.v reconvene.v reconvert.v recover.v recross.v recruit.v recrystallize.v recurve.v redden.v redifferentiate.v redissolve.v redouble.v reelevate.v reendothelialize.v reenter.v reepithelialize.v reequilibrate.v reeve.v reexpand.v refer.v refit.v reflate.v refloat.v refocus.v re-form.v reform.v refreeze.v refuel.v ref.v regenerate.v register.v regroup.v regrow.v rehearse.v rehydrate.v reincorporate.v reincubate.v reinduce.v reinflate.v reinfuse.v reinvestigate.v reinvest.v reirradiate.v rekindle.v relate.v relax.v relocate.v remarry.v remeasure.v remineralize.v remit.v remobilize.v remount.v renegotiate.v reocclude.v re-open.v reopen.v reoperate.v reorder.v reorganize.v reoxidize.v repack.v repair.v rephosphorylate.v repolarize.v reprise.v reprobe.v reproduce.v reseed.v resensitize.v resettle.v resign.v respirate.v restart.v restitute.v resume.v resuscitate.v retail.v retest.v rethrombose.v retire.v retool.v retrotranspose.v retrude.v return.v reunify.v reunite.v reventilate.v reverse.v revive.v rhyme.v ricochet.v right-click.v rigidify.v roam.v roar.v roast.v rotate.v rouse.v row.v ruffle.v rupture.v rustle.v sacrifice.v salute.v saponify.v scan.v scatter.v scissor.v sclerose.v scoff.v scold.v score.v scramble.v scrawl.v scribble.v scrub.v scull.v sculpture.v search.v seize.v senesce.v separate.v serrate.v sever.v shade.v sham.v shatter.v shell.v shop-lift.v shoplift.v short-circuit.v shorten.v shove.v shower.v shriek.v shrink.v shuffle.v sift.v singe.v sink.v sinusoidalize.v sip.v skeletonize.v skew.v slam.v slant.v sledge.v slenderize.v slosh.v smack.v smear.v smoke.v smudge.v snarl.v snip.v snort.v snuggle.v socialize.v solidify.v somatize.v sow.v spalt.v spatter.v spawn.v spiralize.v splash.v splay.v splinter.v spoil.v sponge.v sport.v spout.v spreadeagle.v spring-clean.v spy.v squash.v stabilise.v stabilize.v stain.v stall.v stammer.v stampede.v steady.v steepen.v steep.v steer.v stew.v stifle.v sting.v stint.v stipple.v stonewall.v strain.v stratify.v streak.v strengthen.v strobe.v strum.v stump.v subcontract.v subdivide.v subduct.v sublease.v submerge.v submit.v substitute.v succeed.v sue.v suffer.v suffocate.v summate.v superheat.v superinfect.v superovulate.v supervise.v supinate.v supplicate.v surrender.v survive.v swallow.v swap.v sway.v sweat.v swish.v swivel.v synchronize.v synergize.v tackle.v tan.v tap.v tarnish.v tautomerize.v telephone.v terminate.v tetramerize.v thaw.v thermalize.v thieve.v thrash.v thresh.v thrill.v thrombose.v throng.v throttle.v thrum.v thump.v thunder.v tickle.v tilt.v tine.v ting.v titivate.v titrate.v toast.v toot.v trace.v trade.v transaminate.v transcomplement.v transcytose.v transfer.v transgress.v translate.v transplant.v trawl.v treat.v treble.v triage.v trimerize.v trot.v troubleshoot.v trumpet.v trump.v tuberculize.v tug.v tum.v twang.v twirl.v ulcerate.v umpire.v unbend.v uncoat.v uncoil.v uncurl.v underbid.v undercorrect.v underfeed.v underprescribe.v underreport.v underspend.v undress.v unfasten.v unfold.v unhitch.v unify.v unionize.v unite.v unknot.v unload.v unlock.v unpack.v unravel.v unroll.v unscrew.v unstress.v untie.v untwist.v unwind.v unwrap.v upload.v urbanize.v vaporize.v varicellize.v vary.v vasodilate.v venture.v versify.v vert.v vesicate.v vesiculate.v vest.v vibrate.v visit.v vitrify.v vituperate.v vociferate.v volatilize.v volley.v vomit.v wade.v waggle.v wag.v wail.v waken.v warp.v water.v wax.v weaken.v wed.v weld.v wheal.v wheel.v whine.v whirl.v whistle.v whiten.v whittle.v whorl.v widen.v wiggle.v withdraw.v worsen.v worship.v wrestle.v wrinkle.v yell.v yield.v yodel.v link-grammar-4.7.4/data/en/words/entities.given-female.sing0000644000175000017500000011124711250025671022633 0ustar bloombloomAbbey.f Abbie.f Abby.f Abigail.f Ada.f Adah.f Adaline.f Adda.f Addie.f Adela.f Adelaida.f Adelaide.f Adele.f Adelia.f Adelina.f Adeline.f Adell.f Adella.f Adelle.f Adena.f Adina.f Adline.f Adria.f Adriana.f Adriane.f Adrianna.f Adrianne.f Adriene.f Adrienne.f Afton.f Agatha.f Aggie.f Agnes.f Agnus.f Agripina.f Agueda.f Agustina.f Ai.f Aida.f Aide.f Aiko.f Aileen.f Ailene.f Aimee.f Aisha.f Aja.f Akiko.f Akilah.f Alaina.f Alaine.f Alana.f Alane.f Alanna.f Alayna.f Alba.f Alberta.f Albertha.f Albertina.f Albertine.f Albina.f Alcie.f Alda.f Aldona.f Alease.f Alecia.f Aleen.f Aleida.f Aleisha.f Alejandra.f Alejandrina.f Alena.f Alene.f Alesha.f Aleshia.f Alesia.f Alessandra.f Aleta.f Aletha.f Alethea.f Alethia.f Alexa.f Alexandra.f Alexandria.f Alexia.f Alfreda.f Alfredia.f Alia.f Alica.f Alice.f Alicia.f Alida.f Alina.f Aline.f Alisa.f Alise.f Alisha.f Alishia.f Alisia.f Alison.f Alissa.f Alita.f Aliza.f Alla.f Alleen.f Allegra.f Allena.f Allene.f Allie.f Alline.f Allison.f Allyn.f Allyson.f Alma.f Almeda.f Almeta.f Almira.f Almyra.f Alona.f Alpha.f Alta.f Altagracia.f Altha.f Althea.f Alvena.f Alvera.f Alverta.f Alvina.f Alvira.f Alyce.f Alycia.f Alys.f Alysa.f Alyse.f Alysha.f Alysia.f Alyson.f Alyssa.f Amada.f Amalia.f Amanda.f Amber.f Amberly.f Amee.f Amelia.f America.f Ami.f Amie.f Amiee.f Amina.f Amira.f Ammie.f Amparo.f Amy.f An.f Ana.f Anabel.f Analisa.f Anamaria.f Anastacia.f Anastasia.f Andera.f Andra.f Andree.f Andria.f Anette.f Angela.f Angele.f Angelena.f Angeles.f Angelia.f Angelic.f Angelica.f Angelika.f Angelina.f Angeline.f Angelique.f Angelita.f Angella.f Angelyn.f Angie.f Angila.f Angla.f Angle.f Anglea.f Anh.f Anika.f Anisa.f Anisha.f Anissa.f Anita.f Anitra.f Anja.f Anjanette.f Anjelica.f Ann.f Anna.f Annabel.f Annabell.f Annabelle.f Annalee.f Annalisa.f Annamae.f Annamaria.f Annamarie.f Anne.f Anneliese.f Annelle.f Annemarie.f Anner.f Annett.f Annetta.f Annette.f Annice.f Annie.f Annika.f Annis.f Annita.f Annmarie.f Antionette.f Antoinette.f Antonetta.f Antonette.f Antonietta.f Antonina.f Anya.f Apolonia.f April.f Apryl.f Ara.f Araceli.f Aracelis.f Aracely.f Araminta.f Arcelia.f Ardath.f Ardelia.f Ardell.f Ardella.f Ardelle.f Ardis.f Ardith.f Aretha.f Argelia.f Argentina.f Aria.f Ariana.f Ariane.f Arianna.f Arianne.f Arica.f Arie.f Arielle.f Arizona.f Arla.f Arlean.f Arleen.f Arlena.f Arlene.f Arletha.f Arletta.f Arlette.f Arlinda.f Arline.f Arlyne.f Armanda.f Armandina.f Armida.f Arminda.f Arminta.f Arnetta.f Arnette.f Arnita.f Arrie.f Artie.f Arvilla.f Asha.f Ashanti.f Ashely.f Ashlea.f Ashlee.f Ashleigh.f Ashli.f Ashlie.f Ashly.f Ashlyn.f Asia.f Asley.f Assunta.f Astrid.f Asuncion.f Atha.f Athena.f Audie.f Audra.f Audrea.f Audria.f Audrie.f Audry.f Augusta.f Augustina.f Aundrea.f Aura.f Aurea.f Aurelia.f Aurora.f Aurore.f Autumn.f Ava.f Avelina.f Avie.f Avis.f Avril.f Awilda.f Ayako.f Ayana.f Ayanna.f Ayesha.f Azalee.f Azucena.f Azzie.f Babara.f Babette.f Bailey.f Bama.f Bambi.f Bao.f Barabara.f Barb.f Barbar.f Barbara.f Barbera.f Barbie.f Barbra.f Bari.f Barrie.f Basilia.f Bea.f Beata.f Beatrice.f Beatris.f Beatriz.f Beaulah.f Bebe.f Becki.f Beckie.f Becky.f Bee.f Belen.f Belia.f Belinda.f Belkis.f Bella.f Belle.f Belva.f Bena.f Benita.f Berdie.f Berenice.f Berna.f Bernadette.f Bernadine.f Bernarda.f Bernardina.f Bernardine.f Berneice.f Bernetta.f Bernice.f Berniece.f Bernita.f Berta.f Bertha.f Bertie.f Beryl.f Bess.f Besse.f Bessie.f Beth.f Bethanie.f Bethann.f Bethany.f Bethel.f Betsey.f Betsy.f Bette.f Bettie.f Bettina.f Betty.f Bettyann.f Bettye.f Beula.f Beulah.f Bev.f Beverlee.f Beverley.f Beverly.f Bianca.f Bibi.f Billi.f Billye.f Bina.f Bird.f Birdie.f Birgit.f Birtha.f Birtie.f Blanca.f Blanch.f Blanche.f Blondell.f Blossom.f Blythe.f Bobbi.f Bobbye.f Bobette.f Bok.f Bong.f Bonita.f Bonnie.f Bonny.f Branda.f Brande.f Brandee.f Brandi.f Brandie.f Brandy.f Breana.f Breann.f Breanna.f Breanne.f Bree.f Brenda.f Brenna.f Briana.f Brianna.f Brianne.f Bridget.f Bridgett.f Bridgette.f Brigette.f Brigid.f Brigida.f Brigitte.f Brinda.f Britany.f Britney.f Britni.f Britta.f Brittaney.f Brittani.f Brittanie.f Brittany.f Britteny.f Brittney.f Brittni.f Brittny.f Bronwyn.f Brook.f Brooke.f Bruna.f Brunilda.f Bryanna.f Brynn.f Buena.f Buffy.f Bula.f Bulah.f Bunny.f Burma.f Burnice.f Caddie.f Caitlin.f Caitlyn.f Calandra.f Caldonia.f Calista.f Calla.f Callie.f Camelia.f Camellia.f Cami.f Camie.f Camila.f Camilla.f Camille.f Cammie.f Cammy.f Candace.f Candance.f Candelaria.f Candi.f Candice.f Candida.f Candie.f Candis.f Candra.f Candy.f Candyce.f Caprice.f Cara.f Caren.f Cari.f Caridad.f Carie.f Carin.f Carina.f Carisa.f Carissa.f Carita.f Carla.f Carlee.f Carleen.f Carlena.f Carlene.f Carletta.f Carley.f Carli.f Carlie.f Carline.f Carlita.f Carlota.f Carlotta.f Carly.f Carlyn.f Carma.f Carman.f Carmel.f Carmela.f Carmelia.f Carmelina.f Carmelita.f Carmella.f Carmina.f Carmon.f Carola.f Carolann.f Carole.f Carolee.f Carolin.f Carolina.f Caroline.f Caroll.f Carolyn.f Carolyne.f Carolynn.f Caron.f Caroyln.f Carra.f Carri.f Carrie.f Carry.f Caryl.f Carylon.f Caryn.f Casandra.f Casie.f Casimira.f Cassandra.f Cassaundra.f Cassey.f Cassi.f Cassidy.f Cassie.f Cassondra.f Cassy.f Catalina.f Catarina.f Caterina.f Catharine.f Catherin.f Catherina.f Catherine.f Cathern.f Catheryn.f Cathey.f Cathi.f Cathie.f Cathleen.f Cathrine.f Cathryn.f Cathy.f Catina.f Catrice.f Catrina.f Cayla.f Cecelia.f Cecila.f Cecile.f Cecilia.f Cecille.f Cecily.f Celena.f Celesta.f Celeste.f Celestia.f Celestina.f Celestine.f Celia.f Celie.f Celina.f Celinda.f Celine.f Celsa.f Ceola.f Chae.f Chan.f Chana.f Chanda.f Chandra.f Chanel.f Chanell.f Chanelle.f Chaney.f Chanie.f Chantal.f Chantay.f Chante.f Chantel.f Chantell.f Chantelle.f Chara.f Charis.f Charise.f Charissa.f Charisse.f Charita.f Charity.f Charla.f Charleen.f Charlena.f Charlene.f Charlesetta.f Charlette.f Charline.f Charlott.f Charlotta.f Charlotte.f Charlottie.f Charlsie.f Charlyn.f Charmain.f Charmaine.f Charolette.f Chasidy.f Chasity.f Chassidy.f Chastity.f Chau.f Chaya.f Chelsea.f Chelsey.f Chelsie.f Cher.f Chere.f Cheree.f Cherelle.f Cheri.f Cherie.f Cherilyn.f Cherise.f Cherish.f Cherly.f Cherlyn.f Cherri.f Cherrie.f Cherry.f Cherryl.f Chery.f Cheryl.f Cheryle.f Cheryll.f Cheyenne.f Chia.f Chieko.f Chimere.f Chin.f China.f Ching.f Chiquita.f Chloe.f Chrissie.f Chrissy.f Christa.f Christal.f Christeen.f Christel.f Christen.f Christena.f Christene.f Christi.f Christia.f Christiana.f Christiane.f Christie.f Christin.f Christina.f Christine.f Christinia.f Christy.f Chrystal.f Chu.f Chun.f Ciara.f Cicely.f Ciera.f Cierra.f Cinda.f Cinderella.f Cindi.f Cindie.f Cindy.f Cinthia.f Cira.f Claire.f Clara.f Clarabelle.f Clare.f Claretha.f Claretta.f Claribel.f Clarice.f Clarinda.f Clarine.f Claris.f Clarisa.f Clarissa.f Clarita.f Classie.f Claudette.f Claudia.f Claudie.f Claudine.f Clelia.f Clella.f Clemencia.f Clementina.f Clementine.f Clemie.f Clemmie.f Cleopatra.f Cleora.f Cleotilde.f Cleta.f Clora.f Clorinda.f Clotilde.f Clyda.f Codi.f Coleen.f Colene.f Coletta.f Colette.f Colleen.f Collen.f Collene.f Collette.f Concepcion.f Conception.f Concetta.f Concha.f Conchita.f Constance.f Consuela.f Consuelo.f Contessa.f Cora.f Coral.f Coralee.f Coralie.f Corazon.f Corda.f Cordelia.f Cordella.f Cordia.f Cordie.f Coreen.f Corene.f Coretta.f Cori.f Corie.f Corina.f Corine.f Corinna.f Corinne.f Corliss.f Cornelia.f Corrie.f Corrin.f Corrina.f Corrine.f Corrinne.f Cortney.f Creola.f Cris.f Criselda.f Crissy.f Crista.f Cristal.f Cristen.f Cristi.f Cristie.f Cristin.f Cristina.f Cristine.f Cristy.f Crysta.f Crystal.f Crystle.f Cuc.f Cyndi.f Cyndy.f Cynthia.f Cyrstal.f Cythia.f Dacia.f Dagmar.f Dagny.f Dahlia.f Daina.f Daine.f Daisey.f Daisie.f Daisy.f Dakota.f Dalene.f Dalia.f Dalila.f Damaris.f Danae.f Danelle.f Danette.f Dani.f Dania.f Danica.f Daniela.f Daniele.f Daniell.f Daniella.f Danielle.f Danika.f Danille.f Danita.f Dann.f Danna.f Dannette.f Dannielle.f Danuta.f Danyel.f Danyell.f Danyelle.f Daphine.f Daphne.f Dara.f Darby.f Darcel.f Darcey.f Darci.f Darcie.f Darcy.f Daria.f Darla.f Darleen.f Darlena.f Darlene.f Darline.f Davida.f Davina.f Dawn.f Dawna.f Dawne.f Dayle.f Dayna.f Dayse.f Daysi.f Deadra.f Deana.f Deandra.f Deandrea.f Deane.f Deann.f Deanna.f Deanne.f Deb.f Debbi.f Debbie.f Debbra.f Debby.f Debera.f Debi.f Debora.f Deborah.f Debra.f Debrah.f Debroah.f Dede.f Dedra.f Deeann.f Deeanna.f Deedee.f Deedra.f Deena.f Deetta.f Deidra.f Deidre.f Deirdre.f Deja.f Delaine.f Delana.f Delcie.f Delena.f Delfina.f Delia.f Deliah.f Delicia.f Delila.f Delilah.f Delina.f Delinda.f Delisa.f Dell.f Della.f Dellar.f Delle.f Delma.f Delmy.f Delois.f Deloise.f Delora.f Deloras.f Delores.f Deloris.f Delorse.f Delpha.f Delphia.f Delphine.f Delsie.f Delta.f Demetra.f Demetria.f Demetrice.f Dena.f Denae.f Deneen.f Denese.f Denice.f Denise.f Denisha.f Denisse.f Denita.f Denna.f Dennise.f Denyse.f Deonna.f Desirae.f Desire.f Desiree.f Despina.f Dessa.f Dessie.f Destiny.f Detra.f Devona.f Devora.f Devorah.f Dia.f Diamond.f Dian.f Diana.f Diane.f Diann.f Dianna.f Dianne.f Dicie.f Dicy.f Diedra.f Diedre.f Dierdre.f Digna.f Dillie.f Dimple.f Dina.f Dinah.f Dinorah.f Dione.f Dionna.f Dionne.f Divina.f Dixie.f Docia.f Dodie.f Dollie.f Dolly.f Dolores.f Doloris.f Domenica.f Dominga.f Dominica.f Dominque.f Domitila.f Domonique.f Dona.f Donella.f Donetta.f Donette.f Donia.f Donie.f Donita.f Donna.f Donnetta.f Donnette.f Donya.f Dora.f Dorathy.f Dorcas.f Doreatha.f Doreen.f Dorene.f Doretha.f Dorethea.f Doretta.f Dori.f Doria.f Dorie.f Dorinda.f Dorine.f Doris.f Dorla.f Dorotha.f Dorothea.f Dorothy.f Dorris.f Dortha.f Dorthea.f Dorthey.f Dorthy.f Dosha.f Doshia.f Doshie.f Dot.f Dottie.f Dotty.f Dove.f Dovie.f Dreama.f Drema.f Drucilla.f Drusilla.f Dulce.f Dulcie.f Dung.f Dusti.f Dwana.f Dyan.f Earlean.f Earleen.f Earlene.f Earlie.f Earline.f Earnestine.f Eartha.f Easter.f Ebba.f Eboni.f Ebonie.f Ebony.f Echo.f Eda.f Edda.f Edelmira.f Eden.f Edie.f Edith.f Edmonia.f Edna.f Ednah.f Edra.f Edris.f Edwina.f Edyth.f Edythe.f Effa.f Effie.f Ehtel.f Eileen.f Eilene.f Ela.f Eladia.f Elaina.f Elaine.f Elana.f Elane.f Elanor.f Elayne.f Elba.f Elberta.f Elda.f Eldora.f Eleanor.f Eleanora.f Eleanore.f Elease.f Electa.f Elena.f Elene.f Eleni.f Elenor.f Elenora.f Elenore.f Eleonor.f Eleonora.f Eleonore.f Elfreda.f Elfrieda.f Elfriede.f Elia.f Eliana.f Elicia.f Elida.f Elidia.f Elin.f Elina.f Elinor.f Elinore.f Elisa.f Elisabeth.f Elise.f Elissa.f Eliz.f Eliza.f Elizabet.f Elizabeth.f Elizbeth.f Elizebeth.f Elke.f Ella.f Ellamae.f Ellan.f Ellar.f Ellen.f Ellena.f Elli.f Ellie.f Elly.f Ellyn.f Elma.f Elmina.f Elmira.f Elmire.f Elna.f Elnora.f Elodia.f Elois.f Eloisa.f Eloise.f Elouise.f Elsa.f Else.f Elsie.f Elsy.f Elta.f Elva.f Elvera.f Elvia.f Elvie.f Elvina.f Elvira.f Elwanda.f Elyse.f Elza.f Elzada.f Ema.f Emaline.f Emelda.f Emelia.f Emelie.f Emelina.f Emeline.f Emely.f Emerald.f Emerita.f Emiko.f Emilee.f Emilia.f Emilie.f Emily.f Emma.f Emmaline.f Emmer.f Emmie.f Emmy.f Emogene.f Ena.f Enda.f Enedina.f Eneida.f Enid.f Enola.f Enriqueta.f Eola.f Epifania.f Era.f Erica.f Ericha.f Ericka.f Erie.f Erika.f Erinn.f Erlene.f Erlinda.f Erline.f Erma.f Ermelinda.f Erminia.f Erna.f Ernesta.f Ernestina.f Ernestine.f Eryn.f Esmeralda.f Esperanza.f Essie.f Esta.f Estefana.f Estela.f Estell.f Estella.f Estelle.f Ester.f Esther.f Estie.f Estrella.f Etha.f Ethel.f Ethelene.f Ethelyn.f Ether.f Ethyl.f Etna.f Etsuko.f Etta.f Etter.f Ettie.f Eudora.f Eufemia.f Eugena.f Eugenia.f Eugenie.f Eula.f Eulah.f Eulalia.f Eulalie.f Eun.f Euna.f Eunice.f Euphemia.f Eura.f Eusebia.f Eustolia.f Eva.f Evalena.f Evaline.f Evalyn.f Evangelina.f Evangeline.f Eve.f Evelia.f Evelin.f Evelina.f Eveline.f Evelyn.f Evelyne.f Evelynn.f Evette.f Evia.f Evie.f Evita.f Evon.f Evonne.f Ewa.f Exie.f Fabiola.f Fae.f Fairy.f Faith.f Fallon.f Fannie.f Fanny.f Farah.f Farrah.f Fatima.f Fatimah.f Faustina.f Faviola.f Fawn.f Fay.f Faye.f Fe.f Felecia.f Felica.f Felice.f Felicia.f Felicidad.f Felicita.f Felicitas.f Felipa.f Felisa.f Felisha.f Fermina.f Fern.f Fernanda.f Fernande.f Ferne.f Fidela.f Fidelia.f Filomena.f Fiona.f Flavia.f Fleta.f Flo.f Flor.f Flora.f Florance.f Florence.f Florencia.f Florene.f Florentina.f Flores.f Floretta.f Floria.f Florida.f Florinda.f Florine.f Florrie.f Flossie.f Floy.f Fonda.f Fran.f Francene.f Francesca.f Franchesca.f Francie.f Francina.f Francine.f Francisca.f Francoise.f Fransisca.f Freda.f Fredda.f Frederica.f Fredericka.f Fredia.f Fredricka.f Freeda.f Freida.f Frida.f Frieda.f Frona.f Fronie.f Fronnie.f Fumiko.f Gabriela.f Gabriele.f Gabriella.f Gabrielle.f Gala.f Galina.f Garnet.f Garnett.f Gay.f Gaye.f Gayla.f Gaylene.f Gaynell.f Gaynelle.f Gearldine.f Gema.f Gemma.f Gena.f Genesis.f Geneva.f Genevie.f Genevieve.f Genevive.f Genia.f Genie.f Genna.f Gennie.f Genny.f Genoveva.f Georgann.f Georgeann.f Georgeanna.f Georgene.f Georgetta.f Georgette.f Georgia.f Georgiana.f Georgiann.f Georgianna.f Georgianne.f Georgie.f Georgina.f Georgine.f Geraldine.f Geralyn.f Gerda.f Geri.f Germaine.f Gerri.f Gertha.f Gertie.f Gertrud.f Gertrude.f Gertrudis.f Gertude.f Ghislaine.f Gia.f Gianna.f Gidget.f Gigi.f Gilberte.f Gilda.f Gillian.f Gilma.f Gina.f Ginette.f Ginger.f Ginny.f Giovanna.f Gisela.f Gisele.f Giselle.f Gita.f Giuseppina.f Gladis.f Glady.f Gladys.f Glayds.f Glenda.f Glendora.f Glenna.f Glennie.f Glennis.f Glinda.f Gloria.f Glory.f Glynda.f Glynis.f Golda.f Golden.f Goldia.f Goldie.f Grace.f Gracia.f Gracie.f Graciela.f Grayce.f Grazyna.f Gregoria.f Greta.f Gretchen.f Gretta.f Gricelda.f Grisel.f Griselda.f Gudrun.f Guillermina.f Gussie.f Gwen.f Gwenda.f Gwendolyn.f Gwenn.f Gwyn.f Gwyneth.f Ha.f Hae.f Hailey.f Haley.f Halina.f Halley.f Hallie.f Han.f Hana.f Hang.f Hanh.f Hanna.f Hannah.f Hannelore.f Harmony.f Harriet.f Harriett.f Harriette.f Hassie.f Hattie.f Haydee.f Hayley.f Hazel.f Hazle.f Heather.f Hedwig.f Hedy.f Hee.f Heide.f Heidi.f Heidy.f Heike.f Helaine.f Helen.f Helena.f Helene.f Helga.f Hellen.f Helma.f Helyn.f Henretta.f Henrieta.f Henrietta.f Henriette.f Herlinda.f Herma.f Hermelinda.f Hermila.f Hermina.f Hermine.f Herminia.f Herta.f Hertha.f Hessie.f Hester.f Hettie.f Hiedi.f Hien.f Hilaria.f Hilary.f Hilda.f Hilde.f Hildegard.f Hildegarde.f Hildred.f Hildur.f Hillary.f Hilma.f Hiroko.f Hisako.f Hoa.f Holley.f Holli.f Hollie.f Holly.f Honey.f Honora.f Hope.f Hortencia.f Hortense.f Hortensia.f Hsiu.f Hue.f Hui.f Hulda.f Huldah.f Huong.f Hwa.f Hyacinth.f Hye.f Hyo.f Hyon.f Hyun.f Icie.f Icy.f Ida.f Idalia.f Idell.f Idella.f Iesha.f Ignacia.f Ila.f Ilana.f Ilda.f Ileana.f Ileen.f Ilene.f Iliana.f Illa.f Ilona.f Ilse.f Iluminada.f Ima.f Imelda.f Imogene.f In.f Ina.f India.f Indiana.f Indira.f Indre.f Inell.f Ines.f Inez.f Inga.f Inge.f Ingeborg.f Inger.f Ingrid.f Inocencia.f Iola.f Iona.f Ione.f Iraida.f Irena.f Irene.f Irina.f Iris.f Irish.f Irma.f Irmgard.f Isa.f Isabel.f Isabell.f Isabella.f Isabelle.f Isadora.f Isaura.f Isela.f Isidra.f Isis.f Isobel.f Iva.f Ivah.f Ivana.f Ivelisse.f Ivette.f Ivey.f Ivonne.f Ivy.f Izetta.f Izola.f Izora.f Ja.f Jacalyn.f Jacelyn.f Jacinda.f Jacinta.f Jackeline.f Jackelyn.f Jacki.f Jacklyn.f Jackqueline.f Jaclyn.f Jacqualine.f Jacque.f Jacquelin.f Jacqueline.f Jacquelyn.f Jacquelyne.f Jacquelynn.f Jacquetta.f Jacqui.f Jacquie.f Jacquiline.f Jacquline.f Jacqulyn.f Jada.f Jade.f Jadwiga.f Jaimee.f Jaimie.f Jaleesa.f Jalisa.f Jama.f Jamee.f Jami.f Jamika.f Jamila.f Jammie.f Jana.f Janae.f Janay.f Jane.f Janean.f Janee.f Janeen.f Janel.f Janell.f Janella.f Janelle.f Janene.f Janessa.f Janet.f Janeth.f Janett.f Janetta.f Janette.f Janey.f Jani.f Janice.f Janie.f Janiece.f Janina.f Janine.f Janis.f Janise.f Janita.f Jann.f Janna.f Jannet.f Jannette.f Jannie.f January.f Janyce.f Jaqueline.f Jaquelyn.f Jasmin.f Jasmine.f Jaunita.f Jaye.f Jayme.f Jaymie.f Jayna.f Jayne.f Jazmin.f Jazmine.f Jeana.f Jeane.f Jeanelle.f Jeanene.f Jeanett.f Jeanetta.f Jeanette.f Jeanice.f Jeanie.f Jeanine.f Jeanmarie.f Jeanna.f Jeanne.f Jeannetta.f Jeannette.f Jeannie.f Jeannine.f Jeffie.f Jen.f Jena.f Jenae.f Jene.f Jenee.f Jenell.f Jenelle.f Jenette.f Jeneva.f Jeni.f Jenice.f Jenifer.f Jeniffer.f Jenine.f Jenise.f Jenna.f Jennefer.f Jennell.f Jennette.f Jenni.f Jennie.f Jennifer.f Jenniffer.f Jennine.f Jenny.f Jeraldine.f Jeri.f Jerica.f Jerilyn.f Jerlene.f Jerri.f Jerrica.f Jerrie.f Jesenia.f Jesica.f Jessenia.f Jessi.f Jessia.f Jessica.f Jessika.f Jestine.f Jesusa.f Jesusita.f Jetta.f Jettie.f Ji.f Jill.f Jillian.f Jin.f Jina.f Jinny.f Jo.f Joana.f Joane.f Joanie.f Joann.f Joanna.f Joanne.f Joannie.f Joaquina.f Jocelyn.f Jodee.f Jodi.f Jodie.f Joeann.f Joella.f Joelle.f Joellen.f Joetta.f Joette.f Johana.f Johanna.f Johannah.f Johanne.f Johna.f Johnetta.f Johnette.f Johnna.f Johnsie.f Joi.f Joie.f Jolanda.f Joleen.f Jolene.f Jolie.f Joline.f Jolyn.f Jolynn.f Jona.f Jone.f Jonell.f Jonelle.f Jong.f Joni.f Jonie.f Jonna.f Jonnie.f Josefa.f Josefina.f Josefine.f Joselyn.f Josephina.f Josephine.f Josette.f Josie.f Josiephine.f Joslyn.f Josphine.f Jossie.f Jovan.f Jovita.f Joy.f Joya.f Joyce.f Joycelyn.f Joye.f Juana.f Juanita.f Judi.f Judie.f Judith.f Judy.f Jule.f Julee.f Julene.f Juli.f Julia.f Juliana.f Juliane.f Juliann.f Julianna.f Julianne.f Julie.f Julieann.f Julienne.f Juliet.f Julieta.f Julietta.f Juliette.f Julissa.f June.f Jung.f Junie.f Junita.f Junko.f Justa.f Justina.f Justine.f Jutta.f Ka.f Kacey.f Kaci.f Kacie.f Kacy.f Kai.f Kaila.f Kaitlin.f Kaitlyn.f Kala.f Kaleigh.f Kaley.f Kali.f Kallie.f Kalyn.f Kam.f Kamala.f Kami.f Kamilah.f Kandace.f Kandi.f Kandice.f Kandis.f Kandra.f Kandy.f Kanesha.f Kanisha.f Kara.f Karan.f Kareen.f Karen.f Karena.f Karey.f Kari.f Karie.f Karima.f Karin.f Karina.f Karine.f Karisa.f Karissa.f Karla.f Karleen.f Karlene.f Karly.f Karlyn.f Karma.f Karmen.f Karol.f Karole.f Karoline.f Karolyn.f Karon.f Karren.f Karri.f Karrie.f Karry.f Kary.f Karyl.f Karyn.f Kasandra.f Kasha.f Kasi.f Kasie.f Kassandra.f Kassie.f Kate.f Katelin.f Katelyn.f Katelynn.f Katerine.f Kathaleen.f Katharina.f Katharine.f Katharyn.f Kathe.f Katheleen.f Katherin.f Katherina.f Katherine.f Kathern.f Katheryn.f Kathey.f Kathi.f Kathie.f Kathleen.f Kathlene.f Kathline.f Kathlyn.f Kathrin.f Kathrine.f Kathryn.f Kathryne.f Kathy.f Kathyrn.f Kati.f Katia.f Katie.f Katina.f Katlyn.f Katrice.f Katrina.f Kattie.f Katy.f Kay.f Kayce.f Kaycee.f Kaye.f Kayla.f Kaylee.f Kayleen.f Kayleigh.f Kaylene.f Kazuko.f Kecia.f Keeley.f Keely.f Keena.f Keesha.f Keiko.f Keila.f Keira.f Keisha.f Keitha.f Keli.f Kelle.f Kellee.f Kelli.f Kellie.f Kellye.f Kelsey.f Kelsi.f Kelsie.f Kemberly.f Kena.f Kenda.f Kendal.f Kendra.f Kenia.f Kenisha.f Kenna.f Kenya.f Kenyatta.f Kenyetta.f Kera.f Keren.f Keri.f Kerri.f Kerrie.f Kerstin.f Kesha.f Keshia.f Keturah.f Keva.f Khadijah.f Khalilah.f Kia.f Kiana.f Kiara.f Kiera.f Kiersten.f Kiesha.f Kiley.f Kimber.f Kimberely.f Kimberlee.f Kimberley.f Kimberli.f Kimberlie.f Kimberly.f Kimbery.f Kimbra.f Kimi.f Kimiko.f Kina.f Kindra.f Kira.f Kirsten.f Kirstie.f Kirstin.f Kisha.f Kit.f Kittie.f Kitty.f Kiyoko.f Kizzie.f Kizzy.f Klara.f Kori.f Kortney.f Kourtney.f Krishna.f Krissy.f Krista.f Kristal.f Kristan.f Kristeen.f Kristel.f Kristen.f Kristi.f Kristian.f Kristie.f Kristin.f Kristina.f Kristine.f Kristle.f Kristy.f Kristyn.f Krysta.f Krystal.f Krysten.f Krystin.f Krystina.f Krystle.f Krystyna.f Kum.f Kyla.f Kylee.f Kylene.f Kylie.f Kym.f Kymberly.f Kyoko.f Kyong.f Kyra.f Kyung.f Lacey.f Lachelle.f Laci.f Lacie.f Lacresha.f Ladawn.f Ladonna.f Lady.f Lael.f Lahoma.f Lai.f Laila.f Laine.f Lajuana.f Lakeesha.f Lakeisha.f Lakendra.f Lakenya.f Lakesha.f Lakeshia.f Lakia.f Lakiesha.f Lakisha.f Lakita.f Lala.f Lamonica.f Lan.f Lana.f Lanell.f Lanelle.f Lanette.f Lang.f Lani.f Lanie.f Lanita.f Lannie.f Lanora.f Laquanda.f Laquita.f Lara.f Larae.f Laraine.f Laree.f Larhonda.f Larisa.f Larissa.f Larita.f Laronda.f Larraine.f Larue.f Lasandra.f Lashanda.f Lashandra.f Lashaun.f Lashaunda.f Lashawn.f Lashawna.f Lashawnda.f Lashay.f Lashell.f Lashon.f Lashonda.f Lashunda.f Lasonya.f Latanya.f Latarsha.f Latasha.f Latashia.f Latesha.f Latia.f Laticia.f Latina.f Latisha.f Latonia.f Latonya.f Latoria.f Latosha.f Latoya.f Latoyia.f Latrice.f Latricia.f Latrina.f Latrisha.f Launa.f Laura.f Lauralee.f Lauran.f Laure.f Laureen.f Laurel.f Laurena.f Laurene.f Lauretta.f Laurette.f Lauri.f Laurice.f Laurie.f Laurinda.f Laurine.f Lauryn.f Lavada.f Lavelle.f Lavenia.f Lavera.f Laverna.f Laveta.f Lavette.f Lavina.f Lavinia.f Lavon.f Lavona.f Lavonda.f Lavone.f Lavonia.f Lavonna.f Lavonne.f Lawana.f Lawanda.f Lawanna.f Layla.f Layne.f Le.f Lea.f Leah.f Lean.f Leana.f Leandra.f Leann.f Leanna.f Leanne.f Leanora.f Leatha.f Leatrice.f Lecia.f Leda.f Leeann.f Leeanna.f Leeanne.f Leena.f Leesa.f Leia.f Leida.f Leigha.f Leighann.f Leila.f Leilani.f Leisa.f Leisha.f Leitha.f Lekisha.f Lela.f Lelah.f Lelar.f Lelia.f Lella.f Lemma.f Lena.f Lenita.f Lenna.f Lennie.f Lenora.f Lenore.f Leola.f Leoma.f Leona.f Leonarda.f Leone.f Leonia.f Leonida.f Leonie.f Leonila.f Leonor.f Leonora.f Leonore.f Leontine.f Leora.f Leota.f Lera.f Lesa.f Lesha.f Lesia.f Leslee.f Lesli.f Lessie.f Leta.f Letha.f Leticia.f Letisha.f Letitia.f Letta.f Lettie.f Letty.f Lexie.f Lezlie.f Li.f Lia.f Liana.f Liane.f Lianne.f Libbie.f Libby.f Liberty.f Librada.f Lida.f Liddie.f Lidia.f Lidie.f Lien.f Lieselotte.f Ligia.f Lila.f Lili.f Lilia.f Lilian.f Liliana.f Lilla.f Liller.f Lilli.f Lillia.f Lilliam.f Lillian.f Lilliana.f Lillie.f Lillis.f Lilly.f Lily.f Lilyan.f Lin.f Lina.f Linda.f Lindsy.f Lindy.f Linette.f Ling.f Linh.f Linn.f Linna.f Linnea.f Linnie.f Linsey.f Lisa.f Lisabeth.f Lisandra.f Lisbeth.f Lise.f Lisette.f Lisha.f Lissa.f Lissette.f Lissie.f Lita.f Littie.f Livia.f Liz.f Liza.f Lizabeth.f Lizbeth.f Lizeth.f Lizette.f Lizzette.f Lizzie.f Loan.f Lockie.f Loida.f Lois.f Loise.f Lola.f Lolita.f Lollie.f Loma.f Lona.f Londa.f Loni.f Lonie.f Lonna.f Lora.f Loraine.f Loralee.f Lorayne.f Lore.f Lorean.f Loree.f Loreen.f Lorelei.f Lorena.f Lorene.f Lorenza.f Loreta.f Loretta.f Lorette.f Loretto.f Lori.f Loria.f Loriann.f Lorie.f Lorilee.f Lorina.f Lorinda.f Lorine.f Loris.f Lorita.f Lorna.f Lorraine.f Lorretta.f Lorri.f Lorriane.f Lorrie.f Lorrine.f Lory.f Lossie.f Lotta.f Lottie.f Louann.f Louanne.f Louella.f Louetta.f Louisa.f Louise.f Loula.f Loura.f Lourdes.f Lourie.f Louvenia.f Love.f Lovella.f Lovetta.f Lovie.f Lovina.f Lovisa.f Loyce.f Lu.f Luana.f Luann.f Luanna.f Luanne.f Luba.f Luci.f Lucia.f Luciana.f Lucie.f Lucienne.f Lucila.f Lucile.f Lucilla.f Lucille.f Lucina.f Lucinda.f Lucrecia.f Lucretia.f Lucy.f Ludie.f Ludivina.f Lue.f Luella.f Luetta.f Lugenia.f Luisa.f Luise.f Lula.f Lular.f Lulie.f Lulu.f Luna.f Lupita.f Lura.f Lurlene.f Lurline.f Lutie.f Luvenia.f Luvinia.f Luz.f Lyda.f Lydia.f Lyla.f Lyn.f Lynda.f Lyndia.f Lyndsay.f Lyndsey.f Lynell.f Lynelle.f Lynetta.f Lynette.f Lynna.f Lynne.f Lynnette.f Lynsey.f Ma.f Mabel.f Mabelle.f Mable.f Machelle.f Macie.f Mackenzie.f Macy.f Madalene.f Madaline.f Madalyn.f Maddie.f Madelaine.f Madeleine.f Madelene.f Madeline.f Madelyn.f Madge.f Madie.f Madison.f Madlyn.f Madonna.f Madora.f Mae.f Maegan.f Mafalda.f Magali.f Magaly.f Magan.f Magaret.f Magda.f Magdalen.f Magdalena.f Magdalene.f Magen.f Maggie.f Magnolia.f Mahala.f Mahalia.f Mai.f Maia.f Maida.f Maile.f Maira.f Maire.f Maisha.f Maisie.f Majorie.f Makeda.f Malena.f Malia.f Malika.f Malinda.f Malisa.f Malissa.f Malka.f Mallie.f Mallory.f Malorie.f Malvina.f Mame.f Mamie.f Mammie.f Mana.f Manda.f Mandi.f Mandie.f Mandy.f Manerva.f Manervia.f Manie.f Manuela.f Many.f Mao.f Maple.f Mara.f Maragaret.f Maragret.f Maranda.f Marcela.f Marcelene.f Marcelina.f Marceline.f Marcell.f Marcella.f Marcelle.f Marcene.f Marchelle.f Marci.f Marcia.f Marcie.f Marcy.f Mardell.f Maren.f Marg.f Margaret.f Margareta.f Margarete.f Margarett.f Margaretta.f Margarette.f Margarita.f Margarite.f Margart.f Marge.f Margene.f Margeret.f Margert.f Margery.f Marget.f Margherita.f Margie.f Margit.f Margo.f Margorie.f Margot.f Margret.f Margrett.f Marguerita.f Marguerite.f Margurite.f Margy.f Marhta.f Mari.f Mariah.f Mariam.f Marian.f Mariana.f Marianela.f Mariann.f Marianna.f Marianne.f Maribel.f Maribeth.f Marica.f Maricela.f Maricruz.f Marie.f Mariel.f Mariela.f Mariella.f Marielle.f Marietta.f Mariette.f Mariko.f Marilee.f Marilla.f Marilou.f Marilu.f Marilyn.f Marilynn.f Marin.f Marina.f Marinda.f Marine.f Maris.f Marisa.f Marisela.f Marisha.f Marisol.f Marissa.f Marita.f Maritza.f Marivel.f Marjorie.f Marjory.f Marketta.f Markita.f Marla.f Marlana.f Marleen.f Marlen.f Marlena.f Marlene.f Marline.f Marlo.f Marlyn.f Marlys.f Marna.f Marni.f Marnie.f Marquerite.f Marquetta.f Marquita.f Marquitta.f Marry.f Marsha.f Marta.f Marth.f Martha.f Marti.f Martina.f Martine.f Marva.f Marvel.f Marvella.f Marvis.f Marx.f Marya.f Maryalice.f Maryam.f Maryann.f Maryanna.f Maryanne.f Marybelle.f Marybeth.f Maryellen.f Maryetta.f Maryjane.f Maryjo.f Maryland.f Marylee.f Marylin.f Maryln.f Marylou.f Marylouise.f Marylyn.f Marylynn.f Maryrose.f Masako.f Matha.f Mathilda.f Mathilde.f Matie.f Matilda.f Matilde.f Mattie.f Maud.f Maude.f Maudie.f Maura.f Maureen.f Maurine.f Maurita.f Mavis.f Maxie.f Maxima.f Maximina.f Maxine.f May.f Maya.f Maybell.f Maybelle.f Maye.f Mayme.f Maymie.f Mayola.f Mayra.f Mazie.f Mckenzie.f Meagan.f Meaghan.f Mechelle.f Meda.f Mee.f Meg.f Megan.f Meggan.f Meghan.f Meghann.f Mei.f Melaine.f Melani.f Melania.f Melanie.f Melany.f Melba.f Melda.f Melia.f Melida.f Melina.f Melinda.f Melisa.f Melissa.f Melissia.f Melita.f Mellie.f Mellisa.f Mellissa.f Melodee.f Melodi.f Melodie.f Melody.f Melonie.f Melony.f Melva.f Melvina.f Melynda.f Mena.f Mendy.f Mercedes.f Mercedez.f Mercy.f Meredith.f Meri.f Merideth.f Meridith.f Merilyn.f Merissa.f Merlene.f Merlyn.f Merna.f Merri.f Merrie.f Merrilee.f Merry.f Mertie.f Meryl.f Meta.f Metta.f Mettie.f Mi.f Mia.f Mica.f Micaela.f Micha.f Michaela.f Michaele.f Michele.f Michelina.f Micheline.f Michell.f Michelle.f Michiko.f Micki.f Mickie.f Miesha.f Migdalia.f Mignon.f Miguelina.f Mika.f Mikaela.f Miki.f Mikki.f Mila.f Milagro.f Milagros.f Milda.f Mildred.f Milissa.f Millicent.f Millie.f Milly.f Mima.f Mimi.f Min.f Mina.f Minda.f Mindi.f Mindy.f Minerva.f Minervia.f Ming.f Minna.f Minnie.f Minta.f Mintie.f Mira.f Miranda.f Mireille.f Mirella.f Mireya.f Miriam.f Mirian.f Mirna.f Mirta.f Mirtha.f Misha.f Miss.f Missouri.f Missy.f Misti.f Mistie.f Misty.f Mitsue.f Mitsuko.f Mittie.f Mitzi.f Mitzie.f Miyoko.f Modesta.f Moira.f Mollie.f Molly.f Mona.f Monet.f Monica.f Monika.f Monique.f Monnie.f Monserrate.f Moon.f Mora.f Moriah.f Mossie.f Mozell.f Mozella.f Mozelle.f Mui.f Muoi.f Muriel.f My.f Myesha.f Myong.f Myra.f Myriam.f Myrl.f Myrle.f Myrna.f Myrta.f Myrtice.f Myrtie.f Myrtis.f Myrtle.f Myung.f Na.f Nada.f Nadene.f Nadia.f Nadine.f Naida.f Nakesha.f Nakia.f Nakisha.f Nakita.f Nam.f Nan.f Nana.f Nancee.f Nancey.f Nanci.f Nancie.f Nancy.f Nanette.f Nannette.f Nannie.f Naoma.f Naomi.f Narcisa.f Natacha.f Natalia.f Natalie.f Natalya.f Natasha.f Natashia.f Nathalie.f Natisha.f Natividad.f Natosha.f Nealie.f Necole.f Neda.f Nedra.f Neely.f Neida.f Nelda.f Nelia.f Nelida.f Nell.f Nella.f Nelle.f Nellie.f Nelly.f Nena.f Nenita.f Neoma.f Neomi.f Neppie.f Nereida.f Nerissa.f Nery.f Neta.f Netta.f Nettie.f Neva.f Nevada.f Nga.f Ngan.f Ngoc.f Nguyet.f Nia.f Nichelle.f Nichol.f Nichole.f Nicholle.f Nicki.f Nickie.f Nickole.f Nicol.f Nicola.f Nicolasa.f Nicole.f Nicolette.f Nicolle.f Nida.f Nidia.f Niesha.f Nieves.f Niki.f Nikia.f Nikita.f Nikki.f Nikole.f Nila.f Nilda.f Nilsa.f Nina.f Ninfa.f Nisha.f Nita.f Nobuko.f Noelia.f Noella.f Noelle.f Noemi.f Nohemi.f Nola.f Nolia.f Nolie.f Noma.f Nona.f Nonie.f Nora.f Norah.f Noreen.f Norene.f Noriko.f Norine.f Norma.f Nova.f Novella.f Nu.f Nubia.f Nydia.f Nyla.f Obdulia.f Ocie.f Octavia.f Oda.f Odelia.f Odessa.f Odette.f Odilia.f Ofelia.f Ok.f Ola.f Olene.f Oleta.f Olevia.f Olga.f Olie.f Olimpia.f Olinda.f Oliva.f Olive.f Olivia.f Olympia.f Oma.f Omega.f Omie.f Ona.f Oneida.f Oneta.f Onie.f Onita.f Opal.f Ophelia.f Ora.f Oralee.f Oralia.f Oretha.f Orilla.f Orpha.f Osa.f Osie.f Ossie.f Otelia.f Otilia.f Ottie.f Ottilia.f Ottilie.f Ouida.f Ova.f Ozell.f Ozella.f Ozie.f Pa.f Page.f Paige.f Palma.f Palmira.f Pam.f Pamala.f Pamela.f Pamelia.f Pamella.f Pamila.f Pamula.f Pandora.f Pansy.f Paola.f Paralee.f Parthenia.f Particia.f Pasty.f Patience.f Patria.f Patrica.f Patrice.f Patrina.f Patsy.f Patti.f Pattie.f Patty.f Paula.f Paulene.f Pauletta.f Paulette.f Paulina.f Pauline.f Paulita.f Paz.f Pearl.f Pearle.f Pearlene.f Pearlie.f Pearline.f Pearly.f Peg.f Peggie.f Peggy.f Pei.f Penelope.f Penney.f Penni.f Pennie.f Penny.f Perla.f Permelia.f Petra.f Petrina.f Petronila.f Phebe.f Phillis.f Philomena.f Phoebe.f Phung.f Phuong.f Phylicia.f Phylis.f Phyliss.f Phyllis.f Pia.f Piedad.f Pilar.f Ping.f Pinkey.f Pinkie.f Piper.f Pok.f Pollie.f Polly.f Porsche.f Porsha.f Portia.f Precious.f Pricilla.f Princess.f Priscila.f Priscilla.f Providencia.f Prudence.f Pura.f Qiana.f Queen.f Queenie.f Quiana.f Quyen.f Rachael.f Rachal.f Racheal.f Rachel.f Rachele.f Rachell.f Rachelle.f Racquel.f Rae.f Raeann.f Raelene.f Rafaela.f Raguel.f Raina.f Raisa.f Ramona.f Ramonita.f Rana.f Ranae.f Randa.f Randee.f Randi.f Ranee.f Raquel.f Rasheeda.f Rashida.f Raven.f Raye.f Raylene.f Raymonde.f Rayna.f Rea.f Reagan.f Reanna.f Reatha.f Reba.f Rebbeca.f Rebbecca.f Rebeca.f Rebecca.f Rebecka.f Rebekah.f Reda.f Reena.f Refugia.f Regan.f Regena.f Regenia.f Regina.f Regine.f Reginia.f Reiko.f Reina.f Reita.f Rella.f Rema.f Remedios.f Remona.f Rena.f Renada.f Renae.f Renata.f Renate.f Renay.f Renda.f Renea.f Renee.f Renetta.f Renita.f Renna.f Rennie.f Ressie.f Reta.f Retha.f Retta.f Reva.f Reyna.f Reynalda.f Rhea.f Rheba.f Rhiannon.f Rhoda.f Rhona.f Rhonda.f Ria.f Ricarda.f Richelle.f Ricki.f Rikki.f Rilla.f Rillie.f Rima.f Rina.f Risa.f Rita.f Riva.f Rivka.f Robbi.f Robbin.f Robbyn.f Robena.f Roberta.f Robyn.f Rochel.f Rochell.f Rochelle.f Rocio.f Roena.f Rolanda.f Rolande.f Roma.f Romaine.f Romana.f Romelia.f Romona.f Rona.f Ronda.f Roni.f Ronna.f Ronni.f Rosa.f Rosalba.f Rosalee.f Rosalia.f Rosalie.f Rosalina.f Rosalind.f Rosalinda.f Rosaline.f Rosalva.f Rosalyn.f Rosamaria.f Rosamond.f Rosana.f Rosann.f Rosanna.f Rosanne.f Rosaria.f Rosaura.f Rose.f Roseann.f Roseanna.f Roseanne.f Roselee.f Roselia.f Roseline.f Rosella.f Roselle.f Roselyn.f Rosemarie.f Rosemary.f Rosena.f Rosenda.f Rosetta.f Rosette.f Rosia.f Rosie.f Rosina.f Rosio.f Rosita.f Roslyn.f Rossana.f Rossie.f Rosy.f Rowena.f Roxana.f Roxane.f Roxann.f Roxanna.f Roxanne.f Roxie.f Roxy.f Rozanne.f Rozella.f Rubi.f Rubie.f Ruby.f Rubye.f Rufina.f Ruth.f Rutha.f Ruthann.f Ruthanne.f Ruthe.f Ruthie.f Ryann.f Sabina.f Sabine.f Sabra.f Sabrina.f Sacha.f Sachiko.f Sada.f Sade.f Sadie.f Sadye.f Sage.f Salena.f Salina.f Salley.f Sallie.f Sally.f Salome.f Samantha.f Samara.f Samatha.f Samella.f Samira.f Sana.f Sanda.f Sandee.f Sandi.f Sandie.f Sandra.f Sanjuana.f Sanjuanita.f Sannie.f Sanora.f Santa.f Santana.f Santina.f Sara.f Sarah.f Sarai.f Saran.f Sari.f Sarina.f Sarita.f Sasha.f Saturnina.f Sau.f Saundra.f Savanna.f Savannah.f Scarlet.f Scarlett.f Season.f Sebrina.f See.f Seema.f Selena.f Selene.f Selina.f Selma.f Sena.f Senaida.f September.f Serafina.f Serena.f Serina.f Serita.f Setsuko.f Sha.f Shae.f Shaina.f Shakia.f Shakira.f Shakita.f Shala.f Shalanda.f Shalon.f Shalonda.f Shameka.f Shamika.f Shan.f Shana.f Shanae.f Shanda.f Shandi.f Shandra.f Shaneka.f Shanel.f Shanell.f Shanelle.f Shani.f Shanice.f Shanika.f Shaniqua.f Shanita.f Shanna.f Shannan.f Shanon.f Shanta.f Shantae.f Shantay.f Shante.f Shantel.f Shantell.f Shantelle.f Shanti.f Shaquana.f Shaquita.f Shara.f Sharan.f Sharda.f Sharee.f Sharell.f Sharen.f Shari.f Sharice.f Sharie.f Sharika.f Sharilyn.f Sharita.f Sharla.f Sharleen.f Sharlene.f Sharmaine.f Sharolyn.f Sharon.f Sharonda.f Sharri.f Sharron.f Sharyl.f Sharyn.f Shasta.f Shauna.f Shaunda.f Shaunna.f Shaunta.f Shaunte.f Shavon.f Shavonda.f Shavonne.f Shawana.f Shawanda.f Shawanna.f Shawna.f Shawnda.f Shawnee.f Shawnna.f Shawnta.f Shay.f Shayla.f Shayna.f Shea.f Sheba.f Sheena.f Sheila.f Sheilah.f Shela.f Shelba.f Shelia.f Shella.f Shelley.f Shelli.f Shellie.f Shelly.f Shelva.f Shemeka.f Shemika.f Shena.f Shenika.f Shenita.f Shenna.f Shera.f Sheree.f Sherell.f Sheri.f Sherice.f Sheridan.f Sherie.f Sherika.f Sherill.f Sherilyn.f Sherise.f Sherita.f Sherlene.f Sherley.f Sherly.f Sherlyn.f Sheron.f Sherrell.f Sherri.f Sherrie.f Sherril.f Sherrill.f Sherron.f Sherry.f Sherryl.f Shery.f Sheryl.f Sheryll.f Shiela.f Shila.f Shiloh.f Shin.f Shira.f Shirely.f Shirl.f Shirlee.f Shirleen.f Shirlene.f Shirly.f Shizue.f Shizuko.f Shona.f Shonda.f Shondra.f Shonna.f Shonta.f Shoshana.f Shu.f Shyla.f Sibyl.f Sierra.f Signe.f Sigrid.f Silva.f Silvana.f Silvia.f Sima.f Simona.f Simone.f Simonne.f Sina.f Sindy.f Siobhan.f Sirena.f Siu.f Sixta.f Skye.f Slyvia.f So.f Socorro.f Sofia.f Soila.f Solange.f Soledad.f Somer.f Sommer.f Sona.f Sondra.f Song.f Sonia.f Sonja.f Sonya.f Soo.f Sook.f Soon.f Sophia.f Sophie.f Sophronia.f Soraya.f Sparkle.f Spring.f Stacee.f Staci.f Stacia.f Stacie.f Star.f Starla.f Starr.f Stasia.f Stefani.f Stefania.f Stefanie.f Stefany.f Steffanie.f Stella.f Stepanie.f Stephaine.f Stephane.f Stephani.f Stephania.f Stephanie.f Stephany.f Stephenie.f Stephine.f Stephnie.f Stormy.f Su.f Suanne.f Sudie.f Sue.f Sueann.f Suellen.f Suk.f Sula.f Sulema.f Sumiko.f Summer.f Sun.f Sunday.f Sunni.f Sunny.f Sunshine.f Susan.f Susana.f Susann.f Susanna.f Susannah.f Susanne.f Susie.f Susy.f Suzan.f Suzann.f Suzanna.f Suzanne.f Suzette.f Suzi.f Suzie.f Suzy.f Svetlana.f Sybil.f Sybilla.f Syble.f Sylvia.f Sylvie.f Synthia.f Syreeta.f Ta.f Tabatha.f Tabetha.f Tabitha.f Tai.f Taina.f Taisha.f Tajuana.f Takako.f Takisha.f Talia.f Talisha.f Talitha.f Tam.f Tama.f Tamala.f Tamar.f Tamara.f Tamatha.f Tambra.f Tameika.f Tameka.f Tamekia.f Tamela.f Tamera.f Tamesha.f Tami.f Tamica.f Tamie.f Tamika.f Tamiko.f Tamisha.f Tammara.f Tammera.f Tammi.f Tammie.f Tammy.f Tamra.f Tana.f Tandra.f Tandy.f Taneka.f Tanesha.f Tangela.f Tania.f Tanika.f Tanisha.f Tanja.f Tanna.f Tanya.f Tara.f Tarah.f Taren.f Tari.f Tarra.f Tarsha.f Taryn.f Tasha.f Tashia.f Tashina.f Tasia.f Tatiana.f Tatum.f Tatyana.f Taunya.f Tawana.f Tawanda.f Tawanna.f Tawna.f Tawny.f Tawnya.f Tayna.f Teena.f Tegan.f Teisha.f Tella.f Telma.f Temeka.f Temika.f Tempie.f Temple.f Tena.f Tenesha.f Tenisha.f Tennie.f Tennille.f Teodora.f Teofila.f Tequila.f Tera.f Tereasa.f Teresa.f Terese.f Teresia.f Teresita.f Teressa.f Teri.f Terica.f Terina.f Terisa.f Terra.f Terresa.f Terri.f Terrie.f Terrilyn.f Tesha.f Tess.f Tessa.f Tessie.f Thalia.f Thao.f Thea.f Theda.f Thelma.f Theodora.f Theodosia.f Theola.f Theresa.f Therese.f Theresia.f Theressa.f Thersa.f Thi.f Thomasena.f Thomasina.f Thomasine.f Thora.f Thresa.f Thu.f Thursa.f Thuy.f Tia.f Tiana.f Tianna.f Tiara.f Tien.f Tiera.f Tierra.f Tiesha.f Tifany.f Tiffaney.f Tiffani.f Tiffanie.f Tiffany.f Tiffiny.f Tijuana.f Tilda.f Tillie.f Timika.f Tina.f Tinisha.f Tiny.f Tisa.f Tish.f Tisha.f Tishie.f Tobi.f Tobie.f Toccara.f Toi.f Tomasa.f Tomeka.f Tomi.f Tomika.f Tomiko.f Tommye.f Tomoko.f Tona.f Tonda.f Tonette.f Toni.f Tonia.f Tonie.f Tonisha.f Tonita.f Tonja.f Tonya.f Tora.f Tori.f Torie.f Torri.f Torrie.f Tosha.f Toshia.f Toshiko.f Tova.f Towanda.f Toya.f Tracee.f Traci.f Tracie.f Tran.f Trang.f Treasa.f Treena.f Trena.f Tresa.f Tressa.f Tressie.f Treva.f Tricia.f Trina.f Trinh.f Trinity.f Trish.f Trisha.f Trista.f Trudi.f Trudie.f Trudy.f Trula.f Tu.f Tula.f Tuyet.f Twana.f Twanda.f Twanna.f Twila.f Twyla.f Tyesha.f Tyisha.f Tynisha.f Tyra.f Ula.f Ulrike.f Un.f Una.f Ursula.f Usha.f Ute.f Vada.f Valarie.f Valda.f Valencia.f Valene.f Valentina.f Valeri.f Valeria.f Valerie.f Valery.f Vallie.f Valorie.f Valrie.f Vanda.f Vanesa.f Vanessa.f Vanetta.f Vania.f Vanita.f Vanna.f Vannesa.f Vannessa.f Vannie.f Vashti.f Vasiliki.f Vassie.f Veda.f Velda.f Velia.f Vella.f Velma.f Velva.f Velvet.f Vena.f Venessa.f Venetta.f Venice.f Venie.f Venita.f Vennie.f Venus.f Veola.f Vera.f Verda.f Verdell.f Verdie.f Verena.f Vergie.f Verla.f Verlene.f Verlie.f Verline.f Verna.f Vernell.f Vernetta.f Vernia.f Vernice.f Vernie.f Vernita.f Verona.f Veronica.f Veronika.f Veronique.f Versie.f Vertie.f Vesta.f Veta.f Veva.f Vi.f Vicenta.f Vickey.f Vicki.f Vickie.f Vicky.f Victoria.f Victorina.f Vida.f Viki.f Vikki.f Vilma.f Vina.f Vincenza.f Viney.f Vinita.f Vinnie.f Viola.f Violet.f Violeta.f Violette.f Vira.f Virgen.f Virgie.f Virgina.f Virginia.f Vita.f Viva.f Vivan.f Vivian.f Viviana.f Vivien.f Vivienne.f Voncile.f Vonda.f Vonnie.f Wai.f Waltraud.f Wan.f Wanda.f Waneta.f Wanetta.f Wanita.f Wava.f Wei.f Wen.f Wendi.f Wendie.f Wendolyn.f Wendy.f Wenona.f Whitley.f Wilda.f Wilhelmina.f Wilhelmine.f Wilhemina.f Willa.f Willena.f Willene.f Willetta.f Willette.f Willia.f Williemae.f Willodean.f Willow.f Wilma.f Windy.f Winifred.f Winnie.f Winnifred.f Winona.f Winter.f Wonda.f Wynell.f Wynona.f Xenia.f Xiao.f Xiomara.f Xochitl.f Xuan.f Yadira.f Yaeko.f Yael.f Yahaira.f Yajaira.f Yan.f Yang.f Yanira.f Yasmin.f Yasmine.f Yasuko.f Yee.f Yelena.f Yen.f Yer.f Yesenia.f Yessenia.f Yetta.f Yevette.f Yi.f Ying.f Yoko.f Yolanda.f Yolande.f Yolando.f Yolonda.f Yon.f Yoshie.f Yoshiko.f Youlanda.f Yu.f Yuette.f Yuk.f Yuki.f Yukiko.f Yuko.f Yulanda.f Yun.f Yung.f Yuonne.f Yuri.f Yuriko.f Yvette.f Yvone.f Yvonne.f Zada.f Zadie.f Zaida.f Zana.f Zandra.f Zelda.f Zella.f Zelma.f Zena.f Zenaida.f Zenia.f Zenobia.f Zetta.f Zettie.f Zilpha.f Zina.f Zita.f Zoa.f Zoe.f Zofia.f Zoila.f Zola.f Zona.f Zonia.f Zora.f Zoraida.f Zula.f Zulema.f Zulma.f link-grammar-4.7.4/data/en/words/entities.organizations.sing0000644000175000017500000000047711400320602023152 0ustar bloombloom10K 7-11 Antarctic Bank Central Chase.o Christmas City Democratic Dodge.o East El Equatorial Features Federated Ford.o Former Friar Island Islands Isle Korea La Land Lands Los New Norfolk North Ocean Republic San Sao Sea Socialist South Southern Soviet States Strip Sun.o Territory Undersea Union United West Western link-grammar-4.7.4/data/en/words/words.v.4.20000644000175000017500000006627211526022265017427 0ustar bloombloomabandons.v abases.v abbreviates.v abducts.v abets.v abhors.v abolishes.v abridges.v abrogates.v absorbs.v abstracts.v abuses.v abuts.v accents.v accentuates.v accesses.v acclaims.v accommodates.v accompanies.v accomplishes.v accosts.v accredits.v accretes.v accustoms.v acerbates.v achieves.v acquaints.v acquires.v activates.v addicts.v addles.v addresses.v adjudges.v administers.v admires.v admonishes.v adores.v adorns.v adulterates.v adumbrates.v aerates.v affects.v affixes.v afflicts.v aggrandizes.v aggravates.v alienates.v allays.v alleviates.v allocates.v allots.v amasses.v ambushes.v ameliorates.v amends.v amortizes.v amplifies.v amputates.v anaesthetizes.v anathematizes.v anesthetizes.v angers.v anglicizes.v animates.v anneals.v annexes.v annihilates.v annoints.v annotates.v annuls.v anoints.v antagonizes.v antedates.v anthologizes.v anthropomorphizes.v apes.v appals.v appeases.v appends.v apportions.v appraises.v apprehends.v apprentices.v apprises.v appropriates.v arms.v arouses.v arraigns.v arrays.v arrests.v arrogates.v ascribes.v asphalts.v asphyxiates.v aspirates.v assails.v assassinates.v assaults.v assays.v assuages.v atomizes.v attacks.v attains.v attaints.v attenuates.v attires.v attracts.v attributes.v attunes.v audits.v augments.v authenticates.v autographs.v automates.v avenges.v avers.v averts.v awaits.v awes.v axes.v backdates.v badgers.v baffles.v bakes.v balances.v bales.v bamboozles.v bandages.v banishes.v bankrupts.v bans.v baptizes.v barbarizes.v barbecues.v bares.v barrels.v barricades.v bases.v bashes.v bastes.v batters.v battles.v beaks.v beans.v beatifies.v beautifies.v bedevils.v befalls.v befits.v befouls.v befriends.v begets.v beggars.v beguiles.v beheads.v beholds.v bejewels.v belabours.v belies.v belittles.v belts.v bemoans.v benchs.v bequeaths.v berates.v bereaves.v beseeches.v besieges.v besmirches.v bespeaks.v bestirs.v bestows.v bestrews.v bestrides.v bests.v betokens.v betrays.v bevels.v bewails.v bewilders.v bewitches.v biases.v bides.v biffs.v bilks.v billets.v bills.v birches.v bisects.v blackballs.v blacklists.v blackmails.v blades.v blames.v blankets.v blasts.v blazons.v blemishes.v blesses.v blights.v blindfolds.v blinds.v blitzes.v blockades.v blow-dries.v bludgeons.v blue-pencils.v blunts.v bolds.v bolsters.v bombards.v bombs.v bookends.v boosts.v bosses.v botches.v boycotts.v braces.v brackets.v braids.v brainwashes.v braises.v brandishes.v brands.v braves.v breaches.v bribes.v bricks.v bridges.v briefs.v brines.v broaches.v brocades.v brokers.v bronzes.v brooks.v browbeats.v brutalizes.v budgets.v buffs.v bugs.v bulldozes.v bungles.v bungs.v buoys.v burdens.v buries.v burlesques.v buses.v busies.v butchers.v buttonholes.v buttresses.v by-passes.v bypasses.v cajoles.v calibrates.v camouflages.v canes.v cannibalizes.v canonises.v canonizes.v capes.v caps.v captivates.v captures.v carbonizes.v carburets.v cards.v caresses.v caricatures.v carjacks.v carpets.v cases.v castigates.v castrates.v catalogues.v catapults.v categorizes.v cedes.v cements.v censors.v censures.v centralises.v centralizes.v chagrins.v chains.v chairs.v champions.v channels.v chaperons.v charms.v charters.v charts.v chastens.v chastises.v cheapens.v checkmates.v cherishes.v chides.v chisels.v chlorinates.v chords.v christens.v chromes.v chronicles.v circularizes.v circumcises.v circumnavigates.v circumscribes.v circumvents.v cites.v civilizes.v clads.v clamps.v classifies.v claws.v cleanses.v clenches.v clips.v cloaks.v clobbers.v cloisters.v clones.v closets.v clothes.v clubs.v coats.v co-authors.v coauthors.v cobbles.v cocks.v coddles.v codenames.v codes.v codifies.v coerces.v cofounds.v coins.v cold-shoulders.v collars.v collates.v collectivizes.v collects.v collocates.v colocates.v colonizes.v combats.v comforts.v commandeers.v commemorates.v commends.v commercializes.v compacts.v compartmentalizes.v compiles.v complements.v completes.v complicates.v compliments.v composts.v compounds.v comprehends.v compresses.v comprises.v computerizes.v conceals.v concerns.v conciliates.v concocts.v conditions.v condones.v configures.v confines.v confiscates.v conflates.v confounds.v confronts.v confuses.v confutes.v congas.v congratulates.v conjures.v conks.v connotes.v conquers.v conscripts.v consecrates.v conserves.v consigns.v consoles.v constitutes.v constrains.v constricts.v constructs.v construes.v consumes.v consummates.v cons.v contacts.v contains.v contaminates.v contents.v contorts.v contours.v contradicts.v contravenes.v contrives.v controls.v convects.v conventionalizes.v conveys.v convokes.v convoys.v convulses.v coops.v co-opts.v coordinates.v copies.v co-produces.v copyrights.v cordons.v cords.v cores.v corks.v corners.v corrals.v corrects.v corroborates.v countenances.v counteracts.v counterbalances.v counterfeits.v countermands.v countersigns.v countersues.v couples.v court-martials.v courts.v covets.v coxs.v cradles.v cramps.v cranes.v crayons.v creams.v creates.v credits.v cremates.v crimps.v cripples.v criticizes.v crossbreeds.v cross-examines.v cross-fertilizes.v cross-indexes.v cross-questions.v crowns.v crucifies.v crushes.v cubes.v cudgels.v cuffs.v culls.v cultivates.v cups.v curbs.v cures.v curries.v curtails.v cushions.v damages.v damns.v dampens.v dandles.v daubs.v daunts.v dazes.v dazzles.v deadens.v deafens.v debars.v debases.v debauches.v debilitates.v debits.v debriefs.v debugs.v debunks.v decants.v decapitates.v decarbonizes.v deceives.v decentralizes.v decertifies.v decimalizes.v decimates.v deciphers.v decks.v declaims.v declassifies.v decodes.v decolonizes.v decompresses.v deconsecrates.v decontaminates.v decorates.v decries.v decrypts.v dedicates.v deducts.v deeds.v deep-freezes.v deepthroats.v de-escalates.v defaces.v defames.v defeats.v defends.v defers.v defies.v defiles.v defines.v deflates.v deflowers.v defoliates.v deforests.v deforms.v defragments.v defrauds.v defrays.v defrocks.v defrosts.v defunds.v defuses.v degrades.v dehumanizes.v dehydrates.v de-ices.v deifies.v delegates.v deletes.v delimits.v delineates.v delists.v deludes.v deluges.v demagnetizes.v demarcates.v demeans.v demerges.v demilitarizes.v demists.v demobilizes.v demolishes.v demonizes.v demoralizes.v demotes.v demutualises.v denationalizes.v denigrates.v denominates.v denotes.v denounces.v dents.v denudes.v deodorizes.v depletes.v deplores.v deploys.v depopulates.v deports.v deposes.v deposits.v deprecates.v deprograms.v deranges.v derides.v desalinates.v desalinizes.v desecrates.v desegregates.v desensitizes.v deserts.v desiccates.v despatches.v despises.v despoils.v destroys.v detaches.v detains.v detects.v deters.v detests.v dethrones.v detunes.v devaluates.v devalues.v devastates.v devises.v devotes.v devours.v dewaters.v diagnoses.v dices.v diddles.v diffracts.v dignifies.v dilutes.v directs.v disables.v disaffiliates.v disallows.v disappoints.v disarranges.v disassembles.v disassociates.v disavows.v disburses.v discards.v disciplines.v disclaims.v discomfits.v disconcerts.v disconnects.v discontents.v discounts.v discourages.v discredits.v disdains.v disembarrasses.v disembowels.v disenchants.v disenfranchises.v disestablishes.v disfavours.v disfigures.v disfranchises.v disgorges.v disgraces.v disguises.v disheartens.v dishonours.v disillusions.v disinfects.v disinherits.v disinters.v dislocates.v dislodges.v dismantles.v dismembers.v dismisses.v disobeys.v disorientates.v disorients.v disowns.v disparages.v dispatches.v dispels.v displaces.v displays.v displeases.v dispossesses.v disproves.v disqualifies.v disregards.v disrupts.v dissects.v disseminates.v disses.v dissociates.v dissuades.v distances.v distils.v distorts.v distracts.v distributes.v distrusts.v disturbs.v ditches.v diverts.v divests.v divorces.v divulges.v dizzies.v doctors.v doffs.v domesticates.v dominates.v donates.v dons.v dooms.v dopes.v dots.v double-checks.v double-crosses.v douses.v downgrades.v downloads.v downplays.v downs.v dragoons.v dramatizes.v drapes.v drenches.v drip-dries.v drubs.v drugs.v dry-cleans.v ducts.v dumbfounds.v dunks.v dupes.v duplicates.v dusts.v dwarfs.v dyes.v dynamites.v earmarks.v earns.v eclipses.v edifies.v edits.v effaces.v effects.v elbows.v electrifies.v electrocutes.v electrolyzes.v elevates.v elicits.v elides.v eliminates.v elucidates.v eludes.v emancipates.v emasculates.v embalms.v embargos.v embeds.v embellishes.v embezzles.v embitters.v emblazons.v embodies.v emboldens.v embosses.v embraces.v embroils.v emends.v emits.v empanels.v empowers.v emulates.v emulsifies.v enacts.v enamels.v encases.v enchants.v encircles.v encloses.v encodes.v encompasses.v encounters.v encrypts.v encumbers.v endangers.v endears.v endorses.v endows.v enervates.v enfeoffs.v enfolds.v enforces.v enfranchises.v engenders.v engineers.v engraves.v engrosses.v engulfs.v enhances.v enjoins.v enlarges.v enlightens.v enlivens.v enmeshes.v ennobles.v enrages.v enriches.v ensconces.v enshrines.v enshrouds.v enslaves.v ensnares.v ensouls.v entangles.v enthralls.v enthrals.v enthrones.v enthuses.v entombs.v entrains.v entrances.v entraps.v entreats.v entrusts.v entwines.v enumerates.v envelops.v envies.v epitomizes.v equalizes.v equals.v equates.v equips.v erases.v erects.v eschews.v escorts.v espies.v espouses.v esteems.v eulogizes.v evades.v evicts.v evinces.v eviscerates.v evokes.v exacerbates.v exalts.v exasperates.v excavates.v exceeds.v excepts.v exchanges.v excises.v excludes.v excommunicates.v excoriates.v excretes.v exculpates.v excuses.v executes.v exemplifies.v exempts.v exerts.v exhausts.v exhibits.v exhilarates.v exhumes.v exiles.v exorcizes.v expedites.v expels.v expends.v experiences.v expiates.v explicates.v exploits.v exposes.v expropriates.v expunges.v expurgates.v extenuates.v exterminates.v externalizes.v extinguishes.v extirpates.v extols.v extorts.v extracts.v extradites.v extricates.v exudes.v eyes.v fabricates.v facelifts.v facets.v facilitates.v fags.v fakes.v falsifies.v familiarizes.v fancies.v fascinates.v fashions.v fates.v fathoms.v fatigues.v faults.v favorites.v favours.v fazes.v feathers.v features.v feigns.v fells.v fences.v ferrets.v fertilizes.v festoons.v fetes.v fetters.v fianchettos.v fillets.v finalizes.v finances.v fine-tunes.v fingers.v firebombs.v flagellates.v flanks.v flatters.v flaunts.v flavours.v flays.v fleeces.v flicks.v flogs.v floodlights.v floors.v flouts.v fluffs.v flummoxes.v fluoridates.v flurries.v flusters.v foils.v foists.v foments.v fondles.v fonds.v fools.v force-feeds.v fords.v forecasts.v foregoes.v foreordains.v foreshadows.v foreshortens.v forestalls.v foreswears.v foretells.v forfeits.v forges.v forgoes.v formalizes.v formulates.v forsakes.v forswears.v fortifies.v forwards.v fosters.v founds.v frames.v franks.v frazzles.v frees.v frequents.v frescos.v fricassees.v fries.v frightens.v frisks.v fritters.v frogmarches.v frustrates.v fulfills.v fulfils.v fumigates.v funds.v funnels.v furbishes.v furnishes.v furrows.v furthers.v gages.v gainsays.v galls.v galvanizes.v gaols.v garbles.v garbs.v garners.v garnishes.v garrisons.v gashes.v gatecrashes.v gauges.v generates.v genericizes.v gerrymanders.v ghettoizes.v gilds.v gins.v girds.v glaciates.v gladdens.v glamorizes.v gleans.v glimpses.v glorifies.v gluts.v goads.v gores.v gorges.v grabs.v graces.v grades.v grafts.v gratifies.v gravels.v greases.v greenlights.v greets.v grills.v grips.v grits.v groins.v grooms.v grosses.v grudges.v guards.v guides.v guillotines.v gums.v guns.v guts.v guzzles.v gyps.v hallows.v halts.v halves.v hampers.v hamstrings.v handcrafts.v handcuffs.v handicaps.v handles.v harangues.v harasses.v harbors.v harbours.v harms.v harnesses.v harpoons.v harries.v harrows.v harvests.v hassles.v haunts.v hawks.v hazards.v hazes.v headquarters.v heaps.v heartens.v hearts.v heeds.v helms.v heralds.v highjacks.v highlights.v hijacks.v hinders.v hits.v hoaxes.v hobbles.v hocks.v hogs.v hollows.v homesteads.v homogenizes.v hones.v honors.v honours.v hoods.v hoodwinks.v horrifies.v horsewhips.v hoses.v hospitalizes.v hosts.v hotfoots.v hounds.v houses.v hulls.v humbles.v humbugs.v humiliates.v humours.v humps.v hunches.v hurls.v husks.v hyphenates.v hypnotizes.v idealizes.v identifies.v idolizes.v ignores.v ill-treats.v illuminates.v illumines.v illustrates.v images.v imbibes.v imbues.v imitates.v immerses.v immobilizes.v immolates.v immortalizes.v immunizes.v impacts.v impairs.v impales.v impanels.v imparts.v impeaches.v impedes.v imperils.v impersonates.v implants.v implements.v implicates.v imports.v imposes.v impounds.v impoverishes.v impregnates.v impresses.v imprints.v imprisons.v impugns.v imputes.v inactivates.v inaugurates.v incapacitates.v incarcerates.v incarnates.v incenses.v incinerates.v includes.v inconveniences.v incriminates.v inculcates.v incurs.v indemnifies.v indentures.v indexes.v indicts.v individuates.v indoctrinates.v inducts.v infatuates.v infects.v infests.v infills.v infiltrates.v inflames.v inflates.v inflects.v inflicts.v influences.v infuriates.v infuses.v ingests.v ingratiates.v inhabits.v inherits.v inhibits.v initials.v injects.v injures.v inks.v inoculates.v inscribes.v inseminates.v inserts.v inspects.v installs.v instates.v instigates.v instills.v instils.v institutes.v institutionalizes.v insulates.v insults.v insures.v integrates.v intercepts.v interchanges.v interdicts.v interests.v interjects.v interleaves.v internalizes.v internationalizes.v interoperates.v interpolates.v interrogates.v intersperses.v inters.v interweaves.v intimidates.v intones.v intoxicates.v introduces.v intuits.v inundates.v invades.v invalidates.v invalids.v inveigles.v invents.v inverts.v invigorates.v invokes.v irks.v irradiates.v irrigates.v isolates.v italicizes.v itemizes.v iterates.v jails.v jars.v jeopardizes.v jettisons.v jilts.v jinxes.v jinxs.v jollies.v jugs.v juxtaposes.v kens.v kidnaps.v kisses.v kneads.v knifes.v knights.v lacerates.v laces.v lacks.v lacquers.v lambastes.v laminates.v lampoons.v lances.v landscapes.v lassos.v lauds.v launders.v lavishes.v leaches.v leapfrogs.v leases.v leavens.v legalizes.v legitimatizes.v lenites.v leverages.v levers.v levies.v libels.v liberalizes.v liberates.v licences.v likens.v limits.v lionizes.v liquidizes.v lists.v loans.v loathes.v lobs.v lofts.v loots.v lubricates.v lugs.v lulls.v lumps.v lures.v lynches.v maddens.v magnetizes.v magnifies.v maims.v maligns.v maltreats.v manacles.v mandates.v mangles.v manhandles.v manicures.v manifests.v manipulates.v mans.v manufactures.v marginalises.v marginalizes.v markets.v maroons.v marshals.v mars.v martyrs.v mashes.v masks.v massages.v mass-produces.v masterminds.v masters.v masticates.v mauls.v maxes.v maximizes.v maxs.v measures.v mechanizes.v medicates.v memorializes.v memorizes.v menaces.v merits.v mesmerizes.v microfilms.v miffs.v milks.v mimeographs.v mimics.v minces.v miniaturizes.v minimizes.v mints.v mires.v mirrors.v misapplies.v misapprehends.v misappropriates.v miscasts.v misconceives.v misconstrues.v misdates.v misdirects.v misgoverns.v misguides.v mishandles.v mishears.v misinforms.v misinterprets.v mislays.v misleads.v mismanages.v misnames.v misplaces.v mispronounces.v misquotes.v misreads.v misrepresents.v misspells.v misspends.v misstates.v mistakes.v mistranslates.v mistreats.v mistrusts.v misuses.v mitigates.v mobs.v mocks.v models.v modifies.v modulates.v molds.v molests.v mollifies.v mollycoddles.v monitors.v monopolizes.v montages.v moors.v moots.v morphs.v mortars.v mortgages.v mortifies.v mothballs.v mothproofs.v motorizes.v muddies.v muds.v muffles.v muffs.v mugs.v mulches.v multiplexes.v multiplexs.v murders.v musters.v mutes.v mutilates.v muzzles.v myspaces.v mystifies.v nabs.v nags.v namespaces.v narrates.v nationalizes.v naturalizes.v needles.v negates.v nets.v nettles.v neuters.v neutralizes.v nicknames.v nicks.v nixes.v nixs.v noogies.v normalizes.v norms.v notarizes.v notates.v nourishes.v novelises.v novelizes.v nudges.v nullifies.v numbers.v numbs.v nurses.v nurtures.v obfuscates.v obligates.v obliterates.v obscures.v obstructs.v obtains.v obviates.v occasions.v occupies.v offends.v offloads.v offsets.v oils.v okays.v omens.v omits.v oppresses.v orchestrates.v ordains.v organizes.v orientates.v orients.v ornaments.v ostracizes.v ousts.v outbalances.v outclasses.v outdistances.v outdoes.v outfights.v outfits.v outflanks.v outfoxes.v outgrows.v outlasts.v outlaws.v outlines.v outlives.v outmanoeuvres.v outnumbers.v outplays.v outrages.v outranks.v outrides.v outrights.v outruns.v outscores.v outshines.v outsmarts.v outsources.v outstays.v outvotes.v outweighs.v outwits.v overawes.v overbears.v overburdens.v overcomes.v overcooks.v overcrowds.v overdoes.v overdubs.v overemphasizes.v overestimates.v overexerts.v overexposes.v overgrazes.v overhauls.v overhears.v overleaps.v overloads.v overlooks.v overpays.v overplays.v overpopulates.v overpowers.v overpraises.v overprints.v overrates.v overrides.v overrules.v overruns.v oversees.v overshadows.v overshoots.v oversimplifies.v overstates.v overstays.v oversteps.v overstocks.v overstrains.v oversubscribes.v overtakes.v overtaxes.v overvalues.v overwhelms.v overwrites.v owns.v oxygenates.v pacifies.v packages.v padlocks.v pads.v pages.v pains.v palatalizes.v pampers.v papers.v parallelizes.v parallels.v paralyses.v paralyzes.v parametrizes.v paraphrases.v parches.v pardons.v pares.v parodies.v paroles.v parries.v partitions.v partners.v pastes.v pasteurizes.v patents.v patrols.v patronizes.v pats.v patterns.v pauperizes.v pawns.v paws.v pedestrianizes.v pegs.v pelts.v penalizes.v pencils.v peppers.v perfects.v perforates.v perfumes.v perfuses.v perjures.v permeates.v perms.v permutes.v perpetrates.v perpetuates.v perplexes.v persecutes.v personalizes.v personifies.v perturbs.v peruses.v pervades.v perverts.v pesters.v pets.v photocopies.v photographs.v photosensitizes.v photostats.v phrases.v pickles.v pictures.v pierces.v pigeonholes.v pigments.v pilfers.v pilots.v pinches.v pinpoints.v pipes.v pips.v piques.v pirates.v pitchforks.v pities.v pits.v placates.v places.v plagiarizes.v plagues.v plants.v plasters.v pleases.v plies.v plumbs.v pluralizes.v pockets.v podcasts.v poisons.v polarizes.v polices.v polishes.v politicizes.v pollinates.v pollutes.v ponders.v pooh-poohs.v pools.v popularizes.v populates.v portages.v portends.v ports.v positions.v possesses.v postdates.v postmarks.v postpones.v posts.v powders.v praises.v prearranges.v precedes.v precipitates.v precludes.v preconceives.v predestines.v predetermines.v predicates.v predisposes.v pre-empts.v preempts.v preens.v prefabricates.v prefaces.v prefigures.v preforms.v preheats.v prejudges.v prejudices.v premeditates.v premises.v preoccupies.v preordains.v prepays.v prerecords.v prerenders.v presages.v prescribes.v presents.v preserves.v presorts.v pressurizes.v prestresses.v prettifies.v prevents.v prices.v prides.v primes.v prints.v privileges.v prizes.v probes.v processes.v proctors.v procures.v prods.v produces.v proffers.v profiles.v prognosticates.v prohibits.v prolongs.v promotes.v promulgates.v propels.v proportions.v propositions.v propounds.v proscribes.v prosecutes.v prostitutes.v prostrates.v protects.v prunes.v psychoanalyses.v psychoanalyzes.v publicizes.v publishes.v pulverizes.v pummels.v punctuates.v punishes.v purchases.v purees.v purifies.v purloins.v purses.v pursues.v purveys.v quaffs.v quantifies.v quarantines.v quarterbacks.v quarters.v quashes.v quells.v quenches.v queries.v quick-freezes.v quilts.v quotes.v radicalizes.v raffles.v raids.v railroads.v ramps.v rams.v ransacks.v ransoms.v rapes.v ratifies.v rationalizes.v rations.v ravages.v ravishes.v razes.v reacquaints.v re-addresses.v readmits.v reappoints.v reaps.v rearranges.v reassesses.v reauthorizes.v rebadges.v reboots.v rebrands.v rebroadcasts.v rebuffs.v rebukes.v rebuts.v recaptures.v recasts.v recesses.v rechristens.v recites.v reclaims.v recolors.v recommits.v recompenses.v reconciles.v reconditions.v reconquers.v reconsecrates.v reconsiders.v reconstructs.v reconvicts.v recoups.v recreates.v rectifies.v recuses.v recuts.v recycles.v redecorates.v redeems.v redefines.v redeploys.v redesignates.v redesigns.v redevelops.v rediscovers.v redistributes.v redoes.v redrafts.v redraws.v redresses.v redshirts.v reduces.v reduplicates.v re-educates.v reemploys.v reenacts.v reequips.v re-establishes.v reestablishes.v refashions.v refills.v refinances.v refines.v reflexes.v reformulates.v refracts.v refreshes.v refrigerates.v refunds.v refurbishes.v refurnishes.v refutes.v regains.v regales.v regiments.v regrades.v regularizes.v regulates.v regurgitates.v rehabilitates.v rehashes.v rehires.v rehouses.v reignites.v reimagines.v reimburses.v reinforces.v reinstalls.v reinstates.v reinsures.v reintegrates.v reinterprets.v reinvents.v reinvigorates.v reissues.v rejects.v rejoins.v rejuvenates.v relaunchs.v relays.v releases.v relegates.v relieves.v relinquishes.v relishes.v relists.v relives.v reloads.v remands.v remasters.v rematchs.v remedies.v remilitarizes.v remixs.v remodels.v remolds.v remoulds.v removes.v remunerates.v rends.v renews.v renominates.v renounces.v renovates.v renumbers.v reoccupys.v reorientates.v reorients.v repackages.v repaints.v repatriates.v repeals.v repels.v rephotographs.v rephrases.v replaces.v replants.v replasters.v replays.v replenishes.v replicates.v reprehends.v represents.v represses.v reprieves.v reprimands.v reprints.v reproaches.v reproofs.v reproves.v repudiates.v repulses.v repurchases.v repurposes.v reputes.v requisitions.v rereads.v rereleases.v rerolls.v reroutes.v reschedules.v rescinds.v rescues.v researches.v reseats.v resells.v resembles.v resents.v reserves.v resets.v reshapes.v reshuffles.v resits.v resoles.v respects.v restates.v restocks.v restores.v restrains.v restricts.v restructures.v restyles.v resubmits.v resurrects.v retains.v retakes.v retards.v retells.v rethinks.v retitles.v retouches.v retraces.v retracts.v retransmits.v retrieves.v retrys.v rets.v revalues.v revamps.v reveres.v revets.v reviews.v reviles.v revises.v revisits.v revitalizes.v revokes.v revolutionizes.v rewards.v rewaters.v rewires.v rewords.v rewrites.v ribs.v riddles.v ridicules.v rids.v rifles.v rights.v rims.v rivals.v rivets.v romanizes.v romanticizes.v ropes.v routes.v routs.v rubberizes.v rubber-stamps.v rubbers.v rues.v ruins.v rumples.v rusticates.v sabotages.v sacks.v saddens.v saddles.v safeguards.v salts.v salvages.v samples.v sanctifies.v sanctions.v sandblasts.v sandpapers.v sands.v sandwiches.v saps.v satiates.v satirises.v satirizes.v satisfies.v saturates.v sautes.v savages.v savours.v scalds.v scalps.v scandalizes.v scants.v scarpers.v scars.v scents.v schedules.v schools.v scoops.v scorches.v scorns.v scotches.v scours.v scraps.v scrunches.v scrutinizes.v sculpts.v scuttles.v sears.v seasons.v seats.v secretes.v secularizes.v secures.v sedates.v seduces.v seeds.v segregates.v selects.v sensationalizes.v sensitizes.v sentimentalizes.v sequesters.v serenades.v serializes.v services.v shackles.v shadows.v shames.v shampoos.v shapeshifts.v shares.v sharpens.v shears.v sheathes.v sheds.v shelters.v shelves.v shepherds.v shields.v shingles.v shirks.v shocks.v shoos.v short-changes.v shortlists.v shoulders.v shovels.v showcases.v shreds.v shrouds.v shucks.v shuns.v shunts.v shutters.v sickens.v sicks.v sidelines.v sidesteps.v sidetracks.v sieves.v sights.v signposts.v silences.v silhouettes.v simplifies.v simulates.v simulcasts.v siphons.v sires.v skewers.v skins.v skippers.v skirts.v slakes.v slanders.v slaps.v slashes.v slates.v slaughters.v slays.v sleeves.v slices.v slights.v slings.v slots.v slugs.v slurs.v smelts.v smites.v smothers.v snags.v snares.v snubs.v socks.v sodomizes.v soft-pedals.v soils.v solders.v solicits.v solves.v soothes.v soundproofs.v soups.v sources.v souses.v spades.v spanks.v spans.v spares.v spays.v spearheads.v spears.v specifies.v spews.v spikes.v spin-dries.v spirits.v spites.v sponsors.v spoonfeeds.v spotlights.v spots.v sprains.v sprays.v sprinkles.v spurns.v squanders.v squelchs.v squires.v stabs.v staffs.v stages.v stalemates.v standardizes.v staples.v starches.v startles.v stashes.v stations.v staunches.v steals.v steamrollers.v steels.v stereotypes.v sterilizes.v stiffs.v stigmatizes.v stills.v stimulates.v stitches.v stockades.v stokes.v stomachs.v stones.v stores.v storyboards.v stows.v straddles.v strafes.v straitens.v strangles.v straps.v streamlines.v strews.v strokes.v structures.v stubs.v stuccos.v studs.v stuns.v stunts.v styles.v stylizes.v stymies.v subdues.v subedits.v subjects.v subjugates.v sublimates.v subordinates.v subpoenas.v subserves.v subsidizes.v substantiates.v subsumes.v subtends.v subtracts.v subverts.v succours.v suckles.v suffuses.v suicides.v suits.v sullies.v summarizes.v summons.v sunders.v suns.v superimposes.v supersedes.v supplants.v supplements.v supplies.v supports.v suppresses.v surmounts.v surnames.v surpasses.v surrounds.v surveys.v suspends.v sustains.v swamps.v swathes.v swats.v sweetens.v swigs.v swindles.v swipes.v symbolizes.v syncopates.v syndicates.v synthesizes.v syphons.v systematizes.v tables.v tabulates.v tailors.v tails.v taints.v tames.v tamps.v tantalizes.v targets.v tars.v tattoos.v taunts.v taxes.v teases.v telecasts.v teleports.v telescopes.v televises.v tenders.v terraces.v terrifies.v terrorizes.v tessellates.v test-drives.v tethers.v thanks.v thatches.v thirsts.v threads.v thumbs.v thwarts.v tickets.v tiers.v tiles.v tills.v timelines.v times.v tints.v titillates.v toes.v tolerates.v torchs.v torments.v torpedos.v tortures.v totes.v tours.v tousles.v touts.v towels.v tows.v trademarks.v tramples.v tranquilizes.v tranquillizes.v transacts.v transcends.v transcodes.v transcribes.v transfixes.v transforms.v transfuses.v transgenders.v transistorizes.v transitions.v transmits.v transmutes.v transports.v transposes.v transships.v traps.v trashs.v traverses.v treasures.v tricks.v triggers.v trivializes.v troubles.v trounces.v truncates.v turbocharges.v tutors.v tweaks.v twiddles.v typecasts.v typifies.v tyrannizes.v unaffiliates.v unbalances.v unbans.v unblocks.v unbolts.v unbuckles.v unburdens.v unbuttons.v unclothes.v unclutters.v uncorks.v uncouples.v uncovers.v uncrosses.v undercharges.v undercuts.v underestimates.v underexposes.v underfunds.v undergoes.v underlies.v underlines.v undermines.v underpays.v underpins.v underquotes.v underrates.v underrepresents.v underscores.v undersells.v underserves.v undershoots.v undersigns.v understates.v understocks.v understudies.v undervalues.v underwrites.v undoes.v unearths.v unencumbers.v unfetters.v unfrocks.v unfurls.v unhands.v unhinges.v unhooks.v uninstalls.v unlearns.v unleashes.v unlooses.v unmasks.v unnerves.v unplugs.v unrecords.v unsaddles.v unscrambles.v unsettles.v unsheathes.v unveils.v unzips.v upbraids.v updates.v upgrades.v upholds.v upholsters.v uplifts.v uprights.v uproots.v upsets.v upstages.v ushers.v usurps.v utilizes.v utters.v vacates.v vaccinates.v valets.v validates.v values.v vanquishes.v varnishes.v veils.v vends.v venerates.v ventilates.v vents.v verbalizes.v vetoes.v vetos.v vets.v vexes.v victimizes.v videotapes.v vilifies.v vindicates.v violates.v visas.v visualizes.v vitiates.v vivisects.v vocalizes.v voices.v voids.v vouchsafes.v vulgarizes.v wages.v waives.v wallops.v walls.v wangles.v wards.v warehouses.v warrants.v wastes.v waterproofs.v waylays.v weans.v weaponizes.v weathers.v wedges.v weights.v welcomes.v wends.v westernizes.v wets.v whacks.v wheedles.v whets.v whiles.v whitewashes.v wields.v wikis.v wings.v winnows.v withholds.v withstands.v witnesses.v wolfs.v woos.v words.v worms.v wounds.v wreaks.v wrecks.v wrenches.v wrests.v wrongs.v zaps.v zones.v link-grammar-4.7.4/data/en/words/words.v.1.20000644000175000017500000002632211406233171017411 0ustar bloombloomabates.v abounds.v about-faces.v absconds.v abstains.v accedes.v accounts.v accrues.v aches.v acquiesces.v adenizes.v adheres.v adjoins.v ad-libs.v alights.v alludes.v ambles.v ambulates.v amounts.v anteflects.v apologizes.v apostatizes.v appertains.v aquaplanes.v arises.v arrives.v assents.v astringes.v atones.v atrophies.v attitudinizes.v autoagglutinates.v autodegrades.v autooxidises.v auto-oxidizes.v autooxidizes.v autoproliferates.v autotomizes.v autoxidizes.v baas.v babbles.v babysits.v backbites.v backfires.v backpedals.v backslides.v backspaces.v bacteriolyzes.v balks.v balloons.v bams.v banquets.v banters.v bants.v barfs.v barks.v barnstorms.v basks.v bawls.v bays.v beeps.v beetles.v behaves.v belches.v bellyaches.v belongs.v bickers.v billows.v biodegrades.v bitches.v bitchs.v blabbers.v blathers.v blazes.v bleats.v bleeps.v blenches.v blenchs.v blethers.v bloats.v blooms.v blossoms.v blubbers.v blunders.v blushes.v bodes.v booms.v brakes.v brawls.v brays.v bristles.v broods.v browses.v bubbles.v buds.v bullshits.v bunks.v burbles.v burgeons.v burps.v bustles.v cabs.v cackles.v calves.v campaigns.v canaliculizes.v canters.v capers.v capillarizes.v capitulates.v careens.v carols.v carouses.v cascades.v castles.v caters.v caterwauls.v cavils.v cavorts.v chafes.v chatters.v cheeps.v chemosensitises.v chimes.v chirps.v chirrups.v chortles.v chromatofocuses.v chromatofocusses.v chuckles.v chugs.v chums.v clacks.v clambers.v clamours.v clanks.v clashes.v clatters.v clerks.v climaxes.v clings.v clucks.v clunks.v clusters.v coalesces.v coasts.v cocirculates.v coevolves.v coexists.v cohabits.v coheres.v coincides.v collaborates.v collateralizes.v collides.v colludes.v comigrates.v commentates.v commiserates.v communes.v comodulates.v competes.v complies.v compromises.v confabs.v confabulates.v conflicts.v conforms.v congeals.v congregates.v connives.v consorts.v conspires.v convalesces.v converges.v converses.v co-operates.v cooperates.v co-ossifys.v coossifys.v coos.v copes.v copulates.v corresponds.v coruscates.v counterphases.v covaries.v covarys.v cowers.v crackles.v crash-dives.v creaks.v crepitates.v crests.v cringes.v croaks.v cross-dresses.v crossdresses.v crossmatchs.v crouches.v crows.v crusades.v culminates.v curtseys.v curtsies.v cycles.v cyclizes.v cytoadheres.v cytodifferentiates.v dabbles.v dallies.v dawdles.v dawns.v day-dreams.v daydreams.v decamps.v decays.v deceases.v declutchs.v decompensates.v decrements.v decussates.v de-etiolates.v deetiolates.v defasciculates.v defaults.v defecates.v defects.v deflagrates.v degenerates.v dehisces.v delaminates.v deliberates.v delves.v demurs.v departs.v depends.v deplanes.v deplasmolyzes.v depreciates.v deputizes.v desists.v despairs.v deswells.v deteriorates.v detracts.v detrains.v deviates.v devolves.v diets.v differs.v digitates.v digresses.v dilly-dallies.v disagrees.v disappears.v discourses.v discriminates.v disembarks.v disintegrates.v disrobes.v dissembles.v dissents.v dissertates.v dithers.v divagates.v diverges.v dodders.v domineers.v doodles.v dotes.v double-parks.v dovetails.v downshifts.v downslants.v downslopes.v dows.v drawls.v drizzles.v drools.v duels.v dwells.v dwindles.v eavesdrops.v ebbs.v economizes.v eddies.v editorializes.v effervesces.v effloresces.v elapses.v electioneers.v elopes.v emanates.v embarks.v emerges.v emigrates.v emotes.v empathizes.v encamps.v encroaches.v enquires.v ensues.v equivocates.v errs.v eructs.v erupts.v evaporates.v eventuates.v excels.v exflagellates.v exists.v exits.v exosmoses.v expatiates.v experiments.v expires.v explants.v expostulates.v exults.v faints.v falters.v fares.v farts.v fasts.v fawns.v feints.v festers.v festinates.v fibroses.v fibs.v fidgets.v filibusters.v fizzes.v flails.v flakes.v flames.v flickers.v flinches.v flirts.v flits.v flops.v flounders.v flourishes.v flowers.v fluctuates.v fluoresces.v flutters.v fly-fishes.v foot-slogs.v forages.v foregathers.v forgathers.v fornicates.v fossilizes.v foxhunts.v fragments.v fraternizes.v freelances.v free-wheels.v freewheels.v frets.v frivols.v frolics.v froths.v frowns.v fulminates.v fumes.v functions.v fundholds.v fungates.v fusses.v gallivants.v galumphs.v gambols.v gapes.v gardens.v gastrulates.v gawks.v gawps.v gazes.v gelates.v gels.v genuflects.v gesticulates.v gestures.v gibbers.v gibes.v giggles.v glares.v gleams.v glides.v glimmers.v glints.v glistens.v glisters.v glitches.v glitters.v gloats.v globe-trots.v globetrots.v glories.v glowers.v glows.v goggles.v golfs.v gormandizes.v gossips.v graduates.v grapples.v gravitates.v grays.v grazes.v greys.v grimaces.v grins.v grooves.v grouches.v grouses.v grovels.v guffaws.v gurgles.v gusts.v gybes.v gyrates.v haggles.v hales.v hallucinates.v hankers.v harks.v harps.v haws.v hearkens.v heels.v herniates.v heterodimerizes.v heteromultimerizes.v hews.v hibernates.v hiccoughs.v hiccups.v hinges.v hisses.v hitchhikes.v hobnobs.v hollers.v honeymoons.v hovers.v huddles.v huffs.v hungers.v hurtles.v hydroplanes.v hyperaggregates.v hyperdefecates.v hyperfilters.v hyperluteinizes.v hypermutates.v hypertrophys.v hyporesonates.v hyporesponds.v ice-skates.v immigrates.v immunoreacts.v impends.v impinges.v inches.v infarcts.v innovates.v interacts.v intercedes.v intercommunicates.v interdigitates.v interferes.v intermarries.v intermingles.v intervenes.v introspects.v intrudes.v intumesces.v inveighs.v involutes.v itches.v jabbers.v jack-knifes.v jaunts.v jaws.v jay-walks.v jaywalks.v jells.v jests.v jibes.v jitters.v jives.v jockeys.v jokes.v journeys.v jousts.v kemps.v kowtows.v lacrimates.v lactates.v lags.v languishes.v lapses.v lases.v laughs.v leafs.v leers.v legislates.v liaises.v lip-reads.v lisps.v lives.v loafs.v locomotes.v loiters.v lolls.v longs.v lopes.v lounges.v lowns.v lumbers.v lurches.v lurks.v lusts.v luxuriates.v majors.v malfunctions.v malignizes.v malingers.v marauds.v marvels.v masquerades.v materializes.v matriculates.v maturates.v matures.v maunders.v meanders.v meddles.v meditates.v menstruates.v meows.v metamorphoses.v metastasizes.v mews.v miaous.v miaows.v micturates.v migrates.v militates.v mingles.v ministers.v misbehaves.v misfires.v molts.v monkeys.v mooches.v moos.v mopes.v moralizes.v moseys.v motioned.v motions.v motors.v moulders.v muck-rakes.v mushrooms.v mutinies.v name-drops.v naps.v natters.v necks.v necroses.v neighs.v nests.v networks.v niggles.v nosedives.v noshes.v objects.v occurs.v officiates.v orates.v oscillates.v oscitates.v osmoregulates.v osmoses.v osseointegrates.v outgoes.v overacts.v overbids.v overcompensates.v overeats.v overlies.v overreacts.v oversleeps.v overwinters.v ovulates.v pales.v palls.v palpebrates.v palpitates.v panders.v panhandles.v panics.v pants.v parachutes.v parleys.v partakes.v participates.v patters.v pauses.v peaks.v pearls.v peeps.v pellates.v perambulates.v percolates.v perishes.v perseveres.v persists.v perspires.v pertains.v philanders.v philosophizes.v picnics.v piddles.v pimps.v pings.v pirouettes.v pivots.v planes.v play-acts.v plods.v plummets.v politicks.v polkas.v pollocks.v poms.v pontificates.v pores.v postures.v potters.v pounces.v pouts.v powwows.v prances.v prates.v prattles.v preachifys.v predominates.v pre-exists.v preponderates.v preregisters.v presides.v prevails.v prevaricates.v preys.v primps.v procrastinates.v procreates.v profiteers.v profits.v progresses.v prolapses.v proliferates.v propagandizes.v proselytizes.v prospers.v protrudes.v pub-crawls.v pules.v pullulates.v pulsates.v pulses.v puns.v pupariates.v pupates.v purrs.v pussyfoots.v putrefies.v putters.v quacks.v quakes.v quarrels.v quarries.v quavers.v quests.v queues.v quibbles.v quips.v quivers.v rackets.v rafts.v rages.v rails.v rains.v rambles.v rampages.v rankles.v rants.v rasps.v rats.v raves.v reacts.v reappears.v rebels.v rebounds.v recedes.v reclines.v recoils.v reconnoitres.v recriminates.v recrudesces.v recuperates.v recurs.v redecussates.v redounds.v re-echos.v re-emerges.v reemerges.v refects.v refixates.v reflows.v refrains.v regresses.v reigns.v re-infarcts.v reinfarcts.v re-intervenes.v reintervenes.v rejoices.v relapses.v relents.v relies.v reminisces.v remonstrates.v renarrows.v rendezvouses.v reneges.v re-occurs.v reoccurs.v repetaturs.v repines.v resides.v resonates.v resorts.v resounds.v respires.v restenoses.v rests.v results.v resurfaces.v retaliates.v retches.v retreats.v retrenches.v retrogrades.v retrogresses.v revels.v reverberates.v reverts.v revolts.v revolves.v rhapsodizes.v riots.v ripens.v ripostes.v ripples.v rockets.v romances.v romps.v rooms.v roosts.v rootles.v rough-houses.v roves.v rubber-necks.v rubbernecks.v rumbles.v ruminates.v rummages.v rusts.v sags.v salivates.v saunters.v scampers.v scar_cicatrizes scavenges.v schemes.v scintillates.v scowls.v scrams.v screeches.v scrimps.v scrimshanks.v scrolls.v scrounges.v scubas.v scuffles.v secedes.v seesaws.v seethes.v sermonizes.v seroconverts.v seroreverts.v shadow-boxes.v shadow-boxs.v shilly-shallies.v shillyshallies.v shilly-shallys.v shimmers.v shits.v shivers.v shrimps.v shudders.v side-slips.v sides.v sidles.v simmers.v simpers.v sins.v sizzles.v skates.v skedaddles.v skimps.v skirmishes.v skulks.v skylarks.v sky-rockets.v skyrockets.v slackens.v slaloms.v slavers.v sleets.v slithers.v slobbers.v slogs.v slouches.v slumbers.v slums.v slushs.v smarts.v smiles.v smirks.v smolders.v smoulders.v snacks.v snakes.v sneers.v sneezes.v snickers.v sniffles.v sniggers.v snipes.v snitches.v snivels.v snoops.v snoozes.v snores.v snowballs.v snowboards.v snowshoes.v snows.v snuffles.v sobs.v softlands.v sojourns.v soliloquizes.v somersaults.v soughs.v sours.v sparkles.v spars.v specialises.v specializes.v speciates.v speechifies.v spermiates.v sphacelates.v splurges.v splutters.v sprawls.v sprints.v sputters.v squabbles.v squalls.v squawks.v squeaks.v squeals.v squints.v squirms.v stagnates.v stems.v stone-walls.v straggles.v strays.v strides.v stridulates.v strives.v struggles.v stutters.v subscribes.v subsides.v subsists.v subspecializes.v subs.v succumbs.v sulks.v summers.v sunbathes.v supercoils.v supervenes.v suppurates.v sups.v surfaces.v surges.v swaggers.v swarms.v swelters.v swerves.v swirls.v swoons.v sympathizes.v tampers.v tap-dances.v tapdances.v tarries.v tattles.v taxis.v teems.v teeters.v teethes.v temporizes.v tergiversates.v testates.v thrives.v throbs.v thuds.v tingles.v tinkers.v tipples.v tiptoes.v titters.v tittle-tattles.v toadies.v toboggans.v toils.v tolls.v tootles.v totters.v touch-types.v towers.v toys.v traipses.v transmigrates.v transpires.v travels.v treks.v trembles.v trespasses.v trifles.v trifurcates.v triumphs.v trundles.v tunnels.v tussles.v tweets.v twinkles.v twitches.v twitters.v ululates.v underacts.v undulates.v uplinks.v urinates.v urticates.v vacations.v vacillates.v vacuolates.v vamooses.v vamps.v vanishes.v vaults.v vegetates.v venodilates.v verbigerates.v verges.v vies.v volvulates.v vouches.v voyages.v waddles.v waffles.v wallows.v waltzes.v wanders.v wanes.v wanks.v warbles.v water-skis.v waterskis.v wavers.v weeps.v welshes.v welters.v wheezes.v whelps.v whimpers.v whinnies.v whirrs.v whirs.v wilts.v winces.v winks.v wiretaps.v wisecracks.v withers.v wobbles.v womanizes.v wool-gathers.v woolgathers.v wrangles.v wriggles.v writhes.v yachts.v yaks.v yammers.v yangs.v yaps.v yawns.v yaws.v yearns.v yelps.v yens.v yips.v yowls.v zags.v zigs.v zig-zags.v zigzags.v link-grammar-4.7.4/data/en/words/words.adj.20000644000175000017500000001723611526022265017552 0ustar bloombloomabler.a-c abrupter.a-c airier.a-c ampler.a-c angrier.a-c apter.a-c ashier.a-c atonaler.a-c badder.a-c baggier.a-c balder.a-c balmier.a-c barer.a-c baser.a-c battier.a-c bawdier.a-c beerier.a-c better-defined.a-c bigger.a-c bitterer.a-c blacker.a-c blander.a-c bleaker.a-c blearier.a-c blonder.a-c bloodier.a-c blotchier.a-c bluer.a-c blunter.a-c boggier.a-c bolder.a-c bonier.a-c bossier.a-c bouncier.a-c brainier.a-c brasher.a-c brassier.a-c braver.a-c brawnier.a-c breathier.a-c breezier.a-c briefer.a-c brighter.a-c brisker.a-c bristlier.a-c brittler.a-c broader.a-c broodier.a-c browner.a-c bubblier.a-c buckier.a-c buggier.a-c bulkier.a-c bumpier.a-c bunchier.a-c burlier.a-c bushier.a-c busier.a-c butterier.a-c calmer.a-c cannier.a-c catchier.a-c chalkier.a-c chancier.a-c chattier.a-c cheaper.a-c cheesier.a-c chillier.a-c choicer.a-c choppier.a-c chubbier.a-c clammier.a-c cleaner.a-c cleanlier.a-c clearer.a-c cleverer.a-c closer.a-c cloudier.a-c clumsier.a-c coarser.a-c cockier.a-c colder.a-c commoner.a-c cooler.a-c cornier.a-c cosier.a-c costlier.a-c courtlier.a-c coyer.a-c cozier.a-c craftier.a-c craggier.a-c crampier.a-c crazier.a-c creakier.a-c creamier.a-c crisper.a-c crosser.a-c cruder.a-c crueller.a-c crunchier.a-c crustier.a-c cuddlier.a-c curlier.a-c curter.a-c cuter.a-c daintier.a-c damneder.a-c damper.a-c dandier.a-c darker.a-c deader.a-c deadlier.a-c deafer.a-c dearer.a-c defter.a-c denser.a-c dimmer.a-c dingier.a-c dirtier.a-c dizzier.a-c dopeyer.a-c dopier.a-c dottier.a-c doughier.a-c doughtier.a-c dowdier.a-c downier.a-c drabber.a-c draftier.a-c draughtier.a-c dreamier.a-c drearier.a-c dressier.a-c drier.a-c drowsier.a-c drunker.a-c duller.a-c dumber.a-c dumpier.a-c duskier.a-c dustier.a-c earthier.a-c edgier.a-c eerier.a-c emptier.a-c faddier.a-c fainter.a-c fairer.a-c fatter.a-c fattier.a-c faultier.a-c feebler.a-c fiercer.a-c fierier.a-c filmier.a-c filthier.a-c finer.a-c firmer.a-c fishier.a-c fizzier.a-c flabbier.a-c flakier.a-c flashier.a-c fleshier.a-c flimsier.a-c floppier.a-c fluffier.a-c foamier.a-c foggier.a-c fonder.a-c fouler.a-c foxier.a-c frailer.a-c franker.a-c freer.a-c fresher.a-c friendlier.a-c frizzier.a-c frostier.a-c frothier.a-c fruitier.a-c fuller.a-c funnier.a-c furrier.a-c fussier.a-c fuzzier.a-c gassier.a-c gaucher.a-c gaudier.a-c gaunter.a-c gawkier.a-c gayer.a-c gentler.a-c giddier.a-c gladder.a-c glassier.a-c glibber.a-c gloomier.a-c glummer.a-c goofier.a-c gooier.a-c gorier.a-c goutier.a-c grainier.a-c grander.a-c grassier.a-c graver.a-c grayer.a-c greasier.a-c greater.a-c greedier.a-c greener.a-c greyer.a-c grimmer.a-c grittier.a-c groggier.a-c groovier.a-c grosser.a-c grubbier.a-c gruffer.a-c grumpier.a-c guiltier.a-c gummier.a-c gustier.a-c hairier.a-c handier.a-c handsomer.a-c happier.a-c hardier.a-c harsher.a-c hastier.a-c haughtier.a-c hazier.a-c headier.a-c healthier.a-c heartier.a-c heavier.a-c heftier.a-c higher-density.a-c higher-efficiency.a-c higher-priority.a-c higher-quality.a-c higher-resistance.a-c hillier.a-c hoarer.a-c hoarier.a-c hoarser.a-c holier.a-c hollower.a-c homelier.a-c hornier.a-c hotter.a-c huger.a-c humbler.a-c hungrier.a-c huskier.a-c icier.a-c idler.a-c impurer.a-c inepter.a-c jauntier.a-c jerkier.a-c jitterier.a-c jollier.a-c juicier.a-c jumpier.a-c keener.a-c kinder.a-c kindlier.a-c kinkier.a-c knobbier.a-c knottier.a-c lacier.a-c lamer.a-c lankier.a-c larger.a-c laxer.a-c lazier.a-c leakier.a-c leaner.a-c lengthier.a-c lewder.a-c lighter.a-c likelier.a-c limper.a-c littler.a-c livelier.a-c loamier.a-c loftier.a-c lonelier.a-c longer-lasting.a-c longerlasting.a-c loonier.a-c loopier.a-c looser.a-c lordlier.a-c louder.a-c lousier.a-c lovelier.a-c lower-density.a-c lower-dose.a-c lower-fat.a-c lower-grade.a-c lower-profile.a-c lower-risk.a-c lowlier.a-c lowner.a-c loyaller.a-c luckier.a-c lumpier.a-c lusher.a-c lustier.a-c madder.a-c manlier.a-c marshier.a-c massier.a-c maturer.a-c mealier.a-c meaner.a-c meatier.a-c meeker.a-c mellower.a-c merrier.a-c messier.a-c mightier.a-c milder.a-c milkier.a-c minuter.a-c mistier.a-c moister.a-c moldier.a-c moodier.a-c mossier.a-c mouldier.a-c mouseyer.a-c mousier.a-c muddier.a-c murkier.a-c mushier.a-c mustier.a-c muzzier.a-c narrower.a-c nastier.a-c nattier.a-c naughtier.a-c nearer.a-c neater.a-c needier.a-c newer.a-c nobler.a-c noisier.a-c noseyer.a-c nosier.a-c nuder.a-c obtuser.a-c odder.a-c oilier.a-c older.a-c paler.a-c palmier.a-c pastier.a-c patchier.a-c paunchier.a-c pearlier.a-c peatier.a-c pebblier.a-c perkier.a-c peskier.a-c pettier.a-c pickier.a-c piggier.a-c pinker.a-c pithier.a-c plainer.a-c pleasanter.a-c plumper.a-c plusher.a-c podgier.a-c pokier.a-c politer.a-c poorer.a-c posher.a-c pottier.a-c prettier.a-c pricier.a-c pricklier.a-c primmer.a-c profounder.a-c proner.a-c prouder.a-c pudgier.a-c puffier.a-c pulpier.a-c punier.a-c purer.a-c purpler.a-c quainter.a-c queasier.a-c queerer.a-c quieter.a-c racier.a-c rainier.a-c randier.a-c rarer.a-c readier.a-c realer.a-c redder.a-c reedier.a-c remoter.a-c richer.a-c riper.a-c riskier.a-c rockier.a-c rosier.a-c rougher.a-c rounder.a-c rowdier.a-c ruddier.a-c ruder.a-c runnier.a-c rustier.a-c sadder.a-c safer.a-c saintlier.a-c saltier.a-c sandier.a-c saner.a-c saucier.a-c savvier.a-c scabbier.a-c scalier.a-c scanter.a-c scantier.a-c scarcer.a-c scarier.a-c scratchier.a-c scrawnier.a-c scurfier.a-c scurvier.a-c securer.a-c sedater.a-c seedier.a-c severer.a-c sexier.a-c shabbier.a-c shadier.a-c shadowier.a-c shaggier.a-c shakier.a-c shallower.a-c shapelier.a-c sharper.a-c sheerer.a-c shiftier.a-c shinier.a-c shoddier.a-c shorter.a-c showier.a-c shrewder.a-c shriller.a-c shyer.a-c sicker.a-c sicklier.a-c silkier.a-c sillier.a-c siltier.a-c silverier.a-c simpler.a-c sincerer.a-c sketchier.a-c skinnier.a-c slacker.a-c slangier.a-c sleeker.a-c sleepier.a-c slenderer.a-c slicker.a-c slier.a-c slighter.a-c slimier.a-c slimmer.a-c slipperier.a-c sloppier.a-c slovenlier.a-c slower.a-c slyer.a-c smaller.a-c smellier.a-c smokier.a-c smoother.a-c smugger.a-c smuttier.a-c snappier.a-c snarkier.a-c snazzier.a-c sneakier.a-c snowier.a-c snugger.a-c soapier.a-c soberer.a-c softer.a-c soggier.a-c sootier.a-c sorer.a-c sorrier.a-c sounder.a-c sourer.a-c sparer.a-c sparser.a-c speedier.a-c spicier.a-c spikier.a-c spinier.a-c spongier.a-c spookier.a-c sportier.a-c spottier.a-c sprightlier.a-c sprucer.a-c squarer.a-c stabler.a-c staler.a-c stancher.a-c starchier.a-c starker.a-c statelier.a-c stauncher.a-c steadier.a-c steelier.a-c steeper.a-c sterner.a-c stickier.a-c stiffer.a-c stiller.a-c stingier.a-c stockier.a-c stonier.a-c stormier.a-c stouter.a-c straighter.a-c stranger.a-c streakier.a-c stricter.a-c stringier.a-c stronger.a-c stubbier.a-c stuffier.a-c stumpier.a-c stupider.a-c sturdier.a-c subtler.a-c sulkier.a-c sunnier.a-c surer.a-c surlier.a-c swampier.a-c sweatier.a-c sweeter.a-c swifter.a-c taller.a-c tamer.a-c tardier.a-c tarter.a-c tastier.a-c tauter.a-c tawdrier.a-c tawnier.a-c tenderer.a-c tenser.a-c terser.a-c testier.a-c thicker.a-c thinner.a-c thirstier.a-c thornier.a-c thriftier.a-c throatier.a-c tidier.a-c tighter.a-c timelier.a-c tinier.a-c toothier.a-c touchier.a-c tougher.a-c trickier.a-c truer.a-c uglier.a-c uneasier.a-c unfriendlier.a-c unhappier.a-c unhealthier.a-c unlikelier.a-c unrulier.a-c unsightlier.a-c unwieldier.a-c vaguer.a-c vainer.a-c vaster.a-c viler.a-c wanner.a-c warier.a-c warmer.a-c waterier.a-c wavier.a-c waxier.a-c weaker.a-c weaklier.a-c wealthier.a-c wearier.a-c weer.a-c weightier.a-c weirder.a-c wetter.a-c wheezier.a-c whiter.a-c wickeder.a-c wider.a-c wider-angle.a-c wilder.a-c wilier.a-c windier.a-c wintrier.a-c wirier.a-c wiser.a-c wispier.a-c wittier.a-c wobblier.a-c woodier.a-c woolier.a-c woollier.a-c woozier.a-c wordier.a-c worldlier.a-c worthier.a-c wrier.a-c yellower.a-c younger.a-c link-grammar-4.7.4/data/en/words/words.v.10.40000644000175000017500000000213410204377537017500 0ustar bloombloomacknowledging.q adding.q admitting.q affirming.q agreeing.q announcing.q arguing.q ascertaining.q asserting.q assuming.q believing.q bragging.q calculating.q charging.q claiming.q commanding.q commenting.q complaining.q conceding.q concluding.q confessing.q confirming.q contending.q deciding.q declaring.q deducing.q determining.q discerning.q disclosing.q discovering.q emphasizing.q envisioning.q exclaiming.q explaining.q figuring.q guessing.q hinting.q hoping.q implying.q inquiring.q insisting.q intimating.q learning.q maintaining.q musing.q muttering.q noting.q observing.q ordering.q pledging.q postulating.q predicting.q presuming.q proclaiming.q proposing.q proving.q reading.q realizing.q reasoning.q recalling.q reckoning.q recognizing.q recounting.q reflecting.q remarking.q remembering.q repeating.q replying.q reporting.q resolving.q responding.q retorting.q revealing.q ruling.q shouting.q sighing.q speculating.q stating.q stipulating.q stressing.q suggesting.q testifying.q theorizing.q thinking.q threatening.q warning.q whispering.q wondering.q writing.q relating.q continuing.q link-grammar-4.7.4/data/en/words/words.v.1.30000644000175000017500000003366011406233171017415 0ustar bloombloomabated.v-d abounded.v-d about-faced.v-d absconded.v-d abstained.v-d acceded.v-d accounted.v-d accrued.v-d ached.v-d acquiesced.v-d adenized.v-d adhered.v-d adjoined.v-d ad-libbed.v-d alighted.v-d alluded.v-d ambled.v-d ambulated.v-d amounted.v-d anteflected.v-d apologized.v-d apostatized.v-d appertained.v-d aquaplaned.v-d arose.v-d arrived.v-d assented.v-d astringed.v-d atoned.v-d atrophied.v-d attitudinized.v-d autoagglutinated.v-d autodegraded.v-d autooxidised.v-d auto-oxidized.v-d autooxidized.v-d autoproliferated.v-d autotomized.v-d autoxidized.v-d baaed.v-d babbled.v-d babysat.v-d backbited.v-d backfired.v-d backpedalled.v-d backslid.v-d backspaced.v-d bacteriolyzed.v-d balked.v-d ballooned.v-d bammed.v-d banqueted.v-d banted.v-d bantered.v-d barfed.v-d barked.v-d barnstormed.v-d basked.v-d bawled.v-d bayed.v-d beeped.v-d beetled.v-d behaved.v-d belched.v-d bellyached.v-d belonged.v-d bickered.v-d billowed.v-d biodegraded.v-d bitched.v-d blabbered.v-d blathered.v-d blazed.v-d bleated.v-d bleeped.v-d blenched.v-d blethered.v-d bloated.v-d bloomed.v-d blossomed.v-d blubbered.v-d blundered.v-d blushed.v-d boded.v-d boomed.v-d braked.v-d brawled.v-d brayed.v-d bristled.v-d brooded.v-d browsed.v-d bubbled.v-d budded.v-d bullshitted.v-d bunked.v-d burbled.v-d burgeoned.v-d burped.v-d bustled.v-d cabbed.v-d cackled.v-d calved.v-d campaigned.v-d canaliculized.v-d cantered.v-d capered.v-d capillarized.v-d capitulated.v-d careened.v-d caroled.v-d carolled.v-d caroused.v-d cascaded.v-d castled.v-d catered.v-d caterwauled.v-d caviled.v-d cavilled.v-d cavorted.v-d chafed.v-d chattered.v-d cheeped.v-d chemosensitised.v-d chimed.v-d chirped.v-d chirruped.v-d chortled.v-d chromatofocused.v-d chromatofocussed.v-d chuckled.v-d chugged.v-d chummed.v-d clacked.v-d clambered.v-d clamored.v-d clamoured.v-d clanked.v-d clashed.v-d clattered.v-d clerked.v-d climaxed.v-d clucked.v-d clung.v-d clunked.v-d clustered.v-d coalesced.v-d coasted.v-d cocirculated.v-d coevolved.v-d coexisted.v-d cohabited.v-d cohered.v-d coincided.v-d collaborated.v-d collateralized.v-d collided.v-d colluded.v-d comigrated.v-d commentated.v-d commiserated.v-d communed.v-d comodulated.v-d competed.v-d complied.v-d compromised.v-d confabbed.v-d confabulated.v-d conflicted.v-d conformed.v-d congealed.v-d congregated.v-d connived.v-d consorted.v-d conspired.v-d convalesced.v-d converged.v-d conversed.v-d cooed.v-d co-operated.v-d cooperated.v-d co-ossifyed.v-d coossifyed.v-d coped.v-d copulated.v-d corresponded.v-d coruscated.v-d counterphased.v-d covaried.v-d covaryed.v-d cowered.v-d crackled.v-d crash-dived.v-d creaked.v-d crepitated.v-d crested.v-d cringed.v-d croaked.v-d cross-dressed.v-d crossdressed.v-d crossmatched.v-d crowed.v-d crusaded.v-d culminated.v-d curtseyed.v-d curtsied.v-d cycled.v-d cyclized.v-d cytoadhered.v-d cytodifferentiated.v-d dabbled.v-d dallied.v-d dawdled.v-d dawned.v-d day-dreamed.v-d daydreamed.v-d decamped.v-d decayed.v-d deceased.v-d declutched.v-d decompensated.v-d decremented.v-d decussated.v-d de-etiolated.v-d deetiolated.v-d defasciculated.v-d defaulted.v-d defecated.v-d defected.v-d deflagrated.v-d degenerated.v-d dehisced.v-d delaminated.v-d deliberated.v-d delved.v-d demurred.v-d departed.v-d depended.v-d deplaned.v-d deplasmolyzed.v-d depreciated.v-d deputized.v-d desisted.v-d despaired.v-d deswelled.v-d deteriorated.v-d detracted.v-d detrained.v-d deviated.v-d devolved.v-d dieted.v-d differed.v-d digitated.v-d digressed.v-d dilly-dallied.v-d disagreed.v-d disappeared.v-d discoursed.v-d discriminated.v-d disembarked.v-d disintegrated.v-d disrobed.v-d dissembled.v-d dissented.v-d dissertated.v-d dithered.v-d divagated.v-d diverged.v-d doddered.v-d domineered.v-d doodled.v-d doted.v-d double-parked.v-d dovetailed.v-d dowed.v-d downshifted.v-d downslanted.v-d downsloped.v-d drawled.v-d drizzled.v-d drooled.v-d dueled.v-d duelled.v-d dwelled.v-d dwelt.v-d dwindled.v-d eavesdropped.v-d ebbed.v-d economized.v-d eddied.v-d editorialized.v-d effervesced.v-d effloresced.v-d elapsed.v-d electioneered.v-d eloped.v-d emanated.v-d embarked.v-d emerged.v-d emigrated.v-d emoted.v-d empathized.v-d encamped.v-d encroached.v-d enquired.v-d ensued.v-d equivocated.v-d erred.v-d eructed.v-d erupted.v-d evaporated.v-d eventuated.v-d excelled.v-d exflagellated.v-d existed.v-d exited.v-d exosmosed.v-d expatiated.v-d experimented.v-d expired.v-d explanted.v-d expostulated.v-d exulted.v-d fainted.v-d faltered.v-d fared.v-d farted.v-d fasted.v-d fawned.v-d feinted.v-d festered.v-d festinated.v-d fibbed.v-d fibrosed.v-d fidgeted.v-d filibustered.v-d fizzed.v-d flailed.v-d flaked.v-d flamed.v-d flickered.v-d flinched.v-d flirted.v-d flitted.v-d flopped.v-d floundered.v-d flourished.v-d flowered.v-d fluctuated.v-d fluoresced.v-d fluttered.v-d fly-fished.v-d foot-sloged.v-d foot-slogged.v-d foraged.v-d foregathered.v-d forgathered.v-d fornicated.v-d fossilized.v-d foxhunted.v-d fragmented.v-d fraternized.v-d freelanced.v-d free-wheeled.v-d freewheeled.v-d fretted.v-d frivoled.v-d froliced.v-d frothed.v-d frowned.v-d fulminated.v-d fumed.v-d functioned.v-d fundholded.v-d fungated.v-d fussed.v-d gallivanted.v-d galumphed.v-d gamboled.v-d gambolled.v-d gaped.v-d gardened.v-d gastrulated.v-d gawked.v-d gawped.v-d gazed.v-d gelated.v-d gelled.v-d genuflected.v-d gesticulated.v-d gestured.v-d gibbered.v-d gibed.v-d giggled.v-d glared.v-d gleamed.v-d glided.v-d glimmered.v-d glinted.v-d glistened.v-d glistered.v-d glitched.v-d glittered.v-d gloated.v-d globe-troted.v-d globetroted.v-d globe-trotted.v-d globetrotted.v-d gloried.v-d glowed.v-d glowered.v-d goggled.v-d golfed.v-d gormandized.v-d gossiped.v-d gossipped.v-d graduated.v-d grappled.v-d gravitated.v-d grayed.v-d grazed.v-d greyed.v-d grimaced.v-d grinned.v-d grooved.v-d grouched.v-d groused.v-d groveled.v-d grovelled.v-d guffawed.v-d gurgled.v-d gusted.v-d gybed.v-d gyrated.v-d haggled.v-d haled.v-d hallucinated.v-d hankered.v-d harked.v-d harped.v-d hawed.v-d hearkened.v-d heeled.v-d herniated.v-d heterodimerized.v-d heteromultimerized.v-d hewed.v-d hibernated.v-d hiccoughed.v-d hiccuped.v-d hiccupped.v-d hinged.v-d hissed.v-d hitchhiked.v-d hobnobbed.v-d hollered.v-d honeymooned.v-d hovered.v-d huddled.v-d huffed.v-d hungered.v-d hurtled.v-d hydroplaned.v-d hyperaggregated.v-d hyperdefecated.v-d hyperfiltered.v-d hyperluteinized.v-d hypermutated.v-d hypertrophyed.v-d hyporesonated.v-d hyporesponded.v-d ice-skated.v-d immigrated.v-d immunoreacted.v-d impinged.v-d inched.v-d infarcted.v-d innovated.v-d interacted.v-d interceded.v-d intercommunicated.v-d interdigitated.v-d interfered.v-d intermarried.v-d intermingled.v-d intervened.v-d introspected.v-d intruded.v-d intumesced.v-d inveighed.v-d involuted.v-d itched.v-d jabbered.v-d jack-knifed.v-d jaunted.v-d jawed.v-d jay-walked.v-d jaywalked.v-d jelled.v-d jested.v-d jibed.v-d jittered.v-d jived.v-d jockeyed.v-d joked.v-d journeyed.v-d jousted.v-d kemped.v-d kowtowed.v-d lacrimated.v-d lactated.v-d lagged.v-d languished.v-d lapsed.v-d lased.v-d laughed.v-d leafed.v-d leered.v-d legislated.v-d liaised.v-d lisped.v-d lived.v-d loafed.v-d locomoted.v-d loitered.v-d lolled.v-d longed.v-d loped.v-d lounged.v-d lowned.v-d lumbered.v-d lurked.v-d lusted.v-d luxuriated.v-d majored.v-d malfunctioned.v-d malignized.v-d malingered.v-d marauded.v-d marveled.v-d marvelled.v-d masqueraded.v-d materialized.v-d matriculated.v-d maturated.v-d matured.v-d maundered.v-d meandered.v-d meddled.v-d meditated.v-d menstruated.v-d meowed.v-d metamorphosed.v-d metastasized.v-d mewed.v-d miaoued.v-d miaowed.v-d micturated.v-d migrated.v-d militated.v-d mingled.v-d ministered.v-d misbehaved.v-d misfired.v-d molted.v-d monkeyed.v-d mooched.v-d mooed.v-d moped.v-d moralized.v-d moseyed.v-d motored.v-d mouldered.v-d muck-raked.v-d mushroomed.v-d mutinied.v-d name-dropped.v-d napped.v-d nattered.v-d necked.v-d necrosed.v-d neighed.v-d nested.v-d networked.v-d niggled.v-d nosedived.v-d noshed.v-d objected.v-d occured.v-d occurred.v-d officiated.v-d orated.v-d oscillated.v-d oscitated.v-d osmoregulated.v-d osmosed.v-d osseointegrated.v-d overacted.v-d overcompensated.v-d overreacted.v-d overslept.v-d overwintered.v-d ovulated.v-d paled.v-d palled.v-d palpebrated.v-d palpitated.v-d pandered.v-d panhandled.v-d panicked.v-d panted.v-d parachuted.v-d parleyed.v-d participated.v-d pattered.v-d paused.v-d peaked.v-d pearled.v-d peeped.v-d pellated.v-d perambulated.v-d percolated.v-d perished.v-d persevered.v-d persisted.v-d perspired.v-d pertained.v-d philandered.v-d philosophized.v-d picnicked.v-d piddled.v-d pimped.v-d pinged.v-d pirouetted.v-d pivoted.v-d planed.v-d play-acted.v-d plodded.v-d plummeted.v-d plummetted.v-d politicked.v-d polkaed.v-d pollocked.v-d pomed.v-d pommed.v-d pontificated.v-d pored.v-d postured.v-d pottered.v-d pounced.v-d pouted.v-d powwowed.v-d pranced.v-d prated.v-d prattled.v-d preachified.v-d preachifyed.v-d predominated.v-d pre-existed.v-d preponderated.v-d preregistered.v-d presided.v-d prevailed.v-d prevaricated.v-d preyed.v-d primped.v-d procrastinated.v-d procreated.v-d profited.v-d profiteered.v-d progressed.v-d prolapsed.v-d proliferated.v-d propagandized.v-d proselytized.v-d prospered.v-d protruded.v-d pub-crawled.v-d puled.v-d pullulated.v-d pulsated.v-d pulsed.v-d punned.v-d pupariated.v-d pupated.v-d purred.v-d pussyfooted.v-d putrefied.v-d puttered.v-d quacked.v-d quaked.v-d quarreled.v-d quarried.v-d quavered.v-d quested.v-d queued.v-d quibbled.v-d quipped.v-d quivered.v-d racketed.v-d rafted.v-d raged.v-d railed.v-d rained.v-d rambled.v-d rampaged.v-d rankled.v-d ranted.v-d rasped.v-d ratted.v-d raved.v-d reacted.v-d reappeared.v-d rebelled.v-d rebounded.v-d receded.v-d reclined.v-d recoiled.v-d reconnoitred.v-d recriminated.v-d recrudesced.v-d recuperated.v-d recurred.v-d redecussated.v-d redounded.v-d re-echoed.v-d re-emerged.v-d reemerged.v-d refected.v-d refixated.v-d reflowed.v-d refrained.v-d regressed.v-d reigned.v-d re-infarcted.v-d reinfarcted.v-d re-intervened.v-d reintervened.v-d rejoiced.v-d relapsed.v-d relented.v-d relied.v-d reminisced.v-d remonstrated.v-d renarrowed.v-d rendezvoused.v-d reneged.v-d re-occured.v-d reoccured.v-d repetatured.v-d repined.v-d resided.v-d resonated.v-d resorted.v-d resounded.v-d respired.v-d rested.v-d restenosed.v-d resulted.v-d resurfaced.v-d retaliated.v-d retched.v-d retreated.v-d retrenched.v-d retrograded.v-d retrogressed.v-d reveled.v-d revelled.v-d reverberated.v-d reverted.v-d revolted.v-d revolved.v-d rhapsodized.v-d rioted.v-d ripened.v-d riposted.v-d rippled.v-d rocketed.v-d romanced.v-d romped.v-d roomed.v-d roosted.v-d rootled.v-d rough-housed.v-d roved.v-d rubber-necked.v-d rubbernecked.v-d rumbled.v-d ruminated.v-d rummaged.v-d rusted.v-d sagged.v-d salivated.v-d sauntered.v-d scampered.v-d scar_cicatrized scavenged.v-d schemed.v-d scintillated.v-d scowled.v-d scrammed.v-d screeched.v-d scrimped.v-d scrimshanked.v-d scrolled.v-d scrounged.v-d scubaed.v-d scuffled.v-d seceded.v-d seesawed.v-d seethed.v-d sermonized.v-d seroconverted.v-d seroreverted.v-d shadow-boxed.v-d shilly-shallied.v-d shillyshallied.v-d shilly-shallyed.v-d shimmered.v-d shitted.v-d shivered.v-d shrimped.v-d shuddered.v-d sided.v-d side-sliped.v-d side-slipped.v-d sidled.v-d simmered.v-d simpered.v-d sinned.v-d sizzled.v-d skated.v-d skedaddled.v-d skimped.v-d skirmished.v-d skulked.v-d skylarked.v-d sky-rocketed.v-d skyrocketed.v-d slackened.v-d slalomed.v-d slalommed.v-d slavered.v-d sleeted.v-d slithered.v-d slobbered.v-d slogged.v-d slouched.v-d slumbered.v-d slummed.v-d slushed.v-d smarted.v-d smiled.v-d smirked.v-d smoldered.v-d smouldered.v-d snacked.v-d snaked.v-d sneered.v-d sneezed.v-d snickered.v-d sniffled.v-d sniggered.v-d sniped.v-d snitched.v-d sniveled.v-d snivelled.v-d snooped.v-d snoozed.v-d snored.v-d snowballed.v-d snowboarded.v-d snowed.v-d snowshoed.v-d snuffled.v-d sobbed.v-d softlanded.v-d sojourned.v-d soliloquized.v-d somersaulted.v-d soughed.v-d soured.v-d sparkled.v-d sparred.v-d specialised.v-d specialized.v-d speciated.v-d speechified.v-d spermiated.v-d sphacelated.v-d splurged.v-d spluttered.v-d sprawled.v-d sprinted.v-d sputtered.v-d squabbled.v-d squalled.v-d squawked.v-d squeaked.v-d squealed.v-d squinted.v-d squirmed.v-d stagnated.v-d stemmed.v-d stone-walled.v-d straggled.v-d strayed.v-d stridulated.v-d strived.v-d struggled.v-d stuttered.v-d subbed.v-d subscribed.v-d subsided.v-d subsisted.v-d subspecialized.v-d succumbed.v-d sulked.v-d summered.v-d sunbathed.v-d supercoiled.v-d supervened.v-d supped.v-d suppurated.v-d surfaced.v-d surged.v-d swaggered.v-d swarmed.v-d sweltered.v-d swerved.v-d swirled.v-d swooned.v-d sympathized.v-d tampered.v-d tap-danced.v-d tapdanced.v-d tarried.v-d tattled.v-d taxied.v-d teemed.v-d teetered.v-d teethed.v-d temporized.v-d tergiversated.v-d testated.v-d thrived.v-d throbbed.v-d thudded.v-d tingled.v-d tinkered.v-d tippled.v-d tiptoed.v-d tittered.v-d tittle-tattled.v-d toadied.v-d tobogganed.v-d toiled.v-d tolled.v-d tootled.v-d tottered.v-d touch-typed.v-d towered.v-d toyed.v-d traipsed.v-d transmigrated.v-d transpired.v-d traveled.v-d travelled.v-d trekked.v-d trembled.v-d trespassed.v-d trifled.v-d trifurcated.v-d triumphed.v-d trundled.v-d tunneled.v-d tunnelled.v-d tussled.v-d tweeted.v-d twinkled.v-d twitched.v-d twittered.v-d ululated.v-d underacted.v-d undulated.v-d uplinked.v-d urinated.v-d urticated.v-d vacationed.v-d vacillated.v-d vacuolated.v-d vamoosed.v-d vamped.v-d vanished.v-d vaulted.v-d vegetated.v-d venodilated.v-d verbigerated.v-d verged.v-d vied.v-d volvulated.v-d vouched.v-d voyaged.v-d waddled.v-d waffled.v-d wallowed.v-d waltzed.v-d wandered.v-d waned.v-d wanked.v-d warbled.v-d water-skied.v-d waterskied.v-d wavered.v-d welshed.v-d weltered.v-d wept.v-d wheezed.v-d whelped.v-d whimpered.v-d whinnied.v-d whirred.v-d wilted.v-d winced.v-d winked.v-d wiretapped.v-d wisecracked.v-d withered.v-d wobbled.v-d womanized.v-d wool-gathered.v-d woolgathered.v-d wrangled.v-d wriggled.v-d writhed.v-d yachted.v-d yaked.v-d yammered.v-d yanged.v-d yapped.v-d yawed.v-d yawned.v-d yearned.v-d yelped.v-d yenned.v-d yiped.v-d yowled.v-d zaged.v-d zagged.v-d ziged.v-d zigged.v-d zig-zagged.v-d zigzagged.v-d link-grammar-4.7.4/data/en/words/words.v.4.40000644000175000017500000007553711526022265017435 0ustar bloombloomabandoning.v abasing.v abbreviating.v abducting.v abetting.v abhorring.v abolishing.v abridging.v abrogating.v absorbing.v abstracting.v abusing.v abutting.v accenting.v accentuating.v accessing.v acclaiming.v accommodating.v accompanying.v accomplishing.v accosting.v accrediting.v accreting.v accustoming.v acerbating.v achieving.v acquainting.v acquiring.v activating.v addicting.v addling.v addressing.v adjudging.v administering.v admiring.v admonishing.v adoring.v adorning.v adulterating.v adumbrating.v aerating.v affecting.v affixing.v afflicting.v aggrandizing.v aggravating.v alienating.v allaying.v alleviating.v allocating.v allotting.v amassing.v ambushing.v ameliorating.v amending.v amortizing.v amplifying.v amputating.v anaesthetizing.v anathematizing.v anesthetizing.v angering.v anglicizing.v animating.v annealing.v annexing.v annihilating.v annointing.v annotating.v annulling.v anointing.v antagonizing.v antedating.v anthologizing.v anthropomorphizing.v aping.v appalling.v appeasing.v appending.v apportioning.v appraising.v apprehending.v apprenticing.v apprising.v appropriating.v arming.v arousing.v arraigning.v arraying.v arresting.v arrogating.v ascribing.v asphalting.v asphyxiating.v aspirating.v assailing.v assassinating.v assaulting.v assaying.v assuaging.v atomizing.v attacking.v attaining.v attainting.v attenuating.v attiring.v attracting.v attributing.v attuning.v auditing.v augmenting.v authenticating.v autographing.v automating.v avenging.v averring.v averting.v awaiting.v awing.v axing.v backdating.v badgering.v baffling.v baiting.v baking.v balancing.v baling.v bamboozling.v bandaging.v banishing.v bankrupting.v banning.v baptizing.v barbarizing.v barbecuing.v baring.v barrelling.v barricading.v bashing.v basing.v basting.v battering.v battling.v beaking.v beaning.v beatifying.v beautifying.v bedevilling.v befalling.v befitting.v befouling.v befriending.v begetting.v beggaring.v beguiling.v beheading.v beholding.v bejeweling.v belabouring.v belittling.v belting.v belying.v bemoaning.v benching.v bequeathing.v berating.v bereaving.v beseeching.v besieging.v besmirching.v bespeaking.v besting.v bestirring.v bestowing.v bestrewing.v bestriding.v betokening.v betraying.v bevelling.v bewailing.v bewildering.v bewitching.v biasing.v biding.v biffing.v bilking.v billeting.v billing.v birching.v bisecting.v blackballing.v blacklisting.v blackmailing.v blading.v blaming.v blanketing.v blasting.v blazoning.v blemishing.v blessing.v blighting.v blindfolding.v blinding.v blitzing.v blockading.v blow-drying.v bludgeoning.v blue-pencilling.v blunting.v bolding.v bolstering.v bombarding.v bombing.v bookending.v boosting.v bossing.v botching.v boycotting.v bracing.v bracketing.v braiding.v brainwashing.v braising.v branding.v brandishing.v braving.v breaching.v bribing.v bricking.v bridging.v briefing.v brining.v broaching.v brocading.v brokering.v bronzing.v brooking.v browbeating.v brutalizing.v budgeting.v buffing.v bugging.v bulldozing.v bunging.v bungling.v buoying.v burdening.v burlesquing.v burying.v busying.v butchering.v buttonholing.v buttressing.v by-passing.v bypassing.v cajoling.v calibrating.v camouflaging.v caning.v cannibalizing.v canonising.v canonizing.v caping.v capping.v captivating.v capturing.v carbonizing.v carbureting.v carding.v caressing.v caricaturing.v carjacking.v carpeting.v casing.v castigating.v castrating.v cataloguing.v catapulting.v categorizing.v ceding.v cementing.v censoring.v censuring.v centralising.v centralizing.v chagrining.v chaining.v chairing.v championing.v channelling.v chaperoning.v charming.v chartering.v charting.v chastening.v chastising.v cheapening.v checkmating.v cherishing.v chiding.v chiselling.v chlorinating.v chording.v christening.v chroming.v chronicling.v circularizing.v circumcising.v circumnavigating.v circumscribing.v circumventing.v citing.v civilizing.v clading.v clamping.v classifying.v clawing.v cleansing.v clenching.v clipping.v cloaking.v clobbering.v cloistering.v cloning.v closeting.v clothing.v clubbing.v coating.v co-authoring.v coauthoring.v cobbling.v cocking.v coddling.v codenaming.v codifying.v coding.v coercing.v cofounding.v coining.v cold-shouldering.v collaring.v collating.v collecting.v collectivizing.v collocating.v colocating.v colonizing.v combating.v combatting.v comforting.v commandeering.v commemorating.v commending.v commercializing.v compacting.v compartmentalizing.v compiling.v complementing.v completing.v complicating.v complimenting.v composting.v compounding.v comprehending.v compressing.v comprising.v computerizing.v concealing.v concerning.v conciliating.v concocting.v conditioning.v condoning.v configuring.v confining.v confiscating.v conflating.v confounding.v confronting.v confusing.v confuting.v congaing.v congratulating.v conjuring.v conking.v conning.v connoting.v conquering.v conscripting.v consecrating.v conserving.v consigning.v consoling.v constituting.v constraining.v constricting.v constructing.v construing.v consuming.v consummating.v contacting.v containing.v contaminating.v contenting.v contorting.v contouring.v contradicting.v contravening.v contriving.v controlling.v convecting.v conventionalizing.v conveying.v convoking.v convoying.v convulsing.v cooping.v co-opting.v coordinating.v co-producing.v copying.v copyrighting.v cording.v cordoning.v coring.v corking.v cornering.v corralling.v correcting.v corroborating.v countenancing.v counteracting.v counterbalancing.v counterfeiting.v countermanding.v countersigning.v countersuing.v coupling.v courting.v court-martialing.v coveting.v coxing.v cradling.v cramping.v craning.v crayoning.v creaming.v creating.v crediting.v cremating.v crimping.v crippling.v criticizing.v crossbreeding.v cross-examining.v cross-fertilizing.v cross-indexing.v cross-questioning.v crowning.v crucifying.v crushing.v cubing.v cudgeling.v cuffing.v culling.v cultivating.v cupping.v curbing.v curing.v currying.v curtailing.v cushioning.v damaging.v damning.v dampening.v dandling.v daubing.v daunting.v dazing.v dazzling.v deadening.v deafening.v debarring.v debasing.v debauching.v debilitating.v debiting.v debriefing.v debugging.v debunking.v decanting.v decapitating.v decarbonizing.v deceiving.v decentralizing.v decertifying.v decimalizing.v decimating.v deciphering.v decking.v declaiming.v declassifying.v decoding.v decolonizing.v decompressing.v deconsecrating.v decontaminating.v decorating.v decrying.v decrypting.v dedicating.v deducting.v deeding.v deep-freezing.v deepthroating.v de-escalating.v defacing.v defaming.v defeating.v defending.v deferring.v defiling.v defining.v deflating.v deflowering.v defoliating.v deforesting.v deforming.v defragmenting.v defrauding.v defraying.v defrocking.v defrosting.v defunding.v defusing.v defying.v degrading.v dehumanizing.v dehydrating.v de-icing.v deifying.v delegating.v deleting.v delimiting.v delineating.v delisting.v deluding.v deluging.v demagnetizing.v demarcating.v demeaning.v demerging.v demilitarizing.v demisting.v demobilizing.v demolishing.v demonizing.v demoralizing.v demoting.v demutualising.v denationalizing.v denigrating.v denominating.v denoting.v denouncing.v denuding.v deodorizing.v depleting.v deploring.v deploying.v depopulating.v deporting.v deposing.v depositing.v deprecating.v deprogramming.v deranging.v deriding.v desalinating.v desalinizing.v desecrating.v desegregating.v desensitizing.v deserting.v desiccating.v despatching.v despising.v despoiling.v destroying.v detaching.v detaining.v detecting.v deterring.v detesting.v dethroning.v detuning.v devaluating.v devaluing.v devastating.v devising.v devoting.v devouring.v dewatering.v diagnosing.v dicing.v diddling.v diffracting.v dignifying.v diluting.v directing.v disabling.v disaffiliating.v disallowing.v disappointing.v disarranging.v disassembling.v disassociating.v disavowing.v disbursing.v discarding.v disciplining.v disclaiming.v discomfiting.v disconcerting.v disconnecting.v discontenting.v discounting.v discouraging.v discrediting.v disdaining.v disembarrassing.v disembowelling.v disenchanting.v disenfranchising.v disestablishing.v disfavouring.v disfiguring.v disfranchising.v disgorging.v disgracing.v disguising.v disheartening.v dishonouring.v disillusioning.v disinfecting.v disinheriting.v disinterring.v dislocating.v dislodging.v dismantling.v dismembering.v dismissing.v disobeying.v disorientating.v disorienting.v disowning.v disparaging.v dispatching.v dispelling.v displacing.v displaying.v displeasing.v dispossessing.v disproving.v disqualifying.v disregarding.v disrupting.v dissecting.v disseminating.v dissing.v dissociating.v dissuading.v distancing.v distorting.v distracting.v distributing.v distrusting.v disturbing.v ditching.v diverting.v divesting.v divorcing.v divulging.v dizzying.v doctoring.v doffing.v domesticating.v dominating.v donating.v donning.v dooming.v doping.v dotting.v double-checking.v double-crossing.v dousing.v downgrading.v downing.v downloading.v downplaying.v dragooning.v dramatizing.v draping.v drenching.v drip-drying.v drubbing.v drugging.v dry-cleaning.v ducting.v dumbfounding.v dunking.v duping.v duplicating.v dusting.v dwarfing.v dyeing.v dynamiting.v earmarking.v earning.v eclipsing.v edifying.v editing.v effacing.v effecting.v elbowing.v electrifying.v electrocuting.v electrolyzing.v elevating.v eliciting.v eliding.v eliminating.v elucidating.v eluding.v emancipating.v emasculating.v embalming.v embargoing.v embedding.v embellishing.v embezzling.v embittering.v emblazoning.v embodying.v emboldening.v embossing.v embracing.v embroiling.v emending.v emitting.v empanelling.v empowering.v emulating.v emulsifying.v enacting.v enamelling.v encasing.v enchanting.v encircling.v enclosing.v encoding.v encompassing.v encountering.v encrypting.v encumbering.v endangering.v endearing.v endorsing.v endowing.v enervating.v enfeoffing.v enfolding.v enforcing.v enfranchising.v engendering.v engineering.v engraving.v engrossing.v engulfing.v enhancing.v enjoining.v enlarging.v enlightening.v enlivening.v enmeshing.v ennobling.v enraging.v enriching.v ensconcing.v enshrining.v enshrouding.v enslaving.v ensnaring.v ensouling.v entangling.v enthralling.v enthroning.v enthusing.v entombing.v entraining.v entrancing.v entrapping.v entreating.v entrusting.v entwining.v enumerating.v enveloping.v envying.v epitomizing.v equalizing.v equalling.v equating.v equipping.v eradicating.v erasing.v erecting.v eschewing.v escorting.v espousing.v espying.v esteeming.v eulogizing.v evading.v evicting.v evincing.v eviscerating.v evoking.v exacerbating.v exalting.v exasperating.v excavating.v exceeding.v excepting.v exchanging.v excising.v excluding.v excommunicating.v excoriating.v excreting.v exculpating.v excusing.v executing.v exemplifying.v exempting.v exerting.v exhausting.v exhibiting.v exhilarating.v exhuming.v exiling.v exorcizing.v expediting.v expelling.v expending.v experiencing.v expiating.v explicating.v exploiting.v exposing.v expropriating.v expunging.v expurgating.v extenuating.v exterminating.v externalizing.v extinguishing.v extirpating.v extolling.v extorting.v extracting.v extraditing.v extricating.v exuding.v eying.v fabricating.v facelifting.v faceting.v facilitating.v fagging.v faking.v falsifying.v familiarizing.v fancying.v fascinating.v fashioning.v fathoming.v fatiguing.v fating.v faulting.v favoriting.v favouring.v fazing.v feathering.v featuring.v feigning.v felling.v fencing.v ferreting.v fertilizing.v festooning.v feting.v fettering.v fianchettoing.v filleting.v finalizing.v financing.v fine-tuning.v fingering.v firebombing.v flagellating.v flanking.v flattering.v flaunting.v flavouring.v flaying.v fleecing.v flicking.v flogging.v floodlighting.v flooring.v flouting.v fluffing.v flummoxing.v fluoridating.v flurrying.v flustering.v foiling.v foisting.v fomenting.v fonding.v fondling.v fooling.v force-feeding.v fording.v forecasting.v foregoing.v foreordaining.v foreshadowing.v foreshortening.v forestalling.v foreswearing.v foretelling.v forfeiting.v forging.v forgoing.v formalizing.v formulating.v forsaking.v forswearing.v fortifying.v forwarding.v fostering.v founding.v framing.v franking.v frazzling.v freeing.v frequenting.v frescoing.v fricasseeing.v frightening.v frisking.v frittering.v frogmarching.v frustrating.v frying.v fulfilling.v fumigating.v funding.v funnelling.v furbishing.v furnishing.v furrowing.v furthering.v gaging.v gainsaying.v galling.v galvanizing.v gaoling.v garbing.v garbling.v garnering.v garnishing.v garrisoning.v gashing.v gatecrashing.v gauging.v generating.v genericizing.v gerrymandering.v ghettoizing.v gilding.v ginning.v girding.v glaciating.v gladdening.v glamorizing.v gleaning.v glimpsing.v glorifying.v glutting.v goading.v gorging.v goring.v grabbing.v gracing.v grading.v grafting.v gratifying.v gravelling.v greasing.v greenlighting.v greeting.v grilling.v gripping.v gritting.v groining.v grooming.v grossing.v grudging.v guarding.v guiding.v guillotining.v gumming.v gunning.v gutting.v guzzling.v gypping.v hallowing.v halting.v halving.v hampering.v hamstringing.v handcrafting.v handcuffing.v handicapping.v handling.v haranguing.v harassing.v harboring.v harbouring.v harming.v harnessing.v harpooning.v harrowing.v harrying.v harvesting.v hassling.v haunting.v hawking.v hazarding.v hazing.v headquartering.v heaping.v heartening.v hearting.v heeding.v helming.v heralding.v highjacking.v highlighting.v hijacking.v hindering.v hitting.v hoaxing.v hobbling.v hocking.v hogging.v hollowing.v homesteading.v homogenizing.v honing.v honoring.v honouring.v hooding.v hoodwinking.v horrifying.v horsewhipping.v hosing.v hospitalizing.v hosting.v hotfooting.v hounding.v housing.v hulling.v humbling.v humbugging.v humiliating.v humouring.v humping.v hunching.v hurling.v husking.v hyphenating.v hypnotizing.v idealizing.v identifying.v idolizing.v ignoring.v ill-treating.v illuminating.v illumining.v illustrating.v imaging.v imbibing.v imbuing.v imitating.v immersing.v immobilizing.v immolating.v immortalizing.v immunizing.v impacting.v impairing.v impaling.v impanelling.v imparting.v impeaching.v impeding.v imperilling.v impersonating.v implanting.v implementing.v implicating.v importing.v imposing.v impounding.v impoverishing.v impregnating.v impressing.v imprinting.v imprisoning.v impugning.v imputing.v inactivating.v inaugurating.v incapacitating.v incarcerating.v incarnating.v incensing.v incinerating.v including.v inconveniencing.v incriminating.v inculcating.v incurring.v indemnifying.v indenturing.v indexing.v indicting.v individuating.v indoctrinating.v inducting.v infatuating.v infecting.v infesting.v infilling.v infiltrating.v inflaming.v inflating.v inflecting.v inflicting.v influencing.v infuriating.v infusing.v ingesting.v ingratiating.v inhabiting.v inheriting.v inhibiting.v initialling.v injecting.v injuring.v inking.v inoculating.v inscribing.v inseminating.v inserting.v inspecting.v installing.v instating.v instigating.v instilling.v instituting.v institutionalizing.v insulating.v insulting.v insuring.v integrating.v intercepting.v interchanging.v interdicting.v interesting.v interjecting.v interleaving.v internalizing.v internationalizing.v interoperating.v interpolating.v interring.v interrogating.v interspersing.v interweaving.v intimidating.v intoning.v intoxicating.v introducing.v intuiting.v inundating.v invading.v invalidating.v invaliding.v inveigling.v inventing.v inverting.v invigorating.v invoking.v irking.v irradiating.v irrigating.v isolating.v italicizing.v itemizing.v iterating.v jailing.v jarring.v jeopardizing.v jettisoning.v jilting.v jinxing.v jollying.v jugging.v juxtaposing.v kenning.v kidnapping.v kissing.v kneading.v knifing.v knighting.v lacerating.v lacing.v lacking.v lacquering.v lambasting.v laminating.v lampooning.v lancing.v landscaping.v lassoing.v lauding.v laundering.v lavishing.v leaching.v leapfrogging.v leasing.v leavening.v legalizing.v legitimatizing.v leniting.v leveraging.v levering.v levying.v libelling.v liberalizing.v liberating.v licencing.v likening.v limiting.v lionizing.v liquidizing.v listing.v loaning.v loathing.v lobbing.v lofting.v looting.v lubricating.v lugging.v lulling.v lumping.v luring.v lynching.v maddening.v magnetizing.v magnifying.v maiming.v maligning.v maltreating.v manacling.v mandating.v mangling.v manhandling.v manicuring.v manifesting.v manipulating.v manning.v manufacturing.v marginalising.v marginalizing.v marketing.v marooning.v marring.v marshalling.v martyring.v mashing.v masking.v massaging.v mass-producing.v mastering.v masterminding.v masticating.v mauling.v maximizing.v maxing.v measuring.v mechanizing.v medicating.v memorializing.v memorizing.v menacing.v meriting.v mesmerizing.v microfilming.v miffing.v milking.v mimeographing.v mimicking.v mincing.v miniaturizing.v minimizing.v minting.v miring.v mirroring.v misapplying.v misapprehending.v misappropriating.v miscastting.v misconceiving.v misconstruing.v misdating.v misdirecting.v misgoverning.v misguiding.v mishandling.v mishearing.v misinforming.v misinterpreting.v mislaying.v misleading.v mismanaging.v misnaming.v misplacing.v mispronouncing.v misquoting.v misreading.v misrepresenting.v misspelling.v misspending.v misstating.v mistaking.v mistranslating.v mistreating.v mistrusting.v misusing.v mitigating.v mobbing.v mocking.v modeling.v modifying.v molding.v molesting.v mollifying.v mollycoddling.v monitoring.v monopolizing.v montaging.v mooring.v mooting.v morphing.v mortaring.v mortgaging.v mortifying.v mothballing.v mothproofing.v motorizing.v muddying.v muffing.v muffling.v mugging.v mulching.v multiplexing.v murdering.v mustering.v mutilating.v muting.v muzzling.v myspacing.v mystifying.v nabbing.v nagging.v namespacing.v narrating.v nationalizing.v naturalizing.v needling.v negating.v netting.v nettling.v neutering.v neutralizing.v nicking.v nicknaming.v nixing.v noogieing.v normalizing.v norming.v notarizing.v notating.v nourishing.v novelising.v novelizing.v nudging.v nullifying.v numbering.v numbing.v nursing.v nurturing.v obfuscating.v obligating.v obliterating.v obscuring.v obstructing.v obtaining.v obviating.v occasioning.v occupying.v offending.v offloading.v offsetting.v oiling.v okaying.v omening.v omitting.v oppressing.v orchestrating.v ordaining.v organizing.v orientating.v orienting.v ornamenting.v ostracizing.v ousting.v outbalancing.v outclassing.v outdistancing.v outdoing.v outfighting.v outfitting.v outflanking.v outfoxing.v outgrowing.v outlasting.v outlawing.v outlining.v outliving.v outmanoeuvring.v outnumbering.v outplaying.v outraging.v outranking.v outrideing.v outrighting.v outrunning.v outscoring.v outshining.v outsmarting.v outsourcing.v outstaying.v outvoting.v outweighing.v outwitting.v overawing.v overbearing.v overburdening.v overcoming.v overcooking.v overcrowding.v overdoing.v overdubing.v overemphasizing.v overestimating.v overexerting.v overexposing.v overgrazing.v overhauling.v overhearing.v overleaping.v overloading.v overlooking.v overpaying.v overplaying.v overpopulating.v overpowering.v overpraising.v overprinting.v overrating.v overruling.v overrunning.v overseeing.v overshadowing.v overshooting.v oversimplifying.v overstating.v overstaying.v overstepping.v overstocking.v overstraining.v oversubscribing.v overtaking.v overtaxing.v overvaluing.v overwhelming.v overwriting.v owning.v oxygenating.v pacifying.v packaging.v padding.v padlocking.v paging.v paining.v palatalizing.v pampering.v papering.v parallelizing.v parallelling.v paralysing.v paralyzing.v parametrizing.v paraphrasing.v parching.v pardoning.v paring.v parodying.v paroling.v parrying.v partitioning.v partnering.v pasteurizing.v pasting.v patenting.v patrolling.v patronizing.v patterning.v patting.v pauperizing.v pawing.v pawning.v pedestrianizing.v pegging.v pelting.v penalizing.v pencilling.v peppering.v perfecting.v perforating.v perfuming.v perfusing.v perjuring.v permeating.v perming.v permuting.v perpetrating.v perpetuating.v perplexing.v persecuting.v personalizing.v personifying.v perturbing.v perusing.v pervading.v perverting.v pestering.v petting.v photocopying.v photographing.v photosensitizing.v photostatting.v phrasing.v pickling.v picturing.v piercing.v pigeonholing.v pigmenting.v pilfering.v piloting.v pinching.v pinpointing.v piping.v pipping.v piquing.v pirating.v pitchforking.v pitting.v pitying.v placating.v placing.v plagiarizing.v plaguing.v planting.v plastering.v pleasing.v plumbing.v pluralizing.v plying.v pocketing.v podcasting.v poisoning.v polarizing.v policing.v polishing.v politicizing.v pollinating.v polluting.v pondering.v pooh-poohing.v pooling.v popularizing.v populating.v portaging.v portending.v porting.v positioning.v possessing.v postdating.v posting.v postmarking.v postponing.v powdering.v praising.v prearranging.v preceding.v precipitating.v precluding.v preconceiving.v predestining.v predetermining.v predicating.v predisposing.v pre-empting.v preempting.v preening.v prefabricating.v prefacing.v prefiguring.v preforming.v preheating.v prejudging.v prejudicing.v premeditating.v premising.v preoccupying.v preordaining.v prepaying.v prerecording.v prerendering.v presaging.v prescribing.v presenting.v preserving.v presorting.v pressurizing.v prestressing.v prettifying.v preventing.v pricing.v priding.v priming.v printing.v privileging.v prizing.v probing.v processing.v proctoring.v procuring.v prodding.v producing.v proffering.v profiling.v prognosticating.v prohibiting.v prolonging.v promoting.v promulgating.v pronouncing.v proofing.v propelling.v proportioning.v propositioning.v propounding.v proscribing.v prosecuting.v prostituting.v prostrating.v protecting.v pruning.v psychoanalysing.v psychoanalyzing.v publicizing.v publishing.v pulverizing.v pummelling.v punctuating.v punishing.v purchasing.v pureing.v purifying.v purloining.v pursing.v pursuing.v purveying.v quaffing.v qualifying.v quantifying.v quarantining.v quarterbacking.v quartering.v quashing.v quelling.v quenching.v querying.v quick-freezing.v quilting.v quoting.v radicalizing.v raffling.v raiding.v railroading.v ramming.v ramping.v ransacking.v ransoming.v raping.v ratifying.v rationalizing.v rationing.v ravaging.v ravishing.v razing.v reacquainting.v re-addressing.v readmitting.v reaping.v reappointing.v rearranging.v reassessing.v reauthorizing.v rebadging.v rebooting.v rebranding.v rebroadcasting.v rebuffing.v rebuking.v rebutting.v recapturing.v recasting.v recessing.v rechristening.v reciting.v reclaiming.v recoloring.v recommitting.v recompensing.v reconciling.v reconditioning.v reconquering.v reconsecrating.v reconsidering.v reconstructing.v reconvicting.v recouping.v recreating.v rectifying.v recusing.v recuting.v recycling.v redecorating.v redeeming.v redefining.v redeploying.v redesignating.v redesigning.v redeveloping.v rediscovering.v redistributing.v redoing.v redrafting.v redrawing.v redressing.v redshirting.v reducing.v reduplicating.v reemploying.v reenacting.v reequiping.v re-establishing.v reestablishing.v refashioning.v refilling.v refinancing.v refining.v reflexing.v reformulating.v refracting.v refreshing.v refrigerating.v refunding.v refurbishing.v refurnishing.v refuting.v regaining.v regaling.v regimenting.v regrading.v regularizing.v regulating.v regurgitating.v rehabilitating.v rehashing.v rehiring.v rehousing.v reigniting.v reimagining.v reimbursing.v reinforcing.v reinstalling.v reinstating.v reinsuring.v reintegrating.v reinterpreting.v reinventing.v reinvigorating.v reissuing.v rejecting.v rejoining.v rejuvenating.v relaunching.v relaying.v releasing.v relegating.v relieving.v relinquishing.v relishing.v relisting.v reliving.v reloading.v remanding.v remastering.v rematching.v remedying.v remilitarizing.v remixing.v remodelling.v remolding.v remoulding.v removing.v remunerating.v rending.v renewing.v renominating.v renouncing.v renovating.v renumbering.v reoccupying.v reorientating.v reorienting.v repackaging.v repainting.v repatriating.v repealing.v repelling.v rephotographing.v rephrasing.v replacing.v replanting.v replastering.v replaying.v replenishing.v replicating.v reprehending.v representing.v repressing.v reprieving.v reprimanding.v reprinting.v reproaching.v reproofing.v reproving.v repudiating.v repulsing.v repurchasing.v repurposing.v reputing.v requisitioning.v rereading.v rereleasing.v rerolling.v rerouting.v rescheduling.v rescinding.v rescuing.v researching.v reseating.v reselling.v resembling.v resenting.v reserving.v resetting.v reshaping.v reshuffling.v resiting.v resoling.v respecting.v restating.v restocking.v restoring.v restraining.v restricting.v restructuring.v restyling.v resubmiting.v resurrecting.v retaining.v retaking.v retarding.v retelling.v rethinking.v reting.v retitling.v retouching.v retracing.v retracting.v retransmitting.v retrieving.v retriing.v retrying.v revaluing.v revamping.v revering.v reveting.v reviewing.v reviling.v revising.v revisiting.v revitalizing.v revoking.v revolutionizing.v rewarding.v rewatering.v rewiring.v rewording.v rewriting.v ribbing.v ridding.v riddling.v ridiculing.v rifling.v righting.v rimming.v rivaling.v rivalling.v riveting.v romanizing.v romanticizing.v roping.v routing.v rubberizing.v rubber-stamping.v ruing.v ruining.v rumpling.v rusticating.v sabotaging.v sacking.v saddening.v saddling.v safeguarding.v salting.v salvaging.v sampling.v sanctifying.v sanctioning.v sandblasting.v sanding.v sandpapering.v sandwiching.v sapping.v satiating.v satirising.v satirizing.v satisfying.v saturating.v sauteing.v savaging.v savouring.v scalding.v scalping.v scandalizing.v scanting.v scarpering.v scarring.v scenting.v scheduling.v schooling.v scooping.v scorching.v scorning.v scotching.v scouring.v scrapping.v scrunching.v scrutinizing.v sculpting.v scuttling.v searing.v seasoning.v seating.v seconding.v secreting.v secularizing.v securing.v sedating.v seducing.v seeding.v segregating.v selecting.v sensationalizing.v sensitizing.v sentimentalizing.v sequestering.v serenading.v serializing.v servicing.v shackling.v shadowing.v shampooing.v shapeshifting.v sharing.v sharpening.v shearing.v sheathing.v shedding.v sheltering.v shelving.v shepherding.v shielding.v shingling.v shirking.v shocking.v shooing.v short-changing.v shortlisting.v shouldering.v shovelling.v showcasing.v shredding.v shrouding.v shucking.v shunning.v shunting.v shuttering.v sickening.v sicking.v sidelining.v sidestepping.v sidetracking.v sieving.v sighting.v signposting.v silencing.v silhouetting.v simplifying.v simulating.v simulcasting.v siphoning.v siring.v skewering.v skinning.v skippering.v skirting.v slaking.v slandering.v slapping.v slashing.v slating.v slaughtering.v slaying.v sleeving.v slicing.v slighting.v slinging.v slotting.v slugging.v slurring.v smelting.v smiting.v smothering.v snagging.v snaring.v snubbing.v socking.v sodomizing.v soft-pedalling.v soiling.v soldering.v soliciting.v solving.v soothing.v soundproofing.v souping.v sourcing.v sousing.v spading.v spanking.v spanning.v sparing.v spaying.v spearheading.v spearing.v specifying.v spewing.v spiking.v spin-drying.v spiriting.v spiting.v sponsoring.v spoonfeeding.v spotlighting.v spotting.v spraining.v spraying.v sprinkling.v spurning.v squandering.v squelching.v squiring.v stabbing.v staffing.v staging.v stalemating.v standardizing.v stapling.v starching.v startling.v stashing.v stationing.v staunching.v stealing.v steamrollering.v steeling.v stereotyping.v sterilizing.v stiffing.v stigmatizing.v stilling.v stimulating.v stitching.v stockading.v stoking.v stomaching.v stoning.v storing.v storyboarding.v stowing.v straddling.v strafing.v straitening.v strangling.v strapping.v streamlining.v strewing.v stroking.v structuring.v stubbing.v stuccoing.v studding.v stunning.v stunting.v styling.v stylizing.v stymieing.v subduing.v subediting.v subjecting.v subjugating.v sublimating.v subordinating.v subpoenaing.v subserving.v subsidizing.v substantiating.v subsuming.v subtending.v subtracting.v subverting.v succouring.v suckling.v suffusing.v suiciding.v suiting.v sullying.v summarizing.v summoning.v sundering.v sunning.v superimposing.v superseding.v supplanting.v supplementing.v supplying.v supporting.v suppressing.v surmounting.v surnaming.v surpassing.v surrounding.v surveying.v suspending.v sustaining.v swamping.v swathing.v swatting.v sweetening.v swigging.v swindling.v swiping.v symbolizing.v syncopating.v syndicating.v synthesizing.v syphoning.v systematizing.v tabling.v tabulating.v tailing.v tailoring.v tainting.v taming.v tamping.v tantalizing.v targeting.v tarring.v tattooing.v taunting.v taxing.v teasing.v telecasting.v teleporting.v telescoping.v televising.v tendering.v terracing.v terrifying.v terrorizing.v tessellating.v test-driving.v tethering.v thanking.v thatching.v thirsting.v threading.v thumbing.v thwarting.v ticketing.v tiering.v tiling.v tilling.v timelining.v timing.v tinting.v titillating.v toeing.v tolerating.v torching.v tormenting.v torpedoing.v torturing.v toting.v touring.v tousling.v touting.v towelling.v towing.v trademarking.v trampling.v tranquilizing.v tranquillizing.v transacting.v transcending.v transcoding.v transcribing.v transfixing.v transforming.v transfusing.v transgendering.v transistorizing.v transitioning.v transmitting.v transmuting.v transporting.v transposing.v transshipping.v trapping.v trashing.v traversing.v treasuring.v tricking.v triggering.v trivializing.v troubling.v trouncing.v truncating.v turbocharging.v tutoring.v tweaking.v twiddling.v typecasting.v typifying.v tyrannizing.v unaffiliating.v unbalancing.v unbanning.v unblocking.v unbolting.v unbuckling.v unburdening.v unbuttoning.v unclothing.v uncluttering.v uncorking.v uncoupling.v uncovering.v uncrossing.v undercharging.v undercutting.v underestimating.v underexposing.v underfunding.v undergoing.v underlining.v underlying.v undermining.v underpaying.v underpinning.v underquoting.v underrating.v underrepresenting.v underscoring.v underselling.v underserving.v undershooting.v undersigning.v understating.v understocking.v understudying.v undervaluing.v underwriteing.v undoing.v unearthing.v unencumbering.v unfettering.v unfrocking.v unfurling.v unhanding.v unhinging.v unhooking.v uninstalling.v unlearning.v unleashing.v unloosing.v unmasking.v unnerving.v unplugging.v unrecording.v unsaddling.v unscrambling.v unsettling.v unsheathing.v unveiling.v unzipping.v upbraiding.v updating.v upgrading.v upholding.v upholstering.v uplifting.v uprighting.v uprooting.v upsetting.v upstaging.v ushering.v usurping.v utilizing.v uttering.v vacating.v vaccinating.v valeting.v validating.v valuing.v vanquishing.v varnishing.v veiling.v vending.v venerating.v ventilating.v venting.v verbalizing.v vetoing.v vetting.v vexing.v victimizing.v videotaping.v vilifying.v vindicating.v violating.v visaing.v visualizing.v vitiating.v vivisecting.v vocalizing.v voicing.v voiding.v vouchsafing.v vulgarizing.v waging.v waiving.v walling.v walloping.v wangling.v warding.v warehousing.v warranting.v wasting.v waterproofing.v waylaying.v weaning.v weaponizing.v weathering.v wedging.v weighting.v welcoming.v wending.v westernizing.v wetting.v whacking.v wheedling.v whetting.v whiling.v whitewashing.v wielding.v wikiing.v winging.v winnowing.v withholding.v withstanding.v witnessing.v wolfing.v wooing.v wording.v worming.v wounding.v wreaking.v wrecking.v wrenching.v wresting.v wronging.v zapping.v zoning.v link-grammar-4.7.4/data/en/words/words.v.6.10000644000175000017500000000574511526022265017426 0ustar bloombloomadopt.v airlift.v air.v angle.v armor.v authorise.v average.v backfill.v backpack.v back.v badge.v bail.v bang.v beam.v beckon.v beef.v bellow.v benchmark.v bend.v beware.v bicycle.v bike.v bind.v bite.v blare.v bleed.v blog.v blow.v bob.v bog.v boil.v bolt.v boo.v boot.v booze.v bore.v bounce.v bound.v bowl.v box.v branch.v break.v breathe.v brighten.v bruise.v brush.v buckle.v buck.v build.v bulge.v bump.v bum.v bunch.v burn.v bust.v button.v butt.v buzz.v calm.v camp.v cancel.v canoe.v caption.v carve.v cash.v catch.v chamber.v change.v chat.v cheat.v check.v cheer.v chew.v chill.v chip.v choke.v chop.v choreograph.v churn.v clean.v climb.v clog.v close.v cloud.v clump.v coffer.v coil.v comb.v connect.v contract.v cook.v cool.v cop.v costume.v cough.v count.v crack.v cram.v cross.v crowd.v crumble.v crumple.v crunch.v curl.v dash.v dematerialize.v dial.v dig.v dine.v drag.v drain.v dress.v drink.v drive.v dropkick.v drop.v drown.v drum.v dry.v duck.v dumb.v ease.v eat edge.v email.v emcee.v empty.v evangelize.v even.v face.v fan.v farm.v fatten.v feed.v fend.v fetch.v feud.v file.v fill.v filter.v fire.v firm.v fish.v fist.v flare.v flatten.v flavor.v flip.v float.v flood.v flunk.v flush.v fly.v fold.v follow.v fork.v foul.v freak.v freeze.v french.v freshen.v fuck.v fuel.v gallop.v gather glaze.v gobble.v gong.v grind.v gulp.v hack.v hammer.v hang.v hardwire.v harken.v haul.v head.v heal.v heat.v herd.v hide.v hike.v hitch.v homer.v hook.v hop.v hunt.v iron.v jam.v jerk.v join.v jumble.v jump.v kayak.v kill.v knock.v knot.v lap.v lash.v lead.v leak.v lean.v leap.v level.v lick.v lighten.v light.v limber.v line.v liven.v log.v loop.v loosen.v lose.v march.v marry.v match.v melt.v mess.v miss.v mix.v mop.v mound.v mouth.v move.v muck.v nod.v ooze.v open.v option.v pack.v pair.v pan.v parlay.v party_hardy party.v peel.v pee.v pile.v piss.v play.v plough.v plow.v pluck.v plunge.v point.v poke.v pop.v pound.v pry.v pucker.v pull.v pump.v quiet.v rake.v reach.v reel.v rent.v rerecord.v resize.v rev.v rewind.v ride.v ring.v rip.v rock.v roll.v root.v rotoscope.v round.v rub.v rush.v sail.v saw.w scope.v scout.v scrape.v scratch.v screw.v seal.v segue.v serve.v settle.v sew.v shape.v shave.v shift.v ship.v shoot.v short.v shrug.v shush.v sign.v silkscreen.v sketch.v skin-dive.v skip.v ski.v slide.v slip.v slow.v smarten.v smash.v smooth.v snap.v snatch.v sneak.v sniff.v snorkel.v snuff.v soak.v sober.v soften.v space.v spark.v speed.v spell.v spill.v spin.v spiral.v spit.v splice.v spring.v sprout.v spruce.v square.v squeeze.v squirt.v stagger.v stalk.v stamp.v stare.v star.v starve.v steam.v stick.v stiffen.v stir.v stock.v storm.v straighten.v stretch.v strike.v strip.v suck.v sum.v surf.v swell.v swim.v swing.v switch.v tally.v tangle.v taper.v task.v thicken.v thin.v tick.v tidy.v tighten.v tinkle.v tip.v tire.v tone.v topple toss.v trail.v tread.v trim.v trip.v tuck.v tumble.v tune.v twist.v type.v wake.v walk.v warm.v weed.v weigh.v whip.v whoop.v wind.v win.v wipe.v work.v wrap.v zero.v link-grammar-4.7.4/data/en/words/words-medical.prep.10000644000175000017500000000121411245255177021352 0ustar bloombloomadmedian anconad anteriad antiniad atlantad basad basilad caudad caudalward cephalad coronad craniad dermad dextrad distad dorsad dorsocephalad dorsoventrad ectad ectoentad entad entoectad frontad glabellad hereinafter herewith I.M. in_cellulo incertae_sedis iniad in_ovo in_tela intrad in_utero in_vacuo laterad mediad mesad mesiad neurad no_place obeliad out-of-doors out_of_hospital peripherad posteriad prorsad proximad radiad retrad rightwards rostrad rotulad sacrad sinistrad sternad terminad thenad therefrom therein thereon thereupon tibiad ulnad ventrad ventrodorsad viscerad link-grammar-4.7.4/data/en/words/words.v.6.50000644000175000017500000001035111526022265017417 0ustar bloombloomadopting.g airing.g airlifting.g angling.g armoring.g authorising.g averaging.g backfilling.g backing.g backpacking.g badging.g bailing.g banging.g beaming.g beating.g beckoning.g beefing.g bellowing.g benchmarking.g bending.g bicycling.g biking.g binding.g biting.g blaring.g bleeding.g blogging.g bloging.g blowing.g bobbing.g bogging.g boiling.g bolting.g booing.g booting.g boozing.g boring.g bouncing.g bounding.g bowling.g boxing.g branching.g breaking.g breathing.g brightening.g bruising.g brushing.g bucking.g buckling.g building.g bulging.g bumming.g bumping.g bunching.g burning.g busting.g butting.g buttoning.g buzzing.g calming.g camping.g canceling.g canoeing.g captioning.g carving.g cashing.g casting.g catching.g chambering.g changing.g chatting.g cheating.g checking.g cheering.g chewing.g chilling.g chipping.g choking.g chopping.g choreographing.g churning.g cleaning.g climbing.g clogging.g closing.g clouding.g clumping.g coffering.g coiling.g combing.g connecting.g contracting.g cooking.g cooling.g copping.g costuming.g coughing.g counting.g cracking.g cramming.g crossing.g crowding.g crumbling.g crumpling.g crunching.g curling.g dashing.g dematerializing.g dialing.g dialling.g digging.g dining.g dragging.g draining.g dressing.g drinking.g driving.g dropkicking.g dropping.g drowning.g drumming.g drying.g ducking.g dumbing.g easing.g eating.g edging.g emailing.g emceing.g emptying.g evangelizing.g evening.g facing.g fanning.g farming.g fattening.g feeding.g fending.g fetching.g feuding.g filing.g filling.g filtering.g firing.g firming.g fishing.g fisting.g flaring.g flattening.g flavoring.g flipping.g floating.g flooding.g flunking.g flushing.g flying.g folding.g following.g forking.g fouling.g freaking.g freezing.g frenching.g freshening.g frizzing.g frizzling.g fucking.g fueling.g galloping.g gathering.g glazing.g gobbling.g gonging.g grinding.g gulping.g hacking.g hammering.g hanging.g hardwiring.g harkening.g hauling.g heading.g healing.g heating.g herding.g hiding.g hiking.g hitching.g homering.g hooking.g hopping.g hunting.g ironing.g jamming.g jerking.g joining.g jumbling.g jumping.g kayaking.g killing.g knocking.g knotting.g lapping.g lashing.g leading.g leaking.g leaning.g leaping.g leveling.g levelling.g licking.g lightening.g lighting.g limbering.g lining.g livening.g looping.g loosening.g losing.g marching.g marrying.g matching.g melting.g messing.g missing.g mixing.g mopping.g mounding.g mouthing.g moving.g mucking.g nodding.g oozing.g opening.g optioning.g packing.g pairing.g panning.g parlaying.g partying.g peeing.g peeling.g piling.g pissing.g playing.g ploughing.g plowing.g plucking.g plunging.g pointing.g poking.g popping.g pounding.g prinking.g prying.g puckering.g pulling.g pumping.g quieting.g raking.g reaching.g reeling.g renting.g rerecording.g resizing.g reving.g rewinding.g riding.g ringing.g ripping.g rocking.g rolling.g rooting.g rotoscoping.g rounding.g rubbing.g running.g rushing.g sawing.g scoping.g scouting.g scraping.g scratching.g screwing.g scuffing.g sealing.g seguing.g serving.g settling.g sewing.g shaping.g shaving.g shifting.g shipping.g shooting.g shorting.g shrugging.g shushing.g shutting.g signing.g silkscreening.g sketching.g skiing.g skin-diving.g skipping.g sliding.g slipping.g sloughing.g slowing.g smartening.g smashing.g smoothing.g snapping.g snatching.g sneaking.g sniffing.g snorkeling.g snorkelling.g snuffing.g soaking.g sobering.g softening.g spacing.g sparking.g speeding.g spelling.g spilling.g spinning.g spiraling.g spiralling.g spitting.g splicing.g splitting.g spreading.g springing.g sprouting.g sprucing.g squaring.g squeezing.g squirting.g staggering.g stalking.g stamping.g staring.g starring.g starving.g steaming.g sticking.g stiffening.g stirring.g stocking.g storming.g straightening.g stretching.g striking.g stripping.g sucking.g summing.g surfing.g swelling.g swimming.g swinging.g switching.g swotting.g tallying.g tangling.g tapering.g tasking.g thickening.g thinning.g ticking.g tidying.g tightening.g tinkling.g tipping.g tiring.g togging.g toning.g toppling.g tossing.g trailing.g treading.g trimming.g tripping.g tucking.g tumbling.g tuning.g twisting.g typing.g waking.g warming.g weaving.g weeding.g weighing.g whipping.g whooping.g winding.g winning.g wiping.g working.g wrapping.g link-grammar-4.7.4/data/en/words/words.v.1.40000644000175000017500000003110711406233171017410 0ustar bloombloomabating.v about-facing.v absconding.v acceding.v accounting.v accruing.v aching.v acquiescing.v adenizing.v adhering.v adjoining.v ad-libbing.v alighting.v alluding.v ambling.v ambulating.v amounting.v anteflecting.v apologizing.v apostatizing.v appertaining.v aquaplaning.v arising.v arriving.v assenting.v astringing.v atoning.v atrophying.v attitudinizing.v autoagglutinating.v autodegrading.v autooxidising.v auto-oxidizing.v autooxidizing.v autoproliferating.v autotomizing.v autoxidizing.v babbling.v babysitting.v backbiting.v backfiring.v backpedalling.v backsliding.v backspacing.v bacteriolyzing.v balking.v ballooning.v bamming.v banqueting.v bantering.v banting.v barfing.v barking.v basking.v bawling.v baying.v beeping.v beetling.v behaving.v belching.v bellyaching.v belonging.v billowing.v biodegrading.v bitching.v blabbering.v blazing.v bleating.v bleeping.v blenching.v blethering.v bloating.v blooming.v blossoming.v blubbering.v blundering.v blushing.v boding.v booming.v braking.v braying.v bristling.v brooding.v browsing.v bubbling.v budding.v bullshitting.v bunking.v burbling.v burping.v bustling.v cabbing.v cackling.v calving.v campaigning.v canaliculizing.v cantering.v capering.v capillarizing.v capitulating.v careening.v caroling.v carolling.v carousing.v cascading.v castling.v catering.v caviling.v cavilling.v cavorting.v chafing.v chattering.v chemosensitising.v chiming.v chirping.v chirruping.v chortling.v chromatofocusing.v chromatofocussing.v chuckling.v chugging.v chumming.v clacking.v clamoring.v clamouring.v clanking.v clashing.v clattering.v clerking.v climaxing.v clinging.v clucking.v clunking.v clustering.v coalescing.v coasting.v cocirculating.v coevolving.v cohabiting.v cohering.v coinciding.v collaborating.v collateralizing.v colliding.v colluding.v comigrating.v commentating.v commiserating.v communing.v comodulating.v competing.v complying.v compromising.v confabbing.v confabulating.v conflicting.v conforming.v congealing.v congregating.v conniving.v conspiring.v convalescing.v converging.v conversing.v cooing.v co-operating.v cooperating.v co-ossifying.v coossifying.v coping.v copulating.v corresponding.v coruscating.v counterphasing.v covariing.v covarying.v cowering.v crackling.v crash-diving.v crepitating.v cresting.v cringing.v croaking.v cross-dressing.v crossdressing.v crossmatching.v crowing.v crusading.v culminating.v curtseying.v curtsying.v cycling.v cyclizing.v cytoadhering.v cytodifferentiating.v dabbling.v dallying.v dawdling.v dawning.v day-dreaming.v daydreaming.v decamping.v decaying.v deceasing.v declutching.v decompensating.v decrementing.v decussating.v de-etiolating.v deetiolating.v defasciculating.v defaulting.v defecating.v defecting.v deflagrating.v degenerating.v dehiscing.v delaminating.v deliberating.v delving.v demurring.v departing.v depending.v deplaning.v deplasmolyzing.v depreciating.v deputizing.v desisting.v despairing.v deswelling.v deteriorating.v detracting.v detraining.v deviating.v devolving.v dieting.v differing.v digitating.v digressing.v dilly-dallying.v disagreing.v disappearing.v discoursing.v discriminating.v disembarking.v disintegrating.v disrobing.v dissembling.v dissenting.v dissertating.v divagating.v diverging.v doddering.v doodling.v doting.v double-parking.v dovetailing.v dowing.v downshifting.v downslanting.v downsloping.v drawling.v drizzling.v drooling.v dueling.v duelling.v dwelling.v dwindling.v eavesdropping.v economizing.v eddying.v editorializing.v effervescing.v efflorescing.v elapsing.v electioneering.v eloping.v emanating.v embarking.v emerging.v emigrating.v emoting.v empathizing.v encamping.v encroaching.v enquiring.v ensuing.v equivocating.v erring.v eructing.v erupting.v evaporating.v eventuating.v excelling.v exflagellating.v existing.v exiting.v exosmosing.v expatiating.v experimenting.v expiring.v explanting.v expostulating.v fainting.v faltering.v faring.v fasting.v fawning.v feinting.v festinating.v fibbing.v fibrosing.v fidgeting.v filibustering.v fizzing.v flailing.v flaking.v flaming.v flickering.v flinching.v flirting.v flitting.v flopping.v flourishing.v flowering.v fluctuating.v fluorescing.v fluttering.v fly-fishing.v foot-slogging.v foot-sloging.v foraging.v foregathering.v forgathering.v fornicating.v fossilizing.v fragmenting.v fraternizing.v freelancing.v free-wheeling.v freewheeling.v fretting.v frivoling.v frolicing.v frowning.v fulminating.v fuming.v functioning.v fundholding.v fungating.v fussing.v gallivanting.v gamboling.v gambolling.v gaping.v gardening.v gastrulating.v gawking.v gawping.v gazing.v gelating.v gelling.v gesticulating.v gesturing.v gibbering.v gibing.v giggling.v glaring.v gleaming.v gliding.v glimmering.v glinting.v glistening.v glistering.v glitching.v glittering.v gloating.v globe-troting.v globetroting.v globe-trotting.v globetrotting.v glorying.v glowing.v goggling.v golfing.v gormandizing.v gossiping.v gossipping.v graduating.v grappling.v gravitating.v graying.v grazing.v greying.v grimacing.v grinning.v grooving.v grouching.v grousing.v groveling.v grovelling.v guffawing.v gurgling.v gusting.v gybing.v gyrating.v haggling.v haleing.v hallucinating.v harking.v harping.v hearkening.v heeling.v herniating.v heterodimerizing.v heteromultimerizing.v hewing.v hibernating.v hiccuping.v hiccupping.v hinging.v hissing.v hitchhiking.v hobnobbing.v hollering.v honeymooning.v hovering.v huddling.v huffing.v hungering.v hurtling.v hydroplaning.v hyperaggregating.v hyperdefecating.v hyperfiltering.v hyperluteinizing.v hypermutating.v hypertrophying.v hyporesonating.v hyporesponding.v ice-skating.v immigrating.v immunoreacting.v impended.v impending.v impinging.v inching.v infarcting.v innovating.v interacting.v interceding.v intercommunicating.v interdigitating.v interfering.v intermarrying.v intermingling.v intervening.v intruding.v intumescing.v inveighing.v involuting.v itching.v jabbering.v jack-knifing.v jawing.v jay-walking.v jaywalking.v jelling.v jesting.v jibing.v jittering.v jiving.v jockeying.v joking.v journeying.v kemping.v lacrimating.v lactating.v lagging.v languishing.v lapsing.v lasing.v laughing.v leafing.v leering.v legislating.v liaising.v lisping.v living.v loafing.v locomoting.v loitering.v lolling.v longing.v loping.v lounging.v lowning.v lumbering.v lusting.v luxuriating.v majoring.v malignizing.v malingering.v marauding.v marveling.v marvelling.v masquerading.v materializing.v matriculating.v maturating.v maturing.v maundering.v meandering.v meddling.v meditating.v menstruating.v meowing.v metamorphosing.v metastasizing.v miaouing.v micturating.v migrating.v militating.v mingling.v ministering.v misbehaving.v misfiring.v molting.v monkeying.v mooching.v mooing.v moping.v moralizing.v moseying.v motioning.v motoring.v mouldering.v muck-raking.v mushrooming.v mutinying.v name-dropping.v napping.v nattering.v necking.v necrosing.v neighing.v nesting.v networking.v niggling.v nosediving.v noshing.v objecting.v occuring.v occurring.v officiating.v orating.v oscillating.v oscitating.v osmoregulating.v osmosing.v osseointegrating.v outgoing.v overacting.v overbidding.v overcompensating.v overeating.v overlying.v overreacting.v oversleeping.v overwintering.v ovulating.v paling.v palling.v palpebrating.v palpitating.v pandering.v panhandling.v panicking.v panting.v parachuting.v parleying.v partaking.v participating.v pattering.v pausing.v peaking.v pearling.v peeping.v pellating.v perambulating.v percolating.v perishing.v persevering.v persisting.v perspiring.v pertaining.v philandering.v philosophizing.v picnicking.v piddling.v pimping.v pinging.v pirouetting.v pivoting.v planing.v play-acting.v plodding.v plummetting.v politicking.v polkaing.v pollocking.v poming.v pomming.v pontificating.v poring.v posturing.v pottering.v pouncing.v pouting.v powwowing.v prancing.v prating.v prattling.v preachifiing.v preachifying.v predominating.v pre-existing.v preponderating.v preregistering.v presiding.v prevailing.v prevaricating.v preying.v primping.v procrastinating.v procreating.v profiteering.v profiting.v progressing.v prolapsing.v proliferating.v propagandizing.v proselytizing.v prospering.v protruding.v pub-crawling.v puling.v pullulating.v pulsating.v pulsing.v punning.v pupariating.v pupating.v purring.v pussyfooting.v putrefying.v puttering.v quacking.v quaking.v quarrelling.v quarrying.v quavering.v questing.v queueing.v quibbling.v quipping.v quivering.v racketing.v rafting.v raging.v railing.v raining.v rambling.v rampaging.v rankling.v ranting.v rasping.v ratting.v raving.v reacting.v reappearing.v rebelling.v rebounding.v receding.v reclining.v recoiling.v reconnoitring.v reconverting.v recriminating.v recrudescing.v recuperating.v recurring.v redecussating.v redounding.v re-echoing.v re-emerging.v reemerging.v refecting.v refixating.v reflowing.v refraining.v regressing.v reigning.v re-infarcting.v reinfarcting.v re-intervening.v reintervening.v rejoicing.v relapsing.v relenting.v relying.v reminiscing.v remonstrating.v renarrowing.v rendezvousing.v reneging.v re-occuring.v reoccuring.v repetaturing.v repining.v residing.v resonating.v resorting.v resounding.v respiring.v restenosing.v resting.v resulting.v resurfacing.v retaliating.v retching.v retreating.v retrenching.v retrograding.v retrogressing.v reveling.v revelling.v reverberating.v reverting.v revolting.v revolving.v rhapsodizing.v rioting.v ripening.v riposting.v rippling.v rocketing.v romancing.v romping.v rooming.v roosting.v rootling.v rough-housing.v roving.v rubber-necking.v rubbernecking.v rumbling.v ruminating.v rummaging.v rusting.v sagging.v salivating.v sauntering.v scampering.v scar_cicatrizing scavenging.v scheming.v scintillating.v scowling.v scramming.v screeching.v scrimping.v scrimshanking.v scrolling.v scrounging.v scubaing.v scuffling.v seceding.v seesawing.v seething.v sermonizing.v seroconverting.v seroreverting.v shadow-boxing.v shilly-shalliing.v shilly-shallying.v shillyshallying.v shimmering.v shitting.v shivering.v shrimping.v shuddering.v side-sliping.v side-slipping.v siding.v sidling.v simmering.v simpering.v sinning.v sizzling.v skating.v skedaddling.v skimping.v skirmishing.v skulking.v skylarking.v sky-rocketing.v skyrocketing.v slackening.v slaloming.v slalomming.v slavering.v sleeting.v slithering.v slobbering.v slogging.v slouching.v slumbering.v slumming.v slushing.v smarting.v smiling.v smirking.v smoldering.v smouldering.v snacking.v snaking.v sneering.v sneezing.v snickering.v sniffling.v sniggering.v sniping.v snitching.v sniveling.v snivelling.v snooping.v snoozing.v snoring.v snowballing.v snowboarding.v snowing.v snowshoing.v snuffling.v sobbing.v softlanding.v sojourning.v soliloquizing.v somersaulting.v soughing.v souring.v sparkling.v sparring.v specialising.v specializing.v speciating.v speechifying.v spermiating.v sphacelating.v splurging.v spluttering.v sprawling.v sprinting.v sputtering.v squabbling.v squalling.v squawking.v squeaking.v squealing.v squinting.v squirming.v stagnating.v stemming.v stone-walling.v straggling.v straying.v striding.v stridulating.v striving.v struggling.v stuttering.v subbing.v subscribing.v subsiding.v subsisting.v subspecializing.v succumbing.v sulking.v summering.v sunbathing.v supercoiling.v supervening.v supping.v suppurating.v surfacing.v surging.v swaggering.v swarming.v sweltering.v swerving.v swirling.v swooning.v sympathizing.v tampering.v tap-dancing.v tapdancing.v tarrying.v tattling.v taxiing.v teeming.v teetering.v teething.v temporizing.v tergiversating.v testating.v thriving.v throbbing.v thudding.v tingling.v tinkering.v tippling.v tiptoeing.v tittering.v tittle-tattling.v toadying.v tobogganing.v toiling.v tolling.v tootling.v tottering.v touch-typing.v towering.v toying.v traipsing.v transmigrating.v transpiring.v traveling.v travelling.v trekking.v trembling.v trespassing.v trifling.v trifurcating.v triumphing.v trundling.v tunneling.v tunnelling.v tussling.v tweeting.v twinkling.v twitching.v twittering.v ululating.v underacting.v undulating.v uplinking.v urinating.v urticating.v vacationing.v vacillating.v vacuolating.v vamoosing.v vamping.v vanishing.v vaulting.v vegetating.v venodilating.v verbigerating.v verging.v volvulating.v vouching.v voyaging.v vying.v waddling.v waffling.v wallowing.v waltzing.v wandering.v waning.v wanking.v warbling.v water-skiing.v waterskiing.v wavering.v weeping.v welshing.v weltering.v wheezing.v whelping.v whimpering.v whinnying.v whirring.v wilting.v wincing.v winking.v wiretapping.v wisecracking.v withering.v wobbling.v womanizing.v wool-gathering.v woolgathering.v wrangling.v wriggling.v writhing.v yachting.v yaking.v yammering.v yanging.v yapping.v yawing.v yawning.v yearning.v yelping.v yenning.v yiping.v yowling.v zagging.v zaging.v zigging.v ziging.v zig-zagging.v zigzagging.v link-grammar-4.7.4/data/en/words/units.1.dot0000644000175000017500000000013611244620317017573 0ustar bloombloomin.u ins.u ft.u yd.u yds.u mi.u lb.u lbs.u oz.u ozs.u tbsp.u tsp.u pt.u qt.u gal.u bbl.u sq.u link-grammar-4.7.4/data/en/words/words.n.2.s.wiki0000644000175000017500000000672511274337051020457 0ustar bloombloomactuators.n agonists.n airdates.n airlifts.n airspeeds.n aminos.n animators.n annals.n antennas.n antidepressants.n architectures.n arrangers.n automakers.n backpacks.n bandmates.n bassists.n batsmans.n battlecruisers.n beamlines.n bestsellers.n bibles.n biodiversities.n bios.n biosyntheses.n bitmaps.n blogs.n bookends.n bungees.n campsites.n capacitors.n carcinomas.n carvings.n cassavas.n characteristics.n chargebacks.n châteaus.n chipsets.n chlorides.n cholines.n ciliates.n coauthors.n codenames.n codeshares.n coeds.n collaborations.n collaboratives.n consortiums.n constructivists.n cornerbacks.n cosmologys.n cottonseeds.n cowls.n crossovers.n crystallographers.n cytokines.n damselfishs.n deformations.n dehydrogenases.n deliriants.n dementias.n demographics.n départements.n desertifications.n desktops.n dhimmis.n diagnostics.n diazepams.n dielectrics.n diodes.n dipoles.n disambiguations.n discographies.n dissociatives.n disulfides.n docodonts.n dodecahedrons.n dogsleds.n dongles.n dopamines.n dropkicks.n duos.n dysplasias.n eds.n electrophoresiss.n els.n ems.n emulsifiers.n endgames.n enrollments.n epiphytes.n escudos.n esters.n ethanols.n exorcisms.n facelifts.n factsheets.n fansites.n fanzines.n faunas.n favorites.n fenestras.n fibers.n fibrosiss.n filmmakers.n filmographies.n firefighters.n flatbeds.n frontlines.n functionalities.n gamers.n genomes.n geophytes.n glutens.n gratings.n guans.n habitants.n haires.n handcrafts.n haploids.n headlocks.n herbicides.n herbivores.n homepages.n homers.n homeworlds.n homologs.n honeys.s housemates.n hydrolases.n hydroxyls.n hypertensions.n indies.n inductees.n infills.n insecticides.n internationals.n intros.n jetways.n jurisdictions.n kasbahs.n kinases.n latencies.s lats.n layouts.n lays.n lentinans.n leukemias.s lifestyles.s linebackers.n lipids.n lobs.n logins.n logistics.n louvers.n mafias.n maréchals.n maters.n maxillaries.n melanogasters.n metalwares.s metros.n microarrays.n midfielders.n miffs.n millenniums.s minimalists.n miniseries.n minis.n mollusks.n moots.n mornings.n morphes.n morphs.n morts.n mullions.n multicasts.n multilayers.n multiplexes.s mutants.n myopathies.n myspaces.n namespaces.n nanotubes.n noogies.n novellas.s nutrients.n offloads.n omnivores.n orchestrations.s outs.n outtakes.n overdubs.n panchayats.n paras.n parlays.n particulates.n peptides.n phylogenies.s phylogenys.s phylums.s pides.s pixels.n plantings.n plesiosaurs.n plugins.n podcasts.n polymerases.n polysaccharides.n polyunsaturates.n porphyrias.n portages.n preforms.n preschools.n presenters.n promos.n purebreds.n purines.n pyrimidines.n quartos.n rankings.n rappers.n reasoners.n reboots.n rebrands.n rebroadcasters.n receptors.n redrafts.n redshirts.n relaxants.n remixes.n renters.n replications.n rerecords.n rereleases.n resits.n retardants.n retries.n rewinds.n ridings.n sauropods.n scopes.n screenshots.n screenwriters.n segues.n semis.n sensors.n sequestrants.n setups.n shorthairs.n shorthands.n sidekicks.n silkscreens.n simulcasts.n songwriters.n specialisations.n speciations.n standardbreds.n stats.n steroids.n storyboards.n storylines.n strikeouts.n suicides.s supervillains.n suplexes.n surroundings.n swears.n sweeteners.n synopses.n syntheses.n telcos.n theses.n timbales.n timelines.n topologies.n torsions.n tortas.n trackbeds.n transfers.s transgenders.n trisomies.n vapors.n varsities.s vegans.n vertexes.s verticies.s virals.n vocals.n vols.n wargames.n waymarks.n webcams.n weblogs.n webpages.n wetlands.n wheelbases.n wikis.n yuans.n link-grammar-4.7.4/data/en/words/words.n.1.wiki0000644000175000017500000000540211265721575020214 0ustar bloombloomacetylcholine.n activism.n actuator.n agonist.n airdate.n airlift.n airspeed.n amino.n animator.n annal.n antenna.n antidepressant.n arranger.n ataxia.n audio.n automaker.n backfill.n backpack.n bandmate.n bandwidth.n basal.n basic.n bassist.n batsman.n battlecruiser.n beamline.n benzodiazepine.n bestseller.n bible.n biodiesel.n bioinformatics.n bio.n bitmap.n blog.n bodie.n bookend.n bungee.n campsite.n capacitor.n carving.n cassava.n ceramics.n characteristic.n chargeback.n chipset.n choline.n ciliate.n citie.n coauthor.n codename.n codeshare.n collaborative.n condiment.n constructivist.n cornerback.n cowl.n crossover.n cryptography.n crystallographer.n cytokine.n deede.n deformation.n dehydrogenase.n deliriant.n demographic.n département.n desertification.n desktop.n dhimmi.n diagnostic.n diazepam.n dielectric.n diode.n dipole.n disambiguation.n dissociative.n disulfide.n divi.n docodont.n dodecahedron.n do.n dongle.n dropkick.n duo.n dysplasia.n ed.n el.n em.n emulsifier.n endgame.n enrollment.n epiphyte.n escudo.n ester.n ethanol.n euro.n exorcism.n facelift.n factsheet.n fansite.n fanzine.n favorite.n fenestra.n fibrosis.n filmmaker.n firefighter.n fond.n fonds.n frontline.n gamer.n genome.n geophyte.n gluten.n grating.n guan.n habitant.n haire.n handcraft.n haploid.n headlock.n hearte.n herbivore.n herbology.n homepage.n homer.n homeworld.n homolog.n housemate.n hydrolase.n hydroxyl.n hypertension.n indie.n inductee.n infill.n international.n intro.n jetway.n kasbah.n kinase.n lat.n layout.n lentinan.n linebacker.n lipid.n lob.n login.n logistic.n louver.n mafia.n maréchal.n mater.n melanogaster.n metro.n microarray.n midfielder.n miff.n minimalist.n mini.n moat.n mollusk.n moot.n morphe.n morph.n mort.n mullion.n multicast.n multilayer.n mutant.n myspace.n namespace.n nanotube.n noogie.n nutrient.n offload.n omnivore.n outtake.n overdub.n panchayat.n para.n parlay.n particulate.n peptide.n pixel.n planting.n plesiosaur.n plugin.n podcast.n polymerase.n polysaccharide.n polyunsaturate.n porphyria.n portage.n preform.n preschool.n presenter.n promo.n purebred.n purine.n pyrimidine.n quarto.n ranking.n rapper.n reasoner.n reboot.n rebrand.n rebroadcaster.n receptor.n redraft.n redshirt.n relaxant.n renter.n replication.n rerecord.n rerelease.n resit.n retardant.n rewind.n riding.n sauropod.n screenshot.n screenwriter.n segue.n semi.n sensor.n sequestrant.n setup.n shorthair.n sidekick.n silkscreen.n simulcast.n songwriter.n specialisation.n speciation.n standardbred.n stat.n steroid.n storie.n storyboard.n storyline.n strikeout.n supervillain.n surrounding.n swear.n sweetener.n telco.n timbale.n timeline.n torsion.n torta.n transgender.n vapor.n vegan.n viral.n vocal.n vol.n wargame.n waymark.n webcam.n weblog.n webpage.n wetland.n wheelbase.n wiki.n yuan.n link-grammar-4.7.4/data/en/words/entities.national.sing0000644000175000017500000001211511243501715022073 0ustar bloombloomAfghanistan.l AF.l Albania.l AL.l Algeria.l AG.l Andorra.l AN.l Angola.l AO.l Anguilla.l AV.l Antigua_and_Barbuda AC.l Argentina.l AR.l Armenia.l AM.l Aruba.l AA.l Ashmore Cartier Ashmore_and_Cartier_Islands AT.l Australia.l AS.l Austria.l AU.n Azerbaijan.l AJ.l Bahamas.l the_Bahamas BF.l Bahrain.l BA.l Bangladesh.l BG.l Barbados.l BB.l Bassas_Da_India BS.l Belarus.l BO.l Belgium.l BE.l Belize.l BH.l Benin.l BN.l Bermuda.l BD.l Bhutan.l BT.l Bolivia.l BL.l Bosnia_and_Herzegovina BK.l Botswana.l BC.l Bouvet Bouvet_Island BV.l Brazil.l BR.l British_Indian_Ocean_Territory IO.l British_Virgin_Islands VI.l Brunei.l BX.l Bulgaria.l BU.l Burkina Faso Burkina_Faso UV.l Burma.l BM.l Burundi.l BY.l Cambodia.l CB.l Cameroon.l CM.l Canada.l CA.l Cape_Verde CV.l Cayman_Islands CJ.l Central_African_Republic CT.l Chad.l Chile.l CI.l China.l Christmas_Island KT.l Clipperton Clipperton_Island IP.l Cocos Cocos_Islands CK.l Colombia.l CO.l Comoros.l CN.l Congo.l CF.l CG.l Democratic_Republic_of_Congo Cook Cook_Islands CW.l Coral_Sea_Islands CR.l Costa Rica Costa_Rica CS.l Cote Cote_d'Ivoire IV.l Ivory_Coast Croatia.l HR.l Cuba.l CU.l Cyprus.l CY.l Czech_Republic EZ.l Delhi.l Denmark.l DA.l Djibouti.l DJ.l Dominica.l DO.l Dominican_Republic DR.l Timor East_Timor TT.l Ecuador.l EC.l Egypt.l EG.l El_Salvador ES.l Equatorial_Guinea EK.l Eritrea.l ER.l Estonia.l EN.l Ethiopia.l ET.l Europa_Island EU.l Falkland Islas Falkland_Islands FK.l Islas_Malvinas Faroe Faroe_Islands FO.l Fiji.l FJ.l Finland.l FI.l France.l FR.l French_Guiana FG.l French_Polynesia FP.l French_Southern_and_Antarctic_Lands FS.l Gabon.l GB.l Gambia.l GA.l Gaza Gaza_Strip GZ.l Georgia.l GG.l Germany.l GM.l Ghana.l GH.l Gibraltar.l GI.l Glorioso Glorioso_Islands GO.l Greece.l GR.l Greenland.l GL.l Grenada.l GJ.l Guadeloupe.l GP.l Guatemala.l GT.l Guernsey.l GK.l Guinea.l GV.l BISSAU.l Guyana.l GY.l Haiti.l HA.l Heard McDonald Heard_Island_and_McDonald_Islands HM.l Heard_Island McDonald_Islands Honduras.l HO.l Kong Hong_Kong HK.l Hungary.l HU.l Iceland.l IC.l India.l IN.l Indonesia.l ID.l Iran.l IR.l Iraq.l IZ.l Ireland.l EI.l Isle_of_Man IM.l Israel.l IS.l Italy.l IT.l Jamaica.l JM.l Mayen Jan_Mayen JN.l Japan.l JA.l Jersey.l JE.l Jordan.l JO.l Juan_de_Nova_Island JU.l Kazakhstan.l KZ.l Kenya.l KE.l Kiribati.l KR.l Kuwait.l KU.l Kyrgyzstan.l KG.l Laos.l LA.l Latvia.l LG.l Lebanon.l LE.l Lesotho.l LT.l Liberia.l LI.l Libya.l LY.l Liechtenstein.l LS.l Lietuva Lithuania.l LH.l Luxembourg.l LU.l Macau.l MC.l Macedonia.l MK.l Former_Yugoslav_Republic_of_Macedonia Madagascar.l MA.l Malawi.l MI.l Malaysia.l MY.l Maldives.l MV.l Mali.l ML.l Malta.l MT.l Malvinas.l Marshall_Islands RM.l Martinique.l MB.l Mauritania.l MR.l Mauritius.l MP.l Mayotte.l MF.l Mexico.l MX.l Micronesia.l FM.l Federated_States_of_Micronesia Moldova.l MD.l Monaco.l MN.l Mongolia.l MG.l Montserrat.l MH.l Morocco.l MO.l Mozambique.l MZ.l Namibia.l WA.l Nauru.l NR.l Nepal.l NP.l Netherlands.l NL.l Antilles Netherlands_Antilles NT.l Caledonia New_Caledonia Zealand New_Zealand NZ.l Nicaragua.l NU.l Niger.l NG.l Nigeria.l NI.l Niue.l NE.l No_Man's_Land Norfolk_Island NF.l North_Korea KN.l Norway.l NO.l Oceans.l OS.l Oman.l MU.l Pakistan.l PK.l Palau.l PS.l Panama.l Papua Papua_New_Guinea PP.l Paracal Paracel_Islands PF.l Paraguay.l PA.l Peru.l PE.l Philippines.l RP.l Pitcairn Pitcairn_Islands PC.l Poland.l PL.l Portugal.l PO.l Qatar.l QA.l Reunion.l RE.l Romania.l RO.l Russia.l RS.l Rwanda.l RW.l Saint_Helena SH.l Kitts Nevis Saint_Kitts_and_Nevis Saint_Lucia ST.l Miquelon Saint_Pierre_and_Miquelon SB.l Grenadines Saint_Vincent_and_the_Grenadines VC.l Samoa.l WS.l Marino San_Marino SM.l Tome Principe Sao_Tome_and_Principe TP.l São Tomé Príncipe São_Tomé_and_Príncipe Saudia Arabia Saudi_Arabia SA.l Senegal.l SG.l Serbia_and_Montenegro YI.l Serbia.l Montenegro.l Seychelles.l SE.l Sierra_Leone SL.l Singapore.l SN.l Slovakia.l LO.l Slovenia.l SI.l Solomon_Islands BP.l Somalia.l SO.l South_Africa SF.l Sandwich South_Georgia_and_the_South_Sandwich_Islands SX.l South_Georgia South_Sandwich_Islands South_Korea KS.l Spain.l SP.l Spratly Spratly_Islands PG.l Sri Lanka Sri_Lanka CE.l Sudan.l SU.l Suriname.l NS.l Svalbard.l SV.l Swaziland.l WZ.l Sweden.l SW.l Switzerland.l SZ.l Syria.l SY.l Taiwan.l TW.l Tajikistan.l TI.l Tanzania.l TZ.l Thailand.l TH.l Tobago.l Togo.l TO.l Tokelau.l TL.l Tonga.l TN.l Trinidad_and_Tobago TD.l Tromelin Tromelin_Island TE.l Tunisia.l TS.l Turkey.l TU.l Turkmenistan.l TX.l Caicos Turks_and_Caicos_Islands TK.l Caicos_Islands Tuvalu.l Uganda.l UG.l Ukraine.l UP.l Undersea_Features UF.l Emirates United_Arab_Emirates AE.l Kingdom United_Kingdom UK.l United_States_of_America United_States USA.l US.l America.l Uruguay.l UY.l Uzbekistan.l UZ.l Vanuatu.l Vatican_City VT.l Venezuela.l VE.l Vietnam.l VM.l Virgin_Islands VQ.l Wallis Futuna Wallis_and_Futuna WF.l West_Bank WE.l Sahara Western_Sahara WI.l Yemen.l YM.l Zambia.l ZA.l Zimbabwe.l ZI.l link-grammar-4.7.4/data/en/words/units.4.dot0000644000175000017500000000006511244612627017604 0ustar bloombloommin.u h.u hr.u dy.u wk.u wks.u mo.u mos.u yr.u yrs.u link-grammar-4.7.4/data/en/words/words.adj.10000644000175000017500000023353511526022265017553 0ustar bloombloominducible.a abdominal.a aberrant.a abhorrent.a abiotic.a abject.a abnormal.a abominable.a abortive.a abovementioned.a abrasive.a abrupt.a absent.a absolute.a absorbent.a absorptive.a abstemious.a abstract.a abstracted.a abstruse.a absurdist.a abundant.a abusive.a abysmal.a abyssal.a academic.a academical.a accessible.a accidental.a accredited.a accrual.a accumulative.a accurate.a accursed.a accusative.a acerbic.a acetic.a achievable.a acid.a acidic.a acoustic.a acoustical.a acquiescent.a acquisitive.a acrid.a acrimonious.a acrobatic.a acrocentric.a actionable.a active.a actual.a acute.a adagio.a adamant.a adaptable.a adaptive.a addictive.a additional.a adept.a adequate.a adhesive.a adiabatic.a adipic.a adjacent.a adjectival.a adjustable.a adjuvant.a administrative.a admissible.a adolescent.a adoptive.a adorable.a adrenal.a adrenergic.a adroit.a adulterous.a advanced.a adventitious.a adventuresome.a adventurous.a adverbial.a adversarial.a adverse.a advisory.a aerial.a aero.a aerobic.a aerodynamic.a aeronautical.a aesthetic.a aesthetical.a affable.a affectionate.a affective.a affine.a affirmative.a affliated.a affluent.a affordable.a aforementioned.a aforesaid.a agape.a aged.a ageless.a agglomerate.a aggressive.a agile.a agitated.a agnostic.a agonizing.a agrarian.a agreeable.a agricultural.a aimless.a airborn.a airborne.a airplay.a airspace.a airtight.a airworthy.a airy.a alabaster.a alcoholic.a aleatoric.a alert.a alfresco.a algal.a algebraic.a algorithmic.a alien.a alimentary.a aliphatic.a alkaline.a allegoric.a allegorical.a allegretto.a allegro.a allergic.a alliterative.a allogeneic.a allophonic.a allosteric.a allowable.a alluvial.a almighty.a aloof.a alphabetic.a alphabetical.a alpine.a alright.a alternative.a altitudinal.a altricial.a altruistic.a alumina.a alumni.a amateurish.a amatory.a ambassadorial.a ambidextrous.a ambient.a ambiguous.a ambitious.a ambivalent.a ambulatory.a amenable.a American.a amiable.a amicable.a amino.a amnesiac.a amniotic.a amoebic.a amoral.a amorous.a amorphous.a amphibious.a ample.a anabolic.a anachronistic.a anaemic.a anal.a analogical.a analogous.a analyte.a analytic.a analytical.a anamorphic.a anapaestic.a anarchic.a anatomic.a anatomical.a ancestral.a ancient.a ancillary.a andante.a andean.a androgenic.a androgynous.a anecdotal.a angelic.a angry.a anguished.a angular.a anhydrous.a animalistic.a animate.a animated.a animatronic.a animistic.a annual.a annular.a annus.a anomalous.a anonymous.a anorexic.a answerable.a antagonistic.a antarctic.a antebellum.a antediluvian.a antepenultimate.a anterior.a anthemic.a anthropogenic.a anthropological.a anthropomorphic.a anti.a antiandrogenic.a antibiotic.a anticholinergic.a anticipatory.a anticoagulant.a anticonvulsant.a antidepressant.a antidiarrhoeal.a antiemetic.a antifungal.a antihistaminergic.a antihypertensive.a antilock.a antimicrobial.a antinodal.a antipodean.a antipsychotic.a antiqua.a antiquarian.a antiquated.a antique.a antisemitic.a antisense.a antiseptic.a antislavery.a antisocial.a antitank.a antithetical.a antitrust.a antitumor.a antivirus.a anxiolytic.a aortic.a apathetic.a apelike.a apical.a aplastic.a apocalyptic.a apocryphal.a apologetic.a apoplectic.a apostolic.a appalling.a appealing.a appetizing.a applicable.a apposite.a appreciable.a approachable.a approximate.a apropos.a apsidal.a aquatic.a aqueous.a Arab.a Arabian.a Arabic.a arable.a arachidonic.a arachnoid.a arbitrary.a arboreal.a arcaded.a arcane.a arch.a archaeal.a archaeological.a archaic.a archeological.a archetypal.a archetypical.a architectural.a archival.a archrival.a arctic.a ardent.a arduous.a argumentative.a arid.a aristocratic.a arithmetical.a armored.a armorial.a armoured.a aromatic.a arresting.a arrterial.a arte.a arterial.a artesian.a artful.a arthritic.a articular.a articulate.a artifactual.a artificial.a artistic.a artless.a arty.a ascetic.a ascorbic.a asexual.a ashen.a assigned.a asinine.a assertive.a assiduous.a assistive.a associative.a assorted.a asthmatic.a astigmatic.a astral.a astringent.a astrological.a astronomical.a astute.a asymmetric.a asymmetrical.a asymptotic.a atavistic.a ataxic.a atheistic.a atheromatous.a athletic.a atmospheric.a atomic.a atonal.a atopic.a atrial.a atrocious.a atrophic.a attainable.a attendant.a attentive.a attractive.a attributable.a attributive.a atypical.a auburn.a audacious.a audible.a auditory.a august.a aural.a auspicious.a austere.a authentic.a authoritarian.a authoritative.a autistic.a autobiographical.a autocephalous.a autochthonous.a autocratic.a autofocus.a autologous.a automatic.a automotive.a autonomic.a autonomous.a autosomal.a autumnal.a auxiliary.a avaricious.a avec.a average.a averse.a aversive.a avian.a avid.a avoidable.a avuncular.a awesome.a axial.a axiomatic.a axonal.a azure.a babyish.a backhanded.a bacterial.a bactericidal.a baggy.a bailable.a bald.a baleful.a ballistic.a bally.a balmy.a banal.a baneful.a bankrupt.a baptismal.a barbaric.a barbarous.a barbed.a bardic.a bare.a barefaced.a barefooted.a bareheaded.a barelegged.a barmy.a baronial.a baroque.a barren.a barycentric.a basal.a basaltic.a base.a baseless.a bashful.a basic.a bass.a basset.a batty.a bawdy.a bay.a bayside.a beachfront.a beady.a beaked.a bearable.a bearded.a beardless.a bearish.a beastly.a beatific.a beauteous.a beautification.a beautiful.a becalmed.a bedecked.a bedraggled.a bedridden.a beefy.a beggarly.a behavioral.a behavioural.a beholden.a bejeweled.a bejewelled.a belated.a beleaguered.a believable.a bellicose.a belligerent.a beloved.a bemused.a beneficent.a beneficial.a benevolent.a benighted.a benign.a Beninese.a benthic.a benzoic.a berserk.a besotted.a bespangled.a be-spectacled.a bespectacled.a bestial.a bibical.a biblical.a Biblical.a bibliographic.a bicameral.a bicentered.a biennial.a bifocal.a big.a bigamous.a bigoted.a biharmonic.a bijective.a bilabial.a bilateral.a bilaterian.a bilingual.a bilious.a billiard.a billowy.a bimonthly.a binary.a binational.a binomial.a biochemical.a biodegradable.a biogenic.a biogeographic.a biographical.a biologic.a biological.a bioluminescent.a biometric.a biotechnological.a biotic.a bipartisan.a bipedal.a biphasic.a birdlike.a bisexual.a bitchy.a biting.a bitmapped.a bitter.a bituminous.a biweekly.a bizarre.a black.a blackish.a blackspotted.a black-taloned.a bladed.a blameless.a blanc.a bland.a blank.a blase.a blasphemous.a blatant.a bleak.a bleary.a blessed.a bleu.a blind.a blissful.a blithe.a blithering.a bloated.a blond.a blonde.a bloodcurdling.a bloodless.a bloodshot.a bloodstained.a bloodsucking.a bloodthirsty.a bloody.a blotto.a blowzy.a blue.a blueberry.a bluespotted.a bluesy.a bluff.a bluish.a blunt.a blurry.a blustery.a boastful.a bodied.a bodily.a boggy.a bogus.a bohemian.a boilered.a boisterous.a bold.a bolded.a bombastic.a boneless.a bonkers.a bonny.a bony.a bookended.a bookish.a boon.a boorish.a borderless.a bored.a boric.a bossa.a bossy.a botanic.a botanical.a bothersome.a bottomless.a bouffant.a bouncing.a bouncy.a bound.a boundless.a bounteous.a bountiful.a bourgeois.a bovine.a boyish.a brachial.a brackish.a brainless.a brainy.a brand-new.a brash.a brassy.a brawny.a brazen.a breakable.a breakneck.a breathless.a breathtaking.a breezy.a brief.a bright.a brilliant.a brined.a briny.a brisk.a bristly.a British.a brittle.a broad.a broadband.a bronchial.a broody.a brotherly.a brown.a brownish.a brusque.a brutal.a brutish.a bubbly.a bubonic.a bucolic.a Buddhist.a budgetary.a bulbous.a bulky.a bulletproof.a bullish.a bully.a bum.a bumptious.a bumpy.a buoyant.a burdensome.a bureaucratic.a burly.a bushy.a businesslike.a busy.a butch.a buxom.a bygone.a cacophonous.a cadaverous.a cagey.a calamitous.a calcareous.a calcicolous.a calculable.a calculating.a callous.a callow.a calm.a caloric.a calorific.a camp.a cancerous.a candid.a candied.a canine.a cankerous.a canned.a cannibalistic.a canny.a canonical.a cantankerous.a Cantonese.a capacious.a capacitative.a capacitive.a caped.a capitalistic.a capricious.a captive.a carbolic.a carbonaceous.a carbonated.a carbonic.a carboxylic.a carcinogenic.a cardiac.a cardinal.a cardiogenic.a cardiothoracic.a cardiovascular.a carefree.a careless.a careworn.a carmine.a carnal.a carnatic.a carnivorous.a carsick.a cartilaginous.a cartoonish.a cartoony.a casted.a castellated.a casual.a catabolic.a cataclysmic.a catalytic.a catastrophic.a catatonic.a catching.a catchy.a categorical.a catholic.a Catholic.a catty.a caudal.a causal.a causative.a causeless.a caustic.a cautionary.a cautious.a cavalier.a cavernous.a ceaseless.a celestial.a celled.a cellular.a cellulosic.a celtic.a censorious.a centenary.a centennial.a central.a centralised.a centric.a centrifugal.a centripetal.a cephalic.a ceramic.a ceratopsian.a cerebral.a ceremonial.a ceremonious.a certifiable.a cervical.a chafflike.a chalky.a challenging.a chambered.a chancy.a changeable.a chaotic.a chaotropic.a characteristic.a characterless.a chargeable.a charismatic.a charitable.a charming.a chaste.a chatty.a chauvinistic.a cheap.a cheeky.a cheerful.a cheerless.a cheery.a cheesy.a chemical.a chemotactic.a chenodeoxycholic.a cherry.a cherubic.a chewy.a chiasmal.a chic.a chichi.a chief.a childless.a childlike.a chill.a chilly.a Chinese.a chiral.a chiropractic.a chirpy.a chislic.a chitinous.a chitinozoan.a chivalric.a chivalrous.a chlamydial.a chloric.a chloroformate.a chloroformic.a chlorogenic.a chlorous.a choice.a choleric.a cholesteric.a cholinergic.a choosey.a choosy.a choppy.a choral.a chordal.a chorded.a choreographed.a chromatic.a chromed.a chromic.a chromomorphic.a chromosomal.a chromous.a chronic.a chronological.a chthonic.a chubby.a chummy.a chunky.a churched.a churlish.a ciliated.a cinematic.a cinerary.a circadian.a circuitous.a circular.a circulatory.a circumferential.a circumspect.a circumstantial.a citied.a citric.a citrous.a citywide.a civic.a civil.a civilian.a civilized.a cladistic.a clammy.a clamorous.a clandestine.a clangorous.a clannish.a classic.a classical.a classifiable.a classified.a classless.a classy.a clastic.a claustrophobic.a clean.a cleanly.a clearheaded.a clerical.a clever.a climactic.a climatic.a clinical.a cliquish.a clitic.a clonal.a close.a cloudless.a cloudy.a clueless.a clumsy.a coarse.a coastal.a coaxial.a cockeyed.a cockney.a cocksure.a cocky.a codenamed.a codeshared.a coeducational.a coeliac.a coercive.a coffered.a cofounded.a cogent.a cognitive.a cognizant.a coherent.a cohesive.a coincident.a coincidental.a cold.a collaborative.a collabrative.a collapsable.a collapsible.a collateral.a collected.a collective.a collegiate.a colloidal.a colloquial.a colonial.a colonic.a colonnaded.a colorful.a colorless.a colossal.a colourful.a colourless.a colubrid.a columnar.a comatose.a combatant.a combative.a combustible.a comely.a comfortable.a comfy.a comic.a comical.a commanding.a commemorative.a commensurable.a commensurate.a commercial.a commodious.a commonplace.a communal.a communicable.a communicative.a communist.a compact.a companionable.a comparable.a comparative.a compassionate.a compatible.a compensatory.a competent.a competitive.a complacent.a complaisant.a complementary.a complete.a complex.a compliant.a complicated.a component.a composed.a composite.a comprehensible.a comprehensive.a compulsive.a compulsory.a computable.a computational.a computerized.a concave.a concentic.a concentric.a conceptual.a concerted.a concessionary.a conciliatory.a concise.a conclusive.a concomitant.a concomittant.a concordant.a concrete.a concurrent.a concussive.a condescending.a conditional.a conditioned.a conducive.a conductive.a confederate.a confidential.a confined.a conformational.a confounded.a confrontational.a confusional.a congenial.a congenital.a congested.a congestive.a Congolese.a congratulatory.a congregational.a congressional.a congruent.a congruous.a conic.a conical.a coniferous.a conjectural.a conjugal.a conjugate.a conjunctival.a connective.a conscientious.a consecutive.a consequent.a consequential.a conservative.a considerable.a considerate.a consistent.a consonant.a consonantal.a conspecific.a conspicuous.a conspiratorial.a constant.a constipated.a constituent.a constitutional.a constitutive.a constrained.a constructive.a consular.a consultative.a consummate.a consumptive.a contagious.a contemplative.a contemporaneous.a contemporary.a contemptible.a contentious.a contextual.a contiguous.a continental.a contingent.a continual.a continuous.a contra.a contractionary.a contractual.a contradictory.a contrapuntal.a contrary.a contrasting.a contrastive.a contributory.a contrite.a controllable.a controversial.a convalescent.a convective.a convenient.a convergent.a conversant.a conversational.a converse.a convertible.a convex.a convincing.a convoluted.a convulsive.a cool.a co-operative.a cooperative.a copious.a coquettish.a coral.a cordate.a cordial.a cordless.a corked.a corneal.a corny.a coronal.a coronary.a corporal.a corporate.a corporeal.a corpulent.a correctional.a corrective.a corresponding.a corrigible.a corroborative.a corrosive.a corrupt.a corruptible.a cortical.a corymbiform.a cosmetic.a cosmic.a cosmological.a cosmopolitan.a costal.a costumed.a cosy.a coterminous.a countable.a counterproductive.a countless.a countywide.a courageous.a courteous.a courtly.a covalent.a covariant.a covert.a cowardly.a coxed.a coxless.a coy.a cozy.a crafty.a craggy.a cranial.a craniofacial.a cranky.a crass.a craven.a crazed.a creaky.a creamy.a creationist.a creative.a credible.a creditable.a credulous.a creepy.a crepuscular.a crestfallen.a criminal.a crimson.a crinkly.a crisp.a crispy.a crooked.a crosscountry.a crosseyed.a crosshead.a cross-legged.a crowded.a crowning.a cruciate.a cruciform.a crude.a crumbly.a crunchy.a crushing.a crusty.a cryogenic.a cryptic.a cryptologic.a crystalline.a cubic.a cubical.a cubital.a cuboid.a cuddly.a culinary.a culpable.a cultivable.a cultural.a cultured.a cumbersome.a cumulative.a cunning.a curable.a curative.a curatorial.a curly.a current.a curricular.a cursed.a cursiva.a cursive.a cursory.a curt.a curvy.a cushy.a custodial.a cutaneous.a cute.a cutthroat.a cutting.a cyanuric.a cyber.a cybernetic.a cyclic.a cyclical.a cyclonic.a cyclopean.a cyclotomic.a cylindrical.a cynical.a cystic.a cytoplasmic.a cytosolic.a dactylic.a daft.a daily.a dainty.a damn.a damnable.a damp.a dandy.a Danish.a dank.a dapper.a daring.a dark.a dastardly.a dative.a daunting.a dauntless.a d’Avant-Garde.a daylong.a deadlocked.a deadly.a deadpan.a deaf.a dear.a deathly.a debonair.a début.a decadent.a deceitful.a decennial.a decent.a deceptive.a deciduous.a decimal.a decipherable.a decisive.a declamatory.a declarative.a decongestant.a decorative.a decorous.a decrepit.a dedicatory.a deductible.a deductive.a deep-seated.a defamatory.a defeated.a defective.a defenceless.a defenseless.a defensible.a defensive.a deferential.a defiant.a deficient.a definable.a definitional.a definitive.a deflationary.a deft.a defunct.a degenerate.a dehiscent.a déjà.a delectable.a deleterious.a deliberate.a deliberative.a delicate.a delicious.a delightful.a delinquent.a delirious.a deliverable.a deltoid.a delusional.a demagogic.a demanding.a demented.a dementia.a demiurgic.a democratic.a démocratique.a demographic.a demoniac.a demonic.a demonstrative.a demure.a denatured.a dendritic.a deniable.a denominational.a dense.a dental.a deontic.a departmental.a dependable.a dependent.a depositary.a depressant.a depressive.a derelict.a derisive.a derisory.a derivative.a dermal.a dermoid.a derogatory.a descriptive.a deserving.a designate.a desolate.a despicable.a despondent.a despotic.a destitute.a destructible.a destructive.a desultory.a detachable.a detached.a detailed.a detectable.a detergent.a determinate.a deterministic.a deterrent.a detrimental.a detritivorous.a devastating.a developmental.a deviant.a devilish.a devious.a devoid.a devotional.a devout.a dexterous.a dextrorotatory.a dextrous.a dharmic.a diabetic.a diabolical.a diacritical.a diagnostic.a diagonal.a dialectical.a dialogical.a dialup.a diaphragmatic.a diastolic.a diatomaceous.a diatomic.a diatonic.a diauxic.a dicey.a dichotomic.a dichroic.a dictatorial.a didactic.a dielectric.a dietary.a dietetic.a differential.a diffident.a diffuse.a digestible.a digestive.a digital.a digitigrade.a dignified.a dihedral.a dilapidated.a dilatory.a diligent.a dilute.a dim.a dimensional.a dimensionful.a dimensionless.a dimeric.a diminutive.a dimorphic.a dim-witted.a dimwitted.a dingy.a diocesan.a dioecious.a diophantine.a diploic.a diplomatic.a dire.a direct.a directional.a directorial.a dirty.a disabled.a disadvantageous.a disaffected.a disaffiliated.a disagreeable.a disappointing.a disastrous.a discal.a discernible.a disciplinary.a disconnected.a disconsolate.a discontinuous.a discordant.a discouraged.a discourteous.a discreet.a discrete.a discretionary.a discriminating.a discriminatory.a discursive.a disdainful.a diseased.a disfranchised.a disgruntled.a dishevelled.a dishonourable.a dishy.a disingenuous.a disinterested.a disjointed.a disjunct.a disjunctive.a diskless.a disloyal.a dismal.a disobedient.a disorderly.a disparate.a dispassionate.a dispensable.a dispensational.a dispersive.a displeased.a displeasing.a disposable.a disproportionate.a disputable.a disputed.a disquieting.a disreputable.a disrespectful.a disruptive.a dissimilar.a dissipative.a dissociative.a dissoluble.a dissolute.a dissonant.a distal.a distasteful.a distinct.a distinctive.a distinguishable.a distinguished.a distracted.a distraught.a distributive.a distrustful.a disused.a ditrigonal.a diurnal.a divalent.a divergent.a divers.a diverse.a diversionary.a diverticular.a diverting.a divine.a divisible.a divisional.a divisive.a dizzy.a docile.a docosahexaenoic.a doctoral.a doctrinaire.a doctrinal.a documentary.a doddery.a dodecagonal.a dodgy.a dogged.a doglike.a dogmatic.a doleful.a dolomitic.a dolourous.a doltish.a domed.a domestic.a dominant.a domineering.a domoic.a donnish.a dopaminergic.a dopey.a dormant.a dorsal.a dotty.a double.a double-breasted.a doughy.a dour.a dowdy.a downcast.a downhearted.a downloadable.a downmarket.a downriver.a downstairs.a downtempo.a downtrodden.a downy.a doxastic.a drab.a draconian.a dramatic.a dramatistic.a dramaturgical.a drapey.a drastic.a dreadful.a dreamless.a dreamlike.a dreamy.a dreary.a dressy.a drinkable.a driverless.a drizzly.a droll.a drowsy.a drunk.a drunken.a dry.a dual.a dualistic.a dubious.a ducal.a duckbilled.a ducted.a due.a dull.a dumpy.a duodenal.a duplicitous.a durable.a dural.a dusky.a dusty.a dutiful.a dwarfish.a dwarven.a dynamic.a dynamical.a dynastic.a dynastical.a dyslexic.a dyspeptic.a early.a earnest.a earthen.a earthly.a earthy.a easterly.a eastwardly.a easygoing.a ebony.a ebullient.a eccentric.a ecclesiastical.a eclectic.a eco.a ecological.a econometric.a economic.a economical.a ecstatic.a ectomesenchymal.a ectopic.a ecumenical.a edgy.a edible.a editorial.a educated.a educational.a eerie.a eery.a effectual.a effeminate.a effervescent.a effete.a efficacious.a efflorescent.a effortless.a effusive.a egalitarian.a egocentric.a egoistic.a egoistical.a egotistic.a egotistical.a egregious.a eikonal.a ein.a el.a elaborate.a elastic.a elder.a elderly.a elective.a electoral.a electric.a electrical.a electro.a electrochemical.a electrodeless.a electrofax.a electrolytic.a electromagnetic.a electromechanical.a electromotive.a electronic.a electrophilic.a electrophonic.a electrophoretic.a electrophysiological.a electrostatic.a elegiac.a elemental.a elementary.a elephantine.a elfin.a elfish.a elliptic.a elliptical.a elocutionary.a eloquent.a elusive.a elven.a elvish.a emarginate.a embattled.a emblematic.a emblemmatic.a embryonic.a emergent.a emeritus.a eminent.a emotional.a emotive.a empathetic.a empathic.a emphatic.a empiric.a empirical.a employable.a empty.a encouraging.a encyclopaedic.a encyclopædic.n encyclopedic.a endemic.a endless.a endocrine.a endodontic.a endogenous.a endometrial.a endoplasmic.a endorheic.a endoscopic.a endothermic.a endotracheal.a endurable.a energetic.a enforceable.a engined.a English.a enigmatic.a enlightened.a enlightening.a enormous.a enterohepatic.a enterprising.a entheogenic.a enthused.a enthusiastic.a entire.a entomological.a entrepreneurial.a entropic.a enviable.a environmental.a enzymatic.a eosinophilic.a ephemeral.a epic.a epicanthal.a epicanthic.a epicurean.a epicyclic.a epidemic.a epidemiological.a epidural.a epigrammatic.a epileptic.a epiphytic.a episcopal.a episcopalian.a episodic.a epistemic.a epistemological.a epistolary.a epitaxial.a eponymous.a equal.a equatorial.a equestrian.a equidistant.a equilateral.a equine.a equitable.a equivalent.a equivocal.a erect.a ergodic.a ergonomic.a erogenous.a erotic.a errant.a erratic.a erroneous.a erudite.a erythroid.a eschatological.a esophageal.a esoteric.a especial.a esterification.a esthetic.a estimable.a estuarine.a eternal.a ethereal.a ethnic.a ethnocentric.a ethnographic.a ethnological.a etoposide.a etymological.a eugenic.a eukaryotic.a euphemistic.a euphoric.a eutectic.a evaluative.a evanescent.a evangelical.a evangelistic.a evaporative.a evaporitic.a evasive.a even.a eventful.a eventual.a evergreen.a everlasting.a everyday.a evidential.a evidentiary.a evil.a evocative.a evolutionary.a exact.a exacting.a exalted.a excellent.a exceptional.a excess.a excessive.a exchangeable.a excitable.a excitatory.a exclamatory.a exclusive.a excruciating.a excusable.a execrable.a executive.a exemplary.a exempt.a exhaustive.a existent.a exocrine.a exogenous.a exonuclease.a exorbitant.a exothermic.a exotic.a expansionist.a expansionistic.a expansive.a expectant.a expedient.a expeditionary.a expeditious.a expendable.a experiential.a experimental.a expert.a expiratory.a explanatory.a explicable.a explicit.a exploitative.a exploratory.a explosive.a exponential.a expressionistic.a expressionless.a expressive.a exquisite.a extant.a extemporaneous.a extemporary.a extempore.a extensive.a exterior.a external.a extinct.a extra.a extrachromosomal.a extracurricular.a extramarital.a extramural.a extraneous.a extraordinary.a extrasensory.a extravagant.a extremal.a extreme.a extrinsic.a extrusive.a exuberant.a exultant.a eyecatching.a fab.a fabled.a fabless.a fabulous.a faceless.a faceted.a facetious.a facial.a facile.a factual.a faint.a faithful.a fallacious.a fallback.a fallible.a fallopian.a fallow.a famed.a familial.a familiar.a famous.a fanatical.a fanciful.a fancy.a fantastic.a fantastical.a far.a faraway.a farcical.a fascist.a fascistic.a fast.a fastidious.a fat.a fatal.a fatalistic.a fateful.a fatherless.a fatherly.a fathomless.a fatty.a fatuous.a faultless.a faulty.a faunal.a favorable.a favourable.a fazed.a fearful.a fearless.a fearsome.a feasible.a featherbrained.a feathery.a featureless.a fecal.a feckless.a fecund.a federal.a feeble.a feldspathic.a felicitous.a feline.a felonious.a female.a feminine.a feral.a ferocious.a ferric.a ferromagnetic.a ferrous.a fertile.a fervent.a festive.a fetal.a fetching.a fetid.a feudal.a fevered.a feverish.a fey.a fianchettoed.a fiberoptic.a fibrinolytic.a fibrous.a fickle.a fictional.a fictitious.a fidgety.a fiduciary.a fiendish.a fierce.a fiery.a figurative.a filamentous.a filial.a filmy.a filtertipped.a filthy.a final.a financial.a fine.a finicky.a finitary.a finite.a finitistic.a finned.a Finnish.a fireproof.a firm.a firstborn.a first-class.a firsthand.a fiscal.a fishy.a fisted.a fit.a fitful.a fitting.a fizzy.a flabby.a flaccid.a flagrant.a flaky.a flamboyant.a flammable.a flashy.a flat.a flat-bottomed.a flattish.a flavored.a flavorful.a flavorless.a flavourless.a flawed.a flawless.a flaxen.a fleet.a fleeting.a fleshy.a flexible.a flightless.a flighty.a flimsy.a flinty.a flip.a flippant.a flirtatious.a floaty.a floorless.a floppy.a floral.a florid.a flowery.a fluent.a fluffy.a fluid.a fluorescent.a flush.a flustered.a foamy.a focal.a foetal.a foggy.a folic.a folkloric.a folksy.a follicular.a foolhardy.a foolproof.a footloose.a foppish.a forbidding.a forceful.a forcible.a fore.a foregoing.a foregone.a foreign.a foremost.a forensic.a foreseeable.a forgetful.a forgivable.a forlorn.a formal.a formative.a formic.a formidable.a formless.a formulaic.a forte.a forthcoming.a forthright.a fortissimo.a fortnightly.a fortuitous.a foul.a foundational.a foursquare.a foxy.a fractal.a fractional.a fractious.a fragile.a fragmentary.a fragrant.a frail.a frank.a frantic.a fraternal.a fratricidal.a fraudulent.a frazzled.a freakish.a freaky.a freeform.a freehand.a french.a French.a frenetic.a frenzied.a frequent.a fresh.a freshwater.a fretful.a fretless.a friable.a fricative.a frictional.a friendly.a frightened.a frightening.a frightful.a frigid.a frilly.a frisky.a frivolous.a frizzy.a frontal.a frontline.a frost-bitten.a frostbitten.a frosty.a frothy.a frugal.a fruitful.a fruitless.a fruity.a frumpish.a frumpy.a fugitive.a full-grown.a full-time.a fulsome.a functional.a fundamental.a funerary.a funereal.a fungal.a funky.a furious.a furry.a furthermost.a furtive.a fusidic.a fusiform.a fussy.a futile.a future.a futuristic.a fuzzy.a gabled.a gaelic.a gaga.a gainful.a galactic.a gallant.a galvanic.a game.a gangland.a gangrenous.a garde.a gargantuan.a garish.a garrulous.a gaseous.a gastric.a gastronomic.a gauche.a gaudy.a gaunt.a gay.a geeky.a gelatinous.a geminal.a gemological.a genealogical.a general.a generative.a generic.a genericized.a generous.a genetic.a genial.a genital.a genitive.a genomic.a genteel.a gentile.a gentle.a gentlemanly.a genuine.a geocentric.a geochronologic.a geodesic.a geodetic.a geographic.a geographical.a geologic.a geological.a geometric.a geometrical.a geophysical.a geopolitical.a geriatric.a germane.a germinal.a gestational.a ghastly.a ghostly.a ghoulish.a giddy.a gifted.a gigantic.a gingerly.a gingival.a girlish.a glacial.a gladiatorial.a glamorous.a glandular.a glassy.a glaucous.a gleeful.a glib.a glitzy.a global.a globular.a gloomy.a glorious.a glossy.a glottal.a glucuronic.a glum.a glutamatergic.a glutamic.a gluteal.a glutinous.a gluttonous.a glycemic.a glyceryl.a glycolytic.a glycosidic.a glyphic.a gnarled.a gnostic.a godfearing.a godforsaken.a godless.a godlike.a godly.a goggle-eyed.a gold.a golden.a good-looking.a goodly.a good-natured.a gooey.a goofy.a gorgeous.a gory.a gothic.a governmental.a graceful.a gracious.a gradual.a graffiti.a grammatical.a grand.a grande.a grandiloquent.a grandiose.a granitic.a granular.a granulomatous.a graphic.a graphical.a grasping.a grassy.a gratifying.a gratuitous.a grave.a gravelly.a gravitational.a gray.a grayish.a greasy.a greedy.a green.a greenfield.a greenish.a gregarious.a grey.a greyish.a grievous.a grim.a grimy.a grisly.a gritty.a groggy.a groovy.a gross.a grotesque.a grotty.a grouchy.a groundless.a grubby.a gruelling.a gruesome.a gruff.a grumpy.a grunge.a guarded.a gubernatorial.a guileless.a guiltless.a gullible.a gummy.a gustatory.a gusty.a gutless.a guttural.a Guyanese.a gymnastic.a gynaecological.a gynecological.a gyroscopic.a habitable.a habitual.a hackneyed.a haggard.a haired.a hairless.a hairy.a halcyon.a hale.a half-hearted.a halftone.a halfway.a halfwitted.a hallucinatory.a hallucinogenic.a handcrafted.a handheld.a handmade.a handsome.a handwritten.a handy.a haphazard.a hapless.a haploid.a harbourside.a hardboiled.a hardbound.a hardcore.a hardhearted.a hardhitting.a hardline.a hardwired.a hardworking.a hardy.a harebrained.a harmful.a harmless.a harmonious.a harsh.a hasty.a hatchback.a hateful.a haughty.a haulage.a haut.a haute.a hazardous.a hazy.a headless.a headlong.a head-on.a headquartered.a headstrong.a heady.a healthcare.a healthful.a heartbreaking.a heartbroken.a hearted.a heartfelt.a heartless.a heartsick.a hearty.a heavenly.a heavensent.a heavy.a hectic.a hedonistic.a heedless.a hefty.a hegemonic.a heinous.a heiroglphic.a helical.a heliocentric.a hellish.a helmeted.a helpless.a hematologic.a hematopoietic.a hemispheric.a hemolytic.a hemorrhagic.a henpecked.a hentai.a hepatic.a heptagonal.a heraldic.a herbaceous.a herbal.a herbivorous.a herculean.a hereditary.a heretical.a heritable.a hermaphroditic.a heroic.a hesperiid.a heterodox.a heterogeneous.a heterophonic.a heterosexual.a heterotopic.a heterozygous.a heuristic.a hexadecimal.a hexagonal.a hexavalent.a hideous.a hierarchical.a hieroglyphic.a high.a highbrow.a highflying.a high-pitched.a high-sounding.a high-spirited.a hilly.a hind.a hindmost.a Hindu.a hipped.a hippocampal.a hippy.a hispanic.a histologic.a histological.a historic.a historical.a historique.a histrionic.a hitless.a hoarse.a hoary.a hobnailed.a holistic.a hollow.a holomorphic.a holonomic.a holy.a homebrew.a homegrown.a homeless.a homely.a homemade.a homeomorphic.a homeopathic.a homered.a homesick.a homespun.a homeward.a homey.a homicidal.a hominid.a homofermentative.a homogeneous.a homogenous.a homolog.a homological.a homologous.a homonymous.a homophobic.a homopolar.a homosexual.a homozygous.a honest.a honey.a honeyed.a honorable.a honorary.a honourable.a hooked.a hopeless.a horizontal.a hormonal.a horned.a hornless.a horny.a horological.a horrendous.a horrible.a horrid.a horrific.a horticultural.a hospitable.a hostile.a hot.a hourly.a housebound.a houseproud.a housetrained.a howling.a huffy.a huge.a hulking.a human.a humane.a humanistic.a humanitarian.a humanoid.a humble.a humdrum.a humeral.a humid.a humorous.a humourless.a humpbacked.a hunchbacked.a hundredth.a hungry.a hurtful.a husky.a hyaenid.a hybrid.a hydration.a hydraulic.a hydrochloric.a hydroelectric.a hydrographic.a hydrolase.a hydrological.a hydrolytic.a hydropathic.a hydrophilic.a hydrophobic.a hydroponic.a hygienic.a hygroscopic.a hyperbaric.a hyperbolic.a hypercritical.a hypersensitive.a hypertensive.a hypnagogic.a hypnotic.a hypochlorous.a hypodermic.a hypoglycemic.a hypolipidemic.a hypothetical.a hysterical.a iambic.a iatrogenic.a icebound.a Icelandish.a iconic.a icy.a ideal.a idealistic.a identical.a identifiable.a ideological.a idiomatic.a idiopathic.a idiosyncratic.a idle.a idolatrous.a idyllic.a igneous.a ignoble.a ignominious.a ignorant.a ill.a illegible.a illegitimate.a ill-fated.a illicit.a illiterate.a ill-starred.a illusionary.a illusive.a illusory.a illustrative.a illustrious.a imaginable.a imaginary.a imaginative.a imitative.a immaculate.a immanent.a immature.a immeasurable.a immediate.a immemorial.a immense.a immersive.a imminent.a immobile.a immodest.a immortal.a immovable.a immune.a immunologic.a immunological.a immunosuppressive.a immutable.a impalpable.a impartial.a impassable.a impassioned.a impassive.a impeccable.a impenetrable.a imperceptible.a imperfect.a imperial.a imperialistic.a imperious.a impermeable.a impersonal.a impertinent.a imperturbable.a impervious.a impetuous.a impious.a impish.a implacable.a implausible.a implicit.a impolitic.a imponderable.a imposing.a impotent.a impracticable.a impractical.a imprecise.a impregnable.a impressionable.a impressionistic.a impromptu.a improper.a improvident.a improvisational.a imprudent.a impudent.a impulsive.a impure.a inaccessible.a inaccurate.a inactive.a inadequate.a inadmissible.a inadvertent.a inalienable.a inane.a inanimate.a inapplicable.a inarticulate.a inattentive.a inaudible.a inaugural.a inauspicious.a inboard.a inborn.a inbound.a inbred.a inbuilt.a incalculable.a incandescent.a incarnate.a incendiary.a incessant.a incestuous.a inchoate.a incidental.a incipient.a incisive.a inclement.a inclusive.a incognito.a incoherent.a incombustible.a incoming.a incommensurate.a incommunicado.a incomparable.a incompatible.a incompetent.a incomplete.a incomprehensible.a inconclusive.a incongruous.a inconsequential.a inconsiderate.a inconsistent.a inconsolable.a inconspicuous.a incontestable.a incontinent.a incontrovertible.a incorporate.a incorrigible.a incorruptible.a incredulous.a incremental.a incumbent.a incurable.a indebted.a indecent.a indecipherable.a indecisive.a indecorous.a indefatigable.a indefensible.a indefinable.a indefinite.a indegenous.a indelible.a indeniable.a independant.a independent.a independentist.a indescribable.a indestructible.a indeterminate.a indicative.a indictable.a indie.a indifferent.a indigenous.a indigent.a indigestible.a indignant.a indirect.a indiscernible.a indiscreet.a indiscriminate.a indispensable.a indisposed.a indisputable.a indistinct.a indistinguishable.a individual.a individualistic.a indivisible.a indolent.a indomitable.a indoor.a indubitable.a inductive.a indulgent.a industrial.a industrious.a industrywide.a indwelling.a inedible.a ineffable.a ineffective.a ineffectual.a inefficient.a inelastic.a inelegant.a ineligible.a ineluctable.a inept.a inequitable.a ineradicable.a inert.a inertial.a inescapable.a inessential.a inestimable.a inexact.a inexhaustible.a inexorable.a inexpensive.a inexperienced.a inexplicable.a inexpressible.a inextricable.a infallible.a infamous.a infantile.a infectious.a inferential.a inferior.a infernal.a infertile.a infinite.a infinitesimal.a infinitive.a infirm.a inflammable.a inflammatory.a inflatable.a inflational.a inflationary.a inflexible.a influential.a informal.a informational.a informative.a infrared.a infrequent.a in_gel in-gel ingenious.a ingenuous.a inglorious.a ingoing.a ingrained.a ingrowing.a inguinal.a inhabitable.a inherent.a inhibitory.a inhomogeneous.a inhospitable.a inhuman.a inhumane.a inimical.a inimitable.a initial.a initiate.a initiativeless.a injective.a injudicious.a injured.a injurious.a inky.a inland.a inline.a innagural.a innate.a inner.a innermost.a innocuous.a innovative.a innumerable.a inoffensive.a inoperable.a inoperative.a inopportune.a inordinate.a inorganic.a inotropic.a inquisitive.a inquisitorial.a insanitary.a insatiable.a inscrutable.a insecticidal.a insectivorous.a insectoid.a insecure.a insensible.a insensitive.a inseparable.a inshore.a insidious.a insightful.a insincere.a insipid.a insistent.a insolent.a insoluble.a insolvent.a inspirational.a inspiratory.a inspired.a instant.a instantaneous.a instinctive.a instinctual.a institutional.a instructional.a instructive.a instrumental.a insubordinate.a insubstantial.a insufferable.a insular.a insulting.a insuperable.a insupportable.a insurgent.a insurmountable.a intact.a intangible.a integral.a intellectual.a intelligible.a intemperate.a intense.a intensive.a intent.a intentional.a interactive.a interbank.a intercalary.a interchangeable.a intercity.a intercollegiate.a intercontinental.a intercostal.a intercountry.a intercrater.a interdenominational.a interdepartmental.a interdependent.a interdisciplinary.a interested.a interfaith.a intergalactic.a interior.a interleague.a interlibrary.a intermediate.a intermembrane.a interminable.a intermittent.a internal.a international.a internecine.a interoperable.a interpersonal.a interplanetary.a interpretative.a interpretive.a interracial.a interrogative.a interrogatory.a intersex.a interspinous.a interstate.a interstellar.a interstitial.a intertribal.a interventional.a interventionist.a intervertebral.a intestate.a intestinal.a intimate.a intimidating.a intolerable.a intolerant.a intractable.a intrafamilial.a intrahepatic.a intramural.a intransigent.a intransitive.a intrastate.a intrauterine.a intravenous.a intrepid.a intricate.a intrinsic.a introductory.a introspective.a intrusive.a intuitionistic.a intuitive.a invalid.a invaluable.a invariable.a invasive.a inventive.a inverse.a invertible.a investigational.a investigative.a inveterate.a invidious.a invincible.a inviolable.a inviolate.a invisible.a invitational.a inviting.a involuntary.a invulnerable.a ionic.a ionospheric.a irascible.a irate.a iridescent.a Irish.a irksome.a ironclad.a ironic.a ironical.a irreconcilable.a irredeemable.a irreducible.a irrefutable.a irregular.a irremediable.a irreparable.a irreplaceable.a irrepressible.a irresistible.a irresolute.a irrespective.a irretrievable.a irreverent.a irreversible.a irrevocable.a irritable.a ischemic.a Islamic.a isodicentric.a isolated.a isomeric.a isomorphic.a isosceles.a isotopic.a isotropic.a italic.a itchy.a itinerant.a jaded.a jagged.a janitorial.a Japanese.a jaunty.a jazzy.a jellied.a jerky.a jesting.a jeweled.a jewelled.a Jewish.a jingoistic.a jittery.a jobless.a jocose.a jocular.a jocund.a joint.a jolly.a journalistic.a jovial.a joyful.a joyous.a jubilant.a judicial.a judicious.a jugend.a jugular.a juicy.a jumbo.a jumpy.a junctional.a junior.a juridical.a juried.a jurisdictional.a justiciable.a justifiable.a juvenile.a kabbalistic.a kaleidoscopic.a kamikaze.a kaput.a karmic.a karstic.a keratinous.a keyless.a khaki.a kibbutz.a kind.a kindly.a kindred.a kinematic.a kinematical.a kinetic.a kinky.a kitsch.a knobbly.a knockdown.a knotty.a knowledgeable.a kosher.a labial.a laborious.a labyrinthine.a lachrymose.a lackadaisical.a lackluster.a lacklustre.a laconic.a lactic.a lacustrine.a lacy.a laden.a ladylike.a lakefront.a lakeside.a lame.a laminal.a laminar.a lamplit.a lanceolate.a landless.a landlocked.a languid.a languorous.a lanky.a laparoscopic.a large.a largemouth.a larval.a laryngeal.a lascivious.a lasting.a lat.a late.a lateen.a latent.a lateral.a laterite.a latissimus.a latitudinal.a laudable.a laudatory.a laughable.a laureate.a lavish.a lawful.a lawless.a lax.a lay.a lazy.a le.a leaded.a leaden.a leadoff.a leafy.a leaky.a lean.a learned.a leathery.a Lebanese.a lecherous.a leeward.a left.a left-handed.a lefthanded.a leftover.a legalistic.a legendary.a legible.a legislative.a legitimate.a leisurely.a lengthy.a lenient.a lenticular.a lentinan.a lento.a lepidopteran.a leprous.a les.a lesser.a lethal.a lethargic.a leucovorin.a leukemic.a level.a levorotatory.a lewd.a lexical.a liable.a libellous.a liberal.a libertarian.a libidinous.a libro.a licentious.a lifeless.a lifelike.a lifelong.a light.a light-headed.a lighthearted.a lightless.a lightweight.a likable.a likeable.a likeminded.a limber.a limbic.a limited.a limitless.a limp.a limpid.a lineal.a linear.a lineated.a lingual.a linguistic.a lipophilic.a lissom.a listless.a literal.a literary.a literate.a lithe.a lithographic.a litigious.a little.a liturgical.a livable.a live.a liveable.a lively.a livery.a livid.a loaded.a loath.a loathsome.a lobed.a local.a locomotive.a lofty.a logarithmic.a loggerhead.a logistic.a logistical.a lone.a lonely.a lonesome.a longing.a longitudinal.a long-lived.a longstanding.a longtime.a lookup.a loony.a loopy.a loose.a lopsided.a loquacious.a lordly.a lossless.a lossy.a loud.a lousy.a loutish.a louvered.a lovable.a loveless.a lovelorn.a lovesick.a low.a lowborn.a lowbred.a lowbrow.a lowercase.a lowland.a lowly.a low-pitched.a loyal.a lucid.a luckless.a lucrative.a ludicrous.a lugubrious.a lukewarm.a lumbar.a lumbosacral.a luminescent.a luminous.a lumpy.a lunar.a lurid.a luscious.a lush.a lustful.a lustrous.a lusty.a luxuriant.a luxurious.a lymphatic.a lymphocytic.a lymphoid.a lyric.a lyrical.a lysosomal.a macabre.a machiavellian.a macho.a macrobiotic.a macroscopic.a macular.a mafic.a magenta.a magetic.a maggoty.a magic.a magical.a magisterial.a maglev.a magmatic.a magna.a magnanimous.a magnesian.a magnetic.a magnificent.a maiden.a majestic.a major.a maladjusted.a maladroit.a malarial.a malcontent.a male.a malevolent.a malformed.a malicious.a malignant.a malleable.a malnourished.a malodorous.a malonate.a malonic.a Maltese.a maltose.a mammalian.a mammary.a manageable.a managerial.a mandibular.a mangy.a maniacal.a manic.a manifest.a manifold.a manipulative.a maniraptoran.a manly.a manmade.a mannered.a mannose.a manoeuvrable.a manual.a manufactory.a many-sided.a marbled.a marginal.a marginalized.a marine.a marital.a maritime.a marketable.a maroon.a marriageable.a marshy.a martial.a marvellous.a marvelous.a masculine.a masochistic.a masonic.a massive.a masted.a masterful.a masterly.a masturbatory.a matchless.a materialistic.a maternal.a matey.a mathematical.a matriarchal.a matrilineal.a matrimonial.a matronly.a matt.a mature.a maudlin.a mauve.a mawkish.a max.a maxillary.a maxillofacial.a maximal.a maximum.a mayoral.a meager.a meagre.a mealy.a mean.a meaningful.a measly.a measurable.a measured.a meatless.a meaty.a mechanical.a mechanistic.a meddlesome.a mediaeval.a mediæval.a medial.a median.a medical.a medicinal.a medieaval.a medieval.a mediocre.a meditative.a medium.a medullary.a meek.a megalithic.a meiotic.a melancholic.a melancholy.a melanistic.a mellifluous.a mellow.a melodic.a melodious.a melodramatic.a memorable.a mendacious.a menial.a meningococcal.a menstrual.a mental.a mentholated.a mercantile.a mercenary.a merciful.a merciless.a mercurial.a mercurian.a mere.a meretricious.a meritorious.a meromorphic.a merry.a mesenchymal.a mesic.a meso.a mesolimbic.a messianic.a messy.a meta.a metabolic.a metacarpal.a metacognitive.a metallic.a metallurgical.a metamorphic.a metaphoric.a metaphorical.a metaphysical.a meteoric.a meteorogical.a meteorological.a methodical.a methodological.a methylated.a meticulous.a metric.a metrical.a metropolitan.a micro.a microbial.a microchimeric.a microfluidic.a microscopic.a mid.a middlemost.a middleweight.a middling.a midfield.a midseason.a midsize.a midterm.a miffed.a mighty.a migratory.a mild.a militant.a militaristic.a military.a milky.a millennial.a millinery.a millionth.a mimetic.a min.a mindless.a mineralogical.a mini.a minimal.a minimalist.a minimum.a ministerial.a minor.a minuscule.a minute.a mirthless.a misanthropic.a misbegotten.a miscellaneous.a mischievous.a miserable.a miserly.a misguided.a misleading.a misogynistic.a misshapen.a missional.a mistrustful.a misty.a mit.a mitochondrial.a mitotic.a mnemonic.a moated.a mobile.a mock.a mod.a modal.a moderate.a moderationist.a modern.a modernistic.a modest.a modular.a modulatory.a modulo.a moist.a moldy.a molecular.a molten.a momentary.a momentous.a monarchic.a monarchical.a monastic.a monaural.a monetary.a moneyed.a monkish.a mono.a monoblock.a monochrome.a monoclinic.a monoclonal.a monocoque.a monocotyledonous.a monoecious.a monogamous.a monoidal.a monolingual.a monolithic.a monomeric.a monophyletic.a monopolistic.a monosyllabic.a monotheistic.a monotonous.a monotypic.a monstrous.a montaged.a monthly.a monumental.a moody.a moonless.a moonlit.a moonstruck.a moot.a mooted.a moral.a moralistic.a morbid.a moribund.a moronic.a morose.a morphemic.a morphogenetic.a morphological.a mortal.a mosaic.a mossy.a motherly.a mothproof.a motionless.a motivated.a motivational.a motivic.a motley.a motorized.a mouldy.a mountainous.a mournful.a mousy.a movable.a moving.a mucho.a mucosal.a mucous.a muddy.a muggy.a mullioned.a multi.a multicast.a multicolor.a multi-colored.a multicolored.a multicolour.a multi-coloured.a multicoloured.a multiethnic.a multi-faceted.a multifaceted.a multifarious.a multilateral.a multi-layered.a multilayered.a multilingual.a multimedia.a multimode.a multinational.a multiphase.a multiplayer.a multiple.a multiplex.a multiplexed.a multiplicative.a multipoint.a multiprotocol.a multipurpose.a multisport.a multi-themed.a multithemed.a multi-threaded.a multithreaded.a multi-tiered.a multitiered.a multitrack.a multitudinous.a multiwell.a mundane.a muni.a municipal.a munificent.a murderous.a murky.a muscarinic.a muscular.a mushy.a musical.a musicological.a musky.a Muslim.a musty.a mutagenic.a mutant.a mute.a mutinous.a mutual.a muy.a muzzy.a mycorrhizal.a myelogenous.a myeloid.a myocardial.a myopic.a mystic.a mystical.a mythic.a mythical.a mythological.a nagging.a naive.a naïve.a naked.a nameless.a narcotic.a narrow.a narrow-waisted.a nasal.a nascent.a natal.a national.a nationalist.a nationalistic.a nationwide.a native.a natty.a naturalistic.a naturopathic.a naughty.a nauseous.a nautical.a naval.a navicular.a navigable.a navigational.a near.a nearshore.a neat.a nebular.a nebulous.a necrotic.a née.a needless.a needy.a nefarious.a negative.a negligent.a negligible.a negotiable.a neighboring.a neighbourly.a neocritical.a neogenic.a neolithic.a nerdy.a nervous.a nervy.a net.a nether.a nethermost.a neural.a neurodegenerative.a neurofibrillary.a neurogenic.a neuroleptic.a neurologic.a neurological.a neuronal.a neurotic.a neuter.a neutral.a new.a newfangled.a newfound.a newsworthy.a nicht.a nifty.a niggardly.a niggling.a nightlong.a nightly.a nightmarish.a nighttime.a nihilistic.a nimble.a nippy.a niso.a nitric.a nitro.a nitrogenous.a nitrous.a noble.a nocturnal.a nodal.a noir.a noisy.a nom.a nomadic.a nomen.a nominal.a nominative.a nonagenarian.a nonchalant.a noncommissioned.a noncommittal.a nondescript.a nondeterministic.a nondiscretionary.a nonfat.a nonflammable.a nonhomologous.a nonlinear.a nonprofit.a nonrecurring.a nonreligious.a nonresident.a nonsensical.a nonstick.a nonstop.a nontarget.a nontraditional.a nontrinitarian.a nontrivial.a nonunion.a nonvoting.a nonzero.a nordic.a normative.a normed.a northbound.a northeasterly.a northeastwardly.a northerly.a northwardly.a northwesterly.a northwestwardly.a nos.a nosey.a nostalgic.a nostre.a nosy.a noteworthy.a noticeable.a notifiable.a notional.a notorious.a nouveau.a nova.a novel.a noxious.a nuanced.a nubile.a nuchal.a nuclear.a nucleic.a nucleophilic.a nude.a null.a numb.a numberless.a numerate.a numeric.a numerical.a numerous.a numismatic.a nuptial.a nutrient.a nutritional.a nutritious.a nutritive.a nutty.a oafish.a obdurate.a obedient.a obese.a objectionable.a objective.a obligatory.a oblique.a oblivious.a oblong.a obscene.a obscure.a obsequious.a observable.a observant.a observational.a obsessed.a obsessive.a obsolescent.a obsolete.a obstetric.a obstinate.a obstreperous.a obstructive.a obtainable.a obtrusive.a obtuse.a occasional.a occipital.a occlusal.a occupational.a oceanic.a octagonal.a octahedral.a octogenarian.a ocular.a odious.a odorless.a odourless.a offal.a offbeat.a offensive.a offhand.a officio.a officious.a offline.a offshore.a offside.a offsite.a offstage.a oiled.a oily.a olden.a old-fashioned.a oldschool.a old-time.a olfactory.a olive.a olivine.a olympic.a ominous.a omnipotent.a omnipresent.a omniscient.a omnivorous.a onboard.a oncoming.a onerous.a one-sided.a ongoing.a onomatopoeic.a onscreen.a onshore.a onsite.a onstage.a ontological.a oolong.a opalescent.a opaque.a open.a open-mouthed.a operable.a operatic.a operational.a operative.a ophthalmic.a opinionated.a opioid.a opisthobranch.a opportune.a opportunistic.a opposite.a oppressive.a optic.a optical.a optimal.a optional.a opulent.a oracular.a oral.a orange.a oratorical.a orbital.a orbium.a orchestral.a orderly.a ordinal.a ordinary.a organic.a organizational.a organized.a organometallic.a orgiastic.a orient.a oriental.a ornamental.a ornate.a ornery.a ornithischian.a ornithological.a orogenic.a ortho.a orthodontic.a orthodox.a orthogonal.a orthographic.a orthologous.a orthopaedic.a orthopedic.a orthorhombic.a osmotic.a osseous.a ostensible.a ostentatious.a osteopathic.a otherworldly.a out.a outback.a outbound.a outcast.a outcropped.a outdated.a outdoor.a outer.a outermost.a outgoing.a outlandish.a outlying.a outmoded.a out-of-the-way.a outsize.a outsourced.a outspoken.a outspread.a outstretched.a oval.a ovarian.a ovate.a overbearing.a overblown.a overbroad.a overcast.a overcautious.a overcollected.a overconfident.a overdriven.a overdue.a overexcited.a overextended.a overfull.a overgrown.a overhand.a overhead.a overladen.a overland.a overnight.a overpopulated.a overpowering.a overpriced.a overriding.a overripe.a overseas.a oversensitive.a oversexed.a oversize.a oversized.a oversubscribed.a overt.a overused.a overvalued.a overweight.a overworked.a overwrought.a oviparous.a ovuliferous.a owlish.a oxidative.a pacific.a pacifistic.a paediatric.a pagan.a painless.a painstaking.a pairwise.a palaeolithic.a palatable.a palatal.a palatial.a pale.a paleohispanic.a paleolithic.a paleontological.a pallid.a palpable.a palpebral.a paltry.a palynological.a pancreatic.a pandemic.a paneled.a panicky.a panoramic.a pantheistic.a papal.a paperbacked.a paperless.a para.a parabolic.a paracrine.a parallel.a paralytic.a paramilitary.a paramount.a paranoid.a paranormal.a paraphyletic.a paraplegic.a parasitic.a paratransit.a pardonable.a parental.a parenteral.a parenthetical.a parian.a parietal.a parkland.a parliamentary.a parlous.a parochial.a parodic.a parotoid.a parsimonious.a parte.a partial.a participative.a participatory.a participial.a particular.a partisan.a part-time.a paschal.a passable.a passe.a passerine.a passionate.a passive.a pastoral.a pastorate.a pasty.a patchy.a patent.a paternal.a paternalistic.a pathogenic.a pathologic.a pathological.a patient.a patriarchal.a patrician.a patrilineal.a patrimonial.a patriotic.a patristic.a patronizing.a paunchy.a payable.a peaceable.a peaceful.a pearlescent.a pearly.a peaty.a pebbly.a peckish.a pectoral.a peculiar.a pecuniary.a pedagogic.a pedagogical.a pedantic.a pedestrain.a pedestrian.a pediatric.a peerless.a peeved.a peevish.a pejorative.a pelagic.a pelvic.a penal.a pending.a pendulous.a penetrable.a peninsular.a penitent.a penitential.a penniless.a pensive.a pentagonal.a pentatonic.a penultimate.a peppery.a perceivable.a perceptible.a perceptive.a perceptual.a percussive.a peremptory.a perennial.a perfect.a perfectible.a perfidious.a perfunctory.a perilous.a perineal.a periodic.a periodical.a periodontal.a peripatetic.a peripheral.a periplasmic.a perishable.a peristaltic.a peritoneal.a perky.a permanent.a permeable.a permissible.a permissive.a pernicious.a pernickety.a perpendicular.a perpetual.a perplexed.a persistent.a personable.a personal.a perspicacious.a perspicuous.a persuasive.a pert.a pertinent.a pervasive.a perverse.a pesky.a petit.a petite.a petitionary.a petty.a petulant.a phallic.a pharmaceutical.a pharmacologic.a pharmacological.a phenolic.a phenomenal.a phenomenological.a phenotypic.a philanthropic.a philatelic.a philharmonic.a philhellenic.a philological.a philosophic.a philosophical.a phlegmatic.a phonemic.a phonetic.a phoney.a phonological.a phony.a phosphorescent.a phosphoric.a photoelectric.a photogenic.a photographic.a photonic.a phrasal.a phylogenetic.a physical.a physiological.a pianissimo.a pianistic.a piano.a picaresque.a picky.a picolinate.a pictorial.a picturesque.a piebald.a piecemeal.a pied.a piercing.a piezoelectric.a pigmented.a pillared.a pilonidal.a pimply.a pineal.a pink.a pinkish.a pious.a piping.a piquant.a pissed.a piteous.a pithy.a pitiable.a pitiful.a pitiless.a pituh.a pituitary.a pivotal.a pixelated.a pizzicato.a placeless.a placental.a placid.a plainchant.a plain-spoken.a plaintext.a plaintive.a planar.a planetary.a planktonic.a plantar.a plastic.a plastinate.a platitudinous.a platonic.a playable.a playful.a pleasing.a pleasurable.a plebeian.a plenary.a plentiful.a pliable.a pliant.a plucky.a plump.a plural.a pluralistic.a plus.a plush.a plutocratic.a plutonic.a pneumatic.a pockmarked.a poetic.a poignant.a pointwise.a pointy.a poison.a poisonous.a pokey.a poky.a polar.a polemical.a Polish.a polished.a politic.a political.a polyatomic.a polygamous.a polygonal.a polyhedral.a polymeric.a polymorphic.a polynomial.a polyphonic.a polysyllabic.a polytene.a polytheistic.a polyunsaturate.a polyunsaturated.a polyvinyl.a pompous.a ponderosa.a ponderous.a pontifical.a poofy.a poolside.a poor.a pop.a popish.a popular.a populous.a porcine.a pornographic.a porous.a porphyritic.a portable.a portentous.a portly.a Portugese.a posh.a positional.a positive.a possessive.a postal.a postcoital.a postdoctoral.a posterior.a postgraduate.a posthumous.a postmodern.a postmodernist.a postpartum.a postseason.a posttraumatic.a postural.a postwar.a potable.a potbellied.a potent.a potential.a potted.a potty.a poverty-stricken.a powdery.a powerful.a powerless.a practicable.a practised.a praecox.a praetorian.a pragmatic.a praiseworthy.a prayerful.a precarious.a precautionary.a précédé.a precious.a precipitate.a precipitous.a precise.a precocious.a preconditioned.a predatory.a predicative.a predictable.a predictive.a predominant.a prefatory.a prefectural.a preferential.a preformed.a pregnant.a prehensile.a prehistoric.a prejudicial.a preliminary.a premarital.a premarket.a premier.a premolar.a premotor.a prenatal.a prepacked.a preparatory.a preponderant.a prepositional.a prepossessing.a preposterous.a preproduction.a preschool.a prescient.a prescriptive.a preseason.a preselection.a present.a presentable.a presentational.a presidential.a pressing.a prestigious.a prestigous.a prestissimo.a presto.a prestressed.a presumptive.a presumptuous.a pretax.a preteen.a pretentious.a pretty.a prevalent.a preventable.a preventive.a prewar.a priceless.a pricey.a prickly.a prideful.a priggish.a prim.a primaeval.a primal.a primary.a prime.a primeval.a primitive.a primordial.a princely.a principal.a principled.a printable.a prior.a prismatic.a pristine.a private.a privileged.a privy.a probabilistic.a probationary.a probit.a problematic.a procedural.a processional.a prodigal.a prodigious.a productive.a profane.a professional.a professorial.a proficient.a profitable.a profligate.a profound.a profuse.a prognathic.a programmable.a programmatic.a progressive.a prohibitive.a projective.a prokaryotic.a proleptic.a proletarian.a prolific.a proline.a prolix.a prominent.a promiscuous.a promising.a promissory.a promotional.a prompt.a prone.a pronounceable.a proper.a propertied.a prophetic.a prophylactic.a propitious.a proportional.a proportionate.a proprietary.a proprioceptive.a propulsive.a prosaic.a prosodic.a prospective.a prosperous.a prosthetic.a prostrate.a prosy.a protean.a protective.a proteolytic.a Protestant.a prototypical.a protozoal.a protracted.a provable.a proverbial.a provident.a providential.a provincial.a provisional.a provocative.a proximal.a proximate.a prudish.a prurient.a pseudo.a pseudonymous.a psoriatic.a psychedelic.a psychiatric.a psychic.a psychical.a psychoactive.a psychoanalytic.a psychoanalytical.a psychogenic.a psychological.a psychopathic.a psychosomatic.a psychotropic.a pubic.a public.a public-spirited.a puckish.a pudgy.a puerile.a puffy.a pugilistic.a pugnacious.a puissant.a pulmonary.a pulmonate.a pulmonic.a punchy.a punctual.a pungent.a punishable.a punitive.a puny.a pure.a purebred.a puritan.a puritanical.a purple.a purplish.a purposeful.a purposeless.a purposive.a pursuant.a purulent.a pusillanimous.a putative.a putrid.a pyramidal.a pyrotechnic.a qabalistic.a quadratic.a quadriplegic.a quadrophonic.a quadrupedal.a quaint.a qualified.a qualitative.a quantitative.a quantum.a quarrelsome.a quarterly.a quartic.a quaternary.a queasy.a Québécois.a queer.a querulous.a quick.a quiescent.a quiet.a quintessential.a quirky.a quixotic.a quizzical.a quotable.a quotidian.a rabbinic.a Rabbinic.a rabbinical.a rabid.a racemic.a racial.a racist.a rackmount.a racy.a radial.a radiant.a radiative.a radical.a radicalized.a radioactive.a radiocarpal.a radiological.a raffish.a ragged.a rainy.a rakish.a rambling.a rambunctious.a rampant.a ramshackle.a rancid.a rancorous.a random.a randy.a rank.a ranking.a rapacious.a rapid.a rapt.a rapturous.a raring.a rash.a raspy.a raster.a ratable.a rateable.a rational.a rationalistic.a raucous.a raunchy.a ravenous.a raving.a raw.a rawhide.a razorbacked.a readable.a ready-made.a real.a realistic.a realtime.a rearmost.a rearward.a rebadged.a rebellious.a reborn.a recalcitrant.a receivable.a recent.a receptive.a recessive.a rechargeable.a recherche.a reciprocal.a recitativo.a reckless.a reclusive.a recognizable.a reconcilable.a recondite.a recoverable.a recreational.a rectagular.a rectal.a rectangular.a rectilinear.a recumbent.a recurrent.a recusant.a red.a reddish.a redeemable.a redemptive.a red-haired.a redhaired.a redolent.a redoubtable.a redshirted.a reducible.a redundant.a reedy.a referential.a reflective.a reflex.a reflexed.a reflexive.a reformationist.a reformatory.a reformist.a refractive.a refractory.a refreshing.a refutable.a regal.a regenerative.a regimental.a regional.a regnal.a regressive.a regristral.a regular.a regulatory.a reinvigorated.a relational.a relative.a relativistic.a relaxant.a relaxed.a relentless.a reliable.a reliant.a religious.a remastered.a rematched.a remedial.a remiss.a remorseful.a remorseless.a remote.a removable.a remunerative.a renal.a renascent.a renewable.a renowned.a rentable.a reparable.a reparative.a repayable.a repellent.a repentant.a repetitious.a repetitive.a replaceable.a replete.a replicant.a reprehensible.a representational.a representative.a repressed.a repressive.a reproachful.a reproducible.a reproductive.a reptilian.a republican.a repugnant.a repulsive.a reputable.a requisite.a resentful.a reserved.a resident.a residential.a residual.a residuary.a resigned.a resilient.a resinous.a resistant.a resistive.a resolute.a resolvable.a resolved.a resonant.a resourceful.a respectable.a respectful.a respective.a respiratory.a resplendent.a responsive.a restful.a restive.a restless.a restorative.a restrained.a restrictive.a resultant.a resurgent.a retaliatory.a retardant.a retentive.a reticent.a reticulate.a reticulum.a retinal.a retractable.a retro.a retroactive.a retrograde.a retrogressive.a retrospective.a returnable.a reusable.a reverend.a reverent.a reverential.a reversible.a revolting.a revolutionary.a rheological.a rhetorical.a rheumatic.a rheumatoid.a rhizomatous.a rhombic.a rhombohedral.a rhythmic.a rhythmical.a ribald.a ribosomal.a rich.a rickety.a riderless.a righteous.a rightful.a right-handed.a righthanded.a rigid.a rigorous.a ringworm.a riotous.a riparian.a ripe.a ripened.a risible.a risque.a risqué.a ritual.a ritualistic.a ritzy.a riverfront.a riverine.a roadless.a roan.a roast.a robotic.a robust.a rocky.a rococo.a roguish.a rollicking.a Roman.a romanesque.a Romanesque.a romanized.a romantic.a roofless.a roomy.a rootless.a rootsy.a rostral.a rosy.a rotary.a rotational.a rotten.a rotund.a rough.a round.a routine.a rowdy.a royal.a rubbery.a ruby.a ruddy.a rude.a rudimentary.a rugged.a ruinous.a rummy.a rumored.a runaway.a rundown.a runny.a runtime.a rural.a Russian.a rustic.a rusty.a ruthless.a sabbatarian.a sable.a saccharine.a sacral.a sacred.a sacrificial.a sacrilegious.a sacroiliac.a sacrosanct.a sadistic.a sagacious.a sage.a sagittal.a saintly.a salacious.a salaried.a salicylic.a salient.a saline.a salivary.a sallow.a saltmarsh.a salty.a salubrious.a salutary.a sanctimonious.a sandy.a sanguine.a sanitary.a sapient.a sappy.a saracenic.a sarcastic.a sardonic.a sartorial.a sassy.a satanic.a satin.a satiric.a satirical.a satisfactory.a satisfied.a satisfying.a saucy.a savage.a savoury.a savvy.a scalar.a scaly.a scandalous.a scant.a scanty.a scapular.a scarce.a scarlet.a scathing.a scatterbrained.a scenic.a scentless.a sceptical.a sceptred.a schematic.a schismatic.a schizoid.a schizophrenic.a schmaltzy.a scholarly.a scholastic.a schoolyear.a sciatic.a scientific.a sciurognathous.a scoreless.a Scottish.a scrappy.a scratchy.a scrawny.a screwball.a screwy.a scribal.a scriptural.a scrubby.a scruffy.a scrumptious.a scrupulous.a sculptural.a scummy.a scurrilous.a seaborne.a seafaring.a seagoing.a seamless.a seamy.a sear.a searchable.a seasick.a seasonable.a seasonal.a seater.a seaward.a seaworthy.a secant.a secluded.a secondary.a secondhand.a second-rate.a secret.a secretarial.a secretive.a secretory.a sectarian.a sectional.a secular.a sedate.a sedentary.a sedimentary.a seditious.a seductive.a seedless.a seedy.a seemly.a seigneurial.a seismic.a select.a selective.a self-conscious.a self-contained.a self-imposed.a selfless.a self-sufficient.a semantic.a semi.a semicircular.a semiconducting.a semiconscious.a semidetached.a seminal.a semiotic.a senatorial.a Senegalese.a senile.a senior.a sensational.a sensitive.a sensory.a sensual.a sensuous.a sentient.a sentimental.a separable.a separate.a septic.a sepulchral.a sequential.a serendipitous.a serene.a serial.a serious.a serological.a serotonergic.a serpentine.a serrated.a serviceable.a servile.a sesquipedalian.a severe.a sexagenarian.a sexagesimal.a sexist.a sexual.a sexy.a shabby.a shadowy.a shady.a shaggy.a shaky.a shallow.a shamanistic.a shamefaced.a shameless.a shapeless.a shapely.a sharp.a sharp-witted.a shatterproof.a sheepish.a sheer.a shiftless.a shifty.a shiny.a shipboard.a shipshape.a shoddy.a shogunal.a shopworn.a shorthaired.a shorthanded.a short-lived.a shortlived.a showy.a shrewd.a shrewish.a shrill.a shrubby.a shy.a sickening.a sickly.a sidelong.a sightless.a sigmoid.a silent.a silicic.a silken.a silky.a silver.a silvery.a similar.a simple-minded.a simplistic.a simultaneous.a sincere.a sinewy.a sinful.a singable.a single.a singlet.a singular.a sinister.a sinless.a sinuous.a sinusoidal.a situational.a sizable.a sizeable.a ska.a skeletal.a sketchy.a skilful.a skilled.a skillful.a skimpy.a skinny.a skittish.a sky-high.a slack.a slanderous.a slapdash.a slavic.a Slavic.a slavish.a sleazy.a sleek.a sleepless.a sleepy.a sleeveless.a slender.a slick.a slight.a slim.a slimy.a slippery.a slipshod.a slithery.a sloppy.a slothful.a slovenly.a slow.a sluggish.a slushy.a sluttish.a sly.a small.a smalltime.a smarmy.a smelly.a smokeless.a smoky.a smooth.a smug.a smutty.a snappy.a snarky.a snazzy.a sneaking.a sneaky.a snide.a snobbish.a snobby.a snooty.a snotty.a snowbound.a snowcapped.a snowy.a soapy.a sober.a so-called.a sociable.a social.a socialist.a socialistic.a societal.a socioeconomic.a sociological.a sociopathic.a sodden.a soft.a softcore.a soggy.a solar.a solemn.a solicitous.a solid.a solitary.a soluble.a solvable.a solvent.a somatic.a somber.a sombre.a somnolent.a sonic.a sonorant.a sonorous.a sooth.a sooty.a sophisticated.a soporific.a sopping.a soppy.a sorcerous.a sordid.a sore.a sorrel.a sorrowful.a soulful.a soulless.a sound.a soundproof.a sour.a sous.a soused.a southbound.a southeasterly.a southeastwardly.a southerly.a southside.a southwardly.a southwesterly.a southwestwardly.a sovereign.a spacial.a spacious.a spanish.a Spanish.a spare.a sparse.a spasmodic.a spastic.a spatial.a specfic.a special.a specifiable.a specific.a specious.a speckled.a spectacled.a spectacular.a spectral.a spectroscopic.a specular.a speculative.a speechless.a speedy.a spellbound.a spherical.a spicy.a spiky.a spinal.a spindly.a spineless.a spinocerebellar.a spinous.a spiny.a spiral.a spirited.a spiritual.a spiteful.a splendid.a splintered.a spongy.a spontaneous.a spooky.a sporadic.a sporting.a sportsmanlike.a spotless.a spotted.a spotty.a spousal.a sprawling.a sprightly.a springlike.a springy.a spruce.a spry.a spunky.a spurious.a squalid.a squamous.a square.a squashy.a squat.a squeaky.a squeamish.a squiggly.a stable.a staccato.a stagnant.a stagy.a staid.a stainless.a stale.a stalinist.a stalwart.a standalone.a standardbred.a standoffish.a starchy.a stark.a starless.a starlit.a starry.a stateless.a stately.a statesmanlike.a statewide.a static.a stationary.a statist.a statistical.a statuary.a statuesque.a statutory.a staunch.a steadfast.a steady.a stealthy.a steamy.a steely.a steep.a stellar.a stellate.a stentorian.a stepwise.a stereogenic.a stereophonic.a stereoscopic.a stereotypical.a steric.a sterile.a sterling.a stern.a steroidal.a sticky.a stiff.a still.a stillborn.a stilted.a stimulating.a stingy.a stipendiary.a stochastic.a stockinged.a stocky.a stodgy.a stolid.a stony.a storied.a stormproof.a stormy.a stout.a stouthearted.a straight.a straightforward.a strained.a strait.a strapping.a strategic.a strategical.a strenuous.a streptococcal.a stressful.a stretchered.a strident.a stringent.a stringy.a striped.a stroboscopic.a strong.a structural.a stubbly.a stubborn.a stubby.a stuck-up.a studious.a stuffy.a stupendous.a stupifying.a sturdy.a stylish.a stylistic.a suave.a subarachnoid.a subatomic.a subclavian.a subconscious.a subcutaneous.a subdermal.a subglacial.a subhuman.a subject.a subjective.a subjunctive.a sublimate.a sublime.a subliminal.a submandibular.a submarine.a submerged.a submissive.a subnational.a subnormal.a subordinate.a subsea.a subsequent.a subservient.a subsidiary.a subsonic.a substandard.a substantial.a substantive.a subterranean.a subtle.a subtropical.a suburban.a subversive.a successful.a successional.a successive.a succinct.a succulent.a Sudanese.a sudden.a sugary.a suggestive.a suicidal.a suitable.a sulfuric.a sulfurous.a sulky.a sullen.a sulphuric.a sulphurous.a sultry.a summa.a summary.a summery.a sumptuous.a sunbaked.a sunburned.a sunburnt.a sundry.a sunken.a sunless.a sunlit.a sunny.a super.a superabundant.a superb.a supercharged.a supercilious.a supercritical.a superficial.a superfluous.a superhuman.a superior.a superlative.a superluminal.a supernatural.a supernormal.a superscalar.a supersonic.a superstitious.a supervisory.a supine.a supple.a supplementary.a supportive.a suppressant.a suppressive.a supraventricular.a supreme.a sur.a surgical.a Surinamese.a surjective.a surly.a surmountable.a surnamed.a surpassing.a surreal.a surrealistic.a surreptitious.a susceptible.a suspect.a suspenseful.a suspensory.a sustainable.a svelte.a swampy.a swanky.a swarthy.a swashbuckling.a sweaty.a Swedish.a sweeping.a sweet.a swell.a swift.a Swiss.a swollen.a sycophantic.a syllabic.a syllogistic.a symbiotic.a symbolic.a symmetric.a symmetrical.a sympathetic.a symphonic.a symplectic.a symptomatic.a synaptic.a synchronous.a syncretic.a synergistic.a synonymous.a synoptic.a synovial.a syntactic.a synthetic.a syphilitic.a syrupy.a systematic.a systemic.a systolic.a tabbed.a tabby.a taboo.a tabular.a tacit.a taciturn.a tacky.a tactical.a tactile.a tactual.a tailor-made.a tailwheel.a Taiwanese.a takeaway.a talented.a talkative.a taloned.a tame.a tan.a tangential.a tangible.a tangy.a tannic.a tantamount.a tantric.a tardy.a tart.a tartaric.a tasselled.a tasteful.a tasteless.a tasty.a tattered.a tatty.a tauberian.a taut.a tautological.a tawdry.a tawny.a taxable.a taxonomic.a tearful.a technical.a techno.a technological.a tectonic.a tedious.a teenage.a teenaged.a teeny.a telegraphic.a teleological.a telepathic.a telephoto.a teleporter.a telescopic.a telestial.a telling.a telluric.a temperamental.a temperate.a tempestuous.a temporal.a temporary.a temporomandibular.a temporoparietal.a tenable.a tenacious.a tendentious.a tender.a tenderhearted.a tense.a tensile.a tensor.a tentacled.a tentative.a tenuous.a tepid.a teratogenic.a terminal.a terminological.a ternary.a terrestrial.a terrific.a territorial.a terse.a tertian.a tertiary.a tessellated.a testicular.a testy.a tetchy.a tetrahedral.a textile.a textual.a textural.a textured.a Thai.a thankful.a thankless.a theatrical.a theistic.a thematic.a themed.a theocratic.a theological.a theoretical.a theosophical.a therapeutic.a thermal.a thermic.a thermochromic.a thermodynamic.a thermoelectric.a thermonuclear.a thermophilic.a thermostatic.a thick.a thin.a thirsty.a thoracic.a thorny.a thorough.a thoroughbred.a thoroughgoing.a thoughtful.a thoughtless.a threadbare.a threadlike.a threonine.a thriftless.a thrifty.a throaty.a thumping.a thunderous.a thy.a ticklish.a tidal.a tidy.a tiered.a tight.a tiltrotor.a timbered.a timeless.a timelike.a timely.a timesaving.a timid.a timorous.a tinny.a tiny.a tipsy.a tireless.a tiresome.a titanic.a titled.a titular.a tolerable.a tolerant.a tom.a tonal.a toothed.a toothless.a top.a topical.a topless.a topmost.a topnotch.a topographic.a topographical.a topological.a topping.a toroidal.a torrential.a torrid.a tortuous.a torturous.a total.a totalitarian.a touched.a touching.a touchy.a touristic.a touristical.a touristy.a toxic.a traceable.a tractable.a tractive.a trademarked.a tragicomic.a traitorous.a tranquil.a transalpine.a transatlantic.a transcendent.a transcendental.a transcontinental.a transcriptional.a transferable.a transformational.a transgendered.a transgenic.a transient.a transistorized.a transitional.a transitive.a transitory.a translatable.a translational.a translucent.a transomed.a transparent.a transverse.a trapezoidal.a trashed.a trashy.a traumatic.a treacherous.a treacly.a treble.a tremendous.a trenchant.a trendy.a triangular.a tribal.a tricky.a triennial.a trifling.a trigonal.a trilateral.a trilingual.a trim.a tri-masted.a trimasted.a trinitarian.a tripartite.a triple.a tripping.a trite.a triumphal.a triumphant.a trivalent.a trochaic.a trophic.a trophoblastic.a tropical.a troublesome.a truculent.a trustful.a trustworthy.a trusty.a truthful.a trying.a tsarist.a tubby.a tubercular.a tuberous.a tubular.a tumultuous.a tuneful.a turbo.a turbocharged.a turbulent.a turgid.a Turkish.a Tuscan.a twee.a twin-lobed.a twinlobed.a twin-masted.a twinmasted.a twisty.a typewritten.a typographic.a typological.a tyrannical.a ubiquitous.a ugly.a ulcerous.a ulnar.a ulterior.a ultimate.a ultra.a ultraconservative.a ultrafine.a ultramarine.a ultramontane.a ultrashort.a ultrasonic.a ultraviolet.a umber.a umbilical.a umpteenth.a unabashed.a unabated.a unabridged.a unaccented.a unaccommodating.a unaccompanied.a unaccountable.a unaccounted.a unaccredited.a unaccustomed.a unacknowledged.a unacquainted.a unaddressed.a unadorned.a unadulterated.a unaffected.a unaffiliated.a unaided.a unaired.a unaltered.a unambiguous.a unanimous.a unannounced.a unanswerable.a unanswered.a unanticipated.a unappealing.a unappetizing.a unappreciated.a unappreciative.a unapproachable.a unarmed.a unarmored.a unarmoured.a unarticulated.a unary.a unasked.a unassailable.a unassigned.a unassisted.a unassuming.a unattached.a unattainable.a unattended.a unattractive.a unauthorised.a unauthorized.a unavailable.a unavoidable.a unbalanced.a unbearable.a unbeatable.a unbeaten.a unbecoming.a unbeknown.a unbeknownst.a unbending.a unbiased.a unborn.a unbounded.a unbowed.a unbreakable.a unbridled.a unbroken.a unburied.a unburnt.a unbuttoned.a uncanny.a unceasing.a uncensored.a unceremonious.a unchallenged.a unchanged.a unchanging.a uncharacteristic.a uncharged.a uncharitable.a uncharted.a unchecked.a unchristian.a uncivilized.a unclaimed.a unclassed.a unclassified.a unclean.a uncleaned.a unclothed.a unclouded.a uncluttered.a uncomfortable.a uncommitted.a uncommon.a uncommunicative.a uncompleted.a uncompromising.a unconcealed.a unconcerned.a unconditional.a unconfirmed.a unconjugated.a unconnected.a unconquered.a unconscionable.a unconscious.a unconstitutional.a unconstrained.a unconsummated.a uncontaminated.a uncontested.a uncontrollable.a uncontrolled.a uncontroversial.a unconventional.a unconverted.a unconvincing.a uncooked.a uncoordinated.a uncorrected.a uncorroborated.a uncounted.a uncountered.a uncouth.a uncowled.a uncredited.a uncritical.a uncrossed.a unctuous.a uncultivated.a uncut.a undamaged.a undated.a undaunted.a undecided.a undeciphered.a undeclared.a undecorated.a undefeated.a undefended.a undefined.a undemocratic.a underage.a underarm.a undercover.a underdeveloped.a underdone.a underemployed.a underfed.a underfunded.a underhanded.a undermanned.a undernourished.a underpaid.a underpowered.a underpriveleged.a underprivileged.a underproduced.a underrepresented.a undersampled.a undersea.a underserved.a undersize.a undersized.a understaffed.a understanding.a undervalued.a underwater.a underweight.a undescribed.a undeserved.a undeserving.a undesirable.a undesired.a undesputable.a undetected.a undetermined.a undeterred.a undeveloped.a undiagnosed.a undifferentiated.a undigested.a undignified.a undiluted.a undiminished.a undimmed.a undiplomatic.a undisciplined.a undisclosed.a undiscovered.a undiscriminating.a undisplaced.a undisputed.a undistinguished.a undistorted.a undisturbed.a undivided.a undocumented.a undoubted.a undrafted.a undrained.a undrinkable.a undue.a undying.a unearned.a unearthly.a uneasy.a uneaten.a uneconomic.a uneconomical.a unedifying.a unedited.a uneducated.a unelected.a unemotional.a unemployed.a unencrypted.a unencumbered.a unending.a unenthusiastic.a unentrenched.a unenviable.a unequal.a unequalled.a unequipped.a unequivocal.a unerring.a unescorted.a uneven.a uneventful.a unexceptionable.a unexceptional.a unexercised.a unexpected.a unexpired.a unexplained.a unexploded.a unexplored.a unexpressed.a unexpurgated.a unfailing.a unfaithful.a unfamiliar.a unfashionable.a unfathomable.a unfathomed.a unfavorable.a unfavourable.a unfazed.a unfed.a unfeeling.a unfertilized.a unfiltered.a unfinished.a unfit.a unflappable.a unflavored.a unflinching.a unflooded.a unforeseeable.a unforeseen.a unforgettable.a unforgivable.a unforgiving.a unformed.a unfounded.a unfranked.a unfree.a unfretted.a unfriendly.a unfulfilled.a unfurnished.a ungainly.a unglazed.a ungodly.a ungracious.a ungrammatical.a ungrateful.a ungrudging.a unguarded.a unguided.a unhampered.a unhandled.a unharmed.a unhealthy.a unheard.a unheated.a unheeded.a unhelpful.a unhesitating.a unhindered.a unhurried.a unhurt.a unhygienic.a unicameral.a unidentifiable.a unidentified.a uniform.a uniformed.a unilateral.a unimaginable.a unimaginative.a unimpaired.a unimpeachable.a unimpeded.a unimportant.a unimpressed.a unimpressive.a unimproved.a unincorporated.a uninformative.a uninformed.a uninhabitable.a uninhabited.a uninhabitted.a uninhibited.a uninitiated.a uninjured.a uninspired.a uninspiring.a uninstalled.a uninsured.a unintelligent.a unintelligible.a unintended.a unintentional.a uninterested.a uninteresting.a uninterrupted.a uninvited.a uninviting.a unique.a unisex.a unitary.a univalent.a universal.a unjustifiable.a unjustified.a unkempt.a unkept.a unknowable.a unlabelled.a unladylike.a unlatched.a unlawful.a unleaded.a unleavened.a unlicensed.a unlimited.a unlined.a unlisted.a unlit.a unlockable.a unloved.a unmade.a unmaintained.a unmanageable.a unmanned.a unmarked.a unmarried.a unmatched.a unmemorable.a unmentionable.a unmentioned.a unmerited.a unmistakable.a unmitigated.a unmixed.a unmodified.a unmolested.a unmotivated.a unmoved.a unmusical.a unnamed.a unnatural.a unneeded.a unnoticeable.a unnoticed.a unnumbered.a unobjectionable.a unobservant.a unobserved.a unobstructed.a unobtainable.a unobtrusive.a unoccupied.a unofficial.a unopened.a unopposed.a unoriginal.a unorthodox.a unpaid.a unpainted.a unpaired.a unpalatable.a unparalleled.a unpardonable.a unparished.a unpasteurized.a unpatriotic.a unpaved.a unpegged.a unperformed.a unpersuaded.a unperturbed.a unplaced.a unplanned.a unplayable.a unpolished.a unpolluted.a unpopular.a unpopulated.a unpowered.a unprecedented.a unpredictable.a unpredicted.a unprejudiced.a unprepared.a unpressurized.a unpretentious.a unprincipled.a unprintable.a unproduced.a unproductive.a unprofessional.a unprofitable.a unpromising.a unprompted.a unpronounceable.a unprotected.a unproved.a unproven.a unprovoked.a unpublished.a unpunished.a unqualified.a unquestionable.a unquestioned.a unquestioning.a unranked.a unrated.a unread.a unreadable.a unready.a unreal.a unrealised.a unrealistic.a unrealized.a unrecognised.a unrecognizable.a unrecognized.a unrecorded.a unrefined.a unregenerate.a unregistered.a unregulated.a unrelated.a unreleased.a unrelenting.a unreliable.a unrelieved.a unremarkable.a unremitting.a unrepaired.a unrepentant.a unreported.a unrepresentative.a unrequited.a unreserved.a unresolved.a unrestrained.a unrestricted.a unrevealed.a unrewarded.a unripe.a unrivaled.a unrivalled.a unruffled.a unruly.a unsafe.a unsaid.a unsalted.a unsanctioned.a unsatisfactory.a unsatisfied.a unsatisfying.a unsaturated.a unsavory.a unsavoury.a unscathed.a unscheduled.a unscientific.a unscripted.a unscrupulous.a unsealed.a unseasonable.a unseasoned.a unsecured.a unseeded.a unseemly.a unseen.a unselfconscious.a unselfish.a unset.a unshakable.a unshaved.a unshaven.a unsightly.a unsigned.a unsinkable.a unskilled.a unsmiling.a unsociable.a unsold.a unsolicited.a unsolved.a unsophisticated.a unsound.a unsparing.a unspeakable.a unspecified.a unspoiled.a unspoilt.a unspoken.a unsponsored.a unsporting.a unsportsmanlike.a unspotted.a unstable.a unstaffed.a unstandardized.a unstated.a unstatesmanlike.a unsteady.a unstoppable.a unstressed.a unstructured.a unstrung.a unstuck.a unstudied.a unsubstantiated.a unsubtle.a unsuccessful.a unsuitable.a unsuited.a unsulfated.a unsullied.a unsung.a unsupervised.a unsupported.a unsurpassed.a unsuspected.a unsuspecting.a unswayed.a unsweetened.a unswept.a unsympathetic.a unsynchronized.a untainted.a untamed.a untapped.a untenable.a untended.a untenured.a untested.a unthinkable.a unthinking.a untidy.a untimely.a untiring.a untitled.a untold.a untouchable.a untouched.a untoward.a untraditional.a untrained.a untranslatable.a untranslated.a untreated.a untricked.a untried.a untroubled.a untrustworthy.a untruthful.a untucked.a untuned.a untutored.a unused.a unutterable.a unvarnished.a unvarying.a unverified.a unversed.a unvoiced.a unwalled.a unwanted.a unwarranted.a unwary.a unwashed.a unwavering.a unwed.a unwelcome.a unwell.a unwieldy.a unwilling.a unwitnessed.a unwitting.a unworkable.a unworn.a unworried.a unwounded.a unwritten.a unyielding.a upbeat.a upcoming.a upcountry.a upfront.a uphill.a upmarket.a upmost.a upper.a uppermost.a uppity.a upright.a upriver.a uproarious.a upscale.a upstairs.a upstanding.a upstate.a uptempo.a uptight.a upturned.a upward.a urban.a urbane.a urbanistic.a urethral.a urinary.a usable.a useless.a usurious.a uterine.a utilitarian.a utmost.a utter.a uvular.a vacant.a vacuous.a vagabond.a vagal.a vaginal.a vague.a vain.a valedictory.a valent.a valiant.a valid.a valueless.a vampiric.a vapid.a vaporous.a variable.a variant.a variational.a varicose.a varied.a variegated.a varietal.a various.a varsity.a vascular.a vast.a vaudevillian.a vegan.a vegetative.a vehement.a vehicular.a velar.a velvety.a venal.a venerable.a venereal.a vengeful.a venial.a venomous.a venous.a ventral.a verbal.a verbatim.a verbose.a verdant.a verifiable.a veritable.a vermilion.a vernacular.a vernal.a versatile.a versed.a vertebral.a vertical.a vestal.a vestigial.a veterinary.a vexatious.a viable.a vibrant.a vibratory.a vicarious.a vicinal.a vicious.a victorious.a Vietnamese.a viewless.a vigilant.a vigorous.a vile.a villainous.a vindictive.a vinegary.a vinified.a violent.a viral.a virgin.a virile.a virtual.a virtuosic.a virtuous.a virulent.a visceral.a viscous.a visible.a visionary.a visual.a vitreous.a vitriolic.a vituperative.a vivacious.a vivid.a vocal.a vocational.a vociferous.a voiceless.a void.a volatile.a volcanic.a volitional.a voltaic.a voluble.a voluminous.a voluntary.a voluptuous.a voracious.a votive.a voyeuristic.a vulgar.a vulnerable.a wacky.a waggish.a waisted.a wakeful.a waking.a wan.a wanton.a warehoused.a warlike.a warm.a wary.a washable.a waspish.a wasteful.a watchful.a waterborne.a waterlogged.a waterproof.a watertight.a watery.a wavy.a waxen.a waxy.a wayfaring.a waymarked.a wayward.a weak.a weakly.a wealthy.a weaponized.a wearable.a wearing.a wearisome.a weary.a weatherproof.a webbed.a wee.a weedy.a weeklong.a weekly.a weeny.a weightless.a weighty.a weird.a welcome.a well-meaning.a well-to-do.a Welsh.a welter.a westerly.a westwardly.a wet.a whatsoever.a whimsical.a whiny.a whiskered.a white.a whitish.a whole.a wholehearted.a wholesale.a wholesome.a whopping.a wiccan.a Wiccan.a wicked.a widepread.a widespread.a widowed.a wigged.a wild.a wilful.a willful.a wilted.a wily.a windblown.a windowed.a windowless.a windswept.a windward.a windwardly.a windy.a winged.a wingless.a winless.a winningest.a wintery.a wintry.a wirldwide.a wiry.a wishful.a wispy.a wistful.a witless.a witty.a wizard.a wizened.a wobbly.a woeful.a womanly.a wondrous.a wont.a wooded.a wooden.a woody.a woogie.a woolen.a woollen.a woolly.a wooly.a wordy.a workable.a workaday.a workaholic.a workmanlike.a worldly.a world-wide.a worldwide.a worried.a worrisome.a worrying.a worshipful.a worthless.a worthwhile.a wrathful.a wretched.a wrinkly.a wrongful.a wry.a xenophobic.a yearlong.a yearly.a yellow.a yellowish.a yogic.a yon.a yonder.a young.a youngish.a youthful.a yummy.a zany.a zealous.a zestful.a zombified.a zoological.a zoomorphic.a zygomatic.a link-grammar-4.7.4/data/en/words/words.v.4.10000644000175000017500000006065511526022265017425 0ustar bloombloomabandon.v abase.v abbreviate.v abduct.v abet.v abhor.v abolish.v abridge.v abrogate.v absorb.v abstract.v abuse.v abut.v accentuate.v accent.v access.v acclaim.v accommodate.v accompany.v accomplish.v accost.v accredit.v accrete.v accustom.v acerbate.v achieve.v acquaint.v acquire.v activate.v addict.v addle.v address.v adjudge.v administer.v admire.v admonish.v adore.v adorn.v adulterate.v adumbrate.v aerate.v affect.v affix.v afflict.v aggrandize.v aggravate.v alienate.v allay.v alleviate.v allocate.v allot.v amass.v ambush.v ameliorate.v amend.v amortize.v amplify.v amputate.v anaesthetize.v anathematize.v anesthetize.v anger.v anglicize.v animate.v anneal.v annex.v annihilate.v annoint.v annotate.v annul.v anoint.v antagonize.v antedate.v anthologize.v anthropomorphize.v ape.v appease.v append.v apportion.v appraise.v apprehend.v apprentice.v apprise.v appropriate.v arm.v arouse.v arraign.v array.v arrest.v arrogate.v ascribe.v asphalt.v asphyxiate.v aspirate.v assail.v assassinate.v assault.v assay.v assuage.v atomize.v attack.v attaint.v attain.v attenuate.v attire.v attract.v attribute.v attune.v audit.v augment.v authenticate.v autograph.v automate.v avenge.v avert.v aver.v await.v awe.v axe.v ax.v backdate.v badger.v baffle.v bait.v bake.v balance.v bale.v bamboozle.v bandage.v banish.v bankrupt.v ban.v baptize.v barbarize.v barbecue.v bare.v barrel.v barricade.v base.v bash.v baste.v batter.v battle.v beak.v bean.v beatify.v beautify.v bedevil.v befall.v befit.v befoul.v befriend.v beget.v beggar.v beguile.v behead.v behold.v bejewel.v belabour.v belie.v belittle.v belt.v bemoan.v bench.v bequeath.v berate.v bereave.v beseech.v besiege.v besmirch.v bespeak.v bestir.v bestow.v bestrew.v bestride.v betoken.v betray.v bevel.v bewail.v bewilder.v bewitch.v bias.v bide.v biff.v bilk.v billet.v bill.v birch.v bisect.v blackball.v blacklist.v blackmail.v blade.v blame.v blanket.v blast.v blazon.v blemish.v bless.v blight.v blindfold.v blind.v blitz.v blockade.v blow-dry.v bludgeon.v blue-pencil.v blunt.v bold.v bolster.v bombard.v bomb.v bookend.v boost.v boss.v botch.v boycott.v brace.v bracket.v braid.v brainwash.v braise.v brandish.v brand.v brave.v breach.v bribe.v brick.v bridge.v brief.v brine.v broach.v brocade.v broker.v bronze.v brook.v browbeat.v brutalize.v budget.v buff.v bug.v bulldoze.v bungle.v bung.v buoy.v burden.v burlesque.v bury.v bus.v busy.v butcher.v buttonhole.v buttress.v by-pass.v bypass.v cajole.v calibrate.v camouflage.v cane.v cannibalize.v canonise.v canonize.v cape.v captivate.v capture.v cap.v carbonize.v carburet.v card.v caress.v caricature.v carjack.v carpet.v case.v castigate.v castrate.v catalogue.v catapult.v categorize.v cede.v cement.v censor.v censure.v centralise.v centralize.v chagrin.v chain.v chair.v champion.v channel.v chaperon.v charm.v charter.v chart.v chasten.v chastise.v cheapen.v checkmate.v cherish.v chide.v chisel.v chlorinate.v chord.v christen.v chrome.v chronicle.v circularize.v circumcise.v circumnavigate.v circumscribe.v circumvent.v cite.v civilize.v clad.v clamp.v classify.v claw.v cleanse.v clench.v clip.v cloak.v clobber.v cloister.v clone.v closet.v clothe.v club.v coat.v co-author.v coauthor.v cobble.v cock.v coddle.v codename.v code.v codify.v coerce.v cofound.v coin.v cold-shoulder.v collar.v collate.v collectivize.v collect.v collocate.v colocate.v colonize.v combat.v comfort.v commandeer.v commemorate.v commend.v commercialize.v compact.v compartmentalize.v compile.v complement.v complete.v complicate.v compliment.v compost.v compound.v comprehend.v compress.v comprise.v computerize.v conceal.v concern.v conciliate.v concoct.v condition.v condone.v configure.v confine.v confiscate.v conflate.v confound.v confront.v confuse.v confute.v conga.v congratulate.v conjure.v conk.v connote.v conquer.v conscript.v consecrate.v conserve.v consign.v console.v constitute.v constrain.v constrict.v construct.v construe.v consume.v consummate.v contact.v contain.v contaminate.v content.v contort.v contour.v contradict.v contravene.v contrive.v control.v con.v convect.v conventionalize.v convey.v convoke.v convoy.v convulse.v co-opt.v coop.v coordinate.v co-produce.v copyright.v copy.v cordon.v cord.v core.v cork.v corner.v corral.v correct.v corroborate.v countenance.v counteract.v counterbalance.v counterfeit.v countermand.v countersign.v countersue.v couple.v court-martial.v court.v covet.v cox.v cradle.v cramp.v crane.v crayon.v cream.v create.v credit.v cremate.v crimp.v cripple.v criticize.v crossbreed.v cross-examine.v cross-fertilize.v cross-index.v cross-question.v crown.v crucify.v crush.v cube.v cudgel.v cuff.v cull.v cultivate.v cup.v curb.v cure.v curry.v curtail.v cushion.v damage.v damn.v dampen.v dandle.v daub.v daunt.v daze.v dazzle.v deaden.v deafen.v debar.v debase.v debauch.v debilitate.v debit.v debrief.v debug.v debunk.v decant.v decapitate.v decarbonize.v deceive.v decentralize.v decertify.v decimalize.v decimate.v decipher.v deck.v declaim.v declassify.v decode.v decolonize.v decompress.v deconsecrate.v decontaminate.v decorate.v decrypt.v decry.v dedicate.v deduct.v deed.v deep-freeze.v deepthroat.v de-escalate.v dee.v deface.v defame.v defeat.v defend.v defer.v defile.v define.v deflate.v deflower.v defoliate.v deforest.v deform.v defragment.v defraud.v defray.v defrock.v defrost.v defund.v defuse.v defy.v degrade.v dehumanize.v dehydrate.v de-ice.v deify.v delegate.v delete.v delimit.v delineate.v delist.v delude.v deluge.v demagnetize.v demarcate.v demean.v demerge.v demilitarize.v demist.v demobilize.v demolish.v demonize.v demoralize.v demote.v demutualise.v denationalize.v denigrate.v denominate.v denote.v denounce.v dent.v denude.v deodorize.v deplete.v deplore.v deploy.v depopulate.v deport.v depose.v deposit.v deprecate.v deprogram.v derange.v deride.v desalinate.v desalinize.v desecrate.v desegregate.v desensitize.v desert.v desiccate.v despatch.v despise.v despoil.v destroy.v detach.v detain.v detect.v deter.v detest.v dethrone.v detune.v devaluate.v devalue.v devastate.v devise.v devote.v devour.v dewater.v diagnose.v dice.v diddle.v diffract.v dignify.v dilute.v direct.v disable.v disaffiliate.v disallow.v disappoint.v disarrange.v disassemble.v disassociate.v disavow.v disburse.v discard.v discipline.v disclaim.v discomfit.v disconcert.v disconnect.v discontent.v discount.v discourage.v discredit.v disdain.v disembarrass.v disembowel.v disenchant.v disenfranchise.v disestablish.v disfavour.v disfigure.v disfranchise.v disgorge.v disgrace.v disguise.v dishearten.v dishonour.v disillusion.v disinfect.v disinherit.v disinter.v dislocate.v dislodge.v dismantle.v dismember.v dismiss.v disobey.v disorientate.v disorient.v disown.v disparage.v dispatch.v dispel.v displace.v display.v displease.v dispossess.v disprove.v disqualify.v disregard.v disrupt.v dissect.v disseminate.v dissociate.v dissuade.v diss.v distance.v distil.v distort.v distract.v distribute.v distrust.v disturb.v ditch.v divert.v divest.v divorce.v divulge.v dizzy.v doctor.v doff.v domesticate.v dominate.v donate.v don.v doom.v dope.v dot.v double-check.v double-cross.v douse.v downgrade.v download.v downplay.v down.v dragoon.v dramatize.v drape.v drench.v drip-dry.v drub.v drug.v dry-clean.v duct.v dumbfound.v dunk.v dupe.v duplicate.v dust.v dwarf.v dye.v dynamite.v earmark.v earn.v eclipse.v edify.v edit.v efface.v effect.v elbow.v electrify.v electrocute.v electrolyze.v elevate.v elicit.v elide.v eliminate.v elucidate.v elude.v emancipate.v emasculate.v embalm.v embargo.v embed.v embellish.v embezzle.v embitter.v emblazon.v embody.v embolden.v emboss.v embrace.v embroil.v emend.v emit.v empanel.v empower.v emulate.v emulsify.v enact.v enamel.v encase.v enchant.v encircle.v enclose.v encode.v encompass.v encounter.v encrypt.v encumber.v endanger.v endear.v endorse.v endow.v enervate.v enfeoff.v enfold.v enforce.v enfranchise.v engender.v engineer.v engrave.v engross.v engulf.v enhance.v enjoin.v enlarge.v enlighten.v enliven.v enmesh.v ennoble.v enrage.v enrich.v ensconce.v enshrine.v enshroud.v enslave.v ensnare.v ensoul.v entangle.v enthrall.v enthral.v enthrone.v enthuse.v entomb.v entrain.v entrance.v entrap.v entreat.v entrust.v entwine.v enumerate.v envelop.v envy.v epitomize.v equalize.v equal.v equate.v equip.v eradicate.v erase.v erect.v eschew.v escort.v espouse.v espy.v esteem.v eulogize.v evade.v evict.v evince.v eviscerate.v evoke.v exacerbate.v exalt.v exasperate.v excavate.v exceed.v exchange.v excise.v exclude.v excommunicate.v excoriate.v excrete.v exculpate.v excuse.v execute.v exemplify.v exempt.v exert.v exhaust.v exhibit.v exhilarate.v exhume.v exile.v exorcize.v expedite.v expel.v expend.v experience.v expiate.v explicate.v exploit.v expose.v expropriate.v expunge.v expurgate.v extenuate.v exterminate.v externalize.v extinguish.v extirpate.v extol.v extort.v extract.v extradite.v extricate.v exude.v eye.v fabricate.v facelift.v facet.v facilitate.v fag.v fake.v falsify.v familiarize.v fancy.v fascinate.v fashion.v fate.v fathom.v fatigue.v fault.v favorite.v favour.v faze.v feather.v feature.v feign.v fence.v ferret.v fertilize.v festoon.v fete.v fetter.v fianchetto.v fillet.v finalize.v finance.v fine-tune.v finger.v firebomb.v flagellate.v flank.v flatter.v flaunt.v flavour.v flay.v fleece.v flick.v flog.v floodlight.v floor.v flout.v fluff.v flummox.v fluoridate.v flurry.v fluster.v foil.v foist.v foment.v fondle.v fond.v fool.v force-feed.v ford.v forecast.v forego.v foreordain.v foreshadow.v foreshorten.v forestall.v foreswear.v foretell.v forfeit.v forge.v forgo.v formalize.v formulate.v forsake.v forswear.v fortify.v forward.v foster.v found.v frame.v frank.v frazzle.v free.v frequent.v fresco.v fricassee.v frighten.v frisk.v fritter.v frogmarch.v frustrate.v fry.v fulfill.v fulfil.v fumigate.v fund.v funnel.v furbish.v furnish.v furrow.v further.v gage.v gainsay.v gall.v galvanize.v gaol.v garble.v garb.v garner.v garnish.v garrison.v gash.v gatecrash.v gauge.v generate.v genericize.v gerrymander.v ghettoize.v gild.v gin.v gird.v glaciate.v gladden.v glamorize.v glean.v glimpse.v glorify.v glut.v goad.v gore.v gorge.v grab.v grace.v grade.v graft.v gratify.v gravel.v grease.v greenlight.v greet.v grill.v grip.v grit.v groin.v groom.v gross.v grudge.v guard.v guide.v guillotine.v gum.v gun.v gut.v guzzle.v gyp.v hallow.v halt.v halve.v hamper.v hamstring.v handcraft.v handcuff.v handicap.v handle.v harangue.v harass.v harbor.v harbour.v harm.v harness.v harpoon.v harrow.v harry.v harvest.v hassle.v haunt.v hawk.v hazard.v haze.v headquarter.v heap.v hearten.v heart.v heed.v helm.v herald.v highjack.v highlight.v hijack.v hinder.v hoax.v hobble.v hock.v hog.v hollow.v homestead.v homogenize.v hone.v honor.v honour.v hood.v hoodwink.v horrify.v horsewhip.v hose.v hospitalize.v host.v hotfoot.v hound.v house.v hull.v humble.v humbug.v humiliate.v humour.v hump.v hunch.v hurl.v husk.v hyphenate.v hypnotize.v idealize.v identify.v idolize.v ignore.v ill-treat.v illuminate.v illumine.v illustrate.v image.v imbibe.v imbue.v imitate.v immerse.v immobilize.v immolate.v immortalize.v immunize.v impact.v impair.v impale.v impanel.v impart.v impeach.v impede.v imperil.v impersonate.v implant.v implement.v implicate.v import.v impose.v impound.v impoverish.v impregnate.v impress.v imprint.v imprison.v impugn.v impute.v inactivate.v inaugurate.v incapacitate.v incarcerate.v incarnate.v incense.v incinerate.v include.v inconvenience.v incriminate.v inculcate.v incur.v indemnify.v indenture.v index.v indict.v individuate.n indoctrinate.v induct.v infatuate.v infect.v infest.v infill.v infiltrate.v inflame.v inflate.v inflect.v inflict.v influence.v infuriate.v infuse.v ingest.v ingratiate.v inhabit.v inherit.v inhibit.v initial.v inject.v injure.v ink.v inoculate.v inscribe.v inseminate.v insert.v inspect.v install.v instate.v instigate.v instill.v instil.v institute.v institutionalize.v insulate.v insult.v insure.v integrate.v intercept.v interchange.v interdict.v interest.v interject.v interleave.v internalize.v internationalize.v interoperate.v interpolate.v interrogate.v intersperse.v inter.v interweave.v intimidate.v intone.v intoxicate.v introduce.v intuit.v inundate.v invade.v invalidate.v invalid.v inveigle.v invent.v invert.v invigorate.v invoke.v irk.v irradiate.v irrigate.v isolate.v italicize.v itemize.v iterate.v jail.v jar.v jeopardize.v jettison.v jilt.v jinx.v jolly.v jug.v juxtapose.v ken.v kidnap.v kiss.v knead.v knife.v knight.v lacerate.v lace.v lack.v lacquer.v lambaste.v laminate.v lampoon.v lance.v landscape.v lasso.v laud.v launder.v lavish.v leach.v leapfrog.v lease.v leaven.v legalize.v legitimatize.v lenite.v leverage.v lever.v levy.v libel.v liberalize.v liberate.v licence.v liken.v limit.v lionize.v liquidize.v list.v loan.v loathe.v lob.v loft.v loot.v lubricate.v lug.v lull.v lump.v lure.v lynch.v madden.v magnetize.v magnify.v maim.v malign.v maltreat.v manacle.v mandate.v mangle.v manhandle.v manicure.v manifest.v manipulate.v manufacture.v man.v marginalise.v marginalize.v market.v maroon.v marshal.v martyr.v mar.v mash.v mask.v massage.v mass-produce.v mastermind.v master.v masticate.v maul.v maximize.v max.v measure.v mechanize.v medicate.v memorialize.v memorize.v menace.v merit.v mesmerize.v microfilm.v miff.v milk.v mimeograph.v mimic.v mince.v miniaturize.v minimize.v mint.v mire.v mirror.v misapply.v misapprehend.v misappropriate.v miscast.v misconceive.v misconstrue.v misdate.v misdirect.v misgovern.v misguide.v mishandle.v mishear.v misinform.v misinterpret.v mislay.v mislead.v mismanage.v misname.v misplace.v mispronounce.v misquote.v misrepresent.v misspell.v misspend.v misstate.v mistake.v mistranslate.v mistreat.v mistrust.v misuse.v mitigate.v mob.v mock.v model.v modify.v modulate.v mold.v molest.v mollify.v mollycoddle.v monitor.v monopolize.v montage.v moor.v moot.v morph.v mortar.v mortgage.v mortify.v mothball.v mothproof.v motorize.v muddy.v muffle.v muff.v mug.v mulch.v multiplex.v murder.v muster.v mute.v mutilate.v muzzle.v myspace.v mystify.v nab.v nag.v namespace.v narrate.v nationalize.v naturalize.v needle.v negate.v nettle.v net.v neuter.v neutralize.v nickname.v nick.v nix.v noogie.v normalize.v norm.v notarize.v notate.v nourish.v novelise.v novelize.v nudge.v nullify.v number.v numb.v nurse.v nurture.v obfuscate.v obligate.v obliterate.v obscure.v obstruct.v obtain.v obviate.v occasion.v occupy.v offend.v offload.v oil.v okay.v omen.v omit.v oppress.v orchestrate.v ordain.v organize.v orientate.v orient.v ornament.v ostracize.v oust.v outbalance.v outclass.v outdistance.v outdo.v outfight.v outfit.v outflank.v outfox.v outgrow.v outlast.v outlaw.v outline.v outlive.v outmanoeuvre.v outnumber.v outplay.v outrage.v outrank.v outride.v outright.v outrun.v outscore.v outshine.v outsmart.v outsource.v outstay.v outvote.v outweigh.v outwit.v overawe.v overbear.v overburden.v overcook.v overcrowd.v overdo.v overdub.v overemphasize.v overestimate.v overexert.v overexpose.v overgraze.v overhaul.v overhear.v overleap.v overload.v overlook.v overpay.v overplay.v overpopulate.v overpower.v overpraise.v overprint.v overrate.v override.v overrule.v oversee.v overshadow.v overshoot.v oversimplify.v overstate.v overstay.v overstep.v overstock.v overstrain.v oversubscribe.v overtake.v overtax.v overvalue.v overwhelm.v overwrite.v own.v oxygenate.v pacify.v package.v padlock.v pad.v page.v pain.v palatalize.v pamper.v paper.v parallelize.v parallel.v paralyse.v paralyze.v parametrize.v paraphrase.v parch.v pardon.v pare.v parody.v parole.v parry.v partition.v partner.v pasteurize.v paste.v patent.v patrol.v patronize.v pattern.v pat.v pauperize.v pawn.v paw.v pedestrianize.v peg.v pelt.v penalize.v pencil.v pepper.v perfect.v perforate.v perfume.v perfuse.v perjure.v permeate.v permute.v perm.v perpetrate.v perpetuate.v perplex.v persecute.v personalize.v personify.v perturb.v peruse.v pervade.v pervert.v pester.v pet.v photocopy.v photograph.v photosensitize.v photostat.v phrase.v pickle.v picture.v pierce.v pigeonhole.v pigment.v pilfer.v pilot.v pinch.v pinpoint.v pipe.v pip.v pique.v pirate.v pitchfork.v pit.v pity.v placate.v place.v plagiarize.v plague.v plant.v plaster.v please.v pluralize.v ply.v pocket.v podcast.v poison.v polarize.v police.v polish.v politicize.v pollinate.v pollute.v ponder.v pooh-pooh.v pool.v popularize.v populate.v portage.v portend.v port.v position.v possess.v postdate.v postmark.v postpone.v post.v powder.v praise.v prearrange.v precede.v precipitate.v preclude.v preconceive.v predestine.v predetermine.v predicate.v predispose.v pre-empt.v preempt.v preen.v prefabricate.v preface.v prefigure.v preform.v preheat.v prejudge.v prejudice.v premeditate.v premise.v preoccupy.v preordain.v prepay.v prerecord.v prerender.v presage.v prescribe.v present.v preserve.v presort.v pressurize.v prestress.v prettify.v prevent.v price.v pride.v prime.v print.v privilege.v prize.v probe.v process.v proctor.v procure.v produce.v prod.v proffer.v profile.v prognosticate.v prohibit.v prolong.v promote.v promulgate.v pronounce.v proof.v propel.v proportion.v proposition.v propound.v proscribe.v prosecute.v prostitute.v prostrate.v protect.v prune.v psychoanalyse.v psychoanalyze.v publicize.v publish.v pulverize.v pummel.v punctuate.v punish.v purchase.v puree.v purify.v purloin.v purse.v pursue.v purvey.v quaff.v quantify.v quarantine.v quarterback.v quarter.v quash.v quell.v quench.v query.v quick-freeze.v quilt.v quote.v radicalize.v raffle.v raid.v railroad.v ramp.v ram.v ransack.v ransom.v rape.v ratify.v rationalize.v ration.v ravage.v ravish.v raze.v reacquaint.v re-address.v readmit.v reappoint.v reap.v rearrange.v reassess.v reauthorize.v rebadge.v reboot.v rebrand.v rebroadcast.v rebuff.v rebuke.v rebut.v recapture.v recast.v recess.v rechristen.v recite.v reclaim.v recolor.v recommit.v recompense.v reconcile.v recondition.v reconquer.v reconsecrate.v reconsider.v reconstruct.v reconvict.v recoup.v recreate.v rectify.v recuse.v recut.v recycle.v redecorate.v redeem.v redefine.v redeploy.v redesignate.v redesign.v redevelop.v rediscover.v redistribute.v redo.v redraft.v redraw.v redress.v redshirt.v reduce.v reduplicate.v re-educate.v reemploy.v reenact.v reequip.v re-establish.v reestablish.v refashion.v refill.v refinance.v refine.v reflex.v reformulate.v refract.v refresh.v refrigerate.v refund.v refurbish.v refurnish.v refute.v regain.v regale.v regiment.v regrade.v regularize.v regulate.v regurgitate.v rehabilitate.v rehash.v rehire.v rehouse.v reignite.v reimagine.v reimburse.v reinforce.v reinstall.v reinstate.v reinsure.v reintegrate.v reinterpret.v reinvent.v reinvigorate.v reissue.v reject.v rejoin.v rejuvenate.v relaunch.v relay.v release.v relegate.v relieve.v relinquish.v relish.v relist.v relive.v reload.v remand.v remaster.v rematch.v remedy.v remilitarize.v remix.v remodel.v remold.v remould.v remove.v remunerate.v rend.v renew.v renominate.v renounce.v renovate.v renumber.v reoccupy.v reorientate.v reorient.v repackage.v repaint.v repatriate.v repeal.v repel.v rephotograph.v rephrase.v replace.v replant.v replaster.v replay.v replenish.v replicate.v reprehend.v represent.v repress.v reprieve.v reprimand.v reprint.v reproach.v reproof.v reprove.v repudiate.v repulse.v repurchase.v repurpose.v repute.v requisition.v reread.v rerelease.v reroll.v reroute.v reschedule.v rescind.v rescue.v research.v reseat.v resell.v resemble.v resent.v reserve.v reset.v reshape.v reshuffle.v resit.v resole.v respect.v restate.v restock.v restore.v restrain.v restrict.v restructure.v restyle.v resubmit.v resurrect.v retain.v retake.v retard.v retell.v rethink.v retitle.v retouch.v retrace.v retract.v retransmit.v retrieve.v retry.v ret.v revalue.v revamp.v revere.v revet.v review.v revile.v revise.v revisit.v revitalize.v revoke.v revolutionize.v reward.v rewater.v rewire.v reword.v rewrite.v rib.v riddle.v ridicule.v rifle.v right.v rim.v rival.v rivet.v romanize.v romanticize.v rope.v route.v rout.v rubberize.v rubber-stamp.v rue.v ruin.v rumple.v rusticate.v sabotage.v sack.v sadden.v saddle.v safeguard.v salt.v salvage.v sample.v sanctify.v sanction.v sandblast.v sandpaper.v sand.v sandwich.v sap.v satiate.v satirise.v satirize.v satisfy.v saturate.v sauteH.v savage.v savour.v scald.v scalp.v scandalize.v scant.v scarper.v scar.v scent.v schedule.v school.v scoop.v scorch.v scorn.v scotch.v scour.v scrap.v scrunch.v scrutinize.v sculpt.v scuttle.v sear.v season.v seat.v second.v secrete.v secularize.v secure.v sedate.v seduce.v seed.v segregate.v select.v sensationalize.v sensitize.v sentimentalize.v sequester.v serenade.v serialize.v service.v shackle.v shadow.v shame.v shampoo.v shapeshift.v share.v sharpen.v shear.v sheathe.v shelter.v shelve.v shepherd.v shield.v shingle.v shirk.v shock.v shoo.v short-change.v shortlist.v shoulder.v shovel.v showcase.v shred.v shroud.v shuck.v shunt.v shun.v shutter.v sicken.v sick.v sideline.v sidestep.v sidetrack.v sieve.v sight.v signpost.v silence.v silhouette.v simplify.v simulate.v simulcast.v siphon.v sire.v skewer.v skin.v skipper.v skirt.v slake.v slander.v slap.v slash.v slate.v slaughter.v slay.v sleeve.v slice.v slight.v sling.v slot.v slug.v slur.v smelt.v smite.v smother.v snag.v snare.v snub.v sock.v sodomize.v soft-pedal.v soil.v solder.v solicit.v solve.v soothe.v soundproof.v soup.v source.v souse.v spade.v spank.v span.v spare.v spay.v spearhead.v spear.v specify.v spew.v spike.v spin-dry.v spirit.v spite.v sponsor.v spoonfeed.v spotlight.v spot.v sprain.v spray.v sprinkle.v spurn.v squander.v squelch.v squire.v stab.v staff.v stage.v stalemate.v standardize.v staple.v starch.v startle.v stash.v station.v staunch.v steal.v steamroller.v steel.v stereotype.v sterilize.v stiff.v stigmatize.v still.v stimulate.v stitch.v stockade.v stoke.v stomach.v stone.v store.v storyboard.v stow.v straddle.v strafe.v straiten.v strangle.v strap.v streamline.v strew.v stroke.v structure.v stub.v stucco.v stud.v stunt.v stun.v style.v stylize.v stymie.v subdue.v subedit.v subject.v subjugate.v sublimate.v subordinate.v subpoena.v subserve.v subsidize.v substantiate.v subsume.v subtend.v subtract.v subvert.v succour.v suckle.v suffuse.v suicide.v suit.v sully.v summarize.v summon.v sunder.v sun.v superimpose.v supersede.v supplant.v supplement.v supply.v support.v suppress.v surmount.v surname.v surpass.v surround.v survey.v suspend.v sustain.v swamp.v swathe.v swat.v sweeten.v swig.v swindle.v swipe.v symbolize.v syncopate.v syndicate.v synthesize.v syphon.v systematize.v table.v tabulate.v tailor.v tail.v taint.v tame.v tamp.v tantalize.v target.v tar.v tattoo.v taunt.v tax.v tease.v telecast.v teleport.v telescope.v televise.v tender.v terrace.v terrify.v terrorize.v tessellate.v test-drive.v tether.v thank.v thatch.v thirst.v thread.v thumb.v thwart.v ticket.v tier.v tile.v till.v timeline.v time.v tint.v titillate.v toe.v tolerate.v torch.v torment.v torpedo.v torture.v tote.v tour.v tousle.v tout.v towel.v tow.v trademark.v trample.v tranquilize.v tranquillize.v transact.v transcend.v transcode.v transcribe.v transfix.v transform.v transfuse.v transgender.v transistorize.v transition.v transmit.v transmute.v transport.v transpose.v transship.v trap.v trash.v traverse.v treasure.v trick.v trigger.v trivialize.v trouble.v trounce.v truncate.v turbocharge.v tutor.v tweak.v twiddle.v typecast.v typify.v tyrannize.v unaffiliate.v unbalance.v unban.v unblock.v unbolt.v unbuckle.v unburden.v unbutton.v unclothe.v unclutter.v uncork.v uncouple.v uncover.v uncross.v undercharge.v underestimate.v underexpose.v underfund.v undergo.v underlie.v underline.v undermine.v underpay.v underpin.v underquote.v underrate.v underrepresent.v underscore.v undersell.v underserve.v undershoot.v undersign.v understate.v understock.v understudy.v undervalue.v underwrite.v undo.v unearth.v unencumber.v unfetter.v unfrock.v unfurl.v unhand.v unhinge.v unhook.v uninstall.v unlearn.v unleash.v unloose.v unmask.v unnerve.v unplug.v unrecord.v unsaddle.v unscramble.v unsettle.v unsheathe.v unveil.v unzip.v upbraid.v update.v upgrade.v uphold.v upholster.v uplift.v upright.v uproot.v upstage.v usher.v usurp.v utilize.v utter.v vacate.v vaccinate.v valet.v validate.v value.v vanquish.v varnish.v veil.v vend.v venerate.v ventilate.v vent.v verbalize.v veto.v vet.v vex.v victimize.v videotape.v vilify.v vindicate.v violate.v visa.v visualize.v vitiate.v vivisect.v vocalize.v voice.v void.v vouchsafe.v vulgarize.v wage.v waive.v wallop.v wall.v wangle.v ward.v warehouse.v warrant.v waste.v waterproof.v waylay.v wean.v weaponize.v weather.v wedge.v weight.v welcome.v wend.v westernize.v wet.v whack.v wheedle.v whet.v whitewash.v wield.v wiki.v wing.v winnow.v withhold.v withstand.v witness.v wolf.v woo.v word.v worm.v wound.v wreak.v wreck.v wrench.v wrest.v wrong.v zap.v zone.v link-grammar-4.7.4/data/en/words/words.n.2.x.wiki0000644000175000017500000000015111245352670020451 0ustar bloombloombasemen.n dodecahedra.n frontmen.n manga.n quanta.n radii.n statesmen.n subgenera.n tambon.n trivia.n link-grammar-4.7.4/data/en/words/words.v.5.10000644000175000017500000000136611245512213017413 0ustar bloombloomagonize.v barge.v bottom.v bow.v breeze.v brim.v cave.v caw.v clam.v clown.v crap.v crawl.v creep.v crop.v crouch.v cruise.v dart.v dive.v doze.v drift.v drone.v drowse.v fade.v fizzle.v flock.v flow.v foam.v gang.v gear.v goof.v gush.v hurry.v jet.v jog.v jut.v keel.v kneel.v knuckle.v lie.v limp.v linger.v listen.v loom.v lunge.v lurch.v mellow.v nestle.v opt.v peek.v peer.v perk.v peter.v pig.v pine.v plonk.v plop.v puff.v riffle.v rot.v ruck.v sally.v scoot.v scream.v scurry.v seep.v shack.v shine.v shop.v shrivel.v shy.v skid.v slack.v slave.v sleep.v slim.v slink.v slope.v slump.v soar.v soldier.v spurt.v squat.v step.v stoop.v stream.v stroll.v strut.v stumble.v swoop.v team.v tense.v toddle.v tramp.v trickle.v trudge.v veer.v waft.v zoom.v link-grammar-4.7.4/data/en/words/words.adv.20000644000175000017500000000141011526022265017551 0ustar bloombloomabsurdly additionally admittedly allegedly alternatively appallingly arguably assuredly astonishingly basically commonly conceivably consequentially contrastingly conveniently crucially curiously customarily disappointingly doubtless essentially fascinatingly fortunately hopefully ideally idiotically incidentally incontestably increasingly indeniably indisputably indubitably inevitably invariably lamentably lastly luckily meanwhile miraculously obviously ordinarily ostensibly paradoxically predictably preferably principally regrettably reportedly secondarily strictly supposedly surely tragically unavoidably uncannily uncharacteristically understandably undisputably unfortunately unluckily unquestionably contrarily namely neurologically coincidentally reversibly viz link-grammar-4.7.4/data/en/words/words.v.4.30000644000175000017500000010132011526022265017410 0ustar bloombloomabandoned.v-d abased.v-d abbreviated.v-d abducted.v-d abetted.v-d abhorred.v-d abolished.v-d abridged.v-d abrogated.v-d absorbed.v-d abstracted.v-d abused.v-d abutted.v-d accented.v-d accentuated.v-d accessed.v-d acclaimed.v-d accommodated.v-d accompanied.v-d accomplished.v-d accosted.v-d accredited.v-d accreted.v-d accustomed.v-d acerbated.v-d achieved.v-d acquainted.v-d acquired.v-d activated.v-d addicted.v-d addled.v-d addressed.v-d adjudged.v-d administered.v-d admired.v-d admonished.v-d adored.v-d adorned.v-d adulterated.v-d adumbrated.v-d aerated.v-d affected.v-d affixed.v-d afflicted.v-d aggrandized.v-d aggravated.v-d alienated.v-d allayed.v-d alleviated.v-d allocated.v-d allotted.v-d amassed.v-d ambushed.v-d ameliorated.v-d amended.v-d amortized.v-d amplified.v-d amputated.v-d anaesthetized.v-d anathematized.v-d anesthetized.v-d angered.v-d anglicized.v-d animated.v-d annealed.v-d annexed.v-d annihilated.v-d annointed.v-d annotated.v-d annulled.v-d anointed.v-d antagonized.v-d antedated.v-d anthologized.v-d anthropomorphized.v-d aped.v-d appalled.v-d appeased.v-d appended.v-d apportioned.v-d appraised.v-d apprehended.v-d apprenticed.v-d apprised.v-d appropriated.v-d armed.v-d aroused.v-d arraigned.v-d arrayed.v-d arrested.v-d arrogated.v-d ascribed.v-d asphalted.v-d asphyxiated.v-d aspirated.v-d assailed.v-d assassinated.v-d assaulted.v-d assayed.v-d assuaged.v-d atomized.v-d attacked.v-d attained.v-d attainted.v-d attenuated.v-d attired.v-d attracted.v-d attributed.v-d attuned.v-d audited.v-d augmented.v-d authenticated.v-d autographed.v-d automated.v-d avenged.v-d averred.v-d averted.v-d awaited.v-d awed.v-d axed.v-d backdated.v-d badgered.v-d baffled.v-d baited.v-d baked.v-d balanced.v-d baled.v-d bamboozled.v-d bandaged.v-d banished.v-d bankrupted.v-d banned.v-d baptized.v-d barbarized.v-d barbecued.v-d bared.v-d barrelled.v-d barricaded.v-d based.v-d bashed.v-d basted.v-d battered.v-d battled.v-d beaked.v-d beaned.v-d beatified.v-d beautified.v-d bedevilled.v-d befitted.v-d befouled.v-d befriended.v-d beggared.v-d beguiled.v-d beheaded.v-d beheld.v-d bejeweled.v-d belaboured.v-d belied.v-d belittled.v-d belted.v-d bemoaned.v-d benched.v-d bequeathed.v-d berated.v-d bereaved.v-d beseeched.v-d besieged.v-d besmirched.v-d bested.v-d bestirred.v-d bestowed.v-d bestrewed.v-d bestrode.v-d betokened.v-d betrayed.v-d bevelled.v-d bewailed.v-d bewildered.v-d bewitched.v-d biased.v-d bided.v-d biffed.v-d bilked.v-d billed.v-d billeted.v-d birched.v-d bisected.v-d blackballed.v-d blacklisted.v-d blackmailed.v-d bladed.v-d blamed.v-d blanketed.v-d blasted.v-d blazoned.v-d blemished.v-d blessed.v-d blighted.v-d blinded.v-d blindfolded.v-d blitzed.v-d blockaded.v-d blow-dried.v-d bludgeoned.v-d blue-pencilled.v-d blunted.v-d bolded.v-d bolstered.v-d bombarded.v-d bombed.v-d bookended.v-d boosted.v-d bossed.v-d botched.v-d boycotted.v-d braced.v-d bracketed.v-d braided.v-d brainwashed.v-d braised.v-d branded.v-d brandished.v-d braved.v-d breached.v-d breaded.v-d bribed.v-d bricked.v-d bridged.v-d briefed.v-d brined.v-d broached.v-d brocaded.v-d brokered.v-d bronzed.v-d brooked.v-d brutalized.v-d budgeted.v-d buffed.v-d bugged.v-d bulldozed.v-d bunged.v-d bungled.v-d buoyed.v-d burdened.v-d buried.v-d burlesqued.v-d bused.v-d busied.v-d butchered.v-d buttonholed.v-d buttressed.v-d by-passed.v-d bypassed.v-d cajoled.v-d calibrated.v-d camouflaged.v-d caned.v-d cannibalized.v-d canonised.v-d canonized.v-d caped.v-d capped.v-d captivated.v-d captured.v-d carbonized.v-d carbureted.v-d carded.v-d caressed.v-d caricatured.v-d carjacked.v-d carpeted.v-d cased.v-d castigated.v-d castrated.v-d catalogued.v-d catapulted.v-d categorized.v-d ceded.v-d cemented.v-d censored.v-d censured.v-d centralised.v-d centralized.v-d chagrined.v-d chained.v-d chaired.v-d championed.v-d channelled.v-d chaperoned.v-d charmed.v-d charted.v-d chartered.v-d chastened.v-d chastised.v-d cheapened.v-d checkmated.v-d cherished.v-d chided.v-d chiselled.v-d chlorinated.v-d chorded.v-d christened.v-d chromed.v-d chronicled.v-d circularized.v-d circumcised.v-d circumnavigated.v-d circumscribed.v-d circumvented.v-d cited.v-d civilized.v-d claded.v-d clamped.v-d classified.v-d clawed.v-d cleansed.v-d clenched.v-d clipped.v-d cloaked.v-d clobbered.v-d cloistered.v-d cloned.v-d closeted.v-d clothed.v-d clubbed.v-d coated.v-d co-authored.v-d coauthored.v-d cobbled.v-d cocked.v-d coddled.v-d coded.v-d codenamed.v-d codified.v-d coerced.v-d cofounded.v-d coined.v-d cold-shouldered.v-d collared.v-d collated.v-d collected.v-d collectivized.v-d collocated.v-d colocated.v-d colonized.v-d combated.v-d combatted.v-d comforted.v-d commandeered.v-d commemorated.v-d commended.v-d commercialized.v-d compacted.v-d compartmentalized.v-d compiled.v-d complemented.v-d completed.v-d complicated.v-d complimented.v-d composted.v-d compounded.v-d comprehended.v-d compressed.v-d comprised.v-d computerized.v-d concealed.v-d concerned.v-d conciliated.v-d concocted.v-d conditioned.v-d condoned.v-d configured.v-d confined.v-d confiscated.v-d conflated.v-d confounded.v-d confronted.v-d confused.v-d confuted.v-d congaed.v-d congratulated.v-d conjured.v-d conked.v-d conned.v-d connoted.v-d conquered.v-d conscripted.v-d consecrated.v-d conserved.v-d consigned.v-d consoled.v-d constituted.v-d constrained.v-d constricted.v-d constructed.v-d construed.v-d consumed.v-d consummated.v-d contacted.v-d contained.v-d contaminated.v-d contented.v-d contorted.v-d contoured.v-d contradicted.v-d contravened.v-d contrived.v-d controlled.v-d convected.v-d conventionalized.v-d conveyed.v-d convoked.v-d convoyed.v-d convulsed.v-d cooped.v-d co-opted.v-d coordinated.v-d copied.v-d co-produced.v-d copyrighted.v-d corded.v-d cordoned.v-d cored.v-d corked.v-d cornered.v-d corralled.v-d corrected.v-d corroborated.v-d countenanced.v-d counteracted.v-d counterbalanced.v-d counterfeited.v-d countermanded.v-d countersigned.v-d countersued.v-d coupled.v-d courted.v-d court-martialed.v-d coveted.v-d coxed.v-d cradled.v-d cramped.v-d craned.v-d crayoned.v-d creamed.v-d created.v-d credited.v-d cremated.v-d crimped.v-d crippled.v-d criticized.v-d crossbred.v-d cross-examined.v-d cross-fertilized.v-d cross-indexed.v-d cross-questioned.v-d crowned.v-d crucified.v-d crushed.v-d cubed.v-d cudgeled.v-d cuffed.v-d culled.v-d cultivated.v-d cupped.v-d curbed.v-d cured.v-d curried.v-d curtailed.v-d cushioned.v-d damaged.v-d damned.v-d dampened.v-d dandled.v-d daubed.v-d daunted.v-d dazed.v-d dazzled.v-d deadened.v-d deafened.v-d debarred.v-d debased.v-d debauched.v-d debilitated.v-d debited.v-d debriefed.v-d debugged.v-d debunked.v-d decanted.v-d decapitated.v-d decarbonized.v-d deceived.v-d decentralized.v-d decertified.v-d decimalized.v-d decimated.v-d deciphered.v-d decked.v-d declaimed.v-d declassified.v-d decoded.v-d decolonized.v-d decompressed.v-d deconsecrated.v-d decontaminated.v-d decorated.v-d decried.v-d decrypted.v-d dedicated.v-d deducted.v-d deeded.v-d deepthroated.v-d de-escalated.v-d defaced.v-d defamed.v-d defeated.v-d defended.v-d deferred.v-d defied.v-d defiled.v-d defined.v-d deflated.v-d deflowered.v-d defoliated.v-d deforested.v-d deformed.v-d defragmented.v-d defrauded.v-d defrayed.v-d defrocked.v-d defrosted.v-d defunded.v-d defused.v-d degraded.v-d dehumanized.v-d dehydrated.v-d de-iced.v-d deified.v-d delegated.v-d deleted.v-d delimited.v-d delineated.v-d delisted.v-d deluded.v-d deluged.v-d demagnetized.v-d demarcated.v-d demeaned.v-d demerged.v-d demilitarized.v-d demisted.v-d demobilized.v-d demolished.v-d demonized.v-d demoralized.v-d demoted.v-d demutualised.v-d denationalized.v-d denigrated.v-d denominated.v-d denoted.v-d denounced.v-d dented.v-d denuded.v-d deodorized.v-d depleted.v-d deplored.v-d deployed.v-d depopulated.v-d deported.v-d deposed.v-d deposited.v-d deprecated.v-d deprogrammed.v-d deranged.v-d derided.v-d desalinated.v-d desalinized.v-d desecrated.v-d desegregated.v-d desensitized.v-d deserted.v-d desiccated.v-d despatched.v-d despised.v-d despoiled.v-d destroyed.v-d detached.v-d detained.v-d detected.v-d deterred.v-d detested.v-d dethroned.v-d detuned.v-d devaluated.v-d devalued.v-d devastated.v-d devised.v-d devoted.v-d devoured.v-d dewatered.v-d diagnosed.v-d diced.v-d diddled.v-d diffracted.v-d dignified.v-d diluted.v-d directed.v-d disabled.v-d disaffiliated.v-d disallowed.v-d disappointed.v-d disarranged.v-d disassembled.v-d disassociated.v-d disavowed.v-d disbursed.v-d discarded.v-d disciplined.v-d disclaimed.v-d discomfited.v-d disconcerted.v-d disconnected.v-d discontented.v-d discounted.v-d discouraged.v-d discredited.v-d disdained.v-d disembarrassed.v-d disembowelled.v-d disenchanted.v-d disenfranchised.v-d disestablished.v-d disfavoured.v-d disfigured.v-d disfranchised.v-d disgorged.v-d disgraced.v-d disguised.v-d disheartened.v-d dishonoured.v-d disillusioned.v-d disinfected.v-d disinherited.v-d disinterred.v-d dislocated.v-d dislodged.v-d dismantled.v-d dismembered.v-d dismissed.v-d disobeyed.v-d disorientated.v-d disoriented.v-d disowned.v-d disparaged.v-d dispatched.v-d dispelled.v-d displaced.v-d displayed.v-d displeased.v-d dispossessed.v-d disproved.v-d disqualified.v-d disregarded.v-d disrupted.v-d dissected.v-d dissed.v-d disseminated.v-d dissociated.v-d dissuaded.v-d distanced.v-d distorted.v-d distracted.v-d distributed.v-d distrusted.v-d disturbed.v-d ditched.v-d diverted.v-d divested.v-d divorced.v-d divulged.v-d dizzied.v-d doctored.v-d doffed.v-d domesticated.v-d dominated.v-d donated.v-d donned.v-d doomed.v-d doped.v-d dotted.v-d double-checked.v-d double-crossed.v-d doused.v-d downed.v-d downgraded.v-d downloaded.v-d downplayed.v-d dragooned.v-d dramatized.v-d draped.v-d drenched.v-d drip-dried.v-d drubbed.v-d drugged.v-d dry-cleaned.v-d ducted.v-d dumbfounded.v-d dunked.v-d duped.v-d duplicated.v-d dusted.v-d dwarfed.v-d dyed.v-d dynamited.v-d earmarked.v-d earned.v-d eclipsed.v-d edified.v-d edited.v-d effaced.v-d effected.v-d elbowed.v-d electrified.v-d electrocuted.v-d electrolyzed.v-d elevated.v-d elicited.v-d elided.v-d eliminated.v-d elucidated.v-d eluded.v-d emancipated.v-d emasculated.v-d embalmed.v-d embargoed.v-d embedded.v-d embellished.v-d embezzled.v-d embittered.v-d emblazoned.v-d embodied.v-d emboldened.v-d embossed.v-d embraced.v-d embroiled.v-d emended.v-d emitted.v-d empanelled.v-d empowered.v-d emulated.v-d emulsified.v-d enacted.v-d enamelled.v-d encased.v-d enchanted.v-d encircled.v-d enclosed.v-d encoded.v-d encompassed.v-d encountered.v-d encrypted.v-d encumbered.v-d endangered.v-d endeared.v-d endorsed.v-d endowed.v-d enervated.v-d enfeoffed.v-d enfolded.v-d enforced.v-d enfranchised.v-d engendered.v-d engineered.v-d engraved.v-d engrossed.v-d engulfed.v-d enhanced.v-d enjoined.v-d enlarged.v-d enlightened.v-d enlivened.v-d enmeshed.v-d ennobled.v-d enraged.v-d enriched.v-d ensconced.v-d enshrined.v-d enshrouded.v-d enslaved.v-d ensnared.v-d ensouled.v-d entangled.v-d enthralled.v-d enthroned.v-d enthused.v-d entombed.v-d entrained.v-d entranced.v-d entrapped.v-d entreated.v-d entrusted.v-d entwined.v-d enumerated.v-d enveloped.v-d envied.v-d epitomized.v-d equalized.v-d equalled.v-d equated.v-d equipped.v-d eradicated.v-d eradicates.v-d erased.v-d erected.v-d eschewed.v-d escorted.v-d espied.v-d espoused.v-d esteemed.v-d eulogized.v-d evaded.v-d evicted.v-d evinced.v-d eviscerated.v-d evoked.v-d exacerbated.v-d exalted.v-d exasperated.v-d excavated.v-d exceeded.v-d excepted.v-d exchanged.v-d excised.v-d excluded.v-d excommunicated.v-d excoriated.v-d excreted.v-d exculpated.v-d excused.v-d executed.v-d exemplified.v-d exempted.v-d exerted.v-d exhausted.v-d exhibited.v-d exhilarated.v-d exhumed.v-d exiled.v-d exorcized.v-d expedited.v-d expelled.v-d expended.v-d experienced.v-d expiated.v-d explicated.v-d exploited.v-d exposed.v-d expropriated.v-d expunged.v-d expurgated.v-d extenuated.v-d exterminated.v-d externalized.v-d extinguished.v-d extirpated.v-d extolled.v-d extorted.v-d extracted.v-d extradited.v-d extricated.v-d exuded.v-d eyed.v-d fabricated.v-d facelifted.v-d faceted.v-d facilitated.v-d fagged.v-d faked.v-d falsified.v-d familiarized.v-d fancied.v-d fascinated.v-d fashioned.v-d fated.v-d fathomed.v-d fatigued.v-d faulted.v-d favorited.v-d favoured.v-d fazed.v-d feathered.v-d featured.v-d feigned.v-d felled.v-d fenced.v-d ferreted.v-d fertilized.v-d festooned.v-d feted.v-d fettered.v-d fianchettoed.v-d filleted.v-d finalized.v-d financed.v-d fine-tuned.v-d fingered.v-d firebombed.v-d flagellated.v-d flanked.v-d flattered.v-d flaunted.v-d flavoured.v-d flayed.v-d fleeced.v-d flicked.v-d flogged.v-d floodlit.v-d floored.v-d flouted.v-d fluffed.v-d flummoxed.v-d fluoridated.v-d flurried.v-d flustered.v-d foiled.v-d foisted.v-d fomented.v-d fonded.v-d fondled.v-d fooled.v-d force-fed.v-d forded.v-d forecasted.v-d foreordained.v-d foreshadowed.v-d foreshortened.v-d forestalled.v-d foretold.v-d forfeited.v-d forged.v-d formalized.v-d formulated.v-d fortified.v-d forwarded.v-d fostered.v-d founded.v-d framed.v-d franked.v-d frazzled.v-d freed.v-d frequented.v-d frescoed.v-d fricasseed.v-d fried.v-d frightened.v-d frisked.v-d frittered.v-d frogmarched.v-d frustrated.v-d fulfilled.v-d fumigated.v-d funded.v-d funnelled.v-d furbished.v-d furnished.v-d furrowed.v-d furthered.v-d gaged.v-d gainsaid.v-d galled.v-d galvanized.v-d gaoled.v-d garbed.v-d garbled.v-d garnered.v-d garnished.v-d garrisoned.v-d gashed.v-d gatecrashed.v-d gauged.v-d generated.v-d genericized.v-d gerrymandered.v-d ghettoized.v-d gilded.v-d ginned.v-d girded.v-d glaciated.v-d gladdened.v-d glamorized.v-d gleaned.v-d glimpsed.v-d glorified.v-d glutted.v-d goaded.v-d gored.v-d gorged.v-d grabbed.v-d graced.v-d graded.v-d grafted.v-d gratified.v-d gravelled.v-d greased.v-d greenlighted.v-d greeted.v-d grilled.v-d gripped.v-d gritted.v-d groined.v-d groomed.v-d grossed.v-d grudged.v-d guarded.v-d guided.v-d guillotined.v-d gummed.v-d gunned.v-d gutted.v-d guzzled.v-d gypped.v-d hallowed.v-d halted.v-d halved.v-d hampered.v-d hamstrung.v-d handcrafted.v-d handcuffed.v-d handicapped.v-d handled.v-d harangued.v-d harassed.v-d harbored.v-d harboured.v-d harmed.v-d harnessed.v-d harpooned.v-d harried.v-d harrowed.v-d harvested.v-d hassled.v-d haunted.v-d hawked.v-d hazarded.v-d hazed.v-d headquartered.v-d heaped.v-d hearted.v-d heartened.v-d heeded.v-d helmed.v-d heralded.v-d highjacked.v-d highlighted.v-d hijacked.v-d hindered.v-d hoaxed.v-d hobbled.v-d hocked.v-d hogged.v-d hollowed.v-d homesteaded.v-d homogenized.v-d honed.v-d honored.v-d honoured.v-d hooded.v-d hoodwinked.v-d horrified.v-d horsewhipped.v-d hosed.v-d hospitalized.v-d hosted.v-d hotfooted.v-d hounded.v-d housed.v-d hulled.v-d humbled.v-d humbugged.v-d humiliated.v-d humoured.v-d humped.v-d hunched.v-d hurled.v-d husked.v-d hyphenated.v-d hypnotized.v-d idealized.v-d identified.v-d idolized.v-d ignored.v-d ill-treated.v-d illuminated.v-d illumined.v-d illustrated.v-d imaged.v-d imbibed.v-d imbued.v-d imitated.v-d immersed.v-d immobilized.v-d immolated.v-d immortalized.v-d immunized.v-d impacted.v-d impaired.v-d impaled.v-d impanelled.v-d imparted.v-d impeached.v-d impeded.v-d imperilled.v-d impersonated.v-d implanted.v-d implemented.v-d implicated.v-d imported.v-d imposed.v-d impounded.v-d impoverished.v-d impregnated.v-d impressed.v-d imprinted.v-d imprisoned.v-d impugned.v-d imputed.v-d inactivated.v-d inaugurated.v-d incapacitated.v-d incarcerated.v-d incarnated.v-d incensed.v-d incinerated.v-d included.v-d inconvenienced.v-d incriminated.v-d inculcated.v-d incurred.v-d indemnified.v-d indentured.v-d indexed.v-d indicted.v-d individuated.v-d indoctrinated.v-d inducted.v-d infatuated.v-d infected.v-d infested.v-d infilled.v-d infiltrated.v-d inflamed.v-d inflated.v-d inflected.v-d inflicted.v-d influenced.v-d infuriated.v-d infused.v-d ingested.v-d ingratiated.v-d inhabited.v-d inherited.v-d inhibited.v-d initialled.v-d injected.v-d injured.v-d inked.v-d inoculated.v-d inscribed.v-d inseminated.v-d inserted.v-d inspected.v-d installed.v-d instated.v-d instigated.v-d instilled.v-d instituted.v-d institutionalized.v-d insulated.v-d insulted.v-d insured.v-d integrated.v-d intercepted.v-d interchanged.v-d interdicted.v-d interested.v-d interjected.v-d interleaved.v-d internalized.v-d internationalized.v-d interoperated.v-d interpolated.v-d interred.v-d interrogated.v-d interspersed.v-d intimidated.v-d intoned.v-d intoxicated.v-d introduced.v-d intuited.v-d inundated.v-d invaded.v-d invalidated.v-d invalided.v-d inveigled.v-d invented.v-d inverted.v-d invigorated.v-d invoked.v-d irked.v-d irradiated.v-d irrigated.v-d isolated.v-d italicized.v-d itemized.v-d iterated.v-d jailed.v-d jarred.v-d jeopardized.v-d jettisoned.v-d jilted.v-d jinxed.v-d jollied.v-d jugged.v-d juxtaposed.v-d kenned.v-d kidnapped.v-d kissed.v-d kneaded.v-d knifed.v-d knighted.v-d laced.v-d lacerated.v-d lacked.v-d lacquered.v-d lambasted.v-d laminated.v-d lampooned.v-d lanced.v-d landscaped.v-d lassoed.v-d lauded.v-d laundered.v-d lavished.v-d leached.v-d leapfrogged.v-d leased.v-d leavened.v-d legalized.v-d legitimatized.v-d lenited.v-d leveraged.v-d levered.v-d levied.v-d libelled.v-d liberalized.v-d liberated.v-d licenced.v-d likened.v-d limited.v-d lionized.v-d liquidized.v-d listed.v-d loaned.v-d loathed.v-d lobbed.v-d lofted.v-d looted.v-d lubricated.v-d lugged.v-d lulled.v-d lumped.v-d lured.v-d lynched.v-d maddened.v-d magnetized.v-d magnified.v-d maimed.v-d maligned.v-d maltreated.v-d manacled.v-d mandated.v-d mangled.v-d manhandled.v-d manicured.v-d manifested.v-d manipulated.v-d manned.v-d manufactured.v-d marginalised.v-d marginalized.v-d marketed.v-d marooned.v-d marred.v-d marshalled.v-d martyred.v-d mashed.v-d masked.v-d massaged.v-d mass-produced.v-d mastered.v-d masterminded.v-d masticated.v-d mauled.v-d maxed.v-d maximized.v-d measured.v-d mechanized.v-d medicated.v-d memorialized.v-d memorized.v-d menaced.v-d merited.v-d mesmerized.v-d microfilmed.v-d miffed.v-d milked.v-d mimeographed.v-d mimicked.v-d minced.v-d miniaturized.v-d minimized.v-d minted.v-d mired.v-d mirrored.v-d misapplied.v-d misapprehended.v-d misappropriated.v-d misconceived.v-d misconstrued.v-d misdated.v-d misdirected.v-d misgoverned.v-d misguided.v-d mishandled.v-d misheard.v-d misinformed.v-d misinterpreted.v-d mislaid.v-d misled.v-d mismanaged.v-d misnamed.v-d misplaced.v-d mispronounced.v-d misquoted.v-d misrepresented.v-d misspelled.v-d misspent.v-d misstated.v-d mistranslated.v-d mistreated.v-d mistrusted.v-d misused.v-d mitigated.v-d mobbed.v-d mocked.v-d modeled.v-d modified.v-d modulated.v-d molded.v-d molested.v-d mollified.v-d mollycoddled.v-d monitored.v-d monopolized.v-d montaged.v-d moored.v-d mooted.v-d morphed.v-d mortared.v-d mortgaged.v-d mortified.v-d mothballed.v-d mothproofed.v-d motorized.v-d muddied.v-d muffed.v-d muffled.v-d mugged.v-d mulched.v-d multiplexed.v-d murdered.v-d mustered.v-d muted.v-d mutilated.v-d muzzled.v-d myspaced.v-d mystified.v-d nabbed.v-d nagged.v-d namespaced.v-d narrated.v-d nationalized.v-d naturalized.v-d needled.v-d negated.v-d netted.v-d nettled.v-d neutered.v-d neutralized.v-d nicked.v-d nicknamed.v-d nixed.v-d noogied.v-d normalized.v-d normed.v-d notarized.v-d notated.v-d nourished.v-d novelised.v-d novelized.v-d nudged.v-d nullified.v-d numbed.v-d numbered.v-d nursed.v-d nurtured.v-d obfuscated.v-d obligated.v-d obliterated.v-d obscured.v-d obstructed.v-d obtained.v-d obviated.v-d occasioned.v-d occupied.v-d offended.v-d offloaded.v-d oiled.v-d okayed.v-d omened.v-d omitted.v-d oppressed.v-d orchestrated.v-d ordained.v-d organized.v-d orientated.v-d oriented.v-d ornamented.v-d ostracized.v-d ousted.v-d outbalanced.v-d outclassed.v-d outdistanced.v-d outfitted.v-d outflanked.v-d outfought.v-d outfoxed.v-d outlasted.v-d outlawed.v-d outlined.v-d outlived.v-d outmanoeuvred.v-d outnumbered.v-d outplayed.v-d outraged.v-d outranked.v-d outran.v-d outrighted.v-d outscored.v-d outshone.v-d outsmarted.v-d outsourced.v-d outstayed.v-d outvoted.v-d outweighed.v-d outwitted.v-d overawed.v-d overbore.v-d overburdened.v-d overcooked.v-d overcrowded.v-d overdubed.v-d overemphasized.v-d overestimated.v-d overexerted.v-d overexposed.v-d overgrazed.v-d overhauled.v-d overheard.v-d overleaped.v-d overloaded.v-d overlooked.v-d overpaid.v-d overplayed.v-d overpopulated.v-d overpowered.v-d overpraised.v-d overprinted.v-d overrated.v-d overruled.v-d overshadowed.v-d overshot.v-d oversimplified.v-d overstated.v-d overstayed.v-d overstepped.v-d overstocked.v-d overstrained.v-d oversubscribed.v-d overtaxed.v-d overvalued.v-d overwhelmed.v-d overwroted.v-d owned.v-d oxygenated.v-d pacified.v-d packaged.v-d padded.v-d padlocked.v-d paged.v-d pained.v-d palatalized.v-d pampered.v-d papered.v-d parallelized.v-d parallelled.v-d paralysed.v-d paralyzed.v-d parametrized.v-d paraphrased.v-d parched.v-d pardoned.v-d pared.v-d parodied.v-d paroled.v-d parried.v-d partitioned.v-d partnered.v-d pasted.v-d pasteurized.v-d patented.v-d patrolled.v-d patronized.v-d patted.v-d patterned.v-d pauperized.v-d pawed.v-d pawned.v-d pedestrianized.v-d pegged.v-d pelted.v-d penalized.v-d pencilled.v-d peppered.v-d perfected.v-d perforated.v-d perfumed.v-d perfused.v-d perjured.v-d permeated.v-d permed.v-d permuted.v-d perpetrated.v-d perpetuated.v-d perplexed.v-d persecuted.v-d personalized.v-d personified.v-d perturbed.v-d perused.v-d pervaded.v-d perverted.v-d pestered.v-d petted.v-d photocopied.v-d photographed.v-d photosensitized.v-d photostatted.v-d phrased.v-d pickled.v-d pictured.v-d pierced.v-d pigeonholed.v-d pigmented.v-d pilfered.v-d piloted.v-d pinched.v-d pinpointed.v-d piped.v-d pipped.v-d piqued.v-d pirated.v-d pitchforked.v-d pitied.v-d pitted.v-d placated.v-d placed.v-d plagiarized.v-d plagued.v-d planted.v-d plastered.v-d pleased.v-d plied.v-d plumbed.v-d pluralized.v-d pocketed.v-d podcasted.v-d poisoned.v-d polarized.v-d policed.v-d polished.v-d politicized.v-d pollinated.v-d polluted.v-d pondered.v-d pooh-poohed.v-d pooled.v-d popularized.v-d populated.v-d portaged.v-d ported.v-d portended.v-d positioned.v-d possessed.v-d postdated.v-d posted.v-d postmarked.v-d postponed.v-d powdered.v-d praised.v-d prearranged.v-d preceded.v-d precipitated.v-d precluded.v-d preconceived.v-d predestined.v-d predetermined.v-d predicated.v-d predisposed.v-d pre-empted.v-d preempted.v-d preened.v-d prefabricated.v-d prefaced.v-d prefigured.v-d preformed.v-d preheated.v-d prejudged.v-d prejudiced.v-d premeditated.v-d premised.v-d preoccupied.v-d preordained.v-d prepaid.v-d prerecorded.v-d prerendered.v-d presaged.v-d prescribed.v-d presented.v-d preserved.v-d presorted.v-d pressurized.v-d prestressed.v-d prettified.v-d prevented.v-d priced.v-d prided.v-d primed.v-d printed.v-d privileged.v-d prized.v-d probed.v-d processed.v-d proctored.v-d procured.v-d prodded.v-d produced.v-d proffered.v-d profiled.v-d prognosticated.v-d prohibited.v-d prolonged.v-d promoted.v-d promulgated.v-d pronounced.v-d pronounces.v-d proofed.v-d propelled.v-d proportioned.v-d propositioned.v-d propounded.v-d proscribed.v-d prosecuted.v-d prostituted.v-d prostrated.v-d protected.v-d pruned.v-d psychoanalysed.v-d psychoanalyzed.v-d publicized.v-d published.v-d pulverized.v-d pummelled.v-d punctuated.v-d punished.v-d purchased.v-d pureed.v-d purified.v-d purloined.v-d pursed.v-d pursued.v-d purveyed.v-d quaffed.v-d quantified.v-d quarantined.v-d quarterbacked.v-d quartered.v-d quashed.v-d quelled.v-d quenched.v-d queried.v-d quilted.v-d quoted.v-d radicalized.v-d raffled.v-d raided.v-d railroaded.v-d rammed.v-d ramped.v-d ransacked.v-d ransomed.v-d raped.v-d ratified.v-d rationalized.v-d rationed.v-d ravaged.v-d ravished.v-d razed.v-d reacquainted.v-d re-addressed.v-d readmitted.v-d reaped.v-d reappointed.v-d rearranged.v-d reassessed.v-d reauthorized.v-d rebadged.v-d rebooted.v-d rebranded.v-d rebroadcasted.v-d rebuffed.v-d rebuked.v-d rebutted.v-d recaptured.v-d recessed.v-d rechristened.v-d recited.v-d reclaimed.v-d recolored.v-d recommitted.v-d recompensed.v-d reconciled.v-d reconditioned.v-d reconquered.v-d reconsecrated.v-d reconsidered.v-d reconstructed.v-d reconvicted.v-d recouped.v-d recreated.v-d rectified.v-d recused.v-d recuted.v-d recycled.v-d redecorated.v-d redeemed.v-d redefined.v-d redeployed.v-d redesignated.v-d redesigned.v-d redeveloped.v-d rediscovered.v-d redistributed.v-d redrafted.v-d redrawed.v-d redressed.v-d redrew.v-d redshirted.v-d reduced.v-d reduplicated.v-d re-educated.v-d reemployed.v-d reenacted.v-d reequiped.v-d re-established.v-d reestablished.v-d refashioned.v-d refilled.v-d refinanced.v-d refined.v-d reflexed.v-d reformulated.v-d refracted.v-d refreshed.v-d refrigerated.v-d refunded.v-d refurbished.v-d refurnished.v-d refuted.v-d regained.v-d regaled.v-d regimented.v-d regraded.v-d regularized.v-d regulated.v-d regurgitated.v-d rehabilitated.v-d rehashed.v-d rehired.v-d rehoused.v-d reignited.v-d reimagined.v-d reimbursed.v-d reinforced.v-d reinstalled.v-d reinstated.v-d reinsured.v-d reintegrated.v-d reinterpreted.v-d reinvented.v-d reinvigorated.v-d reissued.v-d rejected.v-d rejoined.v-d rejuvenated.v-d relaunched.v-d relayed.v-d released.v-d relegated.v-d relieved.v-d relinquished.v-d relished.v-d relisted.v-d relived.v-d reloaded.v-d remanded.v-d remastered.v-d rematched.v-d remedied.v-d remilitarized.v-d remixed.v-d remodelled.v-d remolded.v-d remoulded.v-d removed.v-d remunerated.v-d renewed.v-d renominated.v-d renounced.v-d renovated.v-d renumbered.v-d reoccupied.v-d reorientated.v-d reoriented.v-d repackaged.v-d repainted.v-d repatriated.v-d repealed.v-d repelled.v-d rephotographed.v-d rephrased.v-d replaced.v-d replanted.v-d replastered.v-d replayed.v-d replenished.v-d replicated.v-d reprehended.v-d represented.v-d repressed.v-d reprieved.v-d reprimanded.v-d reprinted.v-d reproached.v-d reproofed.v-d reproved.v-d repudiated.v-d repulsed.v-d repurchased.vv-d repurposed.v-d reputed.v-d requisitioned.v-d rereleased.v-d rerolled.v-d rerouted.v-d rescheduled.v-d rescinded.v-d rescued.v-d researched.v-d reseated.v-d resembled.v-d resented.v-d reserved.v-d reshaped.v-d reshuffled.v-d resited.v-d resold.v-d resoled.v-d respected.v-d restated.v-d restocked.v-d restored.v-d restrained.v-d restricted.v-d restructured.v-d restyled.v-d resubmited.v-d resurrected.v-d retained.v-d retarded.v-d reted.v-d rethought.v-d retitled.v-d retold.v-d retouched.v-d retraced.v-d retracted.v-d retransmitted.v-d retried.v-d retrieved.v-d retryed.v-d revalued.v-d revamped.v-d revered.v-d reveted.v-d reviewed.v-d reviled.v-d revised.v-d revisited.v-d revitalized.v-d revoked.v-d revolutionized.v-d rewarded.v-d rewatered.v-d rewired.v-d reworded.v-d ribbed.v-d riddled.v-d ridiculed.v-d rifled.v-d righted.v-d rimmed.v-d rivaled.v-d rivalled.v-d riveted.v-d romanized.v-d romanticized.v-d roped.v-d routed.v-d rubberized.v-d rubber-stamped.v-d rued.v-d ruined.v-d rumpled.v-d rusticated.v-d sabotaged.v-d sacked.v-d saddened.v-d saddled.v-d safeguarded.v-d salted.v-d salvaged.v-d sampled.v-d sanctified.v-d sanctioned.v-d sandblasted.v-d sanded.v-d sandpapered.v-d sandwiched.v-d sapped.v-d satiated.v-d satirised.v-d satirized.v-d satisfied.v-d saturated.v-d sauteed.v-d savaged.v-d savoured.v-d scalded.v-d scalped.v-d scandalized.v-d scanted.v-d scarpered.v-d scarred.v-d scented.v-d scheduled.v-d schooled.v-d scooped.v-d scorched.v-d scorned.v-d scotched.v-d scoured.v-d scrapped.v-d scrunched.v-d scrutinized.v-d sculpted.v-d scuttled.v-d seared.v-d seasoned.v-d seated.v-d seconded.v-d secreted.v-d secularized.v-d secured.v-d sedated.v-d seduced.v-d seeded.v-d segregated.v-d selected.v-d sensationalized.v-d sensitized.v-d sentimentalized.v-d sequestered.v-d serenaded.v-d serialized.v-d serviced.v-d shackled.v-d shadowed.v-d shampooed.v-d shapeshifted.v-d shared.v-d sharpened.v-d sheared.v-d sheathed.v-d sheltered.v-d shelved.v-d shepherded.v-d shielded.v-d shingled.v-d shirked.v-d shocked.v-d shooed.v-d short-changed.v-d shortlisted.v-d shouldered.v-d shovelled.v-d showcased.v-d shredded.v-d shrouded.v-d shucked.v-d shunned.v-d shunted.v-d shuttered.v-d sicked.v-d sickened.v-d sidelined.v-d sidestepped.v-d sidetracked.v-d sieved.v-d sighted.v-d signposted.v-d silenced.v-d silhouetted.v-d simplified.v-d simulated.v-d simulcasted.v-d siphoned.v-d sired.v-d skewered.v-d skinned.v-d skippered.v-d skirted.v-d slaked.v-d slandered.v-d slapped.v-d slashed.v-d slated.v-d slaughtered.v-d sleeved.v-d sliced.v-d slighted.v-d slotted.v-d slugged.v-d slung.v-d slurred.v-d smelted.v-d smothered.v-d snagged.v-d snared.v-d snubbed.v-d socked.v-d sodomized.v-d soft-pedalled.v-d soiled.v-d soldered.v-d solicited.v-d solved.v-d soothed.v-d soundproofed.v-d souped.v-d sourced.v-d soused.v-d spaded.v-d spanked.v-d spanned.v-d spared.v-d spayed.v-d speared.v-d spearheaded.v-d specified.v-d spewed.v-d spiked.v-d spin-dried.v-d spirited.v-d spited.v-d sponsored.v-d spoonfed.v-d spotlighted.v-d spotted.v-d sprained.v-d sprayed.v-d sprinkled.v-d spurned.v-d squandered.v-d squelched.v-d squired.v-d stabbed.v-d staffed.v-d staged.v-d stalemated.v-d standardized.v-d stapled.v-d starched.v-d startled.v-d stashed.v-d stationed.v-d staunched.v-d steamrollered.v-d steeled.v-d stereotyped.v-d sterilized.v-d stiffed.v-d stigmatized.v-d stilled.v-d stimulated.v-d stitched.v-d stockaded.v-d stoked.v-d stomached.v-d stoned.v-d stored.v-d storyboarded.v-d stowed.v-d straddled.v-d strafed.v-d straitened.v-d strangled.v-d strapped.v-d streamlined.v-d strewed.v-d stroked.v-d structured.v-d stubbed.v-d stuccoed.v-d studded.v-d stunned.v-d stunted.v-d styled.v-d stylized.v-d stymied.v-d subdued.v-d subedited.v-d subjected.v-d subjugated.v-d sublimated.v-d subordinated.v-d subpoenaed.v-d subserved.v-d subsidized.v-d substantiated.v-d subsumed.v-d subtended.v-d subtracted.v-d subverted.v-d succoured.v-d suckled.v-d suffused.v-d suicided.v-d suited.v-d sullied.v-d summarized.v-d summoned.v-d sundered.v-d sunned.v-d superimposed.v-d superseded.v-d supplanted.v-d supplemented.v-d supplied.v-d supported.v-d suppressed.v-d surmounted.v-d surnamed.v-d surpassed.v-d surrounded.v-d surveyed.v-d suspended.v-d sustained.v-d swamped.v-d swathed.v-d swatted.v-d sweetened.v-d swigged.v-d swindled.v-d swiped.v-d symbolized.v-d syncopated.v-d syndicated.v-d synthesized.v-d syphoned.v-d systematized.v-d tabled.v-d tabulated.v-d tailed.v-d tailored.v-d tainted.v-d tamed.v-d tamped.v-d tantalized.v-d targeted.v-d tarred.v-d tattooed.v-d taunted.v-d taxed.v-d teased.v-d telecasted.v-d teleported.v-d telescoped.v-d televised.v-d tendered.v-d terraced.v-d terrified.v-d terrorized.v-d tessellated.v-d tethered.v-d thanked.v-d thatched.v-d thirsted.v-d threaded.v-d thumbed.v-d thwarted.v-d ticketed.v-d tiered.v-d tiled.v-d tilled.v-d timed.v-d timelined.v-d tinted.v-d titillated.v-d toed.v-d tolerated.v-d torched.v-d tormented.v-d torpedoed.v-d tortured.v-d toted.v-d toured.v-d tousled.v-d touted.v-d towed.v-d towelled.v-d trademarked.v-d trampled.v-d tranquilized.v-d tranquillized.v-d transacted.v-d transcended.v-d transcoded.v-d transcribed.v-d transfixed.v-d transformed.v-d transfused.v-d transgendered.v-d transistorized.v-d transitioned.v-d transmitted.v-d transmuted.v-d transported.v-d transposed.v-d transshipped.v-d trapped.v-d trashed.v-d traversed.v-d treasured.v-d tricked.v-d triggered.v-d trivialized.v-d troubled.v-d trounced.v-d truncated.v-d turbocharged.v-d tutored.v-d tweaked.v-d twiddled.v-d typified.v-d tyrannized.v-d unaffiliated.v-d unbalanced.v-d unbanned.v-d unblocked.v-d unbolted.v-d unbuckled.v-d unburdened.v-d unbuttoned.v-d unclothed.v-d uncluttered.v-d uncorked.v-d uncoupled.v-d uncovered.v-d uncrossed.v-d undercharged.v-d underestimated.v-d underexposed.v-d underfunded.v-d underlay.v-d underlined.v-d undermined.v-d underpaid.v-d underpinned.v-d underquoted.v-d underrated.v-d underrepresented.v-d underscored.v-d underserved.v-d undershot.v-d undersigned.v-d undersold.v-d understated.v-d understocked.v-d understudied.v-d undervalued.v-d unearthed.v-d unencumbered.v-d unfettered.v-d unfrocked.v-d unfurled.v-d unhanded.v-d unhinged.v-d unhooked.v-d uninstalled.v-d unlearned.v-d unleashed.v-d unloosed.v-d unmasked.v-d unnerved.v-d unplugged.v-d unrecorded.v-d unsaddled.v-d unscrambled.v-d unsettled.v-d unsheathed.v-d unveiled.v-d unzipped.v-d upbraided.v-d updated.v-d upgraded.v-d upheld.v-d upholstered.v-d uplifted.v-d uprighted.v-d uprooted.v-d upstaged.v-d ushered.v-d usurped.v-d utilized.v-d uttered.v-d vacated.v-d vaccinated.v-d valeted.v-d validated.v-d valued.v-d vanquished.v-d varnished.v-d veiled.v-d vended.v-d venerated.v-d vented.v-d ventilated.v-d verbalized.v-d vetoed.v-d vetted.v-d vexed.v-d victimized.v-d videotaped.v-d vilified.v-d vindicated.v-d violated.v-d visaed.v-d visualized.v-d vitiated.v-d vivisected.v-d vocalized.v-d voiced.v-d voided.v-d vouchsafed.v-d vulgarized.v-d waged.v-d waived.v-d walled.v-d walloped.v-d wangled.v-d warded.v-d warehoused.v-d warranted.v-d wasted.v-d waterproofed.v-d waylaid.v-d weaned.v-d weaponized.v-d weathered.v-d wedged.v-d weighted.v-d welcomed.v-d wended.v-d westernized.v-d wetted.v-d whacked.v-d wheedled.v-d whetted.v-d whiled.v-d whitewashed.v-d wielded.v-d wikied.v-d winged.v-d winnowed.v-d withheld.v-d withstood.v-d witnessed.v-d wolfed.v-d wooed.v-d worded.v-d wormed.v-d wounded.v-d wreaked.v-d wrecked.v-d wrenched.v-d wrested.v-d wronged.v-d zapped.v-d zoned.v-d link-grammar-4.7.4/data/en/words/words.v.8.30000644000175000017500000000245711526022265017427 0ustar bloombloomauctioned.v-d bandied.v-d barred.v-d battened.v-d blocked.v-d blotted.v-d blurted.v-d boarded.v-d booked.v-d bottled.v-d bundled.v-d buttered.v-d caged.v-d carried.v-d carted.v-d chalked.v-d chased.v-d chucked.v-d cluttered.v-d covered.v-d cranked.v-d dammed.v-d dished.v-d divided.v-d doled.v-d dredged.v-d dumped.v-d egged.v-d eked.v-d exported.v-d factored.v-d faxed.v-d fixed.v-d flinged.v-d flung.v-d fobbed.v-d gouged.v-d hammed.v-d hashed.v-d hoisted.v-d jacked.v-d jazzed.v-d jotted.v-d kicked.v-d ladled.v-d laid.v-d lifted.v-d linked.v-d loaded.v-d locked lopped.v-d mailed.v-d mapped.v-d marked.v-d meted.v-d mulled.v-d mussed.v-d nailed.v-d palmed.v-d patched.v-d paved.v-d penned.v-d phased.v-d phoned.v-d picked.v-d pieced.v-d pinned.v-d plugged.v-d pricked.v-d propped.v-d punched.v-d pushed.v-d racked.v-d reined.v-d rigged.v-d riled.v-d rinsed.v-d roughed.v-d roughened.v-d saved.v-d scaled.v-d scared.v-d screened.v-d shook.v-d shored.v-d singled.v-d sized.v-d skimmed.v-d skittled.v-d smuggled.v-d sopped.v-d sorted spiced.v-d stacked.v-d staked.v-d staved.v-d stringed.v-d strung.v-d stuffed.v-d sussed.v-d swept.v-d tacked.v-d taped.v-d throwed.v-d tided.v-d tied.v-d topped.v-d totaled.v-d totalled.v-d touched.v-d toughened.v-d tracked.v-d wadded.v-d washed.v-d waved.v-d wrung.v-d yanked.v-d zipped.v-d link-grammar-4.7.4/data/en/words/words.adv.30000644000175000017500000000457511245551452017574 0ustar bloombloomacademically.e actuarially.e administratively.e aesthetically.e aetiopathogenetically.e agriculturally.e agricuturally.e algebraically.e allegorically.e anatomically.e archeologically.e architecturally.e arithmetically.e artistically.e assumedly.e astronomically.e athletically.e atypically.e behaviorally.e biblically.e biochemically.e biologically.e biotically.e bipedally.e carnally.e chemically.e clandestinely.e climatically.e cognitively.e collegiately.e colonially.e computationally.e conceptually.e contractually.e cryogenically.e cryptographically.e cytochemically.e ecclesiastically.e ecologically.e economically.e educationally.e electorally.e empirically.e environmentally.e equidistantly.e esthetically.e ethically.e ethnically.e ethnoculturally.e factually.e federally.e financially.e finitely.e genealogically.e generically.e genetically.e geographically.e geologically.e geometrically.e governmentally.e grammatically.e gynaecologically.e harmonically.e heretofore:.e histochemically.e historically.e hydraulically.e immunophenotypically.e infinitesimally.e institutionally.e journalistically.e judicially.e lastingly.e legendarily.e linguistically.e logically.e logistically.e maddeningly.e materially.e mathematically.e medically.e medicinally.e metaphysically.e meteorologically.e methodologically.e morally.e morbidly.e mystically.e nonspecifically.e nutritionally.e opportunistically.e optically.e organizationally.e overridingly.e pathogenetically.e perceptually.e perpendicularly.e pharmacologically.e phenomenologically.e philosophically.e phonetically.e phonologically.e photographically.e pictorially.e pinnately.e politically.e pragmatically.e priestly.e princely.e probabilistically.e prognostically.e pseudomorphically.e pseudonymously.e psionically.e psychically.e psychologically.e publically.e putatively.e quadratically.e questionably.e racially.e recreationally.e recursively.e revolutionally.e rhythmically.e ritually.e scientifically.e semantically.e sexually.e socially.e societally.e sociologically.e sonically.e spatially.e spherically.e spirally.e statistically.e statutorily.e steganographically.e stereotypically.e structurally.e stylistically.e supernaturally.e syllabically.e synonymously.e synoptically.e syntactically.e tangentially.e taxonomically.e technologically.e telepathically.e terrestrially.e theologically.e theoretically.e therapeutically.e topographically.e wirelessly.e link-grammar-4.7.4/data/en/words/words-medical.v.4.10000644000175000017500000010221711246771267021024 0ustar bloombloomabash.v abjure.v ablate.v abnegate.v abominate.v abscess.v abscise.v absent.v acccouter.v accession.v acclimatise.v accouple.v accoutre.v acetify.v acetonate.v acetonize.v acetylate.v acetylise.v acetylize.v ace.v achromatise.v achromatize.v acidulate.v actualise.v actualize.v actuate.v acylate.v adduct.v adenosine_diphosphate-ribosylate adjure.v administrate.v admix.v ADP-ribosylate.v adrenalectomize.v adsorb.v adulate.v advantage.v afforest.v affront.v afterload.v agglomerate.v aggrieve.v agonise.v airbrush.v alcoholise.v alcoholize.v alias.v aline.v aliquot.v alite.v alkalinise.v alkalinize.v alkalise.v alkalize.v alkylate.v allelotype.v allergize.v allograft.v alloimmunise.v alloimmunize.v allotransplant.v alloy.v allure.v alphabetise.v alphabetize.v aluminate.v Americanise.v amidate.v aminate.v aminoacylate.v ammoniate.v amortise.v anaesthetise.v anatomize.v anergise.v anesthetise.v anglicise.v animadvert.v annexe.v annualise.v annualize.v annunciate.v anodise.v anodize.v anonymise.v anonymize.v anoxiate.v antagonise.v anteriorise.v anteriorize.v ante.v antiaggregate.v anticoagulate.v antigenise.v antigenize.v antirepress.v antisepticise.v antisepticize.v apease.v apodize.v apologise.v apostatise.v appall.v appal.v apparell.v apparel.v apport.v appose.v apprize.v arborise.v archive.v arck.v arc.v aromatise.v aromatize.v arsonate.v arterialize.v article.v asexualize.v asperge.v asperse.v asseverate.v asterisk.v atomise.v attitudinise.v audiotape.v auscultate.v author.v autocatalyse.v autoclave.v autogenerate.v autoimmunise.v autoimmunize.v autoinduce.v autoinduct.v autoinject.v autolise.v automatise.v autoperfuse.v autopsy.v autoradiograph.v autoregulate.v autosensitise.v autotransplant.v auxotype.v avalanche.v avianise.v avianize.v avow.v avulse.v awake.v axotomise.v axotomize.v azotize.v baby.v backcross.v backdrop.v backlabel.v backscatter.v ballast.v ballot.v ball.v baptise.v barber.v bariumize.v barrack.v barrage.v bastardize.v ba.v bayonet.v beach.v bead.v beaver.v bedaub.v bedeck.v bed.v behoove.v behove.v beleaguer.v bell.v benefice.v benzoylate.v bereve.v besmear.v betroth.v better.v biasse.v bib.v bicompartmentalise.v binge.v bing.v bioactivate.v bioassay.v bioconvert.v bioengineer.v biomagnify.v bio-monitor.v biomonitor.v biopsy.v bioreduce.v bioremediate.v biosynthesise.v biosynthesize.v biotinylate.v biotransform.v biotype.v bisintercalate.v bivouack.v black.v blanco.v blank.v blob.v blood.v bloody.v blue.v bluster.v boat.v bobsled.v boob.v boomerang.v booster.v bootstrap.v bottleneck.v brain.v brain-wash.v braze.v breakfast.v breast-feed.v breast.v brevet.v broadside.v brod.v bromate.v brominate.v bromize.v bruit.v brutalise.v bucket.v buffer.v bulbectomize.v bulk.v bull.v bunker.v burke.v burk.v burr.v buss.v cache.v cak.v calender.v caliper.v calk.v calliper.v calumniate.v canalize.v cancerise.v canker.v cannulate.v cannulize.v canopy.v cantilever.v cant.v capacitate.v capillarise.v capitalise.v capitate.v caponise.v caponize.v captain.v carbamoylate.v carbamylate.v carbolate.v carbolise.v carbolize.v carbonate.v carbonise.v carboxylate.v cardiectomize.v career.v cartoon.v cashier.v catabolise.v catalise.v catalize.v catalog.v catalyse.v catalyze.v categorise.v catheterise.v catheterize.v caulk.v causticize.v cauterise.v cauterize.v cavitate.v C-band.v cementify.v centrifugalise.v centrifugalize.v centrifugate.v centrifuge.v cere.v certificate.v chaff.v chamfer.v champ.v chance.v chaperone.v chap.v characterise.v charbroil.v checker.v cheek.v chemoattract.v chemo-prevent.v chemoprevent.v chemo-sensitise.v chemo-sensitize.v chemosensitize.v chequer.v chicken.v chine.v chink.v chin.v chlore.v chloroformise.v chloroformize.v chloroform.v chlor.v chock.v cholecystectomise.v cholecystectomize.v chorus.v chromate.v chromatize.v chromatograph.v chromicize.v chunk.v chute.v cicatrise.v cicatrize.v cipher.v circularise.v circumduct.v civilise.v class.v clear-cut.v clearcut.v clew.v clock.v clout.v clue.v clysterize.v coactivate.v coadminister.v co-agglutinate.v co-apply.v coapply.v coapt.v coarticulate.v co-assemble.v coassemble.v cocainise.v cocainize.v co-calibrate.v cocalibrate.v co-chromatograph.v cochromatograph.v co-circulate.v co-cluster.v cocluster.v co-colonize.v cocolonize.v cocoon.v co-crystallize.v cocrystallize.v co-cultivate.v cocultivate.v coculture.v co-develop.v co-electroporate.v coelectroporate.v coelute.v co-encapsidate.v coencapsidate.v coencapsulate.v co-enrich.v coenrich.v co-exist.v co-expose.v coexpose.v coexpress.v co-extract.v cograft.v cogwheel.v co-hybridise.v cohybridise.v co-hybridize.v cohybridize.v coimmobilise.v coimmobilize.v coinfect.v coinfuse.v co-ingest.v coingest.v co-inherit.v coinherit.v co-inoculate.v coinoculate.v coke.v collateralise.v collectivise.v colliquate.v colonise.v colonoscope.v colorise.v colorize.v colourize.v co-manage.v comanage.v comedicate.v cometabolise.v commercialise.v compartmentalise.v compartment.v compass.v compeer.v complex.v comport.v computerise.v concatenate.v conceptualise.v concord.v concrete.v concuss.v condole.v conduce.v cond.v conglomerate.v conglutinate.v consternate.v constitutionalize.v contradistinguish.v contraindicate.v controvert.v contund.v contuse.v convolute.v co-ordinate.v co-oxidise.v cooxidise.v co-oxidize.v cooxidize.v co-partition.v co-perfuse.v coperfuse.v copolymerise.v copolymerize.v copper.v coproduce.v co-promote.v copromote.v corbell.v corbel.v co-rear.v corear.v co-register.v co-regulate.v coregulate.v co-release.v corelease.v corkscrew.v cornify.v corn.v co-secrete.v cosecrete.v cosegregate.v cosensitise.v cosensitize.v cosh.v cosolubilise.v cosolubilize.v co-sponsor.v cosponsor.v cosset.v costarr.v co-stimulate.v costimulate.v co-store.v costore.v co-synthesise.v cosynthesise.v co-synthesize.v cosynthesize.v co-transcribe.v cotranscribe.v cotransfect.v cotransferr.v co-transfer.v cotransfer.v cotransform.v cotransmit.v co-transport.v cotransport.v co-treat.v cotreat.v coulorise.v counterpoise.v counterregulate.v countersink.v counterstain.v counter-transport.v countertransport.v countervail.v course.v covenant.v cow.v cozen.v crabb.v craft.v crape.v crater.v crate.v crepe.v crew.v crick.v criminalise.v criminalize.v crimson.v crisp.v criss-cross.v cristallise.v cristallize.v criticise.v critique.v crock.v cross-clamp.v crossclamp.v cross_dress cross_fertilize cross-link.v cross_match cross-match.v cross-protect.v crossprotect.v cross-react.v crossreact.v cross-reference.v crossreference.v crust.v cryo-fix.v cryofix.v cryo-preserve.v cryopreserve.v cryoprotect.v cryo-section.v cryotreat.v crystallise.v cuckoo.v cudgell.v cumber.v cund.v curarise.v curarize.v curate.v curette.v curet.v curtain.v cuss.v customise.v customize.v cu.v cyanylate.v cyclise.v cypher.v cyto-adhere.v cytoreduce.v cytospin.v cytostain.v dansylate.v dapple.v deacetylate.v deactivate.v deacylate.v de-adenylate.v deadenylate.v deafferentate.v deafferent.v deallergise.v deamidate.v deamidize.v deaminate.v debouche.v debouch.v debride.v debulk.v debute.v decalcify.v decannulate.v decapsulate.v decarboxylate.v decatenate.v decentralise.v decerebrate.v decerebrize.v dechlorinate.v decidualise.v decoct.v decolonise.v decolorise.v decolorize.v decolourise.v decolourize.v decomplementize.v decontrol.v deconvolute.v decoronate.v decorticate.v decouple.v decoy.v decree.v deemanate.v de-energise.v deenergise.v de-energize.v deenergize.v de-epicardialize.v de-epithelialise.v deepithelialise.v deethylate.v de-etiolate.v defaecate.v defaunate.v defeminise.v defeminize.v defenestrate.v defibrillate.v defibrinate.v deflorate.v defocus.v deformylate.v defunctionalise.v defunctionalize.v degalactosylate.v degas.v degauss.v degenitalize.v deglycerate.v degrease.v dehaematise.v dehalogenate.v dehematize.v dehemoglobinize.v dehisc.v dehorn.v dehull.v dehumanise.v dehydrochlorinate.v dehydrogenate.v dehydrogenise.v dehydrogenize.v dehydroxylate.v dehypnotise.v dehypnotize.v deinduce.v deinstitutionalize.v deionise.v deionize.v deject.v de-lead.v delead.v delimitate.v delipidate.v delocalise.v delocalize.v delouse.v demagnetise.v demark.v demasculinise.v demedullate.v demembranate.v demetalise.v demetalize.v demethylate.v demilitarise.v demineralise.v demineralize.v demobilise.v democratise.v demodulate.v demonetise.v demonetize.v demoralise.v demustardize.v demyelinate.v demystify.v denationalise.v denature.v denervate.v denitrate.v denitrify.v deodorise.v deoxidise.v deoxidize.v deoxygenate.v depancreatize.v deparaffinise.v deparaffinize.v departmentalise.v depersonalize.v dephosphorylate.v depigment.v depilate.v depolarise.v depoliticise.v depoliticize.v depolymerise.v depotentiate.v deprave.v depressurise.v depressurize.v deproject.v deprotect.v deproteinate.v deprotonate.v depurate.v depute.v deputise.v deregulate.v derepress.v deresinate.v derivatise.v derivatize.v derivitise.v derivitize.v deroof.v derotate.v derrick.v desalinise.v desalt.v desamidate.v desamidize.v descale.v desensitise.v desexualise.v desexualize.v desheathe.v desheath.v desialylate.v desolate.v desolvate.v desorb.v despeciate.v destabilise.v destablise.v destablize.v destain.v desulfate.v desulfurate.v desulphate.v desulphurate.v desynchronise.v dethyroidize.v detour.v detoxicate.v deuterate.v deuteriate.v devascularize.v devil.v devitalise.v devitalize.v deworm.v dextrinate.v dextrinize.v diacetylate.v diacylate.v diagram.v dialkylate.v dialogue.v dialog.v dialyse.v diapause.v diaper.v diazotize.v dibble.v dicker.v dideuterate.v diesterify.v difluorinate.v digitalise.v digitilise.v digitise.v digitize.v dihalogenate.v dihydrogenate.v dihydroxylate.v diiodinate.v dike.v dilatate.v dimerise.v dimethylate.v dimite.v dimit.v dimple.v diphosphorylate.v dirty.v disacidify.v disadvantage.v disaggregate.v disambiguate.v disarray.v disbelieve.v disbud.v disburden.v discolour.v discommode.v discompose.v disconfirm.v discountenance.v disco.v discretise.v discretize.v disembody.v disencumber.v disfavor.v dishabituate.v dishevel.v dishonor.v disimmunize.v disinhibit.v disinsert.v disjoint.v dismutate.v disocclude.v disocclud.v disorder.v disorganise.v disorganize.v dispensarise.v dispensarize.v dispirit.v disproportionate.v disquiet.v disregulate.v dissatisfy.v dissimilate.v distemper.v distrain.v divulse.v docket.v doll.v dolly.v domicile.v dorsalise.v dorsiduct.v dose.v doss.v douche.v dowel.v downmodulate.v downregulate.v downstage.v dowse.v dramatise.v drat.v drivel.v drudge.v dumfound.v dun.v duplex.v dyke.v dysregulate.v earth.v ear.v echolocate.v economise.v ecphorise.v ecphorize.v ectropionise.v ectropionize.v editorialise.v educe.v edulcorate.v effectuate.v eff.v egest.v ekphorize.v elate.v electro-cauterise.v electrocauterise.v electro-cauterize.v electrocauterize.v electrodialyse.v electroelute.v electro-inject.v electroinject.v electroinsert.v electrophorese.v electrophore.v electrophor.v electroplate.v electroporate.v electrotransfer.v electrovert.v elute.v elutriate.v emaciate.v embolise.v embrocate.v emedullate.v empathise.v emphasise.v emplace.v emulsion.v enamor.v enamour.v encapsulate.v enchain.v encore.v encrust.v endarterectomise.v endarterectomize.v endoscope.v endothelialise.v endue.v energise.v energize.v enfeeble.v engraft.v engrail.v enkindle.v enlace.v enlac.v enplane.v enplan.v enrapture.v ensheathe.v ensheath.v ensilage.v ensile.v ensil.v enterectomise.v enterectomize.v entropionize.v envenom.v environ.v enwrap.v epilate.v epimerise.v epithelialise.v epithelialize.v epithelise.v epithelize.v epitomise.v epoxidise.v epoxidize.v equalise.v equilibrate.v eroticise.v eroticize.v erotise.v erotize.v essay.v esterify.v estrange.v estrogenise.v estrogenize.v etherise.v etherize.v ethylate.v euthanatise.v euthanatize.v euthanise.v euthanize.v evaginate.v evert.v evidence.v exact.v exanimate.v excerpt.v exchange-transfuse.v excogitate.v execrate.v exenterate.v exorcise.v expatriate.v exsanguinate.v exsect.v exsomatize.v exteriorise.v exteriorize.v externalise.v extrude.v extubate.v factorise.v factorize.v faggot.v fagot.v familiarise.v fantasise.v faradise.v faradize.v farnesylate.v father.v feather-bed.v fecundate.v federalise.v federalize.v felicitate.v feminise.v feminize.v fenestrate.v fertilise.v feu.v fictionalise.v fictionalize.v field-test.v filch.v filtrate.v finalise.v fingerprint.v fire-proof.v fireproof.v fissure.v fistulise.v flabbergast.v flange.v fleck.v flesh.v flexibilise.v flexibilize.v flounce.v floure.v flour.v fluidize.v fluoresceinate.v fluoridise.v fluoridize.v fluoroscope.v flute.v foal.v focalise.v fog.v footle.v footnote.v footprint.v footslog.v foray.v forbode.v forebid.v forebode.v foredoom.v foreground.v foreknow.v forest.v foretaste.v formalinise.v formalinize.v formalise.v format.v formylate.v fossilise.v fowl.v fox.v fractionate.v franchise.v fraternise.v freckle.v free-graft.v freeze_dry freeze-dry.v freeze-fracture.v freight.v fringe.v frolick.v fruit.v fuddle.v functionalise.v functionalize.v funk.v furcate.v fur.v gabble.v gab.v gad.v galactosylate.v galavant.v galivant.v galvanise.v ganglionectomise.v ganglionectomize.v gangrene.v gap.v garage.v garland.v garote.v garot.v garrote.v garrot.v gastrectomise.v gastrectomize.v gas.v gate.v gavage.v gazette.v gelatinise.v geld.v gell.v generalise.v genotype.v gentle.v gen.v geocode.v geranylgeranylate.v ghost.v ginger.v girdle.v glace.v glamorise.v glissade.v globalise.v glomectomise.v glomectomize.v glom.v glove.v glucoronise.v glucuronidate.v glue.v glycate.v glycerolate.v glycerolize.v glycosylate.v gonadectomize.v goose.v gormandise.v gown.v grain.v grandfather.v grandparent.v graph.v grass.v green.v grime.v grizzle.v grommet.v grub.v guest.v gull.v gusset.v guy.v habilitate.v habituate.v haemagglutinate.v haemoagglutinate.v haemocoagulate.v haemodialyse.v haemodialyze.v haemodilute.v haemolyse.v haemolyze.v haemoperfuse.v haemorrhage.v hallmark.v halogenate.v handpick.v haploidise.v haptenate.v hap.v harmonise.v hasp.v headline.v hemicastrate.v hemi-delete.v hemisect.v hemispherectomise.v hemispherectomize.v hemodialyse.v hemodialyze.v hemodilute.v hemolyse.v hemoperfuse.v hemorrhage.v heparinise.v heparinize.v hepatectomise.v hepatectomize.v heterodimerise.v hex.v hie.v high-jack.v hirudinize.v histoculture.v hobo.v hole.v holiday.v home.v homodimerise.v homodimerize.v homogenise.v homograft.v honeycomb.v hoop.v horse.v hospitalise.v hot.v hox.v humanise.v humanize.v humor.v hurdle.v husband.v hyalinise.v hyalinize.v hybridise.v hydrogenate.v hydrogenize.v hydrolise.v hydrolize.v hydrolyse.v hydroxylate.v hye.v hymn.v hyperacetylate.v hyperactivate.v hypercontract.v hyperdefaecate.v hyperexpress.v hyperextend.v hyperfiltrate.v hyperfractionate.v hyperimmunise.v hyperimmunize.v hyper-induce.v hyperinduce.v hyperinnervate.v hyperluteinise.v hyper-methylate.v hypermethylate.v hypernucleate.v hyperpolarise.v hyperproduce.v hypersensitise.v hyperstimulate.v hypertransfuse.v hypnoidize.v hypnotise.v hypomineralise.v hypomineralize.v hypo-phosphorylate.v hypophosphorylate.v hypophysectomise.v hypophysectomize.v hyposensitize.v hypothecate.v hysterectomise.v hysterectomize.v idealise.v idolise.v imbed.v immobilise.v immortalise.v immunise.v immunoabsorb.v immunoadsorb.v immuno-assay.v immunoassay.v immunoblot.v immunocompromise.v immunodeplete.v immunodepress.v immunoenhance.v immunoexpress.v immunoinhibit.v immunoisolate.v immunolabel.v immunolocalise.v immunolocalize.v immunoneutralise.v immunoneutralize.v immunophenotype.v immunopurify.v immunoradioassay.v immunoregulate.v immunoscreen.v immunoselect.v immunostain.v immunostimulate.v immunosuppress.v immuno-target.v immunotarget.v immunotitrate.v immunotype.v immure.v impersonalise.v impersonalize.v importune.v incise.v inclose.v incommode.v increment.v inculpate.v individualise.v individualize.v indorse.v indue.v industrialise.v inebriate.v influx.v inf.v ingle.v ingraft.v ingrain.v inhume.v inhum.v initialise.v initialize.v inlay.v innervate.v input.v inset.v insolubilise.v insolubilize.v insonify.v instance.v institutionalise.v instrument.v insufflate.v intellectualise.v intellectualize.v intercalate.v interconvert.v interface.v interiorise.v interiorize.v interlace.v interlard.v interleaf.v interlink.v internalise.v internationalise.v interpellate.v interpose.v interspace.v intrench.v introject.v introvert.v intrust.v intubate.v inure.v inventory.v invoice.v iodinate.v iodise.v ionise.v iontophorese.v iridectomize.v isoimmunise.v isoimmunize.v isomerise.v italicise.v itemise.v jacket.v jack_knife jackknife.v jecorize.v jejunectomise.v jejunectomize.v jeopardise.v joint.v juice.v junk.v karyotype.v keen.v kennel.v kent.v keratinise.v key.v kink.v knee.v K/O.v KO.v KO'.v labilise.v labyrinthectomise.v labyrinthectomize.v lacrymate.v lactonise.v ladder.v lambast.v lamb.v lame.v laminectomise.v laminectomize.v lam.v laparotomise.v laparotomize.v lapinise.v lapinize.v lard.v lariate.v lariat.v lark.v laryngectomise.v laryngectomize.v laser.v lassoo.v lateralise.v lather.v lathe.v lavage.v layer.v leaflet.v league.v leap-frog.v leash.v leech.v leep.v legalise.v legitimate.v legitimatise.v legitimise.v legitimize.v lentectomize.v lesion.v letter.v liberalise.v ligate.v lilt.v lime.v limn.v linearize.v linge.v lipectomise.v lipectomize.v lipidate.v liposuction.v lipoxygenate.v lip.v liquify.v lithograph.v lithotomize.v lobectomise.v lobectomize.v lobotomise.v lobotomize.v loose.v lord.v Lord.v loupe.v loup.v loure.v low.v lubrify.v luck.v luteinise.v luxate.v lymphadenectomise.v lymphadenectomize.v lyophilise.v lyophilize.v lypophilise.v lypophilize.v lysogenise.v lysogenize.v macadamise.v macadamize.v machine.v macroencapsulate.v magnetise.v mainstream.v malaxate.v malignise.v malposition.v malt.v mantle.v manumit.v manure.v marathon.v Marathon.v marginate.v marinade.v marsupialize.v masculinise.v masculinize.v massacre.v mastectomise.v mastectomize.v master-mind.v materialise.v matt.v mat.v maximise.v maze.v mechanise.v medialise.v medicalise.v medicalize.v medisect.v medullectomise.v medullectomize.v melanise.v melanize.v mentor.v mercerise.v mercerize.v merchandise.v mercurate.v mercurialize.v mercuriate.v mesmerise.v metabolise.v metabolize.v metal.v metastasise.v meter.v methylate.v metre.v metricise.v micellise.v microagglutinate.v microaggregate.v microbiopsy.v microcannulate.v microcatheterise.v microcatheterize.v microcomputerise.v microcomputerize.v microdetermine.v microdilute.v microdissect.v microembolise.v microfill.v microfilter.v microinject.v micromanipulate.v micromill.v micromodify.v micronise.v micronize.v microperfuse.v microprocess.v microsequence.v microtitrate.v microtome.v microwave.v middle.v mildew.v militarise.v militarize.v mimetise.v mimetize.v mineralise.v mineralize.v miniaturise.v minify.v minimise.v minute.v misadvise.v misattribute.v miscall.v misclassify.v miscode.v misconduct.v misdiagnose.v mis-fold.v misidentify.v misincorporate.v mislabel.v mislocalise.v mislocalize.v mismatch.v mispair.v misperceive.v misprint.v misrecognise.v misrecognize.v misregulate.v misrepair.v misroute.v misrule.v misspecify.v mis-tune.v mistune.v miter.v mitre.v mobilise.v modernise.v moire.v moisturise.v moisturize.v molder.v monophosphorylate.v monopolise.v moonlight.v moralise.v morcellate.v morphinize.v morse.v Morse.v mortice.v mortise.v mother.v moth-proof.v motorcycle.v motorise.v muckrake.v mulct.v multimerise.v mummify.v mummy.v mump.v muscle.v muscularise.v mutagenize.v myectomize.v myristoylate.v narcotize.v nark.v nasalise.v nasalize.v nationalise.v naturalise.v nauseate.v nebulise.v nebulize.v necropsy.v necrotise.v negative.v neighbor.v neighbour.v nephrectomise.v nep.v nerve.v nesslerise.v nesslerize.v neuromodulate.v neurostimulate.v neutralise.v niche.v nickel.v nim.v Nissl-stain.v nitrate.v nitrosate.v nitrosylate.v nobble.v nonplus.v noose.v normalise.v nose.v notch.v objectify.v objurgate.v oblate.v obtrude.v obtund.v obturate.v oestrogenise.v oestrogenize.v oint.v O.K..v OK.v oligomerise.v oligomerize.v oophorectomise.v oophorectomize.v operationalise.v operationalize.v oppugn.v opsonify.v opsonise.v optimise.v optimize.v orchidectomise.v orchidectomize.v ordinate.v organise.v orphan.v osmicate.v osteotomise.v osteotomize.v ostracise.v outbrave.v out-compete.v outcompete.v outdate.v outface.v out-Herod.v outmaneuver.v outmarch.v outmatch.v out-pace.v outpace.v outperform.v outpoint.v output.v outrange.v outrang.v outrival.v outsail.v outspread.v outstrip.v outvie.v outwear.v ovariectomise.v ovariectomize.v over-associate.v overassociate.v over-burden.v over-capitalise.v overcapitalise.v over-capitalize.v overcapitalize.v over-charge.v over-consume.v overconsume.v over-cook.v overcorrect.v overcrop.v over-crowd.v over-detect.v overdetect.v overdiagnose.v overdose.v over-elongate.v overelongate.v overemphasise.v over-emphasize.v over-estimate.v over-exert.v over-expose.v overexpress.v over-feed.v over-hang.v overhang.v over-heat.v over-insert.v overinsert.v overlay.v over-learn.v overlearn.v overleep.v overmaster.v over-pay.v over-praise.v over-predict.v overpredict.v over-produce.v over-proliferate.v over-refer.v overrefer.v over-report.v overreport.v over-represent.v overrepresent.v oversaturate.v over-secrete.v over-sew.v oversew.v over-simplify.v over-stage.v overstage.v overstag.v overstain.v overstimulate.v over-strain.v over-stretch.v over-synthesise.v oversynthesise.v over-synthesize.v oversynthesize.v over-transcribe.v overtreat.v overuse.v over-value.v overventilate.v overview.v over_weight overweight.v over-wrap.v overwrap.v oxidise.v oxygenise.v oxygenize.v ozonise.v ozonize.v palisade.v palliate.v palpate.v palp.v pancreatectomize.v panel.v paragraph.v parameterise.v parameterize.v parasitise.v parasitize.v parasol.v parathyroidectomize.v parboil.v parcel.v parrot.v particularise.v pasteurise.v pasture.v patronise.v pean.v peen.v pelletise.v pelletize.v pellet.v penalise.v pension.v people.v pepsinate.v pepsinise.v pepsinize.v peptonise.v percuss.v perifuse.v peritomize.v peritonealize.v peritonize.v permeabilize.v permeablise.v peroxidise.v personalise.v pestle.v phagocytise.v phagocytize.v phagocytose.v phalangize.v phenocopy.v phenolate.v phenotype.v philosophise.v phlebotomise.v phlorhizinise.v phlorhizinize.v phloridzinise.v phloridzinize.v phosphonylate.v phosphorylate.v photoactivate.v photobleach.v photodamage.v photodecompose.v photoinactivate.v photoinduce.v photoisomerise.v photolabel.v photolyse.v photo-oxidise.v photooxidise.v photo-oxidize.v photopolymerise.v photopolymerize.v photoprotect.v photoreduce.v photoregulate.v photoreverse.v photosensitise.v photostate.v photostimulate.v physick.v physic.v piggyback.v pillow.v pill.v pind.v pinealectomise.v pinealectomize.v pinion.v pink.v pin-point.v pipette.v pith.v plagiarise.v plait.v planimeter.v plank.v plasmolyse.v plasmolyze.v plateau.v plate.v platinate.v pleat.v plea.v plicate.v plump.v plum.v plunk.v pneumonectomise.v pneumonectomize.v pod.v polarise.v pole-axe.v poleaxe.v pole-ax.v poleax.v politicise.v politzerize.v pollack.v pollard.v polyadenalate.v polyadenylate.v polyglutamylate.v polymerise.v polymerize.v pomade.v pommel.v poniard.v popularise.v portacaval_shunt portion.v postfix.v potentiate.v poultice.v power.v prawn.v preabsorb.v preadmit.v precept.v precise.v precoat.v precook.v precool.v preculture.v predate.v predecease.v predefine.v predestinate.v pre-digest.v predigest.v pre-embed.v preembed.v pre-establish.v preestablish.v preexist.v pre-expose.v preexpose.v prefeed.v prefix.v preimmunize.v preinduce.v preinfect.v pre-irradiate.v preirradiate.v prelabel.v preload.v prelude.v premedicate.v premier.v premix.v prepossess.v preprint.v preprocess.v preprogram.v preprotect.v prep.v prereduce.v prescreen.v preselect.v presensitize.v pre-set.v preset.v presoak.v prespawn.v prespecify.v pressurise.v prestimulate.v pre-surface.v pretrain.v pretreate.v pretreat.v preview.v prewarm.v prewash.v prickle.v prioritise.v prioritize.v prise.v privatise.v probate.v profane.v professionalize.v prognose.v prolate.v prong.v propagandise.v prophesy.v propitiate.v prorate.v prorogue.v proselytise.v prospect.v prostatectomise.v prostatectomize.v proteolyse.v proteolyze.v protract.v provision.v pseudonormalise.v psycho-analyse.v psycho-analyze.v psych.v ptyalize.v publicise.v puddle.v pulp.v pulverise.v pup.v purpose.v purpurate.v putty.v pyridoxylate.v quadrisect.v quadruplicate.v quad.v quail.v quantise.v quantitate.v quantize.v quark.v quarrell.v quartisect.v quaternize.v queen.v Queen.v quizz.v rabbit.v radiograph.v radioimmunoassay.v radiolabel.v radiolocalise.v radiolocalize.v radiosensitise.v radiosensitize.v ranch.v randomise.v randomize.v rappel.v rarefy.v rase.v rationalise.v ray.v razor.v reabsorb.v reaccumulate.v reacquire.v re-adapt.v readdress.v readd.v readminister.v ready.v re-afforest.v reafforest.v reaggregate.v realign.v realise.v reallocate.v re-amplify.v reamplify.v reamputate.v ream.v reanalyse.v reanalyze.v re-animate.v reanimate.v reappraise.v re-approximate.v reapproximate.v re-arterialise.v rearterialise.v re-arterialize.v rearterialize.v reassert.v reassign.v reassociate.v reassort.v reattach.v rebase.v rebind.v reble.v rebreath.v recalcify.v recalibrate.v recanalize.v recategorise.v recategorize.v recatheterise.v recatheterize.v receipt.v recemise.v recertify.v rechallenge.v rechromatograph.v recirculate.v reclassify.v reclone.v recode.v recognise.v recolonise.v recombine.v recompress.v reconceptualize.v reconfigure.v reconnoiter.v reconstitute.v recontaminate.v recontoure.v recontour.v re-convert.v re-count.v re-cover.v recultivate.v reculture.v redact.v rededicate.v redescribe.v redetect.v redetermine.v rede.v redirect.v redissect.v red.v reecho.v reeducate.v re-elevate.v reemphasize.v re-endothelialise.v reendothelialise.v re-endothelialize.v re-engineer.v reengineer.v re-enter.v re-epithelialise.v reepithelialise.v re-epithelialize.v re-equilibrate.v re-esterify.v reesterify.v reevaluate.v re-examine.v reexamine.v re-excise.v reexcise.v re-explore.v reexplore.v reexpose.v reexpress.v re-extract.v reextract.v reface.v refeed.v reference.v refinish.v reflux.v refold.v reforest.v reformat.v reframe.v regionalise.v regionalize.v regraft.v regularise.v rehear.v reheat.v rehospitalise.v rehospitalize.v reimmunize.v re-implant.v reimplant.v reincarcerate.v reincarnate.v re-inflate.v reinitiate.v reinject.v reinjure.v reinnervate.v reinoculate.v reinsert.v reinstitute.v re-internalise.v reinternalise.v re-internalize.v reinternalize.v re-interview.v reinterview.v reintroduce.v reintubate.v re-invent.v re-irradiate.v reisolate.v rejig.v re-join.v relabel.v relaparoscopy.v relearn.v reline.v relipidate.v relocalise.v relocalize.v remainder.v remake.v remap.v remediate.v remilitarise.v remobilise.v remyelinate.v renature.v renegue.v re-obliterate.v reobliterate.v re-occlude.v re-occurr.v reoccurr.v reorganise.v reoxidise.v reoxygenate.v repartition.v repattern.v reperforate.v reperfuse.v reperitonealise.v reperitonealize.v replate.v repoint.v repolarise.v repopulate.v repose.v reposition.v reposit.v repot.v reprime.v reprobate.v reprocess.v reprogram.v republish.v repurify.v requite.v requit.v resample.v rescan.v re-scoer.v re-score.v rescore.v rescreen.v reseal.v resect.v resensitise.v resequence.v residualise.v residualize.v re-slice.v reslice.v resocialise.v resocialize.v resolubilize.v resorb.v respell.v restage.v restain.v re-stenose.v restimulate.v restretch.v restudy.v resulfate.v resulphate.v resurvey.v resuspend.v resuture.v resynthesise.v resynthesize.v retrain.v retransform.v retransfuse.v retransplant.v retraumatize.v retread.v re-treat.v retrocede.v retrofit.v retrotranscribe.v retype.v reuse.v reutilise.v reutilize.v revaccinate.v revalidate.v revascularise.v revascularize.v reveil.v revendicate.v revenge.v revitalise.v revivify.v revolutionalise.v revolutionalize.v revolutionise.v rewarm.v rework.v rex.v rhapsodise.v ribosylate.v rick.v ridge.v rime.v ritualise.v ritualize.v rit.v rive.v robe.v romanticise.v roneo.v rongeure.v rongeur.v roof.v rook.v rosette.v roset.v rosine.v rosin.v rouge.v rough-cast.v roughcast.v rough-dry.v roughhouse.v rowel.v rubberise.v ruddle.v ruff.v rumour.v rusk.v rut.v saber.v sabre.v salaam.v salify.v sallow.v salve.v sandarace.v sandarack.v sandarac.v sand-blast.v sanitise.v sanitize.v sate.v saucerize.v saute.v savor.v savvy.v scab.v scallop.v scamp.v scam.v scapegoate.v scar_cicatrise scar_cicatrize scarify.v sclerotise.v sclerotize.v scollop.v scourge.v scrabble.v scrag.v scribe.v scrimmage.v script.v scruple.v scrutinise.v SCUBA.v scud.v scupper.v scythe.v seam.v seclude.v section.v sector.v secularise.v sediment.v segment.v semaphore.v semisynthesise.v semisynthesize.v sensibilise.v sensibilize.v sensitise.v sequence.v sequestrate.v serialise.v serogroup.v serotype.v servo-control.v servocontrol.v sexualise.v sexualize.v sex.v shaft.v shallow.v shamble.v shanghai.v shanghi.v sheer.v sheet.v shellack.v shellac.v shim.v shin.v shipwreck.v shoe.v short-list.v shrine.v shrive.v shuttle.v sialadenectomize.v sialylate.v sickle.v sic.v side-track.v sightsee.v signalise.v signalize.v siliconise.v siliconize.v silt.v silver.v silylate.v singularise.v singularize.v sinter.v site.v situate.v skateboard.v skeine.v skein.v skeletonise.v slang.v slat.v sled.v sleigh.v slenderise.v sleuth.v sliver.v slop.v sludge.v sluice.v smirch.v smut.v snaffle.v snick.v snug.v soap.v socialise.v sod.v soft-soap.v soft-solder.v solace.v solate.v solemnise.v solemnize.v sole.v soliloquise.v solo.v solubilise.v solubilize.v solvate.v somatise.v somatotype.v sonicate.v soot.v sorb.v sorrow.v sovietize.v spangle.v spatchcock.v spate.v spatulate.v spindle.v spiralise.v spiritualise.v spiritualize.v spirt.v splenectomise.v splenectomize.v splint.v splotch.v spoof.v spook.v spool.v spoon.v sporulate.v spud.v squeegee.v squeege.v stable.v stag.v stanch.v standardise.v steam-heat.v steam-roller.v stencil.v sterilise.v steward.v stigmatise.v stock-pile.v stockpile.v stomp.v stopper.v strand.v strangulate.v striate.v stricture.v strop.v strychnize.v stultify.v stupefy.v stylise.v subcategorise.v subcategorize.v sub-classify.v subclassify.v subcompartmentalise.v subcompartmentalize.v subcultivate.v subculture.v subexcite.v subgroup.v subindex.v subjoin.v sublime.v sublocalise.v sublocalize.v subluxate.v suborn.v subsaturate.v subsidise.v subspecialise.v subtitle.v subtype.v suction.v sugar.v sulfate.v sulfonate.v sulfurate.v sulfurete.v sulfuret.v sulfurize.v sulphate.v sulphonate.v sulphurate.v sulphurete.v sulphuret.v sulphurise.v sulphurize.v summarise.v superactivate.v superannuate.v supercool.v superduct.v superfuse.v superhydrate.v superinduce.v superintend.v superpose.v superprecipitate.v supersaturate.v supershift.v suprarenalectomize.v surcharge.v surfeit.v suscitate.v suture.v swab.v swaddle.v swage.v swan.v swill.v swinge.v swob.v swop.v syllabicate.v syllabify.v syllabize.v symbolise.v sympathectomise.v sympathectomize.v sympathise.v synapse.v synchronise.v synergise.v synonymize.v synostose.v synthesise.v synthetise.v synthetize.v syringe.v systematise.v taboo.v tabu.v tap_dance tape-record.v tare.v tarmack.v tarmac.v tee.v telecommunicate.v telefax.v telepathize.v teletransmit.v temper.v temporise.v tenant.v tenon.v tenotomize.v tent.v tenure.v terrorise.v teslaize.v tetanise.v tetanize.v tetramerise.v thermalise.v thermocauterise.v thermocauterize.v thermocycle.v thermoregulate.v thermosensitise.v thermosensitize.v thoracotomise.v thoracotomize.v thwack.v thymectomise.v thymectomize.v thymolize.v thyroidectomise.v thyroidectomize.v thyroidize.v thyroparathyroidectomize.v timetable.v tincture.v tin.v tittivate.v toggle.v tolerise.v tolerize.v tonicize.v tonsillectomize.v tonsure.v tool.v top-dress.v torque.v torrefy.v tosylate.v trabeculate.v tracheostomize.v tracheotomize.v traduce.v traffick.v traffic.v trammel.v tranquillise.v transactivate.v transdifferentiate.v transduce.v transect.v transesterify.v transfect.v transfigure.v tranship.v transilluminate.v transit.v transliterate.v translocate.v transmogrify.v transphosphorylate.v transsect.v trapse.v traumatise.v traumatize.v travesty.v treadle.v tree.v trellise.v trench.v trend.v trepan.v trephine.v triangulate.v trichinize.v trill.v triplicate.v trisect.v tritiate.v triturate.v trivialise.v troll.v troop.v truck.v true.v truss.v trypsinise.v trypsinize.v tubularize.v turf.v turgidize.v twine.v twin.v twit.v tyrannise.v ubiquitinate.v ultrapurify.v ultrasonicate.v unbar.v unbind.v unbosom.v unbridle.v uncap.v unclamp.v unclip.v unclog.v uncuff.v undeceive.v undercall.v underdetect.v underdiagnose.v underemphasise.v underemphasize.v underexert.v under-feed.v undernourish.v underpredict.v undersedate.v understage.v understain.v undertreat.v underuse.v underutilise.v underutilize.v unfit.v unhorse.v universalize.v unman.v unroof.v unsay.v unseat.v unsex.v unstick.v upregulate.v uptake.v urbanise.v utilise.v vacuum.v vagotomize.v vail.v vandalise.v vandalize.v vaporise.v vapourise.v vapourize.v variegate.v variolate.v vascularise.v vascularize.v vasectomize.v vaunt.v vd..v vd.'.v Vd.v Vd'.v veneer.v ventralise.v ventralize.v ventriduct.v verbalise.v victimise.v victual.v video.v virilise.v virilize.v vision.v visualise.v vitalise.v vitalize.v vitrectomise.v vitrectomize.v vivify.v vocalise.v vogue.v volitilise.v vortex.v vulcanise.v vulcanize.v vulgarise.v vulnerate.v wager.v wallpaper.v wand.v warden.v war.v waterlog.v weary.v weasel.v weave.v weekend.v weir.v welch.v well.v wench.v westernise.v whisk.v whiz.v whizz.v whop.v winch.v winkle.v winter.v wise.v womanise.v wow.v wrack.v wreath.v wrought.v xanthate.v xenograft.v xerox.v Xerox.v x-ray.v xray.v X-ray.v yarn.v yellow.v yoke.v zenkerize.v zipper.v link-grammar-4.7.4/data/en/words/words.v.5.20000644000175000017500000000153511245512213017412 0ustar bloombloomagonizes.v barges.v bottoms.v bows.v breezes.v brims.v caves.v caws.v clams.v clowns.v craps.v crawls.v creeps.v crops.v crouchs.v cruises.v darts.v dives.v dozes.v drifts.v drones.v drowses.v fades.v fizzles.v flocks.v flows.v foams.v gangs.v gears.v goofs.v gushes.v hurries.v jets.v jogs.v juts.v keels.v kneels.v knuckles.v lies.v limps.v lingers.v listens.v looms.v lunges.v lurchs.v mellows.v nestles.v opts.v peeks.v peers.v perks.v peters.v pigs.v pines.v plonks.v plops.v puffs.v riffles.v rots.v rucks.v sallies.v scoots.v screams.v scurries.v seeps.v shacks.v shies.v shines.v shops.v shrivels.v skids.v slacks.v slaves.v sleeps.v slims.v slinks.v slopes.v slumps.v soars.v soldiers.v spurts.v squats.v steps.v stoops.v streams.v strolls.v struts.v stumbles.v swoops.v teams.v tenses.v toddles.v tramps.v trickles.v trudges.v veers.v wafts.v zooms.v link-grammar-4.7.4/data/en/words/currency0000644000175000017500000001030111274337051017335 0ustar bloombloomAbasi.c abasi.c Abazi.c abazi.c Anbazi.c anbazi.c Ackey.c ackey.c Adópengő.c adópengő.c Afghani.c afghani.c Akşa.c akşa.c Angolar.c angolar.c Argentino.c argentino.c Ariary.c ariary.c Austral.c austral.c Auksinas.c auksinas.c Baht.c บาท.c baht.c Balboa.c balboa.c Birr.c birr.c Bolívar.c bolívar.c Boliviano.c boliviano.c Budju.c budju.c Cedi.c cedi.c cent.c Chervonets.c chervonets.c Colón.c colón.c Conventionsthaler.c conventionsthaler.c Córdoba.c córdoba.c Cruzado.c cruzado.c Cruzeiro.c cruzeiro.c Cruzeiro_Real cruzeiro_real Cupon.c cupon.c Dalasi.c dalasi.c Daler.c daler.c Denar.c denar.c Denier.c denier.c Dinar.c دينار.c dinar.c Dinero.c dinero.c Dinheiro.c dinheiro.c Dirham.c درهم.c dirham.c Dobra.c dobra.c Dollar.c dollar.c Đồng.c đồng.c Drachma.c Δραχμή.c drachma.c Dram.c Դրամ.c dram.c ekwele.c Ekwele.c Ekuele.c ekuele.c Escudo.c escudo.c Euro.c Eυρώ.c Евро.c euro.c Fanam.c fanam.c Fiorino.c fiorino.c Florin.c florin.c Forint.c forint.c Franc.c franc.c Franco.c franco.c Frange.c frange.c Korçë.c korçë.c Frank.c frank.c Gazeta.c Γαζετα.c gazeta.c Genevoise.c genevoise.c Gineih.c gineih.c Gourde.c gourde.c Grosz.c grosz.c Guaraní.c guaraní.c Guilder.c guilder.c Gulden.c gulden.c Halfpenny.c halfpenny.c Hryvnia.c Гривня.c hryvnia.c Hwan.c 圜.c 환.c hwan.c Inca.c inca.c Inti.c inti.c Karbovanets.c karbovanets.c Keping.c keping.c Kina.c kina.c Kip.c kip.c Konvertibilna_Marka Конвертибилна_марка konvertibilna_marka Kori.c kori.c Korona.c korona.c Koruna.c koruna.c Koruuni.c koruuni.c Króna.c króna.c Krona.c krona.c Krone.c krone.c øre.c kroner.c Kroner.c Kronenthaler.c kronenthaler.c Kroon.c kroon.c Kuna.c kuna.c Kwacha.c kwacha.c Kwanza.c kwanza.c Kyat.c kyat.c Laari.c laari.c Lari.c ლარი.c lari.c Lats.c lats.c Lek.c lek.c Lempira.c lempira.c Leone.c leone.c Leu.c leu.c Lev.c Лев.c lev.c Libra.c libra.c Lilangeni.c lilangeni.c Lira.c לירה.c ليرة.c lira.c Litas.c litas.c Livre.c livre.c Loti.c loti.c Manat.c manat.c Maneti.c maneti.c Maravedí.c maravedí.c Mark.c mark.c Marka.c marka.c konvertibilna_marka конвертибилна_марка Konvertibilna_Marka Markka.c markka.c Metica.c metica.c Metical.c metical.c Mohar.c mohar.c Mon.c mon.c Mun.c mun.c Nahar.c nahar.c NAIRA.c Naira.c naira.c Nakfa.c nakfa.c Ngultrum.c ngultrum.c Nuevo_Sol nuevo_sol Obol.c obol.c Ostmark.c ostmark.c Ostruble.c ostruble.c Ouguiya.c أوقية.c ouguiya.c Pa'anga.c pa'anga.c Pataca.c pataca.c 澳門圓.c Pengő.c pengő.c Penning.c penning.c Perper.c perper.c Peseta.c peseta.c Peso.c peso.c peso_moneda_nacional nuevo_peso Pence.c pence.c penny.c Pfennig.c pfennig.c Phoenix.c phoenix.c Piastra.c piastra.c Piastre.c piastre.c Piso.c piso.c Pitis.c pitis.c Pound.c pound.c Pula.c pula.c Punt.c punt.c Qiran.c qiran.c Quetzal.c quetzal.c Rai_stones rai_stones Rand.c rand.c Reaal.c reaal.c Real.c real.c Reichsmark.c reichsmark.c Reichsthaler.c reichsthaler.c Renminbi.c 人民币.c 人民幣.c renminbi.c Rentenmark.c rentenmark.c Rial.c ريال.c rial.c Riel.c riel.c Rigsdaler.c rigsdaler.c Riksdaler.c riksdaler.c Rijksdaalder.c rijksdaalder.c Ringgit.c ringgit.c Rixdollar.c rixdollar.c Riyal.c riyal.c Roepiah.c roepiah.c Ruble.c Рубль.c ruble.c Rublis.c rublis.c Rufiyah.c rufiyah.c Rupee.c रुपया.c ரூபாய.c rupee.c Rupiah.c rupiah.c Rupie.c rupie.c Ryō.c ryō.c Schilling.c schilling.c Scudo.c scudo.c Shah.c Шаг.c shah.c Shekel.c שקל.c שקל_חדש shekel.c Shilling.c shilling.c Skender.c skender.c Sol.c sol.c Som.c som.c Сом.c Сўм.c Somalo.c somalo.c Somoni.c Сомонӣ.c somoni.c Speciedaler.c speciedaler.c Speciethaler.c speciethaler.c Srang.c srang.c Sucre.c sucre.c Syli.c syli.c Tael.c liǎng.c tael.c Taka.c taka.c Tala.c tala.c Tallero.c tallero.c Talonas.c talonas.c Tangka.c tangka.c Tenga.c tenga.c Tenge.c Теңге.c tenge.c Thaler.c thaler.c Tical.c tical.c Tögrög.c Tөгрөг.c tögrög.c tөгрөг.c Tolar.c tolar.c Toman.c تومان.c toman.c Vatu.c vatu.c Venezolano.c venezolano.c Vereinsthaler.c vereinsthaler.c Wén.c 文.c wén.c Won.c 원.c 圓.c won.c Yang.c 兩.c wang.c Yen.c 円.c wen.c yen.c Yuan.c wuan.c yuan.c 元.c 圆.c Zaïre.c zaïre.c Złoty.c złoty.c link-grammar-4.7.4/data/en/words/words.n.2.x0000644000175000017500000000122011526022265017501 0ustar bloombloomaircraft.p bacteria.p beano.p bellmen.p buffalo.p businessmen.p cacti.p chairmen.p chairwomen.p children.p chum.p clergymen.p congressmen.p criteria.p data.p deer.p dice.p dressing.p emphases.p enzyme.p feet.p firemen.p fishermen.p flora.p flounder.p foremen.p freshmen.p fungi.p gentlemen.p gentry.p grandchildren.p gunmen.p hyphae.p kin.p larvae.p lobstermen.p mailmen.p milkmen.p media.p men.p mice.p millenia.p nemeses.p papaya.p people.p perch.p personae.p personnel.p phenomena.p policemen.p police.p policewomen.p rebellion.p salesmen.p salmon.p sheep.p shrubbery.p smelt.p spokesmen.p spokeswomen.p teeth.p waterfowl.p women.p zucchini.p zuchini.p link-grammar-4.7.4/data/en/words/words.v.10.20000644000175000017500000000171610204377537017503 0ustar bloombloomacknowledges.q adds.q admits.q affirms.q agrees.q announces.q argues.q ascertains.q asserts.q assumes.q believes.q brags.q calculates.q charges.q claims.q commands.q comments.q complains.q concedes.q concludes.q confesses.q confirms.q contends.q decides.q declares.q deduces.q determines.q discerns.q discloses.q discovers.q emphasizes.q envisions.q exclaims.q explains.q figures.q guesses.q hints.q hopes.q implies.q inquires.q insists.q intimates.q learns.q maintains.q muses.q mutters.q notes.q observes.q orders.q pledges.q postulates.q predicts.q presumes.q proclaims.q proposes.q proves.q reads.q realizes.q reasons.q recalls.q reckons.q recognizes.q recounts.q reflects.q remarks.q remembers.q repeats.q replies.q reports.q resolves.q responds.q retorts.q reveals.q rules.q shouts.q sighs.q speculates.q states.q stipulates.q stresses.q suggests.q testifies.q theorizes.q thinks.q threatens.q warns.q whispers.q wonders.q writes.q relates.q continues.q link-grammar-4.7.4/data/en/words/words.v.8.20000644000175000017500000000176011526022265017422 0ustar bloombloomauctions.v bandies.v bars.v battens.v blocks.v blots.v blurts.v boards.v books.v bottles.v bundles.v butters.v cages.v carries carts.v chalks.v chases.v chucks.v clutters.v covers.v cranks.v cuts.v dams.v dishes.v divides doles.v dredges.v dumps.v eggs.v ekes.v exports.v factors.v faxes.v fixes.v flings.v fobs.v gouges.v hams.v hashes.v hoists.v jacks.v jazzes.v jots.v kicks.v ladles.v lays.v lifts.v links.v loads.v locks.v lops.v mails.v maps.v marks.v metes.v mulls.v musses.v nails.v palms.v patches.v paves pens.v phases.v phones.v picks.v pieces.v pins.v plugs.v pricks.v props.v punches.v pushes.v racks.v reins.v rigs.v riles.v rinses.v roughens.v roughs.v saves.v scales.v scares.v screens.v shakes.v shores.v singles.v sizes.v skims.v skittles.v smuggles.v sops.v sorts.v spices.v stacks.v stakes.v staves.v strings.v stuffs.v susses.v sweeps.v tacks.v tapes.v tears.v throws.v tides.v ties.v tops.v totals.v touches.v toughens.v tracks.v wads.v washes.v waves.v wears.v wrings.v yanks.v zips.v link-grammar-4.7.4/data/en/words/words.v.5.40000644000175000017500000000207411245532015017415 0ustar bloombloomagonizing.v barging.v bottoming.v bowing.v breezing.v brimming.v caving.v cawing.v cawwing.v clamming.v clowning.v coming.v crapping.v crawling.v creeping.v cropping.v crouching.v cruising.v darting.v diving.v dozing.v drifting.v droning.v drowsing.v fading.v fizzling.v flocking.v flowing foaming.v ganging.v gearing.v goofing.v gushing.v hurrying.v jetting.v jogging.v jutting.v keeling.v kneeling.v knuckling.v limping.v lingering.v listening.v looming.v lunging.v lurching.v lying mellowing.v nestling.v opting.v peeking.v peering.v perking.v petering.v pigging.g pining.v plonking.v plopping.v puffing.v riffling.v rotting.v rucking.v sallying.v scooting.v screaming.v screamin'.v scurrying.v seeping.v shacking.v shining.v shopping.v shriveling.v shrivelling.v shying.v skidding.v slacking.v slaving.v sleeping.v slimming.v slinking.v sloping.v slumping.v soaring.v soldiering.v spurting.v squatting.v stepping.v stooping.v streaming.v strolling.v strutting.v stumbling.v swooping.v teaming.v tensing.v toddling.v tramping.v trickling.v trudging.v veering.v wafting.v zooming.v link-grammar-4.7.4/data/en/words/entities.given-bisex.sing0000644000175000017500000000545211243055570022517 0ustar bloombloomAaron.b Adam.b Adrian.b Adrien.b Albert.b Alex.b Alexander.b Alexis.b Ali.b Allen.b Alix.b Alva.b Amal.b Andre.b Andrea.b Andrew.b Angel.b Angelo.b Anka.b Anthony.b Antonia.b Antonio.b Ariel.b Arthur.b Ashley.b Ashton.b Aubrey.b Audrey.b Augie.b Augustine.b Austin.b Avery.b Bell.b Bennie.b Bernie.b Berry.b Billie.b Billy.b Blair.b Blake.b Bobbie.b Bobby.b Brandon.b Brett.b Brian.b Britt.b Cameron.b Carey.b Carl.b Carlos.b Carmen.b Carol.b Carrol.b Carroll.b Cary.b Casey.b Cecil.b Chang.b Charles.b Charlie.b Chi.b Chong.b Chris.b Christian.b Christopher.b Chung.b Clair.b Clarence.b Claude.b Cleo.b Clyde.b Cody.b Colby.b Connie.b Corey.b Cory.b Courtney.b Cruz.b Curtis.b Dale.b Dallas.b Dan.b Dana.b Daniel.b Dannie.b Darnell.b Daryl.b David.b Dean.b Dee.b Demetrius.b Dennis.b Denny.b Deon.b Devin.b Devon.b Dion.b Dominique.b Donald.b Dong.b Donnie.b Dorian.b Drew.b Dusty.b Eddie.b Edward.b Elisha.b Ellis.b Elmer.b Eric.b Erin.b Eugene.b Evan.b Fluffy.b Frances.b Francis.b Francisco.b Frank.b Frankie.b Fred.b Freddie.b Gabriel.b Gail.b Gale.b Gary.b Gayle.b Gene.b George.b Gerald.b Gerry.b Glenn.b Gregory.b Guadalupe.b Harold.b Henry.b Hollis.b Hong.b Ira.b Ivory.b Jack.b Jackie.b Jae.b Jaime.b Jame.b James.b Jamey.b Jamie.b Jan.b Jason.b Jay.b Jean.b Jeffrey.b Jeremy.b Jerry.b Jesse.b Jessie.b Jesus.b Jewel.b Jewell.b Jimmie.b Jimmy.b Joan.b Jody.b Joe.b Joel.b Joey.b Johnie.b Johnnie.b Johnny.b Jon.b Jordan.b Jose.b Joseph.b Joshua.b Juan.b Jude.b Julian.b Julio.b Justin.b Karl.b Kasey.b Keith.b Kelley.b Kelly.b Kendall.b Kenneth.b Kerry.b Kevin.b Kim.b King.b Kirby.b Kris.b Kyle.b Lacy.b Lane.b Larry.b Lauren.b Laurence.b Lavern.b Laverne.b Lawrence.b Lee.b Leigh.b Leo.b Leon.b Lesley.b Leslie.b Lester.b Lewis.b Lindsay.b Lindsey.b Logan.b Lonnie.b Loren.b Lou.b Louie.b Louis.b Luis.b Lupe.b Lynn.b Man.b Maria.b Mario.b Marion.b Mark.b Marlin.b Marshall.b Martin.b Marty.b Mary.b Matthew.b Maurice.b Melvin.b Merle.b Merrill.b Micah.b Michael.b Michal.b Micheal.b Michel.b Mickey.b Mike.b Minh.b Mitchell.b Morgan.b Nicky.b Noel.b Norman.b Numbers.b Odell.b Ollie.b Oscar.b Otha.b Paris.b Pat.b Patricia.b Patrick.b Paul.b Perry.b Peter.b Quinn.b Randy.b Ray.b Raymond.b Refugio.b Rene.b Richard.b Rickie.b Robbie.b Robert.b Roberto.b Robin.b Ronald.b Ronnie.b Rory.b Rosario.b Rover.b Roy.b Royce.b Rudy.b Russell.b Ryan.b Sam.b Sammie.b Sammy.b Samuel.b Sandy.b Sang.b Santos.b Scott.b Scottie.b Sean.b Shane.b Shannon.b Shaun.b Shawn.b Shayne.b Shelby.b Shirley.b Sidney.b Sol.b Son.b Stacey.b Stacy.b Stephen.b Steven.b Stevie.b Sung.b Sydney.b Taylor.b Terrell.b Terry.b Thanh.b Theo.b Thomas.b Timothy.b Toby.b Tommie.b Tommy.b Tony.b Tory.b Tracey.b Tracy.b Travis.b Trinidad.b Tristan.b Troy.b Tyler.b Val.b Valentine.b Van.b Vernon.b Victor.b Virgil.b Walter.b Wesley.b Whitney.b William.b Willie.b Yong.b Young.b link-grammar-4.7.4/data/en/words/words.n.2.s.biolg0000644000175000017500000000022011167661130020567 0ustar bloombloomepsilons.n zetas.n etas.n thetas.n kappas.n lambdas.n mus.n nus.n xis.n omicrons.n pis.n rhos.n sigmas.n taus.n upsilons.n phis.n chis.n psis.n link-grammar-4.7.4/data/en/words/words.adj.30000644000175000017500000002123011526022265017540 0ustar bloombloomablest.a-s abruptest.a-s airiest.a-s amplest.a-s angriest.a-s aptest.a-s ashiest.a-s atonalest.a-s baddest.a-s baggiest.a-s baldest.a-s balmiest.a-s barest.a-s basest.a-s battiest.a-s bawdiest.a-s beeriest.a-s best-defined.a-s biggest.a-s bitterest.a-s blackest.a-s blandest.a-s bleakest.a-s bleariest.a-s blondest.a-s bloodiest.a-s blotchiest.a-s bluest.a-s bluntest.a-s boggiest.a-s boldest.a-s boniest.a-s bossiest.a-s bounciest.a-s brainiest.a-s brashest.a-s brassiest.a-s bravest.a-s brawniest.a-s breathiest.a-s breeziest.a-s briefest.a-s brightest.a-s briskest.a-s bristliest.a-s brittlest.a-s broadest.a-s broodiest.a-s brownest.a-s bubbliest.a-s buckiest.a-s buggiest.a-s bulkiest.a-s bumpiest.a-s bunchiest.a-s burliest.a-s bushiest.a-s busiest.a-s butteriest.a-s calmest.a-s canniest.a-s catchiest.a-s chalkiest.a-s chanciest.a-s chattiest.a-s cheapest.a-s cheesiest.a-s chilliest.a-s choicest.a-s choppiest.a-s chubbiest.a-s civillest.a-s clammiest.a-s cleanest.a-s cleanliest.a-s clearest.a-s cleverest.a-s closest.a-s cloudiest.a-s clumsiest.a-s coarsest.a-s cockiest.a-s coldest.a-s coloredest.a-s colouredest.a-s commonest.a-s coolest.a-s corniest.a-s cosiest.a-s costliest.a-s courtliest.a-s coyest.a-s coziest.a-s craftiest.a-s craggiest.a-s crampiest.a-s craziest.a-s creakiest.a-s creamiest.a-s crispest.a-s crossest.a-s crudest.a-s cruellest.a-s crunchiest.a-s crustiest.a-s cuddliest.a-s curliest.a-s curtest.a-s cutest.a-s daintiest.a-s damnedest.a-s dampest.a-s dandiest.a-s darkest.a-s deadest.a-s deadliest.a-s deafest.a-s dearest.a-s deepest.a-s deftest.a-s densest.a-s dimmest.a-s dingiest.a-s dirtiest.a-s dizziest.a-s dopeyest.a-s dopiest.a-s dottiest.a-s doughiest.a-s doughtiest.a-s dowdiest.a-s downiest.a-s drabbest.a-s draftiest.a-s draughtiest.a-s dreamiest.a-s dreariest.a-s dressiest.a-s driest.a-s drowsiest.a-s drunkest.a-s dullest.a-s dumbest.a-s dumpiest.a-s duskiest.a-s dustiest.a-s earliest.a-s earthiest.a-s easternmost.a-s edgiest.a-s eeriest.a-s eldest.a-s emptiest.a-s faddiest.a-s faintest.a-s fairest.a-s fanciest.a-s fattest.a-s fattiest.a-s faultiest.a-s feeblest.a-s fewest.a-s fiercest.a-s fieriest.a-s filmiest.a-s filthiest.a-s finest.a-s firmest.a-s fishiest.a-s fittest.a-s fizziest.a-s flabbiest.a-s flakiest.a-s flashiest.a-s flattest.a-s fleshiest.a-s flimsiest.a-s flippest.a-s floppiest.a-s fluffiest.a-s foamiest.a-s foggiest.a-s fondest.a-s foulest.a-s foxiest.a-s frailest.a-s frankest.a-s freest.a-s freshest.a-s friendliest.a-s frizziest.a-s frostiest.a-s frothiest.a-s fruitiest.a-s fullest.a-s funniest.a-s furriest.a-s fussiest.a-s fuzziest.a-s gamest.a-s gassiest.a-s gauchest.a-s gaudiest.a-s gauntest.a-s gawkiest.a-s gayest.a-s gentlest.a-s giddiest.a-s gladdest.a-s glassiest.a-s glibbest.a-s gloomiest.a-s glummest.a-s goofiest.a-s gooiest.a-s goriest.a-s goutiest.a-s grainiest.a-s grandest.a-s grassiest.a-s gravest.a-s grayest.a-s greasiest.a-s greatest.a-s greediest.a-s greenest.a-s greyest.a-s grimmest.a-s grittiest.a-s groggiest.a-s grooviest.a-s grossest.a-s grubbiest.a-s gruffest.a-s grumpiest.a-s guiltiest.a-s gummiest.a-s gustiest.a-s hairiest.a-s handiest.a-s handsomest.a-s happiest.a-s hardiest.a-s harshest.a-s hastiest.a-s haughtiest.a-s haziest.a-s headiest.a-s healthiest.a-s heartiest.a-s heaviest.a-s heftiest.a-s highest.a-s highest-density.a-s highest-efficiency.a-s highest-priority.a-s highest-quality.a-s highest-resistance.a-s hilliest.a-s hoarest.a-s hoariest.a-s hoarsest.a-s holiest.a-s hollowest.a-s homeliest.a-s horniest.a-s hottest.a-s hugest.a-s humblest.a-s hungriest.a-s huskiest.a-s iciest.a-s idlest.a-s imbecilicest.a-s impurest.a-s inaptest.a-s jauntiest.a-s jerkiest.a-s jitteriest.a-s jolliest.a-s juiciest.a-s jumpiest.a-s keenest.a-s kindest.a-s kindliest.a-s kinkiest.a-s knobbiest.a-s knottiest.a-s laciest.a-s lamest.a-s lankiest.a-s largest.a-s latest.a-s laxest.a-s laziest.a-s leakiest.a-s leanest.a-s leftmost.a-s lengthiest.a-s lewdest.a-s lightest.a-s likeliest.a-s limpest.a-s littlest.a-s liveliest.a-s loamiest.a-s loftiest.a-s loneliest.a-s longest-lasting.a-s longestlasting.a-s looniest.a-s loopiest.a-s loosest.a-s lordliest.a-s loudest.a-s lousiest.a-s loveliest.a-s lowest.a-s lowest-density.a-s lowest-dose.a-s lowest-fat.a-s lowest-grade.a-s lowest-profile.a-s lowest-risk.a-s lowliest.a-s lownest.a-s loyallest.a-s luckiest.a-s lumpiest.a-s lushest.a-s lustiest.a-s maddest.a-s manliest.a-s marshiest.a-s massiest.a-s maturest.a-s mealiest.a-s meanest.a-s meatiest.a-s meekest.a-s mellowest.a-s merest.a-s merriest.a-s messiest.a-s mightiest.a-s mildest.a-s milkiest.a-s minutest.a-s mistiest.a-s moistest.a-s moldiest.a-s moodiest.a-s mossiest.a-s mouldiest.a-s mouseyest.a-s mousiest.a-s muddiest.a-s murkiest.a-s mushiest.a-s mustiest.a-s muzziest.a-s narrowest.a-s nastiest.a-s nattiest.a-s naughtiest.a-s nearest.a-s neatest.a-s neediest.a-s newest.a-s nicest.a-s noblest.a-s noisiest.a-s northernmost.a-s noseyest.a-s nosiest.a-s nudest.a-s numbest.a-s obtusest.a-s oddest.a-s oiliest.a-s oldest.a-s palest.a-s palmiest.a-s pastiest.a-s patchiest.a-s paunchiest.a-s pearliest.a-s peatiest.a-s pebbliest.a-s perkiest.a-s peskiest.a-s pettiest.a-s pickiest.a-s piggiest.a-s pinkest.a-s pithiest.a-s plainest.a-s pleasantest.a-s plumpest.a-s plushest.a-s podgiest.a-s pokiest.a-s politest.a-s poorest.a-s poshest.a-s pottiest.a-s prettiest.a-s priciest.a-s prickliest.a-s primmest.a-s profoundest.a-s pronest.a-s proudest.a-s pudgiest.a-s puffiest.a-s pulpiest.a-s puniest.a-s purest.a-s purplest.a-s quaintest.a-s queasiest.a-s queerest.a-s quickest.a-s quietest.a-s raciest.a-s rainiest.a-s randiest.a-s rarest.a-s readiest.a-s realest.a-s reddest.a-s reediest.a-s remotest.a-s richest.a-s rightmost.a-s ripest.a-s riskiest.a-s rockiest.a-s rosiest.a-s roughest.a-s roundest.a-s rowdiest.a-s ruddiest.a-s rudest.a-s runniest.a-s rustiest.a-s saddest.a-s safest.a-s saintliest.a-s saltiest.a-s sandiest.a-s sanest.a-s sauciest.a-s savviest.a-s scabbiest.a-s scaliest.a-s scantest.a-s scantiest.a-s scarcest.a-s scariest.a-s scratchiest.a-s scrawniest.a-s scurfiest.a-s scurviest.a-s securest.a-s sedatest.a-s seediest.a-s severest.a-s sexiest.a-s shabbiest.a-s shadiest.a-s shadowiest.a-s shaggiest.a-s shakiest.a-s shallowest.a-s shapeliest.a-s sharpest.a-s sheerest.a-s shiftiest.a-s shiniest.a-s shoddiest.a-s shortest.a-s showiest.a-s shrewdest.a-s shrillest.a-s shyest.a-s sickest.a-s sickliest.a-s silkiest.a-s silliest.a-s siltiest.a-s silveriest.a-s simplest.a-s sincerest.a-s sketchiest.a-s skinniest.a-s slackest.a-s slangiest.a-s sleekest.a-s sleepiest.a-s slenderest.a-s slickest.a-s sliest.a-s slightest.a-s slimiest.a-s slimmest.a-s slipperiest.a-s sloppiest.a-s slovenliest.a-s slowest.a-s slyest.a-s smallest.a-s smartest.a-s smelliest.a-s smokiest.a-s smoothest.a-s smuggest.a-s smuttiest.a-s snappiest.a-s snarkiest.a-s snazziest.a-s sneakiest.a-s snowiest.a-s snuggest.a-s soapiest.a-s soberest.a-s softest.a-s soggiest.a-s sootiest.a-s sorest.a-s sorriest.a-s soundest.a-s sourest.a-s southernmost.a-s sparest.a-s sparsest.a-s speediest.a-s spiciest.a-s spikiest.a-s spiniest.a-s spongiest.a-s spookiest.a-s sportiest.a-s spottiest.a-s sprightliest.a-s sprucest.a-s squarest.a-s stablest.a-s stalest.a-s stanchest.a-s starchiest.a-s starkest.a-s stateliest.a-s staunchest.a-s steadiest.a-s steeliest.a-s steepest.a-s sternest.a-s stickiest.a-s stiffest.a-s stillest.a-s stingiest.a-s stockiest.a-s stoniest.a-s stormiest.a-s stoutest.a-s straightest.a-s strangest.a-s streakiest.a-s strictest.a-s stringiest.a-s strongest.a-s stubbiest.a-s stuffiest.a-s stumpiest.a-s stupidest.a-s sturdiest.a-s subtlest.a-s sulkiest.a-s sunniest.a-s surest.a-s surliest.a-s swampiest.a-s sweatiest.a-s sweetest.a-s swiftest.a-s tallest.a-s tamest.a-s tannest.a-s tardiest.a-s tartest.a-s tastiest.a-s tautest.a-s tawdriest.a-s tawniest.a-s tenderest.a-s tensest.a-s tersest.a-s testiest.a-s thickest.a-s thinnest.a-s thirstiest.a-s thorniest.a-s thriftiest.a-s throatiest.a-s tidiest.a-s tightest.a-s timeliest.a-s tiniest.a-s toothiest.a-s touchiest.a-s toughest.a-s trickiest.a-s trimmest.a-s truest.a-s ugliest.a-s uneasiest.a-s unfriendliest.a-s unhappiest.a-s unhealthiest.a-s unlikeliest.a-s unruliest.a-s unsightliest.a-s unwieldiest.a-s vaguest.a-s vainest.a-s vastest.a-s vilest.a-s wannest.a-s wariest.a-s warmest.a-s wateriest.a-s waviest.a-s waxiest.a-s weakest.a-s weakliest.a-s wealthiest.a-s weariest.a-s weest.a-s weightiest.a-s weirdest.a-s westernmost.a-s wettest.a-s wheeziest.a-s whitest.a-s wickedest.a-s widest.a-s widest-angle.a-s wildest.a-s wiliest.a-s windiest.a-s wintriest.a-s wiriest.a-s wisest.a-s wispiest.a-s wittiest.a-s wobbliest.a-s woodiest.a-s wooliest.a-s woolliest.a-s wooziest.a-s wordiest.a-s worldliest.a-s worthiest.a-s wriest.a-s yellowest.a-s youngest.a-s link-grammar-4.7.4/data/en/words/words.v.8.50000644000175000017500000000232211526022265017420 0ustar bloombloomauctioning.g bandying.g barring.g battening.g blocking.g blotting.g blurting.g boarding.g booking.g bottling.g bundling.g buttering.g caging.g carrying.g carting.g chalking.g chasing.g chucking.g cluttering.g covering.g cranking.g cutting.g damming.g dishing.g dividing.g doling.g dredging.g dumping.g egging.g eking.g exporting.g factoring.g faxing.g fixing.g flinging.g fobbing.g gouging.g hamming.g hashing.g hoisting.g jacking.g jazzing.g jotting.g kicking.g ladling.g laying.g lifting.g linking.g loading.g locking.g lopping.g mailing.g mapping.g marking.g meting.g mulling.g mussing.g nailing.g palming.g patching.g paving.g penning.g phasing.g phoning.g picking.g piecing.g pinning.g plugging.g pricking.g propping.g punching.g pushing.g racking.g reining.g rigging.g riling.g rinsing.g roughening.g roughing.g saving.g scaling.g scaring.g screening.g shaking.g shoring.g singling.g sizing.g skimming.g skittling.g smuggling.g sopping.g sorting.g spicing.g stacking.g staking.g staving.g stringing.g stuffing.g sussing.g sweeping.g tacking.g taping.g tearing.g throwing.g tiding.g topping.g totaling.g totalling.g touching.g toughening.g tracking.g tying.g wadding.g washing.g waving.g wearing.g wringing.g yanking.g zipping.g link-grammar-4.7.4/data/en/words/.cvsignore0000644000175000017500000000002510510714056017556 0ustar bloombloomMakefile.in Makefile link-grammar-4.7.4/data/en/words/words-medical.v.4.30000644000175000017500000011574611246771267021041 0ustar bloombloomabashed.v abjured.v ablated.v abnegated.v abominated.v abscessed.v abscised.v absented.v acccoutered.v accessioned.v acclimatised.v accoupled.v accoutred.v aced.v acetified.v acetonated.v acetonized.v acetylated.v acetylised.v acetylized.v achromatised.v achromatized.v acidulated.v actualised.v actualized.v actuated.v acylated.v adducted.v adenosine_diphosphate-ribosylated adjured.v administrated.v admixed.v ADP-ribosylated.v adrenalectomized.v adsorbed.v adulated.v advantaged.v afforested.v affronted.v afterloaded.v agglomerated.v aggrieved.v agonised.v airbrushed.v alcoholised.v alcoholized.v aliased.v alined.v aliquoted.v alited.v alit.v alkalinised.v alkalinized.v alkalised.v alkalized.v alkylated.v allelotyped.v allergized.v allografted.v alloimmunised.v alloimmunized.v allotransplanted.v alloyed.v allured.v alphabetised.v alphabetized.v aluminated.v Americanised.v amidated.v aminated.v aminoacylated.v ammoniated.v amortised.v anaesthetised.v anatomized.v anergised.v anesthetised.v anglicised.v animadverted.v annualised.v annualized.v annunciated.v anodised.v anodized.v anonymised.v anonymized.v anoxiated.v antagonised.v anted.v anteriorised.v anteriorized.v antiaggregated.v anticoagulated.v antigenised.v antigenized.v antirepressed.v antisepticised.v antisepticized.v apeased.v apodized.v apologised.v apostatised.v appaled.v appareled.v apparelled.v apported.v apposed.v apprized.v arborised.v arced.v archived.v arcked.v aromatised.v aromatized.v arsonated.v arterialized.v articled.v asexualized.v asperged.v aspersed.v asseverated.v asterisked.v atomised.v attitudinised.v audiotaped.v auscultated.v authored.v autocatalysed.v autoclaved.v autogenerated.v autoimmunised.v autoimmunized.v autoinduced.v autoinducted.v autoinjected.v autolised.v automatised.v auto-oxidised.v autoperfused.v autopsied.v autopsyed.v autoradiographed.v autoregulated.v autosensitised.v autotransplanted.v auxotyped.v avalanched.v avianised.v avianized.v avowed.v avulsed.v awaked.v axotomised.v axotomized.v azotized.v babied.v babyed.v baby-sat.v baby-sited.v backcrossed.v backdroped.v backdropped.v backlabeled.v backlabelled.v backscattered.v bade.v baed.v ballasted.v balled.v balloted.v bandpass_filtered baptised.v barbered.v bariumized.v barracked.v barraged.v barreled.v bastardized.v bayoneted.v beached.v beaded.v beavered.v bedaubed.v bedded.v bedecked.v bedeviled.v behooved.v behoved.v beleaguered.v belled.v bench_pressed beneficed.v benzoylated.v bereft.v bereved.v beseted.v besmeared.v besought.v betrothed.v bettered.v beveled.v biassed.v bibbed.v bibed.v bicompartmentalised.v binged.v bioactivated.v bioassayed.v bioconverted.v bioengineered.v biomagnified.v bio-monitored.v biomonitored.v biopsied.v bioreduced.v bioremediated.v biosynthesised.v biosynthesized.v biotinylated.v biotransformed.v biotyped.v bisintercalated.v bivouacked.v blacked.v blancoed.v blanked.v blent.v blest.v blobbed.v blobed.v blooded.v bloodied.v blued.v blustered.v boated.v bobsleded.v boobed.v boomeranged.v boostered.v bootstraped.v bootstrapped.v bottle-fed.v bottlenecked.v brained.v brain-washed.v brazed.v breakfasted.v breasted.v breast-fed.v breast-feeded.v breveted.v brevetted.v broadsided.v brodded.v broded.v bromated.v brominated.v bromized.v bruited.v brutalised.v bucketed.v buffered.v bulbectomized.v bulked.v bulled.v bunkered.v burked.v burnt.v burred.v bussed.v cached.v caked.v calendered.v calipered.v calked.v callipered.v calumniated.v canalized.v cancerised.v cankered.v cannulated.v cannulized.v canopied.v canopyed.v canted.v cantilevered.v capacitated.v capillarised.v capitalised.v capitated.v caponised.v caponized.v captained.v carbamoylated.v carbamylated.v carbolated.v carbolised.v carbolized.v carbonated.v carbonised.v carboxylated.v cardiectomized.v careered.v cartooned.v cashiered.v catabolised.v catalase_tested catalised.v catalized.v cataloged.v catalysed.v catalyzed.v categorised.v catheterised.v catheterized.v caulked.v causticized.v cauterised.v cauterized.v cavitated.v C_banded C-banded.v cementified.v centrifugalised.v centrifugalized.v centrifugated.v centrifuged.v cered.v certificated.v chaffed.v chamfered.v champed.v chanced.v channeled.v chaped.v chapped.v characterised.v charbroiled.v checkered.v cheeked.v chemoattracted.v chemo-prevented.v chemoprevented.v chemo-sensitised.v chemo-sensitized.v chemosensitized.v chequered.v chickened.v chid.v chined.v chinked.v chiseled.v chlored.v chloroformed.v chloroformised.v chloroformized.v chocked.v cholecystectomised.v cholecystectomized.v chorused.v chromated.v chromatized.v chromatographed.v chromicized.v chunked.v chuted.v cicatrised.v cicatrized.v ciphered.v circularised.v circumducted.v civilised.v classed.v clear-cutted.v clearcutted.v clewed.v clocked.v clouted.v clued.v clysterized.v coactivated.v coadministered.v co-agglutinated.v co-applied.v coapplied.v coapted.v coarticulated.v co-assembled.v coassembled.v cocainised.v cocainized.v co-calibrated.v cocalibrated.v co-chromatographed.v cochromatographed.v co-circulated.v co-clustered.v coclustered.v co-colonized.v cocolonized.v cocooned.v co-crystallized.v cocrystallized.v co-cultivated.v cocultivated.v cocultured.v co-developed.v co-electroporated.v coelectroporated.v coeluted.v co-encapsidated.v coencapsidated.v coencapsulated.v co-enriched.v coenriched.v co-existed.v co-exposed.v coexposed.v coexpressed.v co-extracted.v cografted.v cogwheeled.v co-hybridised.v cohybridised.v co-hybridized.v cohybridized.v coimmobilised.v coimmobilized.v coinfected.v coinfused.v co-ingested.v coingested.v co-inherited.v coinherited.v co-inoculated.v coinoculated.v coked.v collateralised.v collectivised.v colliquated.v colonised.v colonoscoped.v colorised.v colorized.v colourized.v co-managed.v comanaged.v comedicated.v cometabolised.v commercialised.v compartmentalised.v compartmented.v compassed.v compeered.v complexed.v comported.v computerised.v concatenated.v conceptualised.v concorded.v concreted.v concussed.v conded.v condoled.v conduced.v coned.v conglomerated.v conglutinated.v consternated.v constitutionalized.v cont'd.v cont'd..v contradistinguished.v contraindicated.v controverted.v contunded.v contused.v convoluted.v co-ordinated.v coossified.v co-oxidised.v cooxidised.v co-oxidized.v cooxidized.v co-partitioned.v co-perfused.v coperfused.v copolymerised.v copolymerized.v coppered.v coproduced.v co-promoted.v copromoted.v corbeled.v corbelled.v co-reared.v coreared.v co-registered.v co-regulated.v coregulated.v co-released.v coreleased.v corkscrewed.v corned.v cornified.v corraled.v co-secreted.v cosecreted.v cosegregated.v cosensitised.v cosensitized.v coshed.v cosolubilised.v cosolubilized.v co-sponsored.v cosponsored.v cosseted.v costarred.v co-stimulated.v costimulated.v co-stored.v costored.v co-synthesised.v cosynthesised.v co-synthesized.v cosynthesized.v cotranscribed.v cotransfected.v co-transfered.v cotransfered.v co-transferred.v cotransferred.v cotransformed.v cotransmitted.v co-transported.v cotransported.v co-treated.v cotreated.v coulorised.v counselled.v counterpoised.v counterregulated.v countersinked.v counterstained.v counter-transported.v countertransported.v countervailed.v coursed.v court-martialled.v covenanted.v cowed.v cozened.v crabbed.v crafted.v craped.v crated.v cratered.v creped.v crewed.v cricked.v criminalised.v criminalized.v crimsoned.v crisped.v criss-crossed.v cristallised.v cristallized.v criticised.v critiqued.v crocked.v cross-clamped.v crossclamped.v cross_fertilized cross-linked.v cross_matched cross-matched.v cross-protected.v crossprotected.v cross-reacted.v crossreacted.v cross-referenced.v crossreferenced.v crusted.v cryo-fixed.v cryofixed.v cryo-preserved.v cryopreserved.v cryoprotected.v cryo_sectioned cryo-sectioned.v cryotreated.v crystallised.v cuckooed.v cudgelled.v cued.v cumbered.v cunded.v curarised.v curarized.v curated.v cureted.v curetted.v curtained.v cussed.v customised.v customized.v cyanylated.v cyclised.v cyphered.v cyto-adhered.v cytoreduced.v cytostained.v dansylated.v dappled.v deacetylated.v deactivated.v deacylated.v de-adenylated.v deadenylated.v deafferentated.v deafferented.v deallergised.v deamidated.v deamidized.v deaminated.v debouched.v debrided.v debulked.v debuted.v decalcified.v decannulated.v decapsulated.v decarboxylated.v decatenated.v decentralised.v decerebrated.v decerebrized.v dechlorinated.v decidualised.v decocted.v decolonised.v decolorised.v decolorized.v decolourised.v decolourized.v decomplementized.v decontroled.v decontrolled.v deconvoluted.v decoronated.v decorticated.v decoupled.v decoyed.v decreed.v deemanated.v de-energised.v deenergised.v de-energized.v deenergized.v de-epicardialized.v de-epithelialised.v deepithelialised.v deethylated.v defaecated.v defaunated.v defeminised.v defeminized.v defenestrated.v defibrillated.v defibrinated.v deflorated.v defocused.v defocussed.v deformylated.v defunctionalised.v defunctionalized.v degalactosylated.v degased.v degassed.v degaussed.v degenitalized.v deglycerated.v degreased.v dehaematised.v dehalogenated.v dehematized.v dehemoglobinized.v dehorned.v dehulled.v dehumanised.v dehydrochlorinated.v dehydrogenated.v dehydrogenised.v dehydrogenized.v dehydroxylated.v dehypnotised.v dehypnotized.v deinduced.v deinstitutionalized.v deionised.v deionized.v dejected.v de-leaded.v deleaded.v delimitated.v delipidated.v delocalised.v delocalized.v deloused.v demagnetised.v demarked.v demasculinised.v demedullated.v demembranated.v demetalised.v demetalized.v demethylated.v demilitarised.v demineralised.v demineralized.v demobilised.v democratised.v demodulated.v demonetised.v demonetized.v demoralised.v demustardized.v demyelinated.v demystified.v denationalised.v denatured.v denervated.v denitrated.v denitrified.v deodorised.v deoxidised.v deoxidized.v deoxygenated.v depancreatized.v deparaffinised.v deparaffinized.v departmentalised.v depersonalized.v dephosphorylated.v depigmented.v depilated.v depolarised.v depoliticised.v depoliticized.v depolymerised.v depotentiated.v depraved.v depressurised.v depressurized.v deprojected.v deprotected.v deproteinated.v deprotonated.v depurated.v deputed.v deputised.v deregulated.v derepressed.v deresinated.v derivatised.v derivatized.v derivitised.v derivitized.v deroofed.v derotated.v derricked.v desalinised.v desalted.v desamidated.v desamidized.v descaled.v desensitised.v desexualised.v desexualized.v desheathed.v desialylated.v desolated.v desolvated.v desorbed.v despeciated.v destabilised.v destablised.v destablized.v destained.v desulfated.v desulfurated.v desulphated.v desulphurated.v desynchronised.v dethyroidized.v detoured.v detoxicated.v deuterated.v deuteriated.v devascularized.v deviled.v devilled.v devitalised.v devitalized.v dewormed.v dextrinated.v dextrinized.v diacetylated.v diacylated.v diagramed.v diagrammed.v dialkylated.v dialoged.v dialogued.v dialysed.v diapaused.v diapered.v diazotized.v dibbled.v dickered.v dideuterated.v diesterified.v difluorinated.v digitalised.v digitilised.v digitised.v digitized.v dihalogenated.v dihydrogenated.v dihydroxylated.v diiodinated.v diked.v dilatated.v dimerised.v dimethylated.v dimited.v dimitted.v dimpled.v diphosphorylated.v dirtied.v disacidified.v disadvantaged.v disaggregated.v disambiguated.v disarrayed.v disbelieved.v disbudded.v disbuded.v disburdened.v discoed.v discoloured.v discommoded.v discomposed.v disconfirmed.v discountenanced.v discretised.v discretized.v disembodied.v disemboweled.v disencumbered.v disfavored.v dishabituated.v disheveled.v dishonored.v disimmunized.v disinhibited.v disinserted.v disjointed.v dismutated.v disoccluded.v disordered.v disorganised.v disorganized.v dispensarised.v dispensarized.v dispirited.v disproportionated.v disquieted.v disregulated.v dissatisfied.v dissimilated.v distempered.v distrained.v divulsed.v docketed.v dolled.v dollied.v dollyed.v domiciled.v dorsalised.v dorsiducted.v dosed.v dossed.v douched.v doweled.v dowelled.v downmodulated.v downregulated.v downstaged.v dowsed.v dramatised.v drated.v dratted.v driveled.v drivelled.v drudged.v dumfounded.v duned.v dunned.v duplexed.v dyked.v dysregulated.v eared.v earthed.v echolocated.v economised.v ecphorised.v ecphorized.v ectropionised.v ectropionized.v editorialised.v educed.v edulcorated.v effectuated.v effed.v egested.v ekphorized.v elated.v electroblotted.v electro-cauterised.v electrocauterised.v electro-cauterized.v electrocauterized.v electrodialysed.v electroeluted.v electro-injected.v electroinjected.v electroinserted.v electrophored.v electrophoresed.v electroplated.v electroporated.v electrotransfered.v electrotransferred.v electroverted.v eluted.v elutriated.v emaciated.v embolised.v embrocated.v emedullated.v empaneled.v empathised.v emphasised.v emplaced.v emulsioned.v enameled.v enamored.v enamoured.v encapsulated.v enchained.v encored.v encrusted.v endarterectomised.v endarterectomized.v endoscoped.v endothelialised.v endued.v energised.v energized.v enfeebled.v engrafted.v engrailed.v enkindled.v enlaced.v enplaned.v enraptured.v ensheathed.v ensilaged.v ensiled.v enterectomised.v enterectomized.v enthraled.v entropionized.v envelopped.v envenomed.v environed.v enwraped.v enwrapped.v epilated.v epimerised.v epithelialised.v epithelialized.v epithelised.v epithelized.v epitomised.v epoxidised.v epoxidized.v equaled.v equalised.v equilibrated.v eroticised.v eroticized.v erotised.v erotized.v essayed.v esterified.v estranged.v estrogenised.v estrogenized.v etherised.v etherized.v ethylated.v euthanatised.v euthanatized.v euthanised.v euthanized.v evaginated.v everted.v evidenced.v exacted.v exanimated.v excerpted.v exchange-transfused.v excogitated.v execrated.v exenterated.v exorcised.v expatriated.v exsanguinated.v exsected.v exsomatized.v exteriorised.v exteriorized.v externalised.v extruded.v extubated.v factorised.v factorized.v faggoted.v fagoted.v familiarised.v fantasised.v faradised.v faradized.v farnesylated.v fathered.v feather-beded.v fecundated.v federalised.v federalized.v fee'd.v felicitated.v feminised.v feminized.v fenestrated.v fertilised.v feued.v fictionalised.v fictionalized.v field_tested field-tested.v filched.v filtrated.v finalised.v fingerprinted.v fire-proofed.v fireproofed.v fissured.v fistulised.v flabbergasted.v flanged.v flecked.v fleshed.v flexibilised.v flexibilized.v floodlighted.v flounced.v floured.v fluidized.v fluoresceinated.v fluoridised.v fluoridized.v fluoroscoped.v fluted.v foaled.v focalised.v foged.v fogged.v footled.v footnoted.v footprinted.v footsloged.v forayed.v forboded.v forebade.v foreboded.v foredoomed.v foregrounded.v foreknowed.v forested.v foretasted.v formalinised.v formalinized.v formalised.v formatted.v formylated.v fossilised.v fowled.v foxed.v fractionated.v franchised.v fraternised.v freckled.v free_grafted free-grafted.v freeze_dried freeze-dried.v freeze-fractured.v freighted.v fringed.v frivolled.v frolicked.v fruited.v fuddled.v functionalised.v functionalized.v funked.v funneled.v furcated.v fured.v furred.v gabbed.v gabbled.v gabed.v gadded.v gaded.v galactosylated.v galavanted.v galivanted.v galvanised.v ganglionectomised.v ganglionectomized.v gangrened.v gapped.v garaged.v garlanded.v garoted.v garotted.v garroted.v garrotted.v gased.v gassed.v gastrectomised.v gastrectomized.v gated.v gavaged.v gazeted.v gazetted.v gelatinised.v gelded.v gened.v generalised.v genned.v genotyped.v gentled.v geocoded.v geranylgeranylated.v ghosted.v gingered.v girdled.v girted.v girt.v glaced.v glamorised.v glissaded.v globalised.v glomectomised.v glomectomized.v glomed.v glommed.v gloved.v glucoronised.v glucuronidated.v glued.v glycated.v glycerolated.v glycerolized.v glycosylated.v gonadectomized.v goosed.v gormandised.v gowned.v grained.v grandfathered.v grandparented.v graphed.v grassed.v graveled.v greened.v grimed.v grizzled.v grommeted.v grubbed.v grubed.v guested.v gulled.v gusseted.v guyed.v habilitated.v habituated.v haemagglutinated.v haemoagglutinated.v haemocoagulated.v haemodialysed.v haemodialyzed.v haemodiluted.v haemolysed.v haemolyzed.v haemoperfused.v haemorrhaged.v hallmarked.v halogenated.v handpicked.v haploidised.v happed.v haptenated.v harmonised.v hasped.v headlined.v hemicastrated.v hemi-deleted.v hemisected.v hemispherectomised.v hemispherectomized.v hemodialysed.v hemodialyzed.v hemodiluted.v hemolysed.v hemoperfused.v hemorrhaged.v heparinised.v heparinized.v hepatectomised.v hepatectomized.v heterodimerised.v hexed.v hied.v high-jacked.v hirudinized.v histocultured.v hoboed.v holed.v holidayed.v homed.v homodimerised.v homodimerized.v homogenised.v homografted.v honeycombed.v hooped.v horsed.v hospitalised.v hoted.v hotted.v hoved.v hoxed.v humanised.v humanized.v humored.v hurdled.v husbanded.v hyalinised.v hyalinized.v hybridised.v hydrogenated.v hydrogenized.v hydrolised.v hydrolized.v hydrolysed.v hydroxylated.v hyed.v hymned.v hyperacetylated.v hyperactivated.v hypercontracted.v hyperdefaecated.v hyperexpressed.v hyperextended.v hyperfiltrated.v hyperfractionated.v hyperimmunised.v hyperimmunized.v hyper-induced.v hyperinduced.v hyperinnervated.v hyperluteinised.v hyper-methylated.v hypermethylated.v hypernucleated.v hyperpolarised.v hyperproduced.v hypersensitised.v hyperstimulated.v hypertransfused.v hypertrophied.v hypnoidized.v hypnotised.v hypomineralised.v hypomineralized.v hypo-phosphorylated.v hypophosphorylated.v hypophysectomised.v hypophysectomized.v hyposensitized.v hypothecated.v hysterectomised.v hysterectomized.v idealised.v idolised.v imbedded.v imbeded.v immobilised.v immortalised.v immunised.v immunoabsorbed.v immunoadsorbed.v immuno_assayed immuno-assayed.v immunoassayed.v immunobloted.v immunoblotted.v immunocompromised.v immunodepleted.v immunodepressed.v immunoenhanced.v immunoexpressed.v immunoinhibited.v immunoisolated.v immunolabeled.v immunolabelled.v immunolocalised.v immunolocalized.v immunoneutralised.v immunoneutralized.v immunophenotyped.v immunopurified.v immunoradioassayed.v immunoregulated.v immunoscreened.v immunoselected.v immunostained.v immunostimulated.v immunosuppressed.v immuno-targeted.v immunotargeted.v immunotitrated.v immunotyped.v immured.v impaneled.v imperiled.v impersonalised.v impersonalized.v importuned.v incised.v inclosed.v incommoded.v incremented.v inculpated.v individualised.v individualized.v indorsed.v indued.v industrialised.v inebriated.v influxed.v ingled.v ingrafted.v ingrained.v inhumed.v initialed.v initialised.v initialized.v inlaid.v inlayed.v inned.v innervated.v inputed.v inputted.v inseted.v insetted.v insolubilised.v insolubilized.v insonified.v instanced.v institutionalised.v instrumented.v insufflated.v intellectualised.v intellectualized.v intercalated.v interconverted.v interfaced.v interiorised.v interiorized.v interlaced.v interlarded.v interleafed.v interlinked.v internalised.v internationalised.v interpellated.v interposed.v interspaced.v intrenched.v introjected.v introverted.v intrusted.v intubated.v inured.v inventoried.v inventoryed.v invoiced.v iodinated.v iodised.v ionised.v iontophoresed.v iridectomized.v isoimmunised.v isoimmunized.v isomerised.v italicised.v itemised.v jacketed.v jack_knifed jackknifed.v jecorized.v jejunectomised.v jejunectomized.v jeopardised.v jointed.v juiced.v junked.v karyotyped.v keened.v kenneled.v kennelled.v kented.v keratinised.v keyed.v kidnaped.v kinked.v kneed.v KO'd.v KO'ed.v labilised.v labyrinthectomised.v labyrinthectomized.v lacrymated.v lactonised.v laddered.v lambed.v lamed.v laminectomised.v laminectomized.v lammed.v laparotomised.v laparotomized.v lapinised.v lapinized.v larded.v lariated.v larked.v laryngectomised.v laryngectomized.v lasered.v lassooed.v lateralised.v lathed.v lathered.v lavaged.v layered.v leafleted.v leafletted.v leagued.v leant.v leap-froged.v leapfroged.v leap-frogged.v learnt.v leashed.v leeched.v leeped.v legalised.v legitimated.v legitimatised.v legitimised.v legitimized.v lentectomized.v lesioned.v lettered.v libeled.v liberalised.v ligated.v lilted.v limed.v limned.v linearized.v linged.v linned.v lipectomised.v lipectomized.v liped.v lipidated.v liposuctioned.v lipoxygenated.v lipped.v liquified.v lithographed.v lithotomized.v lobectomised.v lobectomized.v lobotomised.v lobotomized.v loosed.v lorded.v Lorded.v louped.v loured.v lowed.v lubrified.v lucked.v luteinised.v luxated.v lymphadenectomised.v lymphadenectomized.v lyophilised.v lyophilized.v lypophilised.v lypophilized.v lysogenised.v lysogenized.v macadamised.v macadamized.v machined.v macroencapsulated.v magnetised.v mainstreamed.v malaxated.v malignised.v malpositioned.v malted.v mantled.v manumited.v manumitted.v manured.v marathoned.v Marathoned.v marathonned.v Marathonned.v marginated.v marinaded.v marshaled.v marsupialized.v masculinised.v masculinized.v massacred.v mastectomised.v mastectomized.v master-minded.v materialised.v matted.v maximised.v mazed.v mechanised.v medialised.v medicalised.v medicalized.v medisected.v medullectomised.v medullectomized.v melanised.v melanized.v mentored.v mercerised.v mercerized.v merchandised.v mercurated.v mercurialized.v mercuriated.v mesmerised.v metabolised.v metabolized.v metaled.v metalled.v metastasised.v metered.v methylated.v metred.v metricised.v micellised.v microagglutinated.v microaggregated.v microbiopsied.v microcannulated.v microcatheterised.v microcatheterized.v microcomputerised.v microcomputerized.v microdetermined.v microdiluted.v microdissected.v microembolised.v microfilled.v microfiltered.v microinjected.v micromanipulated.v micromilled.v micromodified.v micronised.v micronized.v microperfused.v microprocessed.v microsequenced.v microtitrated.v microtomed.v microwaved.v middled.v mildewed.v militarised.v militarized.v mimetised.v mimetized.v mineralised.v mineralized.v miniaturised.v minified.v minimised.v minuted.v misadvised.v misattributed.v miscalled.v misclassified.v miscoded.v misconducted.v misdiagnosed.v mis-folded.v misidentified.v misincorporated.v mislabeled.v mislabelled.v mislocalised.v mislocalized.v mismatched.v mispaired.v misperceived.v misprinted.v misrecognised.v misrecognized.v misregulated.v misrepaired.v misrouted.v misruled.v misspecified.v misspelt.v mis-tuned.v mistuned.v mitered.v mitred.v mobilised.v modelled.v modernised.v moired.v moisturised.v moisturized.v moldered.v monophosphorylated.v monopolised.v moonlighted.v moralised.v morcellated.v morphinized.v morsed.v Morsed.v morticed.v mortised.v mothered.v moth-proofed.v motorcycled.v motorised.v mown.v muckraked.v mulcted.v multimerised.v mummied.v mummified.v mummyed.v mumped.v muscled.v muscularised.v mutagenized.v myectomized.v myristoylated.v narcotized.v narked.v nasalised.v nasalized.v nationalised.v naturalised.v nauseated.v nebulised.v nebulized.v necropsied.v necrotised.v negatived.v neighbored.v neighboured.v neped.v nephrectomised.v nepped.v nerved.v nesslerised.v nesslerized.v neuromodulated.v neurostimulated.v neutralised.v niched.v nickeled.v nickelled.v nimed.v nimmed.v Nissl_stained Nissl-stained.v nitrated.v nitrosated.v nitrosylated.v nobbled.v nonplused.v nonplussed.v noosed.v normalised.v nosed.v notched.v objectified.v objurgated.v oblated.v obtruded.v obtunded.v obturated.v oestrogenised.v oestrogenized.v ointed.v O.K.ed.v OKed.v oligomerised.v oligomerized.v oophorectomised.v oophorectomized.v operationalised.v operationalized.v oppugned.v opsonified.v opsonised.v optimised.v optimized.v orchidectomised.v orchidectomized.v ordinated.v organised.v orphaned.v osmicated.v osteotomised.v osteotomized.v ostracised.v outbade.v outbided.v outbraved.v out-competed.v outcompeted.v outdated.v outfaced.v out-Heroded.v outlaid.v outmaneuvered.v outmarched.v outmatched.v out-paced.v outpaced.v outperformed.v outpointed.v outputed.v outputted.v outranged.v outrivaled.v outrivalled.v outsailed.v outspreaded.v outstriped.v outstripped.v outvied.v outweared.v ovariectomised.v ovariectomized.v over-associated.v overassociated.v over-burdened.v over-capitalised.v overcapitalised.v over-capitalized.v overcapitalized.v over-charged.v over-consumed.v overconsumed.v over-cooked.v overcorrected.v overcroped.v overcropped.v over-crowded.v over-detected.v overdetected.v overdiagnosed.v overdosed.v over-eated.v over-elongated.v overelongated.v overemphasised.v over-emphasized.v over-estimated.v over-exerted.v over-exposed.v overexpressed.v over-fed.v over-feeded.v over-hanged.v overhanged.v over-heated.v over-hung.v overhung.v over-inserted.v overinserted.v overlaid.v overlayed.v overleapt.v over-learned.v overlearned.v overleeped.v overmastered.v over-praised.v over-predicted.v overpredicted.v over-produced.v over-proliferated.v over-refered.v overrefered.v over-reported.v overreported.v over-represented.v overrepresented.v oversaturated.v over-secreted.v over-simplified.v over-staged.v overstaged.v overstained.v overstimulated.v over-strained.v over-stretched.v over-synthesised.v oversynthesised.v over-synthesized.v oversynthesized.v over-transcribed.v overtreated.v overused.v over-valued.v overventilated.v overviewed.v over_weighted overweighted.v over-wraped.v overwraped.v over-wrapped.v overwrapped.v oxidised.v oxygenised.v oxygenized.v ozonised.v ozonized.v palisaded.v palliated.v palpated.v palped.v pancreatectomized.v paneled.v panelled.v paragraphed.v paralleled.v parameterised.v parameterized.v parasitised.v parasitized.v parasoled.v parathyroidectomized.v parboiled.v parceled.v parcelled.v parroted.v particularised.v pasteurised.v pastured.v patronised.v peaned.v peed.v peened.v pelleted.v pelletised.v pelletized.v penalised.v penciled.v pensioned.v peopled.v pepsinated.v pepsinised.v pepsinized.v peptonised.v percussed.v perifused.v peritomized.v peritonealized.v peritonized.v permeabilized.v permeablised.v peroxidised.v personalised.v pestled.v phagocytised.v phagocytized.v phagocytosed.v phalangized.v phenocopied.v phenolated.v phenotyped.v philosophised.v phlebotomised.v phlorhizinised.v phlorhizinized.v phloridzinised.v phloridzinized.v phosphonylated.v phosphorylated.v photoactivated.v photobleached.v photodamaged.v photodecomposed.v photoinactivated.v photoinduced.v photoisomerised.v photolabeled.v photolabelled.v photolysed.v photo-oxidised.v photooxidised.v photo-oxidized.v photopolymerised.v photopolymerized.v photoprotected.v photoreduced.v photoregulated.v photoreversed.v photosensitised.v photostated.v photostimulated.v physicked.v piggybacked.v pilled.v pillowed.v pinded.v pinealectomised.v pinealectomized.v pinioned.v pinked.v pin-pointed.v pipetted.v pithed.v plagiarised.v plaited.v planimetered.v planked.v plasmolysed.v plasmolyzed.v plateaued.v plated.v platinated.v pleaed.v pleated.v pled.v plicated.v plumed.v plumped.v plunked.v pneumonectomised.v pneumonectomized.v podded.v poded.v polarised.v pole-axed.v poleaxed.v politicised.v politzerized.v pollacked.v pollarded.v polyadenalated.v polyadenylated.v polyglutamylated.v polymerised.v polymerized.v pomaded.v pommeled.v pommelled.v poniarded.v popularised.v portacaval_shunted portioned.v postfixed.v potentiated.v poulticed.v powered.v prawned.v preabsorbed.v preadmited.v preadmitted.v precepted.v precised.v precoated.v precooked.v precooled.v precultured.v predated.v predeceased.v predefined.v predestinated.v pre-digested.v predigested.v pre-embedded.v preembedded.v pre-embeded.v preembeded.v pre-established.v preestablished.v preexisted.v pre-exposed.v preexposed.v prefeeded.v prefixed.v preimmunized.v preinduced.v preinfected.v pre-irradiated.v preirradiated.v prelabeled.v prelabelled.v preloaded.v preluded.v premedicated.v premiered.v premissed.v premixed.v preped.v prepossessed.v prepped.v preprinted.v preprocessed.v preprogramed.v preprogrammed.v preprotected.v prereduced.v prescreened.v preselected.v presensitized.v pre-seted.v preseted.v presoaked.v prespawned.v prespecified.v pressurised.v prestimulated.v pre-surfaced.v pretrained.v pretreated.v previewed.v prewarmed.v prewashed.v prickled.v prioritised.v prioritized.v prised.v privatised.v probated.v profaned.v professionalized.v prognosed.v prolated.v pronged.v propagandised.v prophesied.v propitiated.v prorated.v prorogued.v proselytised.v prospected.v prostatectomised.v prostatectomized.v proteolysed.v proteolyzed.v protracted.v provisioned.v pseudonormalised.v psyched.v psycho-analysed.v psycho-analyzed.v ptyalized.v publicised.v puddled.v pulped.v pulverised.v puped.v pupped.v purposed.v purpurated.v puttied.v pyridoxylated.v quadded.v quaded.v quadrisected.v quadruplicated.v quailed.v quantised.v quantitated.v quantized.v quarked.v quarrelled.v quartisected.v quaternized.v queened.v Queened.v quizzed.v rabbited.v rabbitted.v radiographed.v radioimmunoassayed.v radiolabeled.v radiolabelled.v radiolocalised.v radiolocalized.v radiosensitised.v radiosensitized.v ranched.v randomised.v randomized.v rappeled.v rappelled.v rarefied.v rased.v rationalised.v rayed.v razored.v reabsorbed.v reaccumulated.v reacquired.v re-adapted.v readded.v readdressed.v readied.v readministered.v re-afforested.v reafforested.v reaggregated.v realigned.v realised.v reallocated.v reamed.v re-amplified.v reamplified.v reamputated.v reanalysed.v reanalyzed.v re-animated.v reanimated.v reappraised.v re-approximated.v reapproximated.v re-arterialised.v rearterialised.v re-arterialized.v rearterialized.v reasserted.v reassigned.v reassociated.v reassorted.v reattached.v rebased.v rebinded.v rebled.v recalcified.v recalibrated.v recanalized.v recategorised.v recategorized.v recatheterised.v recatheterized.v receipted.v recemised.v recertified.v rechallenged.v rechromatographed.v recirculated.v reclassified.v recloned.v recoded.v recognised.v recolonised.v recombined.v recompressed.v reconceptualized.v reconfigured.v reconnoitered.v reconstituted.v recontaminated.v recontoured.v re-converted.v re-counted.v re-covered.v recultivated.v recultured.v redacted.v rededicated.v reded.v redescribed.v redetected.v redetermined.v redevelopped.v redirected.v redissected.v reeducated.v re-elevated.v reemphasized.v re-endothelialised.v reendothelialised.v re-endothelialized.v re-engineered.v reengineered.v re-entered.v re-epithelialised.v reepithelialised.v re-epithelialized.v re-equilibrated.v re-esterified.v reesterified.v reevaluated.v re-examined.v reexamined.v re-excised.v reexcised.v re-explored.v reexplored.v reexposed.v reexpressed.v re-extracted.v reextracted.v refaced.v refeeded.v refered.v refereed.v referenced.v reffed.v refinished.v refluxed.v refolded.v reforested.v reformated.v reformatted.v reframed.v regionalised.v regionalized.v regrafted.v regularised.v reheard.v reheared.v reheated.v rehospitalised.v rehospitalized.v reimmunized.v re-implanted.v reimplanted.v reincarcerated.v reincarnated.v re-inflated.v reinitiated.v reinjected.v reinjured.v reinnervated.v reinoculated.v reinserted.v reinstituted.v re-internalised.v reinternalised.v re-internalized.v reinternalized.v re-interviewed.v reinterviewed.v reintroduced.v reintubated.v re-invented.v re-irradiated.v reisolated.v rejiged.v rejigged.v re-joined.v relabeled.v relabelled.v relaid.v relaparoscopied.v relearned.v relined.v relipidated.v relocalised.v relocalized.v remade.v remaindered.v remaked.v remaped.v remapped.v remediated.v remilitarised.v remobilised.v remodeled.v remyelinated.v renatured.v renegued.v re-obliterated.v reobliterated.v re-occluded.v re-occurred.v reoccurred.v reorganised.v reoxidised.v reoxygenated.v repartitioned.v repatterned.v reperforated.v reperfused.v reperitonealised.v reperitonealized.v replated.v repointed.v repolarised.v repopulated.v reposed.v reposited.v repositioned.v repoted.v repotted.v reprimed.v reprobated.v reprocessed.v reprogramed.v reprogrammed.v republished.v repurified.v requited.v resampled.v rescaned.v rescanned.v re-scoered.v rescoered.v re-scored.v rescored.v rescreened.v resealed.v resected.v resensitised.v resequenced.v residualised.v residualized.v re-sliced.v resliced.v resocialised.v resocialized.v resolubilized.v resorbed.v respelled.v respelt.v restaged.v restained.v re-stenosed.v restimulated.v restretched.v restudied.v resulfated.v resulphated.v resurveyed.v resuspended.v resutured.v resynthesised.v resynthesized.v retrained.v retransformed.v retransfused.v retransplanted.v retraumatized.v retreaded.v re-treated.v retroceded.v retrofited.v retrofitted.v retrotranscribed.v retyped.v reused.v reutilised.v reutilized.v revaccinated.v revalidated.v revascularised.v revascularized.v reveiled.v revendicated.v revenged.v revitalised.v revivified.v revolutionalised.v revolutionalized.v revolutionised.v rewarmed.v reworked.v rexed.v rhapsodised.v ribosylated.v ricked.v ricochetted.v ridged.v rimed.v rited.v ritted.v ritualised.v ritualized.v robed.v romanticised.v roneoed.v rongeured.v roofed.v rooked.v roseted.v rosetted.v rosined.v rouged.v rough-casted.v roughcasted.v rough-dried.v roughhoused.v roweled.v rowelled.v rubberised.v ruddled.v ruffed.v rumoured.v rusked.v ruted.v rutted.v sabered.v sabred.v salaamed.v salified.v sallowed.v salved.v sandaraced.v sandaracked.v sand-blasted.v sanitised.v sanitized.v sated.v saucerized.v sauted.v savored.v savvied.v scabed.v scalloped.v scamed.v scammed.v scamped.v scapegoated.v scar_cicatrised scarified.v sclerotised.v sclerotized.v scolloped.v scourged.v scrabbled.v scraged.v scragged.v scribed.v scrimmaged.v scripted.v scrupled.v scrutinised.v SCUBAed.v scudded.v scuded.v scuppered.v scythed.v seamed.v secluded.v sectioned.v sectored.v secularised.v sedimented.v segmented.v semaphored.v semisynthesised.v semisynthesized.v sensibilised.v sensibilized.v sensitised.v sequenced.v sequestrated.v serialised.v serogrouped.v serotyped.v servo-controled.v servocontroled.v servo-controlled.v servocontrolled.v sexed.v sexualised.v sexualized.v shafted.v shallowed.v shambled.v shanghaied.v shanghied.v sheered.v sheeted.v shellaced.v shellacked.v shimed.v shimmed.v shinned.v shipwrecked.v shoded.v shod.v shoed.v short-listed.v shoveled.v shrined.v shrived.v shuttled.v sialadenectomized.v sialylated.v sicced.v siced.v sickled.v side-tracked.v signalised.v signalized.v siliconised.v siliconized.v silted.v silvered.v silylated.v singularised.v singularized.v sintered.v sited.v situated.v skate_boarded skateboarded.v skeined.v skeletonised.v ski'd.v slanged.v slatted.v sledded.v sleded.v sleighed.v slenderised.v sleuthed.v slivered.v slopped.v sludged.v sluiced.v smirched.v smuted.v smutted.v snaffled.v snicked.v snuged.v snugged.v soaped.v socialised.v sodded.v soded.v soft-pedaled.v soft-soaped.v soft-soldered.v solaced.v solated.v soled.v solemnised.v solemnized.v soliloquised.v soloed.v solubilised.v solubilized.v solvated.v somatised.v somatotyped.v sonicated.v sooted.v sorbed.v sorrowed.v sovietized.v spangled.v spatchcocked.v spated.v spatulated.v spilted.v spilt.v spindled.v spiralised.v spiritualised.v spiritualized.v spirted.v splenectomised.v splenectomized.v splinted.v splotched.v spoofed.v spooked.v spooled.v spooned.v sporulated.v spudded.v spuded.v squeegeed.v stabled.v stagged.v stanched.v standardised.v steam-heated.v steam-rollered.v stenciled.v stencilled.v sterilised.v stewarded.v stigmatised.v stock-piled.v stockpiled.v stomped.v stoppered.v stranded.v strangulated.v striated.v strictured.v stroped.v stropped.v strychnized.v stultified.v stupefied.v stylised.v subcategorised.v subcategorized.v sub-classified.v subclassified.v subcompartmentalised.v subcompartmentalized.v subcultivated.v subcultured.v subexcited.v subgrouped.v subindexed.v subjoined.v subletted.v sublimed.v sublocalised.v sublocalized.v subluxated.v suborned.v subsaturated.v subsidised.v subspecialised.v subtitled.v subtyped.v suctioned.v sugared.v sulfated.v sulfonated.v sulfurated.v sulfureted.v sulfuretted.v sulfurized.v sulphated.v sulphonated.v sulphurated.v sulphureted.v sulphuretted.v sulphurised.v sulphurized.v summarised.v superactivated.v superannuated.v supercooled.v superducted.v superfused.v superhydrated.v superinduced.v superintended.v superposed.v superprecipitated.v supersaturated.v supershifted.v suprarenalectomized.v surcharged.v surfeited.v suscitated.v sutured.v swabbed.v swabed.v swaddled.v swaged.v swaned.v swanned.v swilled.v swobbed.v swobed.v swoped.v swopped.v syllabicated.v syllabified.v syllabized.v symbolised.v sympathectomised.v sympathectomized.v sympathised.v synapsed.v synchronised.v synergised.v synonymized.v synostosed.v synthesised.v synthetised.v synthetized.v syringed.v systematised.v tabooed.v tabued.v tape-recorded.v tared.v targetted.v tarmaced.v tarmacked.v teed.v telecommunicated.v telefaxed.v telepathized.v teletransmited.v teletransmitted.v tempered.v temporised.v tenanted.v tenoned.v tenotomized.v tented.v tenured.v terrorised.v teslaized.v tetanised.v tetanized.v tetramerised.v thermalised.v thermocauterised.v thermocauterized.v thermocycled.v thermoregulated.v thermosensitised.v thermosensitized.v thoracotomised.v thoracotomized.v throed.v thwacked.v thymectomised.v thymectomized.v thymolized.v thyroidectomised.v thyroidectomized.v thyroidized.v thyroparathyroidectomized.v timetabled.v tinctured.v tinned.v tittivated.v toggled.v tolerised.v tolerized.v tonicized.v tonsillectomized.v tonsured.v tooled.v top-dressed.v torqued.v torrefied.v tosylated.v toweled.v trabeculated.v tracheostomized.v tracheotomized.v traduced.v trafficed.v trafficked.v trammeled.v trammelled.v tranquillised.v transactivated.v transdifferentiated.v transduced.v transected.v transesterified.v transfected.v transfigured.v transhiped.v transilluminated.v transited.v transliterated.v translocated.v transmogrified.v transphosphorylated.v transsected.v transshiped.v trapsed.v traumatised.v traumatized.v travestied.v travestyed.v treadled.v treed.v trellised.v trenched.v trended.v trepaned.v trepanned.v trephined.v triangulated.v trichinized.v trilled.v triplicated.v trisected.v tritiated.v triturated.v trivialised.v trolled.v trooped.v trucked.v trued.v trussed.v trypsinised.v trypsinized.v tubularized.v turfed.v turgidized.v twined.v twinned.v twited.v twitted.v tyrannised.v ubiquitinated.v ultrapurified.v ultrasonicated.v unbared.v unbarred.v unbinded.v unbosomed.v unbridled.v uncaped.v uncapped.v unclamped.v uncliped.v unclipped.v uncloged.v unclogged.v uncuffed.v undeceived.v undercalled.v underdetected.v underdiagnosed.v underemphasised.v underemphasized.v underexerted.v under-fed.v under-feeded.v undernourished.v underpredicted.v undersedated.v understaged.v understained.v undertreated.v underused.v underutilised.v underutilized.v unfited.v unfitted.v unhorsed.v universalized.v unknotted.v unlearnt.v unmaned.v unravelled.v unroofed.v unsayed.v unseated.v unsexed.v unsticked.v unstuck.v upregulated.v uptaked.v urbanised.v utilised.v vacuumed.v vagotomized.v vailed.v vandalised.v vandalized.v vaporised.v vapourised.v vapourized.v variegated.v variolated.v vascularised.v vascularized.v vasectomized.v vaunted.v vd.'ed.v vd.ed.v Vd'ed.v Vded.v veneered.v ventralised.v ventralized.v ventricular_hypertrophied ventriducted.v verbalised.v victimised.v victualed.v victualled.v videoed.v virilised.v virilized.v visioned.v visualised.v vitalised.v vitalized.v vitrectomised.v vitrectomized.v vivified.v vocalised.v vogued.v volitilised.v vortexed.v vulcanised.v vulcanized.v vulgarised.v vulnerated.v wagered.v wallpapered.v wanded.v wardened.v wared.v warred.v waterloged.v wearied.v weaseled.v weaved.v weekended.v weired.v welched.v welled.v wenched.v westernised.v whisked.v whized.v whizzed.v whopped.v winched.v winkled.v wintered.v wised.v womanised.v wowed.v wracked.v wreathed.v xanthated.v xenografted.v xeroxed.v Xeroxed.v x_rayed X_rayed x-rayed.v xrayed.v X-rayed.v yarned.v yellowed.v yoked.v zenkerized.v zippered.v link-grammar-4.7.4/data/en/words/words.y0000644000175000017500000001212011142113017017075 0ustar bloombloom1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 link-grammar-4.7.4/data/en/words/currency.p0000644000175000017500000000105211274337051017576 0ustar bloombloomAfghanis.c afghanis.c Angolars.c angolars.c Argentinos.c argentinos.c Australs.c australs.c Bolívars.c bolívars.c cents.c Dollars.c dollars.c Euros.c euros.c Francs.c francs.c Franks.c franks.c Halfpennies.c halfpennies.c Kronenthalers.c kronenthalers.c Leks.c leks.c Marks.c marks.c pennies.c Pesetas.c pesetas.c Pesos.c pesos.c Pounds.c pounds.c Reals.c reals.c Rixdollars.c rixdollars.c Riyals.c riyals.c Rubles.c rubles.c Rupees.c rupees.c Rupiahs.c rupiahs.c Rupies.c rupies.c Schillings.c schillings.c Shekels.c shekels.c Shillings.c shillings.c link-grammar-4.7.4/data/en/words/words.v.2.50000644000175000017500000004113011526022265017412 0ustar bloombloomabdicating.g abiding.g aborting.g abrading.g accelerating.g acclimating.g acclimatizing.g acculturating.g accumulating.g acidifying.g adapting.g adjourning.g adjudicating.g adjusting.g advancing.g advertising.g aerosolizing.g affiliating.g agglutinating.g aggregating.g aging.g agitating.g aglomerating.g ailing.g aligning.g alimenting.g alkalifying.g allying.g altering.g alternating.g amalgamating.g Americanizing.g anastomosing.g anchoring.g anergizing.g ankylosing.g anteverting.g apostrophizing.g appealing.g applauding.g applicating.g applying.g approaching.g approximating.g arbitrating.g arborizing.g arching.g articulating.g arylating.g ascending.g assembling.g assimilating.g assisting.g associating.g attaching.g attending.g auditioning.g auguring.g autoactivating.g autocatalyzing.g autocorrelating.g autodigesting.g autolyzing.g automatizing.g autophosphorylating.g autosensitizing.g autotransfusing.g availing.g awakening.g axenizing.g bagging.g banding.g banking.g bargaining.g bartering.g bathing.ga bathing.gb batting.g baulking.g benefiting.g benefitting.g berthing.g bicompartmentalizing.g bidding.g bifurcating.g bioaccumulating.g biotesting.g blabbing.g blackening.g blacklegging.g blackleging.g blanching.g blaspheming.g bleaching.g blending.g blinking.g blistering.g bluffing.g blurring.g boggling.g bonding.g boning.g bootlegging.g bootleging.g boping.g bopping.g bordering.g borrowing.g botanizing.g bottle-feeding.g bowdlerizing.g breastfeeding.g breeding.g brewing.g bridling.g broadcasting.g broadening.g broiling.g bronchodilating.g browning.g bruxing.g budging.g buffeting.g buggering.g bullying.g burglarizing.g burgling.g burnishing.g burrowing.g cabling.g calcifiesing.g calcifying.g calcining.g cambering.g cancerizing.g canvassing.g capitalizing.g capsizing.g carping.g catabolizing.g catenating.g cationizing.g celebrating.g centering.g centring.g chanting.g charring.g chelating.g circling.g circulating.g clanging.g clapping.g clasping.g clavelizing.g cleaving.g clicking.g clinching.g clinking.g clotting.g cloying.g clutching.g coacervating.g coaching.g coagglutinating.g coaggregating.g coagulating.g coamplifying.g coarctating.g coarsening.g coaxing.g codistributing.g coextracting.g cofractionating.g cogitating.g coincubating.g coinjecting.g coinsuring.g collapsing.g collimating.g co-localising.g colocalising.g co-localizing.g colocalizing.g combining.g cometabolizing.g commencing.g commingling.g communicating.g commuting.g comparing.g compensating.g composing.g computing.g concentrating.g conceptualizing.g condensing.g conducting.g confederating.g conferring.g confiding.g congesting.g conjoining.g conjugating.g consolidating.g constipating.g consulting.g contesting.g contrasting.g contributing.g convening.g converting.g copartitioning.g coprecipitating.g copurifying.g coregistering.g correlating.g corroding.g corrugating.g corrupting.g cosedimenting.g costaining.g costaring.g co-starring.g couching.g counter-attacking.g counterattacking.g counterindicating.g countermining.g crashing.g crash-landing.g craving.g creasing.g creosoting.g cribbing.g crinkling.g crisscrossing.g crocheting.g crooning.g cross-checking.g crosschecking.g crosslinking.g cryosectioning.g crystallizing.g cuddling.g cumulating.g curdling.g cursing.g curving.g dabbing.g damping.g dangling.g daping.g dapping.g darkening.g darning.g dating.g de-acidifying.g deacidifying.g de-adapting.g deadapting.g de-aggregating.g deaggregating.g de-alcoholizing.g dealcoholizing.g de-allergizing.g deallergizing.g debarking.g debating.g de-bonding.g debonding.g de-branching.g debranching.g decelerating.g de-cidualizing.g decidualizing.g de-clamping.g declamping.g decomposing.g de-condensing.g decondensing.g de-conditioning.g deconditioning.g de-congesting.g decongesting.g de-conjugating.g deconjugating.g de-constructing.g deconstructing.g decreasing.g de-crepitating.g decrepitating.g de-differentiating.g dedifferentiating.g deepening.g de-epithelializing.g deepithelializing.g de-fibrinogenating.g defibrinogenating.g deflecting.g de-fluorinating.g defluorinating.g de-gloving.g degloving.g de-glycosylating.g deglycosylating.g de-granulating.g degranulating.g de-humidifying.g dehumidifying.g de-iodinating.g deiodinating.g delaying.g delighting.g de-masculinizing.g demasculinizing.g democratizing.g de-morphinizing.g demorphinizing.g de-naturating.g denaturating.g departmentalizing.g de-phasing.g dephasing.g de-polarizing.g depolarizing.g de-polymerizing.g depolymerizing.g de-proteinizing.g deproteinizing.g de-quenching.g dequenching.g derailing.g deriving.g derogating.g de-saturating.g desaturating.g descending.g de-squamating.g desquamating.g de-stabilizing.g destabilizing.g de-synchronizing.g desynchronizing.g detonating.g de-toxifying.g detoxifying.g developing.g de-vitrifying.g devitrifying.g dialyzing.g dichotomizing.g dictating.g differentiating.g diffusing.g digesting.g digitalizing.g digitilizing.g dilating.g dimerizing.g diminishing.g dimming.g dinning.g dipping.g disarming.g disarticulating.g disbanding.g discasing.g discharging.g discoloring.g discontinuing.g disengaging.g disentangling.g disincorporating.g disinflating.g disintegrating.g disjoining.g dismounting.g dispensing.g dispersing.g dissimulating.g dissipating.g dissolving.g distending.g distilling.g distinguishing.g disuniting.g dive-bombing.g diversifying.g diverticulizing.g divining.g docking.g dodging.g dogmatizing.g dorsalizing.g dorsiflexing.g double-clicking.g downsizing.g dreading.g dribbling.g drilling.g dripping.g drooping.g dulling.g dynamizing.g dysmyelinating.g echoing.g effluxing.g effusing.g ejaculating.g ejecting.g elaborating.g electrobloting.g electrocoagulating.g electrodialyzing.g electroejaculating.g electrofocusing.g electrofocussing.g electrotyping.g elongating.g embolizing.g embrittling.g embroidering.g emplaning.g encapsidating.g encysting.g ending.g endocytosing.g endothelializing.g enduring.g engaging.g engorging.g enlisting.g enroling.g enrolling.g entering.g entertaining.g entrenching.g enunciating.g epimerizing.g epoxidating.g eroding.g escalating.g escaping.g esterizing.g etching.g etiolating.g euhydrating.g evacuating.g evolving.g exaggerating.g excysting.g exercising.g exfoliating.g exhaling.g exogastrulating.g expanding.g expectorating.g exploding.g exploring.g expounding.g expressing.g extemporizing.g extending.g extrapolating.g extravasating.g exuviating.g famishing.g farrowing.g fastening.g feasting.g federating.g fermenting.g ferrying.g fibrillating.g fiddling.g fielding.g filming.g fissurating.g fistulizing.g fitting.g fixating.g flagging.g flapping.g flashing.g fledging.g fleeing.g flexing.g floccing.g flocculating.g flocing.g flossing.g fluidifying.g fluorinating.g focalizing.g focusing.g focussing.g foliating.g footing.g forbearing.g force-landing.g foreclosing.g forgiving.g forming.g foundering.g foveating.g fracturing.g fraying.g fronting.g frosting.g fructifying.g fudging.g fuelling.g fulgurating.g fumbling.g furling.g fusing.g gagging.g gaining.g gambling.g gaming.g gamming.g ganting.g gargling.g gasifying.g gasping.g gazumping.g gelatinizing.g generalizing.g germinating.g gestating.g gimping.g glancing.g globalizing.g glossing.g glucoronizing.g glucosylating.g gnashing.g gnawing.g governing.g granulating.g grasping.g grating.g grieving.g groaning.g groping.g grounding.g grouping.g growling.g grumbling.g grunting.g hailing.g haploidizing.g hardening.g harmonizing.g hatching.g heaving.g heckling.g hectoring.g hedging.g heightening.g hemagglutinating.g hemming.g hemoagglutinating.g hemocoagulating.g hemolyzing.g heterotransplanting.g hoarding.g hoeing.g honking.g hooting.g howling.g hugging.g humidifying.g humming.g hurting.g hushing.g hustling.g hybridizing.g hydrating.g hydrolyzing.g hyperarticulating.g hypercoagulating.g hyperhydrating.g hyperinflating.g hypermodifying.g hyperphosphorylating.g hyperpolarizing.g hyperproliferating.g hypersensitizing.g hyperventilating.g hypohydrating.g hypomethylating.g hyposecreting.g hypoventilating.g icing.g idling.g igniting.g immunomodulating.g immunoprecipitating.g imploding.g imprecating.g improving.g improvising.g incepting.g inclining.g incorporating.g increasing.g incubating.g indenting.g indulging.g indurating.g industrializing.g infibulating.g infolding.g infringing.g inhaling.g initiating.g inosculating.g insonating.g intensifying.g interbreeding.g interconnecting.g intercorrelating.g interlocking.g intermixing.g interning.g interpenetrating.g interpreting.g interrelating.g interrupting.g intersecting.g intertwining.g interviewing.g intravasating.g intriguing.g intussuscepting.g invaginating.g investigating.g investing.g invigilating.g iodizing.g ionizing.g isografting.g isomerizing.g jabbing.g jaging.g jangling.g jeering.g jigging.g jiggling.g jingling.g jolting.g jostling.g juggling.g keratinizing.g kidding.g kindling.g knitting.g labilizing.g laboring.g labouring.g lactonizing.g lamenting.g landing.g latching.g lateralizing.g launching.g lecturing.g left-clicking.g lengthening.g lessening.g levitating.g liganding.g liquefying.g liquidating.g litigating.g littering.g lobbying.g lobulating.g localising.g localizing.g locating.g lodging.g logging.g luminescing.g lunching.g luteinizing.g lysing.g macerating.g mainlining.g maldigesting.g malrotating.g maneuvering.g manoeuvring.g marbleizing.g marinating.g massing.g masturbating.g mating.g medializing.g mediating.g meeting.g melding.g meliorating.g mending.g merging.g meshing.g metallizing.g metricizing.g micellizing.g microembolizing.g microencapsulating.g milling.g miming.g mining.g misaligning.g misarticulating.g miscalculating.g miscarrying.g miscounting.g misdealing.g misfolding.g misjudging.g mistiming.g misting.g misunderstanding.g moaning.g mobilizing.g modelling.g moderating.g moistening.g mooning.g mottling.g moulding.g moulting.g mounting.g mourning.g mowing.g muddling.g multimerizing.g multiplicating.g multiplying.g mumbling.g munching.g murmuring.g muscularizing.g mutating.g myelinating.g narrowing.g navigating.g nearing.g necrotizing.g negotiating.g nephrectomizing.g nibbling.g nipping.g nitrogenizing.g nucleating.g nuzzling.g obeying.g obsessing.g occluding.g ogling.g opacifying.g operating.g opsonizing.g orbiting.g originating.g ossifying.g outbidding.g outbiding.g outspaning.g outspanning.g overarching.g overbalancing.g overcalling.g overcharging.g overclouding.g overdrawing.g overdressing.g overfeeding.g overfilling.g overfing.g overflowing.g overheating.g over-indulging.g overindulging.g overlapping.g overproducing.g overproliferating.g overreaching.g overreplicating.g oversecreting.g overspending.g overstretching.g overtraining.g overtranscribing.g overtrumping.g overturning.g overworking.g ovipositing.g oxidating.g oxidizing.g pacing.g paddling.g parading.g parking.g parsing.g particularizing.g parting.g passivizing.g pathergizing.g pealing.g pecking.g peculating.g pedaling.g pedalling.g peddling.g pending.g penetrating.g peptonizing.g perching.g performing.g peroxidizing.g petitioning.g petrifying.g phenolizing.g phlebotomizing.g photodegrading.g photodissociating.g photoisomerizing.g photolyzing.g photooxidizing.g photoreactivating.g picketing.g pillaging.g pinocytosing.g pioneering.g pitching.g placering.g plasticizing.g plundering.g poaching.g poising.g polling.g posing.g power-diving.g practising.g preaching.g preactivating.g precontracting.g preincubating.g preplaning.g preplanning.g presurfacing.g pretesting.g pringling.g privatizing.g projecting.g promenading.g pronating.g proofreading.g propagating.g protonating.g prowling.g pseudonormalizing.g puking.g puncturing.g punting.g purling.g pustulating.g puzzling.g quickening.g quietening.g racemizing.g racing.g radiating.g radioing.g rallying.g ramifying.g rancidifying.g ranging.g ranking.g rapping.g rating.g rattling.g raveling.g ravelling.g reactivating.g reacylating.g readapting.g readjusting.g reannealing.g reapplying.g rearing.g rearming.g rearresting.g reassembling.g reawakening.g rebleeding.g rebreathing.g rebreeding.g rebring.g rebuilding.g recalculating.g recanting.g recapitulating.g recapping.g receiving.g recementing.g recharging.g reciprocating.g recolonizing.g recommencing.g recomputing.g reconfirming.g reconnecting.g reconvening.g recovering.g recrossing.g recruiting.g recrystallizing.g recurving.g reddening.g redifferentiating.g redissolving.g redoubling.g reelevating.g reendothelializing.g reentering.g reepithelializing.g reequilibrating.g reeving.g reexpanding.g referring.g refing.g refiting.g refitting.g reflating.g refloating.g refocusing.g refocussing.g re-forming.g reforming.g refreezing.g refueling.g refuelling.g regenerating.g registering.g regrouping.g regrowing.g rehearsing.g rehydrating.g reincorporating.g reincubating.g reinducing.g reinflating.g reinfusing.g reinvestigating.g reinvesting.g reirradiating.g rekindling.g relating.g relaxing.g relocating.g remarrying.g remeasuring.g remineralizing.g remitting.g remobilizing.g remounting.g renegotiating.g reoccluding.g re-opening.g reopening.g reoperating.g reordering.g reorganizing.g reoxidizing.g repacking.g repairing.g rephosphorylating.g repolarizing.g reprising.g reprobing.g reproducing.g reseeding.g resensitizing.g resettling.g resigning.g respirating.g restarting.g restituting.g resuming.g resuscitating.g retailing.g retesting.g rethrombosing.g retiring.g retooling.g retrotransposing.g retruding.g returning.g reunifying.g reuniting.g reventilating.g reversing.g reviving.g revving.g rhyming.g ricocheting.g right-clicking.g rigidifying.g roaming.g roaring.g roasting.g rotating.g rousing.g rowing.g ruffling.g rupturing.g rustling.g sacrificing.g saluting.g saponifying.g scanning.g scattering.g scissoring.g sclerosing.g scoffing.g scolding.g scoring.g scrambling.g scrawling.g scribbling.g scrubbing.g sculling.g sculpturing.g searching.g seizing.g senescing.g separating.g serrating.g severing.g shading.g shaming.g shamming.g shattering.g shelling.g shop-lifting.g shoplifting.g short-circuiting.g shortening.g shoving.g showering.g shrieking.g shrinking.g shuffling.g sifting.g singeing.g sinking.g sinusoidalizing.g sipping.g skeletonizing.g skewing.g slamming.g slanting.g sledging.g slenderizing.g sloshing.g smacking.g smearing.g smoking.g smudging.g snarling.g snipping.g snorting.g snuggling.g socializing.g solidifying.g somatizing.g sowing.g spalting.g spattering.g spawning.g spiralizing.g splashing.g splaying.g splintering.g spoiling.g sponging.g sporting.g spouting.g spreadeagling.g spring-cleaning.g spying.g squashing.g stabilising.g stabilizing.g staining.g stalling.g stammering.g stampeding.g steadying.g steepening.g steeping.g steering.g stewing.g stifling.g stinging.g stinting.g stippling.g stonewalling.g straining.g stratifying.g streaking.g strengthening.g strobing.g strumming.g stumping.g subcontracting.g subdividing.g subducting.g subleasing.g subleting.g subletting.g submerging.g submitting.g substituting.g succeeding.g suffering.g suffocating.g suing.g summating.g superheating.g superinfecting.g superovulating.g supervising.g supinating.g supplicating.g surrendering.g surviving.g swallowing.g swapping.g swarming.g swaying.g sweating.g swishing.g swiveling.g swivelling.g synchronizing.g synergizing.g tackling.g tanning.g tapping.g tarnishing.g tautomerizing.g telephoning.g tending.g terminating.g tetramerizing.g thawing.g thermalizing.g thieving.g thrashing.g threshing.g thrilling.g thrombosing.g thronging.g throttling.g thruming.g thrumming.g thumping.g thundering.g tickling.g tilting.g tinging.g tining.g titivating.g titrating.g toasting.g tooting.g tracing.g trading.g transaminating.g transcomplementing.g transcytosing.g transferring.g transgressing.g translating.g transplanting.g trawling.g treating.g trebling.g triaging.g trimerizing.g trotting.g troubleshooting.g trumpeting.g trumping.g tuberculizing.g tugging.g tuming.g tumming.g twanging.g twirling.g ulcerating.g umpiring.g unbending.g uncoating.g uncoiling.g uncurling.g underbidding.g undercorrecting.g underfeeding.g underprescribing.g underreporting.g underspending.g undressing.g unfastening.g unfolding.g unhitching.g unifying.g unionizing.g uniting.g unknoting.g unloading.g unlocking.g unpacking.g unraveling.g unrolling.g unscrewing.g unstressing.g untwisting.g untying.g unwinding.g unwrapping.g uploading.g urbanizing.g vaporizing.g varicellizing.g varying.g vasodilating.g venturing.g versifying.g verting.g vesicating.g vesiculating.g vesting.g vibrating.g visiting.g vitrifying.g vituperating.g vociferating.g volatilizing.g volleying.g vomiting.g wading.g wagging.g waggling.g wailing.g wakening.g warping.g watering.g waxing.g weakening.g wedding.g welding.g whealing.g wheeling.g whining.g whirling.g whistling.g whitening.g whittling.g whorling.g widening.g wiggling.g withdrawing.g worsening.g worshiping.g worshipping.g wrestling.g wrinkling.g yelling.g yielding.g yodelling.g link-grammar-4.7.4/data/en/words/words.v.8.40000644000175000017500000000232211526022265017417 0ustar bloombloomauctioning.v bandying.v barring.v battening.v blocking.v blotting.v blurting.v boarding.v booking.v bottling.v bundling.v buttering.v caging.v carrying.v carting.v chalking.v chasing.v chucking.v cluttering.v covering.v cranking.v cutting.v damming.v dishing.v dividing.v doling.v dredging.v dumping.v egging.v eking.v exporting.v factoring.v faxing.v fixing.v flinging.v fobbing.v gouging.v hamming.v hashing.v hoisting.v jacking.v jazzing.v jotting.v kicking.v ladling.v laying.v lifting.v linking.v loading.v locking.v lopping.v mailing.v mapping.v marking.v meting.v mulling.v mussing.v nailing.v palming.v patching.v paving.v penning.v phasing.v phoning.v picking.v piecing.v pinning.v plugging.v pricking.v propping.v punching.v pushing.v racking.v reining.v rigging.v riling.v rinsing.v roughening.v roughing.v saving.v scaling.v scaring.v screening.v shaking.v shoring.v singling.v sizing.v skimming.v skittling.v smuggling.v sopping.v sorting.v spicing.v stacking.v staking.v staving.v stringing.v stuffing.v sussing.v sweeping.v tacking.v taping.v tearing.v throwing.v tiding.v topping.v totaling.v totalling.v touching.v toughening.v tracking.v tying.v wadding.v washing.v waving.v wearing.v wringing.v yanking.v zipping.v link-grammar-4.7.4/data/en/words/words.v.2.40000644000175000017500000004111511526022265017414 0ustar bloombloomabdicating.v abiding.v aborting.v abrading.v accelerating.v acclimating.v acclimatizing.v acculturating.v accumulating.v acidifying.v adapting.v adjourning.v adjudicating.v adjusting.v advancing.v advertising.v aerosolizing.v affiliating.v agglutinating.v aggregating.v aging.v agitating.v aglomerating.v ailing.v aligning.v alimenting.v alkalifying.v allying.v altering.v alternating.v amalgamating.v Americanizing.v anastomosing.v anchoring.v anergizing.v ankylosing.v anteverting.v apostrophizing.v appealing.v applauding.v applicating.v applying.v approaching.v approximating.v arbitrating.v arborizing.v arching.v articulating.v arylating.v ascending.v assembling.v assimilating.v assisting.v associating.v attaching.v attending.v auditioning.v auguring.v autoactivating.v autocatalyzing.v autocorrelating.v autodigesting.v autolyzing.v automatizing.v autophosphorylating.v autosensitizing.v autotransfusing.v availing.v awakening.v axenizing.v bagging.v banding.v banking.v bargaining.v bartering.v bathing.va bathing.vb batting.v baulking.v benefiting.v benefitting.v berthing.v bicompartmentalizing.v bidding.v bifurcating.v bioaccumulating.v biotesting.v blabbing.v blackening.v blacklegging.v blackleging.v blanching.v blaspheming.v bleaching.v blending.v blinking.v blistering.v bluffing.v blurring.v boggling.v bonding.v boning.v bootlegging.v bootleging.v boping.v bopping.v bordering.v borrowing.v botanizing.v bottle-feeding.v bowdlerizing.v breastfeeding.v breeding.v brewing.v bridling.v broadcasting.v broadening.v broiling.v bronchodilating.v browning.v bruxing.v budging.v buffeting.v buggering.v bullying.v burglarizing.v burgling.v burnishing.v burrowing.v cabling.v calcifiesing.v calcifying.v calcining.v cambering.v cancerizing.v canvassing.v capitalizing.v capsizing.v carping.v catabolizing.v catenating.v cationizing.v celebrating.v centering.v centring.v chanting.v charring.v chelating.v circling.v circulating.v clanging.v clapping.v clasping.v clavelizing.v cleaving.v clicking.v clinching.v clinking.v clotting.v cloying.v clutching.v coacervating.v coaching.v coagglutinating.v coaggregating.v coagulating.v coamplifying.v coarctating.v coarsening.v coaxing.v codistributing.v coextracting.v cofractionating.v cogitating.v coincubating.v coinjecting.v coinsuring.v collapsing.v collimating.v co-localising.v colocalising.v co-localizing.v colocalizing.v combining.v cometabolizing.v commencing.v commingling.v communicating.v commuting.v comparing.v compensating.v composing.v computing.v concentrating.v conceptualizing.v condensing.v conducting.v confederating.v conferring.v confiding.v congesting.v conjoining.v conjugating.v consolidating.v constipating.v consulting.v contesting.v contrasting.v contributing.v convening.v converting.v copartitioning.v coprecipitating.v copurifying.v coregistering.v correlating.v corroding.v corrugating.v corrupting.v cosedimenting.v costaining.v costaring.v co-starring.v couching.v counter-attacking.v counterattacking.v counterindicating.v countermining.v crashing.v crash-landing.v craving.v creasing.v creosoting.v cribbing.v crinkling.v crisscrossing.v crocheting.v crooning.v cross-checking.v crosschecking.v crosslinking.v cryosectioning.v crystallizing.v cuddling.v cumulating.v curdling.v cursing.v curving.v dabbing.v damping.v dangling.v daping.v dapping.v darkening.v darning.v dating.v de-acidifying.v deacidifying.v de-adapting.v deadapting.v de-aggregating.v deaggregating.v de-alcoholizing.v dealcoholizing.v de-allergizing.v deallergizing.v debarking.v debating.v de-bonding.v debonding.v de-branching.v debranching.v decelerating.v de-cidualizing.v decidualizing.v de-clamping.v declamping.v decomposing.v de-condensing.v decondensing.v de-conditioning.v deconditioning.v de-congesting.v decongesting.v de-conjugating.v deconjugating.v de-constructing.v deconstructing.v decreasing.v de-crepitating.v decrepitating.v de-differentiating.v dedifferentiating.v deepening.v de-epithelializing.v deepithelializing.v de-fibrinogenating.v defibrinogenating.v deflecting.v de-fluorinating.v defluorinating.v de-gloving.v degloving.v de-glycosylating.v deglycosylating.v de-granulating.v degranulating.v de-humidifying.v dehumidifying.v de-iodinating.v deiodinating.v delaying.v delighting.v de-masculinizing.v demasculinizing.v democratizing.v de-morphinizing.v demorphinizing.v de-naturating.v denaturating.v departmentalizing.v de-phasing.v dephasing.v de-polarizing.v depolarizing.v de-polymerizing.v depolymerizing.v de-proteinizing.v deproteinizing.v de-quenching.v dequenching.v derailing.v deriving.v derogating.v de-saturating.v desaturating.v descending.v de-squamating.v desquamating.v de-stabilizing.v destabilizing.v de-synchronizing.v desynchronizing.v detonating.v de-toxifying.v detoxifying.v developing.v de-vitrifying.v devitrifying.v dialyzing.v dichotomizing.v dictating.v differentiating.v diffusing.v digesting.v digitalizing.v digitilizing.v dilating.v dimerizing.v diminishing.v dimming.v dinning.v dipping.v disarming.v disarticulating.v disbanding.v discasing.v discharging.v discoloring.v discontinuing.v disengaging.v disentangling.v disincorporating.v disinflating.v disjoining.v dismounting.v dispensing.v dispersing.v dissimulating.v dissipating.v dissolving.v distending.v distilling.v distinguishing.v disuniting.v dive-bombing.v diversifying.v diverticulizing.v divining.v docking.v dodging.v dogmatizing.v dorsalizing.v dorsiflexing.v double-clicking.v downsizing.v dreading.v dribbling.v drilling.v dripping.v drooping.v dulling.v dynamizing.v dysmyelinating.v echoing.v effluxing.v effusing.v ejaculating.v ejecting.v elaborating.v electrobloting.v electrocoagulating.v electrodialyzing.v electroejaculating.v electrofocusing.v electrofocussing.v electrotyping.v elongating.v embolizing.v embrittling.v embroidering.v emplaning.v encapsidating.v encysting.v ending.v endocytosing.v endothelializing.v enduring.v engaging.v engorging.v enlisting.v enroling.v enrolling.v entering.v entertaining.v entrenching.v enunciating.v epimerizing.v epoxidating.v eroding.v escalating.v escaping.v esterizing.v etching.v etiolating.v euhydrating.v evacuating.v evolving.v exaggerating.v excysting.v exercising.v exfoliating.v exhaling.v exogastrulating.v expanding.v expectorating.v exploding.v exploring.v expounding.v expressing.v extemporizing.v extending.v extrapolating.v extravasating.v exuviating.v famishing.v farrowing.v fastening.v feasting.v federating.v fermenting.v ferrying.v fibrillating.v fiddling.v fielding.v filming.v fissurating.v fistulizing.v fitting.v fixating.v flagging.v flapping.v flashing.v fledging.v fleeing.v flexing.v floccing.v flocculating.v flocing.v flossing.v fluidifying.v fluorinating.v focalizing.v focusing.v focussing.v foliating.v footing.v forbearing.v force-landing.v foreclosing.v forgiving.v forming.v foundering.v foveating.v fracturing.v fraying.v fronting.v frosting.v fructifying.v fudging.v fuelling.v fulgurating.v fumbling.v furling.v fusing.v gagging.v gaining.v gambling.v gaming.v gamming.v ganting.v gargling.v gasifying.v gasping.v gazumping.v gelatinizing.v generalizing.v germinating.v gestating.v gimping.v glancing.v globalizing.v glossing.v glucoronizing.v glucosylating.v gnashing.v gnawing.v governing.v granulating.v grasping.v grating.v grieving.v groaning.v groping.v grounding.v grouping.v growling.v grumbling.v grunting.v hailing.v haploidizing.v hardening.v harmonizing.v hatching.v heaving.v heckling.v hectoring.v hedging.v heightening.v hemagglutinating.v hemming.v hemoagglutinating.v hemocoagulating.v hemolyzing.v heterotransplanting.v hoarding.v hoeing.v honking.v hooting.v howling.v hugging.v humidifying.v humming.v hurting.v hushing.v hustling.v hybridizing.v hydrating.v hydrolyzing.v hyperarticulating.v hypercoagulating.v hyperhydrating.v hyperinflating.v hypermodifying.v hyperphosphorylating.v hyperpolarizing.v hyperproliferating.v hypersensitizing.v hyperventilating.v hypohydrating.v hypomethylating.v hyposecreting.v hypoventilating.v icing.v idling.v igniting.v immunomodulating.v immunoprecipitating.v imploding.v imprecating.v improving.v improvising.v incepting.v inclining.v incorporating.v increasing.v incubating.v indenting.v indulging.v indurating.v industrializing.v infibulating.v infolding.v infringing.v inhaling.v initiating.v inosculating.v insonating.v intensifying.v interbreeding.v interconnecting.v intercorrelating.v interlocking.v intermixing.v interning.v interpenetrating.v interpreting.v interrelating.v interrupting.v intersecting.v intertwining.v interviewing.v intravasating.v intriguing.v intussuscepting.v invaginating.v investigating.v investing.v invigilating.v iodizing.v ionizing.v isografting.v isomerizing.v jabbing.v jaging.v jangling.v jeering.v jigging.v jiggling.v jingling.v jolting.v jostling.v juggling.v keratinizing.v kidding.v kindling.v knitting.v labilizing.v labouring.v lactonizing.v lamenting.v landing.v latching.v lateralizing.v launching.v lecturing.v left-clicking.v lengthening.v lessening.v levitating.v liganding.v liquefying.v liquidating.v litigating.v littering.v lobbying.v lobulating.v localising.v localizing.v locating.v lodging.v luminescing.v lunching.v luteinizing.v lysing.v macerating.v mainlining.v maldigesting.v malrotating.v maneuvering.v manoeuvring.v marbleizing.v marinating.v massing.v masturbating.v mating.v medializing.v mediating.v meeting.v melding.v meliorating.v mending.v merging.v meshing.v metallizing.v metricizing.v micellizing.v microembolizing.v microencapsulating.v milling.v miming.v mining.v misaligning.v misarticulating.v miscalculating.v miscarrying.v miscounting.v misdealing.v misfolding.v misjudging.v mistiming.v misting.v mistunderstanding.v misunderstanding.v moaning.v mobilizing.v modelling.v moderating.v modernizing.g modernizing.v moistening.v mooning.v mottling.v moulding.v moulting.v mounting.v mourning.v mowing.v muddling.v multimerizing.v multiplicating.v multiplying.v mumbling.v munching.v murmuring.v muscularizing.v mutating.v myelinating.v narrowing.v navigating.v nearing.v necrotizing.v negotiating.v nephrectomizing.v nibbling.v nipping.v nitrogenizing.v nucleating.v nuzzling.v obeying.v obsessing.v occluding.v ogling.v opacifying.v operating.v opsonizing.v orbiting.v originating.v ossifying.v outbidding.v outbiding.v outspaning.v outspanning.v overarching.v overbalancing.v overcalling.v overcharging.v overclouding.v overdrawing.v overdressing.v overfeeding.v overfilling.v overfing.v overflowing.v overheating.v over-indulging.v overindulging.v overlapping.v overproducing.v overproliferating.v overreaching.v overreplicating.v oversecreting.v overspending.v overstretching.v overtraining.v overtranscribing.v overtrumping.v overturning.v overworking.v ovipositing.v oxidating.v oxidizing.v pacing.v paddling.v parading.v parking.v parsing.v particularizing.v parting.v passivizing.v pathergizing.v pealing.v pecking.v peculating.v pedaling.v pedalling.v peddling.v pending.v penetrating.v peptonizing.v perching.v performing.v peroxidizing.v petitioning.v petrifying.v phenolizing.v phlebotomizing.v photodegrading.v photodissociating.v photoisomerizing.v photolyzing.v photooxidizing.v photoreactivating.v picketing.v pillaging.v pinocytosing.v pioneering.v pitching.v placering.v plasticizing.v plundering.v poaching.v poising.v polling.v posing.v power-diving.v practising.v preaching.v preactivating.v precontracting.v preincubating.v preplaning.v preplanning.v presurfacing.v pretesting.v pringling.v privatizing.v projecting.v promenading.v pronating.v proofreading.v propagating.v protonating.v prowling.v pseudonormalizing.v puking.v puncturing.v punting.v purling.v pustulating.v puzzling.v quickening.v quietening.v racemizing.v racing.v radiating.v radioing.v rallying.v ramifying.v rancidifying.v ranging.v ranking.v rapping.v rating.v rattling.v raveling.v ravelling.v reactivating.v reacylating.v readapting.v readjusting.v reannealing.v reapplying.v rearing.v rearming.v rearresting.v reassembling.v reawakening.v rebleeding.v rebreathing.v rebreeding.v rebring.v rebuilding.v recalculating.v recanting.v recapitulating.v recapping.v receiving.v recementing.v recharging.v reciprocating.v recolonizing.v recommencing.v recomputing.v reconfirming.v reconnecting.v reconvening.v recovering.v recrossing.v recruiting.v recrystallizing.v recurving.v reddening.v redifferentiating.v redissolving.v redoubling.v reelevating.v reendothelializing.v reentering.v reepithelializing.v reequilibrating.v reeving.v reexpanding.v referring.v refing.v refiting.v refitting.v reflating.v refloating.v refocusing.v refocussing.v re-forming.v reforming.v refreezing.v refueling.v refuelling.v regenerating.v registering.v regrouping.v regrowing.v rehearsing.v rehydrating.v reincorporating.v reincubating.v reinducing.v reinflating.v reinfusing.v reinvestigating.v reinvesting.v reirradiating.v rekindling.v relating.v relaxing.v relocating.v remarrying.v remeasuring.v remineralizing.v remitting.v remobilizing.v remounting.v renegotiating.v reoccluding.v re-opening.v reopening.v reoperating.v reordering.v reorganizing.v reoxidizing.v repacking.v repairing.v rephosphorylating.v repolarizing.v reprising.v reprobing.v reproducing.v reseeding.v resensitizing.v resettling.v resigning.v respirating.v restarting.v restituting.v resuming.v resuscitating.v retailing.v retesting.v rethrombosing.v retiring.v retooling.v retrotransposing.v retruding.v returning.v reunifying.v reuniting.v reventilating.v reversing.v reviving.v revving.v rhyming.v ricocheting.v right-clicking.v rigidifying.v roaming.v roaring.v roasting.v rotating.v rousing.v rowing.v ruffling.v rupturing.v rustling.v sacrificing.v saluting.v saponifying.v scanning.v scattering.v scissoring.v sclerosing.v scoffing.v scolding.v scoring.v scrambling.v scrawling.v scribbling.v scrubbing.v sculling.v sculpturing.v searching.v seizing.v senescing.v separating.v serrating.v severing.v shading.v shaming.v shamming.v shattering.v shelling.v shop-lifting.v shoplifting.v short-circuiting.v shortening.v shoving.v showering.v shrieking.v shrinking.v shuffling.v sifting.v singeing.v sinking.v sinusoidalizing.v sipping.v skeletonizing.v skewing.v slamming.v slanting.v sledging.v slenderizing.v sloshing.v smacking.v smearing.v smoking.v smudging.v snarling.v snipping.v snorting.v snuggling.v socializing.v solidifying.v somatizing.v sowing.v spalting.v spattering.v spawning.v spiralizing.v splashing.v splaying.v splintering.v spoiling.v sponging.v sporting.v spouting.v spreadeagling.v spring-cleaning.v spying.v squashing.v stabilising.v stabilizing.v staining.v stalling.v stammering.v stampeding.v steadying.v steepening.v steeping.v steering.v stewing.v stifling.v stinging.v stinting.v stippling.v stonewalling.v straining.v stratifying.v streaking.v strengthening.v strobing.v strumming.v stumping.v subcontracting.v subdividing.v subducting.v subleasing.v subleting.v subletting.v submerging.v submitting.v substituting.v succeeding.v suffering.v suffocating.v suing.v summating.v superheating.v superinfecting.v superovulating.v supervising.v supinating.v supplicating.v surrendering.v surviving.v swallowing.v swapping.v swaying.v sweating.v swishing.v swiveling.v swivelling.v synchronizing.v synergizing.v tackling.v tanning.v tapping.v tarnishing.v tautomerizing.v telephoning.v terminating.v tetramerizing.v thawing.v thermalizing.v thieving.v thrashing.v threshing.v thrilling.v thrombosing.v thronging.v throttling.v thruming.v thrumming.v thumping.v thundering.v tickling.v tilting.v tinging.v tining.v titivating.v titrating.v toasting.v tooting.v tracing.v trading.v transaminating.v transcomplementing.v transcytosing.v transferring.v transgressing.v translating.v transplanting.v trawling.v treating.v trebling.v triaging.v trimerizing.v trotting.v troubleshooting.v trumpeting.v trumping.v tuberculizing.v tugging.v tuming.v tumming.v twanging.v twirling.v ulcerating.v umpiring.v unbending.v uncoating.v uncoiling.v uncurling.v underbidding.v undercorrecting.v underfeeding.v underprescribing.v underreporting.v underspending.v undressing.v unfastening.v unfolding.v unhitching.v unifying.v unionizing.v uniting.v unknoting.v unloading.v unlocking.v unpacking.v unraveling.v unrolling.v unscrewing.v unstressing.v untwisting.v untying.v unwinding.v unwrapping.v uploading.v urbanizing.v vaporizing.v varicellizing.v varying.v vasodilating.v venturing.v versifying.v verting.v vesicating.v vesiculating.v vesting.v vibrating.v visiting.v vitrifying.v vituperating.v vociferating.v volatilizing.v volleying.v vomiting.v wading.v wagging.v waggling.v wailing.v wakening.v warping.v watering.v waxing.v weakening.v wedding.v welding.v whealing.v wheeling.v whining.v whirling.v whistling.v whitening.v whittling.v whorling.v widening.v wiggling.v withdrawing.v worsening.v worshiping.v worshipping.v wrestling.v wrinkling.v yelling.v yielding.v yodelling.v link-grammar-4.7.4/data/en/words/units.40000644000175000017500000000034411244061301017002 0ustar bloombloomcentury.u millenium.u year.u month.u week.u day.u hour.u minute.u Second.u second.u s.u aS.u fS.u pS.u nS.u uS.u μS.u mS.u S.u kS.u millisecond.u microsecond.u nanosecond.u picosecond.u femtosecond.u attosecond.u msec.u secs.u link-grammar-4.7.4/data/en/words/words.v.4.50000644000175000017500000007563211526022265017432 0ustar bloombloomabasing.g abbreviating.g abducting.g abetting.g abhorring.g abolishing.g abridging.g abrogating.g absorbing.g abstracting.g abusing.g abutting.g accenting.g accentuating.g accessing.g acclaiming.g accommodating.g accompanying.g accomplishing.g accosting.g accrediting.g accreting.g accustoming.g acerbating.g achieving.g acquainting.g acquiring.g activating.g addicting.g addling.g addressing.g adjudging.g administering.g admiring.g admonishing.g adoring.g adorning.g adulterating.g adumbrating.g aerating.g affecting.g affixing.g afflicting.g aggrandizing.g aggravating.g alienating.g allaying.g alleviating.g allocating.g allotting.g amassing.g ambushing.g ameliorating.g amending.g amortizing.g amplifying.g amputating.g anaesthetizing.g anathematizing.g anesthetizing.g angering.g anglicizing.g animating.g annealing.g annexing.g annihilating.g annointing.g annotating.g annulling.g anointing.g antagonizing.g antedating.g anthologizing.g anthropomorphizing.g aping.g appalling.g appeasing.g appending.g apportioning.g appraising.g apprehending.g apprenticing.g apprising.g appropriating.g arming.g arousing.g arraigning.g arraying.g arresting.g arrogating.g ascribing.g asphalting.g asphyxiating.g aspirating.g assailing.g assassinating.g assaulting.g assaying.g assuaging.g atomizing.g attacking.g attaining.g attainting.g attenuating.g attiring.g attracting.g attributing.g attuning.g auditing.g augmenting.g authenticating.g autographing.g automating.g avenging.g averring.g averting.g awaiting.g awing.g axing.g backdating.g badgering.g baffling.g baiting.g baking.g balancing.g baling.g bamboozling.g bandaging.g banishing.g bankrupting.g banning.g baptizing.g barbarizing.g barbecuing.g baring.g barrelling.g barricading.g bashing.g basing.g basting.g battering.g battling.g beaking.g beaning.g beatifying.g beautifying.g bedevilling.g befalling.g befitting.g befouling.g befriending.g begetting.g beggaring.g beguiling.g beheading.g beholding.g bejeweling.g belabouring.g belittling.g belting.g belying.g bemoaning.g benching.g bequeathing.g berating.g bereaving.g beseeching.g besieging.g besmirching.g bespeaking.g besting.g bestirring.g bestowing.g bestrewing.g bestriding.g betokening.g betraying.g bevelling.g bewailing.g bewildering.g bewitching.g biasing.g biding.g biffing.g bilking.g billeting.g billing.g birching.g bisecting.g blackballing.g blacklisting.g blackmailing.g blading.g blaming.g blanketing.g blasting.g blazoning.g blemishing.g blessing.g blighting.g blindfolding.g blinding.g blitzing.g blockading.g blow-drying.g bludgeoning.g blue-pencilling.g blunting.g bolding.g bolstering.g bombarding.g bombing.g bookending.g boosting.g bossing.g botching.g boycotting.g bracing.g bracketing.g braiding.g brainwashing.g braising.g branding.g brandishing.g braving.g breaching.g bribing.g bricking.g bridging.g briefing.g brining.g broaching.g brocading.g brokering.g bronzing.g brooking.g browbeating.g brutalizing.g budgeting.g buffing.g bugging.g bulldozing.g bunging.g bungling.g buoying.g burdening.g burlesquing.g burying.g busying.g butchering.g buttonholing.g buttressing.g by-passing.g bypassing.g cajoling.g calibrating.g camouflaging.g caning.g cannibalizing.g canonising.g canonizing.g caping.g capping.g captivating.g capturing.g carbonizing.g carbureting.g carding.g caressing.g caricaturing.g carjacking.g carpeting.g casing.g castigating.g castrating.g cataloguing.g catapulting.g categorizing.g ceding.g cementing.g censoring.g censuring.g centralising.g centralizing.g chagrining.g chaining.g chairing.g championing.g channelling.g chaperoning.g charming.g chartering.g charting.g chastening.g chastising.g cheapening.g checkmating.g cherishing.g chiding.g chiselling.g chlorinating.g chording.g christening.g chroming.g chronicling.g circularizing.g circumcising.g circumnavigating.g circumscribing.g circumventing.g citing.g civilizing.g clading.g clamping.g classifying.g clawing.g cleansing.g clenching.g clipping.g cloaking.g clobbering.g cloistering.g cloning.g closeting.g clothing.g clubbing.g coating.g co-authoring.g coauthoring.g cobbling.g cocking.g coddling.g codenaming.g codifying.g coding.g coercing.g cofounding.g coining.g cold-shouldering.g collaring.g collating.g collecting.g collectivizing.g colocating.g collocating.g colonizing.g combating.g combatting.g comforting.g commandeering.g commemorating.g commending.g commercializing.g compacting.g compartmentalizing.g compiling.g complementing.g completing.g complicating.g complimenting.g composting.g compounding.g comprehending.g compressing.g comprising.g computerizing.g concealing.g concerning.g conciliating.g concocting.g conditioning.g condoning.g configuring.g confining.g confiscating.g conflating.g confounding.g confronting.g confusing.g confuting.g congaing.g congratulating.g conjuring.g conking.g conning.g connoting.g conquering.g conscripting.g consecrating.g conserving.g consigning.g consoling.g constituting.g constraining.g constricting.g constructing.g construing.g consuming.g consummating.g contacting.g containing.g contaminating.g contenting.g contorting.g contouring.g contradicting.g contravening.g contriving.g controlling.g convecting.g conventionalizing.g conveying.g convoking.g convoying.g convulsing.g cooping.g co-opting.g coordinating.g co-producing.g copying.g copyrighting.g cording.g cordoning.g coring.g corking.g cornering.g corralling.g correcting.g corroborating.g countenancing.g counteracting.g counterbalancing.g counterfeiting.g countermanding.g countersigning.g countersuing.g coupling.g courting.g court-martialing.g coveting.g coxing.g cradling.g cramping.g craning.g crayoning.g creaming.g creating.g crediting.g cremating.g criming.g crimping.g crippling.g criticizing.g crossbreeding.g cross-examining.g cross-fertilizing.g cross-indexing.g cross-questioning.g crowning.g crucifying.g crushing.g cubing.g cudgeling.g cuffing.g culling.g cultivating.g cupping.g curbing.g curing.g currying.g curtailing.g cushioning.g damaging.g damning.g dampening.g dandling.g daubing.g daunting.g dazing.g dazzling.g deadening.g deafening.g debarring.g debasing.g debauching.g debilitating.g debiting.g debriefing.g debugging.g debunking.g decanting.g decapitating.g decarbonizing.g deceiving.g decentralizing.g decertifying.g decimalizing.g decimating.g deciphering.g decking.g declaiming.g declassifying.g decoding.g decolonizing.g decompressing.g deconsecrating.g decontaminating.g decorating.g decrying.g decrypting.g dedicating.g deducting.g deeding.g deep-freezing.g deepthroating.g de-escalating.g defacing.g defaming.g defeating.g defending.g deferring.g defiling.g defining.g deflating.g deflowering.g defoliating.g deforesting.g deforming.g defragmenting.g defrauding.g defraying.g defrocking.g defrosting.g defunding.g defusing.g defying.g degrading.g dehumanizing.g dehydrating.g de-icing.g deifying.g delegating.g deleting.g delimiting.g delineating.g delisting.g deluding.g deluging.g demagnetizing.g demarcating.g demeaning.g demerging.g demilitarizing.g demisting.g demobilizing.g demolishing.g demonizing.g demoralizing.g demoting.g demutualising.g denationalizing.g denigrating.g denominating.g denoting.g denouncing.g denting.g denting.v denuding.g deodorizing.g depleting.g deploring.g deploying.g depopulating.g deporting.g deposing.g depositing.g deprecating.g deprogramming.g deranging.g deriding.g desalinating.g desalinizing.g desecrating.g desegregating.g desensitizing.g deserting.g desiccating.g despatching.g despising.g despoiling.g destroying.g detaching.g detaining.g detecting.g deterring.g detesting.g dethroning.g detuning.g devaluating.g devaluing.g devastating.g devising.g devoting.g devouring.g dewatering.g diagnosing.g dicing.g diddling.g diffracting.g dignifying.g diluting.g directing.g disabling.g disaffiliating.g disallowing.g disappointing.g disarranging.g disassembling.g disassociating.g disavowing.g disbursing.g discarding.g disciplining.g disclaiming.g discomfiting.g disconcerting.g disconnecting.g discontenting.g discounting.g discouraging.g discrediting.g disdaining.g disembarrassing.g disembowelling.g disenchanting.g disenfranchising.g disestablishing.g disfavouring.g disfiguring.g disfranchising.g disgorging.g disgracing.g disguising.g disheartening.g dishonouring.g disillusioning.g disinfecting.g disinheriting.g disinterring.g dislocating.g dislodging.g dismantling.g dismembering.g dismissing.g disobeying.g disorientating.g disorienting.g disowning.g disparaging.g dispatching.g dispelling.g displacing.g displaying.g displeasing.g dispossessing.g disproving.g disqualifying.g disregarding.g disrupting.g dissecting.g disseminating.g dissing.g dissociating.g dissuading.g distancing.g distorting.g distracting.g distributing.g distrusting.g disturbing.g ditching.g diverting.g divesting.g divorcing.g divulging.g dizzying.g doctoring.g doffing.g domesticating.g dominating.g donating.g donning.g dooming.g doping.g dotting.g double-checking.g double-crossing.g dousing.g downgrading.g downing.g downloading.g downplaying.g dragooning.g dramatizing.g draping.g drenching.g drip-drying.g drubbing.g drugging.g dry-cleaning.g ducting.g dumbfounding.g dunking.g duping.g duplicating.g dusting.g dwarfing.g dyeing.g dynamiting.g earmarking.g earning.g eclipsing.g edifying.g editing.g effacing.g effecting.g elbowing.g electrifying.g electrocuting.g electrolyzing.g elevating.g eliciting.g eliding.g eliminating.g elucidating.g eluding.g emancipating.g emasculating.g embalming.g embargoing.g embedding.g embellishing.g embezzling.g embittering.g emblazoning.g embodying.g emboldening.g embossing.g embracing.g embroiling.g emending.g emitting.g empanelling.g empowering.g emulating.g emulsifying.g enacting.g enamelling.g encasing.g enchanting.g encircling.g enclosing.g encoding.g encompassing.g encountering.g encrypting.g encumbering.g endangering.g endearing.g endorsing.g endowing.g enervating.g enfeoffing.g enfolding.g enforcing.g enfranchising.g engendering.g engineering.g engraving.g engrossing.g engulfing.g enhancing.g enjoining.g enlarging.g enlightening.g enlivening.g enmeshing.g ennobling.g enraging.g enriching.g ensconcing.g enshrining.g enshrouding.g enslaving.g ensnaring.g ensouling.g entangling.g enthralling.g enthroning.g enthusing.g entombing.g entraining.g entrancing.g entrapping.g entreating.g entrusting.g entwining.g enumerating.g enveloping.g envying.g epitomizing.g equalizing.g equalling.g equating.g equipping.g eradicating.g erasing.g erecting.g eschewing.g escorting.g espousing.g espying.g esteeming.g eulogizing.g evading.g evicting.g evincing.g eviscerating.g evoking.g exacerbating.g exalting.g exasperating.g excavating.g exceeding.g excepting.g exchanging.g excising.g excluding.g excommunicating.g excoriating.g excreting.g exculpating.g excusing.g executing.g exemplifying.g exempting.g exerting.g exhausting.g exhibiting.g exhilarating.g exhuming.g exiling.g exorcizing.g expediting.g expelling.g expending.g experiencing.g expiating.g explicating.g exploiting.g exposing.g expropriating.g expunging.g expurgating.g extenuating.g exterminating.g externalizing.g extinguishing.g extirpating.g extolling.g extorting.g extracting.g extraditing.g extricating.g exuding.g eying.g fabricating.g facelifting.g faceting.g facilitating.g fagging.g faking.g falsifying.g familiarizing.g fancying.g fascinating.g fashioning.g fathoming.g fatiguing.g fating.g faulting.g favoriting.g favouring.g fazing.g feathering.g featuring.g feigning.g felling.g fencing.g ferreting.g fertilizing.g festooning.g feting.g fettering.g fianchettoing.g filleting.g finalizing.g financing.g fine-tuning. fingering.g firebombing.g flagellating.g flanking.g flattering.g flaunting.g flavouring.g flaying.g fleecing.g flicking.g flogging.g floodlighting.g flooring.g flouting.g fluffing.g flummoxing.g fluoridating.g flurrying.g flustering.g foiling.g foisting.g fomenting.g fonding.g fondling.g fooling.g force-feeding.g fording.g forecasting.g foregoing.g foreordaining.g foreshadowing.g foreshortening.g forestalling.g foreswearing.g foretelling.g forfeiting.g forging.g forgoing.g formalizing.g formulating.g forsaking.g forswearing.g fortifying.g forwarding.g fostering.g founding.g framing.g franking.g frazzling.g freeing.g frequenting.g frescoing.g fricasseeing.g frightening.g frisking.g frittering.g frogmarching.g frustrating.g frying.g fulfilling.g fumigating.g funding.g funnelling.g furbishing.g furnishing.g furrowing.g furthering.g gaging.g gainsaying.g galling.g galvanizing.g gaoling.g garbing.g garbling.g garnering.g garnishing.g garrisoning.g gashing.g gatecrashing.g gauging.g generating.g genericizing.g gerrymandering.g ghettoizing.g gilding.g ginning.g girding.g glaciating.g gladdening.g glamorizing.g gleaning.g glimpsing.g glorifying.g glutting.g goading.g gorging.g goring.g grabbing.g gracing.g grading.g grafting.g gratifying.g gravelling.g greasing.g greenlighting.g greeting.g grilling.g gripping.g gritting.g groining.g grooming.g grossing.g grudging.g guarding.g guiding.g guillotining.g gumming.g gunning.g gutting.g guzzling.g gypping.g hallowing.g halting.g halving.g hampering.g hamstringing.g handcrafting.g handcuffing.g handicapping.g handling.g haranguing.g harassing.g harboring.g harbouring.g harming.g harnessing.g harpooning.g harrowing.g harrying.g harvesting.g hassling.g haunting.g hawking.g hazarding.g hazing.g headquartering.g heaping.g heartening.g hearting.g heeding.g helming.g heralding.g highjacking.g highlighting.g hijacking.g hindering.g hitting.g hoaxing.g hobbling.g hocking.g hogging.g hollowing.g homesteading.g homogenizing.g honing.g honoring.g honouring.g hooding.g hoodwinking.g horrifying.g horsewhipping.g hosing.g hospitalizing.g hosting.g hotfooting.g hounding.g housing.g hulling.g humbling.g humbugging.g humiliating.g humouring.g humping.g hunching.g hurling.g husking.g hyphenating.g hypnotizing.g idealizing.g identifying.g idolizing.g ignoring.g ill-treating.g illuminating.g illumining.g illustrating.g imaging.g imbibing.g imbuing.g imitating.g immersing.g immobilizing.g immolating.g immortalizing.g immunizing.g impacting.g impairing.g impaling.g impanelling.g imparting.g impeaching.g impeding.g imperilling.g impersonating.g implanting.g implementing.g implicating.g importing.g imposing.g impounding.g impoverishing.g impregnating.g impressing.g imprinting.g imprisoning.g impugning.g imputing.g inactivating.g inaugurating.g incapacitating.g incarcerating.g incarnating.g incensing.g incinerating.g including.g inconveniencing.g incriminating.g inculcating.g incurring.g indemnifying.g indenturing.g indexing.g indicting.g individuating.g indoctrinating.g inducting.g infatuating.g infecting.g infesting.g infilling.g infiltrating.g inflaming.g inflating.g inflecting.g inflicting.g influencing.g infuriating.g infusing.g ingesting.g ingratiating.g inhabiting.g inheriting.g inhibiting.g initialling.g injecting.g injuring.g inking.g inoculating.g inscribing.g inseminating.g inserting.g inspecting.g installing.g instating.g instigating.g instilling.g instituting.g institutionalizing.g insulating.g insulting.g insuring.g integrating.g intercepting.g interchanging.g interdicting.g interesting.g interjecting.g interleaving.g internalizing.g internationalizing.g interoperating.g interpolating.g interring.g interrogating.g interspersing.g interweaving.g intimidating.g intoning.g intoxicating.g introducing.g intuiting.g inundating.g invading.g invalidating.g invaliding.g inveigling.g inventing.g inverting.g invigorating.g invoking.g irking.g irradiating.g irrigating.g isolating.g italicizing.g itemizing.g iterating.g jailing.g jarring.g jeopardizing.g jettisoning.g jilting.g jinxing.g jollying.g jugging.g juxtaposing.g kenning.g kidnapping.g kissing.g kneading.g knifing.g knighting.g lacerating.g lacing.g lacking.g lacquering.g lambasting.g laminating.g lampooning.g lancing.g landscaping.g lassoing.g lauding.g laundering.g lavishing.g leaching.g leapfrogging.g leasing.g leavening.g legalizing.g legitimatizing.g leniting.g leveraging.g levering.g levying.g libelling.g liberalizing.g liberating.g licencing.g likening.g limiting.g lionizing.g liquidizing.g listing.g loaning.g loathing.g lobbing.g lofting.g looting.g lubricating.g lugging.g lulling.g lumping.g luring.g lynching.g maddening.g magnetizing.g magnifying.g maiming.g maligning.g maltreating.g manacling.g mandating.g mangling.g manhandling.g manicuring.g manifesting.g manipulating.g manning.g manufacturing.g marginalising.g marginalizing.g marketing.g marooning.g marring.g marshalling.g martyring.g mashing.g masking.g massaging.g mass-producing.g mastering.g masterminding.g masticating.g mauling.g maximizing.g maxing.g measuring.g mechanizing.g medicating.g memorializing.g memorizing.g menacing.g meriting.g mesmerizing.g microfilming.g miffing.g milking.g mimeographing.g mimicking.g mincing.g miniaturizing.g minimizing.g minting.g miring.g mirroring.g misapplying.g misapprehending.g misappropriating.g miscastting.g misconceiving.g misconstruing.g misdating.g misdirecting.g misgoverning.g misguiding.g mishandling.g mishearing.g misinforming.g misinterpreting.g mislaying.g misleading.g mismanaging.g misnaming.g misplacing.g mispronouncing.g misquoting.g misreading.g misrepresenting.g misspelling.g misspending.g misstating.g mistaking.g mistranslating.g mistreating.g mistrusting.g misusing.g mitigating.g mobbing.g mocking.g modeling.g modifying.g modulating.g molding.g molesting.g mollifying.g mollycoddling.g monitoring.g monopolizing.g montaging.g mooring.g mooting.g morphing.g mortaring.g mortgaging.g mortifying.g mothballing.g mothproofing.g motorizing.g muddying.g muffing.g muffling.g mugging.g mulching.g multiplexing.g murdering.g mustering.g mutilating.g muting.g muzzling.g myspacing.g mystifying.g nabbing.g nagging.g namespacing.g narrating.g nationalizing.g naturalizing.g needling.g negating.g netting.g nettling.g neutering.g neutralizing.g nicking.g nicknaming.g nixing.g noogieing.g normalizing.g norming.g notarizing.g notating.g nourishing.g novelising.g novelizing.g nudging.g nullifying.g numbering.g numbing.g nursing.g nurturing.g obfuscating.g obligating.g obliterating.g obscuring.g obstructing.g obtaining.g obviating.g occasioning.g occupying.g offending.g offloading.g offsetting.g oiling.g okaying.g omening.g omitting.g oppressing.g orchestrating.g ordaining.g organizing.g orientating.g orienting.g ornamenting.g ostracizing.g ousting.g outbalancing.g outclassing.g outdistancing.g outdoing.g outfighting.g outfitting.g outflanking.g outfoxing.g outgrowing.g outlasting.g outlawing.g outlining.g outliving.g outmanoeuvring.g outnumbering.g outplaying.g outraging.g outranking.g outrideing.g outrighting.g outrunning.g outscoring.g outshining.g outsmarting.g outsourcing.g outstaying.g outvoting.g outweighing.g outwitting.g overawing.g overbearing.g overburdening.g overcoming.g overcooking.g overcrowding.g overdoing.g overdubing.g overemphasizing.g overestimating.g overexerting.g overexposing.g overgrazing.g overhauling.g overhearing.g overleaping.g overloading.g overlooking.g overpaying.g overplaying.g overpopulating.g overpowering.g overpraising.g overprinting.g overrating.g overruling.g overrunning.g overseeing.g overshadowing.g overshooting.g oversimplifying.g overstating.g overstaying.g overstepping.g overstocking.g overstraining.g oversubscribing.g overtaking.g overtaxing.g overvaluing.g overwhelming.g overwriting.g owning.g oxygenating.g pacifying.g packaging.g padding.g padlocking.g paging.g paining.g palatalizing.g pampering.g papering.g parallelizing.g parallelling.g paralysing.g paralyzing.g parametrizing.g paraphrasing.g parching.g pardoning.g paring.g parodying.g paroling.g parrying.g partitioning.g partnering.g pasteurizing.g pasting.g patenting.g patrolling.g patronizing.g patterning.g patting.g pauperizing.g pawing.g pawning.g pedestrianizing.g pegging.g pelting.g penalizing.g pencilling.g peppering.g perfecting.g perforating.g perfuming.g perfusing.g perjuring.g permeating.g perming.g permuting.g perpetrating.g perpetuating.g perplexing.g persecuting.g personalizing.g personifying.g perturbing.g perusing.g pervading.g perverting.g pestering.g petting.g photocopying.g photographing.g photosensitizing.g photostatting.g phrasing.g pickling.g picturing.g piercing.g pigeonholing.g pigmenting.g pilfering.g piloting.g pinching.g pinpointing.g piping.g pipping.g piquing.g pirating.g pitchforking.g pitting.g pitying.g placating.g placing.g plagiarizing.g plaguing.g planting.g plastering.g pleasing.g plumbing.g pluralizing.g plying.g pocketing.g podcasting.g poisoning.g polarizing.g policing.g polishing.g politicizing.g pollinating.g polluting.g pondering.g pooh-poohing.g pooling.g popularizing.g populating.g portaging.g portending.g porting.g positioning.g possessing.g postdating.g posting.g postmarking.g postponing.g powdering.g praising.g prearranging.g preceding.g precipitating.g precluding.g preconceiving.g predestining.g predetermining.g predicating.g predisposing.g pre-empting.g preempting.g preening.g prefabricating.g prefacing.g prefiguring.g preforming.g preheating.g prejudging.g prejudicing.g premeditating.g premising.g preoccupying.g preordaining.g prepaying.g prerecording.g prerendering.g presaging.g prescribing.g presenting.g preserving.g presorting.g pressurizing.g prestressing.g prettifying.g preventing.g pricing.g priding.g priming.g printing.g privileging.g prizing.g probing.g processing.g proctoring.g procuring.g prodding.g producing.g proffering.g profiling.g prognosticating.g prohibiting.g prolonging.g promoting.g promulgating.g pronouncing.g proofing.g propelling.g proportioning.g propositioning.g propounding.g proscribing.g prosecuting.g prostituting.g prostrating.g protecting.g pruning.g psychoanalysing.g psychoanalyzing.g publicizing.g publishing.g pulverizing.g pummelling.g punctuating.g punishing.g purchasing.g pureing.g purifying.g purloining.g pursing.g pursuing.g purveying.g quaffing.g qualifying.g quantifying.g quarantining.g quarterbacking.g quartering.g quashing.g quelling.g quenching.g querying.g quick-freezing.g quilting.g quoting.g radicalizing.g raffling.g raiding.g railroading.g ramming.g ramping.g ransacking.g ransoming.g raping.g ratifying.g rationalizing.g rationing.g ravaging.g ravishing.g razing.g reacquainting.g re-addressing.g readmitting.g reaping.g reappointing.g rearranging.g reassessing.g reauthorizing.g rebadging.g rebooting.g rebranding.g rebroadcasting.g rebuffing.g rebuking.g rebutting.g recapturing.g recasting.g recessing.g rechristening.g reciting.g reclaiming.g recoloring.g recommitting.g recompensing.g reconciling.g reconditioning.g reconquering.g reconsecrating.g reconsidering.g reconstructing.g reconvicting.g recouping.g recreating.g rectifying.g recusing.g recuting.g recycling.g redecorating.g redeeming.g redefining.g redeploying.g redesignating.g redesigning.g redeveloping.g rediscovering.g redistributing.g redoing.g redrafting.g redrawing.g redressing.g redshirting.g reducing.g reduplicating.g re-educating.g re-educating.v reemploying.g reenacting.g reequiping.g re-establishing.g reestablishing.g refashioning.g refilling.g refinancing.g refining.g reflexing.g reformulating.g refracting.g refreshing.g refrigerating.g refunding.g refurbishing.g refurnishing.g refuting.g regaining.g regaling.g regimenting.g regrading.g regularizing.g regulating.g regurgitating.g rehabilitating.g rehashing.g rehiring.g rehousing.g reigniting.g reimagining.g reimbursing.g reinforcing.g reinstalling.g reinstating.g reinsuring.g reintegrating.g reinterpreting.g reinventing.g reinvigorating.g reissuing.g rejecting.g rejoining.g rejuvenating.g relaunching.g relaying.g releasing.g relegating.g relieving.g relinquishing.g relishing.g relisting.g reliving.g reloading.g remanding.g remastering.g rematching.g remedying.g remilitarizing.g remixing.g remodelling.g remolding.g remoulding.g removing.g remunerating.g rending.g renewing.g renominating.g renouncing.g renovating.g renumbering.g reoccupying.g reorientating.g reorienting.g repackaging.g repainting.g repatriating.g repealing.g repelling.g rephotographing.g rephrasing.g replacing.g replanting.g replastering.g replaying.g replenishing.g replicating.g reprehending.g representing.g repressing.g reprieving.g reprimanding.g reprinting.g reproaching.g reproofing.g reproving.g repudiating.g repulsing.g repurchasing.g repurposing.g reputing.g requisitioning.g rereading.g rereleasing.g rerolling.g rerouting.g rescheduling.g rescinding.g rescuing.g researching.g reseating.g reselling.g resembling.g resenting.g reserving.g resetting.g reshaping.g reshuffling.g resiting.g resoling.g respecting.g restating.g restocking.g restoring.g restraining.g restricting.g restructuring.g restyling.g resubmiting.g resurrecting.g retaining.g retaking.g retarding.g retelling.g rethinking.g reting.g retitling.g retouching.g retracing.g retracting.g retransmitting.g retrieving.g retriing.g retrying.g revaluing.g revamping.g revering.g reveting.g reviewing.g reviling.g revising.g revisiting.g revitalizing.g revoking.g revolutionizing.g rewarding.g rewatering.g rewiring.g rewording.g rewriting.g ribbing.g ridding.g riddling.g ridiculing.g rifling.g righting.g rimming.g rivaling.g rivalling.g riveting.g romanizing.g romanticizing.g roping.g routing.g rubberizing.g rubber-stamping.g ruing.g ruining.g rumpling.g rusticating.g sabotaging.g sacking.g saddening.g saddling.g safeguarding.g salting.g salvaging.g sampling.g sanctifying.g sanctioning.g sandblasting.g sanding.g sandpapering.g sandwiching.g sapping.g satiating.g satirising.g satirizing.g satisfying.g saturating.g sauteing.g savaging.g savouring.g scalding.g scalping.g scandalizing.g scanting.g scarpering.g scarring.g scenting.g scheduling.g schooling.g scooping.g scorching.g scorning.g scotching.g scouring.g scrapping.g scrunching.g scrutinizing.g sculpting.g scuttling.g searing.g seasoning.g seating.g seconding.g secreting.g secularizing.g securing.g sedating.g seducing.g seeding.g segregating.g selecting.g sensationalizing.g sensitizing.g sentimentalizing.g sequestering.g serenading.g serializing.g servicing.g shackling.g shadowing.g shampooing.g shapeshifting.g sharing.g sharpening.g shearing.g sheathing.g shedding.g sheltering.g shelving.g shepherding.g shielding.g shingling.g shirking.g shocking.g shooing.g short-changing.g shortlisting.g shouldering.g shovelling.g showcasing.g shredding.g shrouding.g shucking.g shunning.g shunting.g shuttering.g sickening.g sicking.g sidelining.g sidestepping.g sidetracking.g sieving.g sighting.g signposting.g silencing.g silhouetting.g simplifying.g simulating.g simulcasting.g siphoning.g siring.g skewering.g skinning.g skippering.g skirting.g slaking.g slandering.g slapping.g slashing.g slating.g slaughtering.g slaying.g sleeving.g slicing.g slighting.g slinging.g slotting.g slugging.g slurring.g smelting.g smiting.g smothering.g snagging.g snaring.g snubbing.g socking.g sodomizing.g soft-pedalling.g soiling.g soldering.g soliciting.g solving.g soothing.g soundproofing.g souping.g sourcing.g sousing.g spading.g spanking.g spanning.g sparing.g spaying.g spearheading.g spearing.g specifying.g spewing.g spiking.g spin-drying.g spiriting.g spiting.g sponsoring.g spoonfeeding.g spotlighting.g spotting.g spraining.g spraying.g sprinkling.g spurning.g squandering.g squelching.g squiring.g stabbing.g staffing.g staging.g stalemating.g standardizing.g stapling.g starching.g startling.g stashing.g stationing.g staunching.g stealing.g steamrollering.g steeling.g stereotyping.g sterilizing.g stiffing.g stigmatizing.g stilling.g stimulating.g stitching.g stockading.g stoking.g stomaching.g stoning.g storing.g storyboarding.g stowing.g straddling.g strafing.g straitening.g strangling.g strapping.g streamlining.g strewing.g stroking.g structuring.g stubbing.g stuccoing.g studding.g stunning.g stunting.g styling.g stylizing.g stymieing.g subduing.g subediting.g subjecting.g subjugating.g sublimating.g subordinating.g subpoenaing.g subserving.g subsidizing.g substantiating.g subsuming.g subtending.g subtracting.g subverting.g succouring.g suckling.g suffusing.g suiciding.g suiting.g sullying.g summarizing.g summoning.g sundering.g sunning.g superimposing.g superseding.g supplanting.g supplementing.g supplying.g supporting.g suppressing.g surmounting.g surnaming.g surpassing.g surrounding.g surveying.g suspending.g sustaining.g swamping.g swathing.g swatting.g sweetening.g swigging.g swindling.g swiping.g symbolizing.g syncopating.g syndicating.g synthesizing.g syphoning.g systematizing.g tabling.g tabulating.g tailing.g tailoring.g tainting.g taming.g tamping.g tantalizing.g targeting.g tarring.g tattooing.g taunting.g taxing.g teasing.g telecasting.g teleporting.g telescoping.g televising.g tendering.g terracing.g terrifying.g terrorizing.g tessellating.g test-driving.g tethering.g thanking.g thatching.g thirsting.g threading.g thumbing.g thwarting.g ticketing.g tiering.g tiling.g tilling.g timelining.g timing.g tinting.g titillating.g toeing.g tolerating.g torching.g tormenting.g torpedoing.g torturing.g toting.g touring.g tousling.g touting.g towelling.g towing.g trademarking.g trampling.g tranquilizing.g tranquillizing.g transacting.g transcending.g transcoding.g transcribing.g transfixing.g transforming.g transfusing.g transgendering.g transistorizing.g transitioning.g transmitting.g transmuting.g transporting.g transposing.g transshipping.g trapping.g trashing.g traversing.g treasuring.g tricking.g triggering.g trivializing.g troubling.g trouncing.g truncating.g turbocharging.g tutoring.g tweaking.g twiddling.g typecasting.g typifying.g tyrannizing.g unaffiliating.g unbalancing.g unbanning.g unblocking.g unbolting.g unbuckling.g unburdening.g unbuttoning.g unclothing.g uncluttering.g uncorking.g uncoupling.g uncovering.g uncrossing.g undercharging.g undercutting.g underestimating.g underexposing.g underfunding.g undergoing.g underlining.g underlying.g undermining.g underpaying.g underpinning.g underquoting.g underrating.g underrepresenting.g underscoring.g underselling.g underserving.g undershooting.g undersigning.g understating.g understocking.g understudying.g undervaluing.g underwriteing.g undoing.g unearthing.g unencumbering.g unfettering.g unfrocking.g unfurling.g unhanding.g unhinging.g unhooking.g uninstalling.g unlearning.g unleashing.g unloosing.g unmasking.g unnerving.g unplugging.g unrecording.g unsaddling.g unscrambling.g unsettling.g unsheathing.g unveiling.g unzipping.g upbraiding.g updating.g upgrading.g upholding.g upholstering.g uplifting.g uprighting.g uprooting.g upsetting.g upstaging.g ushering.g usurping.g utilizing.g uttering.g vacating.g vaccinating.g valeting.g validating.g valuing.g vanquishing.g varnishing.g veiling.g vending.g venerating.g ventilating.g venting.g verbalizing.g vetoing.g vetting.g vexing.g victimizing.g videotaping.g vilifying.g vindicating.g violating.g visaing.g visualizing.g vitiating.g vivisecting.g vocalizing.g voicing.g voiding.g vouchsafing.g vulgarizing.g waging.g waiving.g walling.g walloping.g wangling.g warding.g warehousing.g warranting.g wasting.g waterproofing.g waylaying.g weaning.g weaponizing.g weathering.g wedging.g weighting.g welcoming.g wending.g westernizing.g wetting.g whacking.g wheedling.g whetting.g whiling.g whitewashing.g wielding.g wikiing.g winging.g winnowing.g withholding.g withstanding.g witnessing.g wolfing.g wooing.g wording.g worming.g wounding.g wreaking.g wrecking.g wrenching.g wresting.g wronging.g zapping.g zoning.g link-grammar-4.7.4/data/en/words/units.10000644000175000017500000000275611245305432017017 0ustar bloombloomkm².u mi².u in².u ft².u m².u cm².u mm².u μm².u yds².u micron².u km³.u mi³.u in³.u ft³.u m³.u cm³.u mm³.u μm³.u yds³.u micron³.u mph.u MPH.u mpg.u MPG.u rpm.u RPM.u ppm.u PPM.u pica.u point.u gallon.u gauge.u pound.u inch.u foot.u km.u m.u cm.u mm.u um.u μm.u nm.u mM.u M.u microM.u nM.u kilogram.u gram.u milligram.u microgram.u nanogram.u ng.u μg.u mg.u g.u kg.u aa.u amino-acids.u amino_acids K.u nucleotides.u kilobase.u base-pair.u base_pair amino-acid.u amino_acid nucleotide.u Ampere.u amp.u ampere.u pA.u nA.u μA.u ma.u mA.u A.u kA.u KA.u kilobase_pairs base-pairs.u base_pairs kb.u kilobases.u bp.u kbp.u Mb.u Bel.u bel.u dB.u decibel.u decibels.u dBm.u calorie.u cal.u kcal.u kcal/mol.u Dalton.u dalton.o Dal.u kDal.u kDa.u kD.u KD.u D.u d.u dioptre.u Hertz.u Hz.u kHz.u KHz.u MHz.u Hg.u cmHg.u mmHg.u inHg.u liter.u l.u ml.u mL.u cc.u Lt.u LT.u mho.u millimho.u micromho.u mol.u nmol.u pmol.u molar.u mole.u mumol.u Newton.u N.u kN.u MN.u mN.u nt.u ohm.u kilo-ohm.u kiloohm.u Kiloohm.u kohm.u Kohm.u KOhm.u mega-ohm.u megaohm.u MOhm.u Mohm.u milliohm.u microohm.u micro-ohm.u Ω.u kΩ.u KΩ.u MΩ.u mΩ.u Pascal.u Pa.u kPa.u pH.u Volt.u volt.u pV.u nV.u μV.u mv.u mV.u V.u kV.u KV.u VDC.u VAC.u Watt.u watt.u kW.u KW.u MW.u GW.u PW.u kVA.u s-1.u eV.u keV.u KeV.u MeV.u GeV.u hp.u HP.u BHP.u BTU.u btu.u Btu.u ton.u tonne.u T.u kT.u MT.u byte.u Byte.u kB.u MB.u GB.u TB.u PB.u od.u O.D.u OD.u id.u I.D.u ID.u 〜.u 年.u 月.u 日.u °.u γ.u ε.u θ.u λ/4.u kW·h/m².u mg/l.u link-grammar-4.7.4/data/en/words/words.n.t0000644000175000017500000000253411270142554017346 0ustar bloombloomDemocrat.t Republican.t Abbé.t abbé.t abbot.t accompanist.t accountant.t administrator.t admiral.t adviser.t advisor.t agent.t aide.t ambassador.t analyst.t arbitrator.t archbishop.t archdeacon.t architect.t archivist.t assessor.t assistant.t associate.t attorney.t auditor.t bailiff.t broker.t brother.t buyer.t candidate.t captain.t cardinal.t chairman.t chairwoman.t chancellor.t chaplain.t chief.t clerk.t commander.t commissioner.t complainant.t comptroller.t congressman.t contractor.t coordinator.t coroner.t correspondent.t councillor.t counsellor.t counselor.t deacon.t deaconess.t dean.t defendant.t defender.t delegate.t deputy.t diplomat.t director.t economist.t editor.t emissary.t emperor.t empress.t engineer.t executive.t executor.t father.t foreman.t founder.t general.t governor.t head.t headmaster.t headmistress.t inspector.t intern.t justice.t lawyer.t leader.t librarian.t lobbyist.t manager.t marquise.t mayor.t minister.t mother.t officer.t owner.t partner.t pastor.t postmaster.t premier.t president.t prime_minister professor.t prosecutor.t representative.t Saint.t Sainte.t secretary.t Seigneur.t Senator.t senator.t shah.t sheriff.t sister.t solicitor.t speaker.t spokesman.t spokesperson.t spokeswoman.t sponsor.t superintendent.t treasurer.t undersecretary.t underwriter.t warden.t best_man maid_of_honor proprietor.t link-grammar-4.7.4/data/en/words/words.v.6.20000644000175000017500000000677611526022265017434 0ustar bloombloomadopts.v airlifts.v airs.v angles.v armors.v authorises.v averages.v backfills.v backpacks.v backs.v badges.v bails.v bangs.v beams.v beats.v beckons.v beefs.v bellows.v benchmarks.v bends.v bicycles.v bikes.v binds.v bites.v blares.v bleeds.v blogs.v blows.v bobs.v bogs.v boils.v bolts.v boos.v boots.v boozes.v bores.v bounces.v bounds.v bowls.v boxs.v branches.v breaks.v breathes.v brightens.v bruises.v brushes.v buckles.v bucks.v builds.v bulges.v bumps.v bums.v bunches.v burns.v busts.v buttons.v butts.v buzzes.v calms.v camps.v cancels.v canoes.v captions.v carves.v cashes.v casts.v catches.v chambers.v changes.v chats.v cheats.v checks.v cheers.v chews.v chills.v chips.v chokes.v chops.v choreographs.v churns.v cleans.v climbs.v clogs.v closes.v clouds.v clumps.v coffers.v coils.v combs.v connects.v contracts.v cooks.v cools.v cops.v costumes.v coughs.v counts.v cracks.v crams.v crosses.v crowds.v crumbles.v crumples.v crunches.v curls.v dashes.v dematerializes.v dials.v digs.v dines.v drags.v drains.v dresses.v dries.v drinks.v drives.v dropkicks.v drops.v drowns.v drums.v ducks.v dumbs.v eases.v eats.v edges.v emails.v emcees.v empties.v evangelizes.v evens.v faces.v fans.v farms.v fattens.v feeds.v fends.v fetches.v feuds.v files.v fills.v filters.v fires.v firms.v fishes.v fists.v flares.v flattens.v flavors.v flies.v flips.v floats.v floods.v flunks.v flushes.v folds.v follows.v forks.v fouls.v freaks.v freezes.v frenchs.v freshens.v frizzes.v frizzles.v fucks.v fuels.v gallops.v gathers glazes.v gobbles.v gongs.v grinds.v gulps.v hacks.v hammers.v hangs.v hardwires.v harkens.v hauls.v heads.v heals.v heats.v herds.v hides.v hikes.v hitches.v homers.v hooks.v hops.v hunts.v irons.v jams.v jerks.v joins.v jumbles.v jumps.v kayaks.v kills.v knocks.v knots.v laps.v lashes.v leads.v leaks.v leans.v leaps.v levels.v licks.v lightens.v lights.v limbers.v lines.v livens.v logs.v loops.v loosens.v loses.v marches.v marchs.v marries.v matches.v melts.v messes.v misses.v mixes.v mops.v mounds.v mouths.v moves.v mucks.v nods.v oozes.v opens options.v packs.v pairs.v pans.v parlays.v parties.v peels.v pees.v piles.v pisses.v plays.v ploughs.v plows.v plucks.v plunges.v points.v pokes.v pops.v pounds.v pries.v prinks.v puckers.v pulls.v pumps.v quiets.v rakes.v reaches.v reels.v rents.v rerecords.v resizes.v revs.v rewinds.v rides.v rings.v rips.v rocks.v rolls.v roots.v rotoscopes.v rounds.v rubs.v runs.v rushes.v sails.v saws.v scopes.v scouts.v scrapes.v scratches.v screws.v scuffs.v seals.v segues.v serves.v settles.v sews.v shapes.v shaves.v shifts.v ships.v shoots.v shorts.v shrugs.v shushes.v shuts.v signs.v silkscreens.v sketches.v skin-dives.v skips.v skis.v slides.v slips.v sloughs.v slows.v smartens.v smashes.v smooths.v snaps.v snatches.v sneaks.v sniffs.v snorkels.v snuffs.v soaks.v sobers.v softens.v spaces.v sparks.v speeds.v spells.v spills.v spins.v spirals.v spits.v splices.v splits.v spreads.v springs.v sprouts.v spruces.v squares.v squeezes.v squirts.v staggers.v stalks.v stamps.v stares.v stars.v starves.v steams.v sticks.v stiffens.v stirs.v stocks.v storms.v straightens.v stretches.v strikes.v strips.v sucks.v sums.v surfs.v swells.v swims.v swings.v switches.v swots.v tallies.v tangles.v tapers.v tasks.v thickens.v thins.v ticks.v tidies.v tightens.v tinkles.v tips.v tires.v togs.v tones.v topples tosses.v trails.v treads.v trims.v trips.v tucks.v tumbles.v tunes.v twists.v types.v wakes.v walks.v warms.v weaves.v weeds.v weighs.v whips.v whoops.v winds.v wins.v wipes.v works.v wraps.v zeroes.v link-grammar-4.7.4/data/en/words/words.v.1.p0000644000175000017500000000173010204377537017515 0ustar bloombloomdone_for accounted_for adhered_to arrived_at barked_at belched_at catered_to clung_to complied_with coped_with depended_on disapproved_of discriminated_against embarked_on frowned_on gazed_upon glared_at gossiped_about interfered_with laughed_at lived_in longed_for monkeyed_with objected_to presided_over ratted_on relied_on resorted_to talked_to toyed_with trifled_with voted_on voted_for jumped_on lied_to listened_to screamed_at sat_on spoken_to stepped_on appealed_to attended_to conceived_of dealt_with dispensed_with entered_into improved_on improved_upon negotiated_with operated_on referred_to searched_for stared_at tended_to yelled_at counted_on pointed_to pointed_at fought_with planned_for arranged_for tried_for added_to reckoned_with approved_of ruled_on wished_for hoped_for decided_on cared_for shouted_at dreamed_of dreamt_of thought_of heard_from looked_at called_for uncalled_for asked_for undreamed_of undreamt_of paid_for slept_in agreed_upon talked_about link-grammar-4.7.4/data/en/words/units.30000644000175000017500000000013711164322143017006 0ustar bloombloom°C.u °F.u degrees_Fahrenheit degrees_Centigrade degrees_C mph.i MPH.i mpg.i MPG.i cc.i ml.i link-grammar-4.7.4/data/en/words/words.v.1.10000644000175000017500000002406311406233171017410 0ustar bloombloomabate.v abound.v about-face.v abscond.v abstain.v accede.v account.v accrue.v ache.v acquiesce.v adenize.v adhere.v adjoin.v ad-lib.v alight.v allude.v amble.v ambulate.v amount.v anteflect.v apologize.v apostatize.v appertain.v aquaplane.v arise.v arrive.v assent.v astringe.v atone.v atrophy.v attitudinize.v autoagglutinate.v autodegrade.v autooxidise.v auto-oxidize.v autooxidize.v autoproliferate.v autotomize.v autoxidize.v baa.v babble.v baby-sit.v babysit.v backbite.v backfire.v backpedal.v backslide.v backspace.v bacteriolyze.v balk.v balloon.v bam.v banquet.v banter.v bant.v barf.v bark.v barnstorm.v bask.v bawl.v bay.v beep.v beetle.v behave.v belch.v bellyache.v belong.v bicker.v billow.v biodegrade.v bitch.v blabber.v blather.v blaze.v bleat.v bleep.v blench.v blether.v bloat.v bloom.v blossom.v blubber.v blunder.v blush.v bode.v boom.v brake.v brawl.v bray.v bristle.v brood.v browse.v bubble.v bud.v bullshit.v bunk.v burble.v burgeon.v burp.v bustle.v cab.v cackle.v calve.v campaign.v canaliculize.v canter.v caper.v capillarize.v capitulate.v careen.v carol.v carouse.v cascade.v castle.v cater.v caterwaul.v cavil.v cavort.v chafe.v chatter.v cheep.v chemosensitise.v chime.v chirp.v chirrup.v chortle.v chromatofocus.v chuckle.v chug.v chum.v clack.v clamber.v clamor.v clamour.v clank.v clash.v clatter.v clerk.v climax.v cling.v cluck.v clunk.v cluster.v coalesce.v coast.v cocirculate.v coevolve.v coexist.v cohabit.v cohere.v coincide.v collaborate.v collateralize.v collide.v collude.v comigrate.v commentate.v commiserate.v commune.v comodulate.v compete.v comply.v compromise.v confabulate.v confab.v conflict.v conform.v congeal.v congregate.v connive.v consort.v conspire.v convalesce.v converge.v converse.v co-operate.v cooperate.v coossify.v coo.v cope.v copulate.v correspond.v coruscate.v counterphase.v covary.v cower.v crackle.v crash-dive.v creak.v crepitate.v crest.v cringe.v croak.v cross-dress.v crossdress.v crossmatch.v crow.v crusade.v culminate.v curtsey.v curtsy.v cycle.v cyclize.v cytoadhere.v cytodifferentiate.v dabble.v dally.v dawdle.v dawn.v day-dream.v daydream.v decamp.v decay.v decease.v declutch.v decompensate.v decrement.v decussate.v deetiolate.v defasciculate.v default.v defecate.v defect.v deflagrate.v degenerate.v dehisce.v delaminate.v deliberate.v delve.v demur.v depart.v depend.v deplane.v deplasmolyze.v depreciate.v deputize.v desist.v despair.v deswell.v deteriorate.v detract.v detrain.v deviate.v devolve.v diet.v differ.v digitate.v digress.v dilly-dally.v disagree.v disappear.v discourse.v discriminate.v disembark.v disintegrate.v disrobe.v dissemble.v dissent.v dissertate.v dither.v divagate.v diverge.v dodder.v domineer.v doodle.v dote.v double-park.v dovetail.v downshift.v downslant.v downslope.v dow.v drawl.v drizzle.v drool.v duel.v dwell.v dwindle.v eavesdrop.v ebb.v economize.v eddy.v editorialize.v effervesce.v effloresce.v elapse.v electioneer.v elope.v emanate.v embark.v emerge.v emigrate.v emote.v empathize.v encamp.v encroach.v enquire.v ensue.v equivocate.v err.v eruct.v erupt.v evaporate.v eventuate.v excel.v exflagellate.v exist.v exit.v exosmose.v expatiate.v experiment.v expire.v explant.v expostulate.v exult.v faint.v falter.v fare.v fart.v fast.v fawn.v feint.v fester.v festinate.v fibrose.v fib.v fidget.v filibuster.v fizz.v flail.v flake.v flame.v flicker.v flinch.v flirt.v flit.v flop.v flounder.v flourish.v flower.v fluctuate.v fluoresce.v flutter.v fly-fish.v foot-slog.v forage.v foregather.v forgather.v fornicate.v fossilize.v foxhunt.v fragment.v fraternize.v freelance.v free-wheel.v freewheel.v fret.v frivol.v frolic.v froth.v frown.v fulminate.v fume.v function.v fundhold.v fungate.v fuss.v gallivant.v galumph.v gambol.v gape.v garden.v gastrulate.v gawk.v gawp.v gaze.v gelate.v gel.v genuflect.v gesticulate.v gesture.v gibber.v gibe.v giggle.v glare.v gleam.v glide.v glimmer.v glint.v glisten.v glister.v glitch.v glitter.v gloat.v globe-trot.v globetrot.v glory.v glower.v glow.v goggle.v golf.v gormandize.v gossip.v graduate.v grapple.v gravitate.v gray.v graze.v grey.v grimace.v grin.v groove.v grouch.v grouse.v grovel.v guffaw.v gurgle.v gust.v gybe.v gyrate.v haggle.v hale.v hallucinate.v hanker.v hark.v harp.v haw.v hearken.v heel.v herniate.v heterodimerize.v heteromultimerize.v hew.v hibernate.v hiccough.v hiccup.v hinge.v hiss.v hitchhike.v hobnob.v holler.v honeymoon.v hover.v huddle.v huff.v hunger.v hurtle.v hydroplane.v hyperaggregate.v hyperdefecate.v hyperfilter.v hyperluteinize.v hypermutate.v hypertrophy.v hyporesonate.v hyporespond.v ice-skate.v immigrate.v immunoreact.v impend.v impinge.v inch.v infarct.v innovate.v interact.v intercede.v intercommunicate.v interdigitate.v interfere.v intermarry.v intermingle.v intervene.v introspect.v intrude.v intumesce.v inveigh.v involute.v itch.v jabber.v jack-knife.v jaunt.v jaw.v jay-walk.v jaywalk.v jell.v jest.v jibe.v jitter.v jive.v jockey.v joke.v journey.v joust.v kemp.v kowtow.v lacrimate.v lactate.v lag.v languish.v lapse.v lase.v laugh.v leaf.v leer.v legislate.v liaise.v lin.v lip-read.v lisp.v live.v loaf.v locomote.v loiter.v loll.v long.v lope.v lounge.v lour.v lown.v lumber.v lurk.v lust.v luxuriate.v major.v malfunction.v malignize.v malinger.v maraud.v marvel.v masquerade.v materialize.v matriculate.v maturate.v mature.v maunder.v meander.v meddle.v meditate.v menstruate.v meow.v metamorphose.v metastasize.v mew.v miaou.v miaow.v micturate.v migrate.v militate.v mingle.v minister.v misbehave.v misfire.v molt.v monkey.v mooch.v moo.v mope.v moralize.v mosey.v motion.v motor.v moulder.v muck-rake.v mushroom.v mutiny.v name-drop.v nap.v natter.v neck.v necrose.v neigh.v nest.v network.v niggle.v nosedive.v nosh.v object.v occur.v officiate.v orate.v oscillate.v oscitate.v osmoregulate.v osmose.v osseointegrate.v outgo.v overact.v overbid.v overcompensate.v over-eat.v overeat.v overlie.v overreact.v oversleep.v overwinter.v ovulate.v pale.v pall.v palpebrate.v palpitate.v pander.v panhandle.v panic.v pant.v parachute.v parley.v partake.v participate.v patter.v pause.v peak.v pearl.v peep.v pellate.v perambulate.v percolate.v perish.v persevere.v persist.v perspire.v pertain.v philander.v philosophize.v picnic.v piddle.v pimp.v ping.v pirouette.v pivot.v plane.v play-act.v plod.v plummet.v politick.v polka.v pollock.v pom.v pontificate.v pore.v posture.v potter.v pounce.v pout.v powwow.v prance.v prate.v prattle.v preachify.v predominate.v pre-exist.v preponderate.v preregister.v preside.v prevail.v prevaricate.v prey.v primp.v procrastinate.v procreate.v profiteer.v profit.v progress.v prolapse.v proliferate.v propagandize.v proselytize.v prosper.v protrude.v pub-crawl.v pule.v pullulate.v pulsate.v pulse.v pun.v pupariate.v pupate.v purr.v pussyfoot.v putrefy.v putter.v quack.v quake.v quarrel.v quarry.v quaver.v quest.v queue.v quibble.v quip.v quiver.v racket.v raft.v rage.v rail.v rain.v ramble.v rampage.v rankle.v rant.v rasp.v rat.v rave.v react.v reappear.v rebel.v rebound.v recede.v recline.v recoil.v reconnoitre.v recriminate.v recrudesce.v recuperate.v recur.v redecussate.v redound.v re-echo.v re-emerge.v reemerge.v refect.v refixate.v reflow.v refrain.v regress.v reign.v re-infarct.v reinfarct.v re-intervene.v reintervene.v rejoice.v relapse.v relent.v rely.v reminisce.v remonstrate.v renarrow.v rendezvous.v renege.v re-occur.v reoccur.v repetatur.v repine.v reside.v resonate.v resort.v resound.v respire.v restenose.v rest.v result.v resurface.v retaliate.v retch.v retreat.v retrench.v retrograde.v retrogress.v revel.v reverberate.v revert.v revolt.v revolve.v rhapsodize.v riot.v ripen.v riposte.v ripple.v rocket.v romance.v romp.v room.v roost.v rootle.v rough-house.v rove.v rubber-neck.v rubberneck.v rumble.v ruminate.v rummage.v rust.v sag.v salivate.v saunter.v scamper.v scar_cicatrize scavenge.v scheme.v scintillate.v scowl.v scram.v screech.v scrimp.v scrimshank.v scroll.v scrounge.v scuba.v scuffle.v secede.v seesaw.v seethe.v sermonize.v seroconvert.v serorevert.v shadow-box.v shilly-shally.v shillyshally.v shimmer.v shit.v shiver.v shrimp.v shudder.v side-slip.v side.v sidle.v sight-see.v simmer.v simper.v sin.v sizzle.v skate.v skedaddle.v skimp.v skirmish.v skulk.v skylark.v sky-rocket.v skyrocket.v slacken.v slalom.v slaver.v sleet.v slither.v slobber.v slog.v slouch.v slumber.v slum.v slush.v smart.v smile.v smirk.v smolder.v smoulder.v snack.v snake.v sneer.v sneeze.v snicker.v sniffle.v snigger.v snipe.v snitch.v snivel.v snoop.v snooze.v snore.v snowball.v snowshoe.v snow.v snuffle.v sob.v softland.v sojourn.v soliloquize.v somersault.v sough.v sour.v sparkle.v spar.v specialise.v specialize.v speciate.v speechify.v spermiate.v sphacelate.v splurge.v splutter.v sprawl.v sprint.v sputter.v squabble.v squall.v squawk.v squeak.v squeal.v squint.v squirm.v stagnate.v stem.v stone-wall.v straggle.v stray.v stride.v stridulate.v strive.v struggle.v stutter.v subscribe.v subside.v subsist.v subspecialize.v sub.v succumb.v sulk.v summer.v sunbathe.v supercoil.v supervene.v suppurate.v sup.v surface.v surge.v swagger.v swarm.v swelter.v swerve.v swirl.v swoon.v sympathize.v tamper.v tap-dance.v tapdance.v tarry.v tattle.v taxi.v teem.v teeter.v teethe.v temporize.v tergiversate.v testate.v thrive.v throb.v thud.v tingle.v tinker.v tipple.v tiptoe.v titter.v tittle-tattle.v toady.v toboggan.v toil.v toll.v ton.v tootle.v totter.v touch-type.v tower.v toy.v traipse.v transmigrate.v transpire.v travel.v trek.v tremble.v trespass.v trifle.v trifurcate.v triumph.v trundle.v tunnel.v tussle.v tweet.v twinkle.v twitch.v twitter.v ululate.v underact.v undulate.v uplink.v urinate.v urticate.v vacation.v vacillate.v vacuolate.v vamoose.v vamp.v vanish.v vault.v vegetate.v venodilate.v verbigerate.v verge.v vie.v volvulate.v vouch.v voyage.v waddle.v waffle.v wallow.v waltz.v wander.v wane.v wank.v warble.v water-ski.v waterski.v waver.v weep.v welsh.v welter.v wheeze.v whelp.v whimper.v whinny.v whirr.v whir.v wilt.v wince.v wink.v wiretap.v wisecrack.v wither.v wobble.v womanize.v wool-gather.v woolgather.v wrangle.v wriggle.v writhe.v yacht.v yak.v yammer.v yang.v yap.v yawn.v yaw.v yearn.v yelp.v yen.v yip.v yowl.v zag.v zig.v zig-zag.v zigzag.v link-grammar-4.7.4/data/en/words/words.v.10.10000644000175000017500000000155710204377537017505 0ustar bloombloomacknowledge.q add.q admit.q affirm.q agree.q announce.q argue.q ascertain.q assert.q assume.q believe.q brag.q calculate.q charge.q claim.q command.q comment.q complain.q concede.q conclude.q confess.q confirm.q contend.q decide.q declare.q deduce.q determine.q discern.q disclose.q discover.q emphasize.q envision.q exclaim.q explain.q figure.q guess.q hint.q hope.q imply.q inquire.q insist.q intimate.q learn.q maintain.q muse.q mutter.q note.q observe.q order.q pledge.q postulate.q predict.q presume.q proclaim.q promise.q propose.q prove.q realize.q reason.q recall.q reckon.q recognize.q recount.q reflect.q remark.q remember.q repeat.q reply.q report.q resolve.q respond.q retort.q reveal.q rule.q shout.q sigh.q speculate.q state.q stipulate.q stress.q suggest.q testify.q theorize.q think.q threaten.q warn.q whisper.q wonder.q write.q relate.q continue.q link-grammar-4.7.4/data/en/words/words.v.8.10000644000175000017500000000155211526022265017420 0ustar bloombloomauction.v bandy.v bar.v batten.v block.v blot.v blurt.v board.v book.v bottle.v bundle.v butter.v cage.v carry.v cart.v chalk.v chase.v chuck.v clutter.v cover.v crank.v dam.v dish.v divide.v dole.v dredge.v dump.v egg.v eke.v export.v factor.v fax.v fix.v fling.v fob.v gouge.v ham.v hash.v hoist.v jack.v jazz.v jot.v kick.v ladle.v lay.v lift.v link.v load.v lock.v lop.v mail.v map.v mark.v mete.v mull.v muss.v nail.v palm.v patch.v pave pen.v phase.v phone.v pick.v piece.v pin.v plug.v prick.v prop.v punch.v push.v rack.v rein.v rig.v rile.v rinse.v roughen.v rough.v save.v scale.v scare.v screen.v shake.v shore.v single.v size.v skim.v skittle.v smuggle.v sop.v sort.v spice.v stack.v stake.v stave.v string.v stuff.v suss.v sweep.v tack.v tape.v tear.v throw.v tide.v tie.v top.v total.v touch.v toughen.v track.v wad.v wash.v wave.v wear.v wring.v yank.v zip.v link-grammar-4.7.4/data/en/words/Makefile.am0000644000175000017500000000242411265721575017633 0ustar bloombloomWORDS= \ currency \ currency.p \ entities.given-bisex.sing \ entities.given-female.sing \ entities.given-male.sing \ entities.locations.sing \ entities.national.sing \ entities.organizations.sing \ entities.us-states.sing \ units.1 \ units.1.dot \ units.3 \ units.4 \ units.4.dot \ words.adj.1 \ words.adj.2 \ words.adj.3 \ words.adv.1 \ words-medical.adv.1 \ words.adv.2 \ words.adv.3 \ words.adv.4 \ words.n.1 \ words.n.1.wiki \ words.n.2.s \ words.n.2.s.biolg \ words.n.2.s.wiki \ words.n.2.x \ words.n.2.x.wiki \ words.n.3 \ words.n.t \ words-medical.prep.1 \ words.v.10.1 \ words.v.10.2 \ words.v.10.3 \ words.v.10.4 \ words.v.1.1 \ words.v.1.2 \ words.v.1.3 \ words.v.1.4 \ words.v.1.p \ words.v.2.1 \ words.v.2.2 \ words.v.2.3 \ words.v.2.4 \ words.v.2.5 \ words.v.4.1 \ words-medical.v.4.1 \ words.v.4.2 \ words-medical.v.4.2 \ words.v.4.3 \ words-medical.v.4.3 \ words.v.4.4 \ words-medical.v.4.4 \ words.v.4.5 \ words-medical.v.4.5 \ words.v.5.1 \ words.v.5.2 \ words.v.5.3 \ words.v.5.4 \ words.v.6.1 \ words.v.6.2 \ words.v.6.3 \ words.v.6.4 \ words.v.6.5 \ words.v.8.1 \ words.v.8.2 \ words.v.8.3 \ words.v.8.4 \ words.v.8.5 \ words.y wordsdir=$(pkgdatadir)/en/words words_DATA = $(WORDS) EXTRA_DIST = $(WORDS) link-grammar-4.7.4/data/en/words/words-medical.v.4.40000644000175000017500000012444011246771267021031 0ustar bloombloom abashing.v abjuring.v ablating.v abnegating.v abominating.v abounding.v abscessing.v abscising.v absenting.v abstaining.v acccoutering.v accessioning.v acclimatising.v accoupling.v accoutring.v acetifying.v acetonating.v acetonizing.v acetylating.v acetylising.v acetylizing.v achromatising.v achromatizing.v acidulating.v acing.v actualising.v actualizing.v actuating.v acylating.v adducting.v adenosine_diphosphate-ribosylating adjuring.v administrating.v admixing.v ADP-ribosylating.v adrenalectomizing.v adsorbing.v adulating.v advantaging.v afforesting.v affronting.v afterloading.v agglomerating.v aggrieving.v agonising.v airbrushing.v alcoholising.v alcoholizing.v aliasing.v alining.v aliquoting.v alkalinising.v alkalinizing.v alkalising.v alkalizing.v alkylating.v allelotyping.v allergizing.v allografting.v alloimmunising.v alloimmunizing.v allotransplanting.v alloying.v alluring.v alphabetising.v alphabetizing.v aluminating.v Americanising.v amidating.v aminating.v aminoacylating.v ammoniating.v amortising.v anaesthetising.v anatomizing.v anergising.v anesthetising.v anglicising.v animadverting.v annualising.v annualizing.v annunciating.v anodising.v anodizing.v anonymising.v anonymizing.v anoxiating.v antagonising.v anteriorising.v anteriorizing.v antiaggregating.v anticoagulating.v antigenising.v antigenizing.v anting.v antirepressing.v antisepticising.v antisepticizing.v apeasing.v apodizing.v apologising.v apostatising.v appaling.v appareling.v apparelling.v apporting.v apposing.v apprizing.v arborising.v archiving.v arcing.v arcking.v aromatising.v aromatizing.v arsonating.v arterializing.v articling.v asexualizing.v asperging.v aspersing.v asseverating.v asterisking.v atomising.v attitudinising.v audiotaping.v auscultating.v authoring.v autocatalysing.v autoclaving.v autogenerating.v autoimmunising.v autoimmunizing.v autoinducing.v autoinducting.v autoinjecting.v autolising.v automatising.v auto-oxidising.v autoperfusing.v autopsying.v autoradiographing.v autoregulating.v autosensitising.v autotransplanting.v auxotyping.v avalanching.v avianising.v avianizing.v avowing.v avulsing.v awaking.v aweing.v axotomising.v axotomizing.v azotizing.v baaing.v babying.v baby-siting.v baby-sitting.v backcrossing.v backdroping.v backdropping.v backlabeling.v backlabelling.v backscattering.v baing.v ballasting.v balling.v balloting.v bandpass_filtering baptising.v barbering.v barbing.v bariumizing.v barnstorming.v barracking.v barraging.v barreling.v bastardizing.v bayoneting.v beaching.v beading.v bearding.v beavering.v bedaubing.v bedding.v bedecking.v bedeviling.v behooving.v behoving.v beleaguering.v belling.v bench_pressing beneficing.v benzoylating.v bereving.v besetting.v besmearing.v betrothing.v bettering.v beveling.v biassing.v bibbing.v bickering.v bicompartmentalising.v binging.v bioactivating.v bioassaying.v bioconverting.v bioengineering.v biomagnifying.v bio-monitoring.v biomonitoring.v biopsying.v bioreducing.v bioremediating.v biosynthesising.v biosynthesizing.v biotinylating.v biotransforming.v biotyping.v bisintercalating.v bivouacking.v blacking.v blancoing.v blanking.v blathering.v blobbing.v blooding.v bloodying.v blueing.v bluing.v blustering.v boating.v bobsleding.v boobing.v boomeranging.v boostering.v bootstraping.v bootstrapping.v bottlenecking.v braining.v brain-washing.v brawling.v brazing.v breakfasting.v breast-feeding.v breasting.v breveting.v brevetting.v broadsiding.v brodding.v bromating.v brominating.v bromizing.v bruiting.v brutalising.v bucketing.v buffering.v bulbectomizing.v bulking.v bulling.v bunkering.v burgeoning.v burking.v burring.v bursting.v busing.v bussing.v caching.v caking.v calendering.v calipering.v calking.v callipering.v calumniating.v canalizing.v cancelling.v cancerising.v candying.v cankering.v canning.v cannulating.v cannulizing.v canopying.v cantilevering.v canting.v capacitating.v capillarising.v capitalising.v capitating.v caponising.v caponizing.v captaining.v carbamoylating.v carbamylating.v carbolating.v carbolising.v carbolizing.v carbonating.v carbonising.v carboxylating.v cardiectomizing.v careering.v cartooning.v cashiering.v catabolising.v catalase_testing catalising.v catalizing.v cataloging.v catalysing.v catalyzing.v categorising.v catheterising.v catheterizing.v caulking.v causticizing.v cauterising.v cauterizing.v cavitating.v C-banding.v cementifying.v centrifugalising.v centrifugalizing.v centrifugating.v centrifuging.v cering.v certificating.v chaffing.v chamfering.v champing.v chancing.v channeling.v chaping.v chapping.v characterising.v charbroiling.v checkering.v cheeking.v chemoattracting.v chemo-preventing.v chemopreventing.v chemo-sensitising.v chemo-sensitizing.v chemosensitizing.v chequering.v chickening.v chining.v chinking.v chiseling.v chloring.v chloroforming.v chloroformising.v chloroformizing.v chocking.v cholecystectomising.v cholecystectomizing.v chorusing.v chromating.v chromatizing.v chromatographing.v chromicizing.v chunking.v chuting.v cicatrising.v cicatrizing.v ciphering.v circularising.v circumducting.v civilising.v classing.v clear-cutting.v clearcutting.v clewing.v clocking.v clouting.v cluing.v clysterizing.v coactivating.v coadministering.v co-agglutinating.v co-applying.v coapplying.v coapting.v coarticulating.v co-assembling.v coassembling.v cocainising.v cocainizing.v co-calibrating.v cocalibrating.v co-chromatographing.v cochromatographing.v co-circulating.v co-clustering.v coclustering.v co-colonizing.v cocolonizing.v cocooning.v co-crystallizing.v cocrystallizing.v co-cultivating.v cocultivating.v coculturing.v co-developing.v co-electroporating.v coelectroporating.v coeluting.v co-encapsidating.v coencapsidating.v coencapsulating.v co-enriching.v coenriching.v co-existing.v coexisting.v co-exposing.v coexposing.v coexpressing.v co-extracting.v cografting.v cogwheeling.v co-hybridising.v cohybridising.v co-hybridizing.v cohybridizing.v coimmobilising.v coimmobilizing.v coinfecting.v coinfusing.v co-ingesting.v coingesting.v co-inheriting.v coinheriting.v co-inoculating.v coinoculating.v coking.v collateralising.v collectivising.v colliquating.v colonising.v colonoscoping.v colorising.v colorizing.v colourizing.v co-managing.v comanaging.v comedicating.v cometabolising.v commercialising.v compartmentalising.v compartmenting.v compassing.v compeering.v complexing.v comporting.v computerising.v concatenating.v conceptualising.v concording.v concreting.v concussing.v conding.v condoling.v conducing.v conglomerating.v conglutinating.v coning.v consorting.v consternating.v constitutionalizing.v contradistinguishing.v contraindicating.v controverting.v contunding.v contusing.v convoluting.v co-ordinating.v co-oxidising.v cooxidising.v co-oxidizing.v cooxidizing.v co-partitioning.v co-perfusing.v coperfusing.v copolymerising.v copolymerizing.v coppering.v coproducing.v co-promoting.v copromoting.v corbeling.v corbelling.v co-rearing.v corearing.v co-registering.v co-regulating.v coregulating.v co-releasing.v coreleasing.v corkscrewing.v cornifying.v corning.v corraling.v co-secreting.v cosecreting.v cosegregating.v cosensitising.v cosensitizing.v coshing.v cosolubilising.v cosolubilizing.v co-sponsoring.v cosponsoring.v cosseting.v costarring.v co-stimulating.v costimulating.v co-storing.v costoring.v co-synthesising.v cosynthesising.v co-synthesizing.v cosynthesizing.v cotranscribing.v cotransfecting.v co-transfering.v cotransfering.v co-transferring.v cotransferring.v cotransforming.v cotransmitting.v co-transporting.v cotransporting.v co-treating.v cotreating.v coulorising.v counselling.v counterpoising.v counterregulating.v countersinking.v counterstaining.v counter-transporting.v countertransporting.v countervailing.v coursing.v court-martialling.v covenanting.v cowing.v cozening.v crabbing.v crafting.v craping.v cratering.v crating.v crazing.v creaking.v creping.v crewing.v cricking.v criminalising.v criminalizing.v crimsoning.v crisping.v criss-crossing.v cristallising.v cristallizing.v criticising.v critiquing.v crocking.v crooking.v cross-clamping.v crossclamping.v cross_fertilizing cross-linking.v cross-matching.v cross-protecting.v crossprotecting.v cross-reacting.v crossreacting.v cross-referencing.v crossreferencing.v crusting.v cryo-fixing.v cryofixing.v cryo-preserving.v cryopreserving.v cryoprotecting.v cryo_sectioning cryo-sectioning.v cryotreating.v crystallising.v cuckooing.v cudgelling.v cueing.v cuing.v culturing.v cumbering.v cunding.v curarising.v curarizing.v curating.v cureting.v curetting.v curtaining.v cussing.v customising.v customizing.v cyanylating.v cyclising.v cyphering.v cyto-adhering.v cytoreducing.v cytospinning.v cytostaining.v dansylating.v dappling.v deacetylating.v deactivating.v deacylating.v de-adenylating.v deadenylating.v deafferentating.v deafferenting.v deallergising.v deamidating.v deamidizing.v deaminating.v debouching.v debriding.v debulking.v debuting.v decalcifying.v decannulating.v decapsulating.v decarboxylating.v decatenating.v decentralising.v decerebrating.v decerebrizing.v dechlorinating.v decidualising.v decocting.v decolonising.v decolorising.v decolorizing.v decolourising.v decolourizing.v decomplementizing.v decontroling.v decontrolling.v deconvoluting.v decoronating.v decorticating.v decoupling.v decoying.v decreeing.v deemanating.v de-energising.v deenergising.v de-energizing.v deenergizing.v de-epicardializing.v de-epithelialising.v deepithelialising.v deethylating.v defaecating.v defaunating.v defeminising.v defeminizing.v defenestrating.v defibrillating.v defibrinating.v deflorating.v defocusing.v defocussing.v deformylating.v defunctionalising.v defunctionalizing.v degalactosylating.v degasing.v degassing.v degaussing.v degenitalizing.v deglycerating.v degreasing.v dehaematising.v dehalogenating.v dehematizing.v dehemoglobinizing.v dehorning.v dehulling.v dehumanising.v dehydrochlorinating.v dehydrogenating.v dehydrogenising.v dehydrogenizing.v dehydroxylating.v dehypnotising.v dehypnotizing.v deinducing.v deinstitutionalizing.v deionising.v deionizing.v dejecting.v de-leading.v deleading.v delimitating.v delipidating.v delocalising.v delocalizing.v delousing.v demagnetising.v demarking.v demasculinising.v demedullating.v demembranating.v demetalising.v demetalizing.v demethylating.v demilitarising.v demineralising.v demineralizing.v demobilising.v democratising.v demodulating.v demonetising.v demonetizing.v demoralising.v demustardizing.v demyelinating.v demystifying.v denationalising.v denaturing.v denervating.v denitrating.v denitrifying.v deodorising.v deoxidising.v deoxidizing.v deoxygenating.v depancreatizing.v deparaffinising.v deparaffinizing.v departmentalising.v depersonalizing.v dephosphorylating.v depigmenting.v depilating.v depolarising.v depoliticising.v depoliticizing.v depolymerising.v depotentiating.v depraving.v depressurising.v depressurizing.v deprojecting.v deprotecting.v deproteinating.v deprotonating.v depurating.v deputing.v deputising.v deregulating.v derepressing.v deresinating.v derivatising.v derivatizing.v derivitising.v derivitizing.v deroofing.v derotating.v derricking.v desalinising.v desalting.v desamidating.v desamidizing.v descaling.v desensitising.v desexualising.v desexualizing.v desheathing.v desialylating.v desolating.v desolvating.v desorbing.v despeciating.v destabilising.v destablising.v destablizing.v destaining.v desulfating.v desulfurating.v desulphating.v desulphurating.v desynchronising.v detailing.v dethyroidizing.v detouring.v detoxicating.v deuterating.v deuteriating.v devascularizing.v deviling.v devilling.v devitalising.v devitalizing.v deworming.v dextrinating.v dextrinizing.v diacetylating.v diacylating.v diagraming.v diagramming.v dialkylating.v dialoging.v dialoguing.v dialysing.v diapausing.v diapering.v diazotizing.v dibbling.v dickering.v dideuterating.v diesterifying.v difluorinating.v digitalising.v digitilising.v digitising.v digitizing.v dihalogenating.v dihydrogenating.v dihydroxylating.v diiodinating.v diking.v dilatating.v dimerising.v dimethylating.v dimiting.v dimitting.v dimpling.v diphosphorylating.v dirtying.v disacidifying.v disadvantaging.v disaggregating.v disagreeing.v disambiguating.v disarraying.v disbelieving.v disbudding.v disbuding.v disburdening.v discoing.v discolouring.v discommoding.v discomposing.v disconfirming.v discountenancing.v discretising.v discretizing.v disembodying.v disemboweling.v disencumbering.v disfavoring.v dishabituating.v disheveling.v dishevelling.v dishonoring.v disimmunizing.v disinhibiting.v disinserting.v disjointing.v dismutating.v disoccluding.v disordering.v disorganising.v disorganizing.v dispensarising.v dispensarizing.v dispiriting.v disproportionating.v disquieting.v disregulating.v dissatisfying.v dissimilating.v distempering.v distraining.v divulsing.v docketing.v dogging.v dolling.v dollying.v domiciling.v doming.v dorsalising.v dorsiducting.v dosing.v dossing.v douching.v doweling.v dowelling.v downmodulating.v downregulating.v downstaging.v dowsing.v dramatising.v drating.v dratting.v driveling.v drivelling.v drudging.v dumfounding.v duning.v dunning.v duplexing.v dyking.v dysregulating.v earing.v earthing.v ebbing.v echolocating.v economising.v ecphorising.v ecphorizing.v ectropionising.v ectropionizing.v editorialising.v educing.v edulcorating.v effectuating.v effing.v egesting.v ekphorizing.v elating.v electroblotting.v electro-cauterising.v electrocauterising.v electro-cauterizing.v electrocauterizing.v electrodialysing.v electroeluting.v electro-injecting.v electroinjecting.v electroinserting.v electrophoresing.v electrophoring.v electroplating.v electroporating.v electrotransfering.v electrotransferring.v electroverting.v eluting.v elutriating.v emaciating.v embolising.v embrocating.v emedullating.v empaneling.v empathising.v emphasising.v emplacing.v emulsioning.v enameling.v enamoring.v enamouring.v encapsulating.v enchaining.v encoring.v encrusting.v endarterectomising.v endarterectomizing.v endoscoping.v endothelialising.v enduing.v energising.v energizing.v enfeebling.v engrafting.v engrailing.v enkindling.v enlacing.v enplaning.v enrapturing.v ensheathing.v ensilaging.v ensiling.v enterectomising.v enterectomizing.v enthraling.v entropionizing.v envelopping.v envenoming.v environing.v enwraping.v enwrapping.v epilating.v epimerising.v epithelialising.v epithelializing.v epithelising.v epithelizing.v epitomising.v epoxidising.v epoxidizing.v equaling.v equalising.v equilibrating.v eroticising.v eroticizing.v erotising.v erotizing.v essaying.v esterifying.v estranging.v estrogenising.v estrogenizing.v etherising.v etherizing.v ethylating.v euthanatising.v euthanatizing.v euthanising.v euthanizing.v evaginating.v everting.v evidencing.v exacting.v exanimating.v excerpting.v exchange-transfusing.v excogitating.v execrating.v exenterating.v exorcising.v expatriating.v exsanguinating.v exsecting.v exsomatizing.v exteriorising.v exteriorizing.v externalising.v extruding.v extubating.v exulting.v eyeing.v factorising.v factorizing.v faggoting.v fagoting.v familiarising.v fantasising.v faradising.v faradizing.v farnesylating.v farting.v fathering.v feather-beding.v fecundating.v federalising.v federalizing.v feeing.v felicitating.v feminising.v feminizing.v fenestrating.v fertilising.v festering.v feuing.v fevering.v fictionalising.v fictionalizing.v field_testing field-testing.v filching.v filtrating.v finalising.v fingerprinting.v fire-proofing.v fireproofing.v fissuring.v fistulising.v flabbergasting.v flanging.v flawing.v flecking.v fleshing.v flexibilising.v flexibilizing.v flouncing.v floundering.v flouring.v fluidizing.v fluoresceinating.v fluoridising.v fluoridizing.v fluoroscoping.v fluting.v foaling.v focalising.v fogging.v foging.v footling.v footnoting.v footprinting.v footsloging.v foraying.v forbidding.v forbiding.v forboding.v forebidding.v forebiding.v foreboding.v foredooming.v foregrounding.v foreknowing.v foresting.v foretasting.v formalinising.v formalinizing.v formalising.v formatting.v formylating.v fossilising.v fowling.v foxhunting.v foxing.v fractionating.v franchising.v fraternising.v freckling.v free_grafting free-grafting.v freeze_drying freeze-drying.v freeze-fracturing.v freighting.v fringing.v frivolling.v frolicking.v frothing.v fruiting.v fuddling.v functionalising.v functionalizing.v funking.v funneling.v furcating.v furring.v gabbing.v gabbling.v gadding.v galactosylating.v galavanting.v galivanting.v galumphing.v galvanising.v ganglionectomising.v ganglionectomizing.v gangrening.v gapping.v garaging.v garlanding.v garoting.v garotting.v garroting.v garrotting.v gasing.v gassing.v gastrectomising.v gastrectomizing.v gating.v gavaging.v gazeting.v gazetting.v gelatinising.v gelding.v generalising.v gening.v genning.v genotyping.v gentling.v genuflecting.v geocoding.v geranylgeranylating.v ghosting.v gingering.v girdling.v glacing.v glamorising.v glissading.v globalising.v glomectomising.v glomectomizing.v gloming.v glomming.v gloving.v glowering.v glucoronising.v glucuronidating.v glueing.v gluing.v glycating.v glycerolating.v glycerolizing.v glycosylating.v gonadectomizing.v goosing.v gormandising.v gowning.v graining.v grandfathering.v grandparenting.v graphing.v grassing.v graveling.v greening.v griming.v grizzling.v grommeting.v grubbing.v grubing.v guesting.v gulling.v gusseting.v guttering.v guying.v habilitating.v habituating.v haemagglutinating.v haemoagglutinating.v haemocoagulating.v haemodialysing.v haemodialyzing.v haemodiluting.v haemolysing.v haemolyzing.v haemoperfusing.v haemorrhaging.v hallmarking.v halogenating.v handpicking.v haploidising.v happing.v haptenating.v harmonising.v hasping.v headlining.v hemicastrating.v hemi-deleting.v hemisecting.v hemispherectomising.v hemispherectomizing.v hemodialysing.v hemodialyzing.v hemodiluting.v hemolysing.v hemoperfusing.v hemorrhaging.v heparinising.v heparinizing.v hepatectomising.v hepatectomizing.v heterodimerising.v hexing.v hiccoughing.v hieing.v high-jacking.v hirudinizing.v histoculturing.v hoboing.v holidaying.v holing.v homing.v homodimerising.v homodimerizing.v homogenising.v homografting.v honeycombing.v hooping.v horning.v horsing.v hospitalising.v hoting.v hotting.v hoving.v hoxing.v humanising.v humanizing.v humoring.v hurdling.v husbanding.v hyalinising.v hyalinizing.v hybridising.v hydrogenating.v hydrogenizing.v hydrolising.v hydrolizing.v hydrolysing.v hydroxylating.v hying.v hymning.v hyperacetylating.v hyperactivating.v hypercontracting.v hyperdefaecating.v hyperexpressing.v hyperextending.v hyperfiltrating.v hyperfractionating.v hyperimmunising.v hyperimmunizing.v hyper-inducing.v hyperinducing.v hyperinnervating.v hyperluteinising.v hyper-methylating.v hypermethylating.v hypernucleating.v hyperpolarising.v hyperproducing.v hypersensitising.v hyperstimulating.v hypertransfusing.v hypnoidizing.v hypnotising.v hypomineralising.v hypomineralizing.v hypo-phosphorylating.v hypophosphorylating.v hypophysectomising.v hypophysectomizing.v hyposensitizing.v hypothecating.v hysterectomising.v hysterectomizing.v idealising.v idolising.v imbedding.v imbeding.v immobilising.v immortalising.v immunising.v immunoabsorbing.v immunoadsorbing.v immuno_assaying immuno-assaying.v immunoassaying.v immunobloting.v immunoblotting.v immunocompromising.v immunodepleting.v immunodepressing.v immunoenhancing.v immunoexpressing.v immunoinhibiting.v immunoisolating.v immunolabeling.v immunolabelling.v immunolocalising.v immunolocalizing.v immunoneutralising.v immunoneutralizing.v immunophenotyping.v immunopurifying.v immunoradioassaying.v immunoregulating.v immunoscreening.v immunoselecting.v immunostaining.v immunostimulating.v immunosuppressing.v immuno-targeting.v immunotargeting.v immunotitrating.v immunotyping.v immuring.v impaneling.v imperiling.v impersonalising.v impersonalizing.v importuning.v incising.v inclosing.v incommoding.v incrementing.v inculpating.v individualising.v individualizing.v indorsing.v induing.v industrialising.v inebriating.v influxing.v ingling.v ingrafting.v ingraining.v inhuming.v initialing.v initialising.v initializing.v inlayinging.v inlaying.v innervating.v inputing.v inputting.v inseting.v insetting.v insolubilising.v insolubilizing.v insonifying.v instancing.v institutionalising.v instrumenting.v insufflating.v intellectualising.v intellectualizing.v intercalating.v interconverting.v interfacing.v interiorising.v interiorizing.v interlacing.v interlarding.v interleafing.v interlinking.v internalising.v internationalising.v interpellating.v interposing.v interspacing.v intrenching.v introjecting.v introspecting.v introverting.v intrusting.v intubating.v inuring.v inventorying.v invoicing.v iodinating.v iodising.v ionising.v iontophoresing.v iridectomizing.v irritating.v isoimmunising.v isoimmunizing.v isomerising.v italicising.v itemising.v jacketing.v jack_knifing jackknifing.v jagging.v jaunting.v jecorizing.v jejunectomising.v jejunectomizing.v jeopardising.v jointing.v juicing.v junking.v karyotyping.v keening.v kenneling.v kennelling.v kenting.v keratinising.v keying.v kidnaping.v kinking.v kneeing.v KO'ing.v KO’ing.v labilising.v labyrinthectomising.v labyrinthectomizing.v lacrymating.v lactonising.v laddering.v lambing.v laminectomising.v laminectomizing.v laming.v lamming.v laparotomising.v laparotomizing.v lapinising.v lapinizing.v larding.v lariating.v larking.v laryngectomising.v laryngectomizing.v lasering.v lassooing.v lateralising.v lathering.v lathing.v lavaging.v layering.v leafleting.v leafletting.v leaguing.v leap-frogging.v leap-froging.v leapfroging.v leashing.v leeching.v leeping.v legalising.v legitimating.v legitimatising.v legitimising.v legitimizing.v lentectomizing.v lesioning.v lettering.v libeling.v liberalising.v ligating.v lilting.v liming.v limning.v linearizing.v linging.v linning.v lipectomising.v lipectomizing.v lipidating.v liping.v liposuctioning.v lipoxygenating.v lipping.v lip-reading.v liquifying.v lithographing.v lithotomizing.v lobectomising.v lobectomizing.v lobotomising.v lobotomizing.v loosing.v lording.v Lording.v louping.v louring.v lowing.v lubrifying.v lucking.v lurking.v luteinising.v luxating.v lymphadenectomising.v lymphadenectomizing.v lyophilising.v lyophilizing.v lypophilising.v lypophilizing.v lysogenising.v lysogenizing.v macadamising.v macadamizing.v machining.v macroencapsulating.v magnetising.v mainstreaming.v malaxating.v malfunctioning.v malignising.v malpositioning.v malting.v mantling.v manumiting.v manumitting.v manuring.v marathoning.v Marathoning.v marathonning.v Marathonning.v marbling.v marginating.v marinading.v marshaling.v marsupializing.v masculinising.v masculinizing.v massacring.v mastectomising.v mastectomizing.v master-minding.v materialising.v matting.v maximising.v mazing.v mechanising.v medialising.v medicalising.v medicalizing.v medisecting.v medullectomising.v medullectomizing.v melanising.v melanizing.v mentoring.v mercerising.v mercerizing.v merchandising.v mercurating.v mercurializing.v mercuriating.v mesmerising.v metabolising.v metabolizing.v metaling.v metalling.v metastasising.v metering.v methylating.v metricising.v metring.v mewing.v micellising.v microagglutinating.v microaggregating.v microbiopsying.v microcannulating.v microcatheterising.v microcatheterizing.v microcomputerising.v microcomputerizing.v microdetermining.v microdiluting.v microdissecting.v microembolising.v microfilling.v microfiltering.v microinjecting.v micromanipulating.v micromilling.v micromodifying.v micronising.v micronizing.v microperfusing.v microprocessing.v microsequencing.v microtitrating.v microtoming.v microwaving.v middling.v mildewing.v militarising.v militarizing.v mimetising.v mimetizing.v mineralising.v mineralizing.v miniaturising.v minifying.v minimising.v minuting.v misadvising.v misattributing.v miscalling.v miscasting.v misclassifying.v miscoding.v misconducting.v misdiagnosing.v mis-folding.v misidentifying.v misincorporating.v mislabeling.v mislabelling.v mislocalising.v mislocalizing.v mismatching.v mispairing.v misperceiving.v misprinting.v misrecognising.v misrecognizing.v misregulating.v misrepairing.v misrouting.v misruling.v misspecifying.v mis-tuning.v mistuning.v mitering.v mitring.v mobilising.v modernising.v moireing.v moisturising.v moisturizing.v moldering.v monophosphorylating.v monopolising.v moonlighting.v moralising.v morcellating.v morphinizing.v morsing.v Morsing.v morticing.v mortising.v mothering.v moth-proofing.v motorcycling.v motorising.v muckraking.v mulcting.v multimerising.v mummifying.v mummying.v mumping.v muscling.v muscularising.v mutagenizing.v myectomizing.v myristoylating.v narcotizing.v narking.v nasalising.v nasalizing.v nationalising.v naturalising.v nauseating.v nebulising.v nebulizing.v necropsying.v necrotising.v negativing.v neighboring.v neighbouring.v nephrectomising.v neping.v nepping.v nerving.v nesslerising.v nesslerizing.v neuromodulating.v neurostimulating.v neutralising.v niching.v nickeling.v nickelling.v niming.v nimming.v Nissl_staining Nissl-staining.v nitrating.v nitrosating.v nitrosylating.v nobbling.v nonplusing.v nonplussing.v noosing.v normalising.v nosing.v notching.v objectifying.v objurgating.v oblating.v obtruding.v obtunding.v obturating.v oestrogenising.v oestrogenizing.v ointing.v O.K.ing.v OKing.v oligomerising.v oligomerizing.v oophorectomising.v oophorectomizing.v operationalising.v operationalizing.v oppugning.v opsonifying.v opsonising.v optimising.v optimizing.v orchidectomising.v orchidectomizing.v ordinating.v organising.v orphaning.v osmicating.v osteotomising.v osteotomizing.v ostracising.v outbraving.v out-competing.v outcompeting.v outdating.v outfacing.v out-Heroding.v outlaying.v outmaneuvering.v outmarching.v outmatching.v out-pacing.v outpacing.v outperforming.v outpointing.v outputing.v outputting.v outranging.v outriding.v outrivaling.v outrivalling.v outsailing.v outspreading.v outstriping.v outstripping.v outvying.v outwearing.v ovariectomising.v ovariectomizing.v over-associating.v overassociating.v over-burdening.v over-capitalising.v overcapitalising.v over-capitalizing.v overcapitalizing.v over-charging.v over-consuming.v overconsuming.v over-cooking.v overcorrecting.v overcroping.v overcropping.v over-crowding.v over-detecting.v overdetecting.v overdiagnosing.v overdosing.v over-eating.v over-elongating.v overelongating.v overemphasising.v over-emphasizing.v over-estimating.v over-exerting.v over-exposing.v overexpressing.v over-feeding.v over-hanging.v overhanging.v over-heating.v over-inserting.v overinserting.v overlaying.v over-learning.v overlearning.v overleeping.v overmastering.v over-praising.v over-predicting.v overpredicting.v over-producing.v over-proliferating.v over-refering.v overrefering.v over-reporting.v overreporting.v over-representing.v overrepresenting.v oversaturating.v over-secreting.v oversewing.v over-simplifying.v over-staging.v overstaging.v overstaining.v overstimulating.v over-straining.v over-stretching.v over-synthesising.v oversynthesising.v over-synthesizing.v oversynthesizing.v overthrowing.v over-transcribing.v overtreating.v overusing.v over-valuing.v overventilating.v overviewing.v over_weighting overweighting.v over-wraping.v overwraping.v over-wrapping.v overwrapping.v oxidising.v oxygenising.v oxygenizing.v ozonising.v ozonizing.v palisading.v palliating.v palpating.v palping.v pancreatectomizing.v paneling.v panelling.v paragraphing.v paralleling.v parameterising.v parameterizing.v parasitising.v parasitizing.v parasoling.v parathyroidectomizing.v parboiling.v parceling.v parcelling.v parroting.v particularising.v pasteurising.v pasturing.v patronising.v peaning.v peening.v pelleting.v pelletising.v pelletizing.v penalising.v penciling.v pensioning.v peopling.v pepsinating.v pepsinising.v pepsinizing.v peptonising.v percussing.v perifusing.v peritomizing.v peritonealizing.v peritonizing.v permeabilizing.v permeablising.v peroxidising.v personalising.v pestling.v phagocytising.v phagocytizing.v phagocytosing.v phalangizing.v phenocopying.v phenolating.v phenotyping.v philosophising.v phlebotomising.v phlorhizinising.v phlorhizinizing.v phloridzinising.v phloridzinizing.v phosphonylating.v phosphorylating.v photoactivating.v photobleaching.v photodamaging.v photodecomposing.v photoinactivating.v photoinducing.v photoisomerising.v photolabeling.v photolabelling.v photolysing.v photo-oxidising.v photooxidising.v photo-oxidizing.v photopolymerising.v photopolymerizing.v photoprotecting.v photoreducing.v photoregulating.v photoreversing.v photosensitising.v photostating.v photostimulating.v physicking.v piggybacking.v pilling.v pillowing.v pinding.v pinealectomising.v pinealectomizing.v pinioning.v pinking.v pin-pointing.v pipetting.v pithing.v plagiarising.v plaiting.v planimetering.v planking.v plasmolysing.v plasmolyzing.v plateauing.v platinating.v plating.v pleaing.v pleating.v plicating.v pluming.v plummeting.v plumping.v plunking.v pneumonectomising.v pneumonectomizing.v podding.v poding.v polarising.v pole-axing.v poleaxing.v politicising.v politzerizing.v pollacking.v pollarding.v polyadenalating.v polyadenylating.v polyglutamylating.v polymerising.v polymerizing.v pomading.v pommeling.v pommelling.v poniarding.v popularising.v portacaval_shunting portioning.v postfixing.v potentiating.v potting.v poulticing.v powering.v prawning.v preabsorbing.v preadmiting.v preadmitting.v precepting.v precising.v precoating.v preconditioning.v precooking.v precooling.v preculturing.v predating.v predeceasing.v predefining.v predestinating.v pre-digesting.v predigesting.v pre-embedding.v preembedding.v pre-embeding.v preembeding.v pre-establishing.v preestablishing.v preexisting.v pre-exposing.v preexposing.v prefeeding.v prefixing.v preimmunizing.v preinducing.v preinfecting.v pre-irradiating.v preirradiating.v prelabeling.v prelabelling.v preloading.v preluding.v premedicating.v premiering.v premissing.v premixing.v preping.v prepossessing.v prepping.v preprinting.v preprocessing.v preprograming.v preprogramming.v preprotecting.v prereducing.v prescreening.v preselecting.v presensitizing.v pre-seting.v preseting.v pre-setting.v presetting.v presoaking.v prespawning.v prespecifying.v pressurising.v prestimulating.v pre-surfacing.v pretraining.v pretreating.v previewing.v prewarming.v prewashing.v prickling.v prioritising.v prioritizing.v prising.v privatising.v probating.v profaning.v professionalizing.v prognosing.v prolating.v pronging.v propagandising.v prophesying.v propitiating.v prorating.v proroguing.v proselytising.v prospecting.v prostatectomising.v prostatectomizing.v proteolysing.v proteolyzing.v protracting.v provisioning.v pseudonormalising.v psyching.v psycho-analysing.v psycho-analyzing.v ptyalizing.v publicising.v puddling.v pulping.v pulverising.v puping.v pupping.v purposing.v purpurating.v puttying.v pyridoxylating.v quadding.v quading.v quadrisecting.v quadruplicating.v quailing.v quantising.v quantitating.v quantizing.v quarking.v quarreling.v quartisecting.v quaternizing.v queening.v Queening.v queuing.v quizzing.v rabbiting.v rabbitting.v radiographing.v radioimmunoassaying.v radiolabeling.v radiolabelling.v radiolocalising.v radiolocalizing.v radiosensitising.v radiosensitizing.v ragging.v ranching.v randomising.v randomizing.v rappeling.v rappelling.v rarefying.v rasing.v rationalising.v raying.v razoring.v reabsorbing.v reaccumulating.v reacquiring.v re-adapting.v readding.v readdressing.v readministering.v readying.v re-afforesting.v reafforesting.v reaggregating.v realigning.v realising.v reallocating.v reaming.v re-amplifying.v reamplifying.v reamputating.v reanalysing.v reanalyzing.v re-animating.v reanimating.v reappraising.v re-approximating.v reapproximating.v re-arterialising.v rearterialising.v re-arterializing.v rearterializing.v reasserting.v reassigning.v reassociating.v reassorting.v reattaching.v rebasing.v rebinding.v rebling.v recalcifying.v recalibrating.v recanalizing.v recategorising.v recategorizing.v recatheterising.v recatheterizing.v receipting.v recemising.v recertifying.v rechallenging.v rechromatographing.v recirculating.v reclassifying.v recloning.v recoding.v recognising.v recolonising.v recombining.v recompressing.v reconceptualizing.v reconfiguring.v reconnoitering.v reconstituting.v recontaminating.v recontouring.v re-converting.v re-counting.v re-covering.v recultivating.v reculturing.v redacting.v rededicating.v redescribing.v redetecting.v redetermining.v redevelopping.v reding.v redirecting.v redissecting.v reeducating.v re-elevating.v reemphasizing.v re-endothelialising.v reendothelialising.v re-endothelializing.v re-engineering.v reengineering.v re-entering.v re-epithelialising.v reepithelialising.v re-epithelializing.v re-equilibrating.v re-esterifying.v reesterifying.v reevaluating.v re-examining.v reexamining.v re-excising.v reexcising.v re-exploring.v reexploring.v reexposing.v reexpressing.v re-extracting.v reextracting.v refacing.v refeeding.v refereeing.v refereing.v referencing.v refering.v reffing.v refinishing.v refluxing.v refolding.v reforesting.v reformating.v reformatting.v reframing.v regionalising.v regionalizing.v regrafting.v regularising.v rehearing.v reheating.v rehospitalising.v rehospitalizing.v reimmunizing.v re-implanting.v reimplanting.v reincarcerating.v reincarnating.v re-inflating.v reinitiating.v reinjecting.v reinjuring.v reinnervating.v reinoculating.v reinserting.v reinstituting.v re-internalising.v reinternalising.v re-internalizing.v reinternalizing.v re-interviewing.v reinterviewing.v reintroducing.v reintubating.v re-inventing.v re-irradiating.v reisolating.v rejigging.v rejiging.v re-joining.v relabeling.v relabelling.v relaparoscopying.v relearning.v relining.v relipidating.v relocalising.v relocalizing.v remaindering.v remaking.v remaping.v remapping.v remediating.v remilitarising.v remobilising.v remodeling.v remyelinating.v renaturing.v reneguing.v re-obliterating.v reobliterating.v re-occluding.v re-occurring.v reoccurring.v reorganising.v reoxidising.v reoxygenating.v repartitioning.v repatterning.v reperforating.v reperfusing.v reperitonealising.v reperitonealizing.v replating.v repointing.v repolarising.v repopulating.v reposing.v repositing.v repositioning.v repoting.v repotting.v repriming.v reprobating.v reprocessing.v reprograming.v reprogramming.v republishing.v repurifying.v requiting.v rerunning.v resampling.v rescaning.v rescanning.v re-scoering.v rescoering.v re-scoring.v rescoring.v rescreening.v resealing.v resecting.v resensitising.v resequencing.v residualising.v residualizing.v re-slicing.v reslicing.v resocialising.v resocializing.v resolubilizing.v resorbing.v respelling.v restaging.v restaining.v re-stenosing.v restimulating.v restretching.v restudying.v resulfating.v resulphating.v resurveying.v resuspending.v resuturing.v resynthesising.v resynthesizing.v retraining.v retransforming.v retransfusing.v retransplanting.v retraumatizing.v retreading.v re-treating.v retroceding.v retrofiting.v retrofitting.v retrotranscribing.v retyping.v reusing.v reutilising.v reutilizing.v revaccinating.v revalidating.v revascularising.v revascularizing.v reveiling.v revendicating.v revenging.v revitalising.v revivifying.v revolutionalising.v revolutionalizing.v revolutionising.v rewarming.v reworking.v rexing.v rhapsodising.v ribosylating.v ricking.v ricochetting.v ridging.v riming.v riting.v ritting.v ritualising.v ritualizing.v riving.v robing.v romanticising.v roneoing.v rongeuring.v roofing.v rooking.v roseting.v rosetting.v rosining.v rough-casting.v roughcasting.v rough-drying.v roughhousing.v rouging.v roweling.v rowelling.v rubberising.v ruddling.v ruffing.v rumoring.v rumouring.v rusking.v ruting.v rutting.v sabering.v sabring.v salaaming.v salifying.v sallowing.v salving.v sandaracing.v sandaracking.v sand-blasting.v sanitising.v sanitizing.v sating.v saucerizing.v sauting.v savoring.v savvying.v scabing.v scalloping.v scaming.v scamming.v scamping.v scapegoating.v scar_cicatrising scar_cicatrizing scarifying.v sclerotising.v sclerotizing.v scolloping.v scourging.v scrabbling.v scragging.v scraging.v scribing.v scrimmaging.v scripting.v scrupling.v scrutinising.v SCUBAing.v scudding.v scuding.v scuppering.v scything.v seaming.v secluding.v sectioning.v sectoring.v secularising.v sedimenting.v segmenting.v semaphoring.v semisynthesising.v semisynthesizing.v sensibilising.v sensibilizing.v sensitising.v sequencing.v sequestrating.v serialising.v serogrouping.v serotyping.v servo-controling.v servocontroling.v servo-controlling.v servocontrolling.v sexing.v sexualising.v sexualizing.v shafting.v shallowing.v shambling.v shanghaiing.v sheering.v sheeting.v shellacing.v shellacking.v shiming.v shimming.v shinning.v shipwrecking.v shoding.v shoeing.v short-listing.v shoveling.v shrining.v shriving.v shuttling.v sialadenectomizing.v sialylating.v siccing.v sicing.v sickling.v side-tracking.v signalising.v signalizing.v siliconising.v siliconizing.v silting.v silvering.v silylating.v singularising.v singularizing.v sintering.v siting.v situating.v skateboarding.v skeining.v skeletonising.v skying.v slanging.v slatting.v sledding.v sleding.v sleighing.v slenderising.v sleuthing.v slitting.v slivering.v slopping.v sludging.v sluicing.v smirching.v smuting.v smutting.v snaffling.v snicking.v snowshoeing.v snugging.v snuging.v soaping.v socialising.v sodding.v soding.v soft-pedaling.v soft-soaping.v soft-soldering.v solacing.v solating.v solemnising.v solemnizing.v soliloquising.v soling.v soloing.v solubilising.v solubilizing.v solvating.v somatising.v somatotyping.v sonicating.v sooting.v sorbing.v sorrowing.v sovietizing.v spangling.v spatchcocking.v spating.v spatulating.v speckling.v spindling.v spiralising.v spiritualising.v spiritualizing.v spirting.v splenectomising.v splenectomizing.v splinting.v splotching.v spoofing.v spooking.v spooling.v spooning.v sporulating.v spudding.v spuding.v squeegeeing.v squeegeing.v stabling.v stagging.v stanching.v standardising.v steam-heating.v steam-rollering.v stenciling.v stencilling.v sterilising.v stewarding.v stigmatising.v stilting.v stinking.v stock-piling.v stockpiling.v stomping.v stoppering.v stranding.v strangulating.v striating.v stricturing.v stroping.v stropping.v strychnizing.v stultifying.v stupefying.v stylising.v subcategorising.v subcategorizing.v sub-classifying.v subclassifying.v subcompartmentalising.v subcompartmentalizing.v subcultivating.v subculturing.v subexciting.v subgrouping.v subindexing.v subjoining.v subliming.v sublocalising.v sublocalizing.v subluxating.v suborning.v subsaturating.v subsidising.v subspecialising.v subtitling.v subtyping.v suctioning.v sugaring.v sulfating.v sulfonating.v sulfurating.v sulfureting.v sulfuretting.v sulfurizing.v sulphating.v sulphonating.v sulphurating.v sulphureting.v sulphuretting.v sulphurising.v sulphurizing.v summarising.v sunburning.v superactivating.v superannuating.v supercooling.v superducting.v superfusing.v superhydrating.v superinducing.v superintending.v superposing.v superprecipitating.v supersaturating.v supershifting.v suprarenalectomizing.v surcharging.v surfeiting.v suscitating.v suturing.v swabbing.v swabing.v swaddling.v swaging.v swaning.v swanning.v swilling.v swobbing.v swobing.v swoping.v swopping.v syllabicating.v syllabifying.v syllabizing.v symbolising.v sympathectomising.v sympathectomizing.v sympathising.v synapsing.v synchronising.v synergising.v synonymizing.v synostosing.v synthesising.v synthetising.v synthetizing.v syringing.v systematising.v tabooing.v tabuing.v tape-recording.v targetting.v taring.v tarmacing.v tarmacking.v teeing.v telecommunicating.v telefaxing.v telepathizing.v teletransmiting.v teletransmitting.v tempering.v temporising.v tenanting.v tenoning.v tenotomizing.v tenting.v tenuring.v terrorising.v teslaizing.v tetanising.v tetanizing.v tetramerising.v thermalising.v thermocauterising.v thermocauterizing.v thermocycling.v thermoregulating.v thermosensitising.v thermosensitizing.v thoracotomising.v thoracotomizing.v throeing.v throing.v thrusting.v thwacking.v thymectomising.v thymectomizing.v thymolizing.v thyroidectomising.v thyroidectomizing.v thyroidizing.v thyroparathyroidectomizing.v timetabling.v tincturing.v tingeing.v tinning.v tittivating.v toggling.v tolerising.v tolerizing.v tonicizing.v tonsillectomizing.v tonsuring.v tooling.v top-dressing.v torquing.v torrefying.v tosylating.v toweling.v trabeculating.v tracheostomizing.v tracheotomizing.v traducing.v trafficing.v trafficking.v trammeling.v trammelling.v tranquillising.v transactivating.v transdifferentiating.v transducing.v transecting.v transesterifying.v transfecting.v transfiguring.v transhiping.v transilluminating.v transiting.v transliterating.v translocating.v transmogrifying.v transphosphorylating.v transsecting.v transshiping.v trapsing.v traumatising.v traumatizing.v travestying.v treadling.v treeing.v trellising.v trenching.v trending.v trepaning.v trepanning.v trephining.v triangulating.v trichinizing.v trilling.v triplicating.v trisecting.v tritiating.v triturating.v trivialising.v trolling.v trooping.v trucking.v truing.v trussing.v trypsinising.v trypsinizing.v tubularizing.v turfing.v turgidizing.v twining.v twinning.v twiting.v twitting.v tyrannising.v ubiquitinating.v ultrapurifying.v ultrasonicating.v unbaring.v unbarring.v unbinding.v unbosoming.v unbridling.v uncaping.v uncapping.v unclamping.v uncliping.v unclipping.v unclogging.v uncloging.v uncuffing.v undeceiving.v undercalling.v underdetecting.v underdiagnosing.v underemphasising.v underemphasizing.v underexerting.v under-feeding.v undernourishing.v underpredicting.v undersedating.v understaging.v understaining.v undertreating.v underusing.v underutilising.v underutilizing.v underwriting.v unfiting.v unfitting.v unhorsing.v universalizing.v unknotting.v unmaning.v unmanning.v unravelling.v unroofing.v unsaying.v unseating.v unsexing.v unsticking.v upregulating.v uptaking.v urbanising.v utilising.v vacuuming.v vagotomizing.v vailing.v vandalising.v vandalizing.v vaporising.v vapourising.v vapourizing.v variegating.v variolating.v vascularising.v vascularizing.v vasectomizing.v vaunting.v veneering.v ventralising.v ventralizing.v ventricular_hypertrophying ventriducting.v verbalising.v victimising.v victualing.v victualling.v videoing.v virilising.v virilizing.v visioning.v visualising.v vitalising.v vitalizing.v vitrectomising.v vitrectomizing.v vivifying.v vocalising.v vogueing.v voguing.v volitilising.v vortexing.v vulcanising.v vulcanizing.v vulgarising.v vulnerating.v wagering.v wallpapering.v wanding.v wardening.v waring.v warring.v waterlogging.v wearying.v weaseling.v webbing.v weeing.v weekending.v weiring.v welching.v welling.v wenching.v westernising.v whisking.v whizing.v whizzing.v whopping.v winching.v winkling.v wintering.v wising.v womanising.v wowing.v wracking.v wreathing.v xanthating.v xenografting.v xeroxing.v Xeroxing.v x_raying X_raying x-raying.v xraying.v X-raying.v yarning.v yellowing.v yoking.v zenkerizing.v zippering.v link-grammar-4.7.4/data/en/words/entities.locations.sing0000644000175000017500000000612011042453530022256 0ustar bloombloomAfrica.l Agreste.l Alabama.l Alberta.l Aleppo.l Antigua.l Arctic.l Arizona.l Arkansas.l Arusha.l Asia.l Aspen.l Assyria.l Atlanta.l Baar.l Balboa.l Baltimore.l Bangkok.l Barbuda.l Barcelona.l Bechuanaland.l Beijing.l Bern.l Berne.l Bombay.l Borneo.l Bosnia.l Bratislava.l Brevital.l Bristol.l Brittany.l Brussels.l Budapest.l Buruli.l Byelarus.l Byzantium.l Cad.l Cape.l Cage.l Cain.l Cairo.l California.l Callisto.l Cambridge.l Canterbury.l Catalonia.l Cephalonia.l Ceylon.l Champagne.l Charon.l Chicago.l Cincinnati.l Colorado.l Columbia.l Como.l Connecticut.l Copenhagen.l Corinth.l Coventry.l Coxsackie.l Creation.l Crouzon.l Curacao.l Dallas.l Delaware.l Derby.l Devonshire.l Dodge.l Doheny.l Dorex.l Dublin.l Eden.l Edinburgh.l Eire.l Eminence.l Erie.l Europa.l Europe.l Fermo.l Fife.l Florida.l Formalin.l Formosa.l Frankfurt.l Funen.l Gaul.l Geneva.l Goa.l Guadalajara.l Guam.l Guiana.l Hamburg.l Hardy.l Harlem.l Hartmann.l Harvard.l Hasselbach.l Haverhill.l Heidelberg.l Helsinki.l Henderson.l Hercules.l Hermes.l Herzegovina.l Holland.l Ibadan.l Illinois.l Indiana.l Interlingua.l Islay.l Johannesburg.l Kampuchea.l Kansas.l Katanga.l Katar.l Kea.l Kentucky.l Kilimanjaro.l Kirghizia.l Kyoto.l Lagos.l Leeds.l Leichtenstein.l Leiden.l Lissauer.l Liverpool.l Locarno.l London.l Louisiana.l Lucerne.l Lucifer.l Lund.l Lusaka.l Macao.l Madoera.l Madrid.l Maghreb.l Maine.l Malmo.l Manchuria.l Manipur.l Manitoba.l Mannheim.l Marabou.l Maryland.l Massachusetts.l Melanesia.l Memphis.l Mesopotamia.l Miami.l Michigan.l Milan.l Milwaukee.l Minneapolis.l Minnesota.l Mississippi.l Missouri.l Moab.l Mohammedanism.l Mom.l Montana.l Monterrey.l Morin.l Moscow.l Mulago.l Munich.l Myanmar.l Nagasaki.l Nairobi.l Nakai.l Nakayama.l Nebraska.l Neptune.l Nevada.l Newcastle.l Newfoundland.l Niagara.l Nottingham.l Nyanza.l Nyasaland.l Oceania.l Oedipus.l Oklahoma.l Olympia.l Ontario.l Opah.l Oregon.l Orion.l Osaka.l Oslo.l Oxford.l Plasmapur.l Parasal.l Patella.l Penhale.l Pennsylvania.l Pentothal.l Persia.l Perth.l Petri.l Pharmacol.l Philadelphia.l Phobos.l Photofrin.l Pick.l Pitter.l Pneumocystis.l Poliklinik.l Polivy.l Polonia.l Polynesia.l Ponta.l Portela.l Porto.l Prague.l Prantal.l Princeton.l Prinzmetal.l Quebec.l Queensland.l Rhodesia.l Rio.l Riyadh.l Rome.l Rothmund.l Rotterdam.l Ruthenia.l Sacramento.l Sanaa.l Sandhoff.l Santiago.l Sapporo.l Sarawak.l Sardinia.l Saskatchewan.l Saskatoon.l Satan.l Saturn.l Scandinavia.l Scotland.l Scrabble.l Scythia.l Sheffield.l Siam.l Siberia.l Sicily.l Sievert.l Sikkim.l Silesia.l Sinai.l Sinkiang.l Siva.l Soho.l Somaliland.l Sora.l Southwest.l Spitsbergen.l Stockholm.l Storz.l Stylonychia.l Suffolk.l Sulawesi.l Sumatra.l Sydney.l Tahiti.l Taipan.l Taipei.l Tanganyika.l Tasmania.l Tennessee.l Terramycin.l Tijuana.l Toledo.l Toronto.l Transcaucasia.l Transvaal.l Transylvania.l Trinidad.l Tripoli.l Triton.l Troms.l Tuscany.l Tuskegee.l Udayana.l Udkoff.l Ulster.l Uppsala.l Uranus.l Vancouver.l Venice.l Venus.l Vermont.l Virginia.l Vojvodina.l Warsaw.l Weber.l Williamsburg.l Wisconsin.l Wyoming.l Zante.l Zanzibar.l Zurich.l link-grammar-4.7.4/data/en/words/words.n.10000644000175000017500000035127611526022265017255 0ustar bloombloomabacus.n abbe.n abbess.n abbey.n abbot.n abbreviation.n abdication.s abdomen.n abduction.n aberration.s ablaut.n abnormality.s abode.n abolitionist.n abomination.n aboriginal.n aborigine.n abortionist.n abortion.s abrasion.n abrasive.s abridgement.s abridgment.s abscess.s absence.n absentee.n absorbent.n abstention.s abstraction.s abstract.n absurdity.s abuse.s abutment.n abyss.n acacia.n academician.n academic.n academy.n accelerando.n accelerator.n accent.n accessory.n accident.n accolade.n accommodation.s accompaniment.n accompanist.n accomplice.n accomplishment.s accordance.s accordion.s accord.s accountant.n account.n accretion.s accumulation.s accusative.n accuser.n ace.n acetate.n ache.n achievement.n acid.s acolyte.n acorn.n acoustic.n acquaintance.s acquaintanceship.n acquiescence.n acquisition.s acquittal.s acre.n acrobat.n acronym.n acropolis.n acrostic.n action.s activist.n activity.s act.n actor.n actress.n-f actuality.s actuary.n adage.n adagio.n adaptation.s adapter.n adaptor.n adder.n addiction.s addict.n addition.s additive.n addressee.n address.n adherence.n adherent.n adhesion.s adhesive.s adjective.n adjournment.n adjudicator.n adjunct.n adjuster.n adjustment.s adjutant.n administration.s administrator.n admiral.n admiralty.n admirer.n admission.s admixture.n admonition.n ad.n adolescent.n adoption.s adornment.s adulteration.s adulterer.n adulteress.n adulthood.s adult.n advance.n advancer.n advantage.s advent.n adventurer.n adventure.s adverb.n adversary.n adversity.s advertisement.s advertiser.n advert.n adviser.n advisor.n advocate.n aegis.n aeration.n aerial.n aerodrome.n aeronaut.n aeroplane.n aerosol.s aesthete.n affair.n affectation.s affidavit.n affiliate.n affiliation.s affinity.s affirmation.s affirmative.n affix.n affliction.n affront.n Afghan.s African.s aftereffect.n afternoon.s afterthought.n agar.s agency.n agenda.n agent.n age.s agglomeration.s aggrandizement.n aggravation.s aggregate.n aggregation.s aggression.s aggressor.n agidigbo.s agitation.s agitator.n agnostic.n agony.s agora.n agreement.s agronomist.n aide.n aid.s ailment.n aim.s airbed.n airbrake.n aircraft.s aircrew.n airfield.n airflow.n airing.n airline.n airliner.n airplane.n airport.n air.s airship.n airstrip.n airway.n aisle.n alarmist.n alarm.s Albanian.s albatross.n Alberian.s albino.n album.s alchemist.n alcoholic.n alcove.n alert.n ale.s Algerian.s algorithm.n alias.n alibi.n alien.n alignment.s alkali.s allegory.n allegretto.n allegro.n allergen.n allergy.n alleviation.s alley.n alleyway.n alliance.s alligator.n allocation.s allotment.s allowance.n alloy.s allure.s allusion.n ally.n almanac.n almond.s alphabet.n alpha.s alphorn.s alsatian.n altar.n alteration.s altercation.n alternate.n alternation.s alternative.n altimeter.n altitude.s alto.s altruist.n alveolar.n amalgamation.s amalgam.n amateur.n ambassador.n ambiguity.s ambit.n ambulance.n ambush.s amendment.s amenity.n American.s amethyst.s amnesty.n amoeba.n amortization.s amour.n ampere.n amphetamine.s amphibian.n amphitheatre.n amphora.n amplification.s amplifier.n amp.n amputation.s amulet.n amusement.s anachronism.n anaconda.n anaesthetic.s anaesthetist.n anagram.n analgesic.n analog.n analogue.n analogy.s analysis.s analyst.n anapaest.n anarchist.n anatomist.n ancestor.n ancestry.n anchorage.n anchorite.n anchor.n anchovy.n andante.n Andorran.s anecdote.n aneroid.n anesthetic.s anesthetist.n angel.s Angentinian.s angle.n angler.n anglicism.n Angolan.s angora.s animal.n anime.s animosity.s anise.n ankle.n anklet.n annex.n anniversary.n annotation.s announcer.n annoyance.s annual.n annuity.n annunciation.n anode.n anointment.n anomaly.n anorak.n antagonism.s antagonist.n antecedent.n antechamber.n antelope.n ante.n anteroom.n anthem.n anthology.n anthropoid.n anthropologist.n antibiotic.n antibody.n anticlimax.n antic.n antidote.n Antiguan.s antipathy.s antiquarian.n antiquary.n antique.n antiquity.s antiseptic.n antitoxin.n antler.n ant.n antonym.n anus.n anvil.n aorta.n apache.n apartment.n ape.n aperitif.n aperture.n apex.n aphorism.n aphrodisiac.s apiary.n apocalypse.n apogee.n apologist.n apology.n apostate.n apostle.n apostrophe.n apothecary.n apparatus.n apparition.n appeal.s appearance.n appellant.n appellation.n appendage.n appendectomy.n appendix.n appetite.s appetizer.n apple.s appliance.n applicant.n application.s applicator.n appointee.n appointment.s appraisal.n appraiser.n appreciation.s apprehension.s apprentice.n apprenticeship.n approach.n appropriation.s approval.s approximation.s apricot.s apron.n apse.n aptitude.s aqualung.n aquaplane.n aquarium.n aqueduct.n arabesque.n Arab.s arachnid.n arbiter.n arbitrager.n arbitration.s arbitrator.n arbour.n arcade.n archaeologist.n archaism.n archangel.s archbishop.n archbishopric.n archdeacon.n archdeaconry.n archdiocese.n archduke.n-m archer.n archetype.n archipelago.n architect.n architecture.s archivist.n archlute.s arch.n archway.n arc.n area.s arena.n aria.n aristocracy.s aristocrat.n arithmetician.n ark.n armada.n armadillo.n armament.s armature.n armband.n armchair.n Armenian.s armful.n armistice.n armlet.n arm.n armor.s armoury.n armpit.n army.n aroma.n arpeggio.n arpeggione.s arraignment.n arrangement.s array.n arrester.n arrest.s arrival.n arrowhead.n arrow.n arsehole.n arse.n arsenal.n artefact.n artery.n artichoke.s article.n articulation.s artifact.n artifice.s artisan.n artiste.n artist.n art.s artwork.s ascendant.n ascendent.n ascension.n ascent.n ascetic.n ascription.n Aserbaijani.s ash.s ashtray.n Asian.s aside.n aspect.n aspen.n aspersion.n aspirant.n aspirate.n aspiration.s aspirin.s asp.n assailant.n assassination.s assassin.n assault.s assay.n assemblage.s assembly.n assent.n assessment.s assessor.n asset.n asshole.n assignment.n assistant.n ass.n associate.n association.n assortment.n asterisk.n asteroid.s astrodome.n astrologer.n astronaut.n astronomer.n asylum.s asymptote.n atheist.n athlete.n atlas.n atmosphere.n atoll.n atomizer.n atom.n atrocity.n attache.n attachment.s attacker.n attack.s attainment.s attendant.n attic.n attitude.s attorney.n Attorney.n attraction.n attribute.n attribution.s aubergine.n auctioneer.n auction.s audience.n audition.s audit.n auditorium.n auditor.n augmentation.s augury.n auntie.n-f aunt.n-f aunty.n-f aura.n aureole.n auricle.n aurora.n Australian.s Austrian.s autarchy.s authoritarian.n authority.s authorization.s author.n autobahn.n autobiography.s autocracy.s autocrat.n autograph.n automatic.n automat.n automaton.n automobile.n auto.n autopsy.n autostrada.n autumn.s auxiliary.n avalanche.n avatar.n avenger.n avenue.n average.n aversion.s aviary.n aviator.n avocado.s avocation.n avowal.s award.n awl.n awning.n axe.n axiom.n axle.n ax.n azalea.n azimuth.n babel.n babe.n baboon.n baby.n babysitter.n baccalaureate.n bacchanal.n bachelor.n-m backache.n backbencher.n backbench.n backbiter.n backboard.n backbone.s backdoor.n backdrop.n backer.n background.n backing.s backlash.s backlog.n back.n backroom.n backscratcher.n backseat.n backside.n backstroke.s backup.n backwater.n bacteria.s bacteriologist.n badge.n badger.n baffle.n bagatelle.n bagel.s bag.n bagpipe.s Bahamian.s bailey.n bailiff.n bailout.n bail.s bait.s baker.n bakery.n balalaika.n balance.s balcony.n bale.n balk.n ballade.n ballad.n ballbearing.n ballcock.n ballerina.n ballet.s balloonist.n balloon.n ballot.n ballpen.n ballpoint.n ballroom.n ball.s balustrade.n bambino.n banality.s banana.s bandage.n bandanna.n bandit.n bandleader.n bandmaster.n band.n bandoneón.s bandstand.n bandura.s bandwagon.n banger.n Bangladeshi.s bangle.n bang.n banister.n banjo.s banker.n bank.n banknote.n bankroll.n bankruptcy.s ban.n banner.n bannister.n banquet.n banshee.n baptism.s Barbadian.s barbarian.n barbarism.n barbarity.s barbecue.n barbel.n barber.n barbican.n barbiturate.s barb.n barcarole.n barcarolle.n bard.n bargain.n barge.n bargepole.n baritone.s barker.n bark.n barmaid.n-f bar.n barnacle.n barn.n barnstormer.n barnyard.n barometer.n baronage.n baroness.n baronetcy.n baronet.n baron.n barony.n barrack.n barracuda.n barrage.n barrel.n barricade.n barrier.n barrister.n barrow.n barstar.s bartender.n baryton.s baseball.s baseboard.n basement.n base.n bash.n basilica.n basilisk.n basin.n basis.n basketball.s basket.n bas-relief.s bassinet.n bassoon.s basso.s bass.s bastard.n bastion.n bather.n bath.n bathrobe.n bathroom.n bathtub.n bat.n baton.n battalion.n batten.n batter.s battery.s battledore.n battlefield.n battleground.n battle.s battleship.n bauble.n bawu.s bayan.s bay.n bayonet.n bayou.n bazaar.n bazooka.s beachcomber.n beachhead.n beach.n beacon.n beadle.n bead.n beagle.n beaker.n beak.n beam.n beanfeast.n bean.n beano.s beanstalk.n beard.n bearer.n bearing.n bear.n bearskin.n beast.n beater.n beating.n beat.n beatnik.n beautician.n beauty.s beaver.s beck.n bedbug.n bedfellow.n bed.n bedpan.n bedpost.n bedrock.n bedroll.n bedroom.n bedside.n bedsit.n bedsitter.n bedsore.n bedspread.n bedstead.n bedtime.n beech.s beefeater.n beefsteak.n beehive.n bee.n beeper.n beep.n beer.s beetle.n beetroot.n beet.s beggar.n beginner.n beginning.n begonia.n behavior.s behaviourist.n behest.n behind.n beholder.n being.n Belarusian.s belch.n belfry.n Belgian.s believer.n Belizian.s bellboy.n belle.n bellhop.n belligerent.n bellman.n bell.n bellwether.n bellyache.n bellyflop.n bellyful.n bellylaugh.n belly.n belt.n benchmark.n bench.n bend.n benediction.n benefaction.n benefactor.n benefactress.n-f beneficiary.n benefit.n bent.n bequest.s bereavement.s beret.n berry.n berth.n beryl.s bestiary.n bestowal.s beta.s bet.n betrayal.s betrayer.n betrothal.n betrothed.n bettor.n bevel.n beverage.n bevy.n Bhutanian.s bias.s bibliographer.n bibliography.s bibliophile.n bib.n bicentenary.n bicentennial.n biceps.s bicycle.n bidder.n bidet.n bid.n biennial.n biff.n bifurcation.s bigamist.n bigot.n bigwig.n bike.n bikini.s bilabial.n bilingual.n billboard.n billet.n billfold.n billionaire.n billow.n billy.n binder.n bindery.n bind.n binge.n bin.n biochemical.n biochemist.n biographer.n biography.n biologist.n bioscope.n biped.n biplane.n birch.s birdcage.n bird.n birdseed.s birdwatcher.n biro.n birthday.n birthmark.n birthplace.n birthrate.n birthright.n birth.s biscuit.s bisexual.n bishop.n Bishop.n bishopric.n bison.s bistro.n bitch.n-f bite.n bit.n bivouac.n blabbermouth.n blackamoor.n blackberry.n blackbird.n blackboard.n blackcurrant.n blackguard.n blackhead.n blacklist.n blackmailer.n blackout.n blacksmith.n bladder.n blade.n blancmange.s blandishment.n blanket.n blank.n blasphemer.n blasphemy.s blast.n blaze.n blazer.n bleat.n bleep.n blemish.n blend.n blessing.n blighter.n blight.s blimp.n blindfold.n blink.n blip.n blister.n blitzkrieg.s blitz.n blizzard.n blob.n blockade.n blockage.n blockbuster.n blockhead.n blockhouse.n block.n bloc.n bloke.n blonde.n blond.n bloodhound.n bloodshed.s bloodstain.n bloodsucker.n bloomer.n bloom.s blossom.s blotch.n blot.n blotter.n blouse.n blower.n blowfly.n blowhole.n blowlamp.n blow.n blowout.n blowpipe.n blowtorch.n bludgeon.n bluebell.n blueberry.s bluebottle.n blueprint.n bluestocking.n bluffer.n bluff.s blunderbuss.n blunderer.n blunder.n blurb.n blur.n blush.n boa.n boarder.n boarding.s board.n boardroom.n boardwalk.n boar.n boaster.n boast.n boater.n boathouse.n boat.s boatswain.n bobby.n bobsled.n bobsleigh.n bobtail.n bodega.n bodice.n bodyguard.n body.n bogey.n bogie.n bog.n bogy.n bohemian.n boiler.n boil.n bolero.n Bolivian.s bollock.n bolster.n bolt.n bombarde.s bombardier.n bomber.n bombing.n bomb.n bombshell.n bonanza.n bonbon.n bondholder.n bond.s bone.n boner.n boneshaker.n bonfire.n bongo.n bonnet.n bonus.n boob.n booby.n boogie.s bookcase.n bookclub.n bookie.n bookkeeper.n booklet.n bookmaker.n bookmarker.n bookmark.n bookmobile.n book.n bookseller.n bookshop.n bookstall.n bookworm.n boomerang.n boomer.n boom.n boo.n boon.n boor.n booster.n boost.n booth.n bootlace.n bootlegger.n boot.n boozer.n borderland.n borderline.n border.n bordonua.s bore.n borough.n borrower.n borrowing.s borzoi.n Bosnian.s bosom.n boss.n bosun.n botanist.n bottle.n bottleneck.n bottom.n boudoir.n bough.n boulder.n boulevard.n bounce.s boundary.n bounder.n bound.n bounty.s bouquet.n bourbon.s bourgeoisie.n bourne.n bourse.n boutique.n bout.n bouzouki.s bowel.n bower.n bowler.n bowl.n bow.n boxer.n boxful.n box.n boycott.n boyfriend.n boy.n bracelet.n brace.n bracket.n braggart.n braid.n brain.s brainstorm.n brainwave.n brake.n bramble.s bra.n branch.n brand.n brandy.s brasserie.n brassiere.n brass.s brat.n brave.n brawler.n brawl.n bray.n brazier.n Brazilian.s breach.n breadbasket.n breadcrumb.n breadline.n breadth.s breadwinner.n breakage.n breakaway.n breakdown.s breaker.n breakfast.s break.n breakthrough.n breakup.n breakwater.n breast.n breathalyser.n breather.n breath.s breech.n breeder.n breed.n breeze.n breve.n breviary.n brewer.n brewery.n brew.n briar.s bribe.n brickbat.n brickkiln.n bricklayer.n brick.s bridal.n bridegroom.n-m bride.n bridesmaid.n-f bridgehead.n bridge.n bridle.n briefcase.n briefer.n brief.n brigade.n brigand.n brig.n brim.n brink.n brioche.n briquet.n briquette.n bristle.n Briton.n broadcaster.n broadcast.n broad.n broadsheet.n broadside.n brocade.s brochure.n brogue.n broiler.n brokerage.n broker.n brolly.n bromide.s bronco.n bronze.s brooch.n brood.n brook.n broom.n broomstick.n brothel.n brotherhood.s brother.n-m brouhaha.n brow.n brownie.n brownstone.s browse.n bruin.n bruise.n bruiser.n brunch.s Bruneian.s brunette.n brunt.n brush.s brutality.s brute.n bubble.n buccaneer.n bucketful.n bucket.n buckle.n buckler.n buck.n Buddhist.n buddy.n budgerigar.n budget.s budgie.n bud.n buffalo.s buffer.n buffet.n buffoon.n buff.s bugaboo.n bugbear.n bugger.n buggy.n bugler.n bugle.s bug.n builder.n building.n bulb.n Bulgarian.s bulge.n bulldog.n bulldozer.n bulletin.n bullet.n bullfighter.n bullfight.n bullfinch.n bullfrog.n bullock.n-m bullring.n bullroarer.s bull.n-m bully.n bulwark.n bumblebee.n bumper.n bumpkin.n bump.n bum.s bundle.n bungalow.n bungler.n bung.n bunion.n bunker.n bunk.s bunny.n bun.s buoy.n burden.s bureaucracy.s bureaucrat.n bureau.n burette.n burgess.n burgher.n burgh.n burglar.n burglary.s burg.n burgomaster.n burial.s burlesque.s burner.n burn.n burp.n burrito.s burr.n burro.n burrow.n bursar.n bursary.n burst.n burthen.n Burundian.s bushel.n bush.s businessman.n business.s busker.n bus.n buster.n bustle.s bust.n busybody.n butcher.n butler.n buttercup.n butterfly.n buttery.n butt.n buttock.n buttonhole.n buttonhook.n button.n buttress.n buyer.n buyout.n buzzard.n buzzer.n buzz.n bye.n bylaw.n bypass.n by-product.n byproduct.n byroad.n bystander.n byte.n byway.n byword.n cabal.n cabaret.n cabbage.s cabby.n caber.n cabinet.n cabin.n cablegram.n cable.s cab.n caboodle.n caboose.n cabstand.n cache.n cackle.n cacophony.n cactus.s cadaver.n caddie.n caddy.n cadence.n cadenza.n cadet.n cad.n cadre.n caesura.n cafe.n cafeteria.n caftan.n cage.n cairn.n cake.s calamity.n calculation.s calculator.n caldron.n calendar.n calf.n calibration.s calibre.s calif.n caliphate.n caliph.n caller.n calling.n calliope.s call.n calorie.n calumny.s calypso.n Cambodian.s camel.n cameo.n camera.n Cameroonian.s campaigner.n camper.n camp.n campus.s Canadian.s canal.n canape.n canard.n canary.n cancan.n cancellation.s cancer.s candidacy.n candidate.n candle.n candlestick.n candy.s cane.s canister.n can.n cannery.n cannibal.n cannon.n canoe.n canon.n canopy.n cantaloupe.s cantata.n canteen.n canter.n canticle.n cantilever.n canto.n canton.n cantor.n canvas.s canvass.n canyon.n capability.s cape.n caper.n capillary.n capitalist.n capital.s cap.n capon.n cappuccino.s caprice.n capsule.n captain.n caption.n captive.n captor.n capture.s carafe.n caramel.s carat.n caravan.n caravansary.n caravanserai.n caraway.n carbide.n carbine.n carbohydrate.s carbon.s carbuncle.n carburettor.n carcass.n carcinoma.s cardigan.n cardinal.n cardmember.n card.s careerist.n career.n care.s caress.n caretaker.n caret.n cargo.s caribou.s caricature.s caricaturist.n carillon.s carload.n carmine.s car.n carnation.n carnival.n carnivore.n carol.n carousel.n carpenter.n carpetbagger.n carpet.n carport.n carp.s carriage.n carriageway.n carrier.n carrot.s cartel.n carter.n carthorse.n-m cartilage.s cartload.n cart.n cartographer.n carton.n cartoonist.n cartoon.n cartridge.n cartwheel.n carver.n car_wash car-wash.n carwash.n cascade.n casebook.n casement.n case.n cashew.n cashier.n casino.n casket.n casserole.n cassette.n castanets.s castaway.n caste.s casting.n castle.n cast.n castor.n castration.s castrato.s casualty.n cataclysm.n catalog.n catalogue.n catalyst.n catamaran.n catapult.n cataract.n catastrophe.s catcall.n catcher.n catchment.n catch.n catchword.n catechism.s category.n caterer.n caterpillar.n catfish.s cathedral.n cathode.n Catholic.n cation.n catkin.n cat.n catsup.s catwalk.n caucus.n cauldron.n cauliflower.s cause.n causeway.n caution.s cavalcade.n cavalier.n cavalry.n caveat.n cave.n cavern.n cavity.n C-band.n CD.s ceasefire.n cedar.s cedilla.n ceiling.n celadon.s celebrant.n celebration.s celebrity.s celesta.s cellar.n cellist.n cell.n cello.s cemetery.n censor.n censorship.n censure.s census.n centaur.n centenarian.n centenary.n centennial.n center.n centerpiece.n centigram.n centiliter.n centime.n centimeter.n centimetre.n centipede.n centre.n centrepiece.n centrex.s centrifuge.n centurion.n ceramic.s cereal.s ceremonial.s ceremony.s certainty.s certificate.n certification.s cervix.n cesspit.n cesspool.n chaffinch.n chain.s chairman.n chair.n chairwoman.n chaise.n chalet.n chalice.n chalkpit.n chalk.s challenge.n challenger.n chalumeau.s chamberlain.n chambermaid.n-f chamber.n chamberpot.n chameleon.n chamois.n champagne.s champion.n championship.s champ.n chancellery.n chancellor.n chancel.n chancery.n chandelier.n chandler.n changeling.n changeover.n change.s channel.n chant.n chapel.n chaperon.n chaplain.n chap.n chapterhouse.n chapter.n charabanc.n character.s charade.n charger.n charge.s charioteer.n chariot.n charity.s charlady.n charlatan.n charmer.n charm.s charter.n chart.n chase.n chaser.n chasm.n chassis.s chasuble.n château.s chat.n chatterbox.n chauffeur.n chauvinist.n cheat.n checkbook.n checker.n checklist.n checkmate.n check.n checkout.n checkpoint.n checkroom.n checkup.n cheekbone.n cheek.s cheep.n cheerleader.n cheer.n cheesecake.s cheesecloth.s cheetah.n chef.n chemical.n chemise.n chemist.n chequebook.n cheque.n cherry.n cherub.n chessboard.n chesterfield.n chest.n chestnut.s chew.n chicken.s chick.n chickpea.n chief.n chieftain.n childhood.s child.n Chilean.s chile_poblano chile_relleno chile_verde chili.s chill.n chime.n chimera.n chimney.n chimneypot.n chimneysweeper.n chimneysweep.n chimpanzee.n chimp.n chinchilla.n chink.n chin.n chipmunk.n chip.n chiropodist.n chiropractor.n chirp.n chirrup.n chi.s chisel.n chitarra.s chit.n chive.s choc.n chocolate.s choice.s choirboy.n choir.n choke.n choker.n chop.n chopper.n chopstick.n chorale.n chord.n chore.n choreographer.n chorister.n chortle.n chorus.n chow.s christening.n Christian.n chromosome.n chronicle.n chronicler.n chronology.s chronometer.n chrysalis.n chrysanthemum.n chuckle.n chuck.n chug.n chump.n chum.s chunk.n churchgoer.n church.s churchwarden.n churchyard.n churn.n chute.n cicada.n cider.s cigarette.n cigar.n cimbalom.s cincture.n cinder.n cinema.n cinnabar.s cipher.n circle.n circuit.n circular.n circulation.s circumference.n circumflex.n circumlocution.s circumstance.n circus.n cissy.n cistern.n citadel.n citation.s citizen.n citron.n cittern.s city.n civilian.n civility.s civilization.s claimant.n clairvoyant.n clambake.n clam.n clamour.s clamp.n clang.n clank.n clan.n clapboard.n clap.n clapperboard.n clapper.n claret.s clarinetist.n clarinet.s clarinettist.n clarion.n clash.n clasp.n classicist.n classic.n classification.s classmate.n classroom.n class.s clause.n claves.s clavichord.s clavicle.n clavinet.s claw.n cleaner.s cleanser.s cleanup.n clearance.s clearing.n cleat.n cleavage.n cleaver.n clef.n cleft.n clerestory.n clergyman.n clergy.n cleric.n clerk.n cliche.n click.n clientele.n client.n cliff.n climate.n climax.n climber.n clime.n clincher.n clinch.n clinic.n clink.n clip.n clipper.n clique.n clitoris.n cloak.n cloakroom.n clock.n clodhopper.n clod.n clog.n cloister.n clone.n close.n closet.n clotheshorse.n clothesline.n clothier.n cloth.s clot.n cloudburst.n cloud.n clove.n clown.n clubber.n clubhouse.n club.n cluck.n clue.n clump.n clunk.n cluster.n clutch.n clutter.s coach.n coalfield.n coalition.n coalmine.n coalpit.n coaster.n coastguard.n coastline.n coast.n coat.s coating.n cobble.n cobbler.n cobblestone.n cob.n cobra.n cobweb.n cochlea.n cockatoo.n cockerel.n cocker.n cockhorse.n cockleshell.n cock.n cockney.n cockpit.n cockroach.n cockscomb.n cocktail.n coco.n coconut.s cocoon.n coda.n code.s codfish.s codger.n codification.n codpiece.n cod.s co-ed.n coed.n coefficient.n coffee.s coffer.n coffin.n cogeneration.s cog.n cognate.n cogwheel.n cohort.n coiffeur.n coiffure.n coif.n coil.n coinage.s coincidence.s coin.s coke.s cola.s cold.s collaborationist.n collaborator.n collage.s collapse.n collarbone.n collar.n colleague.n collection.n collector.n college.s collie.n collier.n colliery.n collision.s colloquialism.n colloquy.s Colombian.s colonel.n colonialist.n colonial.n colonist.n colonizer.n colon.n colonnade.n colony.n color.s colour.s colt.n columbine.n columnist.n column.n coma.n combatant.n combination.n combine.n comb.s comeback.n comedian.n comedienne.n comedown.n comedy.s comer.n comet.n comforter.n comfort.s comic.n comma.n commandant.n commander.n commandment.n command.n commando.n commencement.n commendation.s commentary.s commentator.n commercial.n commissariat.n commissar.n commissary.n commissionaire.n commissioner.n commission.s committee.n commode.n commodity.n commodore.n commonplace.n commonwealth.n commotion.s commune.n communicant.n communication.s communion.s communique.n communist.n Communist.n community.n commutation.s commuter.n compact.n companion.n company.s comparative.n comparison.s compartment.n compass.n compatriot.n compendium.n compensation.s competition.s competitor.n compilation.s compiler.n complainant.n complement.n complexion.n complexity.s complex.n complication.n compliment.n component.n comportment.n composer.n composite.n composition.s compote.s compound.s compressor.n compromise.s comptroller.n computation.s computer.n comrade.n comradeship.n concatenation.s concavity.s conceit.s concentrate.s concentration.s conception.s concertina.s concert.n concerto.n concessionaire.n concession.n conch.s concierge.n conclave.n concoction.n concordance.s concordat.n concord.s concourse.n concubine.n concurrence.s concussion.s condemnation.s condensation.s condiment.s conditioner.s condolence.s condominium.n condor.n conductivity.s conductor.n conductress.n conduit.n cone.n coney.n confab.n confabulation.n confectioner.n confection.s confederacy.n confederate.n confederation.s conference.n confessional.n confession.s confessor.n confidante.n confidant.n configuration.n confirmation.s conflagration.n conflict.s confluence.n conformation.n conformist.n confrere.n confrontation.s confutation.n conga.s conglomerate.n conglomeration.n congratulation.n congregation.s congressman.n congress.n conifer.n conjecture.s conjugate.n conjugation.s conjunction.s conjunctive.n conjurer.n conjuror.n conker.n conk.n con.n connection.n connective.n connector.n connexion.s connoisseur.n connotation.n conqueror.n conquest.n conquistador.n conscience.n conscript.n consecration.s consequence.n conservancy.n conservative.n conservatoire.n conservatory.n consideration.s consistency.s consolation.s console.n consolidation.s consomme.s consonant.n consortium.s consort.n conspectus.n conspiracy.n conspirator.n constable.n constabulary.n constant.n constellation.n constituency.n constituent.n constitutionalist.n constitution.n constraint.s constriction.s construction.s construct.n constructor.n consulate.n consul.n consulship.n consultant.n consultation.s consumer.n consummation.s consumptive.n contact.s contagion.s container.n contaminant.n contemporary.n contender.n contestant.n contest.n context.s continent.n contingency.s contingent.n continuation.s contortionist.n contortion.n contour.n contrabass.n contrabassoon.s contraceptive.n contraction.s contract.n contractor.n contradiction.s contralto.s contraption.n contrary.s contrast.s contravention.s contretemps.s contribution.n contributor.n contrivance.n controller.n control.s controversy.s contusion.n conundrum.n conurbation.n convalescent.n convenience.s convention.n convent.n conversationalist.n conversation.s conversion.s converter.n convertible.n convert.n conveyance.s conveyer.n conveyor.n convict.n convocation.s convolution.n convoy.n convulsion.n cookbook.n cooker.n cookie.n cook.n coolant.s cooler.n coolie.n coo.n coon.n co-operative.n cooper.n co-op.n coop.n coordinate.n coordinator.n coot.n copartner.n copartnership.n cope.n cop.n coppersmith.n copse.n copula.n copycat.n copyist.n copy.n copywriter.n coquette.n coral.s cordial.s cordon.n cord.s coreligionist.n core.n corgi.n corker.n cork.s corkscrew.n cormorant.n corncob.n cornea.n corner.n cornerstone.n cornet.s cornett.s cornflake.n cornflower.n cornice.n cornucopia.n corolla.n corollary.n corona.n coronary.n coronation.s coroner.n coronet.n corporal.n corporation.n corpse.n corps.s corpuscle.n corral.n correction.s corrective.n correlation.n correlative.n correspondence.s correspondent.n corridor.n corrosive.n corsage.n corset.n Corsican.s cortex.n coruscation.n corvette.n cosine.n cosmetician.n cosmology.s cosmonaut.n cosmopolitan.n cost.s costume.s costumier.n cosy.n coterie.n cotillion.n cot.n cottage.n cottonseed.n cottontail.n couchette.n couch.n cougar.n cough.n councillor.n council.s counsellor.n counselor.n counsel.s countdown.n countenance.s counterattack.n counterbalance.n counterblast.n counterclaim.n counterfeiter.n counterfeit.n counterfoil.n counter.n counteroffer.n counterpart.n counterplot.n counterpoint.s counterproposal.n countertenor.s countess.n count.n country.n countryside.n county.n coupe.n couple.n couplet.n coupling.n coup.n coupon.n courier.n course.n courtesan.n courtesy.s courtier.n courtroom.n court.s courtship.s courtyard.n cousin.n cove.n covenant.n covering.n coverlet.n cover.n covert.n coward.n cowbell.s cowboy.s cowcatcher.n cowhand.n cowherd.n cowhide.s cow.n-f cowslip.n coxcomb.n cox.n coxswain.n coyote.n crab.s crackdown.n cracker.n crack.n crackpot.n cradle.n craft.s cramp.n cranberry.n crane.n cranium.n crank.n crankshaft.n cranny.n crap.s crash.n crate.n crater.n cravat.n craven.n craving.n crawfish.n crawl.n crayfish.n crayon.n craze.n creak.n creamery.n cream.s crease.n creation.s creator.n creature.n creche.n creditor.n credit.s credo.n creed.n creek.n creeper.n creep.s cremation.s crematorium.n crescendo.n crescent.n crest.n cretin.n crevasse.n crevice.n crew.n crib.n cricketer.n cricket.s crick.n crier.n crime.s criminal.n crimson.s crinkle.n crinoline.s cripple.n crisis.s crisp.n criterion.n criticism.s critic.n critique.n croak.n Croatian.s Croat.s crock.n crocodile.n crocus.n croissant.n cromorne.s crone.n crony.n crook.n crooner.n crop.n cropper.n crossbar.n crossbeam.n crossbow.n crossbreed.n crosscheck.n crosscurrent.n crosscut.n crossfire.s crossing.n cross.n crossroad.n crossroads.n crosswalk.n crossword.n crotchet.n crotch.n crouch.n crowbar.n crowd.n crown.n crow.s crucible.n crucifixion.s crucifix.n cruelty.s cruise.n cruiser.n crumb.n crumhorn.s crumpet.s crunch.n crupper.n crusade.n crusader.n crush.n crustacean.n crust.s crutch.n crwth.s crybaby.n cry.n crypt.n cryptogram.n crystallization.s crystallophone.s crystal.s cuatro.s Cuban.s cubbyhole.n cube.n cubicle.n cubist.n cub.n cuckold.n cuckoo.n cucumber.s cuddle.n cudgel.s cue.n cuff.n cullender.n culmination.n culprit.n cult.n culture.s cummerbund.n cunt.n cupboard.n cupful.n cup.n cupola.n cuprophone.s curate.n curator.n curb.n curd.s cure-all.s cure.s curfew.n curio.n curiosity.s curler.n curl.n curmudgeon.n cur.n currant.n currency.s current.n curriculum.n curry.s curse.n curtailment.s curtain.n curtsey.n curtsy.n curve.n cushion.n cuspidor.n cusp.n cuss.n custard.s custodian.n customer.n custom.s cutback.n cuticle.n cutlass.s cutlet.n cut.n cutter.n cutting.n cuttlefish.s cycle.n cyclist.n cyclone.n cyclopaedia.n cyclostyle.n cyclotron.n cygnet.n cylinder.n cymbal.s cymbalum.s cynic.n cypher.n cypress.n Cypriote.s cyst.n czarina.n czar.n Czech.s dabbler.n dab.n dacha.n dachshund.n dactyl.n daddy.n-m dad.n-m daemon.n daffodil.n dagger.n dago.n daguerreotype.n dahlia.n daily.n dainty.n dairymaid.n-f dairy.n dais.n daisy.n dale.n dalmatian.n dame.n dam.n damn.n damselfish.s damselfly.n damsel.n dancer.n dance.s dandelion.n dandy.n Dane.n daredevil.n dare.n darkroom.n darling.n darn.n dart.n dashboard.n dash.s dateline.n date.n daughter.n dauphin.n davenport.n dawdler.n dawn.s daybook.n dayboy.n daydream.n daygirl.n daytime.n daze.n deaconess.n Deaconess.n deacon.n Deacon.n deadline.n deadlock.s dealer.n dealing.n deal.n deanery.n dean.n deathbed.n deathblow.n death.s deathtrap.n debacle.n debater.n debate.s debauchee.n debauchery.s debenture.s debit.n debtor.n debt.s debutante.n debut.n decagram.n decaliter.n decameter.n decanter.n deception.s decibel.n decigram.n deciliter.n decimeter.n decker.n deck.n declaration.n declension.s decline.n declivity.n decoder.n decoration.s decorator.n decoy.n decrease.s decree.n dedication.s deduction.s deed.n deer.s deerskin.s deerstalker.n defaulter.n defeatist.n defeat.s defection.s defect.n defector.n defence.s defendant.n defender.n defense.s deficiency.s deficit.n definition.s defoliant.n deformity.s defroster.n degenerate.n degradation.s degree.n deity.n delay.s delegate.n delegation.s deletion.s deliberation.s delicacy.s delicatessen.n delight.s delineation.s delinquent.n deliverance.s delivery.s dell.n delta.s deluge.n delusion.s demagogue.n demand.s demarche.n demeanour.s dementia.s demerit.n demigod.n demise.s democracy.s democrat.n Democrat.n demolition.s demo.n demoniac.n demon.n demonstration.n demonstrator.n demotion.s denial.s denizen.n den.n denomination.n denominator.n denouement.n density.s dentist.n dent.n denture.n denunciation.s deodorant.n department.n departure.n dependant.n dependency.s dependent.n depiction.s deportation.s deportee.n deposition.s depositor.n depository.n depot.n depravity.s depression.s depressive.n deprival.s deprivation.s depth.s deputy.n derailment.s derby.n derivation.s derivative.n dermatologist.n derrick.n dervish.n descant.n descendant.n descent.s description.n deserter.n desertion.s desert.s designation.s designer.n design.s desk.n despatch.s desperado.n despotism.s despot.n dessert.s dessertspoonful.n dessertspoon.n destination.n destiny.s destroyer.n detachment.s detail.s detainee.n detective.n detector.n detention.s detergent.s deterioration.s determinant.n determiner.n deterrent.s dethronement.n detonation.n detonator.n detour.n detractor.n deuce.n devaluation.s developer.n development.s deviant.n deviation.s device.n devil.n devotee.n devotion.s dholak.s dhow.n diabetic.n diacritic.n diagnosis.s diagonal.n diagram.n dialectician.n dialectic.n dialect.s dial.n dialogue.s diameter.n diamond.s diaper.n diaphragm.n diarist.n diary.n diatribe.n dice.s dichotomy.n dickey.n dickybird.n dictate.n dictation.s dictator.n dictatorship.s dictionary.n dictum.n didgeridoo.s die.s diesel.s dietician.n diet.n difference.n differential.n differentiation.s difficulty.s diffraction.n digestion.s digest.n digger.n digit.n dig.n dignitary.n digression.n dike.n dilemma.n dilettante.n dilution.s dime.n dimension.n diminuendo.n diminution.s diminutive.n dimple.n dinar.n diner.n dinghy.n dinner.s dinosaur.n dint.s diocesan.n diocese.n dioxide.s diphthong.n diploma.n diplomatist.n diplomat.n dipper.n dip.s dipstick.n diptych.n direction.s directive.n directorate.n director.n directorship.n directory.n dirge.n dirigible.n dirndl.n disability.s disadvantage.s disagreement.s disappearance.n disappointment.s disassembly.n disaster.s disbursement.s discard.n discharge.s disciple.n disciplinarian.n discipline.s disclaimer.n disc.n discomfort.s disco.n discontinuity.s discord.s discotheque.n discount.n discouragement.s discourse.s discourtesy.s discoverer.n discrepancy.s discus.n discussion.s disease.s disfigurement.s disguise.s dishcloth.n dishful.n dish.n dishwasher.n disillusionment.s disincentive.n disinclination.s disinfectant.s disk.n dislocation.s disloyalty.s dismemberment.n dismissal.s disorder.s disparagement.n disparity.n dispatch.s dispensary.n dispensation.s dispenser.n dispersal.s dispersion.n displacement.s display.s disposition.s disproof.s disputant.n disputation.s dispute.s disquisition.n disruption.s dissection.s dissembler.n dissension.s dissenter.n dissent.s dissertation.n disservice.n dissident.n dissimilarity.s dissolution.s dissonance.s distance.n distaste.s distension.n distillation.s distiller.n distillery.n distinction.s distortion.s distraction.s distribution.s distributor.n district.n disturbance.s ditch.n ditty.n divan.n dive.n divergence.s diver.n diversion.s divestiture.s dividend.n divination.s divine.n diviner.n divinity.s division.s divisor.n divorcee.n divorce.s divorces.n djembe.s Djiboutian.s docket.n dock.n dockyard.n doctorate.n doctor.n doctrinaire.n doctrine.s document.n dodderer.n dodge.n dodger.n dodo.n doe.n doer.n doge.n dogfish.s doggie.n doggy.n doghouse.n dogma.s dog.n dogsbody.n dogsled.n dogwood.n doily.n dollhouse.n doll.n dollop.n dolly.n dolmen.n dolphin.n dolt.n domain.n dome.n domicile.n Dominican.s dominion.s domino.n donation.s donkey.n don.n donor.n donut.s doodlebug.n doom.n doorbell.n doorcase.n doorframe.n doorhandle.n doorkeeper.n doorknob.n doorknocker.n doormat.n door.n doornail.n doorpost.n doorstep.n doorstopper.n doorway.n dopamine.s dope.s dormer.n dormitory.n dory.n dosage.s dose.n dossier.n dot.n double.n doublet.n doubloon.n douche.n doughnut.s doulophone.s dovecote.n dove.n dovetail.n dowager.n dowel.n dower.n downbeat.n downgrade.n downpour.n downturn.n dowry.n doyen.n doyly.n doze.n drachma.n draftee.n drafting.n draft.n drag.n dragnet.n dragonfly.n dragon.n dragoon.n drain.n drainpipe.n drake.n drama.s dramatist.n dramatization.s drape.n draper.n drapery.s draught.s drawback.n drawbridge.n drawer.n drawing-room.n drawing.s drawl.n draw.n dreadnought.n dreamer.n dreamland.n dream.n dreamworld.n dresser.n dressing.s dressmaker.n dress.n drier.n drifter.n drift.n drill.n drinker.n drink.s drip.n drive.n driver.n drive_through drive-through.n drivethrough.n drive_thru drive-thru.n drivethru.n driveway.n dromedary.n drone.s drop.n dropoff.n dropout.n drought.s drudge.n druggist.n drug.n drugstore.n druid.n drummer.n drum.s drumstick.n drunkard.n drunk.n dryer.n ducat.n duchess.n-f duchy.n ducking.n duckling.n duck.s ducky.n duct.n dude.n dud.n duelist.n duellist.n duel.n duet.n duffer.n dugout.n dukedom.n duke.n-m dulcian.s dulcimer.n dullard.n dulzaina.s dumbbell.n dumbwaiter.n dumdum.n dummy.n dumpling.n dump.n dunce.n dunderhead.n dune.n dungeon.n dunghill.n dupe.n duplicate.n duplication.s duplicator.n duration.s dustbin.n dustcart.n duster.n dustpan.n dutar.s duty.s duvet.n dwarf.n dweller.n dwelling.n dyer.n dye.s dyke.n dynamic.n dynamo.n dynasty.n dyspeptic.n eagle.n earache.n eardrop.n eardrum.n earful.n earldom.n earl.n earmark.n ear.n earphone.n earpiece.n earring.n earthquake.n earthworm.n easel.n eater.n eavesdropper.n ebb.n ebbtide.n eccentricity.s eccentric.n ecclesiastic.n echelon.n echo.n eclair.n eclipse.n ecologist.n economist.n economy.n ecosystem.n ecstasy.s Ecuadorian.s eddy.n edge.n edging.n edict.n edifice.n edition.n editorial.n editor.n education.s educator.n eel.n effect.s efficiency.s effigy.n effluent.s effrontery.s effusion.n egalitarian.n egghead.n eggplant.s egg.s eggshell.s egoist.n ego.n egotist.n egotrip.n egret.n Egyptian.s eiderdown.n ejaculation.s ejection.s elaboration.s elbow.n elder.n election.s electorate.n elector.n electrician.n electrocardiogram.n electrocardiograph.n electrocution.s electrode.n electrolyte.s electromagnet.n electron.n electrophoresis.s elegy.n element.n elephant.n elevation.s elevator.n elimination.s elision.s elite.n elitist.n elixir.s elk.n ellipse.n elm.s elocutionist.n elongation.s email.s emanation.s embankment.n embargo.n embarkation.s embarrassment.s embassy.n embellishment.s ember.n emblem.n embodiment.n embrace.n embryo.n emendation.s emerald.s emergence.n emergency.s emigrant.n emigre.n eminence.s emirate.n emir.n emissary.n emission.s emotion.s emperor.n-m emphasis.s empire.n empiricist.n employee.n employer.n emporium.n empress.n-f emulsion.s emu.n enactment.s encampment.n enchantment.s enchantress.n enchilada.n enchilada_ranchero enchilada_verde enclave.n enclosure.s encomium.n encounter.n encouragement.s encroachment.s encumbrance.n encyclical.n encyclopaedia.n encyclopædia.n encyclopedia.n endeavour.n endemic.n ending.n endive.s end.n endorsement.s endowment.s enema.n enemy.n enforcer.n engagement.s engineer.n engine.n engraver.n engraving.s enigma.n enlargement.s enlistment.s enormity.s enquirer.n enquiry.s ensemble.n ensign.n enslavement.s entanglement.s entente.n enterprise.s entertainer.n enthronement.n enthusiast.n enticement.s entitlement.s entity.n entomologist.n entracte.n entrance.s entrant.n entree.n entrepot.n entrepreneur.n entry.s envelope.n envelopment.n environmentalist.n environment.n envoi.n envoy.n enzyme.s eon.n epaulet.n epaulette.n epicentre.n epic.n epicurean.n epicure.s epidemic.s epidemiologist.n epiglottis.n epigram.n epileptic.n epilogue.n episcopalian.n episode.n epistle.n epitaph.n epithet.n epitome.n epoch.n epsilon.s equalizer.n equal.n equation.s equator.n equestrian.n equinox.n equity.s equivalence.s equivalent.n equivocation.s eradication.n era.n eraser.n erasure.s erection.s Eritrean.s errand.n error.s eruption.s escalation.s escalator.n escapade.n escapee.n escapement.n escape.s escapist.n escapologist.n escort.n escritoire.n escutcheon.n esophagus.n esplanade.n espresso.s essayist.n essay.n essence.s establishment.s estate.s esthete.n esthetic.n estimate.n Estonian.s estrangement.s estuary.n eta.s etching.n eternity.s Ethiopian.s ethnographer.n ethnologist.n ethyl.s etymologist.n etymology.s eucalyptus.n eulogist.n eulogy.n eunuch.n euphemism.n euphonium.s European.s evacuation.s evacuee.n evader.n evaluation.n evangelist.n evaporation.s eve.n evening.s event.n eventuality.n evergreen.n eviction.s evil.s evolution.s ewe.n exacerbation.s exaggeration.s examination.s examiner.n exam.n example.n excavation.s excavator.n exception.n excerpt.n excess.s exchange.s exchequer.n exclamation.s excommunication.s excrescence.n excretion.s excursion.n executant.n executioner.n execution.s executive.n executor.n exemplification.s exemption.n exercise.s exertion.s exhaust.s exhibitioner.n exhibitionist.n exhibition.s exhibit.n exhibitor.n exhortation.s exigency.n exile.s existence.s existentialist.n exit.n exodus.n exoneration.s expanse.n expansion.s expatriate.n expectancy.s expectorant.n expedient.n expedition.n expenditure.s expense.s experience.s experimenter.n experiment.n expert.n expletive.n exploit.n exploration.s explorer.n explosion.n explosive.n expo.n exponent.n exporter.n export.n expose.n exposition.s exposure.s expressionist.n expression.s express.s expressway.n expulsion.s extension.s extent.s exterior.n extinguisher.n extract.s extradition.s extra.n extravagance.s extravaganza.n extreme.n extremist.n extremity.n extrovert.n eyeball.n eyebrow.n eyeful.n eyeglass.n eyelash.n eyelet.n eyelid.n eye.n eyepiece.n eyesore.n eyewitness.n fable.s fabrication.s fabric.s facade.n face.n facet.n facial.n facilitator.n facility.s facsimile.n faction.s factor.n factory.n factotum.n faculty.n fad.n faerie.n faggot.n faglong.s fag.n failing.n fairground.n fair.n fairway.n fairyland.n fairy.n fairytale.n faith.s fajita.n fake.n fakir.n falcon.n fall.s falsehood.s falsetto.s falsification.s falsity.s familiarity.s family.n famine.s fanaticism.s fanatic.n fancier.n fancy.s fandango.n fanfare.s fang.n fanlight.n fan.n fanny.n fantasia.n fantasy.s farce.s fare.s farewell.n farmer.n farmhand.n farmhouse.n farm.n farmstead.n farmyard.n farthing.n fart.n fascination.s fascist.n fashion.s fastener.n fast.n fatalist.n fatality.n fate.s fathead.n fatherland.n father.n-m fathom.n faucet.n fault.n fauna.s faun.n favor.s favourite.n favour.s fawn.n fax.n feast.n featherbed.n feather.n featherweight.n feat.n feature.n federalist.n federation.n feeder.n feed.s feeler.n fee.n fegereng.s feint.n felicity.s fellow.n fellowship.s felon.n felony.n female.n feminist.n femtoliter.n femtolitre.n femtometer.n femtometre.n femtosecond.n femtowatt.n femur.n fence.n fencer.n fender.n fen.n ferment.n fern.n ferret.n ferryboat.s ferry.n fertilizer.s festival.n festivity.s fete.n fetish.n fetus.n feud.n fever.s fez.n fiancee.n fiance.n fianchetto.s fiasco.n fiat.s fibber.n fiber.s fib.n fibre.s fiction.s fiddler.n fiddle.s fiddlestick.n fief.n fielder.n field.n fiend.n fiesta.n fife.s fighter.n fight.n figment.n fig.n figurehead.n figure.n Fijian.s filament.n filbert.s file.n filibuster.n filing.n Filipino.s fillet.n filling.n filly.n film.s filter.n finale.n finalist.n final.n financier.n finch.n finder.n find.n fine.n finesse.s fingerboard.n fingermark.n finger.n fingernail.n finger-post.n fingerprint.n fingertip.n finish.n fin.n Finn.n fiord.n firearm.n fireball.n firebird.n firebomb.n firebox.n firebrand.n firebrick.s firebug.n firecracker.n firefly.n firelight.n fireman.n fireplace.n fire.s fireside.n firework.n firmament.n firm.n fir.s firstborn.n fishbone.n fishcake.n fisherman.n fisher.n fishery.n fishmonger.n fish.s fissure.n fist.n fistula.n fit.n fitter.n fitting.n fiver.n fixation.s fixative.n fixer.n fix.n fixture.n fjord.n flageolet.s flag.n flagpole.n flagship.n flagstaff.n flair.s flake.n flame.s flamethrower.n flamingo.n flange.n flank.n flan.n flannel.s flapjack.n flap.n flapper.n flare.s flashback.n flashbulb.n flashlight.n flash.n flashpoint.n flask.n flatbed.n flatfish.s flat.n flatterer.n flattery.s flauta.n flautist.n flavor.s flavouring.s flavour.s flaw.n flea.n fleck.n fledgeling.n fledgling.n fleet.n flex.s flicker.n flick.n flier.n flight.s fling.n flint.s flip.n flipper.n flirtation.s flirt.n floatation.s float.s flock.n floodgate.n flood.n floorboard.n floor.n floozie.n floozy.n flop.n florin.n florist.n flotation.s flotilla.n flounder.s flourish.n flowerbed.n flower.n flowerpot.n flow.s fluctuation.s flue.n flugelhorn.s fluidity.s fluid.s fluke.n flunkey.n flunky.n fluorescence.s fluoride.s flurry.n flu.s flush.s flute.s flutist.n flutter.s flux.s flycatcher.n flyer.n fly.n flyover.n flytrap.n flyweight.n flywheel.n foal.n foam.s focus.s foe.n fogey.n foghorn.n fog.s foible.n foil.s folder.n fold.n folgerphone.s folio.n folk.n folksong.n folktale.n follower.n following.n folly.s font.n food.s foodstuff.n fool.n footballer.n football.s footboard.n footbridge.n footer.n footfall.n footfault.n foothold.n footmark.n foot.n footnote.n footpath.n footprint.n footstep.n footstool.n foray.n force.s ford.n forearm.n foreboding.s forecaster.n forecastle.n forecast.n foreclosure.s forecourt.n forefather.n-m forefinger.n forefront.n foreground.n forehead.n foreigner.n foreleg.n forelock.n foreman.n foremast.n forename.n forerunner.n foreskin.n forester.n forest.s foretaste.n foreword.n forfeit.n forge.n forger.n forgery.s fork.n formalism.s formality.s formation.s format.s form.s formula.n formulation.s forte.n fortepiano.s fortification.s fort.n fortnight.n fortress.n fortune.s forum.n forward.n fossilization.s fossil.n foul.s foundation.n founder.n foundling.n foundry.n fountain.n fount.n foursome.n fowler.n fowl.s foxglove.n foxhole.n foxhound.n foxhunt.n fox.n foxtrot.n foyer.n fraction.n fracture.n fragmentation.s fragment.n fragrance.s frame.n framework.n franchise.n frankfurter.n fraternity.s fratricide.s fraud.s fray.n frazzle.n freak.n freckle.n freebooter.n freedom.s freeholder.n freehold.n freeway.n freeze.n freezer.n freighter.n frequency.s fresco.s freshman.n fret.n friar.n fricassee.n fricative.n fridge.n friend.n friendship.s frier.n frieze.n frigate.n fright.s frill.n fringe.n frisson.n fritter.n frivolity.s frock.n frog.n frolic.n frontage.n frontier.n frontispiece.n front.n frost.s frown.n fruitcake.s fruit.s fryer.n fuchsia.n fucker.n fuel.s fugitive.n fuglung.s fugue.n fuhrer.n fulcrum.n fullback.n full-bodied.a fullbodied.a fuller.n fumble.n fume.n functionalist.n functionality.s functionary.n function.n fundamentalist.n fundamental.n fund.n funeral.n fungicide.s fungus.s funk.n funnel.n furlong.n furlough.s furnace.n furor.n furrier.n furrow.n fur.s fury.s fuselage.n fuse.n fusilier.n fusillade.n fusion.s fusspot.n fuss.s futility.s future.n futurist.n gable.n Gabonian.s gadfly.n gadget.n gaffe.n gaffer.n gaff.n gage.n gaggle.n gag.n gain.n gait.n gala.n galaxy.n gale.n gallant.n gallantry.s galleon.n gallery.n galley.n gallicism.n gallon.n gallop.n gall.s gallstone.n gal.n galosh.n Gambian.s gambit.n gamble.n gambler.n gambol.n gamekeeper.n game.s gamma.s gammon.s gamut.n gander.n ganglion.n gang.n gangplank.n gangster.n gantry.n gaolbird.n gaolbreak.n gaoler.n gaol.s gap.n garage.n gardener.n gardenia.n garden.n gargle.n gargoyle.n garland.n garment.n garnet.s garnish.n garotte.n garret.n garrison.n garrotte.n garter.n gasbag.n gash.n gasket.n gaslight.s gasmask.n gasometer.n gasp.n gas.s gasworks.s gateau.n gatecrasher.n gatehouse.n gate.n gatepost.n gateway.n gatherer.n gathering.n gaudiness.s gaudy.n gauge.n gauntlet.n gavel.n gavotte.n gay.n gazelle.n gaze.n gazetteer.n gazette.n gearbox.n gear.s gearshift.n gecko.n geezer.n geisha.n gelding.n gel.s gem.n gemshorn.s gendarme.n gendarmerie.n gender.s genealogist.n genealogy.s gene.n generalissimo.n generality.s generalization.s general.n General.n generation.s generator.n geneticist.n genie.n genius.s genre.n gentile.n gentleman.n-m gent.n-m gentry.s genus.s geographer.n geologist.n Georgian.s geranium.n geriatrician.n German.s germicide.n germ.n gerund.n gesticulation.n gesture.n getaway.n geyser.n Ghanaian.s gherkin.n ghetto.n ghost.n ghoul.n giantess.n giant.n gibbet.n gibbon.n gibe.n gift.n gigabyte.n gigawatt.n giggle.n gig.n gigolo.n gilder.n gill.n gimmick.n gin.s gipsy.n giraffe.n girder.n girdle.n girlfriend.n girl.n girly.n gist.n giveaway.n gizzard.n glacier.s glade.n gladiator.n glance.n gland.n glare.s glasschord.s glassful.n glasshouse.n glass.s glassworks.s glaze.s gleam.n glee.s glen.n glide.n glider.n glimmer.n glimpse.n glint.n glissade.n glitch.n globe.n globetrotter.n globule.n glockenspiel.s gloom.s glory.s glossary.n gloss.n glottis.n glove.n glow.n glue.s glut.n glutton.n gnat.n gnome.n gnu.n goalie.n goalkeeper.n goal.n goatee.n goatherd.n goat.s goatskin.s goblet.n goblin.n gob.n goddaughter.n-f goddess.n-f godfather.n-m godmother.n-f god.n godparent.n godsend.n godson.n-m goitre.n goldenrod.s goldfinch.n goldfish.s goldmine.n goldsmith.n golfer.n golliwog.n gondola.n gondolier.n goner.n gong.s goodbye.n goodnight.n goody.n goof.n goolash.s goon.n gooseberry.n gopher.n gorge.n gorilla.n gosling.n gospel.s gossip.s goulash.s gourd.n gourmand.n gourmet.n governess.n government.s governor.n Governor.n gown.n grab.n gradation.n grade.n gradient.n graduate.n graduation.s graft.s grail.n grain.s grammarian.n grammar.s gram.n gramophone.n granary.n grandchild.n granddad.n-m granddaughter.n-f grandfather.n-m grandma.n-f grandmother.n-f grandpa.n-m grandparent.n grandson.n grandstand.n grange.n granny.n-f grant.n granule.n grapefruit.s grape.n grapevine.n graph.n grasp.n grasshopper.n grate.n grater.n gratification.s gratuity.n grave.n gravestone.n graveyard.n greatcoat.s Greek.s greenback.n greengage.n greengrocer.n greengrocery.n greenhorn.n greenhouse.n greenwood.n greeting.n gremlin.n Grenadan.s grenade.n grenadier.n greybeard.n greyhound.n griddle.n gridiron.n grid.n grievance.n griffin.n grille.n grill.n grimace.n grinder.n grind.n grindstone.n grin.n grip.n grizzly.n groan.n grocer.n grocery.n groin.n groom.n groove.n grotesque.n grotto.n grouch.n grounding.n groundwater.s groupie.n grouse.s grove.n grower.n growl.n growth.s grub.s grudge.n grumble.n grumbler.n grunt.n guarantee.n guarantor.n guaranty.n guardian.n guardianship.n guard.n guardrail.n guardroom.n Guatemalan.s guerilla.n guerrilla.n guess.n guesthouse.n guest.n guestroom.n guffaw.n guidebook.n guideline.n guide.n guilder.n guildhall.n guild.n guillotine.n guinea.n Guinean.s guise.n guitarist.n guitarrón.s guitar.s guitjo.s gulch.n gulf.n gullet.n gull.n gully.n gulp.n gum.s gumshoe.s gunboat.s gunman.n gun.n gunner.n gunrunner.n gunshot.n gunsmith.n guru.n gusher.n gust.n gut.n gutter.n guttersnipe.n guttural.n guvnor.n guy.n guzzler.n gym.n gymnasium.n gymnast.n gynaecologist.n gynecologist.n gyp.n gyration.s gyro.n gyroscope.n haberdasher.n habitation.s habitat.s habit.s hack.n hacksaw.n haddock.s haemophiliac.n haemorrhage.s haggis.n hag.n hail.s hailstone.n hairbrush.n haircut.n hairdo.n hairdresser.n hairline.n hairnet.n hairpiece.n hairpin.n hair.s hairstyle.n hairstylist.n Haitian.s halberdier.n halberd.n halfback.n half-breed.n half-hour.n halfwit.n halibut.s halliard.n hallmark.n hall.n hallucination.s hallway.n halo.n halter.n halt.n halyard.n hamburger.s hamlet.n hammer.n hammock.n hamper.n ham.s hamster.n hamstring.n handbag.n handbells.s handbill.n handbook.n handbrake.n handcart.n handclap.n handcuff.n handicap.n handicraft.s handkerchief.n handlebar.n handle.n handler.n handmaid.n-f hand.n handout.n handrail.n handsaw.n handshake.n handstand.n hangar.n hanger.n hanging.s hangnail.n hangover.n hankering.n hanky.n hansom.n happening.n harbinger.n harbor.n harbour.n hardback.n hardcover.n hardliner.n hardship.s harelip.n harem.n hare.n harlequin.n harlot.s harmonica.s harmonic.n harmonico.s harmonium.s harmonization.s harmony.s harness.n harper.n harpist.n harpoon.n harp.s harpsichordist.n harpsichord.s harrow.n hart.n harvester.n harvest.n hassle.n hatband.n hatchet.n hatch.n hatchway.n hatful.n hat.n hatpin.n hatred.s hatter.n haul.n haunch.n haunt.n haven.s haversack.n hawker.n hawk.n hayfork.n haymaker.n haystack.n hazard.s hazel.s haze.s headache.s headband.n headdress.n header.n heading.n headlamp.n headlight.n headline.n headmaster.n headmistress.n head.n headquarters.s headrest.n headset.n headwind.n healer.n heap.n hearer.n hearing.n hearse.n heartache.s heartbeat.n hearth.n hearthrug.n heart.s heater.n heathen.n heather.s heath.s heatwave.n heave.n heaven.s heavyweight.n heckelphone.s heckler.n hectare.n hedgehog.n hedge.n hedgerow.n hedonist.n heel.n heifer.n-f height.s heiress.n-f heirloom.n heir.n-m heist.n helicopter.n heliograph.n heliotrope.n heliport.n hellcat.n hello.n hell.s helmet.n helm.n helper.n helping.n helpmate.n hemisphere.n hemline.n hem.n hemophiliac.n hemorrhage.s hencoop.n henhouse.n hen.n heptagon.n herald.n herbalist.n herbicide.s herb.s herd.n heresy.s heretic.n heritage.n hermaphrodite.n hermitage.n hermit.n hernia.n heroine.n heron.n hero.s herring.s hertz.s hesitation.s heterosexual.n hexabyte.n hexagon.n hexameter.n heyday.n hiatus.n hiccough.n hiccup.n hick.n hickory.s hideaway.n hide.s hiding.n hierarchy.n hieroglyph.n highball.n highflier.n highflyer.n highland.n highlight.n high.n highness.s highroad.n highway.n hijacker.n hijack.n hike.n hiker.n hillbilly.n hill.n hillock.n hillside.n hilt.n hind.n hindrance.n Hindu.n hinge.n hinterland.n hint.n hip.n hippie.n hippodrome.n hippo.n hippopotamus.n hiss.n histogram.n historian.n history.s hitchhiker.n hitch.n hit.n hitter.n hive.n hoarder.n hoard.n hoax.n hobbyhorse.n hobby.n hobgoblin.n hobnail.n hobo.n hocchiku.s hodgepodge.n hoe.n hog.n holder.n holding.n hold.s holdup.n hole.n holiday.n hollow.n hollyhock.n holocaust.n holograph.n holster.n homecoming.n homeland.n homeopath.n homeowner.n home.s homestead.n hometown.n homicide.s homily.s homo.n homonym.n homophone.n homosexual.n Honduran.s hone.n honeybee.n honeycomb.s honeymoon.n honey.s honk.n honorarium.n honorific.n honor.s honour.s hoodlum.n hood.n hoof.n hooker.n hook.n hooligan.n hoop.s hooter.n hoot.n hopeful.n hop.n hopper.n horde.n horizon.n hormone.n hornet.n horn.n hornpipe.n horoscope.n horror.s horsefly.n horse.n-m horserace.n horseradish.s horseshoe.n horsewhip.n horticulturist.n hosepipe.n hose.s hosier.n hospice.n hospitalization.s hospital.n hostage.n hostel.n hostelry.n hostess.n-f hostility.s host.n hostress.n-f hotbed.n hotdog.s hotelier.n hotel.n hothead.n hothouse.n hotplate.n hound.n hourglass.n houseboat.s housebreaker.n housedog.n housefly.n houseful.n householder.n household.n housekeeper.n housemaid.n-f housemaster.n house.n housetop.n houseware.s housewife.n-f hovel.n hovercraft.s howitzer.n howler.n howl.n hubbub.s hubby.n hub.n huckleberry.s huckster.n huddle.n hue.n huff.n hug.n hula.n hulk.n hullabaloo.n hull.n humanist.n humanitarian.n human.n humdinger.n humiliation.s hummingbird.n hummock.n hum.n humorist.n humourist.n humour.s humpback.n hump.n hunchback.n Hungarian.s hunk.n hunter.n hunt.n huntress.n-f hurdle.n hurdy_gurdy hurl.n hurricane.n hurry.s husband.n hush.n husk.n husky.n hussar.n hussy.n hustler.n hut.n hyacinth.n hyaena.n hybrid.n hydra.n hydrant.n hydraulophone.s hydrocarbon.n hydrofoil.n hydrolysis.s hydroplane.n hyena.n hymen.n hymnal.n hymn.n hyperbola.n hyperbole.s hypermarket.n hyphen.n hypnotist.n hypochondriac.n hypocrite.n hypodermic.n hypotenuse.n iamb.n ibis.n iceberg.s icebox.n icebreaker.n icecap.n icecube.n icehouse.n icepack.n icepick.n icerink.n icicle.n icon.n iconoclast.n idealist.n idealization.s ideal.n identity.s ideologue.n ideology.s idiolect.n idiom.s idiosyncrasy.n idiot.n idol.n idyll.n igloo.n ignoramus.n iguana.n illegality.s ill.s illumination.s illusion.s illustration.s illustrator.n image.n imagination.s imam.n imbalance.s imbecile.n imbroglio.n imitation.s imitator.n immensity.s immersion.s immigrant.n immolation.s immortal.n impact.s impalement.n impasse.n impeachment.s impediment.n imperfection.n imperialist.n impersonation.s impersonator.n impertinence.s implementation.s implement.n implosion.n imp.n imponderable.n importation.s importer.n import.n imposition.s impossibility.s impostor.n impresario.n impressionist.n imprimatur.n imprint.n improbability.s impromptu.n impropriety.s improvement.s improvisation.s impulse.s impurity.s imputation.s inaccuracy.s inadequacy.s inanity.s inaugural.n inauguration.s incantation.s incarnation.n inception.n inch.n incidence.n incident.n incinerator.n incision.n incisor.n incitement.s incivility.s inclination.s incline.n income.s incongruity.s inconsistency.s inconvenience.s increase.n increment.n incubation.n incubator.n incumbency.n incumbent.n incurable.n incursion.s indemnity.s indentation.n indenture.n independent.n index.n Indian.s indicator.n indictment.s indignity.n indiscretion.s individualist.n individuality.s individual.n Indonesian.s inducement.s induction.s indulgence.s industrialist.n industry.s inefficiency.s inequality.s inequity.s infancy.s infant.n infantry.s infatuation.s infection.s inference.s inferior.n inferno.n infestation.s infidel.n infinitive.n infinitude.n infirmary.n infirmity.s inflammation.s inflection.s infliction.s inflow.s influence.s influx.n informality.s informant.n informer.n infraction.n infringement.s infusion.s ingenue.n ingot.n ingredient.n inhabitant.n inheritance.s inheritor.n inhibition.s inhibitor.n iniquity.s initial.n initiate.n initiative.s injection.s injunction.n injury.n injustice.s ink.s inkstand.n inkwell.n inlay.s inlet.n inmate.n inning.n innkeeper.n inn.n innovation.s innovator.n innuendo.s inoculation.s input.s inquest.n inquirer.n inquiry.s inquisition.s inquisitor.n inroad.n inscription.n insect.n insertion.s insert.n inset.n inside.n insider.n insight.s insinuation.s insole.n insolvency.s insomniac.n inspection.s inspector.n inspiration.s installation.s installment.n instalment.n instance.n instep.n instigator.n instinct.s institute.n institution.n instruction.s instructor.n instrumentalist.n instrument.n insubordination.s insulator.n insult.s insurance.s insurer.n insurgent.n insurrection.s intake.s integer.n integument.n intellect.s intellectual.n intelligentsia.n intensification.s intensity.n intention.s interaction.s interception.s interceptor.n intercession.s interchange.s intercom.n interconnection.s interdependence.n interest.s interface.n interior.n interjection.n interlocutor.n interloper.n interlude.n intermarriage.s intermediary.n intermediate.n interment.s intermezzo.n intermission.n intermixture.n internationale.n internationalist.n interne.n intern.n interpolation.s interposition.s interpretation.s interpreter.n interregnum.n interrelation.s interrelationship.s interrogative.n interrogator.n interrupter.n interruption.s intersection.s interstice.n interval.n intervention.s interviewer.n interview.n intestine.n intimacy.s intimate.n intimation.s intoxicant.n intricacy.s intrigue.s introduction.s introvert.n intruder.n intrusion.s intuition.s invader.n invalidation.s invalid.n invasion.n invention.s inventor.n inventory.s inversion.s invertebrate.n investigation.s investigator.n investment.s investor.n invitation.n invocation.s invoice.n involution.n involvement.s ion.n ionosphere.n iota.s Iranian.s Iraqi.s iris.n ironmonger.n iron.s ironwork.n ironworks.s irony.s irregularity.s irrelevance.s irrelevancy.s irritant.n irruption.n islander.n island.n isle.n isolationist.n isotope.n Israeli.s issuer.n isthmus.n Italian.s itch.n item.n iteration.n itinerary.n Ivorian.s jabberer.n jab.n jackal.n jackass.n jackboot.n jackdaw.n jacket.n jack.n jackpot.n jade.s jaguar.n jailer.n jailor.n jail.s jalopy.n Jamaican.s jamb.n jamboree.n jamjar.n jampot.n jam.s janitor.n jarful.n jar.n jaunt.n javelin.n jawbone.n jawbreaker.n jaw.n jay.n jaywalker.n jeep.n jeer.n jellyfish.s jelly.s jenny.n jeremiad.n jerk.n jerry.n jersey.n jester.n jest.n jet.n jetty.n jeweller.n jewel.n Jew.n jibe.n jib.n jiffy.n jigger.n jig.n jigsaw.n jihad.n jimmy.n jingle.n jinx.n jitterbug.n jobber.n job.n jockey.n jogger.n jog.n joiner.n join.n joint.n joist.n joke.n joker.n jollity.s jolt.n Jordanian.s joule.n journalist.n journal.n journey.n joviality.s jowl.n joy.s jubilee.n judgement.s judge.n judgment.s judiciary.s jugful.n juggernaut.n juggler.n jug.s jukebox.n julep.n jumble.s jumper.n jump.n junction.n juncture.n jungle.n junior.n juniper.n junket.n junkie.n junta.n jurist.n juror.n jury.n Justice.n justice.s justification.s juvenile.n kaleidoscope.n kalimba.s kangaroo.n kappa.s karat.n katzenklavier.s kayak.n Kazakhi.s kazoo.s kebab.n keel.n keeper.n keepsake.n keg.n kelly.n kennel.n Kenyan.s kerb.n kerbstone.n kerchief.n kernel.n kettledrum.n kettle.n keyboard.n keyhole.n key.n keynote.n keyring.n keystone.n keytar.s keyword.n khalam.s khan.n kickback.n kick.n kickoff.n kiddie.n kid.n kidnapper.n kidnapping.s kidney.n killer.n killing.s killjoy.n kiln.n kilobyte.n kilogram.n kilolitre.n kilometer.n kilometre.n kilo.n kilowatt.n kilt.n kimono.n kindergarten.n kind.n kingdom.n kingfisher.n king.n kingpin.n kink.n kiosk.n kipper.n kirk.n kisanji.s kisser.n kiss.n kitchenette.n kitchen.n kite.n kit.s kitten.n kitty.n kiwi.n kleenex.s kleptomaniac.n knack.n knapsack.n knapweed.n knave.n kneecap.n knee.n knife.n knighthood.s knight.n knob.n knocker.n knock.n knockout.n knoll.n knot.n knotweed.n knuckle.n koala.n kola.n kopeck.n kora.s Korean.s koto.s kouxian.s Kuwaiti.s label.n lab.n laboratory.n labourer.n labour.s laburnum.n labyrinth.n laceration.n lace.s lackey.n lack.s lacquer.s lacuna.n ladder.n laddie.n-m ladle.n lad.n ladybird.n lady.n-f lager.s laggard.n lag.n lagoon.n laird.n lair.n laity.n lake.n lambda.s lamb.s lambskin.s lamellaphone.s lamentation.s lament.n lamplighter.n lamp.n lampoon.n lamppost.n lamprey.n lampshade.n lance.n lancer.n lancet.n landau.n landfall.n landholder.n landing.n landlady.n landlord.n landlubber.n landmark.n landmine.n landowner.n land.s landscape.s landslide.n lane.n language.s lantern.n Laotian.s lapel.n lap.s lapse.n larceny.s larch.s larder.n largo.n lark.n larkspur.n larva.n larynx.n laser.n lashing.n lash.n lass.n lasso.n latchkey.n latch.n latency.s lathe.n lath.n latrine.n lattice.n Latvian.s laugh.n launcher.n launch.n launderette.n laundry.n laureate.n laurel.n lavatory.n lav.n lawbreaker.n lawgiver.n lawmaker.n lawn.n law.s lawsuit.n lawyer.n laxative.n layabout.n layby.n layer.n lay.n layoff.n layover.n leader.n lead.n leaflet.n leaf.n league.n leak.n lean-to.n leap.n learner.n leaseholder.n leasehold.n lease.n leash.n leatherneck.n leave-taking.n lecher.n lectern.n lecture.n lecturer.n lectureship.n ledge.n ledger.n leech.n leek.n leer.n leftist.n left.n legacy.n legend.s legionary.n legion.n legislator.n legislature.n leg.n lemming.n lemon.s lemur.n lender.n length.s lens.n lentil.n leopard.n leper.n leprechaun.n lesbian.n lesion.n lessee.n lesson.n lessor.n letterhead.n letter.n lettuce.s leukemia.s levee.n leveller.n level.n lever.n levitation.s levy.n lexicographer.n lexicon.n liability.s liaison.s liar.n libation.n libel.s liberality.s liberal.n liberation.s liberator.n Liberian.s libertarian.n libertine.n liberty.s libido.s librarian.n library.n librettist.n libretto.n Libyan.s licence.s licensee.n license.n lichee.n lichgate.n lick.n lid.n lie.n lien.n lieutenant.n lifebelt.n lifeboat.s lifebuoy.n lifeguard.n lifeline.n lifer.n life.s lifestyle.s lifetime.n liftoff.n ligament.n ligature.n lighter.n lighthouse.n light.s lightship.n lightweight.n likeness.s liking.n lilac.n lilt.n lily.n limb.n limbo.s limerick.n lime.s limey.n limitation.s limit.n limousine.n limp.n linchpin.n linden.n lineage.s line.n liner.n lineup.n lingerer.n lingo.n linguist.n lining.n linkage.s link.n linkup.n linotype.n lioness.n-f lion.n-m lip.n lipstick.s liqueur.n liquidation.s liquidator.n liquidizer.s liquid.n lira.n lirone.s lisp.n listener.n listing.n list.n litany.n literal.n lithograph.n Lithuanian.s litigant.n litigator.n litre.n litterbin.n litter.s liturgy.s livelihood.s liver.s livery.n living.n lizard.n llama.n load.n loafer.n loaf.n loan.s lobbyist.n lobby.n lobe.n lobsterman.n lobster.s locale.n locality.s localization.s local.n location.n loch.n locker.n locket.n lock.n lockout.n locksmith.n lockup.n locomotive.n locust.n locution.n lodestar.n lodge.n lodger.n loft.n loganberry.n logarithm.n logbook.n logician.n logjam.n log.n logo.n loincloth.n loin.n loiterer.n lollipop.n lolly.n longboat.s longbow.n longing.s look.n lookout.n loom.n loo.n loon.n loonybin.n loony.n loophole.n looter.n lord.n lordship.s lorgnette.n lorry.n loser.n loss.s lotion.s lot.n lottery.n lotus.n loudspeaker.n lounge.n lout.n louvre.n lovebird.n lover.n love.s lowbrow.n lowlander.n low.n loyalist.n loyalty.s lozenge.n lubricant.s lug.n lullaby.n lull.n lumberjack.n lumberyard.n luminary.n lump.n lunatic.n luncheon.s lunch.s lunge.n lung.n lupin.n lurch.n lure.n lush.n lutenist.n lute.s Luxembourian.s luxury.s lycee.n lyceum.n lychgate.n lymphocyte.n lynchpin.n lynx.n lyra.s lyre.s lyricist.n lyric.n macaroon.n macaw.n Macedonian.s machete.n machination.s machine.n machinist.n mackerel.s mackintosh.n mac.n macrocosm.n Madagascan.s madam.n madhouse.n madrigal.n maelstrom.n maestro.n magazine.s maggot.n magician.n magistrate.n magnate.n magnet.n magnification.s magnifier.n magnolia.n magnum.n magpie.n mahogany.s maidenhood.n maiden.n-f maid.n-f maidservant.n-f mailbag.n mailboat.s mailbox.n mailman.n mainland.n mainmast.n main.n mainspring.n mainstay.n mainstream.n maisonnette.n major.n maker.n makeshift.n make-up.s malachite.s malady.n malaise.n malapropism.n Malawian.s Malaysian.s malcontent.n malediction.n malefactor.n male.n malformation.s malfunction.s Malian.s malignancy.s malingerer.n mallard.n mallet.n mall.n mama.n mamba.n mammal.n mamma.n mammoth.n manacle.n management.s manager.n mandarin.s mando-bass.s mandocello.s mandola.s mandolin.s mandrake.n mane.n maneuver.n manger.n mango.s mangrove.n manhole.n maniac.n mania.s manicure.s manicurist.n manifestation.n manifest.n manifesto.n manifold.n manikin.n manipulation.s man.n mannequin.n mannerism.n manner.n manoeuvre.n manoeuvrer.n manor.n mansard.n manservant.n mansion.n mantel.n mantelpiece.n mantis.n mantle.n manual.n manufacturer.n manuscript.n maple.s map.n maracas.s maraschino.s marathon.n marauder.n marble.s marcher.n march.n mare.n-f margin.s marigold.n marimbaphone.s marimba.s marina.n marine.n mariner.n marionette.n markdown.n marker.n market.n marketplace.n marking.n mark.n maroon.n marquee.n marquess.n marquis.n marriage.s marrowbone.n marshal.n marshmallow.s marsh.s marsupial.n martinet.n martini.n martin.n mart.n martyr.n marvel.n Marxist.n marzipan.s mascot.n mash.s mask.n masochist.n mason.n masque.n masquerade.n massacre.n massage.n masseur.n masseuse.n mass.n mastermind.n master.n masterpiece.n masterstroke.n mastery.s masthead.n mastiff.n mastodon.n mast.s matador.n matchbox.n matchmaker.n match.n mate.n materialist.n material.s mathematician.n matinee.n mat.n matriarch.n matriarchy.n matricide.s matrix.n matron.n matter.s mattress.n Mauritanian.s Mauritian.s mausoleum.n maverick.n mavis.n maw.n maxim.n maximum.n mayday.n mayfly.n mayoralty.n mayoress.n-f mayor.n Mayor.n maypole.n maze.n mazurka.n mbira.s meadow.s mead.s meal.n mealtime.s meanie.n meaning.s mean.n means.s measurement.s measure.n meatball.n mechanic.n mechanism.n mechanization.s medalist.n medallion.n medallist.n medal.n meddler.n median.n media.s mediator.n medication.s medicine.s medic.n mediocrity.s meditation.s medium.n medley.n meeting.n meet.n megabyte.n megagram.n megaliter.n megalomaniac.n megameter.n megaphone.n megaton.n megawatt.n melange.n melee.n mellophone.s mellotron.s melodeon.s melodica.s melodrama.s melody.s melon.n meltdown.n member.n membrane.s memento.n memoir.n memo.n memorandum.n memorialist.n memorial.n memory.s menace.s menage.n menagerie.n mendicant.n mend.n menial.n menopause.n mentality.s mention.s mentor.n menu.n mercenary.n merchant.n merger.s meridian.n meringue.s meritocracy.n merit.s mermaid.n-f merry-go-round.n merrymaker.n mesh.s messenger.n mess.s metallophone.s metallurgist.n metal.s metalware.s metalworker.n metalwork.n metaphor.s metatarsal.n meteorite.n meteor.n meteorologist.n meter.s methodology.s method.s methyl.s metier.n metre.n metronome.n metropolis.n mew.n mews.s Mexican.s mezzanine.n mezzo-soprano.s miaou.n miaow.n miasma.n microbe.n microcosm.n microfiche.s microfilm.s microgram.n microliter.n micrometer.n Micronesian.s micron.n microphone.n microscope.n microwatt.n microwave.n middle.n middleweight.n middy.n midge.n midget.n midland.n midriff.n midst.n mien.n migraine.n migrant.n migration.s mikado.n mike.n mileage.n mileometer.n milestone.n milieu.n militant.n militarist.n military.n militia.n milkmaid.n-f milkman.n milkshake.n milksop.n millenarian.n millenium.n millennium.s millepede.n miller.n milligram.n milliliter.n millimeter.n millimetre.n milliner.n millionaire.n millionairess.n millipede.n milliwatt.n mill.n millpond.n millstone.n millwheel.n milometer.n milord.n mimeograph.n mime.s mimic.n mimosa.s minaret.n mincer.n mind.s minefield.n minelayer.n mine.n mineral.n mineralogist.n miner.n minesweeper.n mineworker.n miniature.s miniaturist.n minim.n minimum.n minion.n minister.n Minister.n ministry.n minivan.n mink.s minnow.n minor.n minster.n minstrel.n mint.s minuet.n minus.n minx.n miracle.n mirage.n mirror.n misanthrope.n misapplication.n miscalculation.s miscarriage.s miscellany.n misconception.s miscount.n miscreant.n misdeal.n misdeed.n misdemeanour.n misdoing.n miser.n misfire.n misfit.n misfortune.s misgiving.n mishap.s mishmash.n misinterpretation.s misnomer.n misogynist.n misprint.n mispronunciation.n misquotation.s misreading.n misrepresentation.s missile.n missionary.n missive.n miss.n misspelling.n misstatement.n missy.n mistake.n mistranslation.s mistress.n mistrial.n mist.s misunderstanding.n misuse.s mite.n mitre.n mitten.n mixer.n mix.n mixture.s moan.n moat.s mobile.n mobilization.s mob.n mobster.n moccasin.n mockery.s mock.n modality.n modeler.n modeller.n model.n modem.n mode.n moderate.n moderator.n modernist.n modification.s modifier.n mod.n modulation.s module.n mogul.n molar.n mold.n Moldovan.s molecule.n molehill.n mole.s mollusc.n monarchist.n monarch.n monarchy.s monastery.n moneybox.n moneychanger.n moneylender.n monger.n Mongolian.s mongol.n mongoose.n mongrel.n monitor.n monkey.n monk.n-m monochrome.n monocle.n monogamist.n monogram.n monograph.n monolith.n monologue.n monopoly.n monorail.n monosyllable.n monotone.n monsoon.n monster.n monstrosity.s montage.n monthly.n monument.n mood.n moo.n moonbeam.n moon.n moor.n moose.s moped.n mop.n moralist.n moral.n morass.n moratorium.n morgue.n morning.s morn.n Moroccan.s moron.n morpheme.n morrow.n morsel.n morsing.s mortal.n mortarboard.n mortar.s mortgage.n mortician.n mortuary.n mosaic.n mosque.n mosquito.n motel.n mothball.n motherland.n mother.n-f moth.n motif.n motion.s motivation.s motive.n motorbike.n motorboat.s motorcade.n motorcar.n motorcoach.n motorcycle.n motorcyclist.n motorist.n motor.n motorway.n motto.n moulding.n mould.n mound.n mountaineer.n mountain.n mount.n mourner.n mouse.n mousetrap.n mousse.s moustache.n mouthful.n mouth.n mouthpiece.n movement.n movement.s mover.n movie.n mower.n Mozambican.s muckraker.n muddle.n mudguard.n mudslinger.n muffin.n muffler.n muff.n mugger.n mugging.n mug.n mugwump.n mulatto.n mulberry.n mulch.n mule.n mullah.n multimillionaire.n multinational.n multiple.n multiplexer.n multiplex.s multitude.n mummy.n municipality.n munition.n mural.n murderer.n murder.s murmur.n mu.s muscle.s muse.n musete.s museum.n mushroom.s musical.n musician.n musketeer.n musket.n muskrat.n Muslim.n mussel.n mustache.n mustachio.n mustang.n muster.n mutation.s mute.n mutilation.s mutineer.n mutiny.s mutterer.n mutt.n muzzle.n mynah.n myna.n myriad.n myrtle.s mystery.s mystic.n mystique.n mythologist.n mythology.s nacho.n nadaswaram.s nadir.n nailfile.n nail.n name.n nameplate.n namesake.n Namibian.s nanny.n nanoliter.n nanolitre.n nanometer.n nanometre.n nanosecond.n nanowatt.n nape.n napkin.n nap.n nappy.n narcotic.n narration.s narrative.s narrator.n nasal.n nationalist.n nationality.s nationalization.s national.n nation.n native.n nativity.n naturalist.n natural.n nature.s naught.s Nauruan.s nautilus.n navel.n nave.n navigator.n navy.n nearside.n nebula.n necessity.s neckband.n necklace.n neckline.n neck.n necktie.n necromancer.n necropolis.n nectarine.n needle.n negative.n negligee.n neglige.n negotiation.s negotiator.n neighborhood.n neighbor.n neighbourhood.n neighbour.n neigh.n nemesis.n neologism.n neophyte.n nephew.n-m nephritis.s nerve.s nestling.n nest.n net.s nettle.n network.n neurologist.n neurotic.n neutralization.s neutron.n newborn.n newcomer.n newlywed.n newsagent.n newsboy.n newscaster.n newscast.n newsdealer.n newsflash.n newsletter.n newsmonger.n newspaper.n newsreel.n newsroom.n newssheet.n newsstand.n newsvendor.n newt.n nexus.n ney.s nibble.n Nicaraguan.s nicety.n niche.n nickel.s nick.n nicknack.n nickname.n niece.n-f Nigerian.s Nigerien.s nightcap.n nightclub.n nightdress.n nightgown.n nightie.n nightingale.n nightmare.n nightshirt.n nihilist.n nincompoop.n ninny.n nip.n nipple.n nit.n nitrate.s nitwit.n nobel.n nocturne.n node.n nod.n noggin.n nohkan.s noise.s nomad.n nomenclature.n nomination.n nominee.n nonce.n noncombatant.n nonconformist.n nondescript.n nonentity.n nonevent.n nonsmoker.n nonstarter.n noodle.n nook.n noose.n norm.n northeaster.n northerner.n northwester.n Norwegian.s nosebleed.n nosedive.n nosegay.n nose.n nosering.n nostril.n nostrum.n notable.n notary.n notation.s notch.n notebook.n note.n notice.s nougat.s noun.n novelette.n novelist.n novella.s novel.n novelty.s novice.n nozzle.n nuance.s nub.n nucleotide.n nude.n nudge.n nudist.n nugget.n nuisance.n numberplate.n numeral.n numerator.n numskull.n nuncio.n nun.n-f nunnery.n nursemaid.n-f nurse.n nursery.n nurturer.n nu.s nuthouse.n nutmeg.s nut.n nutritionist.n nutshell.n nylon.s nymph.n nymphomaniac.n nympho.n oaf.n oak.s oar.n oatcake.s oath.n oats oat.s obbligato.n obelisk.n obituary.n objection.n objective.n object.n objector.n oblast.n oblong.n oboe.s oboist.n obscenity.s observation.s observatory.n observer.n obsession.s obstacle.n obstetrician.n obstructionist.n obstruction.s obverse.n ocarina.s occasion.n occupancy.n occupant.n occupation.n occupier.n occurrence.s ocean.s octagon.n octapad.s octave.n octavin.s octet.n octogenarian.n octopus.n oculist.n oddity.n oddment.n ode.n odour.s odyssey.n offence.s offender.n offense.s offensive.n offering.n offertory.n office.n officer.n official.n offing.n offprint.n offshoot.n offspring.s ogre.n ohm.n oilcan.n oilfield.n oilseed.n ointment.s old.n oligarchy.s oligopoly.n olive.s olivine.s Omani.s omega.s omelet.s omelette.s omen.n omicron.s omission.s omnibus.n onion.s onlooker.n onrush.n onset.n onslaught.n opal.s opener.n opening.n opera.s operation.s operative.n operator.n operetta.n ophicleide.s opiate.s opossum.n opponent.n opportunist.n opposite.n oppressor.n optician.n optimist.n optimum.n opus.s oracle.n oral.n orange.s oration.n oratorio.n orator.n oratory.s orbit.n orb.n orchard.n orchestra.n orchestration.s orchid.n ordeal.n ordering.n orderly.n ordinal.n ordinance.n ordination.s ore.s organism.n organist.n organization.s organizer.n organ.s orgasm.n orgy.n oriel.n orientalist.n oriental.n orientation.s orifice.n original.n originator.n origin.s oriole.n ornament.s ornithologist.n orphanage.n orphan.n orthodontist.n orthodoxy.s orthography.s oscillation.s oscillator.n oscillograph.n oscilloscope.n osprey.n osteopath.n ostrich.n otter.s ottoman.n ounce.n ouster.n outbreak.n outburst.n outcast.n outcome.n outcry.s outfielder.n outfield.n outfit.n outfitter.n outflow.n outgrowth.n outhouse.n outing.n outlaw.n outlay.s outlet.n outlier.n outline.n outlook.n outpatient.n outpost.n outpouring.n outrage.s outrigger.n outset.n outside.n outsider.n oval.n ovary.n ovation.n oven.n overall.n overcoat.s overdose.n overdraft.n overexposure.s overflow.n overgrowth.s overhang.n overhaul.n overlap.s overlay.n overlord.n overpass.n overpayment.s overreaction.n overseer.n overshoe.n oversight.s overstatement.s overthrow.n overtone.n overture.n overview.n owl.n owner.n oxide.s oxtail.n ox.n-m oyster.s oystershell.s pacemaker.n pace.n pacesetter.n pachyderm.n pacifist.n package.n packet.n packhorse.n-m pack.n pact.n paddle.n paddock.n padlock.n pad.n padre.n paean.n pagan.n pageant.n page.n pagoda.n pailful.n pail.n painkiller.n pain.s paintbox.n paintbrush.n painter.n painting.n paint.s pair.n paixiao.s Pakistani.s palace.n palaeontologist.n palate.n palatinate.n paleface.n pale.n palendag.s paleontologist.n palette.n palindrome.n pallbearer.n palliative.n pall.n palm.n pal.n palpitation.n pamphleteer.n pamphlet.n panacea.n panama.n Panamanian.s pancake.s pancreas.n panda.n pandemic.n panegyric.n panelist.n panel.n pane.n pang.n panhandle.n panic.s pan.n panoply.n panorama.n pan_pipes pansy.n pantheist.n pantheon.n panther.n pant.n pantograph.n pantomime.s pantry.n papacy.n papa.n-m papaya.s paperback.n paperclip.n papermill.n paper.s paperweight.n papist.n papoose.n papyrus.s parable.n parabola.n parachute.n parachutist.n parade.n paradigm.n paradise.s paradox.n paragon.n paragraph.n Paraguayan.s parakeet.n parallelism.s parallel.n parallelogram.n parameter.n paramour.n paranoiac.n parapet.n paraplegic.n parasite.n parasol.n paratrooper.n parcel.n parchment.s pardon.s parent.n pariah.n parishioner.n parish.n parka.n park.n parlance.n parley.n parliamentarian.n parliament.n parlor.n parlour.n parodist.n parody.s paroxysm.n parricide.s parrot.n par.s parse.n parser.n parsnip.s parsonage.n parson.n participant.n participle.n particle.n particular.n parting.n partisan.n partition.s part.n partner.n partnership.s partridge.s party.n parvenu.n pasha.n passage.s passageway.n passbook.n passenger.n passion.s passive.n pass.n passport.n password.n pastel.n pastern.n paste.s pastiche.n pastille.n pastime.n past.n pastoral.n pastor.n pastry.s pasture.s pasty.n patch.n patella.n patent.n pate.s paté.s path.n pathogen.n pathologist.n pathway.n patient.n patina.n patio.n patisserie.n pat.n patriarch.n patriarchy.n patrician.n patricide.s patrimony.n patriot.n patrol.n patroness.n patron.n patronymic.n pattern.n patty.n paunch.n pauper.n pause.s pavement.n pavilion.n paw.n pawnbroker.n pawn.n pawnshop.n payday.n payee.n payer.n payload.n paymaster.n payment.s payoff.n payout.s payphone.n payroll.n paysheet.n payslip.n peacemaker.n peace.s peach.s peacock.n peak.n peanut.s pearl.s pear.s pea.s peasant.n peasantry.n peashooter.n pebble.n pecan.s peccadillo.n pecker.n peck.n peculiarity.s pedagogue.n pedal.n pedant.n peddler.n pederast.n pedestal.n pedestrian.n pediatrician.n pedicure.s pedigree.s pedometer.n peek.n peeler.n peephole.n peep.n peepshow.n peerage.n peeress.n peer.n pee.s peg.n pekinese.s pelican.n pellet.n pelt.n pelvis.n penalty.s penchant.n pencil.n pendant.n pendulum.n penguin.n peninsula.n penis.n penitentiary.n pen.n pennant.n penny.n pensioner.n pension.n pentagon.n penthouse.n penumbra.n peon.n peony.n people.s peppercorn.n peppermint.s pepper.s perambulator.n percentage.n perch.s percolator.n percussionist.n percussion.s perennial.n perfectionist.n perforation.s performance.s performer.n perfume.s peril.s perimeter.n periodical.n periodicity.n periphery.n periscope.n periwinkle.s perjurer.n perjury.s perk.n perm.n permutation.s peroration.n peroxide.s perpendicular.n perpetrator.n perpetuation.s perquisite.n persecution.s persecutor.n persimmon.s personage.n personality.s persona.n personification.s person.n perspective.s persuasion.s perturbation.n perusal.s Peruvian.s perversion.s perversity.s pervert.n pessimist.n pesticide.s pestilence.s pestle.n pest.n petabyte.n petal.n petard.n petitioner.n petition.n pet.n petticoat.s petunia.n pew.n pfennig.n phalanx.n phallus.n phantasmagoria.n phantasm.n phantasy.n phantom.n pharmacist.n pharmacologist.n pharmacy.n pharynx.n phase.n pheasant.s phenomenon.n phenotype.n philanderer.n philanthropist.n philatelist.n philologist.n philosopher.n phi.s phobia.n phoenix.n phonebooth.n phonecall.n phoneme.n phone.n phonetician.n phoney.n phonograph.n phony.n phosphate.s photocopier.n photocopy.n photoflash.n photographer.n photograph.n photometer.n photo.n photon.n photostat.n phrase.n phrenologist.n phylogeny.s phylum.s physician.n physicist.n physiognomy.s physiologist.n physiotherapist.n physique.s pianist.n pianoforte.s pianola.n piano.s piazza.n pibgorn.s picador.n pica.s piccolo.s pickaxe.n pickerel.s picker.n picket.n pickle.s pick.n pickpocket.n pick-up.n pickup.n picnicker.n picnic.n picogram.n picoliter.n picometer.n picosecond.n picowatt.n pictorial.n picture.n pide.s pidgin.s piece.n pier.n pie.s piety.s pigeon.n piggyback.n piggy.n piglet.n pigment.s pigmy.n pig.n pigsty.n pigtail.n pigweed.n pike.s pikestaff.n pile.n pilgrimage.n pilgrim.n pillage.n pillar.n pillbox.n pill.n pillowcase.n pillow.n pilot.n pimento.s pimple.n pimp.n pinafore.n pincer.n pinch.n pincushion.n pineapple.s pine.s ping.n pinhead.n pin.n pinnacle.n pinpoint.n pinprick.n pint.n pioneer.n pipedream.n pipeful.n pipeline.n piper.n pipe.s pipette.n pip.n pipsqueak.n pique.s piranha.n pirate.n pirouette.n pi.s piss.s pistachio.s pistil.n pistol.n piston.n pitcher.n pitchfork.n pitch.s pitfall.n pithead.n pit.n pittance.n pituitary.n pity.s pivot.n pixie.n pizza.s placard.n placebo.n placeseeker.n plagiarist.n plague.n plaice.s plain.n plaintiff.n plane.n planetarium.n planet.n plank.n planner.n plantain.n plantation.n planter.n plant.n plaque.s plaster.s plateau.n plateful.n plate.n platform.n platitude.n platoon.n platter.n platypus.n plaudit.n playbill.n playboy.n player.n playgoer.n playground.n playhouse.n playmate.n playoff.n playpen.n playroom.n play.s playschool.n plaything.n playwright.n plaza.n plea.n pleasantry.n pleasure.s pleat.n plebeian.n plebiscite.n plectrum.n plenipotentiary.n plenum.n plethora.n plexus.s plight.n plodder.n plop.n plotter.n ploughboy.n plough.n ploughshare.n plow.n ploy.n pluck.s plughole.n plug.n plumber.n plume.n plum.n plump.n plunderer.n plunge.n plunger.n pluperfect.n pluralist.n plurality.s plural.n plus.n plutocracy.s plutocrat.n poacher.n pocketful.n pocket.n podium.n pod.n poem.n poet.n poetess.n-f pogrom.n poinsettia.s pointer.n point.n poison.s poke.n poker.s polarity.s polarization.s poleaxe.n poleax.n polecat.n polemic.n pole.n Pole.n policeman.n policewoman.n policy.s polish.s politburo.n politician.n polity.n polka.n poll.n pollster.n pollutant.n polonaise.n poltergeist.n polygamist.n polyglot.n polygon.n polynomial.n polyp.n polysyllable.n polytechnic.n pomegranate.n pompon.n poncho.n pond.n pontiff.n pontoon.n pony.n ponytail.n poodle.n poof.n pool.n poolroom.n poop.n poorhouse.n pope.n-m popinjay.n poplar.s poppy.n pop.s populace.n popularization.s population.s populist.n porch.n porcupine.n pore.n porker.n pornographer.n porosity.s porpoise.n porringer.n portal.n portcullis.n porterhouse.n porter.n portfolio.n porthole.n portico.n portion.n portmanteau.n portraitist.n portrait.n portrayal.n port.s pose.n poser.n positivist.n posse.n possession.s possum.n postbag.n postbox.n postcard.n postcode.n posterior.n poster.n postgraduate.n postmark.n postmaster.n postponement.s post.s postscript.n posture.s potato.s potbelly.n potboiler.n potency.s potentate.n potentiality.s potential.s pothead.n pothole.n potion.n pot.n potpourri.n potter.n pottery.s potty.n pouch.n poultice.n pounce.n pound.n pout.n powder.s powerboat.s powerhouse.n power.s powwow.n practicality.s practice.s practitioner.n praesidium.n pragmatist.n prairie.n pram.n prance.n prank.n prankster.n prattler.n prawn.s prayer.s preacher.n preamble.n prearrangement.n prebendary.n precaution.n precedent.n precept.n preceptor.n precession.n precinct.n precipice.n precis.s preconception.n precondition.n precursor.n predator.n predecessor.n predetermination.n predicament.n predicate.n prediction.s predictor.n predilection.n predisposition.n prefabrication.n preface.n prefect.n prefecture.n preference.s prefix.n pregnancy.s prejudgement.n prejudice.s prelate.n prelim.n prelude.n premiere.n premier.n premiership.n premise.n premiss.n premium.n preoccupation.s preparation.s preponderance.n preposition.n prep.s prerogative.n prescription.s presence.s presentation.s presentiment.n present.n preservative.n preserve.n preserver.n presidency.n president.n President.n presidium.n pressing.n prestidigitator.n presumption.s pretence.s pretender.n pretense.s pretension.s pretext.n pretzel.n preview.n prevision.s pricelist.n price.s pricetag.n prickle.n prick.n priestess.n priesthood.n priest.n prig.n primacy.s primary.n primate.n Prime.n primer.n prime.s priming.n primitive.n primrose.n princedom.n prince.n-m princess.n-f principality.n principal.s printer.n printing.s printout.n print.s priority.s prior.n priory.n prism.n prisoner.n prison.s privateer.n private.n privation.n privatization.s privilege.s privy.n prize.n probate.s probe.n proboscis.n procedure.s proceeding.n procession.s process.n processor.n proconsulate.n proconsul.n procreation.n proctor.n procurer.n prodigy.n prod.n producer.n production.s product.n profanity.s professional.n profession.n professoriate.n professor.n professorship.n profile.s profiteer.n profit.s profundity.s progenitor.n prognosis.n prognostication.s programme.n programmer.n program.n progression.s progressive.n prohibitionist.n prohibition.s projectile.n projectionist.n projection.n project.n projector.n proletarian.n proletariat.n proliferation.n prologue.n prolongation.s promenade.n prom.n promontory.n promoter.n promotion.n prompter.n prompt.n pro.n prong.n pronouncement.n pronoun.n proofreader.n propagandist.n propagator.n propellant.s propellent.s propeller.n property.s prophecy.s prophet.n prophylactic.n prop.n proponent.n proportion.s proprietor.n proscenium.n proscription.s prosecution.s prosecutor.n prospector.n prospectus.n prostate.n prostitute.n protagonist.n protectionist.n protection.s protectorate.n protector.n protegee.n protege.n protein.s Protestant.n protestation.n protester.n protest.s protocol.s proton.n prototype.n protractor.n protrusion.n protuberance.n proverb.n provider.n province.n provincialism.s provocation.s provost.n prowler.n prowl.n prow.n proxy.s prude.n prune.n psalmist.n psalm.n psalter.n psaltery.s pseud.n pseudonym.n psi.s psyche.n psychiatrist.n psychic.n psychoanalyst.n psychologist.n psychopath.n psychotic.n pterodactyl.n publication.n publicist.n public.n publisher.n pub.n puck.n pudding.s puddle.n pueblo.n puffin.n puff.n pulalu.s pulley.n pull.n pullover.n pulpit.n pulp.s pulsar.n pulsation.s pulse.n puma.n pumpkin.s pump.n punchball.n punchbowl.n punch.s puncture.n pundit.n punishment.s punk.s pun.n punster.n punt.n pupil.n pup.n puppeteer.n puppet.n puppy.n purchaser.n purchase.s puree.n purgatory.s purge.n purification.s purifier.n purist.n puritan.n purpose.s purr.n purseful.n purse.n pursuer.n pursuit.s purveyor.n purview.n pushcart.n pusher.n push.n pushover.n pussycat.n pussy.n putsch.n putt.n puzzle.n pygmy.n pylon.n pyramid.n pyre.n python.n Qatari.s quack.n quad.n quadrangle.n quadrant.n quadrilateral.n quadruped.n quadruplet.n quagmire.n quail.n quake.n qualification.s qualifier.n quality.s qualm.n quandary.n quantity.s quark.n quarrel.n quarry.n quarterback.n quarterfinal.n quarter.n quartet.n quart.n quasar.n quatercentenary.n quatrain.n quatro.s quaver.n quay.n queen.n queer.n query.n quesadilla.n questioner.n questionnaire.n quest.n queue.n quibble.n quiche.s quickie.n quickstep.n quid.s quietist.n quill.n quilt.n quincentenary.n quince.s quintessence.n quintet.n quinticlave.s quintuplet.n quip.n quirk.n quitter.n quiver.n quizmaster.n quiz.n quorum.n quota.n quotation.s quote.n quotient.n rabbi.n rabbit.s rabble.n raccoon.n racecourse.n racehorse.n-m racer.n race.s racist.n racketeer.n racket.s rack.n raconteur.n racoon.n racquet.n radial.n radiation.s radiator.n radical.n radicle.n radiogram.n radioisotope.n radiologist.n radio.s radish.n radius.s raffle.n rafter.n raft.n ragamuffin.n rage.s rag.n ragtag.n raider.n raid.n railcar.n railhead.n railing.n rail.n railroad.n railway.n rainbow.n raincoat.s raindrop.n rainfall.s rainstick.s raise.n raisin.n rake.n rally.n ramble.n rambler.n ramification.n ram.n rampage.n rampart.n ramp.n ramrod.n rancher.n ranch.s rangefinder.n ranger.n range.s rank.s ransom.s rape.s rapeseed.n rapier.n rapist.n rapport.s rapprochement.n rap.s rapscallion.n rapture.s rarebit.s rarity.s rascal.n rasher.n rash.n raspberry.n rasp.n ratchet.s rate.n ratepayer.n ratification.n rating.n ratio.n rationale.n rationalist.n rationalization.s ration.n rat.n rattle.s rattlesnake.n rave.n raven.n ravine.n ravioli.s ray.n razorback.n razorblade.n razor.n reach.s reactionary.n reaction.s reactor.n reader.n readership.n reading.s readjustment.s reagent.n realignment.s realist.n reality.s realm.n realtor.n realty.n ream.n reaper.n reappearance.n reappraisal.n rearguard.n rear.n reassessment.s rebate.n rebec.s rebel.n rebirth.n rebound.n rebuff.n rebuke.n rebuttal.n recall.s recapitulation.s recap.n receipt.n receivable.n receiver.n receivership.n receptacle.n receptionist.n reception.s recessional.n recession.s recess.n recidivist.n recipe.n recipient.n recital.n recitation.s recitative.s reckoning.n recluse.n recognizance.n recoil.n recollection.s recompense.s reconciliation.s reconnaissance.s reconstruction.s recorder.s recording.n record.s recovery.s recreation.s recrimination.s recruiter.n recruitment.n recruit.n rectangle.n rectifier.n rector.n rectory.n rectum.n recurrence.s recycler.n redbreast.n redcap.n redcoat.s redeemer.n redevelopment.s redhead.n rediscovery.s redoubt.n redskin.n reduction.s redundancy.s redwood.s reed.s reefer.n reef.n re-election.s reelection.s reel.n refectory.n referee.n reference.s referendum.n referral.s refill.n refinancing.s refinement.s refiner.n refinery.n reflection.s reflector.n reflexive.n reflex.n reformation.s reformatory.n reformer.n reform.s refraction.s refrain.n refresher.n refreshment.s refrigerant.n refrigerator.n refugee.n refuge.s refund.s refutation.s regard.s regatta.n regency.n regent.n regicide.s regime.n regimen.n regiment.n region.n register.n registrar.n registration.s registry.s regression.s regret.s regularity.s regular.n regulation.s regulator.n rehabilitation.s rehash.n rehearing.n rehearsal.s reign.n reimposition.s reincarnation.s reindeer.s reinforcement.s rein.n reinterpretation.s reissue.n reiteration.s rejection.s reject.n rejoinder.n relapse.n relation.s relationship.n relative.n relaxation.s relay.n release.n relevance.n relic.n religion.s relleno.n remainder.n remake.n remarriage.s remedy.n remembrance.s reminder.n reminiscence.s remission.s remittance.s remnant.n remonstrance.s removal.s remover.n renaissance.n renascence.n rendering.n rendezvous.s rendition.n renegade.n renewal.s renovation.s rental.n rent.s reorganization.s repair.s reparation.s repast.n repayment.s repeal.n repeater.n repeat.n repercussion.n repertoire.n repertory.n repetition.s replacement.s replay.n replica.n reply.n reporter.n repository.n Represenative.n representation.s representative.n reprieve.n reprimand.n reprint.n reprisal.s reproach.s reprobate.n reproduction.s reproof.s reptile.n republican.n Republican.n republic.n repudiation.n repurchase.s reputation.s requiem.n requisition.s rerun.n resale.s rescuer.n rescue.s researcher.n resemblance.s reservation.s reserve.s reservoir.n resettlement.n reshuffle.n residence.s residency.n resident.n residue.n resignation.s resin.s resister.n resistor.n resolution.n resolver.n resonator.n resort.s resource.n respectability.s respect.s respiration.s respirator.n respite.s respondent.n response.n restatement.n restauranteur.n restaurant.n restaurateur.n restoration.s restorative.n restorer.n restraint.s restructuring.s rest.s resume.n resumption.s resurgence.n retailer.n retail.n retainer.n retardation.s retard.n retina.n retinue.n retiree.n retirement.s retort.n retraction.s retread.n retreat.s retrenchment.s retrial.n retriever.n return.s reunion.s reveille.n revelation.s reveller.n revel.s reverberation.s reverend.n reverie.s reversal.s reverse.s reversion.s reviewer.n review.s revisionist.n revision.s revivalist.n revival.s rev.n revocation.s revolt.s revolutionary.n revolution.s revolver.n revue.n reward.s rewrite.n rhapsody.n rheostat.n rheumatic.n rhinoceros.s rhino.n rhododendron.n rhombus.n rho.s rhyme.s rhythm.s ribbon.n rib.n rickshaw.n ricochet.n riddle.n ride.n rider.n ridge.n riff.n rifle.n rift.n rigger.n rightist.n rigidity.s rig.n rim.n ringer.n ringleader.n ringlet.n ringmaster.n ring.n ringside.n rink.n rinse.n rioter.n riot.s rip.n riposte.n ripple.n rise.n riser.n risotto.s rite.n ritual.s rival.n rivalry.s riverbed.n river.n riverside.n rivet.n rivulet.n roach.s roadbed.n roadblock.n roadhouse.n road.n roadside.n roadster.n roadway.n roar.n roaster.n roast.s robber.n robbery.s robe.n robin.n robot.n rockabilly.n rocker.n rockery.n rocket.n rock.s rodent.n rodeo.n rod.n roebuck.n roe.s rogue.n role.n roller.n roll.n romance.s Romanian.s romantic.n romp.n rondeau.n rondo.n roof.n rookery.n rookie.n rook.n roomful.n room.s rooster.n roost.n root.n rope.s rosary.n rosebud.n rose.n roster.n rostrum.n rota.n rotary.n rotation.s rotini.s rotisserie.n rotor.n rotter.n rotunda.n roue.n roughneck.n roughrider.n roundabout.n roundelay.n roundhouse.n round.n roundup.n route.n routine.s rout.n rover.n rowboat.s rowdy.n rower.n row.n royalist.n royalty.s rubberneck.n rubber.s rub.n rubric.n ruby.n rucksack.n ruckus.n rudder.n rudiment.n ruffian.n ruffle.n ruff.n rug.n ruin.s ruler.n ruling.n rumba.n rumble.n rumour.s rump.n runaway.n rundown.n rune.n run.n runner.n runoff.n runt.n run-up.n runway.n rupture.s ruse.n rush.s rusk.n Russian.s rustic.n rustler.n rut.n Rwandan.s ryuteki.s sabbatical.n sable.s saboteur.n sabre.n sachet.n sackbut.s sack.s sac.n sacrament.n sacrifice.s saddlebag.n saddle.n sadist.n safari.s safecracker.n safeguard.n safe.n saga.n sage.s sag.n sahib.n sail.n sailor.n saint.n sake.s salaam.n salad.s salamander.s salary.s saleroom.n sale.s salesman.n saline.s sally.n salmon.s salon.n saloon.n saltworks.s salutation.n salute.n Salvadoran.s salver.n salve.s salvo.n samba.n Samoan.s samovar.n sampan.n sample.n sampler.n samponia.s sanatorium.n sanction.s sanctity.s sanctuary.s sanctum.n sandal.n sandbag.n sandbank.n sandglass.n sandpiper.n sandpit.n sandstorm.n sandwich.s sangria.s sapling.n sapper.n sapphire.s sap.s saraband.n sardine.s sari.n sarong.n sarrusophone.s sash.n satchel.n satellite.n satire.s satirist.n satrap.n satyr.n saucepan.n saucer.n sauce.s sauna.n sausage.s savage.n savannah.n savanna.n savant.n saver.n savings.s saviour.n savoy.s sawhorse.n sawmill.n saw.n sawyer.n saxhorn.s sax.n saxonette.s saxophone.s saxophonist.n scabbard.n scab.n scaffold.n scalawag.n scale.n scallop.n scallywag.n scalpel.n scalp.n scam.n scamp.n scandalmonger.n scandal.s scanner.n scapegoat.s scapula.n scarcity.s scarecrow.s scaremonger.n scare.n scarf.n scarlet.s scar.n scatterbrain.s scatter.n scavenger.n scenario.n scene.n scent.s sceptic.n sceptre.n schedule.n schema.n scheme.n schemer.n scherzo.n schism.n schizophrenic.n schnitzel.s scholar.n scholarship.s schoolbook.n schoolboy.n schoolfellow.n schoolfriend.n schoolgirl.n schoolhouse.n schoolmaster.n schoolmate.n schoolmistress.n schoolroom.n school.s schoolteacher.n schooner.n schottische.n schtik.n schwa.n science.s scientist.n scimitar.n scintilla.n scion.n scold.n scollop.n scone.s scoopful.n scoop.n scooter.n scorcher.n scoreboard.n scorebook.n scorecard.n score.n scorer.n scorpion.n scotch.s Scot.n scoundrel.n scourge.n scoutmaster.n scout.n scowl.n scramble.n scrapbook.n scrape.n scraper.n scrapheap.n scrap.s scratch.n scrawl.n scream.n screen.n screenplay.n screwball.n screwdriver.n screw.n scribble.n scribbler.n scribe.n scrimmage.n script.n scripture.n scriptwriter.n scrivener.n scroll.n scrotum.n scrounger.n scrub.n scruff.n scrunch.n scruple.s scud.s scullery.n sculptor.n sculpture.s scythe.n seabed.n seabird.n seaboard.n seafarer.n seafront.n seagull.n seal.n seam.n seamstress.n seance.n seaplane.n seaport.n searcher.n searchlight.n search.n sea.s seascape.n seashell.n seashore.n seaside.n seasoning.s season.n seat.n seaway.n seaweed.s secessionist.n secession.s sec.n seconder.n secretariat.n secretary.n secretion.s secret.n sectarian.n section.n sect.n sector.n sedan.n sedative.n seducer.n seduction.s seedbed.n seedling.n seed.n seeker.n seer.n seesaw.n segmentation.s segment.n seignior.n seismograph.n seismologist.n seizure.s selection.s selector.n self-examination.s self.n self-sacrifice.s seller.n selloff.n sellout.n semblance.s semester.n semibreve.n semicircle.n semicolon.n semiconductor.n semifinalist.n semifinal.n seminar.n seminary.n semiquaver.n semitone.n semivowel.n senate.n senator.n Senator.n sender.n sendoff.n senior.n senora.n senorita.n sensationalist.n sensation.s sensibility.s sensitivity.s sentence.n sentiment.s sentinel.n sentry.n separation.s separatist.n septet.n septuagenarian.n sepulchre.n sequel.n sequence.s sequin.n sequoia.n Serbian.s Serb.n serenade.n serf.n sergeant.n serial.n series.s sermon.n serpent.n servant.n serve.n server.n service.s serviette.n serving.n session.n setback.n set.s settee.n setter.n setting.n settlement.s settler.n sewer.n sexagenarian.n sexist.n sex.s sextant.n sextet.n sexton.n shackle.n shack.n shade.s shading.s shadow.n shaft.n shah.n Shah.n shakedown.n shake.n shakeout.n shaker.n shakuhachi.s shambles.n shampoo.s shamrock.n shandy.s shank.n shanty.n shantytown.n shape.s shard.n sharecropper.n shareholder.n shareholding.n share.s shark.n sharpener.n sharper.n sharp.n sharpshooter.n shave.n shaver.n shawl.n sheathing.n sheath.n shed.n sheepdog.n sheep.s sheepskin.s sheet.s shehnai.s sheikdom.n sheikhdom.n sheikh.n sheik.n shekere.s shelf.n shellfish.s shell.n shelter.s sheng.s shepherd.n shepherdess.n-f sherbet.s sheriff.n sherry.s shibboleth.n shield.n shift.n shinbone.n shindig.n shingle.s shinguard.n shin.n shinobue.s shipbuilder.n shipload.n shipmate.n shipment.s ship.n shipowner.n shipper.n shipwreck.s shipwright.n shipyard.n shire.n shirker.n shirt.n shirtwaist.n shiver.n shoal.n shocker.n shock.s shoehorn.n shoelace.n shoemaker.n shoe.n shoestring.n shoetree.n shogun.n shooter.n shooting.n shopkeeper.n shoplifter.n shop.n shopper.n shopwindow.n shore.n shortage.s shortcoming.n shortcut.n shortfall.n shortlist.n short.n shortstop.n shotgun.n shot.n shoulder.n shout.n shovelful.n shovel.n shove.n showboat.s showcase.n showdown.n shower.n showgirl.n showing.n show.n showplace.n showroom.n shred.n shrew.n shriek.n shrimp.s shrine.n shrink.n shroud.n shrubbery.s shrub.n shrug.n shtik.n shudder.n shuffle.n shutdown.n shutter.n shuttlecock.n shuttle.n shyster.n sibilant.n sibling.n Sicilian.s sickbay.n sickbed.n sickle.n sickness.s sideboard.n sidecar.n sidelight.n sideline.n side.n sideshow.n sidestep.n sidetrack.n sidewalk.n siding.n siege.s sierra.n siesta.n sieve.n sifter.n sigh.n sighting.n sight.s sightseer.n sigma.s signal.n signatory.n signature.n signer.n signora.n signorina.n signor.n signpost.n siku.s silencer.n silence.s silhouette.n silk.s silkworm.n sill.n silo.n silversmith.n similarity.s simile.s similitude.s simpleton.n simplification.s simulation.s simulator.n sinecure.s sine.n sinew.n singer.n single.n singleton.n singsong.n singularity.n singular.n sinker.n sinking.n sink.n sinner.n sin.s sinus.n siphon.n sip.n siren.n sirloin.s sir.n sirup.s sissy.n-f sister.n-f sitar.s sitcom.n site.n sitter.n sitting.n situation.n sixpence.n size.s skateboarder.n skateboard.n skate.n skater.n skeet.n skeleton.n skeptic.n sketch.n skewer.n skid.n skier.n skiff.n skillet.n skill.s ski.n skinflint.n skinhead.n skin.s skip.n skipper.n skirmish.n skirt.n skit.n skullcap.n skull.n skunk.n skylark.n skylight.n skyline.n skyscraper.n slab.n slack.s slam.n slanderer.n slander.s slant.n slap.n slash.n slate.s slat.n slaughterer.n slaughterhouse.n slave.n slayer.n sledgehammer.n sled.n sleeper.n sleepwalker.n sleeve.n sleigh.n sleight.n sleuth.n slice.n slicker.n slick.n slide.n slight.n slinger.n sling.n slipcover.n slipknot.n slip.n slipper.n slit.n sliver.n slob.n sloe.s slogan.n sloop.n slope.s slop.n sloth.s slot.n Slovakian.s Slovenian.s slowcoach.n slowdown.n sluggard.n slug.n sluicegate.n sluice.n slumber.n slum.n slump.n slur.n slut.n smacker.n smack.n smallholder.n smallholding.n smalt.s smash.n smattering.n smear.n smell.n smelter.n smelt.s smile.n smirk.n smith.n smithy.n smock.n smoker.n smoke.s smokestack.n smorgasbord.n smudge.n smuggler.n snack.n snag.n snail.s snake.n snapdragon.n snap.s snapshot.n snare.s snarl.n snatcher.n snatch.n sneak.n sneer.n sneeze.n snicker.n sniff.n snigger.n sniper.n snip.n snippet.n snob.n snooper.n snooze.n snore.n snorer.n snorkel.n snort.n snout.n snowball.n snowdrift.n snowdrop.n snowfall.n snowflake.n snowplough.n snowstorm.n snub.n snuffbox.n snug.n soapbox.n sob.n sobriquet.n socialist.n socialite.n social.n society.s sociologist.n socket.n sock.n sodomite.n sod.s sofa.n softener.n softie.n soiree.n sojourner.n solace.s soldier.n sole.n solicitation.n solicitor.n solid.n soliloquy.n solitude.s soloist.n solo.n solstice.n solution.n solvent.n Somalian.s sombrero.n somersault.n somnambulist.n sonar.n sonata.n songbird.n songbook.n song.n son.n sonnet.n sonny.n sonority.s soothsayer.n sopapilla.n sophism.n sophist.n sophomore.n sop.n soprano.s sorbet.s sorcerer.n sorceress.n sore.n sorority.n sorrel.s sorter.n sortie.n sort.n soubriquet.n souffle.n soul.s sound.s soundtrack.n soupcon.n soupçon.n soup.s source.n sousaphone.s southeaster.n southerner.n southpaw.n southwester.n souvenir.n sovereign.n soviet.n sower.n sow.n soybean.n spacecraft.s space.s spaceship.n spacesuit.n spadeful.n spade.n spa.n Spaniard.n spaniel.n spanking.n span.n spanner.n spare.n sparkle.n sparkler.n spark.n spar.n sparrow.n spasm.n spastic.n spate.n spatula.n speaker.n speakerphone.n spear.n specialist.n speciality.n specialization.s special.n specialty.n species.s specification.s specimen.n speckle.n speck.n spec.n spectacle.n spectacular.n spectator.n specter.n spectre.n spectroscope.n spectroscopy.s spectrum.n speculator.n speech.s speedboat.s speedometer.n speed.s speedway.n speller.n spelling.s spell.n spender.n spendthrift.n spermicide.s sperm.s sphere.n sphinx.n spice.s spider.n spiel.n spigot.n spike.n spill.n spindle.n spine.n spinet.n spinoff.n spin.s spinster.n-f spiral.n spire.n spirit.s spiritual.n spitfire.n spittoon.n splash.n spleen.s splice.n splinter.n splint.n split.n splotch.n spoil.s spoilsport.n spoke.n spokesman.n spokesperson.n spokeswoman.n spondee.n sponger.n sponge.s sponsor.n sponsorship.s spoof.n spook.n spool.n spoonerism.n spoonful.n spoon.n spore.n sporran.n sport.s spotlight.n spot.n spotter.n spouse.n spout.n sprain.n sprawl.s sprayer.n spray.s spreader.n spread.n spree.n sprig.n springboard.n springbok.n spring.s springtime.s sprinkler.n sprinter.n sprint.n sprocket.n sprout.n spruce.s spud.n spur.n spurt.n sputnik.n spy.n squabble.n squab.n squad.n squadron.n squall.n square.n squatter.n squawk.n squaw.n squeaker.n squeak.n squealer.n squeal.n squeegee.n squeeze.n squeezer.n squib.n squid.n squiggle.n squint.n squire.n squirrel.s squirt.n stableboy.n stablemate.n stable.n stab.n stack.n stadium.n staffer.n staff.s stagecoach.n stage.n stagger.n staging.s stag.n stain.s staircase.n stair.n stairway.n stake.n stalactite.n stalagmite.n stalemate.s stalker.n stalk.n stallion.n stall.n stalwart.n stamen.n stammerer.n stammer.n stampede.n stamp.n stance.n standard.n standby.n stand.n standoff.n standpipe.n standpoint.n standstill.n stanza.n staple.n stapler.n stare.n starfish.s stargazer.n starlet.n starling.n star.n starter.n start.n startup.n state.n stationer.n stationmaster.n station.n statistician.n statistic.n statue.n statuette.n statute.n stave.n stay.n steak.s steamboat.s steamer.n steamroller.n steamship.n steed.n steelmaker.n steelpan.s steelworks.s steelyard.n steeplechase.n steeplechaser.n steeplejack.n steeple.n steer.n stem.n stench.n stencil.n stenographer.n stepbrother.n-m stepdaughter.n-f stepfather.n-m stepladder.n stepmother.n-f step.n stepparent.n steppe.n stepsister.n-f stepson.n-m stereo.n stereoscope.n stereotype.s stern.n sternum.n stethoscope.n stetson.n stevedore.n stewardess.n steward.n stew.s sticker.n stickler.n stick.n stiff.n stigma.n stile.n stiletto.n stillbirth.n still.n stilt.n stimulant.n stinger.n sting.n stingray.n stinker.n stink.n stint.n stipend.n stir.n stirrup.n stitch.n stoat.s stockade.n stockbroker.n stockcar.n stockfish.s stockholder.n stockholding.n stockpile.n stockroom.n stock.s stockyard.n stoic.n stole.n stomach.n stonemason.n stone.s stooge.n stool.n stoop.n stopgap.n stop.n stopover.n stoppage.n stopper.n stopwatch.n storehouse.n store.n storeroom.n storey.n stork.n storm.n story.n storyteller.n stove.n stowaway.n straggler.n strainer.n strain.s straitjacket.n strait.n strand.n stranger.n stranglehold.n straphanger.n strap.n stratagem.n strategist.n strategy.s stratification.s stratosphere.n strawberry.n straw.s stray.n streak.n streamer.n streamlet.n stream.n streetcar.n street.n streetwalker.n strength.s stress.s stretcher.n stretch.s stricture.n stride.n strikebreaker.n strike.n striker.n string.s stripe.n strip.n stripper.n stroboscope.n stroke.n stroller.n stroll.n strongbox.n stronghold.n strophe.n structure.s strudel.s struggle.s strut.n stub.n stucco.s student.n studio.n stud.n study.s stuff.s stumble.n stump.n stunner.n stunt.n stupor.s sturgeon.s stutterer.n stutter.n style.s stylist.n stylization.s stylus.n sty.n subaltern.n subcomitte.n subcommittee.n subcontinent.n subcontract.n subcontractor.n subdivision.s subdomain.n subeditor.n subfamily.n subgroup.n subheading.n subject.n subjugation.s sublease.n sublimate.n sublimation.s submarine.n submission.s sub.n subordinate.n subpoena.n subscriber.n subscription.s subscript.n subsection.n subset.n subsidiary.n subsidy.n substance.s substantive.n substitute.n substitution.s substrate.n subterfuge.s subtitle.n subtlety.s subtraction.s suburb.n subversive.n subway.n succession.s successor.n success.s sucker.n suckling.n sufferer.n suffix.n suffrage.s suffragette.n sugarlump.n suicide.s suitcase.n suite.n suit.n suitor.n sultana.n sultanate.n sultan.n summary.n summation.n summerhouse.n summer.s summit.n summons.n sum.n sunbeam.n sunblind.n sunbonnet.n sunburn.s sundae.n sundial.n sunfish.s sunflower.n sunhat.n sunlamp.n sunrise.s sunroof.n sun.s sunset.s sunshade.n sunspot.n suntan.n supercomputer.n superconductor.n superfamily.n superficiality.s superfluity.s superintendent.n superior.n superlative.n supermarket.n super.n supernumerary.n superpower.n superstar.n superstition.s superstructure.n supervisor.n supper.s supplement.n supplicant.n supplication.s supplier.n supply.s supporter.n support.s suppository.n suppression.s suppressor.n surcharge.n surface.n surfboard.n surfboat.s surfeit.n surge.n surgeon.n surgery.s surname.n surplus.n surprise.s surrealist.n surrender.n surrogate.n surtax.n survey.n surveyor.n survival.s survivor.n susceptibility.s suspect.n suspender.n suture.n suzerain.n swab.n swagger.n swallow.n swamp.s swan.n swap.n swarm.n swashbuckler.n swastika.n swathe.n swath.n swearword.n sweatband.n sweater.n sweat.s sweatshop.n Swede.n sweeper.n sweep.n sweetening.s sweetheart.n sweetie.n swelling.s swell.n swerve.n swig.n swimmer.n swim.n swimsuit.s swindle.n swindler.n swineherd.n swine.s swing.n swipe.n swirl.n switchboard.n switch.n swivel.n swoon.n swoop.n swordfish.s sword.n sycamore.s sycophant.n syllable.n syllabus.n syllogism.n symbolism.s symbolization.s symbol.n sympathizer.n symphony.n symposium.n symptom.n synagogue.n synclavier.s syncopation.s syndicate.n syndrome.n synod.n synonym.n synthesizer.s syphon.n Syrian.s syringe.n syrup.s system.n tabby.n tabernacle.n tablecloth.n tablemat.n table.n tablespoonful.n tablespoon.n tablet.n tabloid.n tab.n taboo.s tabulation.s tacito.n tackle.s tack.s taco.n tactician.n tactic.n tadpole.n tag.s tailgate.n tail.n tailor.n tailpiece.n tailspin.n take-off.n takeoff.s takeover.n taker.n tale.n talent.s talisman.n talker.n talkie.n talk.s tallboy.n tally.n talon.n tamale.s tamarind.s tamboril.s tambourine.s tamburitza.s tangent.n tangerine.s tangle.n tang.n tango.n tankard.n tanker.n tank.n tan.n tanner.n tannery.n tantrum.n Tanzanian.s taper.n tape.s tapestry.s tapeworm.n tap.n taproom.n taproot.n tarantella.n tarantula.n target.n tariff.n tarogato.s tarpaulin.n tar.s tartan.n tart.n tarweed.n taskmaster.n task.n tassel.n taster.n taste.s tatter.n tattler.n tattoo.n taunt.n tau.s tautology.s tavern.n taxicab.n taxidermist.n taximeter.n taxi.n tax.n taxonomy.s taxpayer.n teacake.n teacher.n teaching.s teacup.n teahouse.n teammate.n team.n teamster.n teapot.n tear.n tearoom.n tease.n teaser.n teashop.n teaspoonful.n teaspoon.n teat.n tech.n technicality.n technician.n technique.s technocracy.s technocrat.n technologist.n technology.s teddy.n tee.n teenager.n teen.n teetotaller.n telecast.n telefax.s telegram.n telegrapher.n telegraph.n telephone.n teleprinter.n teleprompter.n telescope.n television.s telex.n teller.n telltale.n telly.n temperament.s temperature.s temper.s tempest.n template.n temple.n temp.n tempo.n temptress.n tenancy.s tenant.n tendency.n tenderfoot.n tender.n tendon.n tendril.n tenement.n tenet.n tenner.n tenoroon.s tenor.s tense.n tentacle.n tent.n tenure.s tepee.n terabyte.n tercentenary.n tercentennial.n terminal.n termination.s terminology.s terminus.n termite.n term.n tern.n terrace.n terra_cotta terrier.n territory.s terrorist.n terror.s testament.n tester.n testicle.n testimonial.n testimony.s test.n tether.n Texan.s textbook.n textile.n text.s texture.s thalamus.n thaw.n theater.s theatregoer.n theatre.s theft.s theist.n theme.n theocracy.s theologian.n theology.s theorem.n theoretician.n theorist.n therapist.n theremin.s thermal.n thermometer.n thermos.n thermostat.n thesaurus.n theta.s thicket.n thickness.s thief.n thighbone.n thigh.n thimbleful.n thimble.n thingmabob.n thingmajig.n thing.n thingumabob.n thingumajig.n thingummy.n thinker.n thistle.n thong.n thorax.n thorn.n thoroughbred.n thoroughfare.n thrall.n thrashing.n thread.s threesome.n threnody.n thresher.n threshold.n thrift.s thriller.n thrill.n throat.s throb.n throe.n throne.n throng.n throttle.s throwaway.n throwback.n thrush.n thruster.n thrust.s thud.n thug.n thumb.n thumbscrew.n thumbtack.n thump.n thunderbolt.n thunderclap.s thunderstorm.n thwart.n thyroid.n tiara.n ticket.n tick.n tic.n tidbit.n tide.s tie.n tier.n tiff.n tiger.n-m tightening.n tightrope.n tigress.n-f tilde.n tile.s tiller.n till.n tilt.n timber.s timbre.s timekeeper.n timepiece.n timer.n timetable.n timing.s timpani.s timpanist.n tinderbox.n tinge.n tingle.n tinker.n tin.s tint.n tip.n tippler.n tirade.n tire.n tissue.s titan.n titbit.n tithe.n title.n tit.n tizzy.n toad.n toadstool.n toaster.n toastmaster.n toastrack.n toast.s tobacconist.n toboggan.n toccata.n toddler.n toehold.n toe.n toenail.n toffee.s toga.n toggle.n toilet.n token.n tolerance.s tollbooth.n tollgate.n tollhouse.n toll.n tomahawk.n tomato.s tomb.n tomboy.n tombstone.n tomcat.n tome.n tom.s tomtom.n tom-tom.s tone.s tonette.s tongue.n tonic.n ton.n tonnage.s tonne.n tonsil.n tonsure.n tool.n toothache.s toothbrush.n tooth.n toothpick.n toot.n topcoat.s topic.n topmast.n top.n topper.n topping.n topsail.n torch.n toreador.n tormentor.n torment.s tornado.n torpedo.n torpor.s torque.s torrent.n torso.n tortilla.n tortoise.n torturer.n torture.s toss.n tostada.n total.n totem.n tot.n toucan.n touchdown.n touch.s touchstone.n toughie.n tough.n toupee.n tourist.n tour.n tournament.n tourney.n tourniquet.n towel.n tower.n town.s township.n towpath.n towrope.n toxicologist.n toxin.s toy.n toyshop.n tracer.n trace.s trackbed.n track.n tract.n tractor.n trademark.n trader.n trade.s traditionalist.n tradition.s trafficker.n tragedy.s tragicomedy.n trailer.n trail.n trainbearer.n trainee.n trainer.n trainload.n train.n trait.n traitor.n traitress.n-f trajectory.n tramline.n tram.n trample.n tramp.n trampoline.n tramway.n trance.n tranquillizer.n transaction.s transcendentalist.n transcription.s transcript.n transept.n transference.s transfer.s transformation.s transformer.n transfusion.s transgression.s transgressor.n transient.n transistor.n transition.s translation.s translator.n transmission.s transmitter.n transmutation.s transom.n transparency.s transplantation.s transplant.n transporter.n transport.s transposition.s transsexual.n transshipment.n transvestite.n trapeze.n trapezoid.n trap.n trapper.n trauma.s travail.s traveller.n travelogue.n traverse.n travesty.n trawler.n tray.n treadle.n treadmill.n tread.n treasurer.n treasure.s treasury.n treatise.n treatment.s treat.n treaty.s treble.n tree.n trek.n trellis.n tremble.n tremolo.n tremor.n trench.n trend.n trespasser.n tres.s trestle.n triad.n trial.n triangle.s tribe.n tribulation.n tribunal.n tribune.n tributary.n tribute.s trice.n trickle.n trick.n trickster.n tricolour.n tricycle.n trident.n triennial.n trifle.s trigger.n trill.n trilogy.n trimmer.n trimming.n trim.s Trinidadian.s trinity.n trinket.n trio.n triplet.n trip.n tripod.n tripper.n triptych.n triumph.s triumvirate.n trivet.n triviality.s trochee.n troglodyte.n troika.n trolley.n troll.n trombone.s trombonist.n tromboon.s trompeta.s trooper.n troop.n trope.n trophy.n tropic.n trot.n trotter.n troubadour.n troublemaker.n troubleshooter.n trough.n troupe.n trouper.n trouser.n trout.s trove.n trowel.n truancy.s truant.n truce.n trucker.n truck.n truelove.n truffle.n trumpeter.n trumpet.s trump.n truncheon.n trunk.n trustee.n trust.s truth.s trychel.s try.n tryst.n tsetse.n tuba.s tubax.s tube.n tuber.n tubful.n tub.n tucker.n tuck.s tuft.n tugboat.s tug.n tulip.n tumble.n tumbler.n tumbleweed.s tummy.n tumor.n tumour.n tumult.s tuna.s tune.n tuner.n tunic.n Tunisian.s tunnel.n turban.n turbine.n turbojet.n turboprop.n turbot.s turbulence.s turd.n turkey.s Turk.n turmoil.s turnaround.s turncoat.s turner.n turning.n turnip.n turnkey.n turn.n turnout.s turnover.n turnpike.n turnstile.n turntable.n turquoise.s turret.n turtledove.n turtle.n tusk.n tussle.n tutorial.n tutor.n tutu.n tuxedo.n TV.s tweed.s tweeter.n tweet.n twerp.n twig.n twinge.n twin.n twirl.n twister.n twist.n twitch.n twit.n twitter.n tycoon.n tyke.n tympanum.n typeface.n type.n typescript.n typesetter.n typewriter.n typhoon.n typist.n typographer.n tyranny.s tyrant.n tyre.n tzarina.n tzar.n udder.n Ugandan.s Ukrainian.s ukulele.s ulcer.n ultimatum.n ululation.n umber.n umbrella.n umlaut.n umpire.n unbeliever.n uncertainty.s uncle.n-m underbelly.n undercarriage.n underclass.n undercurrent.n underdog.n underestimate.n underestimation.s undergarment.n undergrad.n undergraduate.n underground.n underline.n underling.n underpass.n underpayment.s undersecretary.n underside.n understatement.s understudy.n undertaker.n undertaking.n undertone.n undertow.n undervaluation.s underworld.n underwriter.n undesirable.n undoing.n unicorn.n uniform.n unionist.n union.n unit.n universe.n university.n untouchable.n untruth.s upbraiding.n update.n upgrade.n upheaval.s upholsterer.n upland.n uppercut.n upper.n upright.n uprising.n uproar.s upset.n upshot.n upsilon.s upstart.n upsurge.n uptake.s upturn.n urchin.n urinal.n urn.n Uruguayan.s usage.s user.n use.s usher.n usurpation.s usurper.n utensil.n uterus.n utilitarian.n utility.s utmost.n utopia.s utterance.s uttermost.n vacancy.s vacationer.n vacation.s vaccination.s vaccine.s vacillation.s vacuum.n vagabond.n vagary.n vagina.n vagrant.n valediction.n vale.n valence.n valentine.n valet.n valley.n valuation.s value.s valve.n vampire.n vamp.n vandal.n vane.n vanguard.n van.n vantage.s vapour.s variable.n variant.n variation.s variety.s varnish.s varsity.s vasectomy.n vase.n vassal.n vat.n vaulter.n vault.n VCR.n vector.n vegetable.n vegetarian.n vehicle.n veil.n vein.n velocipede.n velocity.s vendetta.n vendor.n veneer.s veneration.s Venezuelan.s ventilator.n vent.n ventricle.n ventriloquist.n venture.n venue.n verandah.n veranda.n verb.n verdict.n verge.n verification.s verity.n vermilion.s vermouth.s vernacular.n verse.s version.n vertebrate.n vertex.s vertical.n vesicle.n vessel.n vestibule.n vestige.n vestment.n vest.n vestry.n veteran.n vet.n veto.n viaduct.n vial.n vibraphone.s vibraslap.s vibration.s vibrator.n vibrato.s vicarage.n vicar.n viceroy.n vice.s vicinity.s vicissitude.n victim.n victor.n victory.s victual.n videocamera.n videocassette.n video.s videotape.n vielle.s viewer.n viewfinder.n viewpoint.n vigilante.n vigil.n vignette.n vihuela.s village.n villager.n villain.n villa.n vindication.s vinegar.s vine.n vineyard.n vintage.s viola.s violation.s violet.n violinist.n violin.s violoncello.s violotta.s viol.s viper.n virginal.n virgin.n virtue.s virtuoso.n virus.s visage.n visa.n viscountcy.n viscountess.n viscount.n visionary.n vision.s visitation.n visit.n visitor.n visor.n vista.n vitamin.n vixen.n vizier.n vocabulary.s vocalist.n vocation.s vocative.n vodka.s vogue.n voice.n void.n volcano.n volleyball.s volley.n voltage.s volt.n volume.s voluntary.n volunteer.n vortex.n voter.n voucher.n vowel.n voyage.n voyager.n voyeur.n vulgarism.n vulgarity.s vulnerability.s vulture.n vulva.n wad.n wafer.n waffle.n wage.n wager.n waggoner.n waggon.n wag.n wagon.n waif.n wail.n waistband.n waistcoat.s waistline.n waist.n waiter.n wait.n waitress.n waiver.n wake.n walker.n walk.n walkout.n walkover.n walk_up walk-up.n walkup.n walkway.n wallaby.n wallet.n wallflower.n wall.n wallop.n walnut.s walrus.n waltz.n wanderer.n wand.n wank.n wanton.n warble.n warbler.n warden.n warder.n ward.n wardrobe.n warehouse.n ware.n warhead.n warhorse.n-m warlord.n warmer.n warmonger.n warpath.n warp.n warrantee.n warrant.n warranty.n warren.n warrior.n war.s warship.n warthog.n wart.n washbasin.n washboard.s washbowl.n washcloth.n washer.n washout.n washroom.n washstand.n washtub.n wasp.n wassail.n wastebasket.n wastebin.n wasteland.n waste.s watchdog.n watcher.n watchmaker.n watch.n watchtower.n watchword.n watercolour.s waterfall.n waterfowl.s waterfront.n watermark.n watermelon.s watermill.n waterproof.n watershed.n waterside.n waterspout.n watertable.n waterway.n waterworks.s watt.n wavelength.n wave.n waxwork.n wayfarer.n waypoint.n wayside.n weakling.n weakness.s weapon.n weasel.n weathercock.n weave.n weaver.n web.n website.n wedding.n wedge.n weedkiller.s weed.s weekday.n weekend.n weekly.n weevil.n weight.s weir.n welcome.n welder.n weld.n wellington.n well.n wellspring.n welsher.n welterweight.n welt.n wench.n westerner.n western.n whacking.n whack.n whale.n wharf.n wheelbarrow.n wheelchair.n wheel.n wheelwright.n whereabouts.s whiff.n whim.n whimper.n whine.n whinny.n whippersnapper.n whippet.n whippoorwill.n whip.s whirligig.n whirlpool.n whirlwind.n whisker.n whiskey.s whisk.n whisky.s whisper.n whistle.s white.s whiting.s whiz.n whodunit.n whole.n wholesaler.n whopper.n whore.n wicket.n wick.s widower.n widow.n width.s wife.n wiggle.n wig.n wigwam.n wildebeest.n willow.s windbag.n windbreaker.n windfall.n windmill.n window.n windowpane.n windowsill.n windpipe.n wind.s windscreen.n windshield.n wineglass.n wine.s wing.n wingspan.n wingspread.n wink.n win.n winner.n winter.s wipe.n wiper.n wireless.s wire.s wiseacre.n wisecrack.n wishbone.n wish.n wisp.n wisteria.s witch.n-f withdrawal.s witness.n witticism.n wizard.n-m wolfhound.n wolf.n womanizer.n-m woman.n wombat.n womb.n wonderland.n wonder.s woodcut.n woodcutter.n woodland.s woodpecker.n woodpile.n wood.s woodshed.n woodwind.n woofer.n woof.n word.n workbench.n workbook.n workday.n worker.n workforce.n workout.n workplace.n workroom.n work.s workshop.n world.n wormhole.n worm.n worry.s worshipper.n wound.n wrap.n wrapper.n wreath.n wrecker.n wreck.n wrench.n wren.n wrestler.n wretch.n wright.n wringer.n wrinkle.n wristband.n wrist.n wristwatch.n writer.n writing.s writ.n wrongdoer.n wrong.n xalam.s xi.s xylophone.s xylorimba.s yacht.n yak.n yam.n yam.s yank.n yardarm.n yard.n yardstick.n yarn.s yawn.n yea.n yearbook.n yearling.n yearning.n yell.n Yemeni.s yen.s yeomanry.n yeti.n yew.s yield.s yob.n yodeller.n yodel.n yoghourt.s yoghurt.s yogi.n yogurt.s yokel.n yoke.n yolk.s youngster.n youth.s Yugoslavian.s Yugoslav.s yuppie.n zealot.n zebra.n zenith.n zephyr.n zeppelin.n zeta.s zip.n zipper.n zither.n zodiac.n zombie.n zone.n zoologist.n zoo.n link-grammar-4.7.4/data/en/words/words.v.5.30000644000175000017500000000225011271173444017416 0ustar bloombloomagonized.v-d barged.v-d bottomed.v-d bowed.v-d breezed.v-d brimmed.v-d caved.v-d cawed.v-d cawwed.v-d clammed.v-d clowned.v-d crapped.v-d crawled.v-d crept.v-d cropped.v-d crouched.v-d cruised.v-d darted.v-d dived.v-d dove.v-d dozed.v-d drifted.v-d droned.v-d drowsed.v-d faded.v-d fizzled.v-d flocked.v-d flowed.v-d foamed.v-d ganged.v-d geared.v-d goofed.v-d gushed.v-d hurried.v-d jetted.v-d jogged.v-d jutted.v-d keeled.v-d kneeled.v-d knelt.v-d knuckled.v-d lied.v-d limped.v-d lingered.v-d listened.v-d loomed.v-d lunged.v-d lurched.v-d mellowed.v-d nestled.v-d opted.v-d peeked.v-d peered.v-d perked.v-d petered.v-d pigged.v-d pined.v-d plonked.v-d plopped.v-d puffed.v-d riffled.v-d rotted.v-d rucked.v-d sallied.v-d scooted.v-d screamed.v-d scurried.v-d seeped.v-d shacked.v-d shied.v-d shined.v-d shone.v-d shopped.v-d shriveled.v-d shrivelled.v-d skidded.v-d slacked.v-d slaved.v-d slept.v-d slimmed.v-d slinked.v-d sloped.v-d slumped.v-d soared.v-d soldiered.v-d spurted.v-d squatted.v-d stepped.v-d stooped.v-d streamed.v-d strolled.v-d strutted.v-d stumbled.v-d swooped.v-d teamed.v-d tensed.v-d toddled.v-d tramped.v-d trickled.v-d trudged.v-d veered.v-d wafted.v-d zoomed.v-d link-grammar-4.7.4/data/en/words/words.adv.40000644000175000017500000000221611526022265017560 0ustar bloombloomabdominally anally ante_meridiem anteromedially arterially axially buccally buccolingually cardiovascularly centroparietally centrotemporally contiguously cutaneously dermally dorso-ventrally ectodermally endotracheally epithelially extradurally extrahepatically incisionally inferolaterally inferoposteriorly inferotemporally intercellularly interfollicularly interictally intermolecularly interoinferiorly intestinally intra-abdominally intra-amniotically intra-arterially intra-atrially intracellularly intracerebroventricularly intradermally intragastrically intralymphatically intralymphocytically intramolecularly intramuscularly intranasally intraneuronally intraocularly intraorganically intraperitonally intraperitoneally intrapleurally intrathecally intravascularly intravitreally labially lingually linguoapically medially mesially mesothoracically neonatally neurally neuroectodermally nonsimultaneously peripherally pertrochanterically postanoxically postbulbarly posteriorly postero-anteriorly postsynaptically presynaptically proximally subcutaneously subdermally supraaortically suprabasally suprapubically thereto transversely up_and_down ventrally link-grammar-4.7.4/data/en/words/words-medical.adv.10000644000175000017500000004642311245256150021161 0ustar bloombloomaberrantly abluminally abstractly a_capite_ad_calcem accelographically acceptably acoustically acronymically acrosomally actinically adaptively adaptometrically additively adenovirally adjectively adjunctively ad_nauseam adoptively adrenergically advantageously adventitiously aerobically aesthesiometrically aetiologically affectively affirmatively affordably agee agonistically algorithmically allergologically allometrically allosterically allotopically alphanumerically amblyoscopically amnioscopically amperometrically amphotropically ana anaerobically anecdotally anesthaesiologically anesthesiologically aneurysmally angiodynographically angiographically angiologically angioscopically angiospirometrically anionically anomaloscopically anomalously antagonistically ante_cibum antenatally anteriorly anterogradely antero-inferiorly anteroinferiorly antero-posteriorly anteroposteriorly antero-superiorly anterosuperiorly anthropometrically anthropomorphically antidromically antigenically antithetically antivirally any_more any_time aortographically apically archaeologically artefactually arteriographically arteriometrically arterioscopically arthrographically arthrometrically arthroscopically artifactually asymptomatically asynchronously ataxiagraphically atomistically atraumatically attentionally audiovisually auditorily aurally auscultoscopically autocatalytically autogenously autonomically autonomously autoradiographically autosomally autotrophically averagely aversively axenically axonally bacterially bacteriologically baculovirally balefully ballistocardiographically basally basolaterally biannually bibliographically bidimensionally bifunctionally bimanually bimodally binocularly biomechanically biomedically biometrically biophysically bioptically bioreductively biospecifically biosynthetically biphasically bivariately bronchoscopically bronchospirometrically calorimetrically canonically capillaroscopically capnographically capnometrically cardiodynametrically cardiointegraphically cardiologically cardiophonically cardioscopically cardiotocographically cartographically cataclysmally catalytically catastrophically caudally cavographically cellularly centrifugally centrifugationally centripetally centro-parietally centro-symmetrically centrosymmetrically centro-temporally cheerlessly chemotactically chemotaxonomically chemotrophically chirally chloridometrically cholangiographically cholangioscopically cholecystographically choledochoscopically cholinergically chromatographically chromoradiometrically chromosomally chronometrically chronomyometrically chronotropically cineangiographically cinefluoroscopically cinematographically cineradiographically circularly circumferentially circumstantially cladistically clinicopathologically clonally clonotypically coagulantly coaxially coincidently cold-bloodedly cold-heartedly collaboratively collegially colonoscopically colorimetrically colposcopically combinatorially compactly compimetrically complementarily complexly concentrically concertedly concomitantly concordantly conformally conformationally congenitally conjointly consensually constitutively contourographically contralaterally convergently convolutely coordinately coronally cortically cosmetically cotranslationally coulometrically covalently cross-reactively crossreactively cross_sectionally cross-sectionally cryometrically crystallographically curatively curvilinearly cyclically cyclonically cystically cystometrically cystoscopically cystourethroscopically cyto-architecturally cytoarchitecturally cytofluorimetrically cytofluorographically cytogenetically cytologically cytometrically cytomorphologically cytopathologically cytophotometrically cytoplasmically cytotoxically definitively deleteriously demographically de_novo densitometrically dependantly dependently dermatoscopically despitefully desultorily detectably deterministically developmentally diagnosably diagnostically dialectically dialytically diastereomerically dichotomously dihedrally dilatometrically dimensionally diopsimetrically dioptometrically diplopiometrically directionality directionally directoscopically direfully discontinuously discordantly discrepantly disparately disproportionally disquietingly distally diurnally divergently dolorimetrically dominantly dorsally dorsoventrally dosimetrically d.p. dually duodenoscopically dyadically dynographically eccentrically echocardiographically echoencephalographically echographically echoophthalmographically echotomographically eclectically econometrically ectopically edematogenically effectually egomaniacally eikonometrically ektacytometrically electively electro-acoustically electroacoustically electrobasographically electrocardiocontourographically electrocardiographically electrocardioscopically electrochemically electrocorticographically electroencephalographically electroencephaloscopically electrogastrographically electroglottographically electrogoniometrically electrographically electrohydraulically electromagnetically electromanometrically electromechanically electromicroscopically electromyographically electroneurographically electroneuromyographically electron-microscopically electronmicroscopically electronystagmographically electrooculographically electrophonocardiographically electrophorectically electrophoretically electrophysiologically electropupillographically electrostatically electrosurgically embryologically emergently empathetically empathically enantiomerically en_bloc encephalographically encephaloscopically endobronchially endocrinologically endodontically endogenously endonasally endonucleolytically endoradiographically endoscopically endosmotically endourologically en_face en_passant enterally enterically enthalpically entomologically entoptoscopically entropically enzymatically enzymically enzymocytochemically epicutaneously epidemiologically episodically episomally epistatically equipotently equivalently equivocally ergometrically ergonomically ergospirometrically esthesiometrically etiologically etiopathogenetically etymologically evolutionally evolutionarily excisionally exocyclically exogenously expandingly expectedly expeditionally expeditionaly expeditiously expensively ex_planta exploratively extra-cellularly extracellularly extrathymically ex_vivo facultatively feelingly fenestrometrically ferrokinetically fetascopically fiberscopically figurally filtrometrically firstly fluorescently fluorimetrically fluorometrically fluorophotometrically fluoroscopically focally foetascopically forensically for_ever fractally fractionally fragmentographically frictionally fro frontally futuristically gastroduodenoscopically gastroenterologically gastrographically gayly genomically genotypically geochemically geomagnetically gerontologically gerontopsychiatrically gestationally gesturally gingivally glucometrically glycosidically goniometrically gonioscopically Grad. gravitationally gustometrically gynecologically haemacytometrically haematofluorometrically haematologically haematopoetically haematopoietically haemodynamically haemoglobinometrically haemolytically haemorheologically haemorrheologically haemostatically half-maximally halfmaximally hand_to_knee haptically harmlessly head_first head-first headfirst heedfully heedlessly heel_to_knee helically hemacytometrically hematofluorometrically hematologically hematopoetically hematopoietically hemodynamically hemoglobinometrically hemolytically hemorheologically hemorrheologically hemostatically hepatically hereof hereto herniographically heterogeneously heterogenously heterologously heterosexually heterosynaptically heterotopically heterotrophically heterotypically heterozygously hierarchically histoautoradiographically histo-cytologically histocytologically histogenetically histologically histometrically histomorphologically histomorphometrically histopathologically histo-structurally histostructurally histotypically hn holographically homeostatically homogeneously homologously homosexually homotypically homozygously hormonally humanistically humorally hydrodensitometrically hydrolytically hydrophobically hydropically hydroponically hyperacutely hyperbolically hyperosmotically hyperoxically hyperreflexically hypersensitively hypoxically hysteroscopically iatrogenically iconically iconographically ictally idiotypically immunobiologically immunochemically immunocyto-chemically immunofluorometrically immunogenetically immunohistochemically immunohistologically immunologically immunomorphologically immunospecifically inaptly inaudibly incrementally indecorously in_dies indigenously inducibly inductively industrially inertially inexcusably in_extenso infero-laterally infero-medially infero-posteriorly infero-temporally infiltratively infrahepatically in_fundo inhibitorily inhomogeneously in_lieu inotropically insecticidally inseparably insertionally inside-out insignificantly insofar interactively interatomically interferometrically intergenerically intermediately interpretatively interpretively interstitially intraabdominally intra-amnionically intraamnionically intraamniotically intraaortically intraarterially intraarticularly intra-cellularly intracerebrally intracervically intracolonically intracortically intracranially intraduodenally intra-epidermally intraepidermally intra-epithelially intraepithelially intrahypothalamically intra-individually intraindividually intrajejunally intralesionally intraluminally intramurally intra-muscularly intra-operatively intraoperatively intraorally intraportally intrarenally intrasplenically intratracheally intratypically intra-venously intravitally intriguingly intrusively invasively invertedly in_vitro in_vivo iontophoretically ipsilaterally irrevocably ischemically isometrically isotachophoretically isothermally isotopically isotropically iteratively karyotypically keratoscopically kinaesthesiometrically kinematically kinesimetrically kinesthesiometrically kinetically laminagraphically laparoscopically laryngostroboscopically latently legalistically lensometrically lethally likewise limitedly linguo-apically lithometrically lithoscopically lumboscopically luminometrically lymphangiographically lymphographically lymphoscintigraphically lytically macroscopically magnetocardiographically magnocellularly mammographically manipulatively mechanographically mechanomyographically meiotically metabolically metamorphically metastatically microanalytically microanatomically microangiographically microbially microbiologically microcalorimetrically microchemically microdensitometrically microelectrophoretically microfluorometrically microgasometrically microiontophoretically microneurographically microphotometrically microradiographically microspectrofluorometrically microspectrophotometrically microsurgically midsystolically mineralogically mirthlessly mitochondrially mitotically molecularly monocularly monophasically monotonically morphologically morphometrically motorically muscularly mutagenically myeloscopically nasographically nasopharyngoscopically nasoscopically natally natively negligibly neoplastically nephrologically nephroscopically neurobiologically neurochemically neurographically neurolinguistically neuronally neuropathologically neuropsychologically neurovascularly noncompetitively nonconventionally noncovalently noncyclically nonenzymatically nongenetically nonhaematologically nonhematologically nonimmunologically non-invasively noninvasively non-isotopically nonisotopically nonmetastatically nonmetrically non-occupationally nonoccupationally non-operatively nonoperatively nonosmotically non-pharmacologically nonpharmacologically nonpolymorphically nonpsychiatrically non-randomly nonrandomly non-sexually nonsexually nonsignificantly non-simultaneously nonsurgically nosographically nuclearly nystagmographically obligatorily observerscopically occcasionally occupationally octahedrally oculographically oculoplethysmographically odynometrically oft o.h. olfactometrically o.m. om omnicardiographically omni_nocte oncometrically one-sidedly operationally operatively ophthalmodiaphanoscopically ophthalmodiastimetrically ophthalmodynamometrically ophthalmofunduscopically ophthalmographically ophthalmoleucoscopically ophthalmoleukoscopically ophthalmometrically ophthalmometroscopically ophthalmotonometrically ophthalmotropometrically oppositely optoelectronically optometrically optomyometrically orchidometrically ordinately organismically orogastrically orthotopically oscillographically oscillometrically oscillotonometrically osmometrically osmoscopically osmotically osteosynthetically otoacoustically otomicroscopically otoscopically out_of_doors over-ridingly oxidatively pachymetrically panendoscopically pantographically para-arterially paraarterially paracentrically paradigmatically paramagnetically parasitologically parasystolically parenterally pari_passu parthenogenetically parturiometrically pathomorphologically pelvimetrically pelviscopically penetrometrically pentagonally peranally per_annum per_anum per_cent per_contiguum per_continuum percutaneously per_cutem perforce perinatally periodontally perioperatively periplasmically peritoneally peritoneoscopically peritrichously perorally per_os per_primam per_primam_intentionem per_rectum per_saltum per_se per_secundam per_secundam_intentionem per_tertiam pertinently per_tubam per_vaginam per_vias_naturales petechiometrically phaneroscopically pharmaceutically pharyngoscopically phenotypically phoniatrically phonostethographically phorometrically photoacoustically photochemically photofluorometrically photofluoroscopically photomicrographically photoplethysmographically phototachometrically phototactically phototrophically phylogenetically physiologically physiotherapeutically piezoelectrically placentally planigraphically planimetrically plethysmographically pluralistically pneumatographically pneumotachographically p.o. po P.O. polycardiographically polyclonally polygraphically polysomnographically polyspermically post-catheterisation postcatheterisation post_cibos posteroanteriorly postischaemically postischemically postmetamorphically post_mortem postnatally post_operatively post-operatively post_partum postprandially post_singulas_sedes_liquidas postthrombotically posttranscriptionally post-translationally posttranslationally potentiometrically pow pre-attentively preattentively precociously preconceptionally predominately preferentially preliminarily premenopausally prenatally pre-operatively presumptively prethymically prevalently p.r.n. proctosigmoidoscopically prolately prophylactically pro_rata pro_re_nata prospectively proteolytically prototypically psychiatrically psychoanalytically psychometrically psychotically pulselessly pupillographically pupillometrically pyeloscopically pyrolytically pyrometrically pyroscopically quaque_nocte radiatively radioactively radiobiologically radiocardiographically radiochemically radiochromatographically radioenzymatically radiogenically radiographically radioimmunologically radiologically radiolytically radiotelemetrically rakishly reactively recessively reciprocally rectally reflexively regardless renographically reproducibly resectoscopically retinoscopically retrogradely retrovirally revengefully reversely rheologically rheumatologically rhinoanemometrically rhinomanometrically ritardando roentgenographically rostrally rostrocaudally rotametrically rotationally ruminally saprophytically satisfyingly scandalously scintigraphically secundum_artem secundum_naturam sedimentometrically segmentally semiautomatically semiologically semi-quantitatively semiquantitatively semispecifically serendipitously serologically serospecifically shoddily sialographically siderose sigmoidally sigmoidoscopically simplistically sinusoidally skeletally sketchily skiascopically s.l. sociodemographically sociometrically somatically some_day sonographically soundlessly spatiotemporally spectrally spectrofluorimetrically spectrographically spectrophotometrically spectroscopically speculatively spheroidally sphincteroscopically sphygmocardiographically spinally spinelessly spiritlessly spirographically stably stereologically stereometrically stereomicroscopically stereophotogrammetrically stereospecifically stereotactically stereotaxically sterically stertorously stethographically stoichiometrically stolidly subchronically subepithelially sublethally sublingually submaximally suboptimally subperiodically subserosally subtotally sudorimetrically sulkily superparamagnetically supportively supranormally supraphysiologically supratubercular symptomatically synaptically synchronously synergistically systemically tachometrically tandemly td tearlessly telediastolically telemetrically telephonically telethermometrically temporally tendentiously ter_dia tetanically tetragonally tetrahedrally thalamically thematically thence thereof therewith thermodynamically thermographically thermometrically thermostatically thioyltically thoracoscopically thrice thromboelastographically thrombometrically tid tocodynamometrically tomodensitometrically tomographically tonally tonically tonographically tonometrically tonoscopically topologically tracheally transcardially transcranially transcriptionally transcrotally transiently translaryngeally transmurally transovumly transplacentally transpylorically transrectally transstadially transtadially transtelephonically transvaginally transvenously traumatically traumatologically tremographically triadically tropometrically troposcopically typoscopically ubiquitously ultrasonically ultrasonographically ultrastructurally unaggressively unclearly uncompetitively uniparentally univalently univariately unnaturally unphysiologically unpredictably unproblematically unrealistically unsympathetically unsystematically upside_down ureterorenoscopically ureteroscopically urethrographically urethrometrically urinometrically urodynamically uroflowmetrically usefully vagally vaginally vaginometrically vaginoscopically validly variably vascularly vectorcardiographically vectorially velocimetrically venographically ventriculographically ventriculo-peritoneally ventriculoscopically vibrometrically vibrophonocardiographically vice_versa videodensitometrically videomicroscopically vilely virally viscometrically visuometrically vitreally viz. voltammetrically volubly voluptuously wastefully willfully wrathfully xenically xeromammographically xeroradiographically zygotically zymographically link-grammar-4.7.4/data/en/words/words.v.2.20000644000175000017500000003567111526022265017424 0ustar bloombloomabdicates.v abides.v aborts.v abrades.v accelerates.v acclimates.v acclimatizes.v acculturates.v accumulates.v acidifies.v adapts.v adjourns.v adjudicates.v adjusts.v advances.v advertises.v aerosolizes.v affiliates.v ages.v agglutinates.v aggregates.v agitates.v aglomerates.v ails.v aligns.v aliments.v alkalifies.v allies.v alternates.v alters.v amalgamates.v Americanizes.v anastomoses.v anchors.v anergizes.v ankyloses.v anteverts.v apostrophizes.v appeals.v applauds.v applicates.v applies.v approaches.v approximates.v arbitrates.v arborizes.v arches.v archs.v articulates.v arylates.v ascends.v assembles.v assimilates.v assists.v associates.v attaches.v attends.v auditions.v augurs.v autoactivates.v autocatalyzes.v autocorrelates.v autodigests.v autolyzes.v automatizes.v autophosphorylates.v autosensitizes.v autotransfuses.v avails.v awakens.v axenizes.v bags.v baits.v bands.v banks.v bargains.v barters.v bathes.v baths.v bats.v baulks.v benefits.v berths.v bicompartmentalizes.v bids.v bifurcates.v bioaccumulates.v biotests.v blabs.v blackens.v blacklegs.v blanches.v blanchs.v blasphemes.v bleaches.v bleachs.v blends.v blinks.v blisters.v bluffs.v blurs.v boggles.v bonds.v bones.v bootlegs.v bops.v borders.v borrows.v botanizes.v bottle-feeds.v bowdlerizes.v breastfeeds.v breeds.v brews.v bridles.v broadcasts.v broadens.v broils.v bronchodilates.v browns.v bruxs.v budges.v buffets.v buggers.v bullies.v burglarizes.v burgles.v burnishes.v burnishs.v burrows.v cables.v calcifiess.v calcifies.v calcines.v cambers.v cancerizes.v canvasses.v capitalizes.v capsizes.v carps.v catabolizes.v catenates.v cationizes.v celebrates.v centers.v centres.v chants.v chars.v chelates.v circles.v circulates.v clangs.v claps.v clasps.v clavelizes.v cleaves.v clicks.v clinches.v clinchs.v clinks.v cloies.v clots.v cloys.v clutches.v clutchs.v coacervates.v coaches.v coagglutinates.v coaggregates.v coagulates.v coamplifies.v coarctates.v coarsens.v coaxes.v codistributes.v coextracts.v cofractionates.v cogitates.v coincubates.v coinjects.v coinsures.v collapses.v collimates.v co-localises.v colocalises.v co-localizes.v colocalizes.v combines.v cometabolizes.v commences.v commingles.v communicates.v commutes.v compares.v compensates.v composes.v computes.v concentrates.v conceptualizes.v condenses.v conducts.v confederates.v confers.v confides.v congests.v conjoins.v conjugates.v consolidates.v constipates.v consults.v contests.v contrasts.v contributes.v convenes.v converts.v copartitions.v coprecipitates.v copurifies.v coregisters.v correlates.v corrodes.v corrugates.v corrupts.v cosediments.v costains.v co-stars.v costars.v couches.v counter-attacks.v counterattacks.v counterindicates.v countermines.v crashes.v crash-lands.v craves.v creases.v creosotes.v cribs.v crinkles.v crisscrosses.v crochets.v croons.v cross-checks.v crosschecks.v cross_fertilizes crosslinks.v cryosections.v crystallizes.v cuddles.v cumulates.v curdles.v curses.v curves.v dabs.v damps.v dangles.v daps.v darkens.v darns.v dates.v de-acidifies.v deacidifies.v de-adapts.v deadapts.v de-aggregates.v deaggregates.v de-alcoholizes.v dealcoholizes.v de-allergizes.v deallergizes.v debarks.v debates.v de-bonds.v debonds.v de-branchs.v debranchs.v decelerates.v de-cidualizes.v decidualizes.v de-clamps.v declamps.v decomposes.v de-condenses.v decondenses.v de-conditions.v deconditions.v de-congests.v decongests.v de-conjugates.v deconjugates.v de-constructs.v deconstructs.v decreases.v de-crepitates.v decrepitates.v de-differentiates.v dedifferentiates.v deepens.v de-epithelializes.v deepithelializes.v de-fibrinogenates.v defibrinogenates.v deflects.v de-fluorinates.v defluorinates.v de-gloves.v degloves.v de-glycosylates.v deglycosylates.v de-granulates.v degranulates.v de-humidifies.v dehumidifies.v de-iodinates.v deiodinates.v delays.v delights.v de-masculinizes.v demasculinizes.v democratizes.v de-morphinizes.v demorphinizes.v de-naturates.v denaturates.v departmentalizes.v de-phases.v dephases.v de-polarizes.v depolarizes.v de-polymerizes.v depolymerizes.v de-proteinizes.v deproteinizes.v de-quenchs.v dequenchs.v derails.v derives.v derogates.v de-saturates.v desaturates.v descends.v de-squamates.v desquamates.v de-stabilizes.v destabilizes.v de-synchronizes.v desynchronizes.v detonates.v de-toxifies.v detoxifies.v develops.v de-vitrifies.v devitrifies.v dialyzes.v dichotomizes.v dictates.v differentiates.v diffuses.v digests.v digitalizes.v digitilizes.v dilates.v dimerizes.v diminishes.v diminishs.v dims.v dins.v dips.v disarms.v disarticulates.v disbands.v discases.v discharges.v discolors.v discontinues.v disengages.v disentangles.v disincorporates.v disinflates.v disjoins.v dismounts.v dispenses.v disperses.v dissimulates.v dissipates.v dissolves.v distends.v distills.v distinguishes.v distinguishs.v disunites.v dive-bombs.v diversifies.v diverticulizes.v divines.v docks.v dodges.v dogmatizes.v dorsalizes.v dorsiflexs.v double-clicks.v downsizes.v dreads.v dribbles.v drills.v drips.v droops.v dulls.v dynamizes.v dysmyelinates.v echoes.v echos.v effluxs.v effuses.v ejaculates.v ejects.v elaborates.v electroblots.v electrocoagulates.v electrodialyzes.v electroejaculates.v electrofocuses.v electrofocusses.v electrofocuss.v electrotypes.v elongates.v embolizes.v embrittles.v embroiders.v emplanes.v encapsidates.v encysts.v endocytoses.v endothelializes.v ends.v endures.v engages.v engorges.v enlists.v enrolls.v enrols.v enters.v entertains.v entrenchs.v enunciates.v epimerizes.v epoxidates.v erodes.v escalates.v escapes.v esterizes.v etches.v etchs.v etiolates.v euhydrates.v evacuates.v evolves.v exaggerates.v excysts.v exercises.v exfoliates.v exhales.v exogastrulates.v expands.v expectorates.v explodes.v explores.v expounds.v expresses.v extemporizes.v extends.v extrapolates.v extravasates.v exuviates.v famishes.v farrows.v fastens.v feasts.v federates.v ferments.v ferries.v fibrillates.v fiddles.v fields.v films.v fissurates.v fistulizes.v fits.v fixates.v flags.v flaps.v flashes.v fledges.v flees.v flexes.v flocculates.v flocs.v flosses.v fluidifies.v fluorinates.v focalizes.v focuses.v focusses.v focuss.v foliates.v foots.v forbears.v force-lands.v forecloses.v forgives.v forms.v founders.v foveates.v fractures.v frays.v fronts.v frosts.v fructifies.v fudges.v fulgurates.v fumbles.v furls.v fuses.v gags.v gains.v gambles.v gams.v gants.v gargles.v gasifies.v gasps.v gazumps.v gelatinizes.v generalizes.v germinates.v gestates.v gimps.v glances.v globalizes.v glosses.v glucoronizes.v glucosylates.v gnashes.v gnashs.v gnaws.v governs.v granulates.v grasps.v grates.v grieves.v groans.v gropes.v grounds.v groups.v growls.v grumbles.v grunts.v hails.v haploidizes.v hardens.v harmonizes.v hatches.v hatchs.v heaves.v heckles.v hectors.v hedges.v heightens.v hemagglutinates.v hemoagglutinates.v hemocoagulates.v hemolyzes.v hems.v heterotransplants.v hoards.v hoes.v honks.v hoots.v howls.v hugs.v humidifies.v hums.v hurts.v hushes.v hushs.v hustles.v hybridizes.v hydrates.v hydrolyzes.v hyperarticulates.v hypercoagulates.v hyperhydrates.v hyperinflates.v hypermodifies.v hyperphosphorylates.v hyperpolarizes.v hyperproliferates.v hypersensitizes.v hyperventilates.v hypohydrates.v hypomethylates.v hyposecretes.v hypoventilates.v ices.v idles.v ignites.v immunomodulates.v immunoprecipitates.v implodes.v imprecates.v improves.v improvises.v incepts.v inclines.v incorporates.v increases.v incubates.v indents.v indulges.v indurates.v industrializes.v infibulates.v infolds.v infringes.v inhales.v initiates.v inosculates.v insonates.v intensifies.v interbreeds.v interconnects.v intercorrelates.v interlocks.v intermixes.v intermixs.v interns.v interpenetrates.v interprets.v interrelates.v interrupts.v intersects.v intertwines.v interviews.v intravasates.v intrigues.v intussuscepts.v invaginates.v investigates.v invests.v invigilates.v iodizes.v ionizes.v isografts.v isomerizes.v jabs.v jags.v jangles.v jeers.v jiggles.v jigs.v jingles.v jolts.v jostles.v juggles.v keratinizes.v kids.v kindles.v knits.v labilizes.v labors.v labours.v lactonizes.v laments.v lands.v latches.v latchs.v lateralizes.v launches.v launchs.v lectures.v left-clicks.v lengthens.v lessens.v levitates.v ligands.v liquefies.v liquidates.v litigates.v litters.v lobbies.v lobulates.v localises.v localizes.v locates.v lodges.v luminesces.v lunches.v lunchs.v luteinizes.v lyses.v macerates.v mainlines.v maldigests.v malrotates.v maneuvers.v manoeuvres.v marbleizes.v marinates.v masses.v masturbates.v mates.v medializes.v mediates.v meets.v melds.v meliorates.v mends.v merges.v meshes.v meshs.v metallizes.v metricizes.v micellizes.v microembolizes.v microencapsulates.v mills.v mimes.v mines.v misaligns.v misarticulates.v miscalculates.v miscarries.v miscounts.v misdeals.v misfolds.v misjudges.v mistimes.v mists.v misunderstands.v moans.v mobilizes.v moderates.v modernizes.v moistens.v moons.v mottles.v moulds.v moults.v mounts.v mourns.v mows.v muddles.v multimerizes.v multiplicates.v multiplies.v mumbles.v munches.v munchs.v murmurs.v muscularizes.v mutates.v myelinates.v narrows.v navigates.v nears.v necrotizes.v negotiates.v nephrectomizes.v nibbles.v nips.v nitrogenizes.v nucleates.v nuzzles.v obeys.v obsesses.v occludes.v ogles.v opacifies.v operates.v opsonizes.v orbits.v originates.v ossifies.v outbids.v outspans.v overarchs.v overbalances.v overcalls.v overcharges.v overclouds.v overdraws.v overdresses.v overfeeds.v overfills.v overflows.v overheats.v over-indulges.v overindulges.v overlaps.v overproduces.v overproliferates.v overreaches.v overreachs.v overreplicates.v oversecretes.v overspends.v overstretchs.v overtrains.v overtranscribes.v overtrumps.v overturns.v overworks.v oviposits.v oxidates.v oxidizes.v paces.v paddles.v parades.v parks.v parses.v particularizes.v parts.v passivizes.v pathergizes.v peals.v pecks.v peculates.v pedals.v peddles.v pends.v penetrates.v peptonizes.v perches.v perchs.v performs.v peroxidizes.v petitions.v petrifies.v phenolizes.v phlebotomizes.v photodegrades.v photodissociates.v photoisomerizes.v photolyzes.v photooxidizes.v photoreactivates.v pickets.v pillages.v pinocytoses.v pioneers.v pitches.v pitchs.v placers.v plasticizes.v plunders.v poaches.v poachs.v poises.v polls.v poses.v power-dives.v practises.v preaches.v preachs.v preactivates.v precontracts.v preincubates.v preplans.v presurfaces.v pretests.v pringles.v privatizes.v programmes.v projects.v promenades.v pronates.v proof_reads proofreads.v propagates.v protonates.v prowls.v pseudonormalizes.v pukes.v punctures.v punts.v purls.v pustulates.v putts.v puzzles.v qualifies.v quickens.v quietens.v racemizes.v races.v radiates.v radios.v rallies.v ramifies.v rancidifies.v ranges.v ranks.v raps.v rates.v rattles.v ravels.v reactivates.v reacylates.v readapts.v readjusts.v reanneals.v reapplies.v rearms.v rearrests.v rears.v reassembles.v reawakens.v rebleeds.v rebreathes.v rebreeds.v rebuilds.v recalculates.v recants.v recapitulates.v recaps.v receives.v recements.v recharges.v reciprocates.v recolonizes.v recommences.v recomputes.v reconfirms.v reconnects.v reconvenes.v reconverts.v recovers.v recrosses.v recruits.v recrystallizes.v recurves.v reddens.v redifferentiates.v redissolves.v redoubles.v reelevates.v reendothelializes.v reenters.v reepithelializes.v reequilibrates.v reeves.v reexpands.v refers.v refits.v reflates.v refloats.v refocuses.v refocusses.v refocuss.v re-forms.v reforms.v refreezes.v refs.v refuels.v regenerates.v registers.v regroups.v regrows.v rehearses.v rehydrates.v reincorporates.v reincubates.v reinduces.v reinflates.v reinfuses.v reinvestigates.v reinvests.v reirradiates.v rekindles.v relates.v relaxes.v relaxs.v relocates.v remarries.v remeasures.v remineralizes.v remits.v remobilizes.v remounts.v renegotiates.v reoccludes.v re-opens.v reopens.v reoperates.v reorders.v reorganizes.v reoxidizes.v repacks.v repairs.v rephosphorylates.v repolarizes.v reprises.v reprobes.v reproduces.v reseeds.v resensitizes.v resettles.v resigns.v respirates.v restarts.v restitutes.v resumes.v resuscitates.v retails.v retests.v rethromboses.v retires.v retools.v retrotransposes.v retrudes.v returns.v reunifies.v reunites.v reventilates.v reverses.v revives.v rhymes.v ricochets.v right-clicks.v rigidifies.v roams.v roars.v roasts.v rotates.v rouses.v rows.v ruffles.v ruptures.v rustles.v sacrifices.v salutes.v saponifies.v scans.v scatters.v scissors.v scleroses.v scoffs.v scolds.v scores.v scrambles.v scrawls.v scribbles.v scrubs.v sculls.v sculptures.v searches.v searchs.v seizes.v senesces.v separates.v serrates.v severs.v shades.v shams.v shatters.v shells.v shop-lifts.v shoplifts.v short-circuits.v shortens.v shoves.v showers.v shrieks.v shrinks.v shuffles.v sifts.v singes.v sinks.v sinusoidalizes.v sips.v skeletonizes.v skews.v slams.v slants.v sledges.v slenderizes.v sloshes.v sloshs.v smacks.v smears.v smokes.v smudges.v snarls.v snips.v snorts.v snuggles.v socializes.v solidifies.v somatizes.v sows.v spalts.v spatters.v spawns.v spies.v spiralizes.v splashes.v splashs.v splays.v splinters.v spoils.v sponges.v sports.v spouts.v spreadeagles.v spring-cleans.v squashes.v squashs.v stabilises.v stabilizes.v stains.v stalls.v stammers.v stampedes.v steadies.v steepens.v steeps.v steers.v stews.v stifles.v stings.v stints.v stipples.v stonewalls.v strains.v stratifies.v streaks.v strengthens.v strobes.v strums.v stumps.v subcontracts.v subdivides.v subducts.v subleases.v sublets.v submerges.v submits.v substitutes.v succeeds.v sues.v suffers.v suffocates.v summates.v superheats.v superinfects.v superovulates.v supervises.v supinates.v supplicates.v surrenders.v survives.v swallows.v swaps.v sways.v sweats.v swishes.v swishs.v swivels.v synchronizes.v synergizes.v tackles.v tans.v taps.v tarnishes.v tarnishs.v tautomerizes.v telephones.v terminates.v tetramerizes.v thaws.v thermalizes.v thieves.v thrashes.v thrashs.v threshs.v thrills.v thromboses.v throngs.v throttles.v thrums.v thumps.v thunders.v tickles.v tilts.v tines.v tings.v titivates.v titrates.v toasts.v toots.v traces.v trades.v transaminates.v transcomplements.v transcytoses.v transfers.v transgresses.v translates.v transplants.v trawls.v treats.v trebles.v triages.v trimerizes.v trots.v troubleshoots.v trumpets.v trumps.v tuberculizes.v tugs.v tums.v twangs.v twirls.v ulcerates.v umpires.v unbends.v uncoats.v uncoils.v uncurls.v underbids.v undercorrects.v underfeeds.v underprescribes.v underreports.v underspends.v undresses.v unfastens.v unfolds.v unhitches.v unhitchs.v unifies.v unionizes.v unites.v unknots.v unloads.v unlocks.v unpacks.v unravels.v unrolls.v unscrews.v unstresses.v unties.v untwists.v unwinds.v unwraps.v uploads.v urbanizes.v vaporizes.v varicellizes.v varies.v vasodilates.v ventures.v versifies.v verts.v vesicates.v vesiculates.v vests.v vibrates.v visits.v vitrifies.v vituperates.v vociferates.v volatilizes.v volleys.v vomits.v wades.v waggles.v wags.v wails.v wakens.v warps.v waters.v waxes.v waxs.v weakens.v weds.v welds.v wheals.v wheels.v whines.v whirls.v whistles.v whitens.v whittles.v whorls.v widens.v wiggles.v withdraws.v worsens.v worships.v wrestles.v wrinkles.v yells.v yields.v yodels.v link-grammar-4.7.4/data/en/words/words-medical.v.4.50000644000175000017500000012471411526022265021022 0ustar bloombloomabashing.g abjuring.g ablating.g abnegating.g abominating.g abounding.g abscessing.g abscising.g absenting.g abstaining.g acccoutering.g accessioning.g acclimatising.g accoupling.g accoutring.g acetifying.g acetonating.g acetonizing.g acetylating.g acetylising.g acetylizing.g achromatising.g achromatizing.g acidulating.g acing.g actualising.g actualizing.g actuating.g acylating.g adducting.g adenosine_diphosphate-ribosylating adjuring.g administrating.g admixing.g ADP-ribosylating.g adrenalectomizing.g adsorbing.g adulating.g advantaging.g afforesting.g affronting.g afterloading.g agglomerating.g aggrieving.g agonising.g airbrushing.g alcoholising.g alcoholizing.g aliasing.g alining.g aliquoting.g alkalinising.g alkalinizing.g alkalising.g alkalizing.g alkylating.g allelotyping.g allergizing.g allografting.g alloimmunising.g alloimmunizing.g allotransplanting.g alloying.g alluring.g alphabetising.g alphabetizing.g aluminating.g Americanising.g amidating.g aminating.g aminoacylating.g ammoniating.g amortising.g anaesthetising.g anatomizing.g anergising.g anesthetising.g anglicising.g animadverting.g annualising.g annualizing.g annunciating.g anodising.g anodizing.g anonymising.g anonymizing.g anoxiating.g antagonising.g anteriorising.g anteriorizing.g antiaggregating.g anticoagulating.g antigenising.g antigenizing.g anting.g antirepressing.g antisepticising.g antisepticizing.g apeasing.g apodizing.g apologising.g apostatising.g appaling.g appareling.g apparelling.g apporting.g apposing.g apprizing.g arborising.g archiving.g arcing.g arcking.g aromatising.g aromatizing.g arsonating.g arterializing.g articling.g asexualizing.g asperging.g aspersing.g asseverating.g asterisking.g atomising.g attitudinising.g audiotaping.g auscultating.g authoring.g autocatalysing.g autoclaving.g autogenerating.g autoimmunising.g autoimmunizing.g autoinducing.g autoinducting.g autoinjecting.g autolising.g automatising.g auto-oxidising.g autoperfusing.g autopsying.g autoradiographing.g autoregulating.g autosensitising.g autotransplanting.g auxotyping.g avalanching.g avianising.g avianizing.g avowing.g avulsing.g awaking.g aweing.g axotomising.g axotomizing.g azotizing.g baaing.g babying.g baby-siting.g baby-sitting.g backcrossing.g backdroping.g backdropping.g backlabeling.g backlabelling.g backscattering.g baing.g ballasting.g balling.g balloting.g bamming.g bandpass_filtering baptising.g barbering.g barbing.g bariumizing.g barnstorming.g barracking.g barraging.g barreling.g bastardizing.g bayoneting.g beaching.g beading.g bearding.g beavering.g bedaubing.g bedding.g bedecking.g bedeviling.g behooving.g behoving.g beleaguering.g belling.g bench_pressing beneficing.g benzoylating.g bereving.g besetting.g besmearing.g betrothing.g bettering.g beveling.g biassing.g bibbing.g bickering.g bicompartmentalising.g binging.g bioactivating.g bioassaying.g bioconverting.g bioengineering.g biomagnifying.g bio-monitoring.g biomonitoring.g biopsying.g bioreducing.g bioremediating.g biosynthesising.g biosynthesizing.g biotinylating.g biotransforming.g biotyping.g bisintercalating.g bivouacking.g blacking.g blancoing.g blanking.g blathering.g blobbing.g blooding.g bloodying.g blueing.g bluing.g blustering.g boating.g bobsleding.g boobing.g boomeranging.g boostering.g bootstraping.g bootstrapping.g bottlenecking.g braining.g brain-washing.g brawling.g brazing.g breakfasting.g breast-feeding.g breasting.g breveting.g brevetting.g broadsiding.g brodding.g bromating.g brominating.g bromizing.g bruiting.g brutalising.g bucketing.g buffering.g bulbectomizing.g bulking.g bulling.g bunkering.g burgeoning.g burking.g burring.g bursting.g busing.g bussing.g caching.g caking.g calendering.g calipering.g calking.g callipering.g calumniating.g canalizing.g cancelling.g cancerising.g candying.g cankering.g canning.g cannulating.g cannulizing.g canopying.g cantilevering.g canting.g capacitating.g capillarising.g capitalising.g capitating.g caponising.g caponizing.g captaining.g carbamoylating.g carbamylating.g carbolating.g carbolising.g carbolizing.g carbonating.g carbonising.g carboxylating.g cardiectomizing.g careering.g cartooning.g cashiering.g catabolising.g catalase_testing catalising.g catalizing.g cataloging.g catalysing.g catalyzing.g categorising.g catheterising.g catheterizing.g caulking.g causticizing.g cauterising.g cauterizing.g cavitating.g C-banding.g cementifying.g centrifugalising.g centrifugalizing.g centrifugating.g centrifuging.g cering.g certificating.g chaffing.g chamfering.g champing.g chancing.g channeling.g chaping.g chapping.g characterising.g charbroiling.g checkering.g cheeking.g chemoattracting.g chemo-preventing.g chemopreventing.g chemo-sensitising.g chemo-sensitizing.g chemosensitizing.g chequering.g chickening.g chining.g chinking.g chiseling.g chloring.g chloroforming.g chloroformising.g chloroformizing.g chocking.g cholecystectomising.g cholecystectomizing.g chorusing.g chromating.g chromatizing.g chromatographing.g chromicizing.g chunking.g chuting.g cicatrising.g cicatrizing.g ciphering.g circularising.g circumducting.g civilising.g clamoring.g classing.g clear-cutting.g clearcutting.g clewing.g clocking.g clouting.g cluing.g clysterizing.g coactivating.g coadministering.g co-agglutinating.g co-applying.g coapplying.g coapting.g coarticulating.g co-assembling.g coassembling.g cocainising.g cocainizing.g co-calibrating.g cocalibrating.g co-chromatographing.g cochromatographing.g co-circulating.g co-clustering.g coclustering.g co-colonizing.g cocolonizing.g cocooning.g co-crystallizing.g cocrystallizing.g co-cultivating.g cocultivating.g coculturing.g co-developing.g co-electroporating.g coelectroporating.g coeluting.g co-encapsidating.g coencapsidating.g coencapsulating.g co-enriching.g coenriching.g co-existing.g coexisting.g co-exposing.g coexposing.g coexpressing.g co-extracting.g cografting.g cogwheeling.g co-hybridising.g cohybridising.g co-hybridizing.g cohybridizing.g coimmobilising.g coimmobilizing.g coinfecting.g coinfusing.g co-ingesting.g coingesting.g co-inheriting.g coinheriting.g co-inoculating.g coinoculating.g coking.g collateralising.g collectivising.g colliquating.g colonising.g colonoscoping.g colorising.g colorizing.g colourizing.g co-managing.g comanaging.g comedicating.g cometabolising.g commercialising.g compartmentalising.g compartmenting.g compassing.g compeering.g complexing.g comporting.g computerising.g concatenating.g conceptualising.g concording.g concreting.g concussing.g conding.g condoling.g conducing.g conglomerating.g conglutinating.g coning.g consorting.g consternating.g constitutionalizing.g contradistinguishing.g contraindicating.g controverting.g contunding.g contusing.g convoluting.g co-ordinating.g co-oxidising.g cooxidising.g co-oxidizing.g cooxidizing.g co-partitioning.g co-perfusing.g coperfusing.g copolymerising.g copolymerizing.g coppering.g coproducing.g co-promoting.g copromoting.g corbeling.g corbelling.g co-rearing.g corearing.g co-registering.g co-regulating.g coregulating.g co-releasing.g coreleasing.g corkscrewing.g cornifying.g corning.g corraling.g co-secreting.g cosecreting.g cosegregating.g cosensitising.g cosensitizing.g coshing.g cosolubilising.g cosolubilizing.g co-sponsoring.g cosponsoring.g cosseting.g costarring.g co-stimulating.g costimulating.g co-storing.g costoring.g co-synthesising.g cosynthesising.g co-synthesizing.g cosynthesizing.g cotranscribing.g cotransfecting.g co-transfering.g cotransfering.g co-transferring.g cotransferring.g cotransforming.g cotransmitting.g co-transporting.g cotransporting.g co-treating.g cotreating.g coulorising.g counselling.g counterpoising.g counterregulating.g countersinking.g counterstaining.g counter-transporting.g countertransporting.g countervailing.g coursing.g court-martialling.g covenanting.g cowing.g cozening.g crabbing.g crafting.g craping.g cratering.g crating.g crazing.g creaking.g creping.g crewing.g cricking.g criminalising.g criminalizing.g crimsoning.g crisping.g criss-crossing.g cristallising.g cristallizing.g criticising.g critiquing.g crocking.g crooking.g cross-clamping.g crossclamping.g cross_fertilizing cross-linking.g cross-matching.g crossmatching.g cross-protecting.g crossprotecting.g cross-reacting.g crossreacting.g cross-referencing.g crossreferencing.g crusting.g cryo-fixing.g cryofixing.g cryo-preserving.g cryopreserving.g cryoprotecting.g cryo_sectioning cryo-sectioning.g cryotreating.g crystallising.g cuckooing.g cudgelling.g cueing.g cuing.g culturing.g cumbering.g cunding.g curarising.g curarizing.g curating.g cureting.g curetting.g curtaining.g cussing.g customising.g customizing.g cyanylating.g cyclising.g cyphering.g cyto-adhering.g cytoreducing.g cytospinning.g cytospun.g cytostaining.g dansylating.g dappling.g deacetylating.g deactivating.g deacylating.g de-adenylating.g deadenylating.g deafferentating.g deafferenting.g deallergising.g deamidating.g deamidizing.g deaminating.g debouching.g debriding.g debulking.g debuting.g decalcifying.g decannulating.g decapsulating.g decarboxylating.g decatenating.g decentralising.g decerebrating.g decerebrizing.g dechlorinating.g decidualising.g declutching.g decocting.g decolonising.g decolorising.g decolorizing.g decolourising.g decolourizing.g decomplementizing.g decontroling.g decontrolling.g deconvoluting.g decoronating.g decorticating.g decoupling.g decoying.g decreeing.g deemanating.g de-energising.g deenergising.g de-energizing.g deenergizing.g de-epicardializing.g de-epithelialising.g deepithelialising.g deethylating.g defaecating.g defaunating.g defeminising.g defeminizing.g defenestrating.g defibrillating.g defibrinating.g deflorating.g defocusing.g defocussing.g deformylating.g defunctionalising.g defunctionalizing.g degalactosylating.g degasing.g degassing.g degaussing.g degenitalizing.g deglycerating.g degreasing.g dehaematising.g dehalogenating.g dehematizing.g dehemoglobinizing.g dehorning.g dehulling.g dehumanising.g dehydrochlorinating.g dehydrogenating.g dehydrogenising.g dehydrogenizing.g dehydroxylating.g dehypnotising.g dehypnotizing.g deinducing.g deinstitutionalizing.g deionising.g deionizing.g dejecting.g de-leading.g deleading.g delimitating.g delipidating.g delocalising.g delocalizing.g delousing.g demagnetising.g demarking.g demasculinising.g demedullating.g demembranating.g demetalising.g demetalizing.g demethylating.g demilitarising.g demineralising.g demineralizing.g demobilising.g democratising.g demodulating.g demonetising.g demonetizing.g demoralising.g demustardizing.g demyelinating.g demystifying.g denationalising.g denaturing.g denervating.g denitrating.g denitrifying.g deodorising.g deoxidising.g deoxidizing.g deoxygenating.g depancreatizing.g deparaffinising.g deparaffinizing.g departmentalising.g depersonalizing.g dephosphorylating.g depigmenting.g depilating.g depolarising.g depoliticising.g depoliticizing.g depolymerising.g depotentiating.g depraving.g depressurising.g depressurizing.g deprojecting.g deprotecting.g deproteinating.g deprotonating.g depurating.g deputing.g deputising.g deregulating.g derepressing.g deresinating.g derivatising.g derivatizing.g derivitising.g derivitizing.g deroofing.g derotating.g derricking.g desalinising.g desalting.g desamidating.g desamidizing.g descaling.g desensitising.g desexualising.g desexualizing.g desheathing.g desialylating.g desolating.g desolvating.g desorbing.g despeciating.g destabilising.g destablising.g destablizing.g destaining.g desulfating.g desulfurating.g desulphating.g desulphurating.g desynchronising.g detailing.g dethyroidizing.g detouring.g detoxicating.g deuterating.g deuteriating.g devascularizing.g deviling.g devilling.g devitalising.g devitalizing.g deworming.g dextrinating.g dextrinizing.g diacetylating.g diacylating.g diagraming.g diagramming.g dialkylating.g dialoging.g dialoguing.g dialysing.g diapausing.g diapering.g diazotizing.g dibbling.g dickering.g dideuterating.g diesterifying.g difluorinating.g digitalising.g digitilising.g digitising.g digitizing.g dihalogenating.g dihydrogenating.g dihydroxylating.g diiodinating.g diking.g dilatating.g dimerising.g dimethylating.g dimiting.g dimitting.g dimpling.g diphosphorylating.g dirtying.g disacidifying.g disadvantaging.g disaggregating.g disagreeing.g disambiguating.g disarraying.g disbelieving.g disbudding.g disbuding.g disburdening.g discoing.g discolouring.g discommoding.g discomposing.g disconfirming.g discountenancing.g discretising.g discretizing.g disembodying.g disemboweling.g disencumbering.g disfavoring.g dishabituating.g disheveling.g dishevelling.g dishonoring.g disimmunizing.g disinhibiting.g disinserting.g disjointing.g dismutating.g disoccluding.g disordering.g disorganising.g disorganizing.g dispensarising.g dispensarizing.g dispiriting.g disproportionating.g disquieting.g disregulating.g dissatisfying.g dissimilating.g distempering.g distraining.g divulsing.g docketing.g dogging.g dolling.g dollying.g domiciling.g doming.g dorsalising.g dorsiducting.g dosing.g dossing.g douching.g doweling.g dowelling.g downmodulating.g downregulating.g downstaging.g dowsing.g dramatising.g drating.g dratting.g driveling.g drivelling.g drudging.g dumfounding.g duning.g dunning.g duplexing.g dyking.g dysregulating.g earing.g earthing.g ebbing.g echolocating.g economising.g ecphorising.g ecphorizing.g ectropionising.g ectropionizing.g editorialising.g educing.g edulcorating.g effectuating.g effing.g egesting.g ekphorizing.g elating.g electroblotting.g electro-cauterising.g electrocauterising.g electro-cauterizing.g electrocauterizing.g electrodialysing.g electroeluting.g electro-injecting.g electroinjecting.g electroinserting.g electrophoresing.g electrophoring.g electroplating.g electroporating.g electrotransfering.g electrotransferring.g electroverting.g eluting.g elutriating.g emaciating.g embolising.g embrocating.g emedullating.g empaneling.g empathising.g emphasising.g emplacing.g emulsioning.g enameling.g enamoring.g enamouring.g encapsulating.g enchaining.g encoring.g encrusting.g endarterectomising.g endarterectomizing.g endoscoping.g endothelialising.g enduing.g energising.g energizing.g enfeebling.g engrafting.g engrailing.g enkindling.g enlacing.g enplaning.g enrapturing.g ensheathing.g ensilaging.g ensiling.g enterectomising.g enterectomizing.g enthraling.g entropionizing.g envelopping.g envenoming.g environing.g enwraping.g enwrapping.g epilating.g epimerising.g epithelialising.g epithelializing.g epithelising.g epithelizing.g epitomising.g epoxidising.g epoxidizing.g equaling.g equalising.g equilibrating.g eroticising.g eroticizing.g erotising.g erotizing.g essaying.g esterifying.g estranging.g estrogenising.g estrogenizing.g etherising.g etherizing.g ethylating.g euthanatising.g euthanatizing.g euthanising.g euthanizing.g evaginating.g everting.g evidencing.g exacting.g exanimating.g excerpting.g exchange-transfusing.g excogitating.g execrating.g exenterating.g exorcising.g expatriating.g exsanguinating.g exsecting.g exsomatizing.g exteriorising.g exteriorizing.g externalising.g extruding.g extubating.g exulting.g eyeing.g factorising.g factorizing.g faggoting.g fagoting.g familiarising.g fantasising.g faradising.g faradizing.g farnesylating.g farting.g fathering.g feather-beding.g fecundating.g federalising.g federalizing.g feeing.g felicitating.g feminising.g feminizing.g fenestrating.g fertilising.g festering.g feuing.g fevering.g fictionalising.g fictionalizing.g field_testing field-testing.g filching.g filtrating.g finalising.g fingerprinting.g fire-proofing.g fireproofing.g fissuring.g fistulising.g flabbergasting.g flanging.g flawing.g flecking.g fleshing.g flexibilising.g flexibilizing.g flouncing.g floundering.g flouring.g fluidizing.g fluoresceinating.g fluoridising.g fluoridizing.g fluoroscoping.g fluting.g foaling.g focalising.g fogging.g foging.g footling.g footnoting.g footprinting.g footsloging.g foraying.g forbidding.g forbiding.g forboding.g forebidding.g forebiding.g foreboding.g foredooming.g foregrounding.g foreknew.g foreknowing.g foresting.g foretasting.g formalinising.g formalinizing.g formalising.g formatting.g formylating.g fossilising.g fowling.g foxhunting.g foxing.g fractionating.g franchising.g fraternising.g freckling.g free_grafting free-grafting.g freeze_drying freeze-drying.g freeze-fracturing.g freighting.g fringing.g frivolling.g frolicking.g frothing.g fruiting.g fuddling.g functionalising.g functionalizing.g funking.g funneling.g furcating.g furring.g gabbing.g gabbling.g gadding.g galactosylating.g galavanting.g galivanting.g galumphing.g galvanising.g ganglionectomising.g ganglionectomizing.g gangrening.g gaping.g gapping.g garaging.g garlanding.g garoting.g garotting.g garroting.g garrotting.g gasing.g gassing.g gastrectomising.g gastrectomizing.g gating.g gavaging.g gazeting.g gazetting.g gelatinising.g gelding.g generalising.g gening.g genning.g genotyping.g gentling.g genuflecting.g geocoding.g geranylgeranylating.g ghosting.g gingering.g girdling.g glacing.g glamorising.g glissading.g globalising.g glomectomising.g glomectomizing.g gloming.g glomming.g gloving.g glowering.g glucoronising.g glucuronidating.g glueing.g gluing.g glycating.g glycerolating.g glycerolizing.g glycosylating.g gonadectomizing.g goosing.g gormandising.g gowning.g graining.g grandfathering.g grandparenting.g graphing.g grassing.g graveling.g greening.g griming.g grizzling.g grommeting.g grubbing.g grubing.g guesting.g gulling.g gusseting.g guttering.g guying.g habilitating.g habituating.g haemagglutinating.g haemoagglutinating.g haemocoagulating.g haemodialysing.g haemodialyzing.g haemodiluting.g haemolysing.g haemolyzing.g haemoperfusing.g haemorrhaging.g hallmarking.g halogenating.g handpicking.g haploidising.g happing.g haptenating.g harmonising.g hasping.g headlining.g hemicastrating.g hemi-deleting.g hemisecting.g hemispherectomising.g hemispherectomizing.g hemodialysing.g hemodialyzing.g hemodiluting.g hemolysing.g hemoperfusing.g hemorrhaging.g heparinising.g heparinizing.g hepatectomising.g hepatectomizing.g heterodimerising.g hexing.g hiccoughing.g hieing.g high-jacking.g hirudinizing.g histoculturing.g hoboing.g holidaying.g holing.g homing.g homodimerising.g homodimerizing.g homogenising.g homografting.g honeycombing.g hooping.g horning.g horsing.g hospitalising.g hoting.g hotting.g hoving.g hoxing.g humanising.g humanizing.g humoring.g hurdling.g husbanding.g hyalinising.g hyalinizing.g hybridising.g hydrogenating.g hydrogenizing.g hydrolising.g hydrolizing.g hydrolysing.g hydroxylating.g hying.g hymning.g hyperacetylating.g hyperactivating.g hypercontracting.g hyperdefaecating.g hyperexpressing.g hyperextending.g hyperfiltrating.g hyperfractionating.g hyperimmunising.g hyperimmunizing.g hyper-inducing.g hyperinducing.g hyperinnervating.g hyperluteinising.g hyper-methylating.g hypermethylating.g hypernucleating.g hyperpolarising.g hyperproducing.g hypersensitising.g hyperstimulating.g hypertransfusing.g hypnoidizing.g hypnotising.g hypomineralising.g hypomineralizing.g hypo-phosphorylating.g hypophosphorylating.g hypophysectomising.g hypophysectomizing.g hyposensitizing.g hypothecating.g hysterectomising.g hysterectomizing.g idealising.g idolising.g imbedding.g imbeding.g immobilising.g immortalising.g immunising.g immunoabsorbing.g immunoadsorbing.g immuno_assaying immuno-assaying.g immunoassaying.g immunobloting.g immunoblotting.g immunocompromising.g immunodepleting.g immunodepressing.g immunoenhancing.g immunoexpressing.g immunoinhibiting.g immunoisolating.g immunolabeling.g immunolabelling.g immunolocalising.g immunolocalizing.g immunoneutralising.g immunoneutralizing.g immunophenotyping.g immunopurifying.g immunoradioassaying.g immunoregulating.g immunoscreening.g immunoselecting.g immunostaining.g immunostimulating.g immunosuppressing.g immuno-targeting.g immunotargeting.g immunotitrating.g immunotyping.g immuring.g impaneling.g imperiling.g impersonalising.g impersonalizing.g importuning.g incising.g inclosing.g incommoding.g incrementing.g inculpating.g individualising.g individualizing.g indorsing.g induing.g industrialising.g inebriating.g influxing.g ingling.g ingrafting.g ingraining.g inhuming.g initialing.g initialising.g initializing.g inlaying.g inlayinging.g innervating.g inputing.g inputting.g inseting.g insetting.g insolubilising.g insolubilizing.g insonifying.g instancing.g institutionalising.g instrumenting.g insufflating.g intellectualising.g intellectualizing.g intercalating.g interconverting.g interfacing.g interiorising.g interiorizing.g interlacing.g interlarding.g interleafing.g interlinking.g internalising.g internationalising.g interpellating.g interposing.g interspacing.g intrenching.g introjecting.g introspecting.g introverting.g intrusting.g intubating.g inuring.g inventorying.g invoicing.g iodinating.g iodising.g ionising.g iontophoresing.g iridectomizing.g irritating.g isoimmunising.g isoimmunizing.g isomerising.g italicising.g itemising.g jacketing.g jack_knifing jackknifing.g jagging.g jaunting.g jecorizing.g jejunectomising.g jejunectomizing.g jeopardising.g jointing.g juicing.g junking.g karyotyping.g keening.g kenneling.g kennelling.g kenting.g keratinising.g keying.g kidnaping.g kinking.g kneeing.g KO'ing.g KO’ing.g labilising.g labyrinthectomising.g labyrinthectomizing.g lacrymating.g lactonising.g laddering.g lambing.g laminectomising.g laminectomizing.g laming.g lamming.g laparotomising.g laparotomizing.g lapinising.g lapinizing.g larding.g lariating.g larking.g laryngectomising.g laryngectomizing.g lasering.g lassooing.g lateralising.g lathering.g lathing.g lavaging.g layering.g leafleting.g leafletting.g leaguing.g leap-frogging.g leap-froging.g leapfroging.g leashing.g leeching.g leeping.g legalising.g legitimating.g legitimatising.g legitimising.g legitimizing.g lentectomizing.g lesioning.g lettering.g libeling.g liberalising.g ligating.g lilting.g liming.g limning.g linearizing.g linging.g linning.g lipectomising.g lipectomizing.g lipidating.g liping.g liposuctioning.g lipoxygenating.g lipping.g lip-reading.g liquifying.g lithographing.g lithotomizing.g lobectomising.g lobectomizing.g lobotomising.g lobotomizing.g loosing.g lording.g Lording.g louping.g louring.g lowing.g lubrifying.g lucking.g lurking.g luteinising.g luxating.g lymphadenectomising.g lymphadenectomizing.g lyophilising.g lyophilizing.g lypophilising.g lypophilizing.g lysogenising.g lysogenizing.g macadamising.g macadamizing.g machining.g macroencapsulating.g magnetising.g mainstreaming.g malaxating.g malfunctioning.g malignising.g malpositioning.g malting.g mantling.g manumiting.g manumitting.g manuring.g marathoning.g Marathoning.g marathonning.g Marathonning.g marbling.g marginating.g marinading.g marshaling.g marsupializing.g masculinising.g masculinizing.g massacring.g mastectomising.g mastectomizing.g master-minding.g materialising.g matting.g maximising.g mazing.g mechanising.g medialising.g medicalising.g medicalizing.g medisecting.g medullectomising.g medullectomizing.g melanising.g melanizing.g mentoring.g mercerising.g mercerizing.g merchandising.g mercurating.g mercurializing.g mercuriating.g mesmerising.g metabolising.g metabolizing.g metaling.g metalling.g metastasising.g metering.g methylating.g metricising.g metring.g mewing.g micellising.g microagglutinating.g microaggregating.g microbiopsying.g microcannulating.g microcatheterising.g microcatheterizing.g microcomputerising.g microcomputerizing.g microdetermining.g microdiluting.g microdissecting.g microembolising.g microfilling.g microfiltering.g microinjecting.g micromanipulating.g micromilling.g micromodifying.g micronising.g micronizing.g microperfusing.g microprocessing.g microsequencing.g microtitrating.g microtoming.g microwaving.g middling.g mildewing.g militarising.g militarizing.g mimetising.g mimetizing.g mineralising.g mineralizing.g miniaturising.g minifying.g minimising.g minuting.g misadvising.g misattributing.g miscalling.g miscasting.g misclassifying.g miscoding.g misconducting.g misdiagnosing.g mis-folding.g misidentifying.g misincorporating.g mislabeling.g mislabelling.g mislocalising.g mislocalizing.g mismatching.g mispairing.g misperceiving.g misprinting.g misrecognising.g misrecognizing.g misregulating.g misrepairing.g misrouting.g misruling.g misspecifying.g mis-tuning.g mistuning.g mitering.g mitring.g mobilising.g modernising.g moireing.g moisturising.g moisturizing.g moldering.g monophosphorylating.g monopolising.g moonlighting.g moralising.g morcellating.g morphinizing.g morsing.g Morsing.g morticing.g mortising.g mothering.g moth-proofing.g motorcycling.g motorising.g muckraking.g mulcting.g multimerising.g mummifying.g mummying.g mumping.g muscling.g muscularising.g mutagenizing.g myectomizing.g myristoylating.g narcotizing.g narking.g nasalising.g nasalizing.g nationalising.g naturalising.g nauseating.g nebulising.g nebulizing.g necropsying.g necrotising.g negativing.g neighboring.g neighbouring.g nephrectomising.g neping.g nepping.g nerving.g nesslerising.g nesslerizing.g neuromodulating.g neurostimulating.g neutralising.g niching.g nickeling.g nickelling.g niming.g nimming.g Nissl_staining Nissl-staining.g nitrating.g nitrosating.g nitrosylating.g nobbling.g nonplusing.g nonplussing.g noosing.g normalising.g nosing.g notching.g objectifying.g objurgating.g oblating.g obtruding.g obtunding.g obturating.g oestrogenising.g oestrogenizing.g ointing.g O.K.ing.g OKing.g oligomerising.g oligomerizing.g oophorectomising.g oophorectomizing.g operationalising.g operationalizing.g oppugning.g opsonifying.g opsonising.g optimising.g optimizing.g orchidectomising.g orchidectomizing.g ordinating.g organising.g orphaning.g osmicating.g osteotomising.g osteotomizing.g ostracising.g outbraving.g out-competing.g outcompeting.g outdating.g outfacing.g out-Heroding.g outlaying.g outmaneuvering.g outmarching.g outmatching.g out-pacing.g outpacing.g outperforming.g outpointing.g outputing.g outputting.g outranging.g outriding.g outrivaling.g outrivalling.g outsailing.g outspreading.g outstriping.g outstripping.g outvying.g outwearing.g ovariectomising.g ovariectomizing.g over-associating.g overassociating.g over-burdening.g over-capitalising.g overcapitalising.g over-capitalizing.g overcapitalizing.g over-charging.g over-consuming.g overconsuming.g over-cooking.g overcorrecting.g overcroping.g overcropping.g over-crowding.g over-detecting.g overdetecting.g overdiagnosing.g overdosing.g over-eating.g over-elongating.g overelongating.g overemphasising.g over-emphasizing.g over-estimating.g over-exerting.g over-exposing.g overexpressing.g over-feeding.g over-hanging.g overhanging.g over-heating.g over-inserting.g overinserting.g overlaying.g over-learning.g overlearning.g overleeping.g overmastering.g over-praising.g over-predicting.g overpredicting.g over-producing.g over-proliferating.g over-refering.g overrefering.g over-reporting.g overreporting.g over-representing.g overrepresenting.g oversaturating.g over-secreting.g oversewing.g over-simplifying.g over-staging.g overstaging.g overstaining.g overstimulating.g over-straining.g over-stretching.g over-synthesising.g oversynthesising.g over-synthesizing.g oversynthesizing.g overthrowing.g over-transcribing.g overtreating.g overusing.g over-valuing.g overventilating.g overviewing.g over_weighting overweighting.g over-wraping.g overwraping.g over-wrapping.g overwrapping.g oxidising.g oxygenising.g oxygenizing.g ozonising.g ozonizing.g palisading.g palliating.g palpating.g palping.g pancreatectomizing.g paneling.g panelling.g paragraphing.g paralleling.g parameterising.g parameterizing.g parasitising.g parasitizing.g parasoling.g parathyroidectomizing.g parboiling.g parceling.g parcelling.g parroting.g particularising.g pasteurising.g pasturing.g patronising.g peaning.g peening.g pelleting.g pelletising.g pelletizing.g penalising.g penciling.g pensioning.g peopling.g pepsinating.g pepsinising.g pepsinizing.g peptonising.g percussing.g perifusing.g peritomizing.g peritonealizing.g peritonizing.g permeabilizing.g permeablising.g peroxidising.g personalising.g pestling.g phagocytising.g phagocytizing.g phagocytosing.g phalangizing.g phenocopying.g phenolating.g phenotyping.g philosophising.g phlebotomising.g phlorhizinising.g phlorhizinizing.g phloridzinising.g phloridzinizing.g phosphonylating.g phosphorylating.g photoactivating.g photobleaching.g photodamaging.g photodecomposing.g photoinactivating.g photoinducing.g photoisomerising.g photolabeling.g photolabelling.g photolysing.g photo-oxidising.g photooxidising.g photo-oxidizing.g photopolymerising.g photopolymerizing.g photoprotecting.g photoreducing.g photoregulating.g photoreversing.g photosensitising.g photostating.g photostimulating.g physicking.g piggybacking.g pilling.g pillowing.g pinding.g pinealectomising.g pinealectomizing.g pinioning.g pinking.g pin-pointing.g pipetting.g pithing.g plagiarising.g plaiting.g planimetering.g planking.g plasmolysing.g plasmolyzing.g plateauing.g platinating.g plating.g pleaing.g pleating.g plicating.g pluming.g plummeting.g plumping.g plunking.g pneumonectomising.g pneumonectomizing.g podding.g poding.g polarising.g pole-axing.g poleaxing.g politicising.g politzerizing.g pollacking.g pollarding.g polyadenalating.g polyadenylating.g polyglutamylating.g polymerising.g polymerizing.g pomading.g pommeling.g pommelling.g poniarding.g popularising.g portacaval_shunting portioning.g postfixing.g potentiating.g potting.g poulticing.g powering.g prawning.g preabsorbing.g preadmiting.g preadmitting.g precepting.g precising.g precoating.g preconditioning.g precooking.g precooling.g preculturing.g predating.g predeceasing.g predefining.g predestinating.g pre-digesting.g predigesting.g pre-embedding.g preembedding.g pre-embeding.g preembeding.g pre-establishing.g preestablishing.g preexisting.g pre-exposing.g preexposing.g prefeeding.g prefixing.g preimmunizing.g preinducing.g preinfecting.g pre-irradiating.g preirradiating.g prelabeling.g prelabelling.g preloading.g preluding.g premedicating.g premiering.g premissing.g premixing.g preping.g prepossessing.g prepping.g preprinting.g preprocessing.g preprograming.g preprogramming.g preprotecting.g prereducing.g prescreening.g preselecting.g presensitizing.g pre-seting.g preseting.g pre-setting.g presetting.g presoaking.g prespawning.g prespecifying.g pressurising.g prestimulating.g pre-surfacing.g pretraining.g pretreating.g previewing.g prewarming.g prewashing.g prickling.g prioritising.g prioritizing.g prising.g privatising.g probating.g profaning.g professionalizing.g prognosing.g prolating.g pronging.g propagandising.g prophesying.g propitiating.g prorating.g proroguing.g proselytising.g prospecting.g prostatectomising.g prostatectomizing.g proteolysing.g proteolyzing.g protracting.g provisioning.g pseudonormalising.g psyching.g psycho-analysing.g psycho-analyzing.g ptyalizing.g publicising.g puddling.g pulping.g pulverising.g puping.g pupping.g purposing.g purpurating.g puttying.g pyridoxylating.g quadding.g quading.g quadrisecting.g quadruplicating.g quailing.g quantising.g quantitating.g quantizing.g quarking.g quarreling.g quarrelling.g quartisecting.g quaternizing.g queening.g Queening.g queuing.g quizzing.g rabbiting.g rabbitting.g radiographing.g radioimmunoassaying.g radiolabeling.g radiolabelling.g radiolocalising.g radiolocalizing.g radiosensitising.g radiosensitizing.g ragging.g ranching.g randomising.g randomizing.g rappeling.g rappelling.g rarefying.g rasing.g rationalising.g raying.g razoring.g reabsorbing.g reaccumulating.g reacquiring.g re-adapting.g readding.g readdressing.g readministering.g readying.g re-afforesting.g reafforesting.g reaggregating.g realigning.g realising.g reallocating.g reaming.g re-amplifying.g reamplifying.g reamputating.g reanalysing.g reanalyzing.g re-animating.g reanimating.g reappraising.g re-approximating.g reapproximating.g re-arterialising.g rearterialising.g re-arterializing.g rearterializing.g reasserting.g reassigning.g reassociating.g reassorting.g reattaching.g rebasing.g rebinding.g rebling.g recalcifying.g recalibrating.g recanalizing.g recategorising.g recategorizing.g recatheterising.g recatheterizing.g receipting.g recemising.g recertifying.g rechallenging.g rechromatographing.g recirculating.g reclassifying.g recloning.g recoding.g recognising.g recolonising.g recombining.g recompressing.g reconceptualizing.g reconfiguring.g reconnoitering.g reconstituting.g recontaminating.g recontouring.g re-converting.g re-counting.g re-covering.g recultivating.g reculturing.g redacting.g rededicating.g redescribing.g redetecting.g redetermining.g redevelopping.g reding.g redirecting.g redissecting.g re-echoing.g reeducating.g re-elevating.g reemphasizing.g re-endothelialising.g reendothelialising.g re-endothelializing.g re-engineering.g reengineering.g re-entering.g re-epithelialising.g reepithelialising.g re-epithelializing.g re-equilibrating.g re-esterifying.g reesterifying.g reevaluating.g re-examining.g reexamining.g re-excising.g reexcising.g re-exploring.g reexploring.g reexposing.g reexpressing.g re-extracting.g reextracting.g refacing.g refeeding.g refereeing.g refereing.g referencing.g refering.g reffing.g refinishing.g refluxing.g refolding.g reforesting.g reformating.g reformatting.g reframing.g regionalising.g regionalizing.g regrafting.g regularising.g rehearing.g reheating.g rehospitalising.g rehospitalizing.g reimmunizing.g re-implanting.g reimplanting.g reincarcerating.g reincarnating.g re-inflating.g reinitiating.g reinjecting.g reinjuring.g reinnervating.g reinoculating.g reinserting.g reinstituting.g re-internalising.g reinternalising.g re-internalizing.g reinternalizing.g re-interviewing.g reinterviewing.g reintroducing.g reintubating.g re-inventing.g re-irradiating.g reisolating.g rejigging.g rejiging.g re-joining.g relabeling.g relabelling.g relaparoscopying.g relearning.g relining.g relipidating.g relocalising.g relocalizing.g remaindering.g remaking.g remaping.g remapping.g remediating.g remilitarising.g remobilising.g remodeling.g remyelinating.g renaturing.g reneguing.g re-obliterating.g reobliterating.g re-occluding.g re-occurring.g reoccurring.g reorganising.g reoxidising.g reoxygenating.g repartitioning.g repatterning.g reperforating.g reperfusing.g reperitonealising.g reperitonealizing.g replating.g repointing.g repolarising.g repopulating.g reposing.g repositing.g repositioning.g repoting.g repotting.g repriming.g reprobating.g reprocessing.g reprograming.g reprogramming.g republishing.g repurifying.g requiting.g rerunning.g resampling.g rescaning.g rescanning.g re-scoering.g rescoering.g re-scoring.g rescoring.g rescreening.g resealing.g resecting.g resensitising.g resequencing.g residualising.g residualizing.g re-slicing.g reslicing.g resocialising.g resocializing.g resolubilizing.g resorbing.g respelling.g restaging.g restaining.g re-stenosing.g restimulating.g restretching.g restudying.g resulfating.g resulphating.g resurveying.g resuspending.g resuturing.g resynthesising.g resynthesizing.g retraining.g retransforming.g retransfusing.g retransplanting.g retraumatizing.g retreading.g re-treating.g retroceding.g retrofiting.g retrofitting.g retrotranscribing.g retyping.g reusing.g reutilising.g reutilizing.g revaccinating.g revalidating.g revascularising.g revascularizing.g reveiling.g revendicating.g revenging.g revitalising.g revivifying.g revolutionalising.g revolutionalizing.g revolutionising.g rewarming.g reworking.g rexing.g rhapsodising.g ribosylating.g ricking.g ricochetting.g ridging.g riming.g riting.g ritting.g ritualising.g ritualizing.g riving.g robing.g romanticising.g roneoing.g rongeuring.g roofing.g rooking.g roseting.g rosetting.g rosining.g rough-casting.g roughcasting.g rough-drying.g roughhousing.g rouging.g roweling.g rowelling.g rubberising.g ruddling.g ruffing.g rumoring.g rumouring.g rusking.g ruting.g rutting.g sabering.g sabring.g salaaming.g salifying.g sallowing.g salving.g sandaracing.g sandaracking.g sand-blasting.g sanitising.g sanitizing.g sating.g saucerizing.g sauting.g savoring.g savvying.g scabing.g scalloping.g scaming.g scamming.g scamping.g scapegoating.g scar_cicatrising scar_cicatrizing scarifying.g sclerotising.g sclerotizing.g scolloping.g scourging.g scrabbling.g scragging.g scraging.g scribing.g scrimmaging.g scripting.g scrupling.g scrutinising.g SCUBAing.g scudding.g scuding.g scuppering.g scything.g seaming.g secluding.g sectioning.g sectoring.g secularising.g sedimenting.g segmenting.g semaphoring.g semisynthesising.g semisynthesizing.g sensibilising.g sensibilizing.g sensitising.g sequencing.g sequestrating.g serialising.g serogrouping.g serotyping.g servo-controling.g servocontroling.g servo-controlling.g servocontrolling.g sexing.g sexualising.g sexualizing.g shafting.g shallowing.g shambling.g shanghaiing.g sheering.g sheeting.g shellacing.g shellacking.g shiming.g shimming.g shining.g shinning.g shipwrecking.g shoding.g shoeing.g short-listing.g shoveling.g shrining.g shriving.g shuttling.g sialadenectomizing.g sialylating.g siccing.g sicing.g sickling.g side-tracking.g signalising.g signalizing.g siliconising.g siliconizing.g silting.g silvering.g silylating.g singularising.g singularizing.g sintering.g siting.g situating.g skateboarding.g skeining.g skeletonising.g skying.g slanging.g slatting.g sledding.g sleding.g sleighing.g slenderising.g sleuthing.g slitting.g slivering.g sloping.g slopping.g sludging.g sluicing.g smirching.g smuting.g smutting.g snaffling.g snicking.g snowshoeing.g snugging.g snuging.g soaping.g socialising.g sodding.g soding.g soft-pedaling.g soft-soaping.g soft-soldering.g solacing.g solating.g solemnising.g solemnizing.g soliloquising.g soling.g soloing.g solubilising.g solubilizing.g solvating.g somatising.g somatotyping.g sonicating.g sooting.g sorbing.g sorrowing.g sovietizing.g spangling.g spatchcocking.g spating.g spatulating.g speckling.g spilt.g spilting.g spindling.g spiralising.g spiritualising.g spiritualizing.g spirting.g splenectomising.g splenectomizing.g splinting.g splotching.g spoofing.g spooking.g spooling.g spooning.g sporulating.g spudding.g spuding.g squeegeeing.g squeegeing.g stabling.g stagging.g stanching.g standardising.g steam-heating.g steam-rollering.g stenciling.g stencilling.g sterilising.g stewarding.g stigmatising.g stilting.g stinking.g stock-piling.g stockpiling.g stomping.g stoppering.g stranding.g strangulating.g striating.g stricturing.g stroping.g stropping.g strychnizing.g stultifying.g stupefying.g stylising.g subcategorising.g subcategorizing.g sub-classifying.g subclassifying.g subcompartmentalising.g subcompartmentalizing.g subcultivating.g subculturing.g subexciting.g subgrouping.g subindexing.g subjoining.g subliming.g sublocalising.g sublocalizing.g subluxating.g suborning.g subsaturating.g subsidising.g subspecialising.g subtitling.g subtyping.g suctioning.g sugaring.g sulfating.g sulfonating.g sulfurating.g sulfureting.g sulfuretting.g sulfurizing.g sulphating.g sulphonating.g sulphurating.g sulphureting.g sulphuretting.g sulphurising.g sulphurizing.g summarising.g sunburning.g superactivating.g superannuating.g supercooling.g superducting.g superfusing.g superhydrating.g superinducing.g superintending.g superposing.g superprecipitating.g supersaturating.g supershifting.g suprarenalectomizing.g surcharging.g surfeiting.g suscitating.g suturing.g swabbing.g swabing.g swaddling.g swaging.g swaning.g swanning.g swilling.g swobbing.g swobing.g swoping.g swopping.g syllabicating.g syllabifying.g syllabizing.g symbolising.g sympathectomising.g sympathectomizing.g sympathising.g synapsing.g synchronising.g synergising.g synonymizing.g synostosing.g synthesising.g synthetising.g synthetizing.g syringing.g systematising.g tabooing.g tabuing.g tape-recording.g targetting.g taring.g tarmacing.g tarmacking.g teeing.g telecommunicating.g telefaxing.g telepathizing.g teletransmiting.g teletransmitting.g tempering.g temporising.g tenanting.g tenoning.g tenotomizing.g tenting.g tenuring.g terrorising.g teslaizing.g tetanising.g tetanizing.g tetramerising.g thermalising.g thermocauterising.g thermocauterizing.g thermocycling.g thermoregulating.g thermosensitising.g thermosensitizing.g thoracotomising.g thoracotomizing.g throeing.g throing.g thrusting.g thwacking.g thymectomising.g thymectomizing.g thymolizing.g thyroidectomising.g thyroidectomizing.g thyroidizing.g thyroparathyroidectomizing.g timetabling.g tincturing.g tingeing.g tinning.g tittivating.g toggling.g tolerising.g tolerizing.g tonicizing.g tonsillectomizing.g tonsuring.g tooling.g top-dressing.g torquing.g torrefying.g tosylating.g toweling.g trabeculating.g tracheostomizing.g tracheotomizing.g traducing.g trafficing.g trafficking.g trammeling.g trammelling.g tranquillising.g transactivating.g transdifferentiating.g transducing.g transecting.g transesterifying.g transfecting.g transfiguring.g transhiping.g transilluminating.g transiting.g transliterating.g translocating.g transmogrifying.g transphosphorylating.g transsecting.g transshiping.g trapsing.g traumatising.g traumatizing.g travestying.g treadling.g treeing.g trellising.g trenching.g trending.g trepaning.g trepanning.g trephining.g triangulating.g trichinizing.g trilling.g triplicating.g trisecting.g tritiating.g triturating.g trivialising.g trolling.g trooping.g trucking.g truing.g trussing.g trypsinising.g trypsinizing.g tubularizing.g turfing.g turgidizing.g twining.g twinning.g twiting.g twitting.g tyrannising.g ubiquitinating.g ultrapurifying.g ultrasonicating.g unbaring.g unbarring.g unbinding.g unbosoming.g unbound.g unbridling.g uncaping.g uncapping.g unclamping.g uncliping.g unclipping.g unclogging.g uncloging.g uncuffing.g undeceiving.g undercalling.g underdetecting.g underdiagnosing.g underemphasising.g underemphasizing.g underexerting.g under-feeding.g undernourishing.g underpredicting.g undersedating.g understaging.g understaining.g undertreating.g underusing.g underutilising.g underutilizing.g underwriting.g unfiting.g unfitting.g unhorsing.g universalizing.g unknotting.g unmaning.g unmanning.g unravelling.g unroofing.g unsaying.g unseating.g unsexing.g unsticking.g upregulating.g uptaking.g urbanising.g utilising.g vacuuming.g vagotomizing.g vailing.g vandalising.g vandalizing.g vaporising.g vapourising.g vapourizing.g variegating.g variolating.g vascularising.g vascularizing.g vasectomizing.g vaunting.g veneering.g ventralising.g ventralizing.g ventricular_hypertrophying ventriducting.g verbalising.g victimising.g victualing.g victualling.g videoing.g virilising.g virilizing.g visioning.g visualising.g vitalising.g vitalizing.g vitrectomising.g vitrectomizing.g vivifying.g vocalising.g vogueing.g voguing.g volitilising.g vortexing.g vulcanising.g vulcanizing.g vulgarising.g vulnerating.g wagering.g wallpapering.g wanding.g wardening.g waring.g warring.g waterlogging.g wearying.g weaseling.g webbing.g weeing.g weekending.g weiring.g welching.g welling.g wenching.g westernising.g whisking.g whizing.g whizzing.g whopping.g winching.g winkling.g wintering.g wising.g womanising.g wowing.g wracking.g wreathing.g xanthating.g xenografting.g xeroxing.g Xeroxing.g x_raying X_raying x-raying.g xraying.g X-raying.g yarning.g yellowing.g yoking.g zenkerizing.g zig-zagging.g zippering.g link-grammar-4.7.4/data/en/words/words-medical.v.4.20000644000175000017500000011030111246771267021016 0ustar bloombloomabashes.v abjures.v ablates.v abnegates.v abominates.v abscesses.v abscises.v absents.v acccouters.v accessions.v acclimatises.v accouples.v accoutres.v aces.v acetifies.v acetonates.v acetonizes.v acetylates.v acetylises.v acetylizes.v achromatises.v achromatizes.v acidulates.v actualises.v actualizes.v actuates.v acylates.v adducts.v adenosine_diphosphate-ribosylates adjures.v administrates.v admixes.v ADP-ribosylates.v adrenalectomizes.v adsorbs.v adulates.v advantages.v afforests.v affronts.v afterloads.v agglomerates.v aggrieves.v agonises.v airbrushes.v alcoholises.v alcoholizes.v aliases.v alines.v aliquots.v alites.v alkalinises.v alkalinizes.v alkalises.v alkalizes.v alkylates.v allelotypes.v allergizes.v allografts.v alloimmunises.v alloimmunizes.v allotransplants.v alloys.v allures.v alphabetises.v alphabetizes.v aluminates.v Americanises.v amidates.v aminates.v aminoacylates.v ammoniates.v amortises.v anaesthetises.v anatomizes.v anergises.v anesthetises.v anglicises.v animadverts.v annualises.v annualizes.v annunciates.v anodises.v anodizes.v anonymises.v anonymizes.v anoxiates.v antagonises.v anteriorises.v anteriorizes.v antes.v antiaggregates.v anticoagulates.v antigenises.v antigenizes.v antirepresses.v antisepticises.v antisepticizes.v apeases.v apodizes.v apologises.v apostatises.v appalls.v apparells.v apparels.v apports.v apposes.v apprizes.v arborises.v archives.v arcks.v arcs.v aromatises.v aromatizes.v arsonates.v arterializes.v articles.v asexualizes.v asperges.v asperses.v asseverates.v asterisks.v atomises.v attitudinises.v audiotapes.v auscultates.v authors.v autocatalyses.v autoclaves.v autogenerates.v autoimmunises.v autoimmunizes.v autoinduces.v autoinducts.v autoinjects.v autolises.v automatises.v autoperfuses.v autopsies.v autoradiographs.v autoregulates.v autosensitises.v autotransplants.v auxotypes.v avalanches.v avalanchs.v avianises.v avianizes.v avows.v avulses.v awakes.v axotomises.v axotomizes.v azotizes.v babies.v baby-sits.v babys.v backcrosses.v backdrops.v backlabells.v backlabels.v backscatters.v ballasts.v ballots.v balls.v bamms.v baptises.v barbers.v bariumizes.v barracks.v barrages.v bastardizes.v bas.v bayonets.v beaches.v beads.v beavers.v bedaubs.v bedecks.v behooves.v behoves.v beleaguers.v bells.v benefices.v benzoylates.v bereves.v besets.v besmears.v betroths.v betters.v biasses.v bibs.v bicompartmentalises.v binges.v bings.v bioactivates.v bioassays.v bioconverts.v bioengineers.v biomagnifies.v bio-monitors.v biomonitors.v biopsies.v bioreduces.v bioremediates.v biosynthesises.v biosynthesizes.v biotinylates.v biotransforms.v biotypes.v bisintercalates.v bivouacks.v blacks.v blancos.v blanks.v blobs.v bloodies.v bloods.v blues.v blusters.v boats.v bobsleds.v boobs.v boomerangs.v boosters.v bootstraps.v bottlenecks.v brains.v brain-washes.v brazes.v breakfasts.v breast-feeds.v breasts.v brevets.v broadsides.v brods.v bromates.v brominates.v bromizes.v bruits.v brutalises.v bruxes.v buckets.v buffers.v bulbectomizes.v bulks.v bulls.v bunkers.v burkes.v burks.v burrs.v busses.v caches.v caks.v calenders.v calipers.v calks.v callipers.v calumniates.v canalizes.v cancerises.v cankers.v cannulates.v cannulizes.v canopies.v canopys.v cantilevers.v cants.v capacitates.v capillarises.v capitalises.v capitates.v caponises.v caponizes.v captains.v carbamoylates.v carbamylates.v carbolates.v carbolises.v carbolizes.v carbonates.v carbonises.v carboxylates.v cardiectomizes.v careers.v cartoons.v cashiers.v catabolises.v catalises.v catalizes.v catalogs.v catalyses.v catalyzes.v categorises.v catheterises.v catheterizes.v caulks.v causticizes.v cauterises.v cauterizes.v cavitates.v C-bands.v cementifies.v centrifugalises.v centrifugalizes.v centrifugates.v centrifuges.v ceres.v certificates.v chaffs.v chamfers.v champs.v chances.v chaperones.v chaps.v characterises.v charbroils.v checkers.v cheeks.v chemoattracts.v chemo-prevents.v chemoprevents.v chemo-sensitises.v chemo-sensitizes.v chemosensitizes.v chequers.v chickens.v chines.v chinks.v chins.v chlores.v chloroformises.v chloroformizes.v chloroforms.v chlors.v chocks.v cholecystectomises.v cholecystectomizes.v choruses.v chorusses.v chromates.v chromatizes.v chromatographs.v chromicizes.v chunks.v chutes.v cicatrises.v cicatrizes.v ciphers.v circularises.v circumducts.v civilises.v clamors.v classes.v clear-cuts.v clearcuts.v clews.v clocks.v clouts.v clues.v clysterizes.v coactivates.v coadministers.v co-agglutinates.v co-applies.v coapplies.v coapts.v coarticulates.v co-assembles.v coassembles.v cocainises.v cocainizes.v co-calibrates.v cocalibrates.v co-chromatographs.v cochromatographs.v co-circulates.v co-clusters.v coclusters.v co-colonizes.v cocolonizes.v cocoons.v co-crystallizes.v cocrystallizes.v co-cultivates.v cocultivates.v cocultures.v co-develops.v co-electroporates.v coelectroporates.v coelutes.v co-encapsidates.v coencapsidates.v coencapsulates.v co-enriches.v coenriches.v co-exists.v co-exposes.v coexposes.v coexpresses.v co-extracts.v cografts.v cogwheels.v co-hybridises.v cohybridises.v co-hybridizes.v cohybridizes.v coimmobilises.v coimmobilizes.v coinfects.v coinfuses.v co-ingests.v coingests.v co-inherits.v coinherits.v co-inoculates.v coinoculates.v cokes.v collateralises.v collectivises.v colliquates.v colonises.v colonoscopes.v colorises.v colorizes.v colourizes.v co-manages.v comanages.v comedicates.v cometabolises.v commercialises.v compartmentalises.v compartments.v compasses.v compeers.v complexes.v comports.v computerises.v concatenates.v conceptualises.v concords.v concretes.v concusses.v condoles.v conds.v conduces.v conglomerates.v conglutinates.v consternates.v constitutionalizes.v contradistinguishes.v contraindicates.v controverts.v contunds.v contuses.v convolutes.v co-ordinates.v coossifies.v co-oxidises.v cooxidises.v co-oxidizes.v cooxidizes.v co-partitions.v co-perfuses.v coperfuses.v copolymerises.v copolymerizes.v coppers.v coproduces.v co-promotes.v copromotes.v corbells.v corbels.v co-rears.v corears.v co-registers.v co-regulates.v coregulates.v co-releases.v coreleases.v corkscrews.v cornifies.v corns.v co-secretes.v cosecretes.v cosegregates.v cosensitises.v cosensitizes.v coshes.v cosolubilises.v cosolubilizes.v co-sponsors.v cosponsors.v cossets.v costarrs.v co-stimulates.v costimulates.v co-stores.v costores.v co-synthesises.v cosynthesises.v co-synthesizes.v cosynthesizes.v cotranscribes.v cotransfects.v co-transfers.v cotransfers.v cotransforms.v cotransmits.v co-transports.v cotransports.v co-treats.v cotreats.v coulorises.v counsells.v counterpoises.v counterregulates.v countersinks.v counterstains.v counter-transports.v countertransports.v countervails.v courses.v covenants.v cows.v cozens.v crabbes.v crabbs.v crabs.v crafts.v crapes.v craters.v crates.v crepes.v creps.v crews.v cricks.v criminalises.v criminalizes.v crimsons.v crisps.v criss-crosses.v cristallises.v cristallizes.v criticises.v critiques.v crocks.v cross-clamps.v crossclamps.v cross_fertilizes cross-links.v cross_matches cross-matches.v crossmatches.v cross-protects.v crossprotects.v cross-reacts.v crossreacts.v cross-references.v crossreferences.v crusts.v cryo-fixes.v cryofixes.v cryo-preserves.v cryopreserves.v cryoprotects.v cryo-sections.v cryotreates.v cryotreats.v crystallises.v cuckoos.v cudgells.v cumbers.v cunds.v curarises.v curarizes.v curates.v curets.v curettes.v curtains.v cusses.v customises.v customizes.v cyanylates.v cyclises.v cyphers.v cyto-adheres.v cytoreduces.v cytostains.v dansylates.v dapples.v deacetylates.v deactivates.v deacylates.v de-adenylates.v deadenylates.v deafferentates.v deafferents.v deallergises.v deamidates.v deamidizes.v deaminates.v debouches.v debranches.v debrides.v debulks.v debutes.v decalcifies.v decannulates.v decapsulates.v decarboxylates.v decatenates.v decentralises.v decerebrates.v decerebrizes.v dechlorinates.v decidualises.v declutches.v decocts.v decolonises.v decolorises.v decolorizes.v decolourises.v decolourizes.v decomplementizes.v decontrols.v deconvolutes.v decoronates.v decorticates.v decouples.v decoupls.v decoys.v decrees.v deemanates.v de-energises.v deenergises.v de-energizes.v deenergizes.v de-epicardializes.v deepithelialises.v deethylates.v defaecates.v defaunates.v defeminises.v defeminizes.v defenestrates.v defibrillates.v defibrinates.v deflorates.v defocuses.v deformylates.v defunctionalises.v defunctionalizes.v degalactosylates.v degases.v degausses.v degenitalizes.v deglycerates.v degreases.v dehaematises.v dehalogenates.v dehematizes.v dehemoglobinizes.v dehiscs.v dehorns.v dehulls.v dehumanises.v dehydrochlorinates.v dehydrogenates.v dehydrogenises.v dehydrogenizes.v dehydroxylates.v dehypnotises.v dehypnotizes.v deinduces.v deinstitutionalizes.v deionises.v deionizes.v dejects.v de-leads.v deleads.v delimitates.v delipidates.v delocalises.v delocalizes.v delouses.v demagnetises.v demarks.v demasculinises.v demedullates.v demembranates.v demetalises.v demetalizes.v demethylates.v demilitarises.v demineralises.v demineralizes.v demobilises.v democratises.v demodulates.v demonetises.v demonetizes.v demoralises.v demustardizes.v demyelinates.v demystifies.v denationalises.v denatures.v denervates.v denitrates.v denitrifies.v deodorises.v deoxidises.v deoxidizes.v deoxygenates.v depancreatizes.v deparaffinises.v deparaffinizes.v departmentalises.v depersonalizes.v dephosphorylates.v depigments.v depilates.v depolarises.v depoliticises.v depoliticizes.v depolymerises.v depotentiates.v depraves.v depressurises.v depressurizes.v deprojects.v deprotects.v deproteinates.v deprotonates.v depurates.v deputes.v deputises.v dequenches.v deregulates.v derepresses.v deresinates.v derivatises.v derivatizes.v derivitises.v derivitizes.v deroofs.v derotates.v derricks.v desalinises.v desalts.v desamidates.v desamidizes.v descales.v desensitises.v desexualises.v desexualizes.v desheathes.v desheaths.v desialylates.v desolates.v desolvates.v desorbs.v despeciates.v destabilises.v destablises.v destablizes.v destains.v desulfates.v desulfurates.v desulphates.v desulphurates.v desynchronises.v dethyroidizes.v detours.v detoxicates.v deuterates.v deuteriates.v devascularizes.v devils.v devitalises.v devitalizes.v deworms.v dextrinates.v dextrinizes.v diacetylates.v diacylates.v diagrams.v dialkylates.v dialogs.v dialogues.v dialyses.v diapauses.v diapers.v diazotizes.v dibbles.v dickers.v dideuterates.v diesterifies.v difluorinates.v digitalises.v digitilises.v digitises.v digitizes.v dihalogenates.v dihydrogenates.v dihydroxylates.v diiodinates.v dikes.v dilatates.v dimerises.v dimethylates.v dimites.v dimits.v dimples.v diphosphorylates.v dirties.v disacidifies.v disadvantages.v disaggregates.v disambiguates.v disarrays.v disbelieves.v disbuds.v disburdens.v discolours.v discommodes.v discommods.v discomposes.v disconfirms.v discos.v discountenances.v discretises.v discretizes.v disembodies.v disencumbers.v disfavors.v dishabituates.v dishevels.v dishonors.v disimmunizes.v disinhibits.v disinserts.v disjoints.v dismutates.v disoccludes.v disorders.v disorganises.v disorganizes.v dispensarises.v dispensarizes.v dispirits.v disproportionates.v disquiets.v disregulates.v dissatisfies.v dissimilates.v distempers.v distrains.v divulses.v dockets.v dollies.v dolls.v dollys.v domiciles.v dorsalises.v dorsiducts.v dorsiflexes.v doses.v dosses.v douches.v dowels.v downmodulates.v downregulates.v downstages.v dowses.v dramatises.v drats.v drivels.v drudges.v dumfounds.v duns.v duplexes.v dykes.v dysregulates.v ears.v earths.v echolocates.v economises.v ecphorises.v ecphorizes.v ectropionises.v ectropionizes.v editorialises.v educes.v edulcorates.v effectuates.v effluxes.v effs.v egests.v ekphorizes.v elates.v electro-cauterises.v electrocauterises.v electro-cauterizes.v electrocauterizes.v electrodialyses.v electroelutes.v electro-injects.v electroinjects.v electroinserts.v electrophoreses.v electrophores.v electroplates.v electroporates.v electrotransfers.v electroverts.v elutes.v elutriates.v emaciates.v embolises.v embrocates.v emedullates.v empathises.v emphasises.v emplaces.v emulsions.v enamors.v enamours.v encapsulates.v enchains.v encores.v encrusts.v endarterectomises.v endarterectomizes.v endoscopes.v endothelialises.v endues.v energises.v energizes.v enfeebles.v engrafts.v engrails.v enkindles.v enlaces.v enlacs.v enplanes.v enraptures.v ensheathes.v ensheaths.v ensilages.v ensiles.v enterectomises.v enterectomizes.v entrenches.v entropionizes.v envenoms.v environs.v enwraps.v epilates.v epimerises.v epithelialises.v epithelializes.v epithelises.v epithelizes.v epitomises.v epoxidises.v epoxidizes.v equalises.v equilibrates.v eroticises.v eroticizes.v erotises.v erotizes.v essays.v esterifies.v estranges.v estrogenises.v estrogenizes.v etherises.v etherizes.v ethylates.v euthanatises.v euthanatizes.v euthanises.v euthanizes.v evaginates.v everts.v evidences.v exacts.v exanimates.v excerpts.v exchange-transfuses.v excogitates.v execrates.v exenterates.v exorcises.v expatriates.v exsanguinates.v exsects.v exsomatizes.v exteriorises.v exteriorizes.v externalises.v extrudes.v extubates.v factorises.v factorizes.v faggots.v fagots.v familiarises.v fantasises.v faradises.v faradizes.v farnesylates.v fathers.v feather-beds.v fecundates.v federalises.v federalizes.v felicitates.v feminises.v feminizes.v fenestrates.v fertilises.v feus.v fictionalises.v fictionalizes.v field-tests.v filches.v filtrates.v finalises.v fingerprints.v fire-proofs.v fireproofs.v fissures.v fistulises.v flabbergasts.v flanges.v flecks.v fleshes.v flexibilises.v flexibilizes.v flounces.v floures.v flours.v fluidizes.v fluoresceinates.v fluoridises.v fluoridizes.v fluoroscopes.v flutes.v foals.v focalises.v fogs.v footles.v footnotes.v footprints.v footslogs.v forays.v forbodes.v forebids.v forebodes.v foredooms.v foregrounds.v foreknows.v forests.v foretastes.v formalinises.v formalinizes.v formalises.v formats.v formylates.v fossilises.v fowls.v foxs.v fractionates.v franchises.v fraternises.v freckles.v free-grafts.v freeze_dries freeze-dries.v freeze-fractures.v freights.v fringes.v frolicks.v fruits.v fuddles.v functionalises.v functionalizes.v funks.v furcates.v furs.v gabbles.v gabs.v gads.v galactosylates.v galavants.v galivants.v galvanises.v gamms.v ganglionectomises.v ganglionectomizes.v gangrenes.v gaps.v garages.v garlands.v garotes.v garots.v garrotes.v garrots.v gases.v gasses.v gastrectomises.v gastrectomizes.v gates.v gavages.v gazetes.v gazets.v gelatinises.v gelds.v generalises.v genotypes.v gens.v gentles.v geocodes.v geranylgeranylates.v ghosts.v gingers.v girdles.v girts.v glaces.v glamorises.v glissades.v globalises.v glomectomises.v glomectomizes.v gloms.v gloves.v glucoronises.v glucuronidates.v glues.v glycates.v glycerolates.v glycerolizes.v glycosylates.v gonadectomizes.v gooses.v gormandises.v gowns.v grains.v grandfathers.v grandparents.v graphs.v grasses.v greens.v grimes.v grizzles.v grommets.v grubs.v guests.v gulls.v gussets.v guys.v habilitates.v habituates.v haemagglutinates.v haemoagglutinates.v haemocoagulates.v haemodialyses.v haemodialyzes.v haemodilutes.v haemolyses.v haemolyzes.v haemoperfuses.v haemorrhages.v hallmarks.v halogenates.v handpicks.v haploidises.v haps.v haptenates.v harmonises.v hasps.v headlines.v hemicastrates.v hemi-deletes.v hemisects.v hemispherectomises.v hemispherectomizes.v hemodialyses.v hemodialyzes.v hemodilutes.v hemolyses.v hemoperfuses.v hemorrhages.v heparinises.v heparinizes.v hepatectomises.v hepatectomizes.v heterodimerises.v hexes.v hies.v high-jacks.v hirudinizes.v histocultures.v hobos.v holes.v holidays.v homes.v homodimerises.v homodimerizes.v homogenises.v homografts.v honeycombs.v hoops.v horses.v hospitalises.v hots.v hoves.v hoxes.v humanises.v humanizes.v humors.v hurdles.v husbands.v hyalinises.v hyalinizes.v hybridises.v hydrogenates.v hydrogenizes.v hydrolises.v hydrolizes.v hydrolyses.v hydroxylates.v hyes.v hymns.v hyperacetylates.v hyperactivates.v hypercontracts.v hyperdefaecates.v hyperexpresses.v hyperextends.v hyperfiltrates.v hyperfractionates.v hyperimmunises.v hyperimmunizes.v hyper-induces.v hyperinduces.v hyperinnervates.v hyperluteinises.v hyper-methylates.v hypermethylates.v hypernucleates.v hyperpolarises.v hyperproduces.v hypersensitises.v hyperstimulates.v hypertransfuses.v hypertrophies.v hypnoidizes.v hypnotises.v hypomineralises.v hypomineralizes.v hypo-phosphorylates.v hypophosphorylates.v hypophysectomises.v hypophysectomizes.v hyposensitizes.v hypothecates.v hysterectomises.v hysterectomizes.v idealises.v idolises.v imbeds.v immobilises.v immortalises.v immunises.v immunoabsorbs.v immunoadsorbs.v immuno-assays.v immunoassays.v immunoblots.v immunocompromises.v immunodepletes.v immunodepresses.v immunoenhances.v immunoexpresses.v immunoinhibits.v immunoisolates.v immunolabels.v immunolocalises.v immunolocalizes.v immunoneutralises.v immunoneutralizes.v immunophenotypes.v immunopurifies.v immunoradioassays.v immunoregulates.v immunoscreens.v immunoselects.v immunostains.v immunostimulates.v immunosuppresses.v immuno-targets.v immunotargets.v immunotitrates.v immunotypes.v immures.v impersonalises.v impersonalizes.v importunes.v incises.v incloses.v incommodes.v increments.v inculpates.v individualises.v individualizes.v indorses.v indues.v industrialises.v inebriates.v influxs.v ingles.v ingrafts.v ingrains.v inhumes.v inhums.v initialises.v initializes.v inlays.v innervates.v inputs.v insets.v insolubilises.v insolubilizes.v insonifies.v instances.v institutionalises.v instruments.v insufflates.v intellectualises.v intellectualizes.v intercalates.v interconverts.v interfaces.v interiorises.v interiorizes.v interlaces.v interlards.v interleafs.v interlinks.v internalises.v internationalises.v interpellates.v interposes.v interspaces.v intrenches.v introjects.v introverts.v intrusts.v intubates.v inures.v inventorys.v invoices.v iodinates.v iodises.v ionises.v iontophoreses.v iridectomizes.v isoimmunises.v isoimmunizes.v isomerises.v italicises.v itemises.v jackets.v jack_knifes jackknifes.v jecorizes.v jejunectomises.v jejunectomizes.v jeopardises.v joints.v juices.v junks.v karyotypes.v keens.v kennels.v kents.v keratinises.v keys.v kinks.v knees.v KO's.v labilises.v labyrinthectomises.v labyrinthectomizes.v lacrymates.v lactonises.v ladders.v lambasts.v lambs.v lames.v laminectomises.v laminectomizes.v lams.v laparotomises.v laparotomizes.v lapinises.v lapinizes.v lards.v lariates.v lariats.v larks.v laryngectomises.v laryngectomizes.v lasers.v lassoes.v lassooes.v lateralises.v lathers.v lathes.v lavages.v layers.v leaflets.v leagues.v leap-frogs.v leashs.v leechs.v leeps.v legalises.v legitimates.v legitimatises.v legitimises.v legitimizes.v lentectomizes.v lesions.v letters.v liberalises.v ligates.v lilts.v limes.v limns.v linearizes.v linges.v lings.v lins.v lipectomises.v lipectomizes.v lipidates.v liposuctions.v lipoxygenates.v lips.v liquifies.v lithographs.v lithotomizes.v lobectomises.v lobectomizes.v lobotomises.v lobotomizes.v looses.v lords.v Lords.v loupes.v loups.v loures.v lours.v lows.v lubrifies.v lucks.v luteinises.v luxates.v lymphadenectomises.v lymphadenectomizes.v lyophilises.v lyophilizes.v lypophilises.v lypophilizes.v lysogenises.v lysogenizes.v macadamises.v macadamizes.v machines.v macroencapsulates.v magnetises.v mainstreams.v malaxates.v malignises.v malpositions.v malts.v mantles.v manumits.v manures.v marathons.v Marathons.v marginates.v marinades.v marsupializes.v masculinises.v masculinizes.v massacres.v mastectomises.v mastectomizes.v master-minds.v materialises.v mats.v maximises.v mazes.v mechanises.v medialises.v medicalises.v medicalizes.v medisects.v medullectomises.v medullectomizes.v melanises.v melanizes.v mentors.v mercerises.v mercerizes.v merchandises.v mercurates.v mercurializes.v mercuriates.v mesmerises.v metabolises.v metabolizes.v metals.v metastasises.v meters.v methylates.v metres.v metricises.v micellises.v microagglutinates.v microaggregates.v microbiopsies.v microcannulates.v microcatheterises.v microcatheterizes.v microcomputerises.v microcomputerizes.v microdetermines.v microdilutes.v microdissects.v microembolises.v microfills.v microfilters.v microinjects.v micromanipulates.v micromills.v micromodifies.v micronises.v micronizes.v microperfuses.v microprocesses.v microsequences.v microtitrates.v microtomes.v microwaves.v middles.v mildews.v militarises.v militarizes.v mimetises.v mimetizes.v mineralises.v mineralizes.v miniaturises.v minifies.v minimises.v minutes.v misadvises.v misattributes.v miscalls.v misclassifies.v miscodes.v misconducts.v misdiagnoses.v mis-folds.v misidentifies.v misincorporates.v mislabels.v mislocalises.v mislocalizes.v mismatches.v mispairs.v misperceives.v misprints.v misrecognises.v misrecognizes.v misregulates.v misrepairs.v misroutes.v misrules.v misspecifies.v mis-tunes.v mistunes.v miters.v mitres.v mobilises.v modernises.v moires.v moisturises.v moisturizes.v molders.v monophosphorylates.v monopolises.v moonlights.v moralises.v morcellates.v morphinizes.v morses.v Morses.v mortices.v mortises.v mothers.v moth-proofs.v motorcycles.v motorises.v muckrakes.v mulcts.v multimerises.v mummifies.v mummys.v mumps.v muscles.v muscularises.v mutagenizes.v myectomizes.v myristoylates.v narcotizes.v narks.v nasalises.v nasalizes.v nationalises.v naturalises.v nauseates.v nebulises.v nebulizes.v necropsies.v necrotises.v negatives.v neighbors.v neighbours.v nephrectomises.v neps.v nerves.v nesslerises.v nesslerizes.v neuromodulates.v neurostimulates.v neutralises.v niches.v nickels.v nims.v Nissl-stains.v nitrates.v nitrosates.v nitrosylates.v nobbles.v nonpluses.v nooses.v normalises.v noses.v notchs.v objectifies.v objurgates.v oblates.v obtrudes.v obtunds.v obturates.v oestrogenises.v oestrogenizes.v oints.v O.K.s.v OKs.v oligomerises.v oligomerizes.v oophorectomises.v oophorectomizes.v operationalises.v operationalizes.v oppugns.v opsonifies.v opsonises.v optimises.v optimizes.v orchidectomises.v orchidectomizes.v ordinates.v organises.v orphans.v osmicates.v osteotomises.v osteotomizes.v ostracises.v outbides.v outbraves.v out-competes.v outcompetes.v outdates.v outfaces.v out-Herods.v outmaneuvers.v outmarches.v outmatches.v out-paces.v outpaces.v outperforms.v outpoints.v outputs.v outranges.v outrangs.v outrivals.v outsails.v outspreads.v outstrips.v outvies.v outwears.v ovariectomises.v ovariectomizes.v overarches.v over-associates.v overassociates.v over-burdens.v over-capitalises.v overcapitalises.v over-capitalizes.v overcapitalizes.v over-charges.v over-consumes.v overconsumes.v over-cooks.v overcorrects.v overcrops.v over-crowds.v over-detects.v overdetects.v overdiagnoses.v overdoses.v over-eats.v over-elongates.v overelongates.v overemphasises.v over-emphasizes.v over-estimates.v over-exerts.v over-exposes.v overexpresses.v over-feeds.v over-hangs.v overhangs.v over-heats.v over-inserts.v overinserts.v overlays.v over-learns.v overlearns.v overleeps.v overmasters.v over-praises.v over-predicts.v overpredicts.v over-produces.v over-proliferates.v over-refers.v overrefers.v over-reports.v overreports.v over-represents.v overrepresents.v oversaturates.v over-secretes.v oversews.v over-simplifies.v over-stages.v overstages.v overstains.v overstimulates.v over-strains.v over-stretches.v overstretches.v over-synthesises.v oversynthesises.v over-synthesizes.v oversynthesizes.v over-transcribes.v overtreats.v overuses.v over-values.v overventilates.v overviews.v over_weights overweights.v over-wraps.v overwraps.v oxidises.v oxygenises.v oxygenizes.v ozonises.v ozonizes.v palisades.v palliates.v palpates.v palps.v pancreatectomizes.v panels.v paragraphs.v parameterises.v parameterizes.v parasitises.v parasitizes.v parasols.v parathyroidectomizes.v parboils.v parcels.v parrots.v particularises.v pasteurises.v pastures.v patronises.v peans.v peens.v pelletises.v pelletizes.v pellets.v penalises.v pensions.v peoples.v pepsinates.v pepsinises.v pepsinizes.v peptonises.v percusses.v perifuses.v peritomizes.v peritonealizes.v peritonizes.v permeabilizes.v permeablises.v peroxidises.v personalises.v pestles.v phagocytises.v phagocytizes.v phagocytoses.v phalangizes.v phenocopies.v phenolates.v phenotypes.v philosophises.v phlebotomises.v phlorhizinises.v phlorhizinizes.v phloridzinises.v phloridzinizes.v phosphonylates.v phosphorylates.v photoactivates.v photobleaches.v photodamages.v photodecomposes.v photoinactivates.v photoinduces.v photoisomerises.v photolabels.v photolyses.v photo-oxidises.v photooxidises.v photo-oxidizes.v photopolymerises.v photopolymerizes.v photoprotects.v photoreduces.v photoregulates.v photoreverses.v photosensitises.v photostates.v photostimulates.v physicks.v piggybacks.v pillows.v pills.v pinds.v pinealectomises.v pinealectomizes.v pinions.v pinks.v pin-points.v pipettes.v piths.v plagiarises.v plaits.v planimeters.v planks.v plasmolyses.v plasmolyzes.v plateaus.v plates.v platinates.v pleas.v pleats.v plicates.v plumps.v plums.v plunks.v pneumonectomises.v pneumonectomizes.v pods.v polarises.v pole-axes.v poleaxes.v poleaxs.v politicises.v politzerizes.v pollacks.v pollards.v polyadenalates.v polyadenylates.v polyglutamylates.v polymerises.v polymerizes.v pomades.v pommels.v poniards.v popularises.v portacaval_shunts portions.v postfixes.v potentiates.v poultices.v powers.v prawns.v preabsorbs.v preachifies.v preadmits.v precepts.v precises.v precoats.v precooks.v precools.v precultures.v predates.v predeceases.v predefines.v predestinates.v pre-digests.v predigests.v pre-embeds.v preembeds.v pre-establishes.v preestablishes.v preexists.v pre-exposes.v preexposes.v prefeeds.v prefixs.v preimmunizes.v preinduces.v preinfects.v pre-irradiates.v preirradiates.v prelabels.v preloads.v preludes.v premedicates.v premiers.v premixes.v prepossesses.v preprints.v preprocesses.v preprograms.v preprotects.v preps.v prereduces.v prescreens.v preselects.v presensitizes.v pre-sets.v presets.v presoaks.v prespawns.v prespecifies.v pressurises.v prestimulates.v pre-surfaces.v pretrains.v pretreats.v previews.v prewarms.v prewashes.v prickles.v prioritises.v prioritizes.v prises.v privatises.v probates.v profanes.v professionalizes.v prolates.v prongs.v propagandises.v prophesies.v propitiates.v prorates.v prorogues.v proselytises.v prospects.v prostatectomises.v prostatectomizes.v proteolyses.v proteolyzes.v protracts.v provisions.v pseudonormalises.v psycho-analyses.v psycho-analyzes.v psychs.v ptyalizes.v publicises.v puddles.v pulps.v pulverises.v pups.v purposes.v purpurates.v putties.v pyridoxylates.v quadrisects.v quadruplicates.v quads.v quails.v quantises.v quantitates.v quantizes.v quarks.v quarrells.v quartisects.v quaternizes.v queens.v Queens.v quizzes.v rabbits.v radiographs.v radioimmunoassays.v radiolabells.v radiolabels.v radiolocalises.v radiolocalizes.v radiosensitises.v radiosensitizes.v ranches.v ranchs.v randomises.v randomizes.v rappels.v rarefies.v rases.v rationalises.v rays.v razors.v reabsorbs.v reaccumulates.v reacquires.v re-adapts.v readdresses.v readds.v readies.v readministers.v re-afforests.v reafforests.v reaggregates.v realigns.v realises.v reallocates.v re-amplifies.v reamplifies.v reamputates.v reams.v reanalyses.v reanalyzes.v re-animates.v reanimates.v reappraises.v re-approximates.v reapproximates.v re-arterialises.v rearterialises.v re-arterializes.v rearterializes.v reasserts.v reassigns.v reassociates.v reassorts.v reattaches.v rebases.v rebinds.v rebles.v recalcifies.v recalibrates.v recanalizes.v recategorises.v recategorizes.v recatheterises.v recatheterizes.v receipts.v recemises.v recertifies.v rechallenges.v rechromatographs.v recirculates.v reclassifies.v reclones.v recodes.v recognises.v recolonises.v recombines.v recompresses.v reconceptualizes.v reconfigures.v reconnoiters.v reconstitutes.v recontaminates.v recontoures.v recontours.v re-converts.v re-counts.v re-covers.v recultivates.v recultures.v redacts.v rededicates.v redescribes.v redes.v redetects.v redetermines.v redirects.v redissects.v reds.v reeducates.v re-elevates.v reemphasizes.v re-endothelialises.v reendothelialises.v re-endothelializes.v re-engineers.v reengineers.v re-enters.v re-epithelialises.v reepithelialises.v re-epithelializes.v re-equilibrates.v re-esterifies.v reesterifies.v reevaluates.v re-examines.v reexamines.v re-excises.v reexcises.v re-explores.v reexplores.v reexposes.v reexpresses.v re-extracts.v reextracts.v refaces.v refeeds.v referees.v references.v referes.v refinishes.v refluxes.v refolds.v reforests.v reformats.v reframes.v regionalises.v regionalizes.v regrafts.v regularises.v rehears.v reheats.v rehospitalises.v rehospitalizes.v reimmunizes.v re-implants.v reimplants.v reincarcerates.v reincarnates.v re-inflates.v reinitiates.v reinjects.v reinjures.v reinnervates.v reinoculates.v reinserts.v reinstitutes.v re-internalises.v reinternalises.v re-internalizes.v reinternalizes.v re-interviews.v reinterviews.v reintroduces.v reintubates.v re-invents.v re-irradiates.v reisolates.v rejigs.v re-joins.v relabels.v relaparoscopies.v relearns.v relines.v relipidates.v relocalises.v relocalizes.v remainders.v remakes.v remaps.v remediates.v remilitarises.v remobilises.v remyelinates.v renatures.v renegues.v re-obliterates.v reobliterates.v re-occludes.v re-occurrs.v reoccurrs.v reorganises.v reoxidises.v reoxygenates.v repartitions.v repatterns.v reperforates.v reperfuses.v reperitonealises.v reperitonealizes.v replates.v repoints.v repolarises.v repopulates.v reposes.v repositions.v reposits.v repots.v reprimes.v reprobates.v reprocesses.v reprograms.v republishes.v repurifies.v requites.v requits.v resamples.v rescans.v re-scoers.v rescoers.v re-scores.v rescores.v rescreens.v reseals.v resects.v resensitises.v resequences.v residualises.v residualizes.v re-slices.v reslices.v resocialises.v resocializes.v resolubilizes.v resorbs.v respells.v restages.v restains.v re-stenoses.v restimulates.v restretches.v restudies.v resulfates.v resulphates.v resurveys.v resuspends.v resutures.v resynthesises.v resynthesizes.v retrains.v retransforms.v retransfuses.v retransplants.v retraumatizes.v retreads.v re-treats.v retrocedes.v retrofits.v retrotranscribes.v retypes.v reuses.v reutilises.v reutilizes.v revaccinates.v revalidates.v revascularises.v revascularizes.v reveils.v revendicates.v revenges.v revitalises.v revivifies.v revolutionalises.v revolutionalizes.v revolutionises.v rewarms.v reworks.v rexes.v rhapsodises.v ribosylates.v ricks.v ridges.v rimes.v rits.v ritualises.v ritualizes.v rives.v robes.v romanticises.v roneos.v rongeures.v rongeurs.v roofs.v rooks.v rosets.v rosettes.v rosines.v rosins.v rouges.v rough-casts.v roughcasts.v rough-dries.v roughhouses.v rowels.v rubberises.v ruddles.v ruffs.v rumours.v rusks.v ruts.v sabers.v sabres.v salaams.v salifies.v sallows.v salves.v sandaracks.v sandaracs.v sand-blasts.v sanitises.v sanitizes.v sates.v saucerizes.v savors.v savvies.v scabs.v scallops.v scamps.v scams.v scapegoates.v scar_cicatrises scarifies.v sclerotises.v sclerotizes.v scollops.v scourges.v scrabbles.v scrags.v scribes.v scrimmages.v scripts.v scruples.v scrutinises.v SCUBAs.v scuds.v scuppers.v scythes.v seams.v secludes.v sections.v sectors.v secularises.v sediments.v segments.v semaphores.v semisynthesises.v semisynthesizes.v sensibilises.v sensibilizes.v sensitises.v sequences.v sequestrates.v serialises.v serogroups.v serotypes.v servo-controls.v servocontrols.v sexes.v sexs.v sexualises.v sexualizes.v shafts.v shallows.v shanghais.v shanghis.v sheers.v sheets.v shellacks.v shellacs.v shims.v shins.v shipwrecks.v shods.v shoes.v short-lists.v shrines.v shrives.v shuttles.v sialadenectomizes.v sialylates.v sickles.v sics.v side-tracks.v signalises.v signalizes.v siliconises.v siliconizes.v silts.v silvers.v silylates.v singularises.v singularizes.v sinters.v sites.v situates.v skateboards.v skeines.v skeins.v skeletonises.v slangs.v slats.v sleds.v sleighs.v slenderises.v sleuths.v slivers.v slops.v sludges.v sluices.v smirches.v smuts.v snaffles.v snicks.v snugs.v soaps.v socialises.v sods.v soft-soaps.v soft-solders.v solaces.v solates.v solemnises.v solemnizes.v soles.v soliloquises.v solos.v solubilises.v solubilizes.v solvates.v somatises.v somatotypes.v sonicates.v soots.v sorbs.v sorrows.v sovietizes.v spangles.v spatchcocks.v spates.v spatulates.v spilts.v spindles.v spiralises.v spiritualises.v spiritualizes.v spirts.v splenectomises.v splenectomizes.v splints.v splotchs.v spoofs.v spooks.v spools.v spoons.v sporulates.v spuds.v squeegees.v squelches.v stables.v stags.v stanches.v standardises.v steam-heats.v steam-rollers.v stencils.v sterilises.v stewards.v stigmatises.v stock-piles.v stockpiles.v stomaches.v stomps.v stoppers.v strands.v strangulates.v striates.v strictures.v strops.v strychnizes.v stultifies.v stupefies.v stylises.v subcategorises.v subcategorizes.v sub-classifies.v subclassifies.v subcompartmentalises.v subcompartmentalizes.v subcultivates.v subcultures.v subexcites.v subgroups.v subindexes.v subjoins.v sublimes.v sublocalises.v sublocalizes.v subluxates.v suborns.v subsaturates.v subsidises.v subspecialises.v subtitles.v subtypes.v suctions.v sugars.v sulfates.v sulfonates.v sulfurates.v sulfuretes.v sulfurets.v sulfurizes.v sulphates.v sulphonates.v sulphurates.v sulphuretes.v sulphurets.v sulphurises.v sulphurizes.v summarises.v superactivates.v superannuates.v supercools.v superducts.v superfuses.v superhydrates.v superinduces.v superintends.v superposes.v superprecipitates.v supersaturates.v supershifts.v suprarenalectomizes.v surcharges.v surfeits.v suscitates.v sutures.v swabs.v swaddles.v swages.v swans.v swills.v swinges.v swobs.v swops.v syllabicates.v syllabifies.v syllabizes.v symbolises.v sympathectomises.v sympathectomizes.v sympathises.v synapses.v synchronises.v synergises.v synonymizes.v synostoses.v synthesises.v synthetises.v synthetizes.v syringes.v systematises.v taboos.v tabus.v tape-records.v tares.v tarmacks.v tarmacs.v tees.v telecommunicates.v telefaxs.v telepathizes.v teletransmits.v tempers.v temporises.v tenants.v tenons.v tenotomizes.v tents.v tenures.v terrorises.v teslaizes.v tetanises.v tetanizes.v tetramerises.v thermalises.v thermocauterises.v thermocauterizes.v thermocycles.v thermoregulates.v thermosensitises.v thermosensitizes.v thoracotomises.v thoracotomizes.v threshes.v thwacks.v thymectomises.v thymectomizes.v thymolizes.v thyroidectomises.v thyroidectomizes.v thyroidizes.v thyroparathyroidectomizes.v timetables.v tinctures.v tittivates.v toggles.v tolerises.v tolerizes.v tonicizes.v tonsillectomizes.v tonsures.v tools.v top-dresses.v torques.v torrefies.v tosylates.v trabeculates.v tracheostomizes.v tracheotomizes.v traduces.v trafficks.v traffics.v trammels.v tranquillises.v transactivates.v transdifferentiates.v transduces.v transects.v transesterifies.v transfects.v transfigures.v tranships.v transilluminates.v transits.v transliterates.v translocates.v transmogrifies.v transphosphorylates.v transsects.v trapses.v traumatises.v traumatizes.v travestys.v treadles.v trees.v trellises.v trenchs.v trends.v trepans.v trephines.v triangulates.v trichinizes.v trills.v triplicates.v trisects.v tritiates.v triturates.v trivialises.v trolls.v troops.v trucks.v trues.v trusses.v trypsinises.v trypsinizes.v tubularizes.v turfs.v turgidizes.v twines.v twins.v twits.v tyrannises.v ubiquitinates.v ultrapurifies.v ultrasonicates.v unbars.v unbinds.v unbosoms.v unbridles.v uncaps.v unclamps.v unclips.v unclogs.v uncuffs.v undeceives.v undercalls.v underdetects.v underdiagnoses.v underemphasises.v underemphasizes.v underexerts.v under-feeds.v undernourishes.v underpredicts.v undersedates.v understages.v understains.v undertreats.v underuses.v underutilises.v underutilizes.v unfits.v unhorses.v universalizes.v unmans.v unroofs.v unsays.v unseats.v unsexes.v unsticks.v upregulates.v uptakes.v urbanises.v utilises.v vacuums.v vagotomizes.v vails.v vandalises.v vandalizes.v vaporises.v vapourises.v vapourizes.v variegates.v variolates.v vascularises.v vascularizes.v vasectomizes.v vaunts.v vd.'s.v vd.s.v Vd's.v Vds.v veneers.v ventralises.v ventralizes.v ventriducts.v verbalises.v victimises.v victuals.v videos.v virilises.v virilizes.v visions.v visualises.v vitalises.v vitalizes.v vitrectomises.v vitrectomizes.v vivifies.v vocalises.v vogues.v volitilises.v vortexs.v vulcanises.v vulcanizes.v vulgarises.v vulnerates.v wagers.v wallpapers.v wands.v wardens.v wars.v waterlogs.v wearies.v weasels.v weekends.v wees.v weirs.v welches.v wells.v wenchs.v westernises.v whisks.v whizes.v whops.v winches.v winkles.v winters.v wises.v womanises.v wows.v wracks.v wreathes.v xanthates.v xenografts.v xeroxes.v Xeroxes.v x-rays.v xrays.v X-rays.v yarns.v yellows.v yokes.v zenkerizes.v zippers.v link-grammar-4.7.4/data/en/4.0.knowledge0000644000175000017500000003255211526022265016636 0ustar bloombloom; Post-processing knowledge file ; 6/96 ; ---------------------------------------------------------------------------- ; This file contains the knowledge related to post-processing, in the ; form of lists and rules. This file is read by post-process.c at run-time. ; Syntax of file: ; line starting with ";" is a comment ; commas are field delimiters ; any token beginning with the character @ is expanded to the set ; of symbols it defined. e.g. one could write ; FOO: blah1 blah2 blah3 ; thus defining a set FOO containing three strings. Then one could later write ; BAR: blah5 @FOO blah8 ; which defines a set BAR containing 5 strings. ; ; Capitalized tokens are *required*, though if you feel like providing an ; empty list afterwards, that's your right. ; ---------------------------------------------------------------------------- ; The following links start a domain. Each must be given a name in the ; table below (STARTING_LINK_TYPE_TABLE) DOMAIN_STARTER_LINKS: W Ce Cs Ca Cc Ci R* Rn Re RSe Mr QI#d Mv* Jr Mj Qd TOn TOi Mg* MVi Ss#d Bsd ER Z Ma#* SIs#g BIqx MX#p MX#a MX#r MX#j MV#o MV#p Eq COq CCq AFd PFc ; ---------------------------------------------------------------------- ; The following links start a urfl domain. They are also included in the ; domain, as opposed to regular starter links (above), which are not. A ; urfl domain includes links accessible from the root word, tracing to ; the right (as well as everything accessible from the left end of the ; starter link). URFL_DOMAIN_STARTER_LINKS: TOo I#j Pa##j CP ; ---------------------------------------------------------------------- ; The following start a urfl_only domain. These include _only_ links : ; reachable from the root word, tracing to the right. They aren't ; included in the domain URFL_ONLY_DOMAIN_STARTER_LINKS: SFsx Ss#g COp ; ---------------------------------------------------------------------- ; Links which start a domain and are also part of the domain. This must be ; a sublist of the domain_starter_list DOMAIN_CONTAINS_LINKS: Mg* Mx Bsd MX#a Ma#* Mv* MX#r Ss#d Ws Wq Qd Mj Wj Wi MX#j AFd PFc Jr Wd Mr ; ---------------------------------------------------------------------- ; These links are not put in the word/link graph. They also cannot be the ; starter links for a domain. (These links may also only be used in cycles.) IGNORE_THESE_LINKS: Xca ; ---------------------------------------------------------------------- ; These links may only be used in cycles. MUST_FORM_A_CYCLE_LINKS: R#* TOt EXx HA SFsic Jr JQ Xca ; ---------------------------------------------------------------------- ; These links are not traced further if they point back before the root word. ; The creation of Rw necessitated making B#m a restricted link, to ; prevent the (e) domain, started by Ce, from extending around through ; the Rw link. ; Reverted. ; This breaks parsing of ; How fast a program does he think it is ; I wonder how fast a program he thinks it is ; I wonder how much money you earned ; I wonder how many people you saw ; I wonder how big a department it is ; I wonder how much oil they spilled ; This is the man whose dog I bought ; I wonder which dog he said you chased ; How efficient a program is it ; Meanwhile, I can't find the Ce problem mentioned ... this needs more ; documentation! RESTRICTED_LINKS: B#* D##w B#w B#d AFh MVt Xx HL SFsic AFd Bc CX EAh H HA PFc B#j Wd PF Z ; H HA PFc B#j Wd PF Z B#m ; ---------------------------------------------------------------------- ; ---------------------- LINK TYPE TABLE------------------------------- ; ---------------------------------------------------------------------- ; The following table associates a domain type with each possible ; starting link. It contains pairs: the first of each pair is a link ; type, and the second is the domain to which that link type belongs. STARTING_LINK_TYPE_TABLE: Ce e R* r Rn r Re r W m RSe e Cs s Ca s Jr e Mr r Cc s Mv* e QI#d s BIqx s TOn e TOi e MVi e MV#o s MV#p s AFd s PFc s Mg* e Mj j Qd m MX#j j TOo x I#j x Pa##j x CP x COp d SFsx d Ss#g d SIs#g s Ss#d s Bsd s ER s Z s Ma#* e MX#p e Ci e MX#a e Eq e COq e CCq s MX#r r ; ---------------------------------------------------------------------- ; ----------------------- LINK SETS ------------------------------------ ; ---------------------------------------------------------------------- ; (Not in use at present; see comment at beginning of file) ; ---------------------------------------------------------------------- ; ----------------- RULES ---------------------------------------------- ; ---------------------------------------------------------------------- ; Explanation of syntax: as usual, each stanza begins with a label ; terminated by a colon. The interpretation of the rule depends on ; the label, as specified in each stanza. ; The following rule asserts that the linkage must *still* be connected ; when the specified set(s) of links are removed from the linkage. FORM_A_CYCLE_RULES: @MUST_FORM_A_CYCLE_LINKS , "'must form a cycle' violation0" ; For the following rules, if a domain contains a link matching the 1st ; column, it must also contain a linkage matching one of the members of the ; set in the 2nd column. The individual rules are demarcated by semicolons and ; the fields within a rule are demarcated by commas. CONTAINS_ONE_RULES: SI#* , Wq Qd CQ PFc , "Bad use of s-v inversion1" , SI#x , Wq Qd CQ PFc , "Bad use of s-v inversion2" , SFI##* , Wq Qd CQ PFc , "Bad use of s-v inversion3", SXI , Wq Qd CQ PFc , "Bad use of s-v inversion4" , Ws , D##w S##w H , "S-V inversion required5", I#a , B#m B#w , "incorrect use of 'to'6" , Wq , SI SFI SXI , "S-V inversion required7" , Qd , SI SFI SXI , "S-V inversion required8" , PFc , SI SFI SXI , "S-V inversion required9" , Mj , Jw JQ , "Incorrect relative10" , MX#j , Jw JQ , "Incorrect relative11" , Wj , Jw JQ , "Misuse of preposition12" , JQ , Mj Wj MX#j , "Misuse of preposition13" , Jw , Mj Wj MX#j , "Misuse of preposition14" , B#j , Jr , "Incorrect relative15" , Jr , B#j , "Incorrect relative16" , EAh , AF Bsm B*m Qe Ca AFm , "Incorrect use of 'how'17" , EEh , AF Bsm B*m Qe Ca AFm , "Incorrect use of 'how'18" , Qe , EEh , "Incorrect use of adverb19" , THi , SFsi SFIsi OXi , "Complement requires 'it'20" , TSi , SFsi SFIsi OXi , "Complement requires 'it'21" , QIi , SFsi SFIsi OXi , "Complement requires 'it'22" , TOi , SFsi SFIsi OXi , "Complement requires 'it'23" , Ci , SFsi SFIsi OXi , "Complement requires 'it'24" , COqi , SFsi SFIsi OXi , "Complement requires 'it'25" , CPi , SFsi SFIsi OXi , "Complement requires 'it'26" , Eqi , SFsi SFIsi OXi , "Complement requires 'it'27" , LEi , SFsi SFIsi OXi , "Complement requires 'it'28" , MVti , SFsi SFIsi OXi , "Complement requires 'it'29" , AFdi , SFsi SFIsi OXi , "Complement requires 'it'30" , O#i , SFsi SFIsi OXi , "Complement requires 'it'31" , SFst , O*t Ost Omt Bs#t B*#t Bc#t , "Bad use of 'there'32" , SFIst , O*t Ost Omt Bs#t B*#t Bc#t , "Bad use of 'there'33" , SFp , Opt Omt O*t Bp#t B*#t Bc#t , "Bad use of 'there'34" , ; ; This SFu rule forces subject-object agreement for uncountable noun objects SFu , Out Omt O*t Bp#t B*#t Bc#t , "Bad use of 'there'34a" , SFIp , Opt Omt O*t Bp#t B*#t Bc#t , "Bad use of 'there'35" , OXt , O#t B##t , "Bad use of 'there'36" , SFsi* , TOi THi QIi TSi O#i Ci THb CPi COqi CPi Eqi AFdi BIh , "Bad use of 'it'37" , SFIsi , TOi THi QIi TSi O#i Ci THb CPi COqi CPi Eqi AFdi BIh , "Bad use of 'it'38" , OXi , TOi THi QIi TSi O#i Ci THb CPi COqi CPi Eqi AFdi BIh , "Bad use of 'it'39" , THb , S##t SI##t SFsi SFIsi , "Bad use of predicate40" , BIh , Ss#b SIs#b SFsi SFIsi , "Bad use of predicate41" , BIq , S##q SI##q SFsi Ss#b SFIsi SIs#b , "Bad use of predicate42" , MVt , Dm#m EAm EEm MVm Pam Pafm AFm EB#m MVb AJrc Om Mam Am Jm Ds*m MX#m , "Bad comparative43" , MVz , D##y EAy EEy MVy EB#y , "Bad comparative44" , MV#a , Pam Pafm EAm Ds*m EAy AFm Mam Am , "Bad comparative45" , MV#i , Pam Pafm EAm Ds*m EAy AFm Mam Am , "Bad comparative46" , MV#o , D##m D##y Om Oy Jm Jy Am MX#m , "Bad comparative47" , MV#p , EEm MVb Dm#m EEy D##y MVm Om Oy Jm Jy Am MX#m , "Bad comparative48" , Pafc , EB#m EB#y , "Bad comparative49" , Pafc , Pa* Paf* , "Bad comparative50" , MVat , MVm , "Bad comparative51" , MVpt , MVm , "Bad comparative52" , MVat , MVa MVp , "Bad comparative53" , MVpt , MVa MVp , "Bad comparative54" , U#t , D##m D##y Om Oy Jm Jy Am MX#m , "Bad comparative55" , Cc , EEm EEy MVm MVb MVy , "Bad comparative56" , Sp#c , Dmcm Dmcy Om Oy Jm Jy MX#m , "Bad comparative57" , Ss#c , Dmum Dmuy Om Oy Jm Jy Ds*y MX#m , "Bad comparative58" , S##c , Dm#m D##y Om Oy Jm Jy MX#m , "Bad comparative59" , THc , TH , "Bad comparative60" , TOc , TO** TOf* TOi* , "Bad comparative61" , TOtc , TOt , "Bad comparative62" , Ma** , TO TOf TH MVp TOt QI OF MVt MVz MVh Ytm Ya , "Bad use of adjective63" , Mam , TO TOf TH MVp TOt QI OF MVt MVz MVh Ytm Ya , "Bad use of adjective64" , MX#a , TO TOf TH MVp TOt QI OF MVt MVz MVh Ytm Ya MJ , "Bad use of adjective65" , ; There's no ZZZ connector, which means that Ixd and Oxn ; are prohibited from ever occuring. 4.0.batch covers this. Ixd , ZZZ , "Can't use 'do' with that verb" , Oxn , ZZZ , "Bad use of pronoun66" , MVh , EExk EAxk D##k , "Incorrect use of that67" , ; The Rw link necessitated commenting out 68, because we had to make B#m ; a restricted link(see above) xxx reverted .. this is needed ... ; B#m , D##w H HA , "Bad use of gerund68" CONTAINS_NONE_RULES: S , Spxi , "Bad n-v agreement69" , SI , SIpxi , "Bad n-v agreement70" , Ws , B#m Ca BT , "Question inversion violated71" , SF , I* PP* TO* Pa* Pam Pg* Pv* LE* AFd* MVta , "Bad use of 'filler' subject72" , SFI , I* PP* TO* Pa* Pam Pg* Pv* LE* AFd* MVta , "Bad use of 'filler' subject73" , OX , I* PP* TO* Pa* Pam Pg* Pv* LE* AFd* MVta , "Bad use of 'filler' subject74" , MXsr , Sp#w , "Bad n-v agreement75" , MXpr , Ss#w S#iw , "Bad n-v agreement76" , Mr , B#* , "Bad use of 'whose'77" ; ---------------------------------------------------------------------- ; The following rule asserts that all specified domains must have the ; property that all of the words that touch a link in the domain are ; not to the left of the root word of the domain. These rules are ; different from the above in that the first field is a *domain name*, ; rather than a set of links. BOUNDED_RULES: s , "Unbounded s domain78" , r , "Unbounded r domain79" link-grammar-4.7.4/data/en/Makefile.am0000644000175000017500000000065611526022265016470 0ustar bloombloomSUBDIRS=words DICTS= \ 4.0.affix \ 4.0.batch \ 4.0.biolg.batch \ 4.0.enwiki.batch \ 4.0.fixes.batch \ 4.0.voa.batch \ 4.0.constituent-knowledge \ 4.0.dict \ 4.0.knowledge \ 4.0.regex \ tiny.dict dictdir=$(pkgdatadir)/en dict_DATA = $(DICTS) EXTRA_DIST = $(DICTS) 4.0.dict.m4 link-grammar-4.7.4/data/en/4.0.dict0000644000175000017500000112506711526022265015607 0ustar bloombloom %***************************************************************************% % % % Copyright (C) 1991-1998 Daniel Sleator and Davy Temperley % % Copyright (c) 2003 Peter Szolovits and MIT. % % Copyright (c) 2008, 2009, 2010, 2011 Linas Vepstas % % % % See file "README" for information about commercial use of this system % % % %***************************************************************************% % Dictionary version number is 4.7.4 (formatted as V4v7v4+) : V4v7v4+; % _ORGANIZATION OF THE DICTIONARY_ % % I. NOUNS % II. PRONOUNS % III. DETERMINERS % IV. NUMERICAL EXPRESSIONS % V. VERBS % A. Auxiliaries; B. Common verb types; C. complex intransitive verbs; % D. complex intransitive verbs; E. complex verbs taking [obj] + % [complement]; F. idiomatic verbs % VI. PREPOSITIONS % VII. TIME AND PLACE EXPRESSIONS % VIII. QUESTION-WORDS AND CONJUNCTIONS % IX. ADJECTIVES % X. COMPARATIVES AND SUPERLATIVES % XI. ADVERBS % A. Mainly adjectival; B. Mainly post-verbal; C. Post-verbal/pre-verbal; % D. Post-verbal/pre-verbal/openers; E. Post-verbal/openers; % F. Pre-verbal/openers % XII. MISCELLANEOUS WORDS AND PUNCTUATION % % NEW LINKS INVENTED BY MIKE ROSS % Ct and Cta are used with comparatives so that 'than' links to the relative clause % John is bigger than Dave is. % John wants more cookies than Dave wants. % % Rw is used similarly to Ct, Cta, and Rn to link question words to the relative clauses % that follow them. % For auxillary verbs, replaced "{Q-}" with "(Rw- or Q-}". % For nouns and others, replaced "B*m+" with "(Rw+ & B*m+)" (for any *) % For who,what,which,whom, replaced "B*" with "(R+ & B*+)" (for any *) % % TODO: % To-do: many verb simple past-tense forms include ({@E-} & A+) to % make them adjective-like. Strictly speaking, these should probably % copied into words.adj.1 and treated like common adjectives, right? % % Many nouns in words.n.4 are treated as "mass or count". The side % effect is that mass nouns are inconsistently treated as sometimes % singular, sometimes plural. e.g. words.n.3 gets & % . This is a kind-of ugly tangle, it should really % be sorted out so that links are properly marks as s, p or m. % This is mostly fixed, except that some uses of % remain, below. % Null links. These are used to drop the requirement for certain words % to appear during parsing. Basically, if a parse fails at a given cost, % it is retried at a higher cost (by raising the disjunct_cost). % Currently, two different nulls are defined: a regular null, and a % costly null. The regular null is used to make determiners optional; % this allows for the parsing of newspaper headlines and clipped % technical speech (e.g. medical, engineering, where dterminers are % dropped). The costly-null is used during panic parsing. % Currently, both have the same cost: using the ordinary null allows % too many sentences to be parsed incorrectly. : [[[()]]]; : [[[()]]]; % NOUNS % The marker-entity is used to identify identity names. % The marker-common-entity is used to identify all common nouns % and adjectives that might appear in entity names: % e.g. "Great Southern Federal Bank and Railroad" or "Aluminum Bahrain" : XXXENTITY+; : XXXGIVEN+; % The RJ links connect to "and"; the l,r prevent cross-linking : RJrc- or RJlc+; : {({@COd-} & (C- or )) or ({@CO-} & (Wd- & {CC+})) or [Rn-]}; : {({@COd-} & (C- or )) or ({@CO-} & (Wd- & {CC+}))}; : {({@COd-} & (C- or )) or ({@CO-} & (Wd- or {CC+})) or Re-}; % Post-nominal qualifiers, complete with commas, etc. : ({[B*j+]} & Xd- & (Xc+ or ) & MX-); : ({[Bsj+]} & Xd- & (Xc+ or ) & MX-); : ({[Bpj+]} & Xd- & (Xc+ or ) & MX-); : ({[Buj+]} & Xd- & (Xc+ or ) & MX-); % noun-main-x -- singular or plural or mass. : (S+ & ) or SI- or J- or O- or or ; % noun-main-s -- singular : (Ss+ & ) or SIs- or Js- or Os- or or ; % noun-main-p -- plural : (Sp+ & ) or SIp- or Jp- or Op- or or ; % noun-main-u -- u == uncountable % TODO: alter this to use Su+, SIu- someday. likewise Buj+ % Doing this requires adding Su- links to many entries : (Ss+ & ) or SIs- or Ju- or Ou- or or ; % noun-main-m -- m == mass % TODO: get rid of this someday. % To get rid of this, any noun that uses this needs to be split into % two: the countable form, which will used and the % uncountable form, which will use : (Ss+ & ) or SIs- or Jp- or Os- or or ; : (Ss*b+ & ) or SIs*b- or Js- or Os- or or ; : J- or O- or or ; : Js- or Os- or or ; % Xd- or [[()]] allows parsing of "I have no idea what that is." % without requiring comma after "idea" : Js- or Os- or ({[Bsj+]} & (Xd- or [[()]]) & (Xc+ or ) & MX-) or ; : Jp- or Op- or or ; : Jp- or Os- or or ; % TO+: "The inability to laugh signifies trouble" % @M+: "The disability of John means he is slow" % XXX wait .. TO+ should only be for mass nouns ?? : {@M+} & {TO+} & {R+ & B+ & {[[@M+]]}} & {@MX+}; : {@M+} & {TO+} & {R+ & Bs+ & {[[@M+]]}} & {@MXs+}; : {@M+} & {TO+} & {R+ & Bp+ & {[[@M+]]}} & {@MXp+}; : {@AN-} & {@A- & {[[@AN-]]}}; % conjoined nouns or noun-phrases. % The l and r prevent two nouns from hooking up directly, they % must hook up to a conjunction (and, or) in the middle. % SJl == connect to left % SJr == connect to right % SJ*s == singular % SJ*p == plural % SJ*u == mass % % M+: "gloom of night and heat will not stop me" % The "of night" can connect to the left noun, but rarely to the right noun % because it should then connect to the "and", not the right noun. % but then: "neither heat nor gloom of night shall stop me" % Looks like only a proper semantic decision can determine the correct parse here ... : ({@M+} & SJls+) or ({[@M+]} & SJrs-) or (Dn- & SJn+); : ({@M+} & SJlp+) or ({[@M+]} & SJrp-) or (Dn- & SJn+); : ({@M+} & SJlu+) or ({[@M+]} & SJru-) or (Dn- & SJn+); : ({@M+} & SJl+) or ({[@M+]} & SJr-) or (Dn- & SJn+); : ({@M+} & SJlp+) or ({[@M+]} & SJrp-) or ({@M+} & SJlu+) or ({[@M+]} & SJru-) or (Dn- & SJn+); : {Rw+} & B*m+; : {Rw+} & Bsm+; : {Rw+} & Bpm+; % The use of Coa here needs to be carefully rexamined; it is used much too freely. : {[[Wi-]]} & ((Xc+ & Ic+) or ({Xd-} & (Xc+ or [[()]]) & [[COa+]])); % Just pure singular entities, no mass nouns % The CAPITALIZED-WORDS rule is triggered by regex matching, and % applies to all capitalized words that are not otherwise found in % the dictionary. % ({[[@MX+]]} & AN+) comes from postposed modifiers: % "Codon 311 (Cys --> Ser) polymorphism" % % We do NOT tag these with , a this messes up first-word % processing in tokenize.c. So for example, we do *not* want "There" % in "There they are" tagged as an entity, just because its capitalized. % We really do want to force the lower-case usage, because the lower case % is in the dict, and its the right word to use. (The only entities that % should be tagged as such are those that are in the dicts, in thier % capitalized form, e.g. "Sue.f" female given name as opposed to "sue.v" % verb in the sentence "Sue went to the store.") % % To help discourage capitalized use when the lower-case is in the dict, % we give a slight cost to [ & (JG- or )] to % discourage use as a common noun, so that the lower-case version can % play this role. % % MX+ & : country names: "...went to Paris, France" % CAPITALIZED-WORDS INITIALS NAME : ({NM+} & ({G-} & {[MG+]} & (({DG- or [[GN-]] or [[@A- & @AN-]] or [[{@A-} & {D-}]]} & ([ & (JG- or )] or or YS+)) or ({[[@MX+]]} & AN+) or G+))) or (MXs+ & ( or )) or ; % Capitalized words that seem to be plural (by ending with an s, etc) % -- But not all words that end with an 's' are plural: % e.g. Cornwallis ... and some of these can take a singular determiner: % "a Starbucks" PL-CAPITALIZED-WORDS: ({NM+} & {G-} & {[MG+]} & (({DG- or [[GN-]] or [[{@A-} & ({Dmc-} or {Ds-})]] } & ([ & (JG- or )] or or YS+ or YP+)) or AN+ or G+)) or ; % capitalized words ending in s % -- hmm .. proper names not used anywhere right now, has slot for plural ... !!?? : ({G-} & {[MG+]} & (({DG- or [[GN-]] or [[{@A-} & {D-}]]} & (({@MX+} & (JG- or )) or (YS+ or YP+))) or AN+ or G+)); % "Tom" is a given name, but can also be a proper name, so e.g. % "The late Mr. Tom will be missed." which needs A-, D- links : {G-} & {[MG+]} & (({DG- or [[GN-]] or [[{@A-} & {D-}]]} & (({@MX+} & {NMr+} & (JG- or or )) or YS+ or YP+)) or AN+ or G+); % Whole, entire entities, cannot participate in G links % because the entire entity has already been identified. : ({DG- or [[GN-]] or [[{@A-} & {D-}]]} & (({@MX+} & ) or or YS+)) or AN+; personID0 personID1 personID2 personID3 personID4 personID5 personID6 personID7 personID8 personID9 personID10 personID11 personID12 personID13 personID14 personID15 personID16 personID17 personID18 personID19 personID20 personID21 personID22 personID23 personID24 personID25 personID26 personID27 personID28 personID29 personID30 personID31 personID32 personID33 personID34 personID35 personID36 personID37 personID38 personID39 personID40 personID41 personID42 personID43 personID44 personID45 personID46 personID47 personID48 personID49 personID50 personID51 personID52 personID53 personID54 personID55 personID56 personID57 personID58 personID59 personID60: or ; organizationID0 organizationID1 organizationID2 organizationID3 organizationID4 organizationID5 organizationID6 organizationID7 organizationID8 organizationID9 organizationID10 organizationID11 organizationID12 organizationID13 organizationID14 organizationID15 organizationID16 organizationID17 organizationID18 organizationID19 organizationID20 organizationID21 organizationID22 organizationID23 organizationID24 organizationID25 organizationID26 organizationID27 organizationID28 organizationID29 organizationID30 organizationID31 organizationID32 organizationID33 organizationID34 organizationID35 organizationID36 organizationID37 organizationID38 organizationID39 organizationID40 organizationID41 organizationID42 organizationID43 organizationID44 organizationID45 organizationID46 organizationID47 organizationID48 organizationID49 organizationID50 organizationID51 organizationID52 organizationID53 organizationID54 organizationID55 organizationID56 organizationID57 organizationID58 organizationID59 organizationID60: or ; locationID0 locationID1 locationID2 locationID3 locationID4 locationID5 locationID6 locationID7 locationID8 locationID9 locationID10 locationID11 locationID12 locationID13 locationID14 locationID15 locationID16 locationID17 locationID18 locationID19 locationID20 locationID21 locationID22 locationID23 locationID24 locationID25 locationID26 locationID27 locationID28 locationID29 locationID30 locationID31 locationID32 locationID33 locationID34 locationID35 locationID36 locationID37 locationID38 locationID39 locationID40 locationID41 locationID42 locationID43 locationID44 locationID45 locationID46 locationID47 locationID48 locationID49 locationID50 locationID51 locationID52 locationID53 locationID54 locationID55 locationID56 locationID57 locationID58 locationID59 locationID60: or ; % Words that are also given names % Cannot take A or D links. % Art Bell Bill Bob Buck Bud % % The bisex dict includes names that can be given to both % men and women. /en/words/entities.given-bisex.sing /en/words/entities.given-female.sing /en/words/entities.given-male.sing: or or ; % Special handling for certain given names. These are words that have a % lower-case analog in the dictionary, and are also used in upper-case % form in an "idiomatic name" e.g. Vatican_City. Without the below, % this use of "City" would prevent it from being recognized in other % (non-idiomatic) proper name constructions, e.g. New York City. /en/words/entities.organizations.sing: or ; /en/words/entities.locations.sing: or ; % % entity IDs (mirror Capitalized-words - a mix of plural and singular) : ({DG- or [[GN-]] or [[{@A-} & {D-}]]} & (({@MX+} & ) or or YS+ or YP+)) or AN+; entityID0 entityID1 entityID2 entityID3 entityID4 entityID5 entityID6 entityID7 entityID8 entityID9 entityID10 entityID11 entityID12 entityID13 entityID14 entityID15 entityID16 entityID17 entityID18 entityID19 entityID20 entityID21 entityID22 entityID23 entityID24 entityID25 entityID26 entityID27 entityID28 entityID29 entityID30 entityID31 entityID32 entityID33 entityID34 entityID35 entityID36 entityID37 entityID38 entityID39 entityID40 entityID41 entityID42 entityID43 entityID44 entityID45 entityID46 entityID47 entityID48 entityID49 entityID50 entityID51 entityID52 entityID53 entityID54 entityID55 entityID56 entityID57 entityID58 entityID59 entityID60: or ; % words.n.4: nouns that can be mass or countable % allocation.n allotment.n alloy.n allure.n alteration.n alternation.n % piano.n flute.n belong here, because of "He plays piano" % This class has now been eliminated: nouns are either singular, plural % or mass. If they can be more than one, then they are listed separately % in each class e.g. words.n.1 and/or words.n.2 and/or words.n.3, etc. : & (({NM+} & AN+) or ({NM+} & {D*u-} & & ( or )) or or (YS+ & {D*u-}) or (GN+ & (DD- or [()])) or Us-); GREEK-LETTER-AND-NUMBER pH.i x.n: ; % Same as pattern used in words.n.4 -- mass nouns or countable nouns : ; % Pattern used for words.n.2.s % Similar to , but with different determiners for number % agreement. : [[AN+]] or ( & (({NM+ or Dmc-} & & ( or )) or ({NM+ or Dmc-} & ) or SJrp- or (YP+ & {Dmc-}) or (GN+ & (DD- or [()])) or Up-)); genericID0 genericID1 genericID2 genericID3 genericID4 genericID5 genericID6 genericID7 genericID8 genericID9 genericID10 genericID11 genericID12 genericID13 genericID14 genericID15 genericID16 genericID17 genericID18 genericID19 genericID20 genericID21 genericID22 genericID23 genericID24 genericID25 genericID26 genericID27 genericID28 genericID29 genericID30 genericID31 genericID32 genericID33 genericID34 genericID35 genericID36 genericID37 genericID38 genericID39 genericID40 genericID41 genericID42 genericID43 genericID44 genericID45 genericID46 genericID47 genericID48 genericID49 genericID50 genericID51 genericID52 genericID53 genericID54 genericID55 genericID56 genericID57 genericID58 genericID59 genericID60: or or ; %from words.y year numbers : NMd- or ({EN-} & (NIfn+ or NItn-)) or NN+ or AN+ or ((Xd- & TY- & Xc+) or TY-) or ({EN- or NIc-} & (ND+ or OD- or ({{@L+} & DD-} & ([[Dmcn+]] or (( or TA-) & (JT- or IN- or [[]])))))); dateID0 dateID1 dateID2 dateID3 dateID4 dateID5 dateID6 dateID7 dateID8 dateID9 dateID10 dateID11 dateID12 dateID13 dateID14 dateID15 dateID16 dateID17 dateID18 dateID19 dateID20 dateID21 dateID22 dateID23 dateID24 dateID25 dateID26 dateID27 dateID28 dateID29 dateID30 dateID31 dateID32 dateID33 dateID34 dateID35 dateID36 dateID37 dateID38 dateID39 dateID40 dateID41 dateID42 dateID43 dateID44 dateID45 dateID46 dateID47 dateID48 dateID49 dateID50 dateID51 dateID52 dateID53 dateID54 dateID55 dateID56 dateID57 dateID58 dateID59 dateID60: ; % ??? wtf? Is this like "roman numeral" ?? See I.p for "me" % XXX this is wrong or inappropriate .. % I.n: [[{Xi+} & {G-} & G+]]; % Explicitly include the period at the end of the abbreviation. Ms..x Mrs..x Mr..x Messrs..x Rev..x Dr..x Prof..x Atty..x Gov..x Sen..x Rep..x Gen..x Brig..x Col..x Capt..x Lieut..x Lt..x Maj..x Sgt..x Pvt..x Cmdr..x Adm..x Corp..x St..x Mt..x Ft..x Cie..x HMS..x: G+; % Period is missing in the abbreviation! Accept, but with a cost. Ms.x Mrs.x Mr.x Messrs.x Rev.x Sir.x Dr.x Prof.x Atty.x Gov.x Sen.x Rep.x Gen.x Brig.x Col.x Capt.x Lieut.x Lt.x Maj.x Sgt.x Pvt.x Cmdr.x Adm.x Corp.x St.x Mt.x Ft.x Cie.x HMS.x: [[G+]]; St.y St..y Ave.y Ave..y Av.y Av..y Pl.y Pl..y Ct.y Ct..y Dr.y Dr..y Gr.y Gr..y Rd.y Rd..y Blvd.y Blvd..y Pkwy.y Pkwy..y Hwy.y Hwy..y AG.y Assn.y Assn..y Corp.y Corp..y Co.y Co..y Inc.y Inc..y PLC.y Pty.y Pty..y Ltd.y Ltd..y LTD.y Bldg.y Bldg..y and_Co GmBH.y: G- & {Xi+} & {[MG+]} & (({DG- or [[GN-]] or [[{@A-} & {D-}]]} & (({@MX+} & (JG- or )) or or YS+ or YP+)) or AN+ or G+); % e.g. Joe Blow, Esq. or Dr. Smarty Pants, Ph.D. % Gack. See absurdely large collection at: % http://en.wikipedia.org/wiki/List_of_post-nominal_letters Jr.y Jr..y Sr.y Sr..y Esq.y Esq..y AB.y A.B..y AIA.y A.I.A..y BA.y B.A..y BFA.y B.F.A..y BS.y B.S..y BSc.y B.Sc..y CEng.y CEng..y CFA.y CPA.y CPL.y CSV.y DD.y D.D..y DDS.y D.D.S..y DO.y D.O..y D.Phil..y D.P.T..y Eng.D..y JD.y J.D..y KBE.y K.B.E..y LLD.y LL.D..y MA.y M.A..y MBA.y M.B.A..y MD.y M.D.y MFA.y M.F.A..y MS.y M.S..y MSc.y M.Sc..y OFM.y PE.y P.E..y Pharm.D..y PhD.y Ph.D.y Ph.D..y RA.y R.A..y RIBA.y R.I.B.A..y RN.y R.N..y USMC.y USN.y: {Xi+} & {Xd- & {Xc+}} & G- & {[MG+]} & (({DG- or [[GN-]] or [[{@A-} & {D-}]]} & (({@MX+} & (JG- or )) or or YS+ or YP+)) or AN+ or G+); HYPHENATED-WORDS.n: [[({@AN-} & {@A-} & (({NM+ or D-} & (( & ( or )) or )) or U-)) or ((YS+ or YP+) & {@AN-} & {@A-} & {D-})]]; % the generic category for strings containing a hyphen % NOUNS -------------------------------------------------------- % Nouns typically take determiners (a, the). The minor flags are: % D link: determiners: D1234 % position 1 can be s, m for singular, mass % position 2 can be c for count, u for uncountable % position 3 can be k,m,y for comparatives, w for questions. % words.n.1: Common nouns % activist.n actor.n actress.n actuary.n ad.n adage.n adagio.n adapter.n % The naked SJr- allows article to be skipped in conjunction (and,or) % constructions ("the hammer and sickle") : & (AN+ or ((NM+ or ({[NM+]} & (Ds- or ))) & (( & ( or )) or )) or SJrs- or (YS+ & Ds-) or (GN+ & (DD- or [()])) or Us-); /en/words/words.n.1 /en/words/words.n.1.wiki : or ; % Common plural nouns ending in "s" % allocations.n allotments.n allowances.n alloys.n allures.n allusions.n /en/words/words.n.2.s /en/words/words.n.2.s.wiki : or ; /en/words/words.n.2.s.biolg: ; PL-GREEK-LETTER-AND-NUMBER: ; % plural nouns not ending in "s" % aircraft.p bacteria.p bellmen.n buffalo.p businessmen.n chairmen.n /en/words/words.n.2.x /en/words/words.n.2.x.wiki : or ( & ([[AN+]] or ({NM+ or Dmc-} & (( & ( or )) or )) or (YS+ & {Dmc-}) or (GN+ & (DD- or [()])) or Up-)); % XXX should probably eliminate and replace by % but this requires other spread-out changes : or ( & (AN+ or ({NM+ or Dmu-} & (( & ( or )) or )) or (YS+ & {Dmu-}) or (GN+ & (DD- or [()])) or Up-)); % nouns that are mass only % absolutism.n absorption.n abstinence.n abundance.n academia.n /en/words/words.n.3: ; % Want to cost this so that it doesn't interfere with given name "Tom". tom.n-u: []; % Nouns that are also adjectives (e.g. red.n) and so we don't want to % allow these to take AN+ links. We need these as nouns, so as to % parse 'she prefers red'. However, assign a cost, so that 'her shoes % are red' gets red.a perfered over red.n. % [[Ds-]] to allow: "The house was painted a fading yellow" % % Doesn't seem to need a noun-and-x to make this work ... auburn.n black.n blue.n brown.n green.n gray.n pink.n purple.n red.n tawny.n ultramarine.n yellow.n: or ( & ((({Dmu- or [[Ds-]]}) & & ([ or ])) or (YS+ & {Dmu-}) or (GN+ & (DD- or [()])) or Up-)); % US state names and abbreviations % NM N.M. NY N.Y. NC N.C. ND N.D. Ohio Okla. /en/words/entities.us-states.sing: or ({G-} & {DG- or [[GN-]] or [[{@A-} & {D-}]]} & (({MG+} & {@MX+} & (JG- or or )) or G+ or ({[[MG+]]} & (AN+ or YS+ or YP+)))) or (Xc+ & Xd- & G- & AN+); % SINGULAR ENTITIES FOR ENTITY EXTRACTION % This must appear after other categories so it doesnt interfere with those. /en/words/entities.national.sing: or ; % Enable parsing of "Mother likes her" aunt.f auntie.f brother.m dad.m daddy.m father.m grandmother.f granny.f granddad.m grandfather.m grandpa.f grandpop.m mom.f mommy.f mother.f pop.m papa.m poppy.m pops.m sis.f sister.f uncle.m: ; alter_ego au_pair mise_en_scene faux_pas non_sequitur fait_accompli modus_vivendi head_of_state tour_de_force: ( & ((Ds- & & ( or )) or ({Ds-} & ) or Us- or (YS+ & Ds-) or (GN+ & (DD- or [()])))) or AN+; kung_fu joie_de_vivre op_art noblesse_oblige lese_majesty a_must time_of_day time_of_year force_majeure top_dollar year_end skim_milk breach_of_contract sleight_of_hand power_of_attorney word_of_mouth carte_blanche: ( & (({Dmu-} & & ( or )) or ({Dmu-} & ) or Um- or (YS+ & {Dmu-}) or (GN+ & (DD- or [()])))) or AN+; % title nouns (president, chairman) % auditor.t bailiff.t broker.t buyer.t candidate.t captain.t cardinal.t /en/words/words.n.t: & {@M+} & (BIt- or (Xd- & (Xc+ or ) & MX-) or TI-); % Almost identical to below. majority.n minority.n bunch.n batch.n bulk.n handful.n group.n: ( & ((Ds- & & ( or B*x+)) or ({Ds-} & ) or Us- or (YS+ & Ds-) or (GN+ & (DD- or [()])))) or AN+; % Almost identical to above. number.n: ( & ((Ds- & {NM+} & & ( or B*x+)) or ({Ds-} & {NM+} & ) or Us- or (YS+ & Ds-) or (GN+ & (DD- or [()])))) or AN+; % number appreviations: no.x No.x No.x no.x Num.x num.x: (Xi+ or [[()]]) & AN+; kind_of: ({{@AN-} & @A-} & U+ & ((Ds- & & ( or )) or ({Ds-} & ) or Us-)) or EA+ or EE+; type_of sort_of breed_of: {{@AN-} & @A-} & U+ & ((Ds- & & ( or )) or ({Ds-} & ) or Us-); kinds_of types_of sorts_of breeds_of: {{@AN-} & @A-} & U+ & (({Dmc-} & & ( or )) or ({Dmc-} & ) or Up-); percent.u: ( & ((ND- & {DD-} & & ( or B*x+)) or (ND- & {DD-} & ) or U-)) or (ND- & (OD- or AN+ or YS+)); % This set of disjuncts should probably be split up and refined. % "shame.n", "crux.n" are here because they need the Ss*t connector % to pick up "that" in "The crux of it is that we must act first." % However, report.n and sign.n and remark.n, etc. do not seem to % need this connector ... argument.n report.n sign.n impression.n conclusion.n complaint.n allegation.n announcement.n position.n restriction.n notion.n remark.n assertion.n proclamation.n reassurance.n saying.n accusation.n possibility.n idea.n problem.n claim.n result.n statement.n hunch.n assumption.n concept.n hypothesis.n implication.n message.n premonition.n prerequisite.n indication.n truism.n fallacy.n proposition.n prospect.n presupposition.n inkling.n supposition.n finding.n amount.n answer.n crux.n shame.n: ( & ((Ds- & {@M+} & {(TH+ or (R+ & Bs+)) & {[[@M+]]}} & {@MXs+} & ( or (Ss*t+ & ) or SIs*t- or )) or ({Ds-} & ) or Us- or (YS+ & Ds-) or (GN+ & (DD- or [()])))) or AN+; proof.n doubt.n suspicion.n hope.n knowledge.n relief.n disclosure.n fear.n acknowledgment.n acknowledgement.n principle.n concern.n philosophy.n risk.n threat.n understanding.n conviction.n theory.n assurance.n speculation.n awareness.n news.n opinion.n belief.n contention.n thought.n myth.n discovery.n rumor.n probability.n fact.n explanation.n feeling.n comment.n expectation.n perception.n sense.n realization.n view.n insistence.n consensus.n notification.n rule.n danger.n warning.n suggestion.n: ( & (({D*u-} & {@M+} & {(TH+ or (R+ & Bs+)) & {[[@M+]]}} & {@MXs+} & ( or (Ss*t+ & ) or SIs*t- or )) or ({D*u-} & ) or Us- or (YS+ & {D*u-}) or (GN+ & (DD- or [()])))) or AN+; evidence.n reasoning.n likelihood: ( & (({Dmu-} & {@M+} & {(TH+ or (R+ & Bs+)) & {[[@M+]]}} & {@MXs+} & ( or (Ss*t+ & ) or SIs*t- or )) or ({Dmu-} & ) or Up- or (YS+ & {Dmu-}) or (GN+ & (DD- or [()])))) or AN+; ideas.n opinions.n statements.n beliefs.n facts.n arguments.n principles.n theories.n philosophies.n signs.n impressions.n conclusions.n contentions.n complaints.n proofs.n doubts.n suspicions.n allegations.n reports.n claims.n announcements.n positions.n risks.n hopes.n explanations.n restrictions.n threats.n thoughts.n myths.n feelings.n discoveries.n rumors.n comments.n realizations.n probabilities.n remarks.n notions.n convictions.n hunches.n assumptions.n concepts.n hypotheses.n assertions.n expectations.n implications.n perceptions.n proclamations.n reassurances.n fears.n sayings.n senses.n messages.n disclosures.n accusations.n views.n concerns.n understandings.n acknowledgments.n acknowledgements.n possibilities.n premonitions.n prerequisites.n provisos.n truisms.n fallacies.n assurances.n speculations.n propositions.n prospects.n presuppositions.n inklings.n suppositions.n findings.n amounts.n rules.n dangers.n warnings.n indications.n answers.n suggestions.n: ( & (({Dmc-} & {@M+} & {(TH+ or (R+ & Bp+)) & {[[@M+]]}} & {@MXp+} & ( or (Sp*t+ & ) or SIp*t- or )) or ({Dmc-} & ) or Up- or (YP+ & {Dmc-}) or (GN+ & (DD- or [()])))) or [[AN+]]; request.n requirement.n condition.n recommendation.n provision.n stipulation.n: ( & (({D*u-} & {@M+} & {(TH+ or TS+ or (R+ & Bs+)) & {[[@M+]]}} & {@MXs+} & ( or (Ss*t+ & ) or SIs*t- or )) or ({D*u-} & ) or Us- or (YS+ & {D*u-}) or (GN+ & (DD- or [()])))) or AN+; requests.n requirements.n conditions.n recommendations.n provisions.n stipulations.n: ( & (({Dmc-} & {@M+} & {(TH+ or TS+ or (R+ & Bp+)) & {[[@M+]]}} & {@MXp+} & ( or (Sp*t+ & ) or SIp*t- or )) or ({Dmc-} & ) or Up- or (YP+ & {Dmc-}) or (GN+ & (DD- or [()])))) or [[AN+]]; excuse.n decision.n proposal.n attempt.n plan.n plot.n pledge.n urge.n mission.n right.n desire.n mandate.n promise.n option.n campaign.n offer.n vow.n permit.n impetus.n proclivity.n propensity.n move.n vote.n bill.n: ( & ((Ds- & {@M+} & {(TOn+ or (R+ & Bs+)) & {[[@M+]]}} & {@MXs+} & ( or )) or ({Ds-} & ) or Us- or (YS+ & Ds-) or (GN+ & (DD- or [()])))) or AN+; failure.n haste.n refusal.n reluctance.n pressure.n willingness.n responsibility.n intent.n temptation.n readiness.n effort.n determination.n capacity.n unwillingness.n need.n will.n eagerness.n opportunity.n commitment.n ambition.n ability.n order.n obligation.n incentive.n: ( & (({D*u-} & {@M+} & {(TOn+ or (R+ & Bs+)) & {[[@M+]]}} & {@MXs+} & ( or )) or ({D*u-} & ) or Us- or (YS+ & {D*u-}) or (GN+ & (DD- or [()])))) or AN+; excuses.n decisions.n proposals.n failures.n efforts.n attempts.n refusals.n pledges.n urges.n missions.n rights.n desires.n needs.n ambitions.n capacities.n mandates.n promises.n abilities.n options.n commitments.n intents.n opportunities.n plans.n plots.n responsibilities.n chances.n campaigns.n offers.n pressures.n obligations orders.n temptations.n vows.n permits.n impetuses.n proclivities.n propensities.n moves.n votes.n bills.n incentives.n: ( & (({Dmc-} & {@M+} & {(TOn+ or (R+ & Bp+)) & {[[@M+]]}} & {@MXp+} & ( or )) or ({Dmc-} & ) or Up- or (YP+ & {Dmc-}) or (GN+ & (DD- or [()])))) or [[AN+]]; chance.n: ( & (({D*u-} & {@M+} & {(TOn+ or TH+ or (R+ & Bs+)) & {[[@M+]]}} & {@MXs+} & ( or )) or ({D*u-} & ) or Us- or (YS+ & {D*u-}) or (GN+ & (DD- or [()])))) or AN+; question.n issue.n: ( & ((Ds- & {@M+} & {R+ & Bs+ & {[[@M+]]}} & {@MXs+} & ( or (Ss*q+ & ) or SIs*q- or )) or ({Ds-} & ) or Us- or (YS+ & Ds-) or (GN+ & (DD- or [()])))) or AN+; questions.n issues.n: ( & (({Dmc-} & {@M+} & {R+ & Bp+ & {[[@M+]]}} & {@MXp+} & ( or (Sp*q+ & ) or SIp*q- or )) or ({Dmc-} & ) or Up- or (YP+ & {Dmc-}) or (GN+ & (DD- or [()])))) or AN+; reason.n: ( & (({D*u-} & {@M+} & {TH+ or Ce+ or TOn+ or WY+ or (R+ & Bs+)} & {@MXs+} & ( or (Ss*t+ & ) or SIs*t- or )) or ({D*u-} & ) or Us- or (YS+ & {D*u-}) or (GN+ & (DD- or [()])))) or AN+; reasons.n: ( & (({Dmc-} & {@M+} & {TH+ or Ce+ or TOn+ or WY+ or (R+ & Bp+)} & {@MXp+} & ( or )) or ({Dmc-} & ) or Up- or (YP+ & {Dmc-}) or (GN+ & (DD- or [()])))) or [[AN+]]; way.n: ( & ((Ds- & {@M+} & {TOn+ or TH+ or Ce+ or (R+ & Bs+)} & {@MXs+} & (MVa- or or )) or ({Ds-} & ) or Us- or (YS+ & {D*u-}) or (GN+ & (DD- or [()])))) or AN+; place.n: ( & ((Ds- & {@M+} & {TOn+ or TH+ or Ce+ or (R+ & Bs+)} & {@MXs+} & ([[MVa-]] or or )) or ({Ds-} & ) or or Us- or (YS+ & {D*u-}) or (GN+ & (DD- or [()])))) or AN+; time.n: ( & (({D*u-} & {@M+} & {TOn+ or WN+ or TH+ or Ce+ or (R+ & Bs+)} & {@MXs+} & ([[MVa-]] or or )) or ({D*u-} & ) or Us- or (YS+ & {D*u-}) or (GN+ & (DD- or [()])))) or AN+; ways.n: ( & (({Dmc-} & {@M+} & {TOn+ or TH+ or Ce+ or (R+ & Bp+)} & {@MXp+} & (MVa- or or )) or ({Dmc-} & ) or Up- or (YP+ & {Dmc-}) or (GN+ & (DD- or [()])))) or [[AN+]]; places.n: ( & (({Dmc-} & {@M+} & {TOn+ or TH+ or Ce+ or (R+ & Bp+)} & {@MXp+} & ([[MVa-]] or or )) or ({Dmc-} & ) or Up- or (YP+ & {Dmc-}) or (GN+ & (DD- or [()])))) or [[AN+]]; times.n: ( & (({Dmc-} & {@M+} & {TOn+ or WN+ or TH+ or Ce+ or (R+ & Bp+)} & {@MXp+} & ([[MVa-]] or or )) or ({Dmc-} & ) or Up- or (YP+ & {Dmc-}) or (GN+ & (DD- or [()])))) or [[AN+]]; %PRONOUNS she he: {[[R+ & Bs+]]} & ((Ss+ & ) or SIs- or SJls+ or (Dn- & SJn+)); % The E- is for "It's either us or them" ... not ideal, but OK me him them us: J- or Ox- or ({[[E-]]} & SJl+) or SJr-; myself yourself himself herself itself themselves ourselves yourselves: J- or O- or E+ or MVa-; each_other: J- or O- or YS+; her.d: ({AL-} & {@L+} & (D+ or DD+)) or DP+; her.p: J- or Ox-; its my your their our: ({AL-} & {@L+} & (D+ or DD+)) or DP+; his: DP+ or ({AL-} & {@L+} & (D+ or DD+)) or []; you: J- or Ox- or (Sp+ & ) or SIp- or SJlp+ or (Dn- & SJn+); it: J- or Ox- or ((Ss+ or SFsi+) & ) or SIs- or SFIsi- or OXi- or Vp- or SJls+ or SJrs- or (Dn- & SJn+); % O*c: "we will go faster than they" they: ({[[R+ & Bp+]]} & ((Sp+ & ) or SIp-)) or Ox- or SJlp+ or SJrp- or (Dn- & SJn+); we: (Sp+ & ) or Ox- or SIp- or SJlp+ or SJrp- or (Dn- & SJn+); % XXX why is this marked plural (Sp, SIp) ?? a cheap hack to make I've work? % We use here to prevent lower-case magnling by % the tokenizer. % SJrp-: allows only "...and I", disallows "I and ..." % Ds- & SJl+: "Either I or ..." % Dn- & SJn+: "Neither I not ..." I.p: or ((Sp*i+ or SX+) & ) or SIp*i- or SJr- or (Ds- & SJl+) or (Dn- & SJn+) or SXI-; them_all us_all you_all: Ox- or J-; % it_all gets a cost when used as direct object (Ox) to avoid % inappropriate parse "Please paint it all white" it_all: [[Ox-]] or J-; %we're they're I'm you're: %(({@EBm+} & (((O*t+ or K+ or BI+ or OF+ or Pp+) & {@MV+}) or TO+ or Pa+)) or %({N+} & (Pg+ or Pv+))) & ; ’m 'm: SX- & (({@EBm+} & (((O*t+ or K+ or BI+ or OF+ or Pp+) & {@MV+}) or TO+ or Pa+)) or ({N+} & (Pg+ or Pv+))); ’re 're: Spx- & (({@EBm+} & (((O*t+ or K+ or BI+ or OF+ or Pp+) & {@MV+}) or TO+ or Pa+)) or ({N+} & (Pg+ or Pv+))); %I've they've you've we've: PP+ & ; ’ve 've: Sp- & PP+; %we'd they'd I'd he'd she'd you'd: (PP+ or ({Vw+} & I+)) & ; %I'll he'll she'll we'll they'll you'll it'll: I+ & ; ’d 'd: S- & (PP+ or I+); ’ll 'll: S- & I+; something someone somebody: {EL+} & (({Pa+} & & {@MXs+} & ) or or YS+); nothing no_one nobody: {EN-} & {EL+} & (({Pa+} & & {@MXs+} & ) or or YS+); everything everyone anyone everybody anybody anything: {EN-} & {EL+} & (((({Pa+} & ) or CX+) & {@MXs+} & ) or or YS+); else: EL-; others: {Dmc-} & (( & ) or ); mine.p yours theirs hers ours: or SJl+ or SJr- or (Dn- & SJn+); % DETERMINERS % (L+ & (AJld+ or AJrd-)): "the biggest and the baddest ..." the: ({AL-} & {@L+} & (D+ or DD+)) or DG+ or (TR- & U+) or (L+ & (AJld+ or AJrd-)); those: ({AL-} & (Dmc+ or DD+)) or ( & ( or RJlr+ or RJrr-)) or ; this.p: or ; this.d: ({AL-} & D*u+) or DTn+; these: or or ({AL-} & (Dmc+ or DD+)); both.d: Dmc+ or E+ or ({M+ or (ALx+ & Jp+)} & ) or ; both.a: Paf- or AJra-; % half: prefer NJ+ over noun-main-x, because half is almost surely % modifying something, instead of being a direct object, subject, etc. half: {EN-} & (NJ+ or [(({DD-} & {@Mp+ or (R+ & B+)}) or (AL+ & J+)) & ]); % "How many years" -- prefer TQ+ over Dmc+ many: (H- & ([[Dmc+]] or ND+ or NIn+ or TQ+)) or (AM- & (Dmcy+ or Oy- or Jy-)) or ({EE-} & (ND+ or NIn+)) or ({DD-} & {EAx-} & Dmc+) or ((({EAx-} & {DD-}) or H-) & & ( or )); all.a: ({EN-} & (E+ or Dm+ or NIc+ or ({@M+ or (ALx+ & (Jp+ or Ju+)) or (R+ & B+) or EL+} & ( or (S**t+ & ) or SI**t-)) or )) or DTa+; all_that: EA+ or EE+ or ( & ); all_this: ( & ) or ; all_those all_these: ( & ) or ; one: NA+ or NMw- or NN+ or ({EN-} & NIfn+) or ({NA-} & {EN-} & (({DD-} & Ds+) or ({{@A- & {[[@AN-]]}} & Ds-} & (YS+ or ( & ( or )) or )))) or NIm+ or NSn+ or (NA- & ND+) or DTi+ or (NA- & Xd- & TY- & Xc+); ones: {@A- & {[[@AN-]]}} & {Dmc-} & (YP+ or ( & ) or ); any: ({EN-} & (D+ or DD+ or ( & ) or )) or EC+; % XXX why doesn't this clash with a.eq ?? a an: ({(AA- & HA-) or ALa- or [[Lf+]]} & Ds+) or NN+ or NSa+ or NIm+; such: (ND- & Dmc+) or Dm*k+; such_a such_an: Ds*k+; % "all of the time". These are all temporal modifiers: use MVw ("when") : MVw- & OF+; a_lot: ( & ) or or EC+ or MVa- or ; few: {EA- or EF+ or ({EA-} & DD-)} & (Dmc+ or ( & ) or ); a_couple: ( & ) or ; a_couple_of: NN+ or ND+ or NIn+; a_few: NN+ or ND+ or NIn+ or ({EN-} & (Dmc+ or ND+ or NIn+ or ( & ))); some: D+ or EN+ or MF+ or ( & ) or or ; little.i: ({EE-} & (MVa- or Ca+ or Qe+)) or ({EEx- or H-} & (Dmu+ or ( & ( or )) or )) or (AM- & (Dmuy+ or MVy- or Oy- or Jy-)) or ({Ds-} & ); % "he likes you most" has no determiner, just uses MVa-. most: Dm+ or [EE+] or EA+ or MF+ or ( & ) or or or [{DD-} & MVa- & {Mp+}]; part.i: (OF+ & ) or or ({Ds-} & ); all.e: ; the_most: MVa- or EE+ or Dm+ or ( & ); % "he likes you least of all" has no determiner, just uses MVa-. least.a: EA+; least.e: {DD-} & MVa- & {Mp+}; none: ( & ) or or ; % rest.i: DG ??? huh? what's the example ?? rest.i: (DG- & & ) or (DD- & ); plenty: ({@M+} & ( or )) or or [MVa-]; other: Dmu+ or ({ND-} & {DD-} & Dmc+) or (DD- & (Ds+ or DD+ or or )); one_other every_other: or or Ds+; any_other no_other: or or D+; all_other: Dm+; most_other: Dmc+; quite_a quite_an one_such not_every: Ds+; some_other no_such: D+; every.d: {EN-} & (Ds+ or DTn+ or [[NIc+]]); another: Ds+ or NIc+ or ( & ) or or YS+; one_another: ( & ) or or YS+; each: Ds+ or ( & ) or or DTn+ or E+ or MVa-; no.misc-d: ({EN-} & D+) or EC+; a_little: Dmu+ or ( & ) or or EA+ or EC+ or EE+ or MVa-; a_great_deal: EC+ or MVa- or ( & ) or ; many_more a_few_more a_couple_more plenty_more a_lot_more: Dmcc+ or ( & ) or ; some_more: MVa- or Dm+ or ( & ) or ; one_more: Ds+ or ( & ) or ; not_many: Dmc+ or ( & (Sp+ & )); not_all not_everything: Dm+ or (((ALx+ & Jp+) or ) & (S+ & )); not_one: Ds+ or ( & (Ss+ & )); enough.n: ({OF+} & ) or ; enough.r: EF- or MVa-; enough.a: ({@E-} & Pa- & {Pg+ or Os+ or @MV+}) or ({@E-} & Dm+); enough.ij: Wi- & {Pg+}; not_enough: ({OF+} & ) or or Dm+; % NUMERICAL EXPRESSIONS % Numeric ranges, e.g. "15 to 20". The "to" (or hyphen) acts as a % number in a range, and the requirements should match NUMBER. % The NIf connectors (second subscript position is "n" for number % and "u" for unit) allow "15 to 20", "15 to 20 kDa" and % "15 kDa to 20 kDa", but not "15 kDa to 20". % Allowing EC+ for "two to threefold more abundant". This allows also the % nonsense "two to three more abundant", but this is likely harmless. -.j-ru --.j-ru ---.j-ru or.j-ru to.j-ru ->.j-ru -->.j-ru: (NIfn- & {NIr-} & NItn+ & (NM- or EC+ or (NN+ or [[NF+]] or ({EN- or NIc-} & (ND+ or OD- or ({{@L+} & DD-} & (Dmcn+ or ( & [])))))))) or (NIfu- & {NIr-} & NItu+ & ((( & ( or Bsm+)) or (Us- & {Mp+})) or AN+ or Yd+ or Ya+)) or (NIfp- & {NIr-} & NItp+ & (NM- or AN+ or ({Xc+ & Xd-} & Ma-) or (Wq- & PF+) or MVp- or Pp- or FM- or (Xc+ & Xd- & (MVx- or MX-)))); and.j-ru: (NIfn- & {NIr-} & NItn+ & (NM- or (NN+ or [[NF+]] or ({EN- or NIc-} & (ND+ or OD- or ({{@L+} & DD-} & (Dmcn+ or ( & [])))))))) or (NIfu- & {NIr-} & NItu+ & ((( & ( or Bsm+)) or (Us- & {Mp+})) or AN+ or Yd+ or Ya+)); % and.j-sum is used in numerical sums: "It's a hundred and two in the shade." % It's a hundred 'n two in the shade." and.j-sum 'n.j-sum: NA- & NA+; % For number, cost is added to the roles to prioritize % postmodifier and numeric determiner roles. two three four five six seven eight nine ten eleven twelve thirteen fourteen fifteen sixteen seventeen eighteen nineteen twenty twenty-one twenty-two twenty-three twenty-four twenty-five twenty-six twenty-seven twenty-eight twenty-nine thirty thirty-one thirty-two thirty-three thirty-four thirty-five thirty-six thirty-seven thirty-eight thirty-nine forty forty-one forty-two forty-three forty-four forty-five forty-six forty-seven forty-eight forty-nine fifty fifty-one fifty-two fifty-three fifty-four fifty-five fifty-six fifty-seven fifty-eight fifty-nine sixty sixty-one sixty-two sixty-three sixty-four sixty-five sixty-six sixty-seven sixty-eight sixty-nine seventy seventy-one seventy-two seventy-three seventy-four seventy-five seventy-six seventy-seven seventy-eight seventy-nine eighty eighty-one eighty-two eighty-three eighty-four eighty-five eighty-six eighty-seven eighty-eight eighty-nine ninety ninety-one ninety-two ninety-three ninety-four ninety-five ninety-six ninety-seven ninety-eight ninety-nine oh-one oh-two oh-three oh-four oh-five oh-six oh-seven oh-eight oh-nine o-one o-two o-three o-four o-five o-six o-seven o-eight o-nine zero-one zero-two zero-three zero-four zero-five zero-six zero-seven zero-eight zero-nine several: NA+ or NMw- or ({EN-} & (NIfn+ or NItn-)) or NN+ or NW+ or ({EN- or NIc- or NA-} & (ND+ or NIn+ or ({{@L+} & DD-} & (Dmc+ or ( & []))))) or (NA- & { & }) or (NA- & Xd- & TY- & Xc+); oh.zero: (NA- & NA+); zero.n: (NA- & NA+) or NN+ or Ds+ or ( & ); % the generic "number" category % AN+ is needed for date-ranges % FRACTIONS are simple fractions % Ditto for fractions ... % Not clear why we use Dmcn+ here, instead of allowing nouns to take ND- % as effectively Dmcn and ND are the "same thing" more or less. NUMBERS FRACTION: NMn- or ({EN-} & (NIfn+ or NItn-)) or NN+ or [[NF+]] or [[AN+]] or ({EN- or NIc-} & (ND+ or NIn+ or OD- or ({{@L+} & DD-} & (Dmcn+ or ( & []))))) or EQt+ or EQt-; % HMS-TIME consists of HH:MM:SS(AM|PM) type expressions % and should probably have a narrower set of parse patterns than numbers in % general. e.g. should not have EQ links XXX todo -- fix this. HMS-TIME: NUMBERS & {TZ+}; % Allowing postposed roman numerals only for now. % e.g "Pope Pious XII" ROMAN-NUMERAL-WORDS.rn: NMr-; % nouns that look like roman numerals. Limited requirements to avoid % excessive ambiguity. ROMAN-NUMERAL-WORDS.n: {@MX+} & (); % Allow post-posed letter moifiers: e.g. "Vitamin A" A.id B.id C.id D.id E.id F.id G.id H.id J.id K.id L.id M.id N.id O.id P.id Q.id R.id S.id T.id U.id V.id W.id X.id Y.id Z.id: NMa-; % Avoid having I.id interfere with pronoun I. I.id: [[NMa-]]; % Days of month % Note, however, this over-rides generic numbers in this range % and so is a superset of the generic numbers disjuncts % The following should match NUMBERS with the addition of "or TM-". 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31: NUMBERS or TM- or [[G+]]; % Ordinals - day-of-month expressions. % Used only in espressions such as "December 2nd" % Must use regex here as well, to avoid conflict with other regexes first.ti second.ti third.ti fourth.ti fifth.ti sixth.ti seventh.ti eighth.ti ninth.ti tenth.ti eleventh.ti twelfth.ti thirteenth.ti fourteenth.ti fifteenth.ti sixteenth.ti seventeenth.ti eighteenth.ti nineteenth.ti twentieth.ti twenty-first.ti twenty-second.ti twenty-third.ti twenty-fourth.ti twenty-fifth.ti twenty-sixth.ti twenty-seventh.ti twenty-eighth.ti twenty-ninth.ti thirtieth.ti thirty-first.ti DAY-ORDINALS.ti: TM-; % Years w/o apostrophe: e.g. 47 Ford Fairlane or 57 Chevy 01 02 03 040 05 06 07 08 09: or [[G+]]; 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99: NUMBERS or or [[G+]]; % year numbers % 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 /en/words/words.y: or [[G+]]; % Years: e.g. '47 Ford Fairlane or '57 Chevy '00 '01 '02 '03 '04 '05 '06 '07 '08 '09 '10 '11 '12 '13 '14 '15 '16 '17 '18 '19 '20 '21 '22 '23 '24 '25 '26 '27 '28 '29 '30 '31 '32 '33 '34 '35 '36 '37 '38 '39 '40 '41 '42 '43 '44 '45 '46 '47 '48 '49 '50 '51 '52 '53 '54 '55 '56 '57 '58 '59 '60 '61 '62 '63 '64 '65 '66 '67 '68 '69 '70 '71 '72 '73 '74 '75 '76 '77 '78 '79 '80 '81 '82 '83 '84 '85 '86 '87 '88 '89 '90 '91 '92 '93 '94 '95 '96 '97 '98 '99: or [[G+]]; 1: NMn- or ({EN-} & (NIfn+ or NItn-)) or NN+ or [[NF+]] or ({EN- or NIc-} & (ND+ or NIm+ or OD- or ({{@L+} & DD-} & (D**n+ or ( & []))))) or TM- or NSn+ or EQt+ or EQt-; %%%%% or [[G- & (({MXs+} & ) or G+ or AN+ or YS+)]] 0: NMn- or ({EN-} & (NIfn+ or NItn-)) or NN+ or [[NF+]] or ({EN- or NIc-} & (ND+ or NIn+ or OD- or ({{@L+} & DD-} & (Dmcn+ or [[Ds+]] or ( & []))))) or NSn+; %%%%% or [[G- & (({MXs+} & ) or G+ or AN+ or YS+)]] % TODO: no numers or related expressions below this point take the new NM % connector, although e.g. "point 1/2" would appear reasonable. Go through % these and add NM- analogously to other numbers as applicable. % the DECADE-TIME regex matches 1950s 1950's 1950’s etc. DECADE-TIME '20s '30s '40s '50s '60s '70s '80s '90s ‘20s ‘30s ‘40s ‘50s ‘60s ‘70s ‘80s ‘90s: {TA-} & DG- & (IN- or [[]]); twenties thirties, forties fifties sixties seventies eighties nineties hundreds.cnt: {NA-} & {TA-} & DG- & (IN- or [[]]); % teens could be above or teenagers (words.n.2) teens: ({TA-} & DG- & (IN- or )) or ; hundred thousand half-thousand million half-million quarter-million billion half-billion quarter-billion trillion half-trillion quarter-trillion dozen half-dozen bajillion bazillion gadzillion gagillion gajillion gazillion godzillion jillion jizillion kabillion kajillion katrillion killion umptillion zillion: NN- & (NNy+ or NMw- or NA+ or ({EN- or NIc-} & (ND+ or NIn+ or OD- or ({{@L+} & DD-} & (Dmcn+ or ( & )))))); half_a_dozen half_a_million: ({EN- or NIc-} & (ND+ or NIn+ or OD- or ({{@L+} & DD-} & (Dmcn+ or ( & ))))); hundreds.a thousands millions billions trillions dozens bajillions bazillions gadzillions gagillions gajillions gazillions godzillions jillions jizillions kabillions kajillions katrillions killions umptillions zillions: ({DD- or Dmc-} & & ); tens: {DD-} & OF+ & ; dozens_of tens_of hundreds_of thousands_of millions_of billions_of trillions_of bajillions_of bazillions_of gadzillions_of gagillions_of gajillions_of gazillions_of godzillions_of jillions_of jizillions_of kabillions_of kajillions_of katrillions_of killions_of umptillions_of zillions_of: ND+ or NIn+; 1/2 3/4 2/3 1/3 1/4 1/8 3/8 5/8 7/8 ½ ⅓ ⅔ ¼ ¾ ⅛ ⅜ ⅝ ⅞: ({NNx-} & NNy+) or NF+ or NIe+ or ({NNx-} & {EN- or NIc-} & (ND+ or NIn+ or OD- or ({DD-} & ([[Ds+]] or Dmcn+ or ( & ))))); and_a_half: (NW- or NSn-) & (NNy+ or ({EN- or NIc-} & (ND+ or NIn+ or ({DD-} & (Dmcn+ or ( & )))))); quarter.i: NS- & {EN-} & (NF+ or ( & )); thirds.m fourths.m quarters.m fifths.m sixths.m sevenths.m eighths.m ninths.m tenths.m: NW- & {EN-} & (NF+ or ( & )); first.a: L- or Pa- or E+ or MVa- or ({Xc+ & {Xd-}} & CO+) or A+ or [Jp-] or TT+ or ((DD- or [[NSa-]]) & & {TOn+} & ); last.a dead_last: L- or Pa- or MVa- or ({Xc+ & {Xd-}} & CO+) or [Jp-] or DTi+ or TT+ or (DD- & & {TOn+} & ) or A+; second.a: L- or Pa- or MVa- or ({Xc+ & {Xd-}} & CO+) or (DD- & & {TOn+} & ) or NR+ or A+; % This uses the L link for superlatives, but leads to strange parses: % "We celebrated their eleventh anniversary" parses differently % than "tenth anniversary". XXX this should be fixed, I suppose ... % A+: "fifteenth century Italy" % Jp-: "Mike finished in first place, and John in third." third.a fourth.a fifth.a sixth.a seventh.a eighth.a ninth.a tenth.a : L- or Pa- or MVa- or ({Xc+ & {Xd-}} & CO+) or (NS- & {EN-} & NF+) or (((NS- & & {EN-}) or (DD- & & {TOn+})) & ) or NR+ or A+ or Jp-; % NS-: "I gave him a third of the loot." eleventh.a twelfth.a thirteenth.a fourteenth.a fifteenth.a sixteenth.a seventeenth.a eighteenth.a nineteenth.a twentieth.a twenty-first.a twenty-second.a twenty-third.a twenty-fourth.a twenty-fifth.a twenty-sixth.a twenty-seventh.a twenty-eighth.a twenty-ninth.a thirtieth.a thirty-first.a thirty-second.a thirty-third.a thirty-fourth.a thirty-fifth.a thirty-sixth.a thirty-seventh.a thirty-eighth.a thirty-ninth.a fourtieth.a fourty-first.a fourty-second.a fourty-third.a fourty-fourth.a fourty-fifth.a fourty-sixth.a fourty-seventh.a fourty-eighth.a fourty-ninth.a fiftieth.a fifty-first.a fifty-second.a fifty-third.a fifty-fourth.a fifty-fifth.a fifty-sixth.a fifty-seventh.a fifty-eighth.a fifty-ninth.a sixtieth.a sixty-first.a sixty-second.a sixty-third.a sixty-fourth.a sixty-fifth.a sixty-sixth.a sixty-seventh.a sixty-eighth.a sixty-ninth.a seventieth.a seventy-first.a seventy-second.a seventy-third.a seventy-fourth.a seventy-fifth.a seventy-sixth.a seventy-seventh.a seventy-eighth.a seventy-ninth.a eightieth.a eighty-first.a eighty-second.a eighty-third.a eighty-fourth.a eighty-fifth.a eighty-sixth.a eighty-seventh.a eighty-eighth.a eighty-ninth.a ninetieth.a ninety-first.a ninety-second.a ninety-third.a ninety-fourth.a ninety-fifth.a ninety-sixth.a ninety-seventh.a ninety-eighth.a ninety-ninth.a: Pa- or MVa- or ({Xc+ & {Xd-}} & CO+) or (NS- & {EN-} & NF+) or (((NS- & & {EN-}) or (DD- & & {TOn+})) & ) or NR+ or A+ or Jp-; % Miscellaneous ordinal numbers, adjectival usage % prefer G+ over A+ in general, as these are typically parts of names. 1º.a 2º.a 3º.a 4º.a 5º.a 6º.a 7º.a 8º.a 9º.a DAY-ORDINALS.a ORDINALS.a: Pa- or MVa- or ({Xc+ & {Xd-}} & CO+) or (DD- & & {TOn+} & ) or NR+ or G+ or [A+] or AJla+ or ({Ds-} & AJra-) or (Dn- & AJn+); % "Next on our list..." are ordinals. % XXX should be converted to regex... % Note also another list of ordinals below, used for time expressions. first.ord next.ord last.ord second.ord third.ord fourth.ord fifth.ord sixth.ord seventh.ord eighth.ord ninth.ord tenth.ord eleventh.ord twelfth.ord thirteenth.ord fourteenth.ord fifteenth.ord sixteenth.ord seventeenth.ord eighteenth.ord nineteenth.ord twentieth.ord twenty-first.ord twenty-second.ord twenty-third.ord twenty-fourth.ord twenty-fifth.ord twenty-sixth.ord twenty-seventh.ord twenty-eighth.ord twenty-ninth.ord thirtieth.ord thirty-first.ord thirty-second.ord thirty-third.ord thirty-fourth.ord thirty-fifth.ord thirty-sixth.ord thirty-seventh.ord thirty-eighth.ord thirty-ninth.ord fourtieth.ord fourty-first.ord fourty-second.ord fourty-third.ord fourty-fourth.ord fourty-fifth.ord fourty-sixth.ord fourty-seventh.ord fourty-eighth.ord fourty-ninth.ord fiftieth.ord fifty-first.ord fifty-second.ord fifty-third.ord fifty-fourth.ord fifty-fifth.ord fifty-sixth.ord fifty-seventh.ord fifty-eighth.ord fifty-ninth.ord sixtieth.ord sixty-first.ord sixty-second.ord sixty-third.ord sixty-fourth.ord sixty-fifth.ord sixty-sixth.ord sixty-seventh.ord sixty-eighth.ord sixty-ninth.ord seventieth.ord seventy-first.ord seventy-second.ord seventy-third.ord seventy-fourth.ord seventy-fifth.ord seventy-sixth.ord seventy-seventh.ord seventy-eighth.ord seventy-ninth.ord eightieth.ord eighty-first.ord eighty-second.ord eighty-third.ord eighty-fourth.ord eighty-fifth.ord eighty-sixth.ord eighty-seventh.ord eighty-eighth.ord eighty-ninth.ord ninetieth.ord ninety-first.ord ninety-second.ord ninety-third.ord ninety-fourth.ord ninety-fifth.ord ninety-sixth.ord ninety-seventh.ord ninety-eighth.ord ninety-ninth.ord DAY-ORDINALS.ord ORDINALS.ord : (Wd- & {M+} & Ss*o+); % EQUATIONS ETC. % The below is just barely enough to parse just very simple equation % and expressions, nothing complex -- no general math or anything like % that. Relations are treated as "transitive verbs", taking a subject % and requiring an object. % Relations % "verb" use, e.g. "( p < 0.01 )" for "( p is less than 0.01 )" =.v <.v >.v =<.v >=.v ==.v eq.v ne.v lt.v lte.v le.v gt.v gte.v ge.v equiv.v sim.v simeq.v approx.v ~.v: ([S-] or EQ*r-) & ([O+] or EQ*r+) & (Xd- & (Xc+ or ) & (MX- or MVa-)); % Binary operators: % these occur in "simple" expressions *.v "/.v" +.v -.v x.v: ([S-] or EQ-) & ([O+] or EQ+) & (Xd- & (Xc+ or ) & (MX- or MVa-)); % Allows parsing of "dollars per day" or "mL/sec" but is somewhat % inconsistent with the equation persing otherwise described below. % XXX overall, eqn parsing could be strengthened. per "/.per": Us+ & Mp-; % Binary operators, strict: % Here EQt attaches only to terms, which may be numbers or letters. % By contrast, EQrr can only attach to relations (=, < > etc.) +.eq -.eq *.eq "/.eq" x.eqn: (EQt+ & EQt-) & (EQrr- or EQrr+ or AN+); ->.eq -->.eq: (S- & O+) & (AN+ or (Xd- & Xc+ & MX-)); % "adverb" use, e.g. "< 10" for "less than 10" =.e <.e =<.e <=.e >.e >=.e +.e -.e x.e: EN+; % TODO: un-parenthesized cases, e.g. % - preparations of 5 x 10(8) cfu/ml are made % - the strength was in the order of gerE > cotD > yfhP P2 > yfhP P1 % also remember "-->" A.eq B.eq C.eq D.eq E.eq F.eq G.eq H.eq I.eq J.eq K.eq L.eq M.eq N.eq O.eq P.eq Q.eq R.eq S.eq T.eq U.eq V.eq W.eq X.eq Y.eq Z.eq a.eq b.eq c.eq d.eq e.eq f.eq g.eq h.eq i.eq j.eq k.eq l.eq m.eq n.eq o.eq p.eq q.eq r.eq s.eq t.eq u.eq v.eq w.eq x.eq y.eq z.eq: EQt+ or EQt-; fiscal.i: TY+ & ; or_so: ND- & {{@L+} & DD-} & (Dmcn+ or ( & )); %VERBS : Xd- & (Xc+ or ) & (MX*p- or MVg-); : {Xd-} & Xc+ & COp+; % These are the verb-form expressions for ordinary verbs. % % is a marker which should never be used in a link. % It is used to flag past-tense forms in the dictionary. It's only use % is to supply an answer to the "isPastTense" call in the Java API. % which is needed by relex-version 1.2.0 and earlier. Newer versions % use the v-d, w-d, and q-d tags to identify past-tense verbs, and so % the Java API is no longer needed. It should be marked obsolete/deprecated % as soon as possible, and removed by late-2010/early-2011 : XXXPAST+; : {@E-} & ((I- & {@E-} & {Wi-}) or ({CO-} & Wi-)); : ({@E-} & (Sp- or (RS- & Bp-))) or ; : {@E-} & (Sp- or (RS- & Bp-)); : {@E-} & (Ss- or (RS- & Bs-)); : {@E-} & I-; : or ({@E-} & (S- or (RS- & B-) or PP-)); : or ({@E-} & (S- or (RS- & B-))); : {@E-} & PP-; : {@E-} & (Pg- or Mg-); : {@E-} & (Pv- or Mv-) & {@MV+}; : {@E-} & (Pv- or Mv-); : {@E-} & ( or or ({[DP-]} & ((Ss*g+ & ) or SIs*g- or )) or [DP- & J-] or [[Wq- & PF+]]); % ({[[Ds-]]} & OF+) : "a running of the bulls" "a polishing of prose" % AJ: allows use of gerunds as adjectives: "described as smooth and obliging" % : allows use of gerunds as nouns. % VJ*g: ??? this is commented out, where would this occur? : ( & (Dmu- or [[()]]) & (({[[Ds-]]} & OF+) or [[()]]) & (( & {@MXs+} & ((Ss+ & ) or SIs- or Os- or J-)) or AJra- or AJla+ or )) or [[AN+]]; : {@E-} & ( ({[DP-]} & ((Ss*g+ & ) or SIs*g- or )) or Mg- or Pg- or or or [DP- & J-] or [[Wq- & PF+ & {@MV+}]]); : {@E-} & {@MV+} & ( or or [[Wq- & PF+ & {@MV+} & {CC+}]]); % These are the verb-form expressions for special verbs that can take % filler-"it" as a subject. : {@E-} & (Sp- or If- or (RS- & Bp-) or Wi-); : {@E-} & (Ss- or SFsi- or (RS- & Bs-)); : or ({@E-} & (S- or SFsi- or PPf- or (RS- & B-))); : or ({@E-} & (S- or SFsi- or (RS- & B-))); : {@E-} & PPf-; : {@E-} & (Pgf- or Mg-); : {@E-} & (Pvf- or Mv-) & {@MV+}; : {@E-} & (Pvf- or Mv-); % These are the verb-form expressions for special verbs that can take % either filler-"it" or filler-"there" as a subject. : {@E-} & (Sp- or SFp- or If- or (RS- & Bp-) or Wi-); : {@E-} & (Ss- or SFs- or (RS- & Bs-)); : {@E-} & (Ss- or SFs- or SFu- or (RS- & Bs-)); : or ({@E-} & (S- or SF- or (RS- & B-) or PPf-)); : or ({@E-} & (S- or SF- or (RS- & B-))); : {@E-} & PPf-; : {@E-} & (Pgf- or Mg-); : {@E-} & (Pgf- or Mg- or ({[DP-]} & ((Ss*g+ & ) or SIs*g- or )) or or or [DP- & J-] or [[Wq- & PF+ & {@MV+}]]); % conjoined verbs. % VJr == left % VJl == right % VJb == but % VJd == ditransitive % VJn == neither-nor % % VJ*s == singular subject % VJ*p == plural subject % VJ*g == conjoined gerunds "He was running and jumping" % VJ*h == past participle (PP- link) "He had run and jumped" % % The following control whether the conjunction can take an object. % The conjunction should take an object if both verbs are transitive, % e.g. "I saw and greeted Sue", which should parse as % "I (saw and greeted) Sue". % VJ**i == intranstive % VJ**t == transitive % % s == singluar, pl == plural, sp == singular or plural % g == gerund : {@E-} & VJrs-; : {@E-} & VJls+; : {@E-} & VJrp-; : {@E-} & VJlp+; : {@E-} & VJr-; : {@E-} & VJl+; : {@E-} & VJr*i-; : ({@E-} & VJl*i+) or (VJn*i+ & Dn-) or (VJb*i+ & Db-); : {@E-} & VJr*t-; : {@E-} & VJl*t+; : {@E-} & VJrg-; : {@E-} & VJlg+; : {@E-} & VJrh-; : {@E-} & VJlh+; : or or (VJn*t+ & Dn-); % Verb macros making use of above connectors. % plural-infinitive macro; the cost on $1 encourages any MV links to % attach to the "and.j-v" instead of to the individual verb. % singular present tense macro; same comments as above... % present tense, but allows transitive connectinos to 'and' % past tense macro, intransitive variation % past tense macro, transitive variation % Same as above, but without the PP link % as above but for past participles % the filler-it variation of the above rules. % XXX TODO need to provide macro-ized versions for , % and the variants as well. % AUXILIARY VERBS %: (((B- or O+ or [[@MV+ & O*n+]] or Vd+ or ({N+} & (CX- or [[()]]))) & {@MV+}) %or ({N+} & I*d+)); %do.v: ({@E-} & (Sp- or SFp- or (RS- & Bp-) or Wi-) & ) %or ((SIp+ or SFIp+) & (({Q-} & I*d+) or CQ-)) or %({@E-} & I- & ((B- or O+ or [[@MV+ & O*n+]] or CX-) & {@MV+})); %does.v: ( & ) or ((SIs+ or SFIs+) & (({Q-} & I*d+) or CQ-)); %did.v: ( & ) or ((SI+ or SFI+) & (({Q-} & I*d+) or CQ-)); %done.v: ( & (B- or O+ or [[@MV+ & O*n+]] or Vd+)) or or ; %doing.v: & (O+ or B- or [[@MV+ & O*n+]] or Vd+) & {@MV+}; %doing.g: ((O+ or B- or [[@MV+ & O*n+]] or Vd+) & {@MV+} & ) or ; % %don't: (({Q-} & (SIp+ or SFIp+) & I*d+) or ({@E-} & (Sp- or SFp- or %(RS- & Bp-) or Wi-))) & (I*d+ or [[()]]); %doesn't: (({Q-} & (SIs+ or SFIs+) & I*d+) or ) & %(I*d+ or [[()]]); %didn't: or ((({Q-} & (SI+ or SFI+)) or ({@E-} & (S- or SF- or %(RS- & B-)))) & (I*d+ or [[()]])); %Mike replaced "{Q-}" with "(Rw- or Q- or [()])" : (((B- or O+ or [[@MV+ & O*n+]] or Vd+ or ({N+} & (CX- or [[()]]))) & {@MV+}) or ({N+} & I*d+)); do.v: ({@E-} & (Sp- or SFp- or (RS- & Bp-) or ({Ic-} & Wi-)) & ) or ((SIp+ or SFIp+) & (((Rw- or ({Ic-} & Q-) or [()]) & I*d+) or CQ-)) or ({@E-} & I- & ((B- or O+ or [[@MV+ & O*n+]] or CX-) & {@MV+})); does.v: ( & ) or ((SIs+ or SFIs+) & (((Rw- or ({Ic-} & Q-) or [()]) & I*d+) or CQ-)); did.v-d: ( & ) or ((SI+ or SFI+) & (((Rw- or ({Ic-} & Q-) or [()]) & I*d+) or CQ-)); % % XXX why not here ? % verb-pv-b: "I want it done." "I want the job done" : B- or O+ or [[@MV+ & O*n+]] or Vd+; done.v: (( & ()) or ( & (([]) or ())) or (() & )) or or or S-; % adjectival modifier: "I am done working", "I am through being mad" done.a finished.a through.a: ({@E-} & Pa- & {Pg+ or Os+ or @MV+}) or (AJra- & {@MV+}) or ({@MV+} & AJla+); doing.v: & (O+ or B- or [[@MV+ & O*n+]] or Vd+) & {@MV+}; doing.g: ((O+ or B- or [[@MV+ & O*n+]] or Vd+) & {@MV+} & ) or ; better.i fine.i ok.i okay.i OK.i poorly.i well.i: {EE-} & Vd-; don't don’t: (((Rw- or ({Ic-} & Q-) or [()]) & (SIp+ or SFIp+) & I*d+) or ({@E-} & (Sp- or SFp- or (RS- & Bp-) or ({Ic-} & Wi-)))) & (I*d+ or [[()]]); doesn't doesn’t: (((Rw- or ({Ic-} & Q-) or [()]) & (SIs+ or SFIs+) & I*d+) or ) & (I*d+ or [[()]]); didn't.v-d didn’t.v-d: or ((((Rw- or ({Ic-} & Q-) or [()]) & (SI+ or SFI+)) or ({@E-} & (S- or SF- or (RS- & B-)))) & (I*d+ or [[()]])); : ({@MV+} & TO+) or ((B- or O+) & {@MV+} & {[I*j+ or Pv+]}) or (([[@MV+ & O*n+]] or CX- or [[()]]) & {@MV+}) or ({N+} & PP+); have.v: ((SIp+ or SFIp+) & (((Rw- or ({Ic-} & Q-) or [()]) & PP+) or CQ-)) or ( & ); has.v: ((SIs+ or SFIs+) & (((Rw- or ({Ic-} & Q-) or [()]) & PP+) or CQ-)) or ( & ) or ( & ) or ( & ); % XXX probably should be verb-and-sp-i- etc !? had.v-d: ((SI+ or SFI+) & (((Rw- or ({Ic-} & Q-) or [()]) & PP+) or CQ-)) or ( & ) or ( & ) or ( & ) or ( & (TO+ or ((B- or O+) & {@MV+} & {[I*j+ or Pv+]}) or (([[@MV+ & O*n+]] or CX-) & {@MV+}))) or [[(SI*j+ or SFI**j+) & PP+ & ((Xd- & CCq- & Xc+) or CCq- or ({{Xd-} & Xc+} & COp+))]]; having.v: & ; having.g: ( & ) or ; hasn't hasn’t: (((Rw- or ({Ic-} & Q-) or [()]) & (SIs+ or SFIs+)) or ()) & (PP+ or ([[O+]] & {@MV+}) or [[()]]); haven't haven’t: (((Rw- or ({Ic-} & Q-) or [()]) & (SIp+ or SFIp+)) or ({@E-} & (Sp- or SFp- or (RS- & Bp-)))) & (PP+ or ([[O+]] & {@MV+}) or [[()]]); hadn't.v-d hadn’t.v-d: or ((((Rw- or ({Ic-} & Q-) or [()]) & (SI+ or SFI+)) or ({@E-} & (S- or SFs- or SFp- or (RS- & B-)))) & (PP+ or ([[O+]] & {@MV+}) or [[()]])); % Give [K+] a cost so as to prefer Pp+ in general %: % ({@EBm+} & (((O*t+ or [B**t-] or [K+] or BI+ or OF+ or PF- or % (Osi+ & R+ & Bs+) or % (Opi+ & R+ & Bp+) or % [[()]]) & {@MV+}) or % (Pp+ & {THi+ or @MV+}) or % THb+ or % TO+ or % Pa+)) or % ({N+} & (AF- or Pv+ or I*v+)) or % (({N+} or {Pp+}) & Pg*b+); : ({@EBm+} & ((([B**t-] or [K+] or BI+ or OF+ or PF- or (Osi+ & R+ & Bs+) or (Opi+ & R+ & Bp+) or [[()]]) & {@MV+}) or (Pp+ & {THi+ or @MV+}) or THb+ or TO+ or Pa+)) or ({N+} & (AF- or Pv+ or I*v+)) or (({N+} or {Pp+}) & Pg*b+); : {@EBm+} & O*t+ & {@MV+}; : {@EBm+} & (Ost+ or Opt+) & {@MV+}; : {@EBm+} & Out+ & {@MV+}; : or ; : or ; % Colon can be used as a synonym for "is" % "The answer to your question: yes" % "The capital of Germany: Berlin" ":.v": & ; % verb-x-s,u: "there is blood on his hands" % Unfortunately, this allows "There is chasing dogs", which pairs SFu to Op % and has to be removed via post-processing. is.v: ( & ) or ( & ) or ( & ) or (((Rw- or ({Ic-} & Q-) or [()]) & (SIs+ or SFIs+)) & ); 's.v ’s.v: [[( & (({@EBm+} & (((O*t+ or [K+] or BI+ or OF+ or (Osi+ & R+ & Bs+) or (Opi+ & R+ & Bp+)) & {@MV+}) or (Pp+ & {THi+ or @MV+}) or THb+ or TO+ or Pa+)) or ({Pp+} & Pg+) or Pv+ or PP+)) or (SIs+ & PF-)]]; % are.v: % (({@E-} & (Spx- or SFp- or (RS- & Bp-))) or % ((Rw- or ({Ic-} & Q-) or [()]) & (SIpx+ or SFIp+))) & ; % Don't allow are.v with uncountable noun objects. are.v: ({@E-} & (Spx- or SFp- or (RS- & Bp-)) & ) or ((Rw- or ({Ic-} & Q-) or [()]) & (SIpx+ or SFIp+) & ); was.v-d: or ( & ) or ( & ) or ( & ) or ({@E-} & SX- & ) or (((Rw- or ({Ic-} & Q-) or [()]) & (SFIs+ or SIs+ or SXI+)) & ); % XXX probably should be verb-and-sp-i- etc !? were.v-d: or (({@E-} & (Spx- or SFp- or [[Ss-]] or [[SX-]] or (RS- & Bp-))) & ) or ((Rw- or ({Ic-} & Q-) or [()]) & (SIpx+ or SFIp+) & ) or ( & ) or ( & ) or [[(SI*j+ or SFI**j+) & & ((Xd- & CCq- & Xc+) or CCq- or ({{Xd-} & Xc+} & COp+))]]; % XXX the verb-and construction is probably too broad. am.v: ((({@E-} & SX-) or ((Rw- or ({Ic-} & Q-) or [()]) & SXI+)) & ) or ( & ) or ( & ); % S*x- used for passive participles: "this action be taken". be.v: {@E-} & (Ix- or ({Ic-} & Wi-) or [S*x-]) & ; been.v: {@E-} & PPf- & ; being.v: ((({@EBm+} & (((O*t+ or [B**t-] or Pp+ or K+ or OF+ or BI+ or TO+ or THb+) & {@MV+}) or Pa+)) or AF- or Pv+) & ) or ; isn't isn’t: ( or ((Rw- or ({Ic-} & Q-) or [()]) & (SIs+ or SFIs+))) & ; wasn't.v-d wasn’t.v-d: or ((({@E-} & (Ss- or SX- or SFs- or (RS- & Bs-))) or ((Rw- or ({Ic-} & Q-) or [()]) & (SI*+ or SXI+ or SFIs+))) & ); aren't aren’t: (({@E-} & (Spx- or SFp- or (RS- & Bp-))) or ((Rw- or ({Ic-} & Q-) or [()]) & (SIpx+ or SFIp+))) & ; weren't.v-d weren’t.v-d: or ((({@E-} & (Spx- or SFp- or (RS- & Bp-))) or ((Rw- or ({Ic-} & Q-) or [()]) & (SIpx+ or SFIp+))) & ); % XXX probably should be verb-and-sp-i- etc !? will.v can.v may.v must.v could.v might.v shall.v: ((SI+ or SFI+) & (((Rw- or ({Ic-} & Q-) or [()]) & I+) or CQ-)) or ({N+} & {@E-} & (S- or SF- or (RS- & B-)) & (I+ or (CX- & {@MV+}) or [[()]])) or ( & {N+} & {@E-} & I+) or ({N+} & {@E-} & I+ & ); should.v: ((SI+ or SFI+) & (((Rw- or ({Ic-} & Q-) or [()]) & I+) or CQ-)) or ({N+} & {@E-} & (S- or SF- or (RS- & B-)) & (I+ or (CX- & {@MV+}) or [[()]])) or ( & I+) or (I+ & ) or [[(SI*j+ or SFI**j+) & I+ & ((Xd- & CCq- & Xc+) or CCq- or ({{Xd-} & Xc+} & COp+))]]; would.v: ((SI+ or SFI+) & (((Rw- or ({Ic-} & Q-) or [()]) & {Vw+} & I+) or CQ-)) or ({N+} & {@E-} & (S- or SF- or (RS- & B-)) & (({RT+} & I+) or (CX- & {@MV+}) or [[()]])) or ( & I+) or (I+ & ); ought.v: (((Rw- or ({Ic-} & Q-) or [()]) & (SI+ or SFI+)) or ({@E-} & (S- or SF- or (RS- & B-))) or ) & (TO+ or (N+ & I+)); won't can't mustn't couldn't shouldn't cannot needn't won’t can’t mustn’t couldn’t shouldn’t needn’t: ((Rw- or ({Ic-} & Q-) or [()]) & (SI+ or SFI+) & I+) or ({@E-} & (S- or SF- or (RS- & B-)) & (I+ or [[()]])) or ( & {@E-} & I+) or ({@E-} & I+ & ); wouldn't wouldn’t: ((Rw- or ({Ic-} & Q-) or [()]) & (SI+ or SFI+) & {RT+} & I+) or ({@E-} & (S- or SF- or (RS- & B-)) & (({RT+} & I+) or [[()]])) or ( & {@E-} & (({RT+} & I+) or [[()]])) or ({@E-} & (({RT+} & I+) or [[()]]) & ); % =================================================================== % COMMON VERB CATEGORIES (The last number of the file name indicates % the verb form: 1=plural-infinitive, 2=singular, 3=past("ed"), % 4=progressive("-ing"), 5=gerund("-ing".) % abbreviations for ditransitive and optionally ditranstive verbs % ditranstive verbs take a direct and indirect object % e.g. "I gave her a rose" : (O+ & {[[@MV+]]} & O*n+ & {VJd+}); : (O+ & {{[[@MV+]]} & O*n+ & {VJd+}}); : (O+ & {{[[@MV+]]} & [O*n+] & {VJd+}}); % common intransitive verbs : {@MV+}; % XXX Hmmm. There is a fair number of verbs in here that are "weakly" % transitive, i.e. are transitive in various rare usages: % "I ambled the horse", "I hydroplaned the car", etc. Per theory of % functional grammar and related, transitivity should be taken as % variable, so e.g. we could assign a high cost to the transitive use % of some of these verbs ... % % accrue.v ache.v acquiesce.v ad-lib.v adhere.v adjoin.v alight.v /en/words/words.v.1.1: (( & ()) or ( & ([()] or ())) or (() & )); % accounts.v accrues.v aches.v acquiesces.v ad-libs.v adheres.v /en/words/words.v.1.2: (( & ()) or ( & ([()] or ())) or (() & )); % accounted.v accrued.v ached.v acquiesced.v ad-libbed.v adhered.v /en/words/words.v.1.3: (( & ()) or ( & (([]) or ())) or (() & )); fundheld.v-d strove.v-d: (( & ()) or ( & (([]) or ())) or (() & )); % accruing.v aching.v acquiescing.v ad-libbing.v adhering.v adjoining.v /en/words/words.v.1.4: ( & ) or ({@E-} & A+) or ; arisen.v: {@E-} & PP- & {@MV+}; % -------------------------------------------------------------- % intransitive verbs that can take particles like "up" and "out" : {K+} & {@MV+}; % barge.v booze.v bottom.v bow.v branch.v breeze.v brim.v bulge.v cave.v /en/words/words.v.5.1: (( & ()) or ( & ([()] or ())) or (() & )); /en/words/words.v.5.2: (( & ()) or ( & ([()] or ())) or (() & )); /en/words/words.v.5.3: (( & ()) or ( & (([]) or ())) or (() & )) or ({@E-} & A+); slunk.v-d: (( & ()) or ( & (([]) or ())) or (() & )); lay.v-d: (( & ()) or ( & (([]) or ())) or (() & )); lain.v: (( & ()) or ( & (([]) or ())) or (() & )); /en/words/words.v.5.4: ( & ) or ({@E-} & A+) or ; % -------------------------------------------------------------- % irregular -- coming is in words.v.5.4 ... : {(K+ & {Pa+}) or [[Pg+]]} & {@MV+}; come.v: (( & ()) or ( & ([()] or ())) or (() & )) or (( & ()) or ( & (([]) or ())) or (() & )) or ({@E-} & Ix- & O*t+); comes.v: (( & ()) or ( & ([()] or ())) or (() & )); came.v-d: (( & ()) or ( & (([]) or ())) or (() & )); % -------------------------------------------------------------- % optionally transitive verbs % abdicate.v abide.v abort.v accelerate.v acclimate.v acclimatize.v : {O+ or B- or [[@MV+ & O*n+]]} & {@MV+}; /en/words/words.v.2.1: (( & ()) or ( & ([()] or ())) or (() & )); /en/words/words.v.2.2: (( & ()) or ( & (([]) or ())) or (() & ) or ); /en/words/words.v.2.3: (( & ()) or ( & (([]) or ())) or (() & )) or or or ({@E-} & A+) or ; shrank.v-d withdrew.v-d sank.v-d forgave.v-d hove.v-d spoilt.v-d unbent.v-d overfed.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or ({@E-} & A+); shrunk.v withdrawn.v sunk.v forgiven.v: (( & ()) or ( & (([]) or ())) or (() & )) or or ({@E-} & A+) or ; bid.v-d hurt.v-d thrust.v-d broadcast.v-d outbid.v-d sublet.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or ( & ) or or ({@E-} & A+) or ; /en/words/words.v.2.4: & ; /en/words/words.v.2.5: ( & ) or ({@E-} & A+) or ; % -------------------------------------------------------------- % vc-judge: a lot like vc-delcare, except optionally transitive. : or ((B- or O+) & ({@MV+} & Pa**j+)); judge.v: (( & ()) or ( & ([()] or ())) or (() & )); judges.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); judged.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or ( & {{@MV+} & Pa+}) or ({@E-} & A+) or ; judging.v: & ; judging.g: ( & ) or ({@E-} & A+) or ; % -------------------------------------------------------------- : {K+ or OD+} & {@MV+}; rise.v fall.v: (( & ()) or ( & ([()] or ())) or (() & )); rises.v falls.v: (( & ()) or ( & ([()] or ())) or (() & )); rose.v-d fell.v-d: (( & ()) or ( & (([]) or ())) or (() & )); risen.v: (( & ()) or ( & (([]) or ())) or (() & )); fallen.v: (( & ()) or ( & (([]) or ())) or (() & )) or ({@E-} & A+); rising.v falling.v: ( & ) or ({@E-} & A+) or ; % words.v.6: Optionally transitive verbs that can take particles % like "up" and "out" -- see also words.v.8 % average.v back.v bail.v bang.v beam.v beef.v bellow.v bend.v bind.v % The [[@MV+ & O*n+]] term allows some bad parses, e.g. allows: % "she walked out of the room two minutes" % % Pa**j link: "The thugs beat him senseless" "You are driving me crazy" % XXX However, very few of these verbs actually take the Pa**j link ... % and so should be reclaased. : ((K+ & {[[@MV+]]} & O*n+) or ({O+ or B-} & {K+}) or ((B- or O+) & ({@MV+} & Pa**j+)) or [[@MV+ & O*n+]]) & {@MV+}; /en/words/words.v.6.1: (( & ()) or ( & ([()] or ())) or (() & )); /en/words/words.v.6.2: (( & ()) or ( & (([]) or ())) or (() & ) or ); /en/words/words.v.6.3: (( & ()) or ( & (([]) or ())) or (() & )) or or ( & {K+} & {@MV+}) or ({@E-} & A+) or ({K+} & ); split.v-d spread.v-d beat.v-d fit.v-d shut.v-d cast.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or ( & ) or ( & {K+}) or ({@E-} & A+) or ({K+} & ); ate.v-d bit.v-d blew.v-d broke.v-d drank.v-d drove.v-d flew.v-d froze.v-d hid.v-d ran.v-d rang.v-d rode.v-d sprang.v-d stalked.v-d woke.v-d test-drove.v-d forbore.v-d oversaw.v-d throve.v-d shrove.v-d countersank.v-d outgrew.v-d strode.v-d offsetted.v-d overthrew.v-d partook.v-d begot.v-d overdid.v-d smote.v-d stank.v-d quick-froze.v-d backbit.v-d awoke.v-d redid.v-d chidded.v-d reran.v-d rived.v-d befell.v-d outrode.v-d betrode.v-d outdid.v-d ridded.v-d deep-froze.v-d forbad.v-d deep-freezed.v-d retook.v-d interwove.v-d bespoke.v-d underwent.v-d slew.v-d overdrew.v-d overcame.v-d outwore.v-d foreknew.v-d wove.v-d trod.v-d outwent.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or ; beaten.v bitten.v blown.v broken.v driven.v drunk.v eaten.v flown.v frozen.v hidden.v ridden.v rung.v sprung.v stricken.v swum.v woken.v befallen.v interwoven.v overborne.v outgone.v outgrown.v test-driven.v outdone.v shrunken.v countersunk.v bespoken.v underlain.v partaken.v redone.v overdone.v outridden.v deep-frozen.v bestrid.v undergone.v outbidden.v shorn.v outworn.v bestridden.v stunk.v borne.v slain.v woven.v riven.v backbitten.v overlain.v bestrewn.v forborne.v quick-frozen.v browbeaten.v aquitted.v overseen.v smitten.v overdrawn.v striven.v thriven.v shriven.v backslidden.v retaken.v trodden.v chidden.v begotten.v sown.v sewn.v sawn.v hewn.v cloven.v foreknown.v overthrown.v strewn.v awoken.v bidden.v stridden.v slain_dead: (( & ()) or ( & (([]) or ())) or (() & )) or ( & {K+}) or ({@E-} & A+) or ({K+} & ); run.v: (( & ()) or ( & ([()] or ())) or (() & )) or (( & ()) or ( & (([]) or ())) or (() & )) or ( & {K+}) or ({@E-} & A+) or ({K+} & ); /en/words/words.v.6.4: ( & ) or or ; /en/words/words.v.6.5: ( & ) or or ({@E-} & A+); frizz.v frizzle.v prink.v slough.v scuff.v tog.v swot.v: (( & ()) or ( & ([()] or ())) or (() & )); % just like & , except that "and" is the one % XXX TODO review this ... and.v-fill: ((VJlg- & VJrg+) & (Pg- or Mg- or ({Xd-} & VJrg-))) & ; % ------------------------------------------------------------ % common transitive verbs % abandon.v abase.v abbreviate.v abduct.v abet.v abhor.v abolish.v : (O+ or B- or [[@MV+ & O*n+]]) & {@MV+}; /en/words/words.v.4.1 : (( & ()) or ( & ([()] or ())) or (() & )); /en/words/words-medical.v.4.1: (( & ()) or ( & ([()] or ())) or (() & )); /en/words/words.v.4.2: (( & ()) or ( & (([]) or ())) or (() & ) or ); /en/words/words-medical.v.4.2: (( & ()) or ( & (([]) or ())) or (() & ) or ); /en/words/words.v.4.3: (( & ()) or ( & (([]) or ())) or (() & )) or or or (({@E-} or {@EA-} or {@AN-}) & A+) or ; % !?XXX many of the new additions fail some common sentences, such as: % The candle guttered. It plummeted to the bottom. Prices plummeted! /en/words/words-medical.v.4.3: (( & ()) or ( & (([]) or ())) or (() & )) or or or (({@E-} or {@EA-}) & A+) or ; forsook.v-d overrode.v-d overtook.v-d rewrote.v-d undid.v-d overran.v-d mistook.v-d underwrote.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or ; hit.v-d misread.v-d shed.v-d rid.v-d overcome.v-d offset.v-d overrun.v-d upset.v-d undercut.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or ( & ) or or ({@E-} & A+) or ; forsaken.v overridden.v overtaken.v rewritten.v undone.v beset.v mistaken.v underwritten.v: (( & ()) or ( & (([]) or ())) or (() & )) or or ({@E-} & A+) or ; /en/words/words.v.4.4 /en/words/words-medical.v.4.4: & ; /en/words/words.v.4.5 /en/words/words-medical.v.4.5: ( & ) or ; % ----------------------------------------------------------------- % words.v.8: Transitive verbs that can take particles like "up" and "out" % auction.v bandy.v bar.v batten.v bite.v block.v blot.v blurt.v % See also words.v.6 for optionally transitive verbs. % XXX TODO: should be reviewed, as some of them are optionally transitive % : ((K+ & {[[@MV+]]} & O*n+) or ((O+ or B-) & {K+}) or [[@MV+ & O*n+]]) & {@MV+}; /en/words/words.v.8.1: (( & ()) or ( & ([()] or ())) or (() & )); /en/words/words.v.8.2: (( & ()) or ( & (([]) or ())) or (() & ) or ); stole.v-d threw.v-d tore.v-d wore.v-d overate.v-d over-ate.v-d forewent.v-d oversewed.v-d forswore.v-d foreswore.v-d forwent.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or ; stolen.v shaken.v thrown.v torn.v worn.v forgone.v curretted.v forsworn.v oversewn.v over-eaten.v foresworn.v overeaten.v: (( & ()) or ( & (([]) or ())) or (() & )) or ( & {K+} & {@MV+}) or ({@E-} & A+) or ({K+} & ); /en/words/words.v.8.3: (( & ()) or ( & (([]) or ())) or (() & )) or or ( & {K+} & {@MV+}) or ({@E-} & A+) or ({K+} & ); cut.v: (( & ()) or ( & (([]) or ())) or (() & )) or or ( & ) or ( & {K+} & {@MV+}) or ({@E-} & A+) or ({K+} & ); /en/words/words.v.8.4: & ; /en/words/words.v.8.5: ( & ) or ; % -------------------------------------------------------------- : (((O+ or B-) & {OD+}) or [[@MV+ & O*n+]]) & {@MV+}; raise.v lower.v up.v: (( & ()) or ( & ([()] or ())) or (() & )); raises.v lowers.v ups.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); raised.v-d lowered.v-d upped.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or or ({@E-} & A+) or ; raising.v lowering.v upping.v: & ; raising.g lowering.g upping.g: ( & ) or ; % much like words.v.2.1, except can have "TO" link. % tending.g remains in words.v.2.5 % I tended for years to believe that shepherds tend sheep. : & {TO+}; tend.v: (( & ()) or ( & ([()] or ())) or (() & )); tends.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); tended.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or or ({@E-} & A+) or ; tending.v: & ; % INTRANSITIVE COMPLEX VERBS (those that do not take O+) : {@MV+} & {TO+}; consent.v endeavor.v hesitate.v proceed.v aspire.v purport.v: (( & ()) or ( & ([()] or ())) or (() & )); consents.v endeavors.v hesitates.v proceeds.v aspires.v purports.v: (( & ()) or ( & ([()] or ())) or (() & )); consented.v-d endeavored.v-d hesitated.v-d proceeded.v-d aspired.v-d purported.v-d: (( & ()) or ( & (([]) or ())) or (() & )); consenting.v endeavoring.v hesitating.v proceeding.v aspiring.v purporting.v: ( & ) or ; : {@MV+} & TO+; endeavour.v condescend.v deign.v: (( & ()) or ( & ([()] or ())) or (() & )); endeavours.v condescends.v deigns.v: (( & ()) or ( & ([()] or ())) or (() & )); endeavoured.v-d condescended.v-d deigned.v-d: (( & ()) or ( & (([]) or ())) or (() & )); endeavouring.v condescending.v deigning.v: ( & ) or ; : {@MV+} & {TO+ or THi+}; happen.v: (( & ()) or ( & ([()] or ())) or (() & )); happens.v: (( & ()) or ( & ([()] or ())) or (() & )); happened.v-d: (( & ()) or ( & (([]) or ())) or (() & )); happening.v: ( & ) or ; % ditransitve : ({@MV+} & {TH+ or Ce+ or RSe+ or TO+}) or ; wish.v: (( & ()) or ( & ([()] or ())) or (() & )); wished.v-d: (( & ()) or ( & (([]) or ())) or (() & )); wishes.v: (( & ()) or ( & ([()] or ())) or (() & )); wishing.v: ( & ) or ; % The O+ target is to handle "I hope so", but really, we should have % a special-case for this (i.e. a new minor letter). % See also for the same problem. : ({@MV+} & {TH+ or Ce+ or RSe+ or TO+}) or [[O+ & {@MV+}]]; hope.v agree.v pretend.v swear.v pray.v vow.v vote.v: (( & ()) or ( & ([()] or ())) or (() & )); hopes.v agrees.v pretends.v swears.v prays.v vows.v votes.v: (( & ()) or ( & ([()] or ())) or (() & )); pretended.v-d prayed.v-d: (( & ()) or ( & (([]) or ())) or (() & )); % The ( & THi+) allows "it is hoped that ..." to parse. hoped.v-d voted.v-d vowed.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or ( & THi+); agreed.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or ( & TH+); swore.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or ; sworn.v: (( & ()) or ( & (([]) or ())) or (() & )) or ({@E-} & A+); hoping.v agreeing.v pretending.v swearing.v praying.v vowing.v voting.v: ( & ) or ; : {@MV+} & {Pa+ or TOf+ or THi+ or AF- or [[Pv+]]}; appear.v: & ; appears.v: & ; appeared.v-d: & ; appearing.v: ( & ) or ; : {@MV+} & (Pa+ or TOf+ or LI+ or THi+ or AF- or [[Pv+]]); seem.v: & ; seems.v: & ; seemed.v-d: & ; seeming.v: ( & ) or ; : {@MV+} & {TO+ or QI+}; care.v: (( & ()) or ( & ([()] or ())) or (() & )); cares.v: (( & ()) or ( & ([()] or ())) or (() & )); cared.v-d: (( & ()) or ( & (([]) or ())) or (() & )); caring.v: ( & ) or ; : ({@MV+} & (TH+ or RSe+ or Z- or Ce+)); assert.v contend.v remark.v retort.v intimate.v exclaim.v conjecture.v allege.v surmise.v opine.v insinuate.v suppose.v: (( & ()) or ( & ([()] or ())) or (() & )); asserts.v contends.v remarks.v retorts.v intimates.v exclaims.v conjectures.v alleges.v surmises.v opines.v insinuates.v supposes.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); retorted.v intimated.v exclaimed.v conjectured.v surmised.v-d opined.v-d insinuated.v-d: (( & ()) or ( & (([]) or ())) or (() & )); asserted.v-d contended.v-d remarked.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or ( & THi+); alleged.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or ( & THi+) or ({@E-} & A+); supposed.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or ( & {TOf+ or THi+ or Z-}) or ({@E-} & A+); asserting.v contending.v remarking.v retorting.v intimating.v exclaiming.v conjecturing.v alleging.v surmising.v opining.v insinuating.v supposing.v: ( & ) or ; : {@MV+} & {TH+}; theorize.v attest.v fantasize.v muse.v speculate.v concur.v: (( & ()) or ( & ([()] or ())) or (() & )); theorizes.v attests.v fantasizes.v muses.v speculates.v concurs.v: (( & ()) or ( & ([()] or ())) or (() & )); attested.v-d fantasized.v-d mused.v-d speculated.v-d concurred.v-d: (( & ()) or ( & (([]) or ())) or (() & )); theorized.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or ( & THi+); theorizing.v attesting.v fantasizing.v musing.v speculating.v concurring.v: ( & ) or ; : ({@MV+} & {TH+ or Ce+}); reply.v whisper.v argue.v sigh.v mutter.v testify.v comment.v respond.v hint.v reason.v brag.v: (( & ()) or ( & ([()] or ())) or (() & )); replies.v whispers.v argues.v sighs.v mutters.v testifies.v comments.v responds.v hints.v reasons.v brags.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); replied.v-d sighed.v-d commented.v-d responded.v-d bragged.v-d: (( & ()) or ( & (([]) or ())) or (() & )); % The ( & THi+) allows "it is reasoned that ..." to parse. argued.v-d hinted.v-d muttered.v-d reasoned.v-d testified.v-d whispered.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or ( & THi+); replying.v whispering.v arguing.v sighing.v muttering.v testifying.v commenting.v responding.v hinting.v reasoning.v bragging.v: ( & ) or ; : {@MV+} & {Ce+ or TH+ or RSe+ or (OF+ & {@MV+}) or BW-}; dream.v complain.v: (( & ()) or ( & ([()] or ())) or (() & )); dreams.v complains.v: (( & ()) or ( & ([()] or ())) or (() & )); dreamt.v-d dreamed.v-d complained.v-d: (( & ()) or ( & (([]) or ())) or (() & )); dreaming.g complaining.g: ( & ) or ; dreaming.v complaining.v: & ; % The O+ is to handle "do you think so, too?", however, a special % target for objects like "so" or "it" would be better... % "hope.v" has the same problem. : ({@MV+} & {Ce+ or TH+ or RSe+ or Z- or (OF+ & {@MV+}) or BW-}) or [[O+ & {@MV+}]]; think.v: (( & ()) or ( & ([()] or ())) or (() & )); thinks.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); thought.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or ( & {THi+ or Z-}); thinking.g: ( & ) or ; thinking.v: & ; : {@MV+} & {THi+ or QIi+}; matter.v: (( & ()) or ( & ([()] or ())) or (() & )) or ; matters.v: & ; mattered.v-d: (( & ()) or ( & (([]) or ())) or (() & )); mattering.v: ( & ) or ; : {@MV+} & {THi+}; suffice.v: (( & ()) or ( & ([()] or ())) or (() & )); suffices.v: (( & ()) or ( & ([()] or ())) or (() & )); sufficed.v-d: (( & ()) or ( & (([]) or ())) or (() & )); sufficing.v: ( & ) or ; : ({@MV+} & {TH+ or Zs- or TS+ or Ce+}) or (SI*j+ & I*j+); insist.v: (( & ()) or ( & ([()] or ())) or (() & )); insists.v: (( & ()) or ( & ([()] or ())) or (() & )); insisted.v-d: (( & ()) or ( & (([]) or ())) or (() & )); insisting.v: ( & ) or ; : {@MV+} & {QI+}; wonder.v inquire.v: (( & ()) or ( & ([()] or ())) or (() & )); wonders.v inquires.v: (( & ()) or ( & ([()] or ())) or (() & )); wondered.v-d inquired.v-d: (( & ()) or ( & (([]) or ())) or (() & )); wondering.v inquiring.v: ( & ) or ; % Imperative go: "go play ball", "go take a walk", "go swimming" % Similar pattern to "please.r" -- "please play ball" etc. % "You and Rover go play with the ball." requires an S- link. % Hmm ... changes to go.v seem to have obsoleted the need for this ... % go.w: {E-} & (Wi- or S-) & I+; : {K+ or [[Pa+]] or [Pg+] or I*g+} & {@MV+}; go.v: (( & ()) or ( & ([()] or ())) or (() & )); % SFs-: "There goes the cutest guy ever!", needs O*t to survive PP. % However, prefer Pg over O*t when possible... goes.v: ( & ( or [[O*t+ & {@MV+}]])) or ( & ) or ( & ); went.v-d: ( & ( or [[O*t+ & {@MV+}]])) or ( & ) or ( & ); % XXX TODO maybe need VJ and-able links for gone, going etc. ??? gone.v: (( & ()) or ( & (([]) or ())) or (() & )); % The keys are gone. The popcorn is all gone. gone.a: ({@E-} & Pa-) or (AJra- & {@MV+}) or ({@MV+} & AJla+); going.v: ((TOf+ or ({K+ or [[Pa+]]} & {@MV+})) & ) or ({@E-} & A+) or ; % transitive: "stay the prisoner's execution" : {({@MV+} & (Pa+ or AF-)) or ({K+} & {@MV+}) or (O+ & {@MV+})}; stay.v: (( & ()) or ( & ([()] or ())) or (() & )); stays.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); stayed.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or ; staying.v: ( & ) or ; : {({@MV+} & Pa+) or ({O+ or B-} & {K+} & {@MV+})}; stand.v sit.v: (( & ()) or ( & ([()] or ())) or (() & )); stands.v sits.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); stood.v-d sat.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or ; standing.v sitting.v: & ; standing.g sitting.g: ( & ) or or ({@E-} & A+); : ({@MV+} & {LI+ or Pa+ or AF-}) or {O+ & K+ & {@MV+}}; sound.v: (( & ()) or ( & ([()] or ())) or (() & )); sounds.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); sounded.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or ; sounding.v: ( & ) or ; : {({@MV+} & (LI+ or Pa+)) or ({K+ or AF-} & {@MV+})}; act.v: (( & ()) or ( & ([()] or ())) or (() & )); acts.v: (( & ()) or ( & ([()] or ())) or (() & )); % "be acted upon quikly" acted.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or ( & {K+} & {@MV+}); acting.v: ( & ) or ; % O+ & K+: She looked him over. : {({@MV+} & (LI+ or Pa+)) or ({K+ or AF-} & {@MV+}) or ((O+ & K+) & {@MV+})}; look.v: (( & ()) or ( & ([()] or ())) or (() & )); looks.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); looked.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or ; looking.v: ( & ) or ; : {{@MV+ or ({Xc+} & @EB+)} & OF+}; repent.v disapprove.v: (( & ()) or ( & ([()] or ())) or (() & )); repents.v disapproves.v: (( & ()) or ( & ([()] or ())) or (() & )); repented.v-d disapproved.v-d: (( & ()) or ( & (([]) or ())) or (() & )); repenting.v disapproving.v: ( & ) or ; : & ; talk.v: (( & ()) or ( & ([()] or ())) or (() & )); talks.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); talked.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or ; talking.v: ( & & ) or ; : {@MV+ or @EB+} & OF+; consist.v: (( & ()) or ( & ([()] or ())) or (() & )); consists.v: (( & ()) or ( & ([()] or ())) or (() & )); consisted.v-d: (( & ()) or ( & (([]) or ())) or (() & )); consisting.v: ( & ) or ; : {K+ or OF+} & {@MV+}; die.v: (( & ()) or ( & ([()] or ())) or (() & )); dies.v: (( & ()) or ( & ([()] or ())) or (() & )); died.v-d: (( & ()) or ( & (([]) or ())) or (() & )); dying.v: ( & ) or ; : {({[[@MV+]]} & OT+) or BT-} & {@MV+}; last.v wait.v: (( & ()) or ( & ([()] or ())) or (() & )); lasts.v waits.v: (( & ()) or ( & ([()] or ())) or (() & )); lasted.v-d waited.v-d: (( & ()) or ( & (([]) or ())) or (() & )); lasting.v waiting.v: & ; lasting.g waiting.g: ( & ) or ; % TRANSITIVE COMPLEX VERBS (Those that take O+) : or ({@MV+} & TO+); attempt.v undertake.v deserve.v manage.v plot.v prefer.v neglect.v afford.v commit.v profess.v desire.v: (( & ()) or ( & ([()] or ())) or (() & )); attempts.v undertakes.v deserves.v manages.v plots.v prefers.v neglects.v affords.v commits.v professes.v desires.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); attempted.v deserved.v managed.v plotted.v preferred.v neglected.v afforded.v committed.v professed.v-d desired.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or or ({@E-} & A+) or ; undertook.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or ; undertaken.v: (( & ()) or ( & (([]) or ())) or (() & )) or ; attempting.g undertaking.g deserving.g plotting.g preferring.g neglecting.g affording.g committing.g professing.g desiring.g: ( & ) or ; managing.g: ( & ) or or ({@E-} & A+); attempting.v undertaking.v deserving.v managing.v plotting.v preferring.v neglecting.v affording.v committing.v professing.v desiring.v: & ; % like but with particle : ({@MV+} & TO+) or ((((O+ or B-) & {K+}) or (K+ & {[[@MV+]]} & O*n+) or ([[@MV+ & O*n+]])) & {@MV+}); seek.v: (( & ()) or ( & ([()] or ())) or (() & )); seeks.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); sought.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or or ; seeking.g: ( & ) or ; seeking.v: & ; : {} or ({@MV+} & TO+); decline.v fail.v hasten.v volunteer.v aim.v: (( & ()) or ( & ([()] or ())) or (() & )); declines.v fails.v hastens.v volunteers.v aims.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); declined.v-d hastened.v-d volunteered.v-d aimed.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or or ; failed.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or or ({@E-} & A+); declining.g failing.g hastening.g volunteering.g: ( & ) or or ({@E-} & A+); declining.v failing.v hastening.v volunteering.v aiming.v: & ; % like but with particle : ({@MV+} & TO+) or ({({O+ or B-} & {K+}) or (K+ & {[[@MV+]]} & O*n+) or [[@MV+ & O*n+]]} & {@MV+}); fight.v: (( & ()) or ( & ([()] or ())) or (() & )); fights.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); fought.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or ( & {K+} & {@MV+}) or ({K+} & ); fighting.g: ( & ) or ; fighting.v: & ; : or ({@MV+} & (TO+ or TH+ or Zs- or Ce+)); threaten.v mean.v arrange.v pledge.v: (( & ()) or ( & ([()] or ())) or (() & )); threatens.v means.v arranges.v pledges.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); threatened.v-d meant.v-d arranged.v-d pledged.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or or ({@E-} & A+) or ; meaning.g arranging.g threatening.g pledging.g: ( & ) or ; meaning.v arranging.v threatening.v pledging.v: & ; : or ({@MV+} & {TO+ or TH+ or Zs- or Ce+}); plan.v confess.v: (( & ()) or ( & ([()] or ())) or (() & )); plans.v confesses.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); planned.v-d confessed.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or or ({@E-} & A+) or ; planning.g confessing.g: ( & ) or ; planning.v confessing.v: & ; : or ({@MV+} & {QI+ or TH+ or TO+ or Ce+ or RSe+ or Zs-}); decide.v resolve.v: (( & ()) or ( & ([()] or ())) or (() & )); decides.v resolves.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); decided.v-d resolved.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or ( & {THi+}) or ; deciding.v resolving.v: & ; deciding.g resolving.g: ( & ) or ; : {} or ({@MV+} & (QI+ or TH+ or TO+ or Ce+ or RSe+ or Zs- or Pg+)); remember.v forget.v: (( & ()) or ( & ([()] or ())) or (() & )); remembers.v forgets.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); remembered.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or or ; forgot.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or ; forgotten.v: (( & ()) or ( & (([]) or ())) or (() & )) or or ({@E-} & A+) or ; remembering.g forgetting.g: ( & ) or ; remembering.v forgetting.v: & ; : {} or ({@MV+} & (TH+ or TO+ or Ce+ or RSe+ or Zs- or QI+ or (OF+ & {@MV+}))); learn.v: (( & ()) or ( & ([()] or ())) or (() & )); learns.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); learned.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or ( & {THi+}) or ; learning.g: ( & ) or ; learning.v: & ; : or ({@MV+} & (TO+ or TH+ or Ce+ or RSe+ or Z- or Pg+ or TS+ or (SI*j+ & I*j+))); propose.v: (( & ()) or ( & ([()] or ())) or (() & )); proposes.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); proposed.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or ( & {THi+ or TSi+ or Z-}) or ({@E-} & A+) or ; proposing.g: ( & ) or ; proposing.v: & ; : or ({@MV+} & ((TO+ or TH+ or Z- or TS+ or ((SI*j+ or SFI**j+) & I*j+)))); demand.v: (( & ()) or ( & ([()] or ())) or (() & )); demands.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); demanded.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or or ; demanding.v: & ; demanding.g: ( & ) or ; : {} or ({@MV+} & ((TO+ or TH+ or Z- or TS+ or ((SI*j+ or SFI**j+) & I*j+)))); beg.v plead.v: (( & ()) or ( & ([()] or ())) or (() & )); begs.v pleads.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); begged.v-d pleaded.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or or ; begging.v pleading.v: & ; begging.g pleading.g: ( & ) or ; : ; bear.v: ( & ( or ({@MV+} & (Pg+ or TH+ or TO+)))) or ( & ); bears.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); bore.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or ; born.v: (( & ()) or ( & (([]) or ())) or (() & )) or or ; bearing.g: ( & ) or ; bearing.v: & ; : or ({@MV+} & (TO+ or Pg+)); love.v dislike.v hate.v: (( & ()) or ( & ([()] or ())) or (() & )); loves.v dislikes.v hates.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); loved.v-d disliked.v-d hated.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or or ; loving.g disliking.g hating.g: ( & ) or ; loving.v disliking.v hating.v: & ; % "It begins here" : {} or ({@MV+} & ({TO+} or Pg+)); begin.v continue.v cease.v: (( & ()) or ( & ([()] or ())) or (() & )); begins.v continues.v ceases.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); ceased.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or or ; continued.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or or or ({@E-} & A+); began.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or ; begun.v: (( & ()) or ( & (([]) or ())) or (() & )) or or ; beginning.g ceasing.g: ( & ) or ; continuing.g: ( & ) or or ({@E-} & A+); beginning.v continuing.v ceasing.v: & ; % with particle : ((({O+ or B-} & {K+}) or (K+ & {[[@MV+]]} & O*n+) or [[@MV+ & O*n+]]) & {@MV+}) or ({@MV+} & (TO+ or Pg+)); start.v stop.v try.v: (( & ()) or ( & ([()] or ())) or (() & )); starts.v stops.v tries.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); started.v-d stopped.v-d tried.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or ( & {K+} & {@MV+}) or ({K+} & ); starting.g stopping.g trying.g: ( & ) or ; starting.v stopping.v trying.v: & ; % The Pg+ doesn't really apply to all of these ... : or ({@MV+} & (TH+ or Zs-)) or ({@MV+} & Pg+); recognize.v dispute.v accept.v calculate.v record.v deduce.v envision.v recount.v signify.v clarify.v disclose.v recollect.v adduce.v posit.v reiterate.v infer.v presuppose.v: (( & ()) or ( & ([()] or ())) or (() & )); recognizes.v disputes.v calculates.v records.v deduces.v accepts.v envisions.v recounts.v signifies.v clarifies.v discloses.v recollects.v adduces.v posits.v reiterates.v infers.v presupposes.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); recognized.v-d disputed.v-d accepted.v-d calculated.v-d recorded.v-d deduced.v-d envisioned.v-d recounted.v-d signified.v-d clarified.v-d disclosed.v-d recollected.v-d adduced.v-d posited.v-d reiterated.v-d inferred.v-d presupposed.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or ( & {THi+}) or ({@E-} & A+) or ; recognizing.g disputing.g accepting.g calculating.g deducing.g recording.g envisioning.g recounting.g signifying.g clarifying.g disclosing.g recollecting.g adducing.g positing.g reiterating.g inferring.g presupposing.g: ( & ) or ; recognizing.v disputing.v accepting.v calculating.v deducing.v recording.v envisioning.v recounting.v signifying.v clarifying.v disclosing.v recollecting.v adducing.v positing.v reiterating.v inferring.v presupposing.v: & ; undisputed.v: ( & {THi+}); : {} or ({@MV+} & TH+); repeat.v reflect.v provide.v counter.v signal.v: (( & ()) or ( & ([()] or ())) or (() & )); repeats.v reflects.v provides.v counters.v signals.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); repeated.v-d reflected.v-d countered.v-d signaled.v-d signalled.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or or or ({@E-} & A+); provided.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or or or ({@E-} & A+) or ((TH+ or Ce+) & (({{Xd-} & Xc+} & CO+) or ({Xd- & Xc+} & MVs-))); repeating.v reflecting.v providing.v countering.v signaling.v signalling.v: & ; repeating.g reflecting.g countering.g signaling.g signalling.g: ( & ) or ; providing.g: ( & ) or or ((TH+ or Ce+) & (({{Xd-} & Xc+} & CO+) or ({Xd- & Xc+} & MVs-))); : or ({@MV+} & (Ce+ or TH+ or RSe+ or Pg+)); sense.v doubt.v reaffirm.v reckon.v regret.v proclaim.v ascertain.v discern.v stipulate.v affirm.v certify.v trust.v postulate.v ensure.v imply.v verify.v boast.v: (( & ()) or ( & ([()] or ())) or (() & )); senses.v reaffirms.v doubts.v reckons.v regrets.v proclaims.v stipulates.v ascertains.v discerns.v affirms.v certifies.v trusts.v postulates.v ensures.v implies.v verifies.v boasts.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); doubted.v-d reaffirmed.v-d sensed.v-d reckoned.v-d regretted.v-d stipulated.v-d proclaimed.v-d ascertained.v-d discerned.v-d affirmed.v-d certified.v-d trusted.v-d postulated.v-d ensured.v-d implied.v-d verified.v-d boasted.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or ( & {THi+}) or ({@E-} & A+) or ; reaffirming.g sensing.g doubting.g stipulating.g reckoning.g regretting.g proclaiming.g ascertaining.g discerning.g affirming.g certifying.g trusting.g postulating.g ensuring.g implying.g verifying.g boasting.g: ( & ) or ; sensing.v doubting.v reckoning.v reaffirming.v stipulating.v regretting.v proclaiming.v ascertaining.v discerning.v affirming.v certifying.v trusting.v postulating.v ensuring.v implying.v verifying.v boasting.v: & ; % Pv+ link: "John imagines himself lost in the woods." % Pg+ link: "John imagines himself singing from a mountaintop" % AZ+ link: "John imagined Mary as innocent as a lamb" % similar to vc-see : or ({@MV+} & (Ce+ or TH+ or RSe+ or Z-)) or ((B- or O+) & {@MV+} & {Pg+ or AZ+ or Pv+}) or ({@MV+} & Pg+); imagine.v: (( & ()) or ( & ([()] or ())) or (() & )); imagines.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); imagined.v: (( & ()) or ( & (([]) or ())) or (() & )) or or ( & {THi+}) or ({@E-} & A+) or ; imagining.g: ( & ) or ; imagining.v: & ; % Pa**j link: The doctor declared him insane. : or ({@MV+} & (Ce+ or TH+ or RSe+ or Pg+ or Z-)) or ((B- or O+) & ({@MV+} & Pa**j+)); declare.v fear.v conclude.v suspect.v concede.v presume.v foresee.v emphasize.v maintain.v acknowledge.v note.v confirm.v stress.v assume.v: (( & ()) or ( & ([()] or ())) or (() & )); declares.v fears.v concludes.v suspects.v concedes.v presumes.v foresees.v emphasizes.v maintains.v acknowledges.v notes.v confirms.v stresses.v assumes.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); declared.v feared.v concluded.v suspected.v conceded.v presumed.v emphasized.v maintained.v acknowledged.v noted.v confirmed.v-d stressed.v-d assumed.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or ( & {THi+ or ({@MV+} & Pa+) }) or ({@E-} & A+) or ; foresaw.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or ; foreseen.v: (( & ()) or ( & (([]) or ())) or (() & )) or ( & {@MV+ or THi+}) or ({@E-} & A+) or ; declaring.g fearing.g concluding.g suspecting.g conceding.g presuming.g foreseeing.g emphasizing.g maintaining.g acknowledging.g noting.g confirming.g stressing.g assuming.g: ( & ) or ; declaring.v fearing.v concluding.v suspecting.v conceding.v presuming.v foreseeing.v emphasizing.v maintaining.v acknowledging.v noting.v confirming.v stressing.v assuming.v: & ; : {} or ({@MV+} & (Ce+ or TH+ or RSe+)); believe.v answer.v worry.v protest.v: (( & ()) or ( & ([()] or ())) or (() & )); believes.v answers.v worries.v protests.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); believed.v-d answered.v-d worried.v-d protested.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or ( & {THi+ or TOf+}) or ; believing.g answering.g worrying.g protesting.g: ( & ) or ; believing.v answering.v worrying.v protesting.v: & ; % with particle : ({@MV+} & (Ce+ or TH+ or RSe+)) or ((({O+ or B-} & {K+}) or (K+ & {[[@MV+]]} & O*n+) or [[@MV+ & O*n+]]) & {@MV+}); rule.v add.v: (( & ()) or ( & ([()] or ())) or (() & )); rules.v adds.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); ruled.v-d added.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or ( & {({@MV+} & (THi+ or TOf+)) or ({K+} & {@MV+})}) or ({K+} & ) or ({@E-} & A+); ruling.g adding.g: ( & ) or ; ruling.v adding.v: & ; % with particle : ({@MV+} & (TH+ or Zs- or Ce+)) or ((((O+ or B-) & {K+}) or (K+ & {[[@MV+]]} & O*n+)) & {@MV+}) or ([[@MV+ & O*n+]]); figure.v: (( & ()) or ( & ([()] or ())) or (() & )); figures.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); figured.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or ( & {K+} & {@MV+}) or ({K+} & ); figuring.g: ( & ) or ; figuring.v: & ; % (QI+ & {MV+}): "I did not say why until recently" : or ({@MV+} & (Ce+ or TH+ or RSe+ or Zs-)) or ({@MV+} & (QI+ & {MV+})); predict.v realize.v discover.v determine.v announce.v say.v mention.v admit.v recall.v reveal.v state.v observe.v indicate.v analyse.v analyze.v assess.v establish.v evaluate.v examine.v question.v test.v hypothesize.v hypothesise.v document.v envisage.v: (( & ()) or ( & ([()] or ())) or (() & )); predicts.v realizes.v discovers.v determines.v announces.v says.v mentions.v admits.v recalls.v reveals.v states.v observes.v indicates.v analyses.v analyzes.v assesses.v establishes.v evaluates.v examines.v questions.v tests.v hypothesizes.v hypothesises.v envisages.v documents.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); predicted.v realized.v discovered.v determined.v announced.v mentioned.v admitted.v recalled.v revealed.v stated.v observed.v indicated.v analysed.v analyzed.v assessed.v established.v evaluated.v examined.v questioned.v tested.v hypothesized.v-d hypothesised.v-d well-established.v-d documented.v-d envisaged.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or ( & {THi+}) or ({@E-} & A+) or ; said.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or ({@E-} & (Pvf- or [[Mv-]]) & {@MV+} & {THi+}) or [[{@E-} & A+]] or [[]]; predicting.g realizing.g discovering.g determining.g announcing.g saying.g mentioning.g admitting.g recalling.g revealing.g stating.g observing.g indicating.g analysing.g analyzing.g assessing.g establishing.g evaluating.g examining.g questioning.g testing.g hypothesizing.g hypothesising.g documenting.g envisaging.g: ( & ) or ; predicting.v realizing.v discovering.v determining.v announcing.v saying.v mentioning.v admitting.v recalling.v revealing.v stating.v observing.v indicating.v analysing.v analyzing.v assessing.v establishing.v evaluating.v examining.v questioning.v testing.v hypothesizing.v hypothesising.v documenting.v envisaging.v: & ; : {} or ({@MV+} & (TH+ or QI+ or Ce+ or RSe+ or Zs-)); guess.v estimate.v understand.v notice.v explain.v demonstrate.v: (( & ()) or ( & ([()] or ())) or (() & )); guesses.v estimates.v understands.v notices.v explains.v demonstrates.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); guessed.v-d understood.v-d noticed.v-d explained.v-d demonstrated.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or ( & {THi+}) or ; estimated.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or ( & {THi+}) or or ({@E-} & A+); guessing.g estimating.g understanding.g noticing.g explaining.g demonstrating.g: ( & ) or ; guessing.v estimating.v understanding.v noticing.v explaining.v demonstrating.v: & ; % (QI+ & {MV+}): "I did not know why until recently" : {} or ({@MV+} & (((OF+ or QI+)& {@MV+}) or Ce+ or TH+ or RSe+ or Zs-)); know.v: (( & ()) or ( & ([()] or ())) or (() & )); knows.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); knew.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or ; known.v: (( & ()) or ( & (([]) or ())) or (() & )) or ( & {THi+ or TOf+ or QIi+}) or or ({@E-} & A+); knowing.g: ( & ) or ; knowing.v: & ; : or ({@MV+} & (TH+ or Ce+ or RSe+ or Zs- or TS+ or ((SI*j+ or SFI**j+) & I*j+))); request.v: (( & ()) or ( & ([()] or ())) or (() & )); requests.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); requested.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or ( & {THi+ or TSi+}) or ({@E-} & A+) or ; requesting.g: ( & ) or ; requesting.v: & ; : or ({@MV+} & (Pa+ or TH+ or Ce+ or RSe+ or AF- or Vf+ or (LI+ or {@MV+}) or [[Pv+]])); feel.v: (( & ()) or ( & ([()] or ())) or (() & )); feels.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); felt.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or ( & {THi+}) or ; feeling.g: ( & ) or ; feeling.v: & ; : {} or ({@MV+} & (QI+ or TH+ or Pg+)); mind.v: (( & ()) or ( & ([()] or ())) or (() & )); minds.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); minded.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or or ; minding.g: ( & ) or ; minding.v: & ; : {} or ({@MV+} & QI+); study.v: (( & ()) or ( & ([()] or ())) or (() & )); studies.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); studied.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or or ({@E-} & A+) or ; studying.g: ( & ) or ; studying.v: & ; % QI+ link: "I will discuss which vitamins I take" : or ({@MV+} & (Pg+ or QI+)); discuss.v: (( & ()) or ( & ([()] or ())) or (() & )); discusses.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); discussed.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or or ({@E-} & A+) or ; discussing.g: ( & ) or ; discussing.v: & ; : or ({@MV+} & Pg+); oppose.v enjoy.v advocate.v contemplate.v entail.v necessitate.v justify.v risk.v avoid.v involve.v favor.v: (( & ()) or ( & ([()] or ())) or (() & )); opposes.v enjoys.v advocates.v contemplates.v entails.v necessitates.v justifies.v risks.v avoids.v involves.v favors.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); opposed.v-d enjoyed.v-d advocated.v-d contemplated.v-d entailed.v-d necessitated.v-d justified.v-d risked.v-d avoided.v-d involved.v-d favored.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or or ({@E-} & A+) or ; opposing.g enjoying.g advocating.g contemplating.g entailing.g necessitating.g justifying.g risking.g avoiding.g favoring.g involving.g: ( & ) or ; opposing.v enjoying.v advocating.v contemplating.v entailing.v necessitating.v justifying.v risking.v avoiding.v involving.v favoring.v: & ; : {} or ({@MV+} & Pg+); finish.v practice.v resist.v: (( & ()) or ( & ([()] or ())) or (() & )); finishes.v practices.v resists.v quits.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); % : "I want it finished" finished.v-d practiced.v-d resisted.v-d quitted.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or or ({@E-} & A+) or ; quit.v-d: (( & ()) or ( & ([()] or ())) or (() & )) or (( & ()) or ( & (([]) or ())) or (() & )) or or or ({@E-} & A+) or ; finishing.g practicing.g resisting.g quitting.g: ( & ) or ; finishing.v practicing.v resisting.v quitting.v: & ; % Pv-: "I want it over with" over_with: ; % with particle % and also Pa**j for "The witch turned him green" : ((O+ or (K+ & {[[@MV+]]} & O*n+) or ({O+ or B-} & {K+}) or ((O+ or B-) & Pa**j+) or [[@MV+ & O*n+]]) & {@MV+}) or ({@MV+} & (Pa+ or AF-)); turn.v: (( & ()) or ( & ([()] or ())) or (() & )); turns.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); turned.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or ( & {K+} & {@MV+}) or ({K+} & ); turning.v: & ; turning.g: ( & ) or ; % plus TI : ((O+ or B- or TI+ or [[@MV+ & (O*n+ or TI+)]] or [[Pv+]]) & {@MV+}) or ({@MV+} & (AF- or Pa+)); become.v: (( & ()) or ( & ([()] or ())) or (() & )) or or ( & ) or ; becomes.v: & ; became.v-d: & ; becoming.g: ( & ) or ; becoming.v: & ; % plus TI : ({@MV+} & (AF- or Pa+)) or ({O+ or B- or TI+ or [[@MV+ & (O*n+ or TI+)]] or [[Pv+]]} & {@MV+}); remain.v: (( & ()) or ( & ([()] or ())) or (() & )); remains.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); remained.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or ; remaining.g: ( & ) or or ({@E-} & A+); remaining.v: & ; % plus particle : ({@MV+} & (AF- or Pa+)) or ((({O+ or B-} & {K+}) or (K+ & {[[@MV+]]} & O*n+) or [[@MV+ & O*n+]]) & {@MV+}); grow.v: (( & ()) or ( & ([()] or ())) or (() & )); grows.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); grew.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or ; grown.v: (( & ()) or ( & (([]) or ())) or (() & )) or ( & {K+} & {@MV+}) or ({@E-} & A+) or ({K+} & ); growing.g: ( & ) or ({@E-} & A+) or ; growing.v: & ; % plus OF : {O+ or B- or [[@MV+ & O*n+]] or ({@MV+} & OF+)} & {@MV+}; approve.v: (( & ()) or ( & ([()] or ())) or (() & )); approves.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); approved.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or or ({@E-} & A+) or ; approving.g: ( & ) or ; approving.v: & ; % plus OF : (O+ or B- or [[@MV+ & O*n+]] or ({@MV+} & OF+)) & {@MV+}; dispose.v conceive.v: (( & ()) or ( & ([()] or ())) or (() & )); disposes.v conceives.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); disposed.v-d conceived.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or or ({@E-} & A+) or ; disposing.g conceiving.g: ( & ) or ; disposing.v conceiving.v: & ; % plus particle : ((K+ & {[[@MV+]]} & O*n+) or ({O+ or B-} & {K+}) or [[@MV+ & O*n+]] or OF+) & {@MV+}; speak.v: (( & ()) or ( & ([()] or ())) or (() & )); speaks.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); spoke.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or ; spoken.v: (( & ()) or ( & (([]) or ())) or (() & )) or ( & {K+} & {@MV+}) or ({K+} & ) or ({@E-} & A+); speaking.v: & ; speaking.g: ( & ) or or ({@E-} & A+); : or ({@MV+} & ((LI+ & {@MV+}) or AF- or Pa+ or OF+)); taste.v: (( & ()) or ( & ([()] or ())) or (() & )); tastes.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); tasted.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or or ; tasting.g: ( & ) or ; tasting.v: & ; : {} or ({@MV+} & ((LI+ & {@MV+}) or AF- or Pa+ or OF+)); reek.v smell.v: (( & ()) or ( & ([()] or ())) or (() & )); reeks.v smells.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); reeked.v-d smelled.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or or ; reeking.g smelling.g: ( & ) or ; reeking.v smelling.v: & ; % plus partcle and Vt : (((K+ & {[[@MV+]]} & O*n+) or ((O+ or B-) & {K+ or Vt+}) or [[@MV+ & O*n+]]) & {@MV+}) or ({O+} & (OT+ or BT-) & {@MV+} & {(TOt+ & B+) or TOi+}) or (OXii+ & Vtg+ & {@MV+} & TH+) or @MV+; take.v: (( & ()) or ( & ([()] or ())) or (() & )) or ; takes.v: & ; took.v-d: & ; taken.v: ( & ) or ( & {K+} & {@MV+}) or ({@E-} & A+) or ({K+} & ) or (Pvf- & Vtg+ & THi+); taking.v: & ; taking.g: ( & ) or ; for_granted: Vtg-; % VERBS TAKING [OBJ] + [OTHER COMPLEMENT] % basically, all these are plus mess : ((K+ & {[[@MV+]]} & O*n+) or ((O+ or B-) & (K+ or Pp+ or WR-)) or (Vp+ & (Zs- or MVa+))) & {@MV+}; put.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or ( & ) or ( & (K+ or Pp+ or WR-) & {@MV+}) or ((K+ or Pp+) & ); puts.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); putting.v: & ; putting.g: ( & ) or ; % K+ & O*n+: "He costed out the plan" : (( or (K+ & O*n+) or (B- & {O+})) & {@MV+} & {TOi+}) or ([[@MV+ & O*n+]]); cost.v-d: (( & ()) or ( & ([()] or ())) or (() & )) or or ( & ); costed.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or ( & (({K+} & {@MV+}) or Pa+ or Pg+)) or ({K+ or Pa+ or Pg+} & ); costs.v: & ; costing.v: & ; costing.g: ( & ) or ; % ditransitive : ( & {@MV+}) or (K+ & {[[@MV+]]} & O*n+) or (B- & O+) or ((O+ or B-) & (({@MV+} & (Pa+ or AF- or Pg+)) or ({K+} & {@MV+}))) or ([[@MV+ & O*n+]]) or ({@MV+} & (TH+ or Ce+ or RSe+)); find.v: (( & ()) or ( & ([()] or ())) or (() & )); finds.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); found.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or ( & (({K+ or AF-} & {@MV+}) or Pa+ or Pg+)) or ({K+ or Pa+ or Pg+} & ); finding.v: & ; finding.g: ( & ) or ; % ditranstive : ((O+ or B-) & (({K+} & {@MV+}) or ({@MV+} & (Pa+ or AF- or Pv+)))) or (( or (K+ & {[[@MV+]]} & O*n+) or K+ or (B- & O+) ) & {@MV+}) or ({@MV+} & (Pa+ or AF- or Pv+ or Pp+ or TO+)); get.v: (( & ()) or ( & ([()] or ())) or (() & )); gets.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); got.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or ; gotten.v: (( & ()) or ( & (([]) or ())) or (() & )) or ( & {K+ or Pp+} & {@MV+}) or ({K+ or Pp+} & ); getting.v: & ; getting.g: ( & ) or ; : ((O+ or B-) & (({K+} & {@MV+}) or ({@MV+} & {Pa+ or AF- or Pv+ or Pg+}))) or ({(K+ & {[[@MV+]]} & O*n+) or ([[@MV+ & O*n+]])} & {@MV+}); leave.v: (( & ()) or ( & ([()] or ())) or (() & )); leaves.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); left.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or ( & (({K+ or AF-} & {@MV+}) or Pv+ or Pa+ or Pg+)) or ({K+ or ({@MV+} & (Pv+ or Pa+ or Pg+))} & ); leaving.v: & ; leaving.g: ( & ) or ; : ((O+ or (K+ & {[[@MV+]]} & O*n+) or [[@MV+ & O*n+]] or Vk+) & {@MV+}) or ({O+ or B-} & ((K+ & {@MV+}) or ({@MV+} & (Pa+ or AF- or Pg+ or Pv+)))); keep.v: (( & ()) or ( & ([()] or ())) or (() & )); keeps.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); kept.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or ( & (({K+ or AF-} & {@MV+}) or Pa+ or Pg+ or Pv+)) or ({K+ or ({@MV+} & (Pa+ or Pg+ or Pv+))} & ); keeping.v: & ; keeping.g: ( & ) or ; watch.i vigil.i pace.i: Vk-; track.i: Vk- & {OF+}; : ((K+ & {[[@MV+]]} & O*n+) or ({O+ or B-} & {K+ or Vs+}) or [[@MV+ & O*n+]]) & {@MV+}; set.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or ( & ) or ( & {K+ or Vs+} & {@MV+}) or ({@E-} & A+) or ({K+ or Vs+} & ); sets.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); setting.v: & ; setting.g: ( & ) or or ({@E-} & A+); free.i straight.i loose.i: Vs- & {MV+}; : ((K+ & {[[@MV+]]} & O*n+) or ({O+ or B-} & {K+ or Vh+}) or [[@MV+ & O*n+]]) & {@MV+}; hold.v: (( & ()) or ( & ([()] or ())) or (() & )); holds.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); held.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or ( & {K+ or Vh+} & {@MV+}) or ({@E-} & A+) or ({K+ or Vh+} & ); holding.v: & ; holding.g: ( & ) or ; hostage.i captive.i: Vh- or Vth-; : ({@MV+} & (Ce+ or TH+ or RSe+ or Z- or TO+)) or ((O+ or OX+ or B-) & {@MV+} & {TOo+}) or ([[@MV+ & O*n+]]); expect.v claim.v: (( & ()) or ( & ([()] or ())) or (() & )); expects.v claims.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); expected.v-d claimed.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or ( & {TOf+ or THi+ or Z-}) or ({@E-} & A+) or ({@MV+} & {TO+} & ); expecting.g claiming.g: ( & ) or ; expecting.v claiming.v: & ; : ({@MV+} & (TH+ or Z- or TO+)) or ((O+ or OX+ or B-) & {@MV+} & TOo+); intend.v: (( & ()) or ( & ([()] or ())) or (() & )); intends.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); intended.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or ( & {TO+ or Z- or @MV+}) or ({@E-} & A+) or ({@MV+} & {TO+} & ); intending.g: ( & ) or ; intending.v: & ; : (N+ & I+) or ({@MV+} & TO+) or ((O+ or B-) & {@MV+} & TOo+); dare.v: (( & ()) or ( & ([()] or ())) or (() & )); dares.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); dared.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or ( & TO+) or ({@MV+} & TO+ & ); daring.g: ( & ) or ; daring.v: & ; : ({@MV+} & (TO+ or Pg+)) or ((O+ or B- or OX+) & {@MV+} & {TOo+}) or ([[@MV+ & O*n+]]); like.v: (( & ()) or ( & ([()] or ())) or (() & )); likes.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); liked.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or or ; liking.g: ( & ) or ; liking.v: & ; % ditranstive : (( or (B- & {O+})) & {@MV+}) or ({@MV+} & TO+) or ([[@MV+ & O*n+]]); offer.v: (( & ()) or ( & ([()] or ())) or (() & )); offers.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); offered.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or ( & {O+ or B- or [[@MV+ & O*n+]]} & {@MV+}) or ({O+ or [[@MV+ & O*n+]]} or ); offering.g: ( & ) or ; offering.v: & ; % ditransitive % unlike vc-offer, "to" is optional. : (( or (B- & {O+})) & {@MV+}) or ({@MV+} & {TO+}) or ([[@MV+ & O*n+]]); refuse.v: (( & ()) or ( & ([()] or ())) or (() & )); refuses.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); refused.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or ( & {O+ or B- or [[@MV+ & O*n+]]} & {@MV+}) or ({O+ or [[@MV+ & O*n+]]} & ); refusing.g: ( & ) or ; refusing.v: & ; % Pa**j+: predicative adjective -- "I want it green", "I want it very shiny." : ({@MV+} & TO+) or ((O+ or OX+ or B-) & {@MV+} & {TOo+ or Pv+ or Pa**j+}) or ([[@MV+ & O*n+]]) or [[CX- & {@MV+}]]; want.v need.v: (( & ()) or ( & ([()] or ())) or (() & )); need.i: {@E-} & (S- or (RS- & B-)) & (N+ & I+); wants.v needs.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); wanted.v-d needed.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or or ({@E-} & A+) or ; wanting.g needing.g: ( & ) or ; wanting.v needing.v: & ; : ({@MV+} & {TO+}) or ((O+ or B-) & {@MV+} & {TOo+}) or ([[@MV+ & O*n+]]); choose.v: (( & ()) or ( & ([()] or ())) or (() & )); chooses.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); chose.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or ; chosen.v: (( & ()) or ( & (([]) or ())) or (() & )) or ( & {TO+}) or ({@E-} & A+) or ({@MV+} & {TO+} & ); choosing.g: ( & ) or ; choosing.v: & ; % is identical to : ({@MV+} & {TO+}) or ((O+ or B-) & {@MV+} & {TOo+}) or ([[@MV+ & O*n+]]); prepare.v press.v: (( & ()) or ( & ([()] or ())) or (() & )); prepares.v presses.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); prepared.v-d pressed.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or or ({@E-} & A+) or ; preparing.g pressing.g: ( & ) or ; preparing.v pressing.v: & ; : ((O+ or B-) & {@MV+} & {TOo+}) or ({@MV+} & (TH+ or Ce+ or TS+ or (SI*j+ & I*j+))) or Zs- or ([[@MV+ & O*n+]]); require.v: (( & ()) or ( & ([()] or ())) or (() & )); requires.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); required.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or ( & {TO+ or TSi+}) or ({@E-} & A+) or ({@MV+} & {TO+} & ); requiring.g: ( & ) or ; requiring.v: & ; : ({@MV+} & (TH+ or Zs- or TS+ or Ce+)) or ((O+ or B-) & {@MV+} & {TOo+}) or ([[@MV+ & {O*n+}]]); command.v order.v urge.v: (( & ()) or ( & ([()] or ())) or (() & )); commands.v orders.v urges.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); : (( & ()) or ( & (([]) or ())) or (() & )) or or ( & {TO+ or TH+ or TS+}) or ({@MV+} & {TH+ or TO+ or TS+} & ); commanded.v-d urged.v-d: ; % An "ordered list" ordered.v: or ({@E-} & A+); commanding.g ordering.g urging.g: ( & ) or ; commanding.v ordering.v urging.v: & ; % ditransitive : ({@MV+} & (TH+ or Pg+)) or ((O+ or OX+ or B-) & {@MV+} & {TOo+ or Pa+}) or (((O+ & (B- or ({[[@MV+]]} & O*n+))) or ([[@MV+ & O*n+]])) & {@MV+}); consider.v: (( & ()) or ( & ([()] or ())) or (() & )); considers.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); considered.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or ( & (({@MV+} & (TOf+ or Pa+)) or ({O+ or B- or [[@MV+ & O*n+]]} & {@MV+}))) or ((({@MV+} & (TOf+ or Pa+)) or ({O+ or [[@MV+ & O*n+]]})) & ); considering.g: ( & ) or ; considering.v: & ; : ({@MV+} & (TH+ or Ce+)) or ((O+ or OX+ or B-) & {@MV+} & {TOo+}) or ([[@MV+ & O*n+]]); perceive.v: (( & ()) or ( & ([()] or ())) or (() & )); perceives.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); perceived.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or ( & {TO+}) or ({@E-} & A+) or ({@MV+} & {TO+} & ); perceiving.g: ( & ) or ; perceiving.v: & ; : ({@MV+} & {TH+ or Z- or Ce+}) or ((O+ or B-) & {@MV+} & {TOo+}) or ([[@MV+ & O*n+]]); report.v: (( & ()) or ( & ([()] or ())) or (() & )); reports.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); reported.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or ( & {TOf+ or Z-}) or ({@E-} & A+) or ({@MV+} & {TO+} & ); reporting.g: ( & ) or ; reporting.v: & ; : ((O+ or B-) & {@MV+} & {TH+ or Ce+ or TOo+}) or ({@MV+} & {TH+ or Zs-}) or ([[@MV+ & O*n+]]); caution.v: (( & ()) or ( & ([()] or ())) or (() & )); cautions.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); cautioned.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or ( & ((O+ or B-) & {@MV+} & {TH+ or Ce+ or Zs- or TO+})) or ({@MV+} & {TH+ or Ce+ or TO+} & ); cautioning.g: ( & ) or ; cautioning.v: & ; : ((O+ or B-) & {@MV+} & {TH+ or Ce+ or TOo+ or (OF+ & {@MV+})}) or ({@MV+} & {TH+ or Zs- or (OF+ & {@MV+})}) or ([[@MV+ & O*n+]]); warn.v advise.v: (( & ()) or ( & ([()] or ())) or (() & )); warns.v advises.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); warned.v-d advised.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or ( & {TH+ or Ce+ or Zs- or TO+ or (OF+ & {@MV+})}) or ({@MV+} & {TH+ or Ce+ or TO+ or OF+} & ); warning.g advising.g: ( & ) or ; warning.v advising.v: & ; : ((B- or O+) & {@MV+} & {I*j+ or Pg+}) or ({@MV+} & {TH+ or Zs- or Ce+ or (OF+ & {@MV+})}) or ([[@MV+ & O*n+]]); hear.v: (( & ()) or ( & ([()] or ())) or (() & )); hears.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); heard.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or ( & {Pg+}) or ({@MV+} & {Pg+} & ); hearing.g: ( & ) or ; hearing.v: & ; : ((B- or O+) & {@MV+} & {I*j+ or Pg+ or AZ+ or Pv+}) or ({@MV+} & {TH+ or Zs- or QI+ or Ce+}) or ([[@MV+ & O*n+]]); see.v: (( & ()) or ( & ([()] or ())) or (() & )); sees.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); saw.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or ; seen.v: (( & ()) or ( & (([]) or ())) or (() & )) or ( & {Pg+ or AZ+}) or ({@MV+} & {Pg+ or AZ+} & ); seeing.g: ( & ) or ; seeing.v: & ; % ditranstive verbs -- taking direct and indirect objects : ( or (B- & {O+}) or ([[@MV+ & O*n+]])) & {@MV+}; owe.v deliver.v accord.v award.v term.v grant.v begrudge.v assign.v rename.v repay.v dub.v entitle.v fine.v: (( & ()) or ( & ([()] or ())) or (() & )); owes.v delivers.v accords.v awards.v terms.v grants.v begrudges.v assigns.v renames.v repays.v dubs.v entitles.v fines.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); owed.v delivered.v accorded.v awarded.v granted.v-d begrudged.v-d assigned.v-d repaid.v-d fined.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or ( & {O+ or B- or [[@MV+ & O*n+]]} & {@MV+}) or ({O+ or [[@MV+ & O*n+]]} & ); owing.v delivering.v according.v awarding.v terming.v granting.v begrudging.v assigning.v renaming.v repaying.v dubbing.v entitling.v fining.v: & ; owing.g delivering.g according.g awarding.g terming.g granting.g begrudging.g assigning.g renaming.g repaying.g dubbing.g entitling.g fining.g: ( & ) or ; % extended linking requirements based on the above termed.v-d dubbed.v-d entitled.v-d renamed.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or ( & {O+ or B- or [[@MV+ & O*n+]]} & {@MV+}) or ({O+ or [[@MV+ & O*n+]]} & ) or ({@E-} & A+); % ditransitive % 'Give' requires both direct *and* indirect object: X gave Y a Z. % 'sent', 'poured': optional indirect object. : ((B- & {O+ or K+}) or or (O+ & K+) or (K+ & ({[[@MV+]]} & O*n+)) or ([[@MV+ & O*n+]])) & {@MV+}; give.v send.v buy.v bring.v lend.v issue.v hand.v pour.v telegraph.v wire.v: (( & ()) or ( & ([()] or ())) or (() & )); gives.v sends.v buys.v brings.v lends.v issues.v hands.v pours.v telegraphs.v wires.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); sent.v-d bought.v-d brought.v-d lent.v-d handed.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or ( & {O+ or B- or K+ or [[@MV+ & O*n+]]} & {@MV+}) or ({O+ or K+ or [[@MV+ & O*n+]]} & ); issued.v-d poured.v-d telegraphed.v-d wired.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or ({@E-} & A+) or ( & {O+ or B- or K+ or [[@MV+ & O*n+]]} & {@MV+}) or ({O+ or K+ or [[@MV+ & O*n+]]} & ); gave.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or ; given.v: (( & ()) or ( & (([]) or ())) or (() & )) or ({@E-} & A+) or ( & {O+ or B- or K+ or [[@MV+ & O*n+]]} & {@MV+}) or ({O+ or K+ or [[@MV+ & O*n+]]} & ); giving.g sending.g buying.g bringing.g lending.g issuing.g handing.g pouring.g telegraphing.g wiring.g: ( & ) or ; giving.v sending.v buying.v bringing.v lending.v issuing.v handing.v pouring.v telegraphing.v wiring.v: & ; % ditransitive : {(B- & {O+ or K+}) or or (O+ & K+) or (K+ & {{[[@MV+]]} & O*n+}) or ([[@MV+ & O*n+]])} & {@MV+}; pass.v pay.v sell.v deal.v: (( & ()) or ( & ([()] or ())) or (() & )); passes.v pays.v sells.v deals.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); passed.v-d paid.v-d payed.v-d sold.v-d dealt.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or ( & {O+ or B- or K+ or [[@MV+ & O*n+]]} & {@MV+}) or ({O+ or K+ or [[@MV+ & O*n+]]} & ); passing.g paying.g selling.g dealing.g: ( & ) or ; passing.v paying.v selling.v dealing.v: & ; % ditransitive : {(B- & {O+ or Pa+ or K+}) or or (O+ & (Pa+ or K+)) or (K+ & {{[[@MV+]]} & O*n+}) or ([[@MV+ & O*n+]])} & {@MV+}; call.v shout.v: (( & ()) or ( & ([()] or ())) or (() & )); calls.v shouts.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); called.v-d shouted.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or ( & {O+ or B- or K+ or Pa+ or [[@MV+ & O*n+]]} & {@MV+}) or ({O+ or K+ or Pa+ or [[@MV+ & O*n+]]} & ); calling.g shouting.g: ( & ) or ; calling.v shouting.v: & ; % Minimal ditransitive extenstion of words.v.6 % ditransitive: "Please paint it lime green" : or ; color.v colour.v paint.v: (( & ()) or ( & ([()] or ())) or (() & )); colors.v colours.v paints.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); colored.v-d coloured.v-d painted.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or ( & {O+ or K+} & {@MV+}) or ({K+} & ) or ({@E-} & A+); coloring.v colouring.v painting.v: ( & ) or or ; coloring.g colouring.g painting.g: ( & ) or ; % ditransitive % Writing -- direct and indirect object are optional: % 'he wrote' 'he wrote a letter' 'he wrote me a letter' 'he wrote me' % 'he wrote me that S' but '*he drew me that S' : ({(B- & {O+ or K+}) or or (O+ & K+) or (K+ & {{[[@MV+]]} & O*n+}) or ([[@MV+ & O*n+]])} & {@MV+}) or ({@MV+} & (TH+ or Ce+)); write.v charge.v draw.v: (( & ()) or ( & ([()] or ())) or (() & )); writes.v reads.v charges.v draws.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); wrote.v-d drew.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or ; read.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or ( & ) or ( & {O+ or B- or K+ or [[@MV+ & O*n+]]} & {@MV+}) or ({O+ or K+ or [[@MV+ & O*n+]]} & ); charged.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or ( & {O+ or B- or K+ or [[@MV+ & O*n+]]} & {@MV+}) or ({O+ or K+ or [[@MV+ & O*n+]]} & ); written.v drawn.v: (( & ()) or ( & (([]) or ())) or (() & )) or ( & {O+ or B- or K+ or [[@MV+ & O*n+]]} & {@MV+}) or ({O+ or K+ or [[@MV+ & O*n+]]} & ) or ({@E-} & A+); writing.g reading.g charging.g drawing.g: ( & ) or ; writing.v reading.v charging.v drawing.v: & ; % ditransitive % Singing: if there's an indirect object, then a direct object is % mandatory: '*she sang me' % but then: 'she sang soprano' : ({(B- & {O+ or K+}) or or (O+ & K+) or (K+ & {{[[@MV+]]} & O*n+}) or ([[@MV+ & O*n+]])} & {@MV+}); sing.v dance.v cry.v: (( & ()) or ( & ([()] or ())) or (() & )); sings.v dances.v cries.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); sang.v-d danced.v-d cried.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or ; sung.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or ; singing.g dancing.g crying.g: ( & ) or ; singing.v dancing.v crying.v: & ; % : ; % shout.v: VERB_PLI(); % shouts.v: VERB_S_T(); % shouted.v: VERB_SP_T(); % shouting.g: ( & ) or ; % shouting.v: & ; % ditransitive : (( or ([[@MV+]] & O*n+)) & {@MV+}) or ((O+ or B-) & {@MV+} & {B- or TOo+}); allow.v: (( & ()) or ( & ([()] or ())) or (() & )); allows.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); allowed.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or ( & (({O+ or B- or [[@MV+ & O*n+]]} & {@MV+}) or ({@MV+} & TO+))) or ({O+ or [[@MV+ & O*n+]] or ({@MV+} & TO+)} & ); allowing.g: ( & ) or ; allowing.v: & ; % ditransitive : ({O+ or B-} & {@MV+} & {B- or TO+ or Ce+ or TH+ or RSe+ or Zs-}) or (( or ([[@MV+ & O*n+]])) & {@MV+}); promise.v: (( & ()) or ( & ([()] or ())) or (() & )); promises.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); promised.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or ( & (({O+ or B- or [[@MV+ & O*n+]]} & {@MV+}) or ({@MV+} & (TO+ or Ce+ or TH+ or RSe+ or Zs-)))) or ({@E-} & A+) or ({O+ or [[@MV+ & O*n+]] or ({{@MV+} & (TO+ or Ce+ or TH+)})} & ); promising.g: ( & ) or ; promising.v: & ; % ditransitive : ({O+ or B-} & ({@MV+} & (QI+ or Ce+ or TH+ or RSe+ or Zs- or B-))) or (( or (O+ & K+) or (K+ & (B- or ({[[@MV+]]} & O*n+))) or ([[@MV+ & O*n+]]) or [[()]]) & {@MV+}); show.v: (( & ()) or ( & ([()] or ())) or (() & )); shows.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); showed.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or ; shown.v: (( & ()) or ( & (([]) or ())) or (() & )) or ( & (({O+ or K+ or B- or [[@MV+ & O*n+]]} & {@MV+}) or ({@MV+} & (QI+ or Ce+ or TH+ or RSe+ or Zs-)))) or ({O+ or K+ or [[@MV+ & O*n+]] or ({@MV+} & (QI+ or Ce+ or TH+))} & ); showing.g: ( & ) or ; showing.v: & ; % ditransitive : ((O+ or B-) & ({@MV+} & (QI+ or Ce+ or TH+ or RSe+ or Zs- or B- or TOo+))) or ({ or (B- & {[[@MV+]]} & O*n+) or ([[@MV+ & O*n+]])} & {@MV+}); teach.v: (( & ()) or ( & ([()] or ())) or (() & )); teaches.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); taught.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or ( & (({O+ or B- or [[@MV+ & O*n+]]} & {@MV+}) or ({@MV+} & (QI+ or Ce+ or TH+ or RSe+ or Zs- or TO+)))) or ({O+ or [[@MV+ & O*n+]] or ({@MV+} & (QI+ or Ce+ or TH+))} & ); teaching.g: ( & ) or ; teaching.v: & ; : ((O+ or B-) & {@MV+} & TOo+); compel.v: (( & ()) or ( & ([()] or ())) or (() & )); compels.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); compelled.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or ( & TO+) or ({@MV+} & TO+ & ); compelling.v: & ; compelling.g: ( & ) or ; : (((O+ or B-) & (({@MV+} & TOo+) or K+ or [()])) or (K+ & O*n+) or ([[{K+} & @MV+ & O*n+]])) & {@MV+}; force.v: (( & ()) or ( & ([()] or ())) or (() & )); forces.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); forced.v-d willed.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or ( & ((K+ & {@MV+}) or ({@MV+} & TO+))) or ((K+ or ({@MV+} & TO+)) & ) or ({@E-} & A+); forcing.g: ( & ) or ; forcing.v: & ; % ----------------------------------------- : ((O+ or B-) & {@MV+} & {TOo+}) or ([[@MV+ & O*n+ & {@MV+}]]); design.v permit.v authorize.v use.v cause.v enable.v pressure.v train.v sentence.v prompt.v spur.v disincline.v invite.v reelect.v encourage.v draft.v hire.v entice.v inspire.v aid.v forbid.v employ.v educate.v tempt.v condemn.v commission.v counsel.v induce.v instruct.v license.v incite.v nominate.v destine.v provoke.v challenge.v exhort.v implore.v motivate.v impel.v: (( & ()) or ( & ([()] or ())) or (() & )); designs.v permits.v pressures.v trains.v sentences.v causes.v enables.v authorizes.v uses.v prompts.v spurs.v disinclines.v invites.v reelects.v encourages.v drafts.v hires.v entices.v inspires.v aids.v forbids.v employs.v educates.v tempts.v condemns.v commissions.v counsels.v induces.v instructs.v licenses.v incites.v nominates.v destines.v provokes.v challenges.v exhorts.v implores.v motivates.v impels.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); designed.v-d permitted.v-d pressured.v-d trained.v-d sentenced.v-d caused.v-d enabled.v-d authorized.v-d prompted.v-d spurred.v-d invited.v-d disinclined.v-d reelected.v-d encouraged.v-d drafted.v-d hired.v-d enticed.v-d inspired.v-d aided.v-d employed.v-d educated.v-d tempted.v-d condemned.v-d commissioned.v-d counseled.v-d induced.v-d instructed.v-d licensed.v-d incited.v-d nominated.v-d destined.v-d provoked.v-d challenged.v-d exhorted.v-d implored.v-d motivated.v-d impelled.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or ( & {TO+}) or ({@E-} & A+) or ({{@MV+} & TO+} & ); forbade.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or ; forbidden.v: (( & ()) or ( & (([]) or ())) or (() & )) or ( & {TO+}) or ({@E-} & A+) or ({{@MV+} & TO+} & ); designing.g permitting.g pressuring.g causing.g enabling.g training.g sentencing.g authorizing.g prompting.g spurring.g inviting.g disinclining.g reelecting.g encouraging.g drafting.g hiring.g enticing.g inspiring.g aiding.g employing.g educating.g tempting.g condemning.g commissioning.g counseling.g inducing.g instructing.g licensing.g inciting.g nominating.g destining.g provoking.g challenging.g exhorting.g imploring.g motivating.g impelling.g: ( & ) or ; designing.v permitting.v pressuring.v causing.v enabling.v training.v sentencing.v authorizing.v using.v prompting.v disinclining.v spurring.v inviting.v reelecting.v encouraging.v drafting.v hiring.v enticing.v inspiring.v aiding.v employing.v educating.v tempting.v condemning.v commissioning.v counseling.v inducing.v instructing.v licensing.v inciting.v nominating.v destining.v provoking.v challenging.v exhorting.v imploring.v motivating.v impelling.v: & ; used.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or ( & {TOo+}) or ( & TO+) or ({@MV+} & {TOo+} & ) or ({@E-} & A+); using.g: ( & ( or MVs-)) or ; % -------------------------------------------------- : ((O+ or B-) & (({@MV+} & {TOo+}) or ({[[@MV+]]} & (O*n+ or TI+)))) or ([[@MV+ & O*n+ & {@MV+}]]); elect.v appoint.v: (( & ()) or ( & ([()] or ())) or (() & )); elects.v appoints.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); elected.v-d appointed.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or ( & (({B- or (O+ or TI+ or [[@MV+ & (O*n+ or TI+)]])} & {@MV+}) or ({@MV+} & TO+))) or (({O+ or TI+ or [[@MV+ & (O*n+ or TI+)]]} or ({@MV+} & TO+)) & ) or ({@E-} & A+); electing.g appointing.g: ( & ) or ; electing.v appointing.v: & ; % vc-name is a ditransitive extension of vc-trans (with an extra TI+) : ( or (O+ & {[[@MV+]]} & TI+) or (B- & {O+ or TI+}) or ([[@MV+ & O*n+]])) & {@MV+}; name.v designate.v label.v: (( & ()) or ( & ([()] or ())) or (() & )); names.v designates.v labels.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); named.v-d designated.v-d labelled.v-d labeled.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or ( & ({B- or (O+ or TI+ or [[@MV+ & (O*n+ or TI+)]])}) & {@MV+}) or ({O+ or TI+ or [[@MV+ & (O*n+ or TI+)]]} & ) or ({@E-} & A+); naming.g designating.g labelling.g labeling.g: ( & ) or ; naming.v designating.v labelling.v labeling.v: & ; % optionally ditransitive, modeled on "name.v" : or ; tag.v: (( & ()) or ( & ([()] or ())) or (() & )); tags.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); tagged.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or (( & ({B- or (O+ or TI+ or [[@MV+ & (O*n+ or TI+)]])}) & {@MV+}) or ) or ({O+ or TI+ or [[@MV+ & (O*n+ or TI+)]]} & ) or ({@E-} & A+); tagging.g: ( & ) or ({@E-} & A+) or ; tagging.v: & ; : {((O+ or B-) & {@MV+} & {TOo+}) or @MV+ or ([[@MV+ & O*n+ & {@MV+}]])}; program.v oblige.v: (( & ()) or ( & ([()] or ())) or (() & )); programs.v obliges.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); programed.v-d programmed.v-d obliged.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or ( & {TO+}) or ({@E-} & A+) or ({{@MV+} & TO+} & ); programing.g programming.g obliging.g: ( & ) or ; programing.v programming.v obliging.v: & ; : ((O+ or B-) & {@MV+} & {TOo+ or TH+ or Ce+}) or ([[@MV+ & O*n+ & {@MV+}]]); convince.v persuade.v: (( & ()) or ( & ([()] or ())) or (() & )); convinces.v persuades.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); convinced.v-d persuaded.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or ( & {TO+ or TH+ or Ce+}) or ({{@MV+} & (TO+ or TH+ or Ce+)} & ); convincing.g persuading.g: ( & ) or ; convincing.v persuading.v: & ; % K+ is for "tell him off" % bare MVp+ for "Today, we will tell about ..." % OF+ for "They have told of the soldiers' fear" % (QI+ & {MV+}): "I did not tell why until recently" : (((O+ & {O*n+ or K+}) or B-) & {@MV+} & {TH+ or Ce+ or RSe+ or Zs- or TOo+ or QI+ or BW-}) or OF+ or (QI+ & {MV+}) or ([[@MV+ & {O*n+} & {@MV+}]]); tell.v: (( & ()) or ( & ([()] or ())) or (() & )); tell.w: {@E-} & I- & {@MV+} & (QI+ or TH+ or Ce+ or RSe+ or Zs-); tells.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); told.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or ( & {TH+ or Ce+ or RSe+ or Zs- or TO+ or QI+ or BW-}) or ( & O+ & {@MV+}) or ({{@MV+} & (Ce+ or TO+ or QI+ or TH+)} & ); telling.g: ( & ) or ; telling.v: & ; % (QI+ & {MV+}): "I did not ask why until recently" : ({(O+ & {O*n+}) or B-} & {@MV+} & {TS+ or TOo+ or (QI+ & {MV+}) or BW-}) or ([[@MV+ & O*n+ & {@MV+}]]); ask.v: (( & ()) or ( & ([()] or ())) or (() & )); asks.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); asked.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or ( & {TO+ or QI+ or BW- or TH+ or TS+}) or ( & O+ & {@MV+}) or ({{@MV+} & (TO+ or QI+ or TH+ or TS+)} & ); asking.g: ( & ) or ; asking.v: & ; : ({O+ or B-} & {@MV+} & {TO+ or I+}) or ([[@MV+ & O*n+ & {@MV+}]]); help.v: (( & ()) or ( & ([()] or ())) or (() & )); helps.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); helped.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or ( & {TO+}) or ({{@MV+} & TO+} & ); helping.g: ( & ) or ; helping.v: & ; : ((O+ or B-) & {@MV+} & (TOo+ or TH+ or Ce+ or (OF+ & {@MV+}))) or ([[@MV+ & O*n+ & {@MV+}]]); remind.v: (( & ()) or ( & ([()] or ())) or (() & )); reminds.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); reminded.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or ( & {TO+ or TH+ or Ce+ or (OF+ & {@MV+})}) or ({{@MV+} & (Ce+ or TO+ or TH+ or (OF+ & {@MV+}))} & ); reminding.g: ( & ) or ; reminding.v: & ; : ((O+ or B-) & {@MV+} & {(OF+ & {@MV+}) or TH+ or Zs- or Ce+}) or ([[@MV+ & O*n+ & {@MV+}]]); inform.v reassure.v alert.v guarantee.v notify.v forewarn.v: (( & ()) or ( & ([()] or ())) or (() & )); informs.v reassures.v alerts.v guarantees.v notifies.v forewarns.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); informed.v-d reassured.v-d alerted.v-d guaranteed.v-d notified.v-d forewarned.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or ( & {Ce+ or TH+ or Zs- or (OF+ & {@MV+})}) or ({{@MV+} & (Ce+ or TH+ or OF+)} & ) or ({@E-} & A+); informing.g reassuring.g alerting.g guaranteeing.g notifying.g forewarning.g: ( & ) or ; informing.v reassuring.v alerting.v guaranteeing.v notifying.v forewarning.v: & ; : ((O+ or B-) & {@MV+} & {(OF+ & {@MV+}) or TH+ or Zs- or Ce+}) or ([[@MV+ & O*n+ & {@MV+}]]) or ({@MV+} & (TH+ or Ce+)); assure.v: (( & ()) or ( & ([()] or ())) or (() & )); assures.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); assured.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or ( & {(OF+ & {@MV+}) or Ce+ or TH+ or Zs-}) or ({{@MV+} & (Ce+ or TH+ or OF+)} & ); assuring.g: ( & ) or ; assuring.v: & ; : ((B- or O+) & {@MV+} & {I+ or ((K+ or Pp+) & {@MV+})}) or ([[@MV+ & O*n+ & {@MV+}]]); let.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or ( & ) or ( & ((K+ or Pp+) & {@MV+})) or ((K+ or Pp+) & ); lets.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); letting.g: ( & ) or ; letting.v: & ; let's let’s: ({Ic-} & Wi- & {N+} & I+) or ({Ic-} & Wi- & N+); : ((B- or O+) & {@MV+} & {I*j+ or Pg+}) or ([[@MV+ & O*n+ & {@MV+}]]) or {@MV+}; watch.v: (( & ()) or ( & ([()] or ())) or (() & )); watches.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); watched.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or or ; watching.g: ( & ) or ; watching.v: & ; : ((B- or O+) & {@MV+} & {Pg+}) or ([[@MV+ & O*n+ & {@MV+}]]); appreciate.v spend.v: (( & ()) or ( & ([()] or ())) or (() & )); appreciates.v spends.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); appreciated.v-d spent.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or ( & {Pg+}) or ({{@MV+} & Pg+} & ); appreciating.g spending.g: ( & ) or ; appreciating.v spending.v: & ; % Pa**j is used for predicative adjectives % ditransitive : ((B- or O+ or OX+) & {({@MV+} & {I*j+ or Pa**j+ or B-}) or ((K+ or AF-) & {@MV+})}) or (( or (K+ & {[[@MV+]]} & O*n+) or K+ or Vm+ or ([[{K+} & @MV+ & O*n+]])) & {@MV+}) or [[()]]; make.v: (( & ()) or ( & ([()] or ())) or (() & )); makes.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); made.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or ( & (({@MV+} & Pa+) or ({K+} & {@MV+}))) or ({({@MV+} & Pa+) or K+} & ); built_of built_up_of composed_of constructed_of formed_of made_of made_up_of: ( & (B- or O+) & {@MV+}) or (O+ & ); making.g: ( & ) or ; making.v: & ; : (((B- or O+) & {({@MV+} & Pa+) or AF-}) or ([[@MV+ & O*n+]])) & {@MV+}; render.v deem.v: (( & ()) or ( & ([()] or ())) or (() & )); renders.v deems.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); rendered.v-d deemed.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or ( & {Pa+ or AF-}) or ({{@MV+} & Pa+} & ); rendering.g deeming.g: ( & ) or ; rendering.v deeming.v: & ; : (((O+ or B-) & {{@MV+} & OF+}) or ([[@MV+ & O*n+]])) & {@MV+}; deprive.v accuse.v acquit.v purge.v disabuse.v exonerate.v absolve.v rob.v convict.v: (( & ()) or ( & ([()] or ())) or (() & )); deprives.v accuses.v acquits.v purges.v disabuses.v exonerates.v absolves.v robs.v convicts.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); deprived.v accused.v acquitted.v purged.v disabused.v exonerated.v absolved.v robbed.v convicted.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or ( & {OF+} & {@MV+}) or ({@E-} & A+) or ({{@MV+} & OF+} & ); depriving.g accusing.g acquitting.g purging.g disabusing.g exonerating.g absolving.g robbing.g convicting.g: ( & ) or ; depriving.v accusing.v acquitting.v purging.v disabusing.v exonerating.v absolving.v robbing.v convicting.v: & ; : (((O+ or B-) & {({@MV+} & OF+) or K+}) or ({K+} & O*n+) or K+ or ([[{K+} & @MV+ & O*n+]])) & {@MV+}; clear.v: (( & ()) or ( & ([()] or ())) or (() & )); clears.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); cleared.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or ( & {({@MV+} & OF+) or K+} & {@MV+}) or ({K+ or ({@MV+} & OF+)} & ); clearing.g: ( & ) or ; clearing.v: & ; : ({(O+ & {O*n+}) or (B- & {O+})} & {@MV+} & {TH+ or Ce+ or RSe+}) or ([[@MV+ & O*n+ & {@MV+}]]); bet.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or ( & ) or ( & {O+ or B-} & {@MV+} & {TH+ or Ce+ or RSe+ or @MV+}); bets.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); betted.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or ( & {O+ or B-} & {@MV+} & {TH+ or Ce+ or RSe+ or @MV+}) or ({O- or [[@MV+ & O*n+]] or TH+ or Ce+} & ); betting.g: ( & ) or ; betting.v: & ; : ({@MV+} & TO+) or ((O+ or B-) & {@MV+} & {THi+}) or ([[@MV+ & O*n+ & {@MV+}]]); bother.v: (( & ()) or ( & ([()] or ())) or (() & )) or ; bothers.v: & ; bothered.v-d: ( & ) or or ; bothering.v: & ; bothering.g: ( & ) or ; : ((O+ or B-) & {@MV+} & {THi+}) or ([[@MV+ & O*n+]]); surprise.v alarm.v amaze.v amuse.v astonish.v astound.v excite.v depress.v disgust.v distress.v dismay.v irritate.v embarrass.v annoy.v: (( & ()) or ( & ([()] or ())) or (() & )) or ; surprises.v alarms.v amazes.v amuses.v astonishes.v astounds.v excites.v depresses.v disgusts.v distresses.v dismays.v irritates.v embarrasses.v annoys.v: & ; surprised.v alarmed.v amazed.v amused.v astonished.v astounded.v excited.v depressed.v disgusted.v distressed.v dismayed.v irritated.v embarrassed.v annoyed.v-d: ( & ) or or ; surprising.v alarming.v amazing.v amusing.v astonishing.v astounding.v exciting.v depressing.v disgusting.v distressing.v dismaying.v embarrassing.v annoying.v: & ; surprising.g alarming.g amazing.g amusing.g astonishing.g astounding.g exciting.g depressing.g disgusting.g distressing.g dismaying.g embarrassing.g annoying.g: ( & ) or ; : ((O+ or B- or [[@MV+ & O*n+]]) & {@MV+}) or ((O+ or OX+ or B-) & {@MV+} & (TOo+ or [[Pa+]])) or ({@MV+} & (TOf+ or TH+ or Ce+ or RSe+ or Zs- or Pa+)); prove.v: & ; proves.v: & ; proved.v-d: ( & ) or ( & {THi+ or TOf+}) or ({@E-} & A+) or ({{@MV+} & Pa+} & ); proven.v: ( & ) or ( & {THi+ or TOf+ or Pa+}) or ({@E-} & A+) or ({{@MV+} & Pa+} & ); proving.g: ( & ) or ; proving.v: & ; : ((O+ or B- or [[@MV+ & O*n+]]) & {@MV+}) or ({@MV+} & (Pg+ or TH+ or Ce+ or RSe+ or Zs- or TS+ or ((SI*j+ or SFI**j+) & I*j+))); suggest.v anticipate.v recommend.v: (( & ()) or ( & ([()] or ())) or (() & )); suggests.v anticipates.v recommends.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); suggested.v-d anticipated.v-d recommended.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or ( & {THi+ or TSi+ or Z-}) or ({@E-} & A+) or ; suggesting.g anticipating.g recommending.g: ( & ) or ; suggesting.v anticipating.v recommending.v: & ; % ditransitive : (( or (B- & {O+}) or [[@MV+ & O*n+]]) & {@MV+}) or ({@MV+} & (Pg+ or TH+ or Ce+ or RSe+)); deny.v: (( & ()) or ( & ([()] or ())) or (() & )); denies.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); denied.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or ( & {O+ or B- or [[@MV+ & O*n+]]} & {@MV+}) or ({O+ or ([[@MV+ & O*n+]])} & ); denying.g: ( & ) or ; denying.v: & ; : ((O+ or B-) & {@MV+} & {AZ+}) or ({@MV+} & (QI+ or Z-)) or ([[@MV+ & O*n+ & {@MV+}]]); describe.v: (( & ()) or ( & ([()] or ())) or (() & )); describes.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); described.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or ( & {AZ+ or Z-}) or ({@E-} & A+) or ({@MV+} & {AZ+} & ); describing.g: ( & ) or ; describing.v: & ; : ((O+ or B-) & {@MV+} & {AZ+}) or ([[@MV+ & O*n+ & {@MV+}]]); portray.v depict.v regard.v view.v characterize.v: (( & ()) or ( & ([()] or ())) or (() & )); portrays.v depicts.v regards.v views.v characterizes.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); portrayed.v-d depicted.v-d regarded.v-d viewed.v-d characterized.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or ( & {AZ+}) or ({@E-} & A+) or ({@MV+} & {AZ+} & ); portraying.g depicting.g regarding.g viewing.g characterizing.g: ( & ) or ; portraying.v depicting.v regarding.v viewing.v characterizing.v: & ; % ------------------------------------------------------------------------------- % IDIOMATIC VERBS do_so take_place show_up take_office do_battle give_way make_way take_part catch_up catch_on file_suit pick_up take_off break_free take_over jump_ship see_fit take_note: (( & ()) or ( & ([()] or ())) or (() & )); does_so takes_place shows_up pleads_guilty pleads_innocent takes_office does_battle gives_way makes_way takes_part catches_up catches_on files_suit picks_up takes_off breaks_free takes_over jumps_ship sees_fit lets_go takes_note comes_true comes_clean comes_of_age: (( & ()) or ( & (([]) or ())) or (() & ) or ); showed_up pleaded_guilty pleaded_innocent made_way caught_up caught_on filed_suit picked_up jumped_ship: (( & ()) or ( & (([]) or ())) or (() & )); plead_guilty plead_innocent: (( & ()) or ( & (([]) or ())) or (() & )) or ( & ); let_go: (( & ()) or ( & (([]) or ())) or (() & )) or ( & ) or ; did_so took_place took_office did_battle gave_way took_part took_off broke_free took_over saw_fit took_note came_true came_clean came_of_age: (( & ()) or ( & (([]) or ())) or (() & )); done_so taken_place shown_up taken_office done_battle given_way taken_part taken_off broken_free taken_over seen_fit taken_note: (( & ()) or ( & (([]) or ())) or (() & )); come_true come_clean come_of_age: (( & ()) or ( & ([()] or ())) or (() & )) or (( & ()) or ( & (([]) or ())) or (() & )); doing_so taking_place showing_up pleading_guilty pleading_innocent taking_office doing_battle giving_way making_way taking_part catching_up catching_on filing_suit picking_up taking_off breaking_free taking_over jumping_ship seeing_fit letting_go taking_note coming_true coming_clean coming_of_age: ( & ) or ; : (O+ or B- or [[@MV+ & O*n+]]) & {@MV+}; allow_for bring_about get_rid_of let_go_of take_note_of: (( & ()) or ( & ([()] or ())) or (() & )); puts_up_with allows_for brings_about gets_rid_of lets_go_of takes_note_of: (( & ()) or ( & (([]) or ())) or (() & ) or ); put_up_with let_go_of: (( & ()) or ( & (([]) or ())) or (() & )) or or ( & ); allowed_for brought_about got_rid_of took_note_of: (( & ()) or ( & (([]) or ())) or (() & )) or ; gotten_rid_of taken_note_of: (( & ()) or ( & (([]) or ())) or (() & )); putting_up_with allowing_for bringing_about getting_rid_of letting_go_of taking_note_of: ( & ( or )) or ; : {[@MV+]} & TH+; take_it make_out point_out give_notice serve_notice: (( & ()) or ( & ([()] or ())) or (() & )); takes_it makes_out points_out gives_notice serves_notice: (( & ()) or ( & ([()] or ())) or (() & )); made_out pointed_out served_notice: (( & ()) or ( & (([]) or ())) or (() & )) or or ; took_it gave_notice: (( & ()) or ( & (([]) or ())) or (() & )); taken_it given_notice: (( & ()) or ( & (([]) or ())) or (() & )); taking_it making_out pointing_out giving_notice serving_notice: ( & ) or ; : {[@MV+]} & THi+; turn_out: (( & ()) or ( & ([()] or ())) or (() & )) or ; turns_out: & ; turned_out: & ; turning_out: & ; % (QI+ & {MV+}): "I did not figure out why until recently" : {[@MV+]} & (TH+ or (QI+ & {MV+}) or Ce+); find_out figure_out: (( & ()) or ( & ([()] or ())) or (() & )); finds_out figures_out: (( & ()) or ( & ([()] or ())) or (() & )); found_out figured_out: (( & ()) or ( & (([]) or ())) or (() & )) or or ; finding_out figuring_out: ( & ) or ; : {Pg+ or @MV+}; keep_on give_up go_around: (( & ()) or ( & ([()] or ())) or (() & )) or ; keeps_on gives_up goes_around: & ; kept_on: & ; gave_up went_around: & ; given_up gone_around: & ; keeping_on giving_up going_around: ( & ) or ; % XXX TODO need to provide and-able links for these. : Pg+ or Pa+ or ({AF-} & {@MV+}); end_up: (( & ()) or ( & ([()] or ())) or (() & )) or ; ends_up: & ; ended_up: & ; ending_up: ( & ) or ; /en/words/words.v.1.p: or ; % two-word passives % done_for accounted_for adhered_to arrived_at barked_at belched_at catered_to : {@MV+} & (((Xd- or Xq-) & (Xc+ or ) & (COq+ or (CP- & {CC+}) or Eq+)) or [(Xc+ or Xe+) & Ce+]); : {@MV+} & (((Xd- or Xq-) & (Xc+ or ) & (COq+ or (CPx- & {CC+}) or Eq+)) or [(Xc+ or Xe+) & Ce+]); : {@MV+} & (Xd- or Xq-) & (Xc+ or ) & (COqi+ or (CPi- & {CC+}) or Eqi+); % paraphrasing verbs like "say", "reply" % acknowledge.q add.q admit.q affirm.q agree.q announce.q argue.q /en/words/words.v.10.1: [[{@E-} & (((Sp- or I-) & ) or (SIpj+ & ))]]; /en/words/words.v.10.2: [[{@E-} & ((Ss- & ) or (SIsj+ & ))]]; /en/words/words.v.10.3: or ({@E-} & (((S- or PP-) & ) or (SI*j+ & ) or [[Pvf- & ]])); read.q-d: or ({@E-} & (((S- or I- or PP-) & ) or (SI*j+ & ))); wrote.q-d: or ({@E-} & ((S- & ) or (SI*j+ & ))); written.q: {@E-} & PP- & ; /en/words/words.v.10.4: [[{@E-} & Pg- & ]]; seem.q appear.q: [[{@E-} & (SFp- or If-) & ]]; seems.q appears.q: [[{@E-} & SFs- & ]]; seemed.q-d appeared.q-d: or ({@E-} & (SF- or PPf-) & ); seeming.q appearing.q: [[{@E-} & Pgf- & ]]; say.q: {@E-} & (((Sp- or I-) & ) or (SIpj+ & )); says.q: {@E-} & ((Ss- & ) or (SIsj+ & )); said.q-d: or ({@E-} & (((S- or PP-) & ) or (SI*j+ & ))); saying.q: {@E-} & Pg- & ; tell.q: [[{@E-} & (Sp- or I- or SIpj+) & O+ & ]]; tells.q: [[{@E-} & (Ss- or SIsj+) & O+ & ]]; told.q-d: or ({@E-} & (((S- or PP- or SI*j+) & O+) or Pv-) & ); telling.q: [[{@E-} & Pg- & O+ & ]]; ask.q: [[{@E-} & (((Sp- or I-) & {O+}) or SIpj+) & ]]; asks.q: [[{@E-} & ((Ss- & {O+}) or SIsj+) & ]]; asked.q-d: or ({@E-} & (((S- or PP-) & {O+}) or Pv- or SI*j+) & ); asking.q: [[{@E-} & Pg- & {O+} & ]]; % idiomatic "voted yes/no" expressions using the V link. : Vv+ & {@MV+}; say.w vote.w: (( & ()) or ( & ([()] or ())) or (() & )); says.w votes.w: (( & ()) or ( & ([()] or ())) or (() & )); said.w-d voted.w-d: (( & ()) or ( & (([]) or ())) or (() & )); saying.w voting.w: ( & ); yes.misc-vote no.misc-vote: Vv-; double.v triple.v quadruple.v quintuple.v: {EN-} & (( & ()) or ( & ([()] or ())) or (() & )); doubles.v triples.v quadruples.v quintuples.v: {EN-} & (( & ()) or ( & (([]) or ())) or (() & ) or ); doubled.v-d tripled.v-d quadrupled.v-d quintupled.v-d: {EN-} & ( (( & ()) or ( & (([]) or ())) or (() & )) or or or ({@E-} & A+) or ); doubling.v tripling.v quadrupling.v quintupling.v: {EN-} & ( & ); doubling.g tripling.g quadrupling.g quintupling.g: {EN-} & (( & ) or ({@E-} & A+) or ); % =================================================================== % PREPOSITIONS % conjoin preps: "prep and prep": "the coverage on TV and on the radio..." : MJrp- or MJlp+; % alter-preps: "it is somewhere in or near the house" % The "or" must take a prep object. % XXX TODO: most preps below need this rule. : MJrj- or MJlj+; : or [Mp-] or Pp- or MVp- or [({Xc+ & {Xd-}} & CO+)] or (Xd- & Xc+ & (MX*x- or MVx-)); : or (Cs+ & (Mj- or (Xd- & Xc+ & MX*j-))) or (Wj- & Qd+) or [Wq- & PF+]; : or [Mpn-] or Pp- or MVpn- or [({Xc+ & {Xd-}} & CO*n+)] or (Xd- & Xc+ & (MX- or MVx-)); : or [Mp-] or Pp- or MVa- or [({Xc+ & {Xd-}} & CO+)] or (Xd- & Xc+ & (MX*x- or MVx-)); under beneath: ({Yd-} & {JQ+} & J+ & ( or FM-)) or (MVp- & B-) or (Yd- & Pp-); below above behind.p: ({Yd-} & {{JQ+} & J+} & ( or FM-)) or (MVp- & B-); within: ({JQ+} & J+ & ) or (MVp- & B-); during: ({JQ+} & J+ & ( or UN-)) or (MVp- & B-); from: ({Yd-} & {JQ+} & (FM+ or J+ or Mgp+) & ) or (MVp- & B-) or MVp- or NIr+; at toward towards without: ({JQ+} & (J+ or Mgp+) & ) or (MVp- & B-); % % XXX fixme: MVp- & J+ is wrong: "*I saw John except Fred" except but.misc-ex: ({JQ+} & (J+ or Mgp+) & ) or (MVp- & B-) or ((MVp+ or TO+) & ); against beyond beside: ({JQ+} & (J+ or Mgp+) & ) or (MVp- & B-); between: ({JQ+} & (J+ or Mgp+) & ) or (MVp- & B-) or NIr+; with: ({JQ+} & (J+ or Mgp+) & ( or RJrv-)) or (Jw+ & (RJrj- or RJlj+)) or (MVp- & B-) or (J+ & {EBm+} & ([P+] or [[O*n+]]) & ([({Xc+ & {Xd-}} & CO+)] or MVp- or (Xd- & Xc+ & (MX*x- or MVx-)))); among: ({JQ+} & (J+ or Mgp+) & ( or FM-)) or (MVp- & B-); for.p: ({JQ+} & (J+ or Mgp+ or TI+) & ) or (J+ & (RJrj- or RJlj+)) or (MVp- & B-) or (MG- & JG+) or (MVp- & FL+); into: ({JQ+} & (J+ or Mgp+ or QI+) & ) or (MVp- & B-); about: ({JQ+} & (J+ or Mgp+ or QI+) & ) or EN+ or EZ+ or (MVp- & B-) or (TOf+ & (Mp- or MVp- or Pp-)) or MVa-; through.r: ({JQ+} & J+ & ( or FM-)) or (MVp- & B-); : ({JQ+} & J+ & ( or FM-)) or K- or (MVp- & B-); across along: ; off: or (MVp+ & {Xc+ & {Xd-}} & COp+); past.p: ({Yd-} & {JQ+} & J+ & ( or FM-)) or K- or (MVp- & B-); around: or ({JQ+} & (J+ or Mgp+) & ( or FM-)) or K- or (MVp- & B-) or [EN+] or MVa-; out up.r down.r: ({Yd-} & {JQ+} & ([J+] or [[MVp+]]) & (({Xd- & Xc+} & MVa-) or FM-)) or K- or ({Yd-} & Pp-) or (MVp- & B-); by: or ({JQ+} & (J+ or Mgp+ or JT+) & ( or FM-)) or K- or (MVp- & B-); in: or ({JQ+} & (J+ or Mgp+ or IN+) & ( or FM-)) or K- or (MVp- & B-) or (MG- & JG+); on upon: or ({JQ+} & (J+ or Mgp+ or ON+ or [QI+]) & ) or K- or (MVp- & B-); over: ({Yd-} & {JQ+} & (J+ or Mgp+ or QI+ or [[MVp+]]) & ( or FM-)) or K- or EN+ or (MVp- & B-) or (Yd- & Pp-); just_over just_under well_over: EN+; % XXX original LG recommends using the LI link, however the % sort of clobbers this. Should this be "fixed"? like.p: ({[EA-]} & (((J+ or Mgp+ or [[Mp+ or MVs+]]) & ) or (Vf- & Mgp+) or (LI- & (J+ or Cs+)))) or (MVp- & B-); unlike: J+ & (MVp- or Pp- or [({Xc+ & {Xd-}} & CO+)] or (Xd- & Xc+ & (E+ or MVx-))); of: ({JQ+} & (J+ or Mgp+ or QI+) & (Mp- or OF- or (Xd- & Xc+ & MX*x-) or (Cs+ & (Mj- or (Xd- & Xc+ & MX*j-))) or [[({Xc+ & {Xd-}} & CO+)]])) or ((OF- or Mp-) & B-) or (MG- & JG+) or (NF- & NJ+) or (Mp- & TI+); of_them: (ND- or MF-) & (J+ or Pa+) & Xd- & (MX*x- or MVx-) & Xc+; % MX-PHRASE: The blah, to be blahed, will be blah. % TO- & Xc+: "I'd like to, I want to." (null infinitive) to.r: ({@E-} & {NT-} & I+ & (TO- or [{Xd- & Xc+} & MVi-] or or [] or [[R-]] or (SFsx+ & ))) or (TO- & Xc+) or I*a+ or ({JQ+} & (J+ or Mgp+) & ) or VJ+ or [MVp- & B-]; so_as_to: I+ & {Xd- & Xc+} & MVi-; besides: {J+ or Mgp+} & ([({Xc+ & {Xd-}} & CO+)] or MVp- or [Wq- & PF+]); throughout: {J+} & ([({Xc+ & {Xd-}} & CO+)] or MVp- or [Wq- & PF+]); inside.r outside.r underneath alongside: {J+} & ( or FM-); amid plus.p minus.p via onto: J+ & ( or [Wq- & PF+]); versus: (J+ & Mp-) or (G- & G+); vs: {Xi+} & G- & G+; worth.p: (Mp- & (J+ or OF+)) or (Paf- & Mgp+) or (Pa- & (J+ or B-)); opposite.p: J+ & ; better_off worse_off: {EC-} & Pa- & {Pg+}; off_of out_of: ({JQ+} & J+ & ) or (MVp- & B-); despite notwithstanding other_than apart_from aside_from: (J+ or Mgp+) & (MVp- or (Xd- & Xc+ & (MVx- or E+)) or [({Xc+ & {Xd-}} & CO+)]); rather_than: (J+ or Mgp+ or Mp+ or I+) & ((Xd- & Xc+ & (E+ or MVx-)) or MVp- or [({Xc+ & {Xd-}} & CO+)]); instead_of because_of prior_to: (J+ or Mgp+) & (MVp- or Pp- or [({Xc+ & {Xd-}} & CO+)] or (Xd- & Xc+ & (E+ or MVx-))); as_well_as: (J+ or Mgp+) & (MG- or Mp- or MVp- or [({Xc+ & {Xd-}} & CO+)] or (Xd- & Xc+ & (MX*x- or MVx-))); according_to as_of in_case_of in_response_to unbeknownst_to thanks_to: J+ & (MVp- or Pp- or [({Xc+ & {Xd-}} & CO+)] or (Xd- & Xc+ & (E+ or MVx-))); due_to along_with en_route_to in_connection_with: J+ & ; regardless_of as_to irrespective_of: (J+ or QI+) & (MVp- or [({Xc+ & {Xd-}} & CO+)] or (Xd- & Xc+ & (E+ or MVx-))); overhead.r midway in_public in_private en_route a_la_mode a_la_carte side_by_side from_coast_to_coast: ; abroad upstairs.r downstairs.r overseas.r next_door: or FM-; elsewhere: or FM- or [[J-]]; ahead at_hand in_store in_reverse in_place in_town under_way in_office out_of_office out_of_reach in_reach within_reach on_guard at_large in_hand on_hand for_free on_file in_line on_line in_loco_parentis on_board en_route in_bed out_of_bed on_strike on_top from_afar at_stake in_question at_issue on_lease on_trial in_league in_cahoots in_front in_back on_break on_camera in_command in_concert by_association in_association on_deck on_disk on_file on_foot on_location on_line online.r: MVp- or Mp- or Pp- or (Xc+ & Xd- & (MX*x- or MVx-)); uptown downtown.r offshore.r underground.r out_of_town: MVp- or Mp- or Pp- or FM- or (Xc+ & Xd- & MVx-); : MVp- or Pp- or (Xc+ & Xd- & MVx-); forward.r backward forwards.r backwards sideways ashore abreast aft half-way two-fold downhill southward underfoot westward eastward northward overnight.r on_hold on_track in_situ in_toto off_balance in_check on_course off_course under_oath at_end by_example on_holiday by_invitation on_patrol on_stage in_step in_tempo on_schedule behind_schedule ahead_of_schedule for_good for_keeps in_phase out_of_step out_of_phase in_tune out_of_tune in_session out_of_session in_phase neck_and_neck under_contract: ; /en/words/words-medical.prep.1: ; % 5' 3' are DNA ends upstream downstream 5' 3': A+ or NIfp+ or NItp- or ({Yd- or EZ- or EE- or EI-} & {MVp+ or OF+} & (({Xc+ & Xd-} & (Ma- or MJra-)) or MJra+ or (Wq- & PF+) or MVp- or Pp- or FM- or (Xc+ & Xd- & (MVx- or MX-)))); %upstream downstream 3' 5': %A+ or %((EZ- or Y-) & (MVp+ or OF+) & (MV- or MV+)) or %(EI- or EZ- or Y- & Ma- & (MVp+ or OF+)) or %(EE- or Y- & (FM- or TO-) & MVp+ or OF+); indoors outdoors underwater.r: MVp- or Pp- or FM- or (Xc+ & Xd- & MVx-); everywhere anywhere: {EL+} & ((Cs+ & (({Xc+ & {Xd-}} & CO+) or ({Xd- & Xc+} & MVs-))) or (MVp- or Pp- or FM- or (Xc+ & Xd- & MVx-))); somewhere someplace: ({EL+} & (MVp- or Pp- or FM- or [({Xc+ & {Xd-}} & CO+)] or (Xc+ & Xd- & MVx-)) & Mp+) or ({EL+} & {Xc+ & {Xd-}} & MVp+ & {Xc+ & {Xd-}} & COp+) or [[{EL+} & {Xc+ & {Xd-}} & CO+]]; nowhere: {EL+} & (MVp- or Pp- or FM- or (Xc+ & Xd- & MVx-)); as_usual to_date on_average in_turn so_far in_particular in_response in_general thus_far in_reply: MVp- or Mp- or ({Xc+ & {Xd-}} & CO+) or (Xc+ & Xd- & (MVx- or MX*x-)); recently: {EE- or EF+} & (({Xd- & Xc+} & MVp-) or Pp- or E+ or ({Xc+ & {Xd-}} & CO+) or EB- or JT- or Ca+ or Qe+ or [[Mp-]]); now.r: ({Xd- & Xc+} & MVp-) or Pp- or E+ or ({Xc+ & {Xd-}} & CO+) or EB- or [[Mp-]]; then.r: ({Xd- & Xc+} & MVp-) or Pp- or E+ or ({Xc+ & {Xd-}} & CO+) or EB- or (S+ & Xd- & Xc+ & MVs-) or [[Mp-]]; later earlier: ({ECa- or Yt-} & (E+ or Mp- or Pp- or MVb- or [({Xc+ & {Xd-}} & CO+)] or (Xd- & Xc+ & (MX*x- or MVx-)) or ({[[@Ec-]]} & {Xc+} & A+) or AJrc- or AJlc+)) or (Yt- & (Ca+ or Qe+)); away: ({Yd-} & (MVp- or Pp- or ({Xc+ & {Xd-}} & CO+))) or K-; aboard: ((MVp- or Mp- or Pp-) & {J+}) or K-; apart: {Yd-} & K-; % wtf ?? what is home.i for ?? home.i: [[K-]]; % Bare-naked MVp-: "I want it back" back.r: ({Yd-} & K-) or (MVp+ & (MVp- or FM-)) or MVp-; forth aside.p: K- or MVa-; % SF*p+: "nearby is another temple" (using p for 'prep') % SFpp+: "nearby are more ruins" nearby: A+ or MVp- or Pp- or FM- or (SF*p+ & ); close_by: (SF*p+ & ); next_to in_back_of in_front_of close_to on_top_of outside_of inside_of atop: or (J+ & ( or FM- or [Wq- & PF+])); ahead_of by_way_of akin_to betwixt vis-a-vis in_lieu_of on_account_of in_place_of in_search_of: or (J+ & ( or [Wq- & PF+])); near.p: {EE- or EF+} & ( or (J+ & ( or FM- or [Wq- & PF+]))); all_over all_around: {J+} & (Pp- or MVp- or [({Xc+ & {Xd-}} & CO+)] or FM- or Mp-); such_as: J+ & (MVa- or Mp- or (Xc+ & Xd- & (MVx- or MX*x-))); % Consider "Here's the ball." We have two choices: SFst+ as a filler-it, % or the more questionable [Wq- & PF+]. Note that (Wd- & PF+) is barred % by the post-processing rules. Maybe PF is reasonable.. but SFst seems % better at the moment. here: J- or or (SFst+ & ); there.r: J- or or ((SFst+ or SFp+ or SFut+) & ) or SFIst- or SFIp- or OXt- or Wi-; % Patronymics and misc french/spanish/german connectives % Many of these are already in the adjectives list à auf aus aux comte comtes dans de de_la del della delle der des du duc la las le.c los nach noch och os ou på por sans te über un une vom von zum zur zu: {G-} & G+; y.and: G- & G+; % TIME AND PLACE EXPRESSIONS this_time this_one_time this_once that_time these_days: or [[E+]]; last_time next_time: or JT- or YS+ or [[]]; day.r week.r month.r year.r weekend.r morning.r afternoon.r evening.r night.r semester.r term.r season.r session.r: ((DTn- or DTi-) & ( or [[E+]])) or (DTi- & (JT- or [[]] or YS+)) or (DTa- & ); the_next the_previous the_following this_past: DTn+; today tonight: or JT- or [[E+]] or YS+ or [[]]; yesterday: {TD+} & ( or JT- or [[E+]] or YS+ or [[]]); tomorrow: {TD+} & ( or JT- or YS+ or [[]]); Monday Tuesday Wednesday Thursday Friday Saturday Sunday.i: ((DTn- or DTie- or [()]) & {G-} & {TD+ or TW+} & (YS+ or or JT- or ON- or [[]])) or [[AN+]]; morning.i afternoon.i night.i evening.i: TD-; January.i February March April.i May.i June.i July August.i September.i October November December: ((DTn- or DTie- or ({TA-} & {TY+})) & (JT- or IN- or [[]] or [] or YS+)) or ((DTn- or DTie-) & ) or (TM+ & {TY+} & ((Xd- & Xc+ & TW-) or ON- or JT- or [[ or MVp- or Mp- or AN+]])) or AN+; AM.ti PM.ti am.ti pm.ti a.m. p.m. o'clock: ND- & {@MX+} & & {TZ+} ; % Time-zone names A.tz ACDT.tz ACST.tz ADT.tz AEDT.tz AEST.tz AKDT.tz AKST.tz AST.tz AWDT.tz AWST.tz B.tz BST.tz C.tz CDT.tz CEDT.tz CEST.tz CET.tz CST.tz CXT.tz D.tz E.tz EDT.tz EEDT.tz EEST.tz EET.tz EST.tz F.tz G.tz GMT.tz H.tz HAA.tz HAC.tz HADT.tz HAE.tz HAP.tz HAR.tz HAST.tz HAT HAY.tz HNA.tz HNC.tz HNE.tz HNP.tz HNR.tz HNT.tz HNY.tz I.tz IST.tz K.tz L.tz M.tz MDT.tz MESZ.tz MEZ.tz MSD MSK.tz MST.tz N.tz NDT.tz NFT.tz NST.tz O.tz P.tz PDT.tz PST.tz Q.tz R.tz S.tz T.tz U.tz UTC.tz V.tz W.tz WDT.tz WEDT WEST.tz WET.tz WST.tz X.tz Y.tz Z.tz: {Xd-} & TZ-; % Abbreviated month names. Jan.x Feb.x Mar.x Apr.x May.x Jun.x Jul.x Aug.x Sep.x Sept.x Oct.x Nov.x Dec.x: {Xi+} & TM+ & {TY+} & ((Xd- & Xc+ & TW-) or ON- or JT- or [[ or MVpn- or Mp- or AN+]]); fall.i spring.i winter.i summer.i: ((DTn- or DTi-) & ) or (DTi- & (JT- or YS+ or [[]])); weeks.i days.i hours.i minutes.i seconds.i months.i years.i decades.i centuries.i semesters.i terms.i nights.i: ((ND- or [[EN-]] or [()]) & (Yt+ or (OT- & {Mp+}))) or (ND- & Ye-) or (TQ- & BT+); week.i day.i hour.i minute.i second.i month.i year.i decade.i century.i semester.i term.i night.u: (NS- & (({NJ-} & {EN-} & (Yt+ or OT-)) or (EN- & J-))) or (NSa- & [[Mp- or Ys-]]) or ({NR- or TT-} & DG- & ((Cs+ & (({Xc+ & {Xd-}} & CO+) or MVp- or (Xd- & Xc+ & MVx-))) or Yt+)); year_and_a_half: NSa- & {EN-} & (Yt+ or OT-); moment.u: (NS- & (({EN-} & (Yt+ or OT-)) or (EN- & J-))) or ({NR- or TT-} & DG- & ((Cs+ & (({Xc+ & {Xd-}} & CO+) or MVp- or (Xd- & Xc+ & MVx-))) or Yt+)); a_while: J- or Yt+ or OT- or MVa-; now.i then.i: JT- or FM-; now_on then_on there_on: FM-; from_now: Yt- & ; a_long_time some_time a_few_moments moments.u: Yt+ or OT-; ago: Yt- & ( or Ca+ or Qe+ or JT-); every.i: {EN-} & Ye+ & ; times.i x.i: (ND- & (({Xc+ & {Xd-}} & CO+) or MVp- or EC+ or EZ+ or Ca+ or Qe+)) or (((({ND-} & DG-) & {Cs+}) or (ND- & Ys+)) & (({Xc+ & {Xd-}} & CO+) or MVp- or (Xd- & Xc+ & MVx-))); time.i: {TT- or NR-} & DG- & {Cs+} & (({Xc+ & {Xd-}} & CO+) or MVp- or (Xd- & Xc+ & MVx-)); the_year: TY+ & ; every_time: {EN-} & (Cs+ & (({Xc+ & {Xd-}} & CO+) or MVp- or (Xd- & Xc+ & MVx-))); week.n moment.n hour.n minute.n year.n instant.n period.n month.n second.n decade.n century.n: {NM+} & (( & ((Ds- & {@M+} & {WN+ or TH+ or [[Ce+]] or (R+ & Bs+)} & {@MXs+} & ( or or )) or Us- or (YS+ & Ds-) or (GN+ & (DD- or [()])))) or AN+); day.n night.n: {NM+} & (( & (({D*u-} & {@M+} & {WN+ or TH+ or [[Ce+]] or (R+ & Bs+)} & {@MXs+} & ( or or )) or Us- or (YS+ & {D*u-}) or (GN+ & (DD- or [()])))) or AN+); days.n weeks.n moments.n hours.n minutes.n years.n instants.n periods.n months.n nights.n seconds.n decades.n centuries.n: {NM+} & (( & (({Dmc-} & {@M+} & {WN+ or TH+ or Ce+ or (R+ & Bp+)} & {@MXp+} & ( or or )) or Up- or (YP+ & {Dmc-}) or (GN+ & (DD- or [()])))) or [[AN+]]); % XXX A major problem here is that the dict entries for miles.n, feet.n % create a mass of parses that are wrong & interfere with the below. : ((ND- or [()] or [[EN-]]) & (Yd+ or Ya+ or EC+ or [[MVp-]] or OD-)) or (ND- & (NIfu+ or NItu- or EQt+ or EQt-)); % AU is abbreviation for "astronomical units" blocks.i feet.i miles.i yards.i inches.i meters.i millimeters.i centimeters.i micrometers.i kilometers.i microns.i Angstroms.i wavelengths.i AU.i au.i astronomical_units light-years.i: ; block.i foot.i mile.i yard.i inch.i meter.i millimeter.i centimeter.i micrometer.i kilometer.i micron.i Angstrom.i wavelength.i astronomical_unit light-year.i: (NS- & {NJ-} & {EN-} & (Yd+ or EC+ or [[MVp-]] or Ya+ or OD-)) or Us-; % make sure that mile.i always has precedence over mile.n % XXX TODO: probably same for the other .i's above... mile.n: or []; a_long_way: Yd+; point.i percentage_point: (NS- or NIe-) & {NJ-} & (Yd+ or OD-); points.u percentage_points: ND- & (Yd+ or MVp-); dollars.i cents.i: NIn- & (EC+ or Yd+ or OD-); 1_dollar one_dollar a_dollar 1_cent one_cent a_cent: {NJ-} & (EC+ or Yd+ or OD-); share.i pound.i ounce.i gallon.i barrel.i head.x: NSa- & Mp-; dollar.i cent.i: ((NIm- or NIn- or NIe-) & AN+) or (NS- & {NJ-} & (EC+ or Yd+ or OD-)); twofold threefold fourfold fivefold sixfold sevenfold eightfold ninefold tenfold a_hundredfold a_thousandfold: {EN-} & (MVp- or Em+ or EC+ or [Pa-] or A+ or (Xd- & (Xc+ or ) & MX-) or NIfn+ or NItn-); % Add cost to Op-, try to use any other linkage before making % a unit be a plain-old object. : ((ND- or NS- or NIe-) & (NIfu+ or NItu-)) or ((ND- or NS- or NIe-) & (AN+ or EQt+ or EQt-)) or ((ND- or NS- or NIe-) & (DD- or EN-) & {Wd-} & ({Mp+} & Sp+ )) or ((ND- or NS- or NIe-) & ([[{DD-} & Op-]] or Jp-) & {Mp+}) or ((ND- or NS- or NIe-) & Xd- & MX- & Xc+) or ((ND- or NS-) & {NJ-} & (EC+ or Y+ or OD- or (Us- & {Mp+}))) or Us-; % Abbreviations of scientific units that follow numbers % km².u mi².u in².u ft².u m².u cm².u /en/words/units.1: ; UNITS: ; % Units abbreviations that can be followed by a period: % ft. tbsp. yds. /en/words/units.1.dot: {Xi+} & ; % Abbreviations that form noun-like things "degrees_Fahrenheit" etc. /en/words/units.3: ND- & ; % Time unit abbreviations: : or ((ND- or NS-) & {NJ-} & OT-); /en/words/units.4: ; /en/words/units.4.dot: {Xi+} & ; % money, similar to units, above. /en/words/currency: ((NIm- or NIn- or NIe-) & AN+) or ((NIm- or NIn- or NIe-) & (Op- or Jp-) & {Mp+}) or ((NIm- or NIn-) & {NJ-} & (EC+ or Yd+ or OD-)) or Us-; /en/words/currency.p: ((NIn- or NIe-) & AN+) or ((NIn- or NIe-) & (Op- or Jp-) & {Mp+}) or ((NIn-) & {NJ-} & (EC+ or Yd+ or OD-)) or Us-; % number-and-unit combinations, such as "50-kDa". The linking requirements % should largely follow those for units except not allowing a numeric % determiner. % TODO: the linking requirements are likely rarely used, and % it might be beneficial to cost them. If this is done, make the same % modification for unit ranges also. % NUMBER-AND-UNIT: % ((({D*u-} or {Dmc-}) & & % ( or Bsm+)) or (({D*u-} or {Dmc-}) & Us- & {Mp+})) or A+; % Above screw up the usual units processing. %QUESTION WORDS & CONJUNCTIONS %who: (R- & (({MVp+ or MVx+} & RS+) or Cr+)) or %({EL+} & (S**w+ or B*w+) & (Ws- or Wq- or QI*d- or BIqd-)) or %({MVp+ or MVx+} & (S**w+ or B*w+) & (Xd- & (Xc+ or ) & MX*r-)); % QI- & (): "I do not know who" who: (R- & (({MVp+ or MVx+} & RS+) or Cr+)) or [QI-] or ({EL+} & (S**w+ or (R+ & B*w+)) & (Ws- or Wq- or QI*d- or BIqd-)) or ({MVp+ or MVx+} & (S**w+ or (R+ & B*w+)) & (Xd- & (Xc+ or ) & MX*r-)); % "what are the answers?" takes Sp+ what: ({EL+} & (D**w+ or Ss*w+ or Sp*w+ or (R+ & (Bsw+ or BW+))) & (Wq- or Ws- or QI*d- or BIqd- or QJ+ or QJ-)) or ((Ss*d+ or (R+ & (Bsd+ or BW+))) & ( or (Ss*t+ & ) or SIs*t-)) or (D+ & JQ-); % QI- & (): "I do not know which" which: ((Jr- or R-) & (({MVp+ or MVx+} & RS+) or Cr+)) or [QI-] or ((D**w+ or ({OF+} & (S**w+ or (R+ & B*w+)))) & (Wq- or Ws- or QI*d- or BIqd-)) or Jw- or (JQ- & D+) or ({MVp+ or MVx+} & (S**w+ or B*w+) & ((Xc+ or ) & Xd- & MX*r-)); whom: (R- & Cr+) or (R+ & B*w+ & (Wq- or QI*d- or BIqd- or ((Xc+ or ) & Xd- & MX*r-))) or (Jr- & (RS+ or Cr+)) or Jw-; whose: (D**w+ & (Mr- or Wq- or Ws- or QI*d- or BIqd- or ((Xc+ or ) & Xd- & MX*d-))) or (JQ- & D+) or (U+ & Jr- & (RS+ or Cr+)); whoever: {EL+} & (((Ss*d+ or Bsd+ or [[CX+]]) & ( or SJr- or (Xc+ & {Xd-} & CO+) or ({Xd- & Xc+} & MVs-))) or [[(O- or J-) & CX+]]); whatever.c: ({EL+} & (((Ss*d+ or Bsd+ or BW+ or D**w+) & ( or (Xc+ & {Xd-} & CO+) or ({Xd- & Xc+} & MVs-))) or [[(O- or J-) & CX+]])) or ((ALx+ & J+) & (({Xd-} & Xc+ & CO+) or ({Xd- & Xc+} & MVs-))); whenever wherever however.c: {EL+} & (Cs+ & (({Xc+ & {Xd-}} & CO+) or ({Xd- & Xc+} & MVs-))); no_matter: QI+ & ((Xc+ & {Xd-} & CO+) or ({Xd- & Xc+} & MVs-)); that.j-c: (Cet+ & ([SFsx+ & ] or TH- or [[MVh-]] or RJ*t+ or RJ*t-)) or (TS- & (SI*j+ or SFI**j+) & I*j+); that.j-d: [{AL-} & D*u+]; that.j-r: (R- & (({MVp+ or MVx+} & RS+) or Cr+)) or EE+ or (EA+ & {HA+}) or DTn+; that.j-p: ({[[M+]]} & ) or ; % (Rnx+ & ): "Because I said so" because: (Cs+ & (({Xc+ & {Xd-}} & CO*s+) or BIh- or ({Xd- & Xc+} & MVs-))) or (OF+ & (({Xc+ & {Xd-}} & CO+) or BIh- or ({Xd- & Xc+} & MVa-))) or (Rnx+ & ); now_that just_as if_only in_case whereby whereupon insofar_as inasmuch_as ere on_the_grounds_that on_grounds_that in_that in_the_event_that in_the_event: Cs+ & (({Xc+ & {Xd-}} & CO*s+) or ({Xd- & Xc+} & MVs-)); on_condition: (TH+ or TS+) & (({Xc+ & {Xd-}} & CO*s+) or ({Xd- & Xc+} & MVs-)); unless though.c even_though: (Cs+ or Mgp+ or Mv+) & (({Xc+ & {Xd-}} & CO*s+) or ({Xd- & Xc+} & MVs-) or (Xd- & Xc+ & E+)); as_if as_though: ((Cs+ or Mgp+ or Mv+ or Mp+) & (({Xc+ & {Xd-}} & CO*s+) or ({Xd- & Xc+} & MVs-) or (Xd- & Xc+ & E+))) or ((BIh- or LI-) & Cs+); as_soon_as: Cs+ & {Xc+ & {Xd-}} & CO*s+; until 'til ’til ‘til `til til: ((Mgp+ or J+ or JT+ or UN+) & (({Xc+ & {Xd-}} & CO+) or ({Xd- & Xc+} & MVp-) or [Mp-])) or (Cs+ & (({Xc+ & {Xd-}} & CO*s+) or ({Xd- & Xc+} & MVs-))); since: ((Mgp+ or J+ or JT+ or UN+) & (({Xc+ & {Xd-}} & CO+) or ({Xd- & Xc+} & MVp-) or [Mp-])) or (Cs+ & (({Xc+ & {Xd-}} & CO*s+) or ({Xd- & Xc+} & MVs-))) or [[MVa-]] or [[E+]]; ever_since: (J+ or Mgp+ or Cs+) & (({Xc+ & {Xd-}} & CO*s+) or ({Xd- & Xc+} & MVs-)); after: {EI- or Yt-} & (((Mgp+ or J+ or JT+) & ( or UN- or Ca+ or Qe+)) or (Cs+ & (({Xc+ & {Xd-}} & CO*s+) or ({Xd- & Xc+} & MVs-)))); before: ({EI- or Yt-} & (({Mgp+ or J+ or JT+} & ( or UN-)) or (Cs+ & (({Xc+ & {Xd-}} & CO*s+) or ({Xd- & Xc+} & MVs-))))) or (Yt- & (Ca+ or Qe+)); if: (Cs+ & {Xc+ & {Xd-}} & (Wd- & (Qd+ or Ws+ or Wq+))) or ((Cs+ or [Mgp+] or [Mv+]) & (({Xd- & Xc+} & MVs-) or ({Xc+ & {Xd-}} & CO*s+))) or (QI- & Cs+); if_possible if_necessary: MVp- or (Xd- & Xc+ & (MVx- or E+)) or ({Xc+ & {Xd-}} & CO+); if_so: ({Xc+ & {Xd-}} & CO+); if_only: ((MVp+ or MVa+ or MVs+) & ({Xd- & Xc+} & MVp-)) or (Wd+ & Wc-); no_wonder: Wd+ & Wc-; while: ((Cs+ or Mgp+ or Mp+) & (({Xc+ & {Xd-}} & CO*s+) or ({Xd- & Xc+} & MVs-) or (Xd- & Xc+ & E+))); : RJlv+ or RJrv-; % once as adverb once.e: ({Cs+ or Mp+} & (({Xc+ & {Xd-}} & CO*s+) or ({Xd- & Xc+} & MVs-) or (Xd- & Xc+ & E+))) or or E+ or EB-; % -------------------------------------------------------------------------- % Conjunctions % Should these be treated as clause-openers (taking CO link)? % e.g. "Also on this list is the Colossus of Rhodes." % Currently, they take Wc- as they are "coordinating conjuctions" % that are tied to previous sentences (i.e. to the left-wall). % Another possibility: (Rnx+ & ) "Because I say so" but.ij and.ij or.ij not.ij also.ij but_not and_not: [[(({Xd-} & CC-) or Wc-) & {Xc+} & (Wdc+ or Qd+ or Ws+ or Wq+)]]; and/or: [(({Xd-} & CC-) or Wc-) & (Wdc+ or Qd+ or Ws+ or Wq+)]; % and used as a conjunction in proper names: % The Great Southern and Western Railroad % Hmm, Maybe should use MG- & JG+ here, to be consistent with "of", "for": % "The Society of Engineers", "The League for Abstinence" and.j-g: [[G- & G+]]; % Conjoined adjectival modifiers. % The black and white cat sleeps % She ran hot and cold. % The EB+ link handles "not", "yet" after the "and" -- "blah and not blah" % See also for similar structures. % The {Xd-} allows "blah blah, and blah" % MVa is given a cost, so that Pa is used, if possible. % (In general, we want to never use MVa if Pa is possible... ) % AJla- & AJr*+ allows "he is clever and funnier than Mike." % % AJ*a: ordinary adjectives % AJ*c: comparative adjectives % AJ*s: superlative adjectives % and.j-a but.j-a yet.j-a: ({Xd-} & AJla- & {EB+} & AJr+) & (A+ or Pa- or [MVa-] or AJra-); or.j-a: ({Xd-} & AJla- & AJra+) & (A+ or Pa- or [MVa-] or AJra-); % The SJn, Dn links are propagated through the linkage, guaranteeing that % "neither" will be used together with "nor". nor.j-a: AJn- & AJ+ & (A+ or Pa- or [MVa-]); % compartives: % he is bigger, and badder, than the pope. % If one comma is there, then the other must be also. and.j-c or.j-c but.j-c yet.j-c: ((AJlc- & AJrc+) or (Xd- & AJlc- & AJrc+ & Xc+)) & (((Pam- or Mam- or AFm+) & {@MV+}) or ({[ECa-]} & MVb-) or Am+); and.j-s: (AJls- & AJrs+ & La-) or (AJld- & AJrd+ & (D+ or DD+)); % conjoined post-nominal modifiers % [Ma-]: it is more grammatically correct to have commas ... but.j-m and.j-m or.j-m: (({Xd-} & MJla- & MJra+) & ([Ma-] or (Xd- & Xc+ & MX*a-))) or (({Xd-} & MJlp- & MJrp+) & (Mp- or MVp- or (Xc+ & CO+))) or (({Xd-} & MJlj- & MJrj+ & {Xc+}) & J+ & ([Mp-] or Pp- or MVp-)); % Conjoined question words. % When and where is the party? % How and why did you do that? and.j-q: (QJ- & QJ+) & ((Wq- & (Q+ or PF+)) or QI-); % conjoined adverbs/prepositional phrases % RJ*v: adverbs % RJ*t: that "He said that ... and that ..." % RJ*c: subordinate clauses: "Although he said ... and he did ..., ..." % RJ*j: prep-object-relative (Mj): "the man for whom and with whom ..." % RJ*r: "those" relative clauses: "...: those who do and those who don't" and.j-r or.j-r: ((RJlv- & RJrv+) & MVr-) or ((RJlt- & RJrt+) & TH-) or ((RJlc- & RJrc+) & Cs-) or ((RJlj- & RJrj+) & Mj- & Cs+) or (({Xd-} & RJlr- & RJrr+) & J-); % Conjoined nouns/noun phrases. % "The cost and reliability were questioned" (Spx+) % "He wrote for piano and flute." (Ju-) % "Where is the sickle and hammer?" (SIs-) % Op- has a cost, so that "they verbed X and verbed Y" gets the VJ link % at zero cost, and the SJ link at higher cost (since a "verbed Y" can be % understood as a modified noun). Acutally, should probably have some % post-processing rule to disallow this XXX to do fix above. Example of % bad SJ usage: "He bangs drums and played piano" i.e "he bangs a played piano" % % : ({Xd-} & SJl- & SJr+) & etc. % would allow "X , and Y" constructions, but these have tricky rules... % % noun-conj-dep-s & SI-: Are a dog and a cat here? % % XXX There should be a noun-sub-u but this requires a lot of work ... : ({Xd-} & SJls- & SJrs+ & {[[Xc+]]}); : ({Xd-} & SJlp- & SJr+ & {[[Xc+]]}) or ({Xd-} & SJls- & SJrp+ & {[[Xc+]]}); : ({Xd-} & SJlu- & SJr+ & {[[Xc+]]}) or ({Xd-} & SJlp- & SJru+ & {[[Xc+]]}) or ({Xd-} & SJls- & SJru+ & {[[Xc+]]}); % Give AN+ a cost, because in general, we don't want to conjoind nouns, % and then use the resulting phrase to modify another noun ... : Ju- or SJl+ or [[AN+]]; and.j-n but_not: ( & & ( or (Spx+ & ) or SIp- or [Os-] or )) or ( & & ( or (Spx+ & ) or SIp- or [Op-] or )) or ( & & ( or (Sux+ & ) or SIu- or [Ou-] or )); or.j-n: ( & & ( or (S*x+ & ) or SI- or [Os-] or )) or ( & & ( or (Spx+ & ) or SIp- or [Op-] or )); % The SJn, Dn links are propagated through the linkage, guaranteeing that % "neither" will be used together with "nor". nor.j-n: SJn- & SJ+ & ((Wd- & S*x+) or SI- or Os- or SJn+); % The Dn- link is used for both nouns, as above, and on neither..nor for verbs % e.g. "We neither ate nor drank" neither.j: Dn+; % Force use of commas: "Mary, but not Louise, is coming to the party" % Not John, but Mary led the way. but.j-n: ((Xd- & SJl- & EBx+ & SJr+ & Xc+) & (Wd- & Ssx+)) or ((Xd- & SJl- & EBy- & SJr+) & (Wd- & Ssx+)) or ((SJl- & EBy- & SJr+) & Ou-); % -------------------------------------------------------------------------- % Conjoined verbs/verb phrases % "Oscar Peterson played piano and wrote music." % Pass through singular/plural agreement of subject. % The weirdo (B- & {B+}) allows the following to parse: % "This is a problem Moscow created and failed to solve." : (({Xd-} & VJlsi- & VJrsi+) & (({@MV+} & Ss-) or (I- & {@MV+}) or ({Xd-} & VJrsi-))) or (({Xd-} & VJlpi- & VJrpi+) & (({@MV+} & Sp-) or (I- & {@MV+}) or ({Xd-} & VJrpi-))) or (({Xd-} & VJlst- & VJrst+) & ((({@MV+} & Ss-) or (I- & {@MV+})) & (O+ or (B- & {B+})))) or (({Xd-} & VJlpt- & VJrpt+) & ((({@MV+} & Sp-) or (I- & {@MV+})) & (O+ or (B- & {B+})))) or (({Xd-} & VJlh- & VJrh+) & (PP- & {@MV+})) or ((VJlg- & VJrg+) & (J-)); and.j-v or.j-v: ; % ditransitive conjunction: "I gave Bob a doll and Mary a gun" : {Xd-} & VJd- & O+ & O*n+; and.j-o or.j-o: ; % The VJn- gaurentees that nor.j-v is used with neither.j-v nor.j-v: (VJn*i- & VJr*i+ & ({@MV+} & S-)) or (VJn*t- & VJr*t+ & ({@MV+} & S- & O+)); % Similar to and, but allows optional comma before "but" % "blah blah, but blah" but.j-v: ((({Xd-} & VJls-) & VJrs+) & (Ss- or ({Xd-} & VJrs-))) or ((({Xd-} & VJlp-) & VJrp+) & (Sp- or ({Xd-} & VJrp-))) or ((VJl- & VJr+) & (I-)); % The VJb- guarentees that bit.j-b is used with not_only % "We not only X'ed but also Y'ed". % This is the same pattern as the neither..nor... pattern above. but.j-b: (VJb*i- & VJr*i+ & ({@MV+} & S-)); not_only: Db+; % XJ: collocations with holes, i.e. "... blah blah X um um Y" % where "blah blah" is always used with "um um". % XJ*i: with infinitives % ... not only X, but Y % "you should not only ask for your money back, but demand it" not_only: I- & I+ & XJi+; but.j-r: {Xd-} & XJi- & I+; % XXX to-do: should have special linkage for either... or .... % instead of dependeingg on the E+ link. See neither..nor... for examples. either.r: Ds+ or E+ or ({OF+} & ) or ({Xd+ & Xc-} & MVa-); neither.r: Ds+ or E+ or ({OF+} & ); nor.r: ((Xd- & CC-) or Wd-) & Qd+; for.r: [[(({Xd-} & CC-) or Wc-) & (Wd+ or Qd+ or Ws+ or Wq+)]]; yet.r: ((({Xd-} & CC-) or Wc-) & Wd+) or E+ or MVa- or ({Xd-} & Xc+ & CO+); thus therefore: ({Xc+ & {Xd-}} & CO+) or ({Xd-} & CC- & Wd+) or ({Xd- & Xc+} & (E+ or EB-)) or (Xd- & Xc+ & MVa-); % QI- & (): "I do not know when" when: ((WN- or BIh-) & Cs+) or ((PF+ or TOn+ or Cs+) & (BIq- or QI- or (SFsx+ & ))) or [QI-] or QJ- or QJ+ or (Wq- & (Q+ or PF+)) or ((Cs+ or Mp+ or Mgp+ or Mv+) & (({Xd- & Xc+} & MVs-) or ({Xc+ & {Xd-}} & CO*s+) or (Xd- & Xc+ & E+))); % QI- & (): "I do not know why" why: ({EL+} & ((Wq- & Q+) or (QI- & (Cs+ or TOn+ or [()])) or (Cs+ & ((SFsx+ & ) or WY- or BIq- or QJ+ or QJ-)))) or QJ- or QJ+ or [[{@CO-} & Wc- & Wi+]]; why_not: [[{@CO-} & Wc- & Wi+]]; % QI- & (): "I do not know where" % R+ & Bsw+: "Where does it go to?" where: {EL+} & ( (Wq- & ((Rw+ & WR+) or (R+ & Bsw+) or ({Rw+} & PF+) or Q+)) or [QI-] or QJ- or QJ+ or ((WR+ or Cs+ or TOn+ or PF+) & (BIq- or QI- or (SFsx+ & ))) or ((Cs+ or PF+ or WR+) & )); whether: (((QI- or BIq-) & (Cs+ or TOn+)) or (Cs+ & SFsx+ & )) or [[(Cs+ or MV+) & (({Xd- & Xc+} & MVs-) or ({Xc+ & {Xd-}} & CO*s+))]]; whether_or_not: ((QI- or BIq-) & (Cs+ or TOn+)) or (Cs+ & (({Xd- & Xc+} & MVs-) or ({Xc+ & {Xd-}} & CO*s+))); % QI- & (): "I do not know how" how: ((((EAh+ or EEh+) & {HA+}) or H+ or AFh+) & (BIqd- or QI*d- or Wq- or Ws-)) or (Wq- & (Q+ or AF+)) or [QI-] or QJ- or QJ+ or ((Cs+ or TOn+) & (QI- or BIq- or (SFsx+ & ))); % EBy+ link is for "verbed not X but Y" not.e: EB- or ({@E-} & N-) or NT+ or EBy+ or [[((Ma+ or Mg+ or Mv+ or Mp+) & CO+) or (Mg- & Mgn+) or (Mv- & Mvn+) or (Mp- & Mp+) or (Ma- & Ma*n+)]]; % We include this, though it's not one of the strippable strings n't n’t: N- or EB-; %ADJECTIVES % Common disjuncts shared by virtually all adjectives. % Dn- & AJn+: for neither...nor constructions. : [[{@E-} & Wq- & {@MV+} & PF+ & {@MV+} & {CC+}]] or (AJra- & {@MV+}) or ({@MV+} & AJla+) or (Dn- & AJn+) or ({@E-} & {@MV+} & ([[]] or (Xd- & Xc+ & MX*a-))); % Ordinary adjectives % abject.a abnormal.a abominable.a abortive.a abrasive.a abrupt.a % "the rich and powerful": [[{DD-} & ]] : {EA- or EF+} & (({[[@Ec-]]} & {Xc+} & A+) or ((Pa- or AF+ or Ma- or MJra-) & {@MV+}) or ({@MV+} & MJla+) or AA+ or [[DD- & ]] or [[{DD-} & ]] or ); /en/words/words.adj.1: or ; HYPHENATED-WORDS.a: ({EA- or EF+} & (({[[@Ec-]]} & {Xc+} & Ah+) or (Pa- & {@MV+}))) or [[AN+]]; % "We caught a through flight", "its a done job" - adjective -- !? probably over-broad. : {EA- or EF+} & (({[[@Ec-]]} & {Xc+} & A+) or ((AF+ or Ma- or MJra-) & {@MV+}) or ({@MV+} & MJla+) or AA+ or [[DD- & ]] or [[{DD-} & ]]); done.c gone.c through.c: ; responsible.a accountable.a: {EA- or EF+} & (({[[@Ec-]]} & {Xc+} & A+) or ((Pa- or AF+ or Ma- or Vh- or MJra-) & {@MV+}) or ({@MV+} & MJla+) or AA+ or [[DD- & ]] or [[{DD-} & ]] or ); long.a: or ((Ya- or Yt-) & (Pa- or Ma- or MJra- or MJla+)) or (H- & (BT+ or Yt+)); % Hmm does distant really belong here? % "The river is a mile wide here": Ya- & Pa- & MVp+ wide.a tall.a deep.a distant.a: or (Ya- & (Pa- or Ma- or MJra- or ) & {@MV+}) or (Ya- & {@MV+} & MJla+); old.a: or (Ytm- & (Pa- or Ma- or or MJra- or MJla+)); % ??? adj-op already has MX*a- in it, why do we need a bar MX- here ? aged.i: NM+ & (Pa- or Max- or or (Xd- & MX- & Xc+) or MJra- or MJla+); % The following all have a very regular pattern, with just one variable % part, the TO TH type section. This regularity should be exploted so % simplify the expressions ... easy.a hard.a simple.a difficult.a fun.a expensive.a: {EA- or EF+} & (({[[@Ec-]]} & {Xc+} & A+) or ((Paf- or AF+ or Ma- or MJra-) & {@MV+} & {((TOt+ & B+) or TOi+) & {LE+}}) or ({@MV+} & {((TOt+ & B+) or TOi+) & {LE+}} & MJla+) or AA+ or [[DD- & ]] or [[{DD-} & ]] or ({TOt+ & B+} & )); ready.a: {EA- or EF+} & (({[[@Ec-]]} & {Xc+} & A+) or ((Pa- or AF+ or Ma- or MJra-) & {@MV+} & {((TOt+ & B+) or TO+) & {LE+}}) or ({@MV+} & {((TOt+ & B+) or TO+) & {LE+}} & MJla+) or AA+ or [[DD- & ]] or [[{DD-} & ]] or ({TO+ or (TOt+ & B+)} & )); silly.a nasty.a pleasant.a unpleasant.a dangerous.a cruel.a standard.a safe.a legal.a illegal.a: {EA- or EF+} & (({[[@Ec-]]} & {Xc+} & A+) or ((Paf- or AF+ or Ma- or MJra-) & {@MV+} & {((TOt+ & B+) or TOi+) & {LE+}}) or ({@MV+} & {((TOt+ & B+) or TOi+) & {LE+}} & MJla+) or AA+ or [[DD- & ]] or [[{DD-} & ]] or ({TOt+ & B+} & )); : {EA- or EF+} & (({[[@Ec-]]} & {Xc+} & A+) or ((Paf- or AF+ or Ma- or MJra-) & {@MV+} & {((TOt+ & B+) or THi+ or TOi+) & {LE+}}) or ({@MV+} & {((TOt+ & B+) or THi+ or TOi+) & {LE+}} & MJla+) or AA+ or [[DD- & ]] or [[{DD-} & ]] or ({TOt+ & B+} & )); good.a bad.a unusual.a useful.a a_bitch nice.a strange.a wonderful.a terrible.a possible.a impossible.a annoying.a fair.a unfair.a tough.a: ; great.a: or ; important.a essential.a crucial.a necessary.a imperative.a vital.a: or ({EA- or EF+} & (({[[@Ec-]]} & {Xc+} & A+) or ((Paf- or AF+ or Ma- or MJra-) & (({@MV+} & {(THi+ or TOi+ or TSi+) & {LE+}}) or (TOt+ & B+))) or ((({@MV+} & {(THi+ or TOi+ or TSi+) & {LE+}}) or (TOt+ & B+)) & MJla+) or AA+ or [[DD- & ]] or [[{DD-} & ]] or ({TOt+ & B+} & ))); common.a practical.a original.a normal.a helpful.a striking.a confusing.a frustrating.a disturbing.a logical.a illogical.a elegant.a efficient.a awful.a just.a unjust.a absurd.a natural.a alarming.a acceptable.a unacceptable.a deplorable.a detestable.a scary.a shocking.a poetical.a: or ({EA- or EF+} & (({[[@Ec-]]} & {Xc+} & A+) or ((Paf- or AF+ or Ma- or MJra-) & {@MV+} & {(THi+ or TOi+) & {LE+}}) or ({@MV+} & {(THi+ or TOi+) & {LE+}} & MJla+) or AA+ or [[DD- & ]] or [[{DD-} & ]] or )); surprising.a interesting.a odd.a remarkable.a amazing.a exciting.a depressing.a rare.a embarrassing.a: {EA- or EF+} & (({[[@Ec-]]} & {Xc+} & A+) or ((Paf- or AF+ or Ma- or MJra-) & {@MV+} & {(THi+ or Ci+ or TOi+) & {LE+}}) or ({@MV+} & {(THi+ or Ci+ or TOi+) & {LE+}} & MJla+) or AA+ or [[DD- & ]] or [[{DD-} & ]] or ); crazy.a sane.a insane.a stupid.a ridiculous.a wrong.a curious.a: {EA- or EF+} & (({[[@Ec-]]} & {Xc+} & A+) or ((Paf- or AF+ or Ma- or MJra-) & {@MV+} & {(TO+ or TOi+ or THi+) & {LE+}}) or ({@MV+} & {(TO+ or TOi+ or THi+) & {LE+}} & MJla+) or AA+ or [[DD- & ]] or [[{DD-} & ]] or ({TO+} & )); wise.a unwise.a smart.a intelligent.a: {EA- or EF+} & (({[[@Ec-]]} & {Xc+} & A+) or ((Paf- or AF+ or Ma- or MJra-) & {@MV+} & {(TO+ or TOi+) & {LE+}}) or ({@MV+} & {(TO+ or TOi+) & {LE+}} & MJla+) or AA+ or [[DD- & ]] or [[{DD-} & ]] or ({TO+} & )); unlikely.a: {EA- or EF+} & (({[[@Ec-]]} & {Xc+} & A+) or ((Paf- or AF+ or Ma- or MJra-) & {@MV+} & {(TOf+ or THi+ or Ci+) & {LE+}}) or ({@MV+} & {(TOf+ or THi+ or Ci+) & {LE+}} & MJla+) or AA+ or [[DD- & ]] or [[{DD-} & ]] or ({TO+} & )); likely.a: {EA- or EF+} & (({[[@Ec-]]} & {Xc+} & A+) or ((Paf- or AF+ or Ma- or MJra-) & {@MV+} & {(TOf+ or THi+ or Ci+) & {LE+}}) or ({@MV+} & {(TOf+ or THi+ or Ci+) & {LE+}} & MJla+) or AA+ or [[DD- & ]] or [[{DD-} & ]] or ({TO+} & ) or [E+]); apparent.a false.a official.a strict.a significant.a funny.a notable.a untrue.a tragic.a plain.a urgent.a a_drag a_bummer definite.a evident.a impressive.a incredible.a inevitable.a mysterious.a pathetic.a probable.a admirable.a commendable.a conceivable.a insignificant.a miraculous.a self-evident.a undeniable.a plausible.a understandable.a demonstrable.a hilarious.a improbable.a inexcusable.a outrageous.a paradoxical.a shameful.a inconceivable.a unbelievable.a astonishing.a disgraceful.a debatable.a arguable.a lamentable.a regrettable.a well-known.a: {EA- or EF+} & (({[[@Ec-]]} & {Xc+} & A+) or ((Paf- or AF+ or Ma- or MJra-) & {@MV+} & {(THi+ or Ci+) & {LE+}}) or ({@MV+} & {(THi+ or Ci+) & {LE+}} & MJla+) or AA+ or [[DD- & ]] or [[{DD-} & ]] or ); clear.a unclear.a relevant.a irrelevant.a obvious.a immaterial.a: {EA- or EF+} & (({[[@Ec-]]} & {Xc+} & A+) or ((Paf- or AF+ or Ma- or MJra-) & {@MV+} & {(THi+ or QIi+) & {LE+}}) or ({@MV+} & {(THi+ or QIi+) & {LE+}} & MJla+) or AA+ or [[DD- & ]] or [[{DD-} & ]] or ); clear.i: {EA- or EF+} & Vm- & TH+; sure.i certain.i: {EA- or EF+} & Vm- & (TH+ or TO+ or (OF+ & {@MV+})); tactful.a conventional.a advisable.a prudent.a sensible.a tactless.a polite.a impolite.a arrogant.a conceited.a obnoxious.a valuable.a reasonable.a unreasonable.a traditional.a unnecessary.a tempting.a usual.a inadvisable.a lovely.a a_mistake ethical.a unethical.a immoral.a childish.a awkward.a appropriate.a costly.a customary.a desirable.a dumb.a effective.a fashionable.a foolish.a healthy.a hip.a okay.a OK.a ok.a painful.a selfish.a sufficient.a advantageous.a boring.a inappropriate.a insufficient.a irrational.a irresponsible.a mandatory.a meaningless.a preferable.a senseless.a trivial.a wrongheaded.a premature.a risky.a dishonest.a hypocritical.a enjoyable.a idiotic.a inconvenient.a unkind.a pointless.a: {EA- or EF+} & (({[[@Ec-]]} & {Xc+} & A+) or ((Paf- or AF+ or Ma- or MJra-) & {@MV+} & {TOi+ & {LE+}}) or ({@MV+} & {TOi+ & {LE+}} & MJla+) or AA+ or [[DD- & ]] or [[{DD-} & ]] or ); unknown.a questionable.a: {EA- or EF+} & (({[[@Ec-]]} & {Xc+} & A+) or ((Paf- or AF+ or Ma- or MJra-) & {@MV+} & {QIi+}) or ({@MV+} & {QIi+} & MJla+) or AA+ or [[DD- & ]] or [[{DD-} & ]] or ); certain.a: {EA- or EF+} & (({[[@Ec-]]} & {Xc+} & A+) or ((Paf- or AF+ or Ma- or MJra-) & {@MV+} & {(Ce+ or TOf+ or TH+ or QI+ or (OF+ & {@MV+})) & {LE+}}) or ({@MV+} & {(Ce+ or TOf+ or TH+ or QI+ or (OF+ & {@MV+})) & {LE+}} & MJla+) or AA+ or [[DD- & ]] or [[{DD-} & ]] or ({Ce+ or TO+ or TH+ or QI+ or OF+} & )); sure.a unsure.a uncertain.a careful.a: {EA- or EF+} & (({[[@Ec-]]} & {Xc+} & A+) or ((Pa- or AF+ or Ma- or MJra-) & {@MV+} & {(Ce+ or TO+ or TH+ or QI+ or (OF+ & {@MV+})) & {LE+}}) or ({@MV+} & {(Ce+ or TO+ or TH+ or QI+ or (OF+ & {@MV+})) & {LE+}} & MJla+) or AA+ or [[DD- & ]] or [[{DD-} & ]] or ({Ce+ or TO+ or TH+ or QI+ or OF+} & )); % common adjectives, taking "to", "that" e.g. "was incorrect that" correct.a incorrect.a right.a excited.a disappointed.a upset.a sorry.a content.a determined.a amused.a amazed.a astonished.a astounded.a pleased.a disgusted.a distressed.a dismayed.a irritated.a embarrassed.a alarmed.a: {EA- or EF+} & (({[[@Ec-]]} & {Xc+} & A+) or ((Pa- or AF+ or Ma- or MJra-) & {@MV+} & {(TO+ or TH+) & {LE+}}) or ({@MV+} & {(TO+ or TH+) & {LE+}} & MJla+) or AA+ or [[DD- & ]] or [[{DD-} & ]] or ({TO+ or TH+} & )); glad.a fortunate.a unfortunate.a lucky.a unlucky.a happy.a sad.a surprised.a delighted.a overjoyed.a: {EA- or EF+} & (({[[@Ec-]]} & {Xc+} & A+) or ((Pa- or AF+ or Ma- or MJra-) & {@MV+} & {(Ce+ or TO+ or TH+) & {LE+}}) or ({@MV+} & {(Ce+ or TO+ or TH+) & {LE+}} & MJla+) or AA+ or [[DD- & ]] or [[{DD-} & ]] or ({Ce+ or TO+ or TH+} & )); % common adjectives, taking "to", "of", "that" e.g. "proud that" proud.a scared.a: {EA- or EF+} & (({[[@Ec-]]} & {Xc+} & A+) or ((Pa- or AF+ or Ma- or MJra-) & {@MV+} & {(TO+ or TH+ or (OF+ & {@MV+})) & {LE+}}) or ({@MV+} & {(TO+ or TH+ or (OF+ & {@MV+})) & {LE+}} & MJla+) or AA+ or [[DD- & ]] or [[{DD-} & ]] or ({TO+ or TH+ or OF+} & )); % common adjectives, taking "of" e.g. "tired of", "sick of" etc. tired.a pooped.a full.a sick.a critical.a guilty.a innocent.a typical.a capable.a contemptuous.a incapable.a reminiscent.a scornful.a mindful.a short.a appreciative.a complimentary.a born.a worthy.a free.a terrified.a unworthy.a prognostic.a dead.a: {EA- or EF+} & (({[[@Ec-]]} & {Xc+} & A+) or ((Pa- or AF+ or Ma- or MJra-) & {@MV+} & {OF+ & {@MV+}}) or ({@MV+} & {OF+ & {@MV+}} & MJla+) or AA+ or [[DD- & ]] or [[{DD-} & ]] or ({OF+ & {@MV+}} & )); fond.a: {EA- or EF+} & (({[[@Ec-]]} & {Xc+} & A+) or ((Pa- or AF+ or Ma- or MJra-) & OF+ & {@MV+}) or (OF+ & {@MV+} & MJla+) or (OF+ & )); afraid.a ashamed.a unafraid.a unashamed.a: {EA- or EF+} & (((Pa- or AF+ or Ma- or MJra-) & {@MV+} & {((OF+ & {@MV+}) or Ce+ or TH+ or TO+) & {LE+}}) or ({@MV+} & {((OF+ & {@MV+}) or Ce+ or TH+ or TO+) & {LE+}} & MJla+) or ({OF+ or Ce+ or TH+ or TO+} & )); apprehensive.a secure.a optimistic.a pessimistic.a annoyed.a confused.a offended.a insulted.a concerned.a depressed.a doubtful.a grateful.a mad.a mistaken.a hopeful.a unhappy.a: {EA- or EF+} & (({[[@Ec-]]} & {Xc+} & A+) or ((Pa- or AF+ or Ma- or MJra-) & {@MV+} & {TH+ & {LE+}}) or ({@MV+} & {TH+ & {LE+}} & MJla+) or AA+ or [[DD- & ]] or [[{DD-} & ]] or ({TH+} & )); aware.a unaware.a: {EA- or EF+} & (((Pa- or AF+ or Ma- or MJra-) & {@MV+} & {(TH+ or (OF+ & {@MV+})) & {LE+}}) or ({@MV+} & {(TH+ or (OF+ & {@MV+})) & {LE+}} & MJla+) or AA+ or [[DD- & ]] or [[{DD-} & ]] or ({TH+ or OF+} & )); true.a conscious.a confident.a skeptical.a jealous.a suspicious.a envious.a desirous.a convinced.a unconvinced.a: {EA- or EF+} & (({[[@Ec-]]} & {Xc+} & A+) or ((Pa- or AF+ or Ma- or MJra-) & {@MV+} & {(TH+ or (OF+ & {@MV+})) & {LE+}}) or ({@MV+} & {(TH+ or (OF+ & {@MV+})) & {LE+}} & MJla+) or AA+ or [[DD- & ]] or [[{DD-} & ]] or ({TH+ or OF+} & )); eager.a reluctant.a able.a unable.a impatient.a eligible.a brave.a anxious.a apt.a desperate keen.a prepared.a willing.a hesitant.a: {EA- or EF+} & (({[[@Ec-]]} & {Xc+} & A+) or ((Pa- or AF+ or Ma- or MJra-) & {@MV+} & {TO+ & {LE+}}) or ({@MV+} & {TO+ & {LE+}} & MJla+) or AA+ or [[DD- & ]] or [[{DD-} & ]] or ({TO+} & )); former.a: A+ or G+ or (DG- & ); latter.a: DG- & ; overall.a onetime.a outboard.a pinstripe.a goddam.a de_facto de_jure erstwhile.a foster.a outright.a online.a: A+; pro_forma ad_hoc bona_fide: A+ or Pa-; a_priori a_posteriori: A+ or MVa- or ({Xc+ & {Xd-}} & CO+); asleep.a awake.a alike.a alive.a ablaze.a adrift.a afire.a aflame.a afloat.a afoot.a aghast.a aglow.a agog.a ajar.a amiss.a askew.a astir.a awash.a awry.a de_rigeur rife.a fraught.a lacking.a: ((Ma- or Pa- or MJra-) & {@MV+}) or ({@MV+} & MJla+) or ; alone.a: ((Ma- or Pa- or MJra-) & {@MV+}) or ({@MV+} & MJla+) or or MVp- or E+; outstanding.a available.a: {EA- or EF+} & (({[[@Ec-]]} & {Xc+} & A+) or ((Pa- or AF+ or Max- or MJra-) & {@MV+}) or ({@MV+} & MJla+) or AA+ or [[DD- & ]] or [[{DD-} & ]] or ); due.i effective.i: (TY+ or JT+) & ; north.a south.a east.a west.a northeast.a northwest.a southeast.a southwest.a: or A+ or ({Yd-} & {OF+} & (Pp- or MVp- or Mp- or (Xc+ & Xd- & (MVx- or MX*x-)))) or [[DD- & ]]; northern.a southern.a eastern.a western.a northeastern.a northwestern.a southeastern.a southwestern.a: or A+ or G+; % ------------------------------------------------------------------------- %COMPARATIVES AND SUPERLATIVES more: ({ECa-} & (EAm+ or EEm+ or [MVm-] or [EB*m-] or Qe+ or Ca+ or AJrc- or AJlc+)) or ({OF+} & (({ECn-} & (Dmum+ or (Ss+ & ) or Bsm+)) or ({ECx- or ND-} & (Dmcm+ or (Sp+ & ) or Bpm+)) or ({ECn- or ECx- or ND-} & (Om- or Jm- or (Xd- & MVt+ & Xc+ & MX*m-))))) or (DG- & (({MVa+} & Cs+) or B+ or Dm*w+ or EA+) & (ER- or (Wd- & Xc+ & ER+))); more_of_a more_of_an: Ds*m+; less: ({ECn-} & (Dmum+ or Om- or Jm- or (Ss+ & ) or Bsm+)) or ({ECa-} & (EAm+ or EEm+ or [MVm-] or [EB*m-] or AJrc- or AJlc+)) or (DG- & (({MVa+} & Cs+) or B+ or Dm*w+ or EA+) & (ER- or (Wd- & Xc+ & ER+))); fewer: ({ECn-} & (Dmcm+ or Om- or Jm- or (Sp+ & ) or AJrc- or AJlc+)) or (DG- & Dm*w+ & (ER- or (Wd- & Xc+ & ER+))); farther: ({ECa-} & {K+} & (MVb- or Qe+ or Ca+ or AJrc- or AJlc+)) or A+; further.r: ({ECa-} & {K+} & (MVb- or Qe+ or Ca+ or AJrc- or AJlc+)) or A+ or E+ or ({Xd-} & Xc+ & CO+); % links to adverbs on left.. % Hmm, probably want to give EAy a cost, to avoid its use in % "William is described as smooth, yet thoughtful" as.e-y: {EZ-} & ((EAy+ & {HA+}) or EEy+ or AM+); % uses comparative links as.e-c: (MVz- & (((O*c+ or S**c+ or ({SFsic+} & Zc+)) & {Mp+}) or Mpc+ or Cc+)) or (MVzo- & Ct+ & Bc+ & {U+}) or (MVzp- & (CX+ or CQ+)) or (MVza- & Cta+ & ((AFd+ & {Pa+}) or PFc+)); % prepositional, mostly as.e: ((J+ or Mp+ or TI+ or ({SFsic+} & Zs+)) & (({Xc+ & {Xd-}} & CO+) or ({Xd- & Xc+} & MVp-))) or (Cs+ & (({Xc+ & {Xd-}} & CO+) or ({Xd- & Xc+} & MVs-))) or ((J+ or Mp+ or BIt+) & ([Mp-] or (Xd- & Xc+ & MX*x-))) or (AZ- & Pa+) or [[(PFc+ or CQ+) & ({Xd- & Xc+} & MVs-)]]; as_possible: MVz-; as_expected as_reported as_imagined as_suspected as_anticipated as_predicted as_realized as_proposed as_intended as_supposed as_hypothesized as_hypothesised as_discussed as_established as_compared as_determined as_measured as_assessed as_demonstrated as_evidenced as_indicated as_revealed as_judged as_detected as_opposed as_observed as_defined as_reflected as_evaluated as_suggested as_monitored as_described as_confirmed as_assayed as_estimated as_analyzed as_identified as_deduced as_documented as_related as_studied as_inferred as_exemplified as_used as_expressed as_visualized as_tested as_manifested as_illustrated as_applied as_mediated as_characterized as_affected as_examined as_ascertained as_quantified as_influenced as_represented as_marked as_induced as_concluded as_calculated as_verified as_required as_recognized as_probed as_presented as_obtained as_needed as_indexed as_derived as_based as_analysed as_supported as_restricted as_recorded as_recommended as_quantitated as_produced as_postulated as_noted as_caused as_summarized as_prepared as_outlined as_occurred as_modified as_localized as_involved as_implied as_gauged as_exhibited as_encountered as_displayed as_contained as_catalyzed as_advocated as_achieved: MVz- or (({Xc+ & {Xd-}} & CO+) or ({Xd- & Xc+} & MVs-)); % MODIFIED 'THAN' so that it links to the clause following it % using 'C' links -- like a relative clause than: (MVt- & (((O*c+ or ({SFsic+} & Zc+) or U*c+) & {Mp+}) or Mpc+ or S**c+ or MVat+ or MVpt+ or Cc+ or Pafc+)) or ((MVta- or LE-) & Cta+ & ((AFd+ & {Pa+}) or PFc+)) or ((MVti- or LEi-) & AFdi+ & {Pa+}) or (((LE- & {AFd+}) or (LEi- & {AFdi+})) & (THc+ or TOic+ or TOfc+ or (TOtc+ & B+))) or (((MVto- & Ct+ & Bc+ & {U+}) or (MVtp- & (CX+ or CQ+))) & {Mp+}); % cost on MVa-: "we will arrive much sooner", want "much" to modify "sooner". much: ({EE-} & ([[MVa-]] or ECa+ or Ca+ or Qe+)) or ({EEx- or H-} & (ECn+ or Dmu+ or ( & ( or Bsm+)))) or (AM- & (Dmuy+ or MVy- or Oy- or Jy- or EB*y-)); slightly somewhat: EC+ or EA+ or MVa- or Em+; far.c infinitely: EC+; significantly substantially: ({EE- or EF+} & (EC+ or E+ or MVa- or ({Xc+ & {Xd-}} & CO+))) or ({EE-} & EB-); % comparative adjectives % angrier.a balder.a balmier.a baser.a bawdier.a bigger.a blacker.a : ({ECa-} & (((Pam- or Mam- or AFm+ or AJrc-) & {@MV+}) or ({[[@Ec-]]} & {Xc+} & Am+) or AJlc+)) or (DG- & (TR+ or AF+) & {@MV+} & (ER- or (Wd- & Xc+ & ER+))); /en/words/words.adj.2: ; easier.a-c: ({ECa-} & (({[[@Ec-]]} & {Xc+} & Am+) or ((Pafm- or AFm+ or Mam- or AJrc-) & {@MV+} & {((TOt+ & B+) or TOi+) & {LE+}}) or AJlc+)) or (DG- & (TR+ or AF+) & {@MV+} & {(TOt+ & B+) or TOi+} & (ER- or (Wd- & Xc+ & ER+))); harder.a-c: ({ECa-} & (({[[@Ec-]]} & {Xc+} & Am+) or ((Pafm- or AFm+ or Mam- or AJrc-) & {@MV+} & {((TOt+ & B+) or TOi+) & {LE+}}) or MVb- or AJlc+)) or (DG- & (TR+ or AF+) & {@MV+} & {(TOt+ & B+) or TOi+} & (ER- or (Wd- & Xc+ & ER+))); higher.a-c deeper.a-c lower.a-c faster.a-c quicker.a-c: ({ECa-} & (((Pam- or AFm+ or Mam- or AJrc-) & {@MV+}) or ({[[@Ec-]]} & {Xc+} & Am+) or MVb- or Qe+ or Ca+ or AJlc+)) or (DG- & (TR+ or AF+ or Cs+) & {@MV+} & (ER- or (Wd- & Xc+ & ER+))); sooner.a-c: ({ECa- or Yt-} & (((Pam- or AFm+ or Mam- or AJrc-) & {@MV+}) or ({[[@Ec-]]} & {Xc+} & Am+) or MVb- or Qe+ or Ca+ or AJlc+)) or (DG- & (TR+ or AF+ or Cs+) & {@MV+} & (ER- or (Wd- & Xc+ & ER+))); longer.a-c: ({ECa- or Yt-} & (((Pam- or AFm+ or Mam- or AJrc-) & {@MV+}) or ({[[@Ec-]]} & {Xc+} & Am+) or MVb- or Qe+ or Ca+ or OT- or FL- or AJlc+)) or (DG- & (TR+ or AF+ or Cs+) & {@MV+} & (ER- or (Wd- & Xc+ & ER+))); smarter.a-c nicer.a-c worse.a-c: ({ECa-} & (({[[@Ec-]]} & {Xc+} & Am+) or ((Pafm- or AFm+ or Mam- or AJrc-) & {@MV+} & {(TOi+ or THi+) & {LE+}}) or AJlc+)) or (DG- & (TR+ or AF+) & {@MV+} & {TOi+ or THi+} & (ER- or (Wd- & Xc+ & ER+))); better.a-c: ({ECa-} & (({[[@Ec-]]} & {Xc+} & Am+) or ((Pafm- or AFm+ or Mam- or AJrc-) & {@MV+} & {(TOi+ or THi+) & {LE+}}) or MVb- or E+ or Qe+ or Ca+ or AJlc+)) or (DG- & (TR+ or AF+) & {@MV+} & {TOi+ or THi+} & (ER- or (Wd- & Xc+ & ER+))); different.a: ({ECa- or EA- or EF+} & (({[[@Ec-]]} & {Xc+} & Am+) or ((Pafm- or AFm+ or Mam- or AJrc-) & {@MV+}) or AA+ or [[DD- & ]] or )); than_expected than_imagined than_proposed than_suspected than_realized than_intended than_supposed than_reported than_ever than_usual than_normal than_suggested than_anticipated than_recommended: MVt-; more_than no_more_than fewer_than less_than as_many_as an_estimated an_additional up_to as_much_as no_fewer_than no_less_than greater_than: EN+; at_least: EN+ or CO+ or [[{Xd- & Xc+} & MVa-]] or EB-; % This is not quite right, since there may be other words in between % "all ... but": "All was lost but for one tree." % "Everything but one tree remained." % nothing_but all_but: EN+ or E+; all_but: EN+ or E+; nothing_but: Vd- & I+; % -------------------------------------------------------------------------- % superlative adjectives % angriest.a baldest.a balmiest.a basest.a bawdiest.a biggest.a : ({Xc+} & {NR-} & {[[@Ec-]]} & La-) or ({NR- or ND-} & DD- & & {TOn+} & ) or AJrs- or AJls+; /en/words/words.adj.3: ; favorite.a favourite.a: or ({Xc+} & {[[@Ec-]]} & [[Lf-]]) or ([[Ds-]] & & {TOn+} & ); sole.a main.a: {Xc+} & {NR-} & {[[@Ec-]]} & L-; same.a own.a: ({Xc+} & {NR-} & {[[@Ec-]]} & La-) or (DD- & & {TOn+} & ); the_same: {EZ-} & (D**y+ or Oy- or Jy- or MVy-); next.a: ({Xc+ & {Xd-}} & CO+) or MVp- or DTi+ or NR+ or ({Xc+} & {[[@Ec-]]} & L-) or (DD- & & {TOn+} & ); past.a previous.a: ({[[@Ec-]]} & {Xc+} & A+) or L- or (Pa- & {@MV+}); following.a remaining.a top.i: L-; hardest.a easiest.a: ({Xc+} & {NR-} & {[[@Ec-]]} & La-) or ({NR- or ND-} & DD- & & {TOt+ & B+} & ) or AJrs- or AJls+; worst.a longest.a fastest.a furthest.a farthest.a: ({Xc+} & {NR-} & {[[@Ec-]]} & La-) or ({NR- or ND-} & DD- & (( & {TOn+} & ) or MVa-)) or AJrs- or AJls+; % "he likes you best of all" has no determiner, just uses MVa-. best.a: ({Xc+} & {NR-} & {[[@Ec-]]} & La-) or ({NR- or ND-} & DD- & (( & {TOn+} & ) or (MVa- & {Mp+}))) or [[E+]] or [MVa- & {Mp+}] or AJrs- or AJls+; % =========================================================================== %ADVERBS %ADVERBS WHOSE MAIN USE IS ADJECTIVAL far_from: {EE-} & EA+; a_bit a_little_bit a_little_while: ({EE-} & EA+) or EC+ or EE+ or ({Xd- & Xc+} & MVa-) or ; % pretty.e extremely very_very very_very_very exceptionally unbelievably incurably extraordinarily jolly.e mighty.e damn.e exceedingly overly downright plumb vitally abundantly chronically frightfully genuinely humanly patently singularly supremely unbearably unmistakably unspeakably awfully decidedly demonstrably fashionably frighteningly horrifyingly indescribably intolerably laughably predominantly unalterably undisputedly unpardonably unreasonably unusually hugely infernally: ({EE-} & EA+) or EE+; notoriously.e: ({EE-} & EA+) or EE+ or Em+; % Adverbs whose main use is adjectival, but can be used with % adverbs such as "faster", "dumber", etc. % "That one is marginally better". (thus EBm+) % "It's an inherently better method" thus E+ link fabulously incomparably inherently marginally moderately relatively ridiculously unacceptably unarguably undeniably unimaginably: ({EE-} & EA+) or EE+ or ({EE-} & EBm-) or E+; wide.e: EE+; very.e way.e: ({EE-} & EA+) or EE+ or [[La-]]; real.e: [[EA+ or EE+]]; quite: ({EE-} & EA+) or EE+ or EZ+ or [[Em+]]; amazingly strangely incredibly: ({EE-} & EA+) or EE+ or ({Xd- & Xc+} & Em+) or ({Xc+ & {Xd-}} & CO+) or EBm- or (Xd- & Xc+ & MVa-); rather: EA+ or EE+ or Vw- or ({Xc+ & {Xd-}} & CO+); particularly: EA+ or EE+ or Em+ or EB- or (MVl- & (MVp+ or MVa+ or MVs+)) or ({Xc+ & {Xd-}} & CO+); notably: EB- or EA+ or EE+ or ({Xc+ & {Xd-}} & CO+); almost nearly: EA+ or EE+ or EN+ or EZ+ or Em+ or EBm-; just_about: Em+ or EN+ or EZ+ or EA+; entirely reasonably highly fairly totally completely terribly: EA+ or EE+ or ({EE- or EF+} & (({Xd- & Xc+} & MVa-) or Em+ or Qe+ or Ca+)); absolutely: EA+ or EE+ or EBm- or ({EE- or EF+} & (({Xd- & Xc+} & MVa-) or Em+ or Qe+ or Ca+)); % allowing as opener also altogether equally: EA+ or EE+ or ({EE- or EF+} & (({Xd- & Xc+} & MVa-) or Em+ or Qe+ or Ca+)) or ({Xc+ & {Xd-}} & CO+); really: EA+ or EE+ or Em+ or EBm-; surprisingly: EA+ or EE+ or ({Xc+ & {Xd-}} & CO+) or ({Xd- & Xc+} & E+) or (Xd- & Xc+ & MVa-); especially: EA+ or EE+ or EB- or Em+ or (MVl- & (MVp+ or MVa+ or MVs+)) or ({Xc+ & {Xd-}} & CO+); virtually: EA+ or EE+ or EN+ or EZ+ or Em+; wholly fully critically greatly grossly duly unduly: EA+ or ({EE- or EF+} & (({Xd- & Xc+} & MVa-) or Em+ or Qe+ or Ca+)); seemingly utterly: EA+ or Em+; barely scarcely hardly merely truly practically: Em+ or EBm- or EA+; partly.e largely.e mostly.e chiefly.e simply.e1 purely.e solely.e: Em+ or EA+ or EB- or (MVl- & (MVp+ or MVa+ or MVs+)); % "It sure is great" sure.ee: Em+; more_and_more less_and_less more_or_less: Em+; % Adverbs like "biochemically". These tend to answer the question "how?" % with a noun-form (as opposed to being verb-derived) A lot of these are % of the "-ically" form /en/words/words.adv.3: EA+ or ({Xd- & Xc+} & (E+ or MVa-)) or EBm- or ({{Xd-} & Xc+} & CO+); in_part: EB- or (MVl- & (MVp+ or MVa+ or MVs+)); % academically administratively aesthetically %ADVERBS WHOSE ONLY (MAIN) USE IS POST_VERBAL barefoot.e willy-nilly quarterly.e madly.e outright.e staccato.e legato.e all_the_way all_the_time anymore.e aloud.e upwards.e downwards.e upward.e downward.e inward.e outward.e inwards.e outwards.e anytime.e live.e wholesale.e anew.e forever.e awhile.e aback.e afoul.e afresh.e aloft.e amok.e amuck.e onstage.e apiece.e askance.e astern.e asunder.e inter_alia mutatis_mutandis par_excellence upside-down.e ab_initio ad_infinitum ad_lib ad_libitum ad_nauseum en_masse aground.e astray.e into_account into_effect to_market to_bid from_scratch to_office for_office for_good at_once to_normal to_bed to_town into_office in_advance to_trial by_lot in_stride by_credit_card by_ear by_foot in_kind en_masse to_mind in_mind in_pencil in_pen to_scale for_trial all_right full_time part_time by_proxy: {Xd- & Xc+} & MVa-; % Adjectives that appear post-verbally e.g. "she wiped the table dry" % "we will arrive exhausted" % comparative link *must* have EE- to "more", "less" % These are more or less adverbs ... dry.e flat.e blind.e tired.e refreshed.e fresh.e exhausted.e rejuvenated.e: ({EE- or EF+ } & (MVa- or AJra- or AJla+)) or (EE- & (AJrc- or AJlc+)); wild.e rampant.e shut.e tight.e open.e loud.e hot.e cold.e free.e: {EE- or EF+} & (({Xd- & Xc+} & MVa-) or Ca+); hard.e wrong.e: {EE- or EF+} & (({Xd- & Xc+} & MVa-) or Qe+ or Ca+); early.e late.e: {EE- or EF+} & (({Xd- & Xc+} & MVa-) or TA+ or Qe+ or Ca+); far.e: {EE- or EF+} & (({Xd- & Xc+} & MVa-) or Ca+ or Qe+ or Yd+); yet.e: ({Xd- & Xc+} & MVa-) or EBm-; %ADVERBS USABLE POST-VERBALLY OR PRE-VERBALLY properly.e: ({Xd- & Xc+} & MVa-) or Em+; finely specially literally heavily alternately severely dearly voluntarily dramatically flatly purposely jointly narrowly universally thickly widely: {EE- or EF+} & (({Xd- & Xc+} & MVa-) or Em+ or Qe+ or Ca+ or [[EA+]]); respectively: ({Xd- & Xc+} & MVa-) or ({Xd- & Xc+} & E+) or ({Xd- & Xc+} & EB-); long.e: E+ or ({EE- or EF+} & (({Xd- & Xc+} & MVa-) or OT- or FL- or Yt+)); daily.e nightly.e weekly.e monthly.e yearly.e hourly.e partially: ({Xd- & Xc+} & MVa-) or E+ or EB-; exactly.e: E+ or ({Xd- & Xc+} & MVa-) or EB- or EN+ or EZ+; well.e: ({EE- or EF+} & (({Xd- & Xc+} & MVa-) or Qe+ or Ca+ or [E+])) or [{EA- or EF+} & (Pa- or AF+)] or Yd+; roughly approximately: EA+ or ({EE- or EF+} & (EN+ or EZ+ or ({Xd- & Xc+} & MVa-) or E+)) or ({Xc+ & {Xd-}} & CO+); together: ({Xd- & Xc+} & MVa-) or E+ or K- or [Mp-] or ({Xc+ & {Xd-}} & CO+); definitely: {EE-} & (E+ or EB- or (Xd- & Xc+ & MVa-)); by_far: EB- or E+ or MVa-; hereby thereby reputedly: E+ or ({Xd- & Xc+} & EB-) or ({Xc+ & {Xd-}} & CO+); %ADVERBS USABLE POST-VERBALLY, PRE-VERBALLY, OR AS OPENERS initially already somehow again once_again nowadays sometimes nevertheless nonetheless at_first at_best at_present of_late indeed: ({Xd- & Xc+} & MVa-) or E+ or ({Xc+ & {Xd-}} & CO+) or EBm-; twice.e: ({Xd- & Xc+} & MVa-) or E+ or ({Xc+ & {Xd-}} & CO+) or EBm- or or ({EN-} & EZ+); hence: (Yt- & ({Xd- & Xc+} & MVa-)) or E+ or ({Xc+ & {Xd-}} & CO+) or EBm-; otherwise formerly lately: ({Xd- & Xc+} & MVa-) or E+ or ({Xc+ & {Xd-}} & CO+) or EB-; also.e: ({Xd- & Xc+} & (E+ or MVa-)) or ({Xc+ & {Xd-}} & CO+) or EB-; gradually.e sadly.e broadly.e clearly.e annually.e characteristically.e comparatively.e confidentially.e currently.e fundamentally.e hypothetically.e ironically.e justifiably.e momentarily.e mercifully.e nominally.e ominously.e periodically.e precisely.e realistically.e simultaneously.e subsequently.e superficially.e thankfully.e unofficially.e effectively.e traditionally.e briefly.e eventually.e ultimately.e mysteriously.e naturally.e oddly.e plainly.e truthfully.e appropriately.e simply.e2: {EE- or EF+} & (({Xd- & Xc+} & (MVa- or E+)) or ({Xc+ & {Xd-}} & CO+) or EB- or Qe+ or Ca+ or [[EA+]]); occasionally.e often.e specifically.e generally.e originally.e: {EE- or EF+} & (({Xd- & Xc+} & (MVa- or E+)) or ({Xc+ & {Xd-}} & CO+) or EB- or Qe+ or Ca+); % ordinary manner adverbs % abjectly ably abnormally abortively abruptly absent-mindedly absently : {EE- or EF+} & (({Xd- & Xc+} & MVa-) or Em+ or ({Xc+ & {Xd-}} & CO+) or Qe+ or Ca+ or or [[EA+]]); /en/words/words.adv.1: ; /en/words/words-medical.adv.1: ; % words.adv.4 contains "prepositional" adverbs, e.g. lingually % meidally subdermally ... Right now we treat these as ordinary % adverbs, and add the Pp- link .. but is this link actually used % anywhere? /en/words/words.adv.4: or Pp-; differently: {EE- or EF+} & (({MVp+} & {Xd- & Xc+} & MVa-) or Em+ or ({MVp+} & {Xc+ & {Xd-}} & CO+) or Qe+ or Ca+ or [[EA+]]); independently: {EE- or EF+} & (({(MVp+ or OF+)} & {Xd- & Xc+} & MVa-) or Em+ or ({(MVp+ or OF+)} & {Xc+ & {Xd-}} & CO+) or Qe+ or Ca+ or [[EA+]]); shortly: {EE- or EF+} & (({Xd- & Xc+} & MVa-) or E+ or EI+ or ({Xc+ & {Xd-}} & CO+) or Qe+ or Ca+); immediately stat.e: ({Xd- & Xc+} & MVa-) or E+ or EI+ or ({Xc+ & {Xd-}} & CO+) or EB-; soon: ({EE- or EF+} & (({Xd- & Xc+} & MVa-) or E+ or EI+ or ({Xc+ & {Xd-}} & CO+) or EB- or Qe+ or Ca+)) or ({EA- or EF+} & (Pa- or AF+)); certainly possibly probably importantly remarkably interestingly: {EE-} & (E+ or (Xd- & Xc+ & (E+ or MVa-)) or ({Xc+ & {Xd-}} & CO+) or ({Xc+ & {Xd-}} & EB-)); /en/words/words.adv.2: % ordinary clausal adverbs E+ or (Xd- & Xc+ & (E+ or MVa-)) or ({Xc+ & {Xd-}} & CO+) or EBm-; % absurdly actually additionally admittedly allegedly alternatively % These are taken from words.adv.2 and allowed EB- when separated by % commas. however.e consequently.e moreover.e potentially.e conversely.e finally.e actually.e thusly.e: E+ or (Xd- & Xc+ & (E+ or MVa-)) or ({Xc+ & {Xd-}} & CO+) or ({Xc+ & {Xd-}} & EBm-); % TODO: "similarly" and "differently" get very different linking requirements. % see if these should be made the same. similarly.e: ({MVp+} & {Xd- & Xc+} & (E+ or MVa-)) or ({MVp+} & {Xc+ & {Xd-}} & CO+) or ({Xc+ & {Xd-}} & EBm-); not_suprisingly if_nothing_else: E+ or (Xd- & Xc+ & (E+ or MVa-)) or ({Xc+ & {Xd-}} & CO+) or EBm-; though.e: (Xd- & Xc+ & (E+ or MVa-)) or ({Xc+ & {Xd-}} & CO+); still.e presumably undoubtedly evidently apparently usually typically perhaps: E+ or (Xd- & Xc+ & (E+ or MVa-)) or ({Xc+ & {Xd-}} & CO+) or EB-; in_fact of_course in_effect for_example for_instance e.g. i.e. : E+ or (Xd- & Xc+ & (E+ or MVa-)) or ({Xc+ & {Xd-}} & CO+) or (EB- & {Xc+}) or (Xd- & EB- & Xc+) or ({Xd-} & CC- & Wd+); % ADVERBS USABLE POST_VERBALLY OR AS OPENERS % Note that similar interjective openers will be given COp+ links % by the UNKNOWN-WORD.a rule -- "Umm, I think he did it." no.e nope.e nah.e no_way yes.e yeah.e yep.e yup.e ok.e okay.e OK.e fine.e sure.e whatever.e someday.e sometime.e thereafter.e anyhow.e anyway.e overall.e afterwards.e afterward.e lengthwise.e worldwide.e nationwide.e statewide.e world-wide.e nation-wide.e state-wide.e industrywide.e instead.e prima_facie before_long by_hand by_car by_plane by_boat by_bus by_train by_phone by_telephone in_person at_long_last on_cue on_arrival by_request in_total in_turn over_and_over time_and_again later_on for_now day_by_day day_after_day step_by_step one_by_one for_sure for_certain even_so more_often_than_not all_of_a_sudden: ({Xd- & Xc+} & MVa-) or ({Xc+ & {Xd-}} & CO+); % Openers to directives, commands (Ic+ connection to infinitives) % or single-word interjections. These are semantically important, % so they've got to parse! no.ij nope.ij nah.ij no_way yes.ij yeah.ij yep.ij yup.ij ok.ij okay.ij OK.ij fine.ij exactly.ij sure.ij whatever.ij hah.ij hey.ij well.ij: Wi- or ; % Openers to directives, commands (Ic+ connection to infinitives) anyhow.ij anyway.ij afterwards.ij afterward.ij instead.ij by_hand by_car by_plane by_boat by_bus by_train by_phone by_telephone in_person at_long_last on_cue on_arrival by_request in_total in_turn over_and_over later_on for_now day_by_day day_after_day step_by_step one_by_one for_sure for_certain even_so more_often_than_not all_of_a_sudden: ; % sort-of-like given names ... stop.misc-inf sir.misc-inf madam.misc-inf ma'am: ; high.e deep.e low.e: {EE- or EF+} & (({Xd- & Xc+} & MVa-) or ({Xc+ & {Xd-}} & CO+) or Ca+ or Qe+); left.e right.e straight.e: ({EE- or EF+} & (({Xd- & Xc+} & MVa-) or ({Xc+ & {Xd-}} & CO+) or Qe+ or Ca+)) or (Kx- & Ky+) or (Pp- & Pp+); short.e: {Yd- or EE- or EF+} & {OF+} & ({Xd- & Xc+} & MVa-); %ADVERBS USABLE ONLY PRE-VERBALLY (OR PRE-/OPENER) newly: E+; rightly: {EE-} & E+; necessarily no_longer: E+ or EBm-; ever: E+ or EBm- or EC+ or MVa-; never.e always: {EN-} & (E+ or EB-); seldom rarely.e: {EE-} & (E+ or EB-); % MVa-: "He did just what you asked." just.e: E+ or EB- or (MVl- & (MVa+ or MVp+ or MVs+)) or EN+ or EZ+ or MVa-; maybe: CO+; meantime.e secondly thirdly in_brief in_short in_sum in_essence: ({Xd- & Xc+} & E+) or ({Xc+ & {Xd-}} & CO+); furthermore: ({Xd- & Xc+} & E+) or ({Xc+ & {Xd-}} & CO+) or EB-; mainly primarily: E+ or ({Xc+ & {Xd-}} & CO+) or EB- or (MVl- & (MVa+ or MVp+ or MVs+)); only: La- or E+ or EN+ or EB- or (MVl- & (MVp+ or MVa+ or MVs+)) or MVa- or (Rnx+ & ) or (MVp+ & Wq- & Q+); never.i at_no_time not_once rarely.i since_when: {MVp+} & Wq- & Q+ & {CC+}; not_since: (J+ or Cs+) & Wq- & Q+ & {CC+}; even.e: E+ or EC+ or EB- or ((MVp+ or MVa+ or MVs+) & (MVl- or ({Xc+ & {Xd-}} & CO+))) or (Rnx+ & ); not_even: Rnx+ & ; too: {ECa-} & (EA+ or EE+ or ({Xd- & Xc+} & MVa-) or (Xd- & Xc+ & E+)); so: (EAxk+ & {HA+}) or ({EZ-} & EExk+) or ((({Xd-} & CC-) or ({Xc+} & Wc-)) & (Wd+ or Qd+ or Ws+ or Wq+)) or (Wq- & (PF+ or CQ+)) or O- or Js-; % original % sufficiently: {EE-} & (EAxk+ or EExk+ or MVak-); % modified sufficiently: {EE-} & (EAxk+ or EExk+ or ({Xd- & Xc+} & MVa-) or E+); so_that such_that: Cs+ & {Xd- & Xc+} & MVs-; % much like an ordinary adverb, except even more commas allowed % please.e: ; please.e: {EE- or EF+} & (({Xd- & Xc+} & MVa-) or ({Xc+ & {Xd-}} & (Em+ or CO+)) or Qe+ or Ca+ or [[EA+]]); % polite command verb please.w thank_you: {Ic-} & Wi- & {{Xc+} & Vv+}; % MISCELLANEOUS WORDS AND PUNCTUATION etc: {Xi-} & Xd- & Xc+ & (MX- or MVa-); so_on the_like vice_versa v.v.: ( & ) or or (( or or or ) & {@MV+}) or M- or MV-; % Assorted interjections, treat like unknown adjectives. er err.ij errr um.ij umm uh uhh oh.ij ohh ooo woo_hoo gee gosh wow.ij ah ahh eh ehh hmm hmmm hoo zowie goody.ij jeepers Jee-sus hubba Kee-reist oops amen huh howdy dammit whammo shucks.ij heck anyways honey.ij golly man.ij baby.ij hush.ij sonuvabitch aw aww awww oh_great oh_wow emoticonID0 emoticonID1 emoticonID2 emoticonID3 emoticonID4 emoticonID5 emoticonID6 emoticonID7 emoticonID8 emoticonID9 emoticonID10 emoticonID11 emoticonID12 emoticonID13 emoticonID14 emoticonID15 emoticonID16 emoticonID17 emoticonID18 emoticonID19 emoticonID20 emoticonID21 emoticonID22 emoticonID23 emoticonID24 emoticonID25 emoticonID26 emoticonID27 emoticonID28 emoticonID29 emoticonID30 emoticonID31 emoticonID32 emoticonID33 emoticonID34 emoticonID35 emoticonID36 emoticonID37 emoticonID38 emoticonID39 emoticonID40 emoticonID41 emoticonID42 emoticonID43 emoticonID44 emoticonID45 emoticonID46 emoticonID47 emoticonID48 emoticonID49 emoticonID50 emoticonID51 emoticonID52 emoticonID53 emoticonID54 emoticonID55 emoticonID56 emoticonID57 emoticonID58 emoticonID59: or ({{Ic-} & [[Wi-]]} & {{Xd-} & Xc+} & Ic+); ".": ((Xp- or ({@Xca-} & Xc-)) & RW+) or Xi-; "!" "?": ((Xp- or ({@Xca-} & Xc-)) & RW+) or ({@Xca-} & Xq+); : {@Xca-} & Xx- & (W+ or Qd+) & {Xx+}; ";": ; % comma, as a conjunction -- "They taste bitter, not sweet" % Give MVa a cost, so that Pa is used preferentially, if possible. : ((AJla- & EBx+ & AJra+) & (Pa- or [[MVa-]])) or (AJla- & AJra+ & AJla+); : (RJlv- & RJrv+ & RJlv+); % sometimes comma is used as if it were a semicolon % Allow post-comma adverbial modifiers, but discourage these % because the modifier my be long to a following phrase. % e.g. "The blah, soon to be blah, will be blah." should not % get an EBx link to "soon". % XXX the correct solution to this is to add a new domain rule ! XXX % % Comma can conjoin nouns only if used in a list of 3 or more items: % "This, that and the other thing" % However, this is given a cost, so that geographic names are prefered: % "He went to Gaeta, Italy, and to Paris, France." % ",": ({@Xca- or [[[@Xc-]]]} & (({[EBx+]} & Xd+) or Xc-)) or [[]] or or or or [[SJl- & SJr+ & SJl+]] or (SJn- & SJr+ & SJn+); "…" ":.j" "•": ({@Xca-} & ((Xx- & (W+ or J+ or Qd+ or TH+ or TOn+) & {Xx+}) or Xe-)); % The percent sign following a number % Also -- see above, for handling of 12ft. 12in. not just 12% "%": (ND- & {DD-} & & ) or (ND- & (OD- or AN+)); % See also /en/words/currency for curency names that follow a number. $ USD.c US$.c C$.c AUD.c AUD$.c HK.c HK$.c £ ₤ € ₳ ฿ ¢ ₵ ₡ ₢ ₫ ₣ ₴ ₭ ℳ ₥ ₦ ₧ ₰ ₨ ₪ ৳ ₮ ₩ ¥ 호점 † †† ‡ § ¶ © № "#": NM*x+ & (AN+ or NM*y- or [[G+]] or (NIfu+ or NItu-) or ({EN- or NIc- or [[A- & NSa-]]} & {@MX+} & (OD- or ({DD-} & {[[@M+]]} & ( or or [[(Ss+ & ) or SIs-]]))))); "&": G- & {Xd- & G-} & G+; "’" "'": YP- & (({AL-} & {@L+} & (D+ or DD+)) or [[]] or DP+); "'s.p" "’s.p": YS- & (({AL-} & {@L+} & (D+ or DD+)) or [[]] or DP+); % lparen, rparen, etc. is to be generated by the entity detector, and % substituted, at will. This helps avoid screw-ups in the constituent % tree, and in other places where things can get wrecked by raw % punctuation. % lparenID0 lparenID1 lparenID2 lparenID3 lparenID4 lparenID5 lparenID6 lparenID7 lparenID8 lparenID9 lparenID10 lparenID11 lparenID12 lparenID13 lparenID14 lparenID15 lparenID16 lparenID17 lparenID18 lparenID19 lparenID20 lparenID21 lparenID22 lparenID23 lparenID24 lparenID25 lparenID26 lparenID27 lparenID28 lparenID29 lparenID30 lparenID31 lparenID32 lparenID33 lparenID34 lparenID35 lparenID36 lparenID37 lparenID38 lparenID39 lparenID40 lparenID41 lparenID42 lparenID43 lparenID44 lparenID45 lparenID46 lparenID47 lparenID48 lparenID49 lparenID50 lparenID51 lparenID52 lparenID53 lparenID54 lparenID55 lparenID56 lparenID57 lparenID58 lparenID59 lbracketID0 lbracketID1 lbracketID2 lbracketID3 lbracketID4 lbracketID5 lbracketID6 lbracketID7 lbracketID8 lbracketID9 lbracketID10 lbracketID11 lbracketID12 lbracketID13 lbracketID14 lbracketID15 lbracketID16 lbracketID17 lbracketID18 lbracketID19 lbracketID20 lbracketID21 lbracketID22 lbracketID23 lbracketID24 lbracketID25 lbracketID26 lbracketID27 lbracketID28 lbracketID29 lbracketID30 lbracketID31 lbracketID32 lbracketID33 lbracketID34 lbracketID35 lbracketID36 lbracketID37 lbracketID38 lbracketID39 lbracketID40 lbracketID41 lbracketID42 lbracketID43 lbracketID44 lbracketID45 lbracketID46 lbracketID47 lbracketID48 lbracketID49 lbracketID50 lbracketID51 lbracketID52 lbracketID53 lbracketID54 lbracketID55 lbracketID56 lbracketID57 lbracketID58 lbracketID59 "(" "[": {EBx+} & Xd+; rparenID0 rparenID1 rparenID2 rparenID3 rparenID4 rparenID5 rparenID6 rparenID7 rparenID8 rparenID9 rparenID10 rparenID11 rparenID12 rparenID13 rparenID14 rparenID15 rparenID16 rparenID17 rparenID18 rparenID19 rparenID20 rparenID21 rparenID22 rparenID23 rparenID24 rparenID25 rparenID26 rparenID27 rparenID28 rparenID29 rparenID30 rparenID31 rparenID32 rparenID33 rparenID34 rparenID35 rparenID36 rparenID37 rparenID38 rparenID39 rparenID40 rparenID41 rparenID42 rparenID43 rparenID44 rparenID45 rparenID46 rparenID47 rparenID48 rparenID49 rparenID50 rparenID51 rparenID52 rparenID53 rparenID54 rparenID55 rparenID56 rparenID57 rparenID58 rparenID59 rbracketID0 rbracketID1 rbracketID2 rbracketID3 rbracketID4 rbracketID5 rbracketID6 rbracketID7 rbracketID8 rbracketID9 rbracketID10 rbracketID11 rbracketID12 rbracketID13 rbracketID14 rbracketID15 rbracketID16 rbracketID17 rbracketID18 rbracketID19 rbracketID20 rbracketID21 rbracketID22 rbracketID23 rbracketID24 rbracketID25 rbracketID26 rbracketID27 rbracketID28 rbracketID29 rbracketID30 rbracketID31 rbracketID32 rbracketID33 rbracketID34 rbracketID35 rbracketID36 rbracketID37 rbracketID38 rbracketID39 rbracketID40 rbracketID41 rbracketID42 rbracketID43 rbracketID44 rbracketID45 rbracketID46 rbracketID47 rbracketID48 rbracketID49 rbracketID50 rbracketID51 rbracketID52 rbracketID53 rbracketID54 rbracketID55 rbracketID56 rbracketID57 rbracketID58 rbracketID59 ")" "]": {@Xca-} & Xc-; – --.r -.r: [[{@Xca-} & Xx- & (W+ or J+ or Qd+ or TH+ or TO+) & {Xx+}]] or ({@Xca-} & (({EBx+} & Xd+) or Xc-)); foo: F+; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Morphology guessing for unknown words. % Given a particular kind of ending to a word, try to guess % its part-of-speech. % ING-WORDS.g: ( & ) or ( & ) % or ({@E-} & A+) or ; ING-WORDS.g: [( & )] or [( & )] or [({@E- or EA-} & A+)] or [] or (( & (({D*u-} & & ( or Bsm+)) or or (YS+ & {D*u-}) or (GN+ & (DD- or [()])) or Us-)) or AN+ or {AN-}); ED-WORDS.v-d: (( & ()) or ( & (([]) or ())) or (() & )) or or or ({@E-} & A+); S-WORDS.v: (( & ()) or ( & (([]) or ())) or (() & ) or ); S-WORDS.n: ( & (({NM+ or Dmc-} & & ( or Bpm+)) or ({NM+ or Dmc-} & ) or (YP+ & {Dmc-}) or (GN+ & (DD- or [()])) or Up-)) or [[AN+]]; LY-WORDS.e: {EE- or EF+} & (({Xd- & Xc+} & MVa-) or Em+ or ({Xc+ & {Xd-}} & CO+) or Qe+ or Ca+ or [[EA+]]); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Morphology guessing extension rules from BioLG-1.1.12 % Words guessed based on morphology. % These occur primarily in biomedical and chemistry texts. % These are processed via regular-expression matching, in 4.0.regex %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% MC-NOUN-WORDS.n: % guessed nouns that can be mass or countable (-in, -ine, -ion, -yl, -ose, -ol, -ide, -ity) ( & (({NM+ or D*u-} & & ( or Bsm+)) or ({NM+ or D*u-} & ) or (YS+ & {D*u-}) or (GN+ & (DD- or [()])) or Us-)) or AN+; C-NOUN-WORDS.n: % guessed nouns that are countable (-on, -or) ( & (((NM+ or Ds-) & & ( or Bsm+)) or ({NM+ or Ds-} & ) or (YS+ & Ds-) or (GN+ & (DD- or [()])) or Us-)) or AN+; ADJ-WORDS.a: % guessed adjectives (-ous, -ar, -ic) ; % guessed adjectives/adverbs suffixed by "fold" with or without hyphen FOLD-WORDS: ({EN-} & (MVp- or EC+ or A+)) or Em+; % latin (postposed) adjectives considered as mass nouns % in the current version LATIN-ADJ-WORDS.a: ( & (({NM+ or D*u-} & & ( or Bsm+)) or ({NM+ or D*u-} & ) or (YS+ & {D*u-}) or (GN+ & (DD- or [()])) or Us-)) or AN+; % latin (postposed) adjectives or latin plural noun always considered % as nouns in the current version LATIN-ADJ-P-NOUN-WORDS: ( & (({NM+ or Dmc-} & & ( or Bpm+)) or ({NM+ or Dmc-} & ) or (YS+ & {Dmc-}) or (GN+ & (DD- or [()])) or Up-)) or AN+; % latin (postposed) adjectives or latin singular noun always % considered as nouns in the current version LATIN-ADJ-S-NOUN-WORDS: ( & (({NM+ or D*u-} & & ( or Bsm+)) or ({NM+ or D*u-} & ) or (YS+ & {D*u-}) or (GN+ & (DD- or [()])) or Us-)) or AN+; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Guessing of unknown words, if none of the above rules applied. UNKNOWN-WORD.n: & (AN+ or ({NM+ or D*u-} & & ( or Bsm+)) or ({NM+ or D*u-} & ) or (YS+ & {D*u-}) or (GN+ & (DD- or [()])) or U-); UNKNOWN-WORD.v: {@E-} & (Sp- or (RS- & Bp-) or I- or ({Ic-} & Wi-)) & {B- or O+} & {@MV+}; UNKNOWN-WORD.a: ; LEFT-WALL: (Wd+ or Wq+ or Ws+ or Wj+ or Wc+ or Wi+ or Qd+) & {CP+} & {Xx+} & {RW+ or Xp+}; RIGHT-WALL: RW- or ({@Xca-} & Xc-); % XXX ANDABLE-CONNECTORS is now deprecated, needs to be removed for version 5.0 ANDABLE-CONNECTORS: % these are the connectors that can be combined by % conjunctions. They are listed alphabetically. A+ & A- & AF- & AN+ & B+ & B- & BI- & C+ & C- & CC+ & CO+ & CO- & D+ & D- & DD- & DT- & E+ & E- & EA- & G+ & GN+ & GN- & I+ & I- & IN- & J+ & J- & JT- & K- & L- & M+ & M- & MV- & MV+ & MX- & ND+ & NM+ & NIn+ & O+ & O- & ON- & QI+ & QI- & P- & PP- & Q- & R+ & RS- & S+ & S- & SI- & TA- & TD+ & TD- & TH+ & TH- & TI- & TM- & TO- & TS- & U- & Wd- & Wi- & Wq- & Ws- & Xc+ & Xd- & YP+ & YS+ & Z-; UNLIMITED-CONNECTORS: % These are the link-types that are not subject % to the length limit. Always use "+" for these. S+ & CO+ & C+ & Xc+ & MV+ & CC+ & TH+ & W+ & RW+ & Xp+ & Xx+ & CP+ & SFsx+; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Extensions by Peter Szolovits, psz@mit.edu, as a part of the work for % "Adding a Medical Lexicon to an English Parser. Proc. AMIA 2003 Annual % Symposium, xx-yy. % Visit http://www.medg.lcs.mit.edu/projects/text/ for more information. % although in_as_much_as whilst whereas whereof wherein: (Cs+ & (({Xc+ & {Xd-}} & CO*s+) or ({Xd- & Xc+} & MVs-))) or ({Xd-} & CC- & Wd+); benumbed.a bespattered.a non_compos_mentis dead_on_arrival bedimmed.a null_and_void bedewed.a au_fait dead_of_other_causes right_sacrotransverse above_board K/O.a SGA.a TBA.a DOA.a asialo.a syntonic.a loco.a haywire.a: ((Ma- or Pa- or MJra-) & {@MV+}) or ({@MV+} & MJla+) or ; subject_to status_post in_conjunction_with sensu in_relation_to neath amidst across_from circa astride previous_to together_with as_regards s/p aka amongst unto apropos_of w.i W.i: ({JQ+} & (J+ or Mgp+) & ) or (MVp- & B-); oftenest correctliest soonest disquietingliest: EA+; proof-reads.v proof_reads gells.v O.K.'s.v OK's.v O.K.’s OK’s: (( & ()) or ( & ([()] or ())) or (() & )); propension.n: ( & ((Ds- & {@M+} & {(TOn+ or (R+ & Bs+)) & {[[@M+]]}} & {@MXs+} & ( or Bsm+)) or Us- or (YS+ & Ds-) or (GN+ & (DD- or [()])))) or AN+; avow.q: [[{@E-} & (((Sp- or I-) & ) or (SIpj+ & ))]]; longest-term.a: ({Xc+} & {NR-} & {[[@Ec-]]} & La-) or ({NR- or ND-} & DD- & (( & {TOn+} & ) or MVa-)); daren't mayn't shan't oughtn't mightn't daren’t mayn’t shan’t oughtn’t mightn’t: ({{Ic-} & Q-} & (SI+ or SFI+) & I+) or ({@E-} & (S- or SF- or (RS- & B-)) & (I+ or [[()]])); longer-term.a: ({ECa-} & (({[[@Ec-]]} & {Xc+} & Am+) or ((Pafm- or AFm+ or Mam-) & {@MV+} & {(TOi+ or THi+) & {LE+}}))) or (DG- & (TR+ or AF+) & {@MV+} & {TOi+ or THi+} & (ER- or (Wd- & Xc+ & ER+))); attestation.n: ( & (({D*u-} & {@M+} & {(TH+ or (R+ & Bs+)) & {[[@M+]]}} & {@MXs+} & ( or (Ss*t+ & ) or SIs*t- or Bsm+)) or Us- or (YS+ & {D*u-}) or (GN+ & (DD- or [()])))) or AN+; O.K.'d.v-d OK'd.v-d O.K.’d.v-d OK’d.v-d: (( & ()) or ( & (([]) or ())) or (() & )); whence whither: {EL+} & (Cs+ & (({Xc+ & {Xd-}} & CO+) or ({Xd- & Xc+} & MVs-))); % Strange -- the JT- is a time-expression link .. .is that right here ?? articulo_mortis intra_vitam in_articulo_mortis in_extremis post_cibum post_coitum: or JT- or [[E+]] or YS+ or [[]]; lest: (Cs+ or Mgp+ or Mv+) & (({Xc+ & {Xd-}} & CO*s+) or ({Xd- & Xc+} & MVs-) or (Xd- & Xc+ & E+)); whyever: ({EL+} & ((Wq- & Q+) or (QI- & (Cs+ or TOn+)) or (Cs+ & ((SFsx+ & ) or WY- or BIq-)))) or [[{@CO-} & Wc- & Wi+]]; albeit: (Cs+ & {Xc+ & {Xd-}} & CO*s+) or ({Xd-} & CC- & Wd+); whichever: ({EL+} & (((Ss*d+ or Bsd+ or BW+ or D**w+) & ( or (Xc+ & {Xd-} & CO+) or ({Xd- & Xc+} & MVs-))) or [[(O- or J-) & CX+]])) or ((ALx+ & J+) & (({Xd-} & Xc+ & CO+) or ({Xd- & Xc+} & MVs-))); proof-reading.v proof_reading O.K.'ing.v OK'ing.v O.K.’ing.v OK’ing.v: ( & ) or ({@E-} & A+) or ; % "I'll hire whomever I can find": Os- whomever: (R- & Cr+) or (B*w+ & (Wq- or QI*d- or BIqd- or ((Xc+ or ) & Xd- & MX*r-))) or (Os- & Bsd+) or (Jr- & (RS+ or Cr+)) or Jw-; thyself oneself one's one’s: J- or O- or E+ or MVa-; % Handy test % grrr: (A- & B- & C+ & D+) or [(E- & @F+ & @G+ & H+)] or [[(I- & J- & @K- & @L+)]]; link-grammar-4.7.4/data/en/tiny.dict0000644000175000017500000001306310204377537016267 0ustar bloombloom %***************************************************************************% % % % Copyright (C) 1991-1998 Daniel Sleator and Davy Temperley % % http://www.link.cs.cmu.edu/link % % % %***************************************************************************% dog cat woman man park yard bone neighbor store street bird hammer nose party friend house movie brother sister diner student exam: {@A-} & Ds- & {@M+ or (R+ & Bs+)} & (J- or Os- or (Ss+ & (({@CO-} & {C-}) or R-)) or SIs-); dogs cats women men parks yards bones neighbors stores streets birds hammers noses parties friends houses movies brothers sisters diners students exams wars winters actions laws successes: {@A-} & {Dmc-} & {@M+ or (R+ & Bp+)} & (J- or Op- or (Sp+ & (({@CO-} & {C-}) or R-)) or SIp-); water anger money politics trouble: {@A-} & {Dmu-} & {@M+ or (R+ & Bs+)} & (J- or Os- or (Ss+ & (({@CO-} & {C-}) or R-)) or SIs-); law winter action war success: {@A-} & {D*u-} & {@M+ or (R+ & Bs+)} & (J- or Os- or (Ss+ & (({@CO-} & {C-}) or R-)) or SIs-); CAPITALIZED-WORDS: J- or O- or (S+ & (({@CO-} & {C-}) or R-)) or SI-; she he: (Ss+ & (({@CO-} & {C-}) or R-)) or SIs-; me him them us: J- or O-; her: D+ or J- or O-; its my your their our: D+; his: D+; you they we I: J- or O- or (Sp+ & (({@CO-} & {C-}) or R-)) or SIp-; it: J- or O- or (Ss+ & (({@CO-} & {C-}) or R-)) or SIs-; this: (J- or O- or (Ss+ & (({@CO-} & {C-}) or R-)) or SIs-) or D*u+; these: (J- or O- or (Sp+ & (({@CO-} & {C-}) or R-)) or SIp-) or Dmc+; those: (Dmc+) or (({P+} or {{C+} & Bp+}) & (J- or O- or (Sp+ & (({@CO-} & {C-}) or R-)) or SIp- or Xb-)); the: D+; a: Ds+; did: ({Q-} & SI+ & I+) or ({@E-} & (S- or (RS- & B-)) & (((B- or O+) & {@MV+}) or I+)); do: (SIp+ & I+) or ({@E-} & (Sp- or (RS- & Bp-) or I-) & (((B- or O+) & {@MV+}) or I+)); does: ({Q-} & SIs+ & I+) or ({@E-} & (Ss- or (RS- & Bs-)) & (((B- or O+) & {@MV+}) or I+)); done: {@E-} & (Pv- or M- or (PP- & (B- or O+) & {@MV+})); doing: {@E-} & (Pg- or Mg-) & (O+ or B-) & {@MV+}; has: ({Q-} & SIs+ & PP+) or ({@E-} & (Ss- or (RS- & B-)) & (TO+ or ((B- or O+) & {@MV+}) or PP+)); have: ({Q-} & SIp+ & PP+) or ({@E-} & (Sp- or (RS- & Bp-) or I-) & (TO+ or ((B- or O+) & {@MV+}))); had: ({Q-} & SI+ & PP+) or ({@E-} & (S- or (RS- & B-) or PP-) & (TO+ or ((B- or O+) & {@MV+}) or PP+)); having: {@E-} & (M- or Pg-) & (TO+ or ((B- or O+) & {@MV+}) or PP+); is was: ((Ss- or (RS- & Bs-) or ({Q-} & SIs+)) & (((O+ or B-) & {@MV+}) or P+ or AF-)); are were am: ((Sp- or (RS- & Bp-) or ({Q-} & SIp+)) & (((O+ or B-) & {@MV+}) or P+ or AF-)); be: I- & (((O+ or B-) & {@MV+}) or P+ or AF-); been: PP- & (((O+ or B-) & {@MV+}) or P+ or AF-); being: {@E-} & (M- or Pg-) & (((O+ or B-) & {@MV+}) or P+ or AF-); will can.v may must could should would might: (({Q-} & SI+) or S- or (RS- & B-)) & I+; run come: {@E-} & (Sp- or (RS- & Bp-) or I- or W- or PP-) & {@MV+}; runs comes goes: {@E-} & (Ss- or (RS- & Bs-)) & {@MV+}; ran came went: {@E-} & (S- or (RS- & B-)) & {@MV+}; go: {@E-} & (Sp- or (RS- & Bp-) or I-) & {@MV+}; gone: {@E-} & PP- & {@MV+}; going: {@E-} & (Pg- or M-) & {TO+} & {@MV+}; running coming: {@E-} & (Pg- or M-) & {@MV+}; talk arrive die: {@E-} & (Sp- or (RS- & Bp-) or I-) & {@MV+}; talks.v arrives dies: {@E-} & (Ss- or (RS- & Bs-)) & {@MV+}; talked arrived died: {@E-} & (S- or (RS- & B-) or PP-) & {@MV+}; talking arriving dying: {@E-} & (Pg- or M-) & {@MV+}; see meet chase invite arrest: {@E-} & (Sp- or (RS- & Bp-) or I-) & (O+ or B-) & {@MV+}; sees meets chases invites arrests: {@E-} & (Ss- or (RS- & Bs-)) & (O+ or B-) & {@MV+}; met chased invited arrested: {@E-} & (M- or Pv- or ((S- or (RS- & B-) or PP-) & (B- or O+))) & {@MV+}; saw: {@E-} & (S- or (RS- & B-)) & (B- or O+) & {@MV+}; seen: {@E-} & (Pv- or M- or (PP- & (B- or O+))) & {@MV+}; seeing meeting chasing inviting arresting: {@E-} & (Pg- or M-) & (O+ or B-) & {@MV+}; tell: {@E-} & (Sp- or (RS- & Bp-) or I-) & ((O+ or B-) & {TH+ or C+ or QI+ or @MV+}); tells: {@E-} & (Ss- or (RS- & Bs-)) & ((O+ or B-) & {TH+ or C+ or QI+ or @MV+}); told: {@E-} & (M- or Pv- or ((S- or (RS- & B-) or PP-) & (O+ or B-))) & {TH+ or C+ or QI+ or @MV+}; telling: {@E-} & (Pg- or M-) & ((O+ or B-) & {TH+ or C+ or QI+ or @MV+}); recently sometimes soon gradually specifically generally initially ultimately already now sadly broadly: E+ or MV-; from with at against behind between below above without under for in across through by out up down along like.p on over into about: J+ & (Mp- or MV- or Pp-); of: J+ & Mp-; here there: MV- or Mp- or Pp-; that: (C+ & TH-) or Ds+ or (R- & (C+ or RS+)) or SIs- or (Ss+ & {{@CO-} & {C-}}) or J- or O-; to: (I+ & TO-) or ((MV- or Mp- or Pp-) & J+); who: (R- & (C+ or RS+)) or S+ or B+; what: S+ or B+; which: (R- & (C+ or RS+)) or S+ or B-; because unless though although: (C+ & (({Xc+} & CO+) or MV-)); after before since until: (C+ or J+) & (({Xc+} & CO+) or MV- or Mp-); if: C+ & (({Xc+} & CO+) or MV-); when: (QI- & C+) or Q+ or (C+ & (({Xc+} & CO+) or MV-)); where:(QI- & C+) or Q+; how: (QI- & (C+ or EA+)) or Q+ or EA+; fast slow short long black white big small beautiful ugly tired angry: {EA-} & (A+ or ((Pa- or AF+) & {@MV+})); glad afraid scared.a fortunate unfortunate lucky unlucky certain sure: {EA-} & (A+ or ((Pa- or AF+) & {@MV+} & {C+ or TO+ or TH+})); very: EA+; but and: MV- & C+; ",": Xc-; ANDABLE-CONNECTORS: S+ & S- & A+ & A- & MV+ & MV- & D- & O+ & O- & J+ & J- & C-; link-grammar-4.7.4/data/en/4.0.enwiki.batch0000644000175000017500000000063411267744073017233 0ustar bloombloom !verbosity=1 !echo !limit=1000 !batch !short=20 !constituents=1 !spell=0 Hatem Mohamed Mersal (born 20 January 1975) is an Egyptian long jumper. His personal best jump is 8.31 metres, achieved in June 1999 in Oslo. Economists are nearly universal in their belief that the dollar is going to collapse; the only debate centers around when and for how long. The only debate centers around when and for how long. link-grammar-4.7.4/data/en/README0000644000175000017500000001617311246213504015312 0ustar bloombloom Dictionary Data --------------- Research notes. There are currently 63 data files in the 'words' directory. Of these, 8 are not distinct (*biolg*, *medical*) and so there are effectively just 55 "clusters" here. There are 1754 semicolons in 4.0.dict and 1772 colons. This implies that there are approx 1650 to 1700 word clusters in 4.0.dict since many of the semi-colons appear in lines that merely define new classes. A better count of the contents of 4.0.dict yeilds 1430 distinct clusters. There seem to be 86863 word forms in the dicts Example cluster from Siva's dataset: cluster469 bets.n -- ../blah/words.n.2.s doubts.n -- ../blah/blah-29 excuses.n -- ../blah/blah-34 foes.n -- ../blah/words.n.2.s warnings.n -- ../blah/blah-29 Actual disjunct usage: select inflected_word, disjunct, count, log_cond_probability from disjuncts where inflected_word='bets.n' order by log_cond_probability; bets.n | Jp- Dmc- | 5.38320328295231 | 2.68897695164809 bets.n | Op- | 6.59906960930676 | 2.79728207561233 bets.n | Op- Dmc- | 4.49985344521703 | 2.94756384236018 bets.n | Jp- A- MXp+ MXp+ | 2.94644784927368 | 3.5584651263364 bets.n | Jp- A- | 2.8032719194889 | 3.63033016407109 bets.n | Op- Mv+ | 2.38083738088607 | 3.86597277463304 doubts.n | Op- | 14.7235374869777 | 2.53482148983126 doubts.n | Op- Dmc- | 12.8798744678498 | 2.75360123030737 doubts.n | Jp- A- | 3.70244218036532 | 4.39933529761974 doubts.n | Op- A- | 4.28538444498555 | 4.52871084843059 doubts.n | Opt- | 2.90120184421541 | 4.75116183218627 doubts.n | Jp- Dmc- | 2.40070396848023 | 5.02435498790713 excuses.n | Op- Dmc- | 5.50880998373031 | 2.32890577902052 excuses.n | Op- | 5.03419046103953 | 2.45888667993668 excuses.n | Jp- Dmc- | 4.23024629056454 | 2.70990481825512 excuses.n | Op- TOn+ | 1.90192013978957 | 3.86318980988967 excuses.n | Op- AN- TOn+ | 1.79344245046377 | 3.9479150280805 excuses.n | Opn- | 1.65557911992073 | 4.06331052106999 foes.n | Op- Dmc- | 7.72758442535996 | 3.08401721340472 foes.n | Jp- | 5.78156289178878 | 3.50257518460873 foes.n | Jp- Dmc- | 8.53048111009413 | 3.55652688759394 foes.n | Op- | 4.24155412614344 | 3.94944175213513 warnings.n | Op- | 13.1191083714365 | 2.73150374115749 warnings.n | Op- Dmc- | 12.4493113420905 | 2.80710747394272 warnings.n | Jp- Dmc- | 8.38247973471882 | 3.37772441764546 Here's another curious one: cluster992 banker.n fisherman.n illustrator.n lyricist.n mechanic.n periodical.n psychiatrist.n sculptor.n all from words.n.1 -- thus does not broaden coverage ... but are very nearly all a profession! mechanic.n | Js- Ds- | 13.7642659600825 | 2.88500665850946 mechanic.n | Os- Ds- AN- | 7.06177791953084 | 3.84783097573959 mechanic.n | AN+ | 6.95599334826693 | 3.86960587427955 mechanic.n | Js- Ds- AN- | 6.24886311846786 | 4.02426868916609 mechanic.n | Ost- Ds- R+ Bs+ | 5.70536887645721 | 4.15554226141072 fisherman.n | Ost- Ds- | 6.96868003904821 | 3.15873229404902 fisherman.n | Js- Ds- | 6.63831343245697 | 3.22880096148911 fisherman.n | Ost- Ds- A- | 5.21447241306305 | 3.57709641838825 fisherman.n | AN+ | 5.15915525704624 | 3.59248284744609 illustrator.n | Js- Ds- | 23.8048364557326 | 2.60514384269322 illustrator.n | Ost- Ds- | 16.1435659294952 | 3.55061043888198 illustrator.n | Ost- Ds- A- | 12.5473636660028 | 3.5717400794719 illustrator.n | Ost- Ds- R+ Bs+ | 6.37835476174951 | 4.43506613246927 illustrator.n | Ost- Ds- AN- | 6.57567423582078 | 4.43628494235792 illustrator.n | AN+ | 5.92789142578842 | 4.54073145072105 periodical.n | AN+ | 13.523933645105 | 2.25884735662492 periodical.n | Ost- Ds- R+ Bs+ | 4.69391736388206 | 3.78549785079099 periodical.n | Os- Ds- | 3.54950597882271 | 4.18867205040734 periodical.n | Os- Ds- Mv+ | 4.4908520579338 | 4.32151671611172 periodical.n | Js- Ds- | 3.46312434598804 | 4.51594109897193 Examined 1165 clusters, recorded 626 Examined 13026 words, and 2218422 disjuncts Average 11.181116 words/cluster; average 3543.805112 dj's/recored-cluster real 3m42.396s user 3m35.157s recorded 628 recorded 622 Examined 1165 clusters, recorded 622 Examined 12952 words, and 2239866 disjuncts Average 11.117597 words/cluster; average 3601.070740 dj's/recored-cluster Got 74 mismatch warnings fixes w/o: 226 w/: 225 bilog w/o: 38 w/: 38 To get the full-length list -- Disjunct *d1 = build_disjuncts_for_dict_node(dn); -- but is obsolete ... free_disjuncts(d1) instead, use build_sentence_disjuncts() which use build_disjuncts_for_X_node() make float pt: in build-disjuncts.c == done todo -- build_disjuncts_for_X_node == done build_clause == done build_disjunct == done build_sentence_disjuncts -- preparation.c but preparation.c ... prepare_to_parse from api.c sentence_parse and retry from link-parser with more null counts. ====================== Historical trends: enwiki/A: grep -- version 4.3.5 num_skipped_words= * | wc 773352 num_skipped_words="0" 388819 or 50.3% num_skipped_words="1" 148214 or 19.2% num_skipped_words="2" 83234 or 10.8% num_skipped_words="3" 43957 or 5.7% num_skipped_words="4" 28998 or 3.8% num_skipped_words="5" 19677 or 2.5% enwiki/E: grep --- version 4.3.5 or so num_skipped_words= * | wc 980218 num_skipped_words="0" 479076 or 48.9% num_skipped_words="1" 190183 or 19.4% num_skipped_words="2" 107265 or 10.9% num_skipped_words="3" 56875 or 5.8% num_skipped_words="4" 39240 or 4.0% num_skipped_words="5" 27431 or 2.8% enwiki/J: grep --- version -4.5.7 or so num_skipped_words= * | wc 1744284 num_skipped_words="0" 914187 or 52.4% num_skipped_words="1" 332653 or 19.1% num_skipped_words="2" 176185 or 10.1% num_skipped_words="3" 87241 or 5.0% num_skipped_words="4" 57509 or 3.3% num_skipped_words="5" 38483 or 2.2% link-grammar-4.7.4/data/lt/0000755000175000017500000000000011531775723014454 5ustar bloombloomlink-grammar-4.7.4/data/lt/4.0.batch0000644000175000017500000000073610763145062015757 0ustar bloombloom% % * reiškia kad tai blogas sakinys, ir turetu buti atmestas. % !verbosity=1 !echo !limit=1000 !batch !short=20 !constituents=1 Jonas skaite knygą. Aš esu studentas. Ji yra studentė. Audra yra studentė. *Ji yra studentas. *Jis yra studentė. Mes einame namo. Einame namo. Ji eina į mokyklą. Atvažiavom į sodžių. Svečiai namo išvažiavo. % Neaišku ar čia klaida are ne ... "Žiurėkit! Mano namas!" *Mano namas. Mano namas yra gražus. *Mano namas yra graži link-grammar-4.7.4/data/lt/4.0.constituent-knowledge0000644000175000017500000000102110756373674021234 0ustar bloombloomDOMAIN_STARTER_LINKS: S* W DOMAIN_CONTAINS_LINKS: URFL_ONLY_DOMAIN_STARTER_LINKS: LEFT_DOMAIN_STARTER_LINKS: STARTING_LINK_TYPE_TABLE: W s O n ; ---------------------------------------------------------------------- ; These links are not put in the word/link graph. They also cannot be the ; starter links for a domain. IGNORE_THESE_LINKS: ; ---------------------------------------------------------------------- ; these links are not traced further if they point back before the root word RESTRICTED_LINKS: link-grammar-4.7.4/data/lt/4.0.affix0000644000175000017500000000011410756371760015771 0ustar bloombloom ")" "%" "," "." ":" ";" "?" "!" "''" "'": RPUNC+; "(" "$" "``": LPUNC+; link-grammar-4.7.4/data/lt/.cvsignore0000644000175000017500000000004510772523445016451 0ustar bloombloomMakefile.in Makefile svn-commit.tmp* link-grammar-4.7.4/data/lt/4.0.knowledge0000644000175000017500000000273310756373313016660 0ustar bloombloom; Post-processing knowledge file ; 6/96 ; ---------------------------------------------------------------------------- ; This file contains the knowledge related to post-processing, in the ; form of lists and rules. This file is read by post-process.c at run-time. ; Syntax of file: ; line starting with ";" is a comment ; commas are field delimiters ; any token beginning with the character @ is expanded to the set ; of symbols it defined. e.g. one could write ; FOO: blah1 blah2 blah3 ; thus defining a set FOO containing three strings. Then one could later write ; BAR: blah5 @FOO blah8 ; which defines a set BAR containing 5 strings. ; ; Capitalized tokens are *required*, though if you feel like providing an ; empty list afterwards, that's your right. ; ---------------------------------------------------------------------------- ; the following links start a domain. Each must be given a name in the ; table below (STARTING_LINK_TYPE_TABLE) DOMAIN_STARTER_LINKS: W ; ---------------------------------------------------------------------- ; ---------------------- LINK TYPE TABLE------------------------------- ; ---------------------------------------------------------------------- ; the following table associates a domain type with each possible ; starting link. It contains pairs: the first of each pair is a link ; type, and the second is the domain to which that link type belongs. STARTING_LINK_TYPE_TABLE: W m link-grammar-4.7.4/data/lt/Makefile.am0000644000175000017500000000023510756367463016516 0ustar bloombloom DICTS= \ 4.0.affix \ 4.0.constituent-knowledge \ 4.0.dict \ 4.0.knowledge dictdir=$(pkgdatadir)/lt dict_DATA = $(DICTS) EXTRA_DIST = $(DICTS) link-grammar-4.7.4/data/lt/4.0.dict0000644000175000017500000000602610763145062015617 0ustar bloombloom% % ========== Lietuvių kalbos žodynas ir gramatika ============== % =========== Lithuanian link-grammar dictionary =============== % % Experimental and incomplete ... % It can parse 4.0.batch more ore less correctly. % % Copyright (c) 2008 Linas Vepstas (Vepštas) linas@linas.org % % This file uses utf-8 characater encoding. % If editing with "vi", be sure to "set encoding=utf-8" % and also be sure to configure the terminal to use utf-8 encoding. % % % Ženklai: % Ą Č Ę Ė Į Š Ų Ū Ž % ą č ė ę į š ū ų ž % % Kaip išmušti ženklus: % ą == ,a irgi ę į ų % č == ) { chop; if (/^%/) { next; } if (/^ %/) { next; } if (/:/) { ($wds, $rules) = split /:/; if (($wds =~ /^<.*>$/) || ($wds =~ /^\//)) {} else { print FOUT "$wds\n"; $didprt = 1; } $doprt = 0; if ($rules =~ /;/) { $doprt = 1; if ($didprt) { $fileno ++; # print "--------------------- $fileno\n"; $filename = "> " . $file_prefix . $fileno; open FOUT, $filename; } $didprt = 0; } next; } if ($doprt) { if (/^\s*$/) { next; } # if all whitespace, skip if (/^\//) { next; } print FOUT "$_\n"; $didprt = 1; next; } if (/;/) { $doprt = 1; if ($didprt) { $fileno ++; # print "--------------------- $fileno\n"; $filename = "> " . $file_prefix . $fileno; open FOUT, $filename; } $didprt = 0; } } link-grammar-4.7.4/data/tools/fix-len.pl0000755000175000017500000000116611237654531017077 0ustar bloombloom#! /usr/bin/env perl # # fix-len.pl # Dictionary maintenance tool - make dictionary line lengths uniform. # Reads dictionary on stdin, prints it, with a uniform number # of words per line, to stdout. # # Example usage: # cat en/words/words.adj.2 | ./fix-len.pl # # Copyright (C) 2009 Linas Vepstas # my $linelen = 0; while (<>) { chop; my @entries = split; # Loop over the entries foreach (@entries) { my $wd = $_; $linelen += 1 + length $_; print "$_ "; # Insert a newline if the resulting line is too long. if ($linelen > 60) { print "\n"; $linelen = 0; } } } print "\n"; link-grammar-4.7.4/data/tools/membership.pl0000644000175000017500000000157111241370076017657 0ustar bloombloom#! /usr/bin/env perl # # membership.pl # # Print cluster membership contents for Siva's clusters. # Siva's cluster seems to contain just 13506 word forms ... # $| = 1; $fileprev = ""; $cnt = 0; while(<>) { chop; if (/^cluster/) { print "$cnt\n"; print "$_\n"; $cnt = 0; next; } # XXXXXXXXXXXXXXXXXXXXXXXx Note: the grep here is buggy, # since it will return postive hits for e.g. parcel.n # vs. "parceling" rather than the intended grep where the period is # escaped. So use with caution! if (/^ (.*)$/) { $wrd = $1; $cmd = "grep \" " . $wrd . "\" ../blah/*"; $out = qx/$cmd/; chop $out; if ($out =~/^\s*$/) { $cmd = "grep \"^" . $wrd . "\" ../blah/*"; $out = qx/$cmd/; chop $out; } # print "$wrd in $out\n"; ($fn, $rest) = split /:/, $out; $cnt ++; if ($fileprev ne $fn) { print "\t$wrd -- $fn\n"; } $fileprev = $fn; } } link-grammar-4.7.4/data/tools/cluster-pop.pl0000755000175000017500000000172411241104505017774 0ustar bloombloom#! /usr/bin/env perl # # cluster-pop.pl # # Populate the cluster table from Siva's clusters. # Siva's clusters seems to contain just 13506 word forms ... # # Usage: cat clusters_weka-trimmed.txt | ./cluster-pop.pl # use DBI; $| = 1; my $dbh = DBI->connect('DBI:SQLite:dbname=clusters.db', 'linas', 'asdf') or die "Couldn't connect to database: " . DBI->errstr; my $insert = $dbh->prepare( 'INSERT INTO ClusterMembers (cluster_name, inflected_word) VALUES (?,?)'); my $cluster_name = ""; my $inflected_word = ""; my $clust_cnt = 0; my $word_cnt = 0; while(<>) { chop; if (/^cluster/) { $cluster_name = $_; print "$cluster_name\n"; $clust_cnt ++; next; } if (/^ (.*)$/) { $inflected_word = $1; print "\t$inflected_word\n"; $insert->execute($cluster_name, $inflected_word) or die "Couldn't execute statement: " . $insert->errstr . "\nword was " . $inflected_word; $word_cnt ++; } } print "Added $word_cnt words to $clust_cnt clusters\n"; link-grammar-4.7.4/data/tools/wiktionary.pl0000755000175000017500000000243411245336064017731 0ustar bloombloom#! /usr/bin/env perl # # wiktionary.pl # # Verify parts of speech on wiktionary. # # Linas vepstas August 2009 # $|=1; $urlbase = "http://en.wiktionary.org/wiki/"; # http://www.thefreedictionary.com $urlbase = "http://en.wiktionary.org/w/index.php?title="; $urltail = "&action=edit"; $word = "lycée"; $word = "school"; while (<>) { chop; $word = $_; $url = $urlbase. $word . $urltail; $output = `w3mir -drr -s \"$url\"`; # $output =~ /\{\{ni\n";en-noun\|(\w+)\}\}/; if ($output =~ /\/s) { print "NOUN- $word\n"; } elsif ($output =~ /\/s) { $plu = $1; print "PLURAL- $plu\n"; } elsif ($output =~ /\/s) { print "MASS- $word\n"; } elsif ($output =~ /\/s) { print "NOUN-XXX- $word\n"; } if ($output =~ /\/s) { print "VERB- $word\n"; } if ($output =~ /\/s) { print "ADJ- $word\n"; } if ($output =~ /\/s) { print "ADJ- $word\n"; } if ($output =~ /\/s) { print "ADV- $word\n"; } else { print "XXX- $word\n"; } `sleep 1`; } link-grammar-4.7.4/data/tools/delete.pl0000755000175000017500000000231111245570701016763 0ustar bloombloom#! /usr/bin/env perl # # delete.pl # # Dictionary maintenance tool - delete words from dictionary. # Given a list of words and a dictionary file, this script # will delete the words from the file. # # It is assumed that the word-list holds one word per line, # and that the word-list is already in alphabetical order. # # Example usage: # ./delete.pl wordlist_file en/words/words.adj.1 # # Copyright (C) 2009 Linas Vepstas # if ($#ARGV < 1) { die "Usage: delete.pl wordlist-file dict-file\n"; } # Get the word-list, and the dictionary, from the command line my $wordlist_file = @ARGV[0]; my $dict_file = @ARGV[1]; open(WORDS, $wordlist_file); my @words = (); while () { # Get rid of newline at end of word. chop; push @words, $_; } close(WORDS); my $word = shift @words; open (DICT, $dict_file); while () { chop; my @entries = split; # Loop over the entries $gotone = 0; foreach (@entries) { my $entry = $_; while (($entry gt $word) && ($word ne "")) { $word = shift @words; } if ($entry ne $word) { # print "$entry "; print "$entry"; $gotone = 1; } else { $word = shift @words; } } if ($gotone) { print "\n"; } } close (DICT); link-grammar-4.7.4/data/tools/README0000644000175000017500000000056511237710636016056 0ustar bloombloom Dictionary Maintenance Tools ---------------------------- This directory contains some ad-hoc, undocumented tools for maintaining the dictionaries. Here are a few documented tools: insert.pl: add words to a dictionary, in sorted alphabetical order. fix-len.pl: reformat the dictionary files to have even line-lengths link-grammar-4.7.4/data/tools/insert.pl0000755000175000017500000000251711237654531017042 0ustar bloombloom#! /usr/bin/env perl # # insert.pl # # Dictionary maintenance tool - insert words into dictionary. # Given a list of words and a dictionary file, this script # will insert the words into the file, in alphabetical order, # with a minimum of disruption of the file itself. # # It is assumed that the word-list holds one word per line, # and that the word-list is already in alphabetical order. # # Example usage: # ./insert.pl wordlist_file en/words/words.adj.1 # # Copyright (C) 2009 Linas Vepstas # if ($#ARGV < 1) { die "Usage: insert.pl wordlist-file dict-file\n"; } # Get the word-list, and the dictionary, from the command line my $wordlist_file = @ARGV[0]; my $dict_file = @ARGV[1]; open(WORDS, $wordlist_file); my @words = (); while () { # Get rid of newline at end of word. chop; push @words, $_; } close(WORDS); my $word = shift @words; open (DICT, $dict_file); while () { chop; my @entries = split; # Loop over the entries my $linelen = 0; foreach (@entries) { my $wd = $_; $linelen += length $_; while (($_ gt $word) && ($word ne "")) { print "$word "; $linelen += length $word; $word = shift @words; # Insert a newline if the resulting line is too long. if ($linelen > 62) { print "\n"; $linelen = 0; } } print "$_ "; } print "\n"; } close (DICT); link-grammar-4.7.4/data/fr/0000755000175000017500000000000011531775730014442 5ustar bloombloomlink-grammar-4.7.4/data/.cvsignore0000644000175000017500000000002510510714056016016 0ustar bloombloomMakefile.in Makefile link-grammar-4.7.4/data/Makefile.am0000644000175000017500000000014511240064122016046 0ustar bloombloomSUBDIRS=de en lt # include the script in the tarball, but do not install it. # EXTRA_DIST=insert.pl link-grammar-4.7.4/msvc9/0000755000175000017500000000000011531775723014165 5ustar bloombloomlink-grammar-4.7.4/msvc9/LinkGrammarJava.vcproj0000755000175000017500000001042711357711535020424 0ustar bloombloom link-grammar-4.7.4/msvc9/LinkGrammarExe.vcproj0000644000175000017500000001610211357711535020255 0ustar bloombloom link-grammar-4.7.4/msvc9/LinkGrammar.sln0000755000175000017500000000344011354155755017113 0ustar bloombloom Microsoft Visual Studio Solution File, Format Version 10.00 # Visual C++ Express 2008 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "LinkGrammarJava", "LinkGrammarJava.vcproj", "{D74DF531-C18E-4988-8A8C-4F23556DEC1B}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "LinkGrammar", "LinkGrammar.vcproj", "{0A6C539A-3140-48BD-865C-05F45637B93B}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "LinkGrammarExe", "LinkGrammarExe.vcproj", "{532EFF4D-758A-4705-91EE-9A4AC72C017B}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Release|Win32 = Release|Win32 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {D74DF531-C18E-4988-8A8C-4F23556DEC1B}.Debug|Win32.ActiveCfg = Debug|Win32 {D74DF531-C18E-4988-8A8C-4F23556DEC1B}.Debug|Win32.Build.0 = Debug|Win32 {D74DF531-C18E-4988-8A8C-4F23556DEC1B}.Release|Win32.ActiveCfg = Release|Win32 {D74DF531-C18E-4988-8A8C-4F23556DEC1B}.Release|Win32.Build.0 = Release|Win32 {0A6C539A-3140-48BD-865C-05F45637B93B}.Debug|Win32.ActiveCfg = Debug|Win32 {0A6C539A-3140-48BD-865C-05F45637B93B}.Debug|Win32.Build.0 = Debug|Win32 {0A6C539A-3140-48BD-865C-05F45637B93B}.Release|Win32.ActiveCfg = Release|Win32 {0A6C539A-3140-48BD-865C-05F45637B93B}.Release|Win32.Build.0 = Release|Win32 {532EFF4D-758A-4705-91EE-9A4AC72C017B}.Debug|Win32.ActiveCfg = Debug|Win32 {532EFF4D-758A-4705-91EE-9A4AC72C017B}.Debug|Win32.Build.0 = Debug|Win32 {532EFF4D-758A-4705-91EE-9A4AC72C017B}.Release|Win32.ActiveCfg = Release|Win32 {532EFF4D-758A-4705-91EE-9A4AC72C017B}.Release|Win32.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal link-grammar-4.7.4/msvc9/LinkGrammar.vcproj0000755000175000017500000002267711357711535017634 0ustar bloombloom link-grammar-4.7.4/msvc9/Makefile.am0000644000175000017500000000016411354155755016222 0ustar bloombloom EXTRA_DIST= \ LinkGrammarExe.vcproj \ LinkGrammarJava.vcproj \ LinkGrammar.sln \ LinkGrammar.vcproj \ README link-grammar-4.7.4/msvc9/README0000755000175000017500000000304111115000127015017 0ustar bloombloomThis directory contains project files for building Link Grammar with the Miscrosoft Visual C++ 2008 IDE. They were created and tested with the Express Edition of that product. - to compile LinkGrammar, open the solution file LinkGrammar.sln and build the LinkGrammar project. You might get compile errors about a missing link-features.h include file. If so, please go ahead and rename the file 'link-grammar/link-features.h.in' to link-features.h. This is normally done by a Unix configure script, but needs to be manually done when compiling with Visual C++. - to compile the Java bindings, you need to add Java include directories to the LinkGrammarJava project first. This is in project properties->C/C++->General-> Additional Include Directories. You need both JAVA_HOME/include and JAVA_HOME/include/win32 where JAVA_HOME is your JDK's installation directory. - the projects are configured to create a debug version by default, it's probably a good idea to switch the a "Release" configuration. You can do this at Build Menu->Configuration Manager. NOTE: The created DLLs need the MSVC9 runtime environment to run. This is normally already installed in your machine with the installation of the IDE. But to be able to run Link Grammar on other computer you need to install the Visual C++ 2008 runtime redistributable from: http://www.microsoft.com/downloads/details.aspx?FamilyID=9B2DA534-3E03-4391-8A4D-074B9F2BC1BF&displaylang=en this redistributable does not contain debug version of the MSVC runtime, so only "Release" Link Grammar will work with it.link-grammar-4.7.4/build.xml.in0000644000175000017500000000276211114547000015337 0ustar bloombloom link-grammar-4.7.4/.cvsignore0000644000175000017500000000041710772523445015124 0ustar bloombloommissing ltmain.sh link-grammar.pc link-grammar.spec libtool install-sh depcomp configure config.sub config.status config.log config.guess autom4te.cache autogen.err aclocal.m4 Makefile.in Makefile INSTALL NEWS build.xml .pc patches bin link-grammar-*.jar svn-commit.tmp* link-grammar-4.7.4/ChangeLog0000644000175000017500000005205411526022265014672 0ustar bloombloomVersion 4.7.4 (13 February 2011) * Dramatic speed improvement for long sentences (hash table fix). * Fix: crash on certain sentences, when fat-link parsing enabled. * Fix: fatal error introduced in last version (combinatorial explosion). * Fix: mem leak introduced in last version (combinatorial explosion). * Assorted fixes to the Boolean SAT solver. Version 4.7.3 (7 February 2011) * Fix: "level" as indefinite noun: "... at knee level". * Enable max disjunct cost as a controllable parser parameter. * Don't just give up on combinatorial explosion, show something! Version 4.7.2 (6 January 2011) * Fix: crash on certain sentences, when fat-link parsing enabled. * Fix: 3 corrupted nouns in words.n.1 * Fix: minimize cpu spin if constituent processing and-list overflows. Version 4.7.1 (11 December 2010): * Fix: dictionary: Add "x" as synonym for "times". * Fix: compilation failure due to lack of termios support on Windows. * Fix: if not set, then force-set locale to UTF-8 in the java library. * Fix: Explicitly include for Windows builds. * Fix: "John imagines himself lost". * Fix: predicative adjectives w/misc verbs: "You are driving me crazy" * Fix: "judge innocent", etc. * Fix: many, many conjoined present tense verbs. * Fix: conjoined verbs with negations. * Fix: "to" as post-nominal modifier: "the inability to laugh" Version 4.7.0 (12 September 2010): * Fix: hunspell configuration on Fedora (bugtracker issue 47) * Fix: 'turn' with adjective: "She turned him green" from wingedtachikoma * Fix: comma-conjoined modifiers: "It tastes bitter, not sweet." * Fix: conjoined question words: "When and where is the party?" * Fix: recognize short, capitalized words (Los, La, etc.). * Treat colon as synonym for is: "The answer: yes." * Fix: begin with prepositions: "It all began in Chicago." * Fix: "What does it come to?" and related. * Fix: null infinitive: "I'd like to, I want to." * Fix: "Because I said so." * Fix: "sure" as preverbal adverb: "It sure is." * Fix: Gerunds with determiners: "a running of the bulls" * SJ link for conjoined nouns/noun phrases. * Sort linkages according to whether fat linkage was used. * Add flag to enable use of fat linkage during parsing. (Fat links now disabled by default). * Add male/female gender tags to misc nouns. * Fix: misc optionally transitive verbs: mix, paint, boot * Fix: word order: "look about fearfully", "look fearfully about", around * Fix: recognize simple fractions * Fix: "is" with uncountable nouns: "there is blood on your hands" * Fix: Roman numeral suffixes e.g. "Henry VIII" * Fix: regression in dates followed by punctuation. "In the 1950s, ..." * Fix: verbs drank, drunk are optionally transitive. * Fix: regression: "all the X", X can be plural or mass. * Fix: verbs paint, color may be ditranstive: "paint the car bright green" Version 4.6.7 (16 April 2010) * Fix: configure handling of --enable-hunspell (bugtracker issue 46) * Fix: conjoined modifier phrases: "the black and white cat sleeps." * Fix: MSWindows+MingGW compilation issue. * Update msvc9 Microsoft Visual C 2008 project, from Boris Iordanov. Version 4.6.6 (19 March 2010) * Minor fixes to handling of units. * Fix: MSWindows+Cygwin/MingGW compilation issues. * Use pkgconfig for editline (from Vincent Untz) * Fix: "I want it back." * Additional titular prefixes, suffixes: Maj. Ph.D. * Add code to detect dictionary version number. * Fix: MS VC missing strdup() function. * Add AutoIt3 bindings from JRowe Version 4.6.5 (3 November 2009) * Fix: Superlatives without preceding determiners ("... likes you best") * Fix: Take more care in distinguishing mass and count nouns. * Fix: Old bug w/relative clauses: Rw+ is optional, not mandatory. * Provide tags identifying relative, superlative adjectives. * Remove BioLG NUMBER-AND-UNIT handling, its been superceeded. * Fix handling of parenthetical phrases/clauses. * Fix: handling of capitalized first words ending in letter "s". * Fix: support "filler-it" SF link for "It was reasoned that..." * Fix: certain WH-word constructions: "I did not know why until recently" * Fix: go: "there goes the greatest guy ever" * Fix: opening coordinating conjunctions: "And you can also ..." * Configurable Hunspell spell-checker dictionary location. * Fix: Misc ordinal usage. * Add support for aspell spell-checker. Version 4.6.4 (11 October 2009) * Restore nouns starting w/letters x-z, elided in version 4.5.9 ff. * Add support for single-word interjections/exclamations! * Fix: sometimes command line client fails to show all valid linkages. * Misc fixes: such_that, upon, acted.v * Fix: impersonal "be" linking to passive participle. * Fix: handling of capitalized first words. * Fix: duplication of certain parses involving transitive verbs. Version 4.6.3 (4 October 2009) * Fix compilation bug on FreeBSD. * Fix: allow MX link to post-nominal ", to be ..., " * Fix: add idiom "time and again" * Fix: another BioLG regression in handling of possessives. * Fix: handling of period at end of number at end of sentence. * Fix: Capitalized words ending in s at start of sentence. * Use corpus-statistics-based ranking by default, if available. * Fix difficulties in build of corpus statistics module. Version 4.6.2 (21 September 2009) * Fix: "come across as authoritative". * Improve Java location guessing in FreeBSD * Fix for assert triggered by long sentences. * Fix: long sequence of periods treated as unknown word. * Add informational print showing dictionary location on startup. * Remove duplicated {@MV+} in tend.v * Automatically resize the display size to fit the current window size. * Fix handling of punctuation at the end of a capitalized word. * Fix misc verbs acting as adjectival modifiers: e.g. "given", "allied" * Fix bug in BioLG code regarding the handling of possessives. * Fix a (rare) crash in sentences with many conjunctions. * Fix a crash involving long sequences of UTF8 punctuation marks. Version 4.6.1 (31 August 2009) * Stop printing annoying warning when !vars are used. * Fix missing dict file units.2 problem * Fix compilation bug on FreeBSD. Version 4.6.0 (29 August 2009) * Avoid used of bzero, add missing include directives (MacOSX problem) * Reclassify a number of "medical" prepositions as adverbs. * Add approx 100 adverbs & 300 adjectives. * Add approx 250 verbs. * Add approx 300 nouns. * Add misc units. * Add misc European connector words/patronymics. * Reclassify 100's of transitive verbs as optionally-transitive. * Add distinct tokenization step ("sentence_split") to public API. This last change forces the minor-version-number bump. Version 4.5.10 (25 August 2009) * Be sure to link with -lm Version 4.5.9 (25 August 2009) * Modify error messages to indicate that they are from link-grammar. * Add missing Java files that were forgotten last time around. * Add greeting to command-line client startup. * Print disjunct cost also, when requesting disjunct printing. * Add missing color names as mass nouns. * Fix: Reclassify musical instruments: "He plays piano" * Add experimental word-clustering system. * Add CMake build file * Fix: "It takes longer than that." * Fix: "He has done very well." * Fix: a dozen optionally transitive verbs (swim, kill, etc.) * Fix: "He's out running." * Fix: "suddenly" is a "manner adverb", not a clausal adverb. * Fix: Use Pg links to gerunds: "He feared hitting the wall." * Fix: assorted numerical-range bugs. * Fix: prep modifiers with distances: "It is a few miles out" * Fix: Spelled-out dates: "It started in nineteen twelve" * Fix: Misc date, time expression parsing e.g "Zero hour is here." * Fix: Misc words, "ordered list", "screened out" * Fix: Post-fixed numbers can act as determiners. * Fix: "We bought the last 50 ft. of cable." * Fix: opening directives to imperatives: "Finally, move it back." * Fix: Improved simple equation parsing support. * Fix: Add misc fixes from BioLG that were previously overlooked. * Fix: "favorite" can take determiner "a" ("a favorite place") * Fix: assorted clausal complements: "The emperor ordered it done." * Fix: ordinals: "First on our list is ..." * Fix: verb modifier "some of the time", "most places" * Fix: Sit, stand take modifiers: "he stood still" Version 4.5.8 (2 July 2009) * Fix: 'than anticipated', 'than was anticipated', etc. * Fix: 'saw the wood' * Fix: sometimes commas are used as if they were semicolons. * Fix: 'We have quite enough work already, thank you!' * Fix: allow 'and' as conjunction in entity names. * Fix: 'I stared him down', 'They shouted him down', 'booed off' * Fix: 'sound him out', 'look him over' * Fix: 'Somewhere in the distance' * Stub out list of names given to both men and women, to avoid duplication. * Fix: 'I think so, too' * Fixes for compilation under Cygwin. * From Boris Iordanov: fixes to JSON java code. * From Boris Iordanov: new java remote client code. * Fix: Biological texts commonly have adj-noun-adj-noun chains Version 4.5.7 (4 June 2009) * Fix 'make install' for windows (abi bug 12049) * Fix multi-threaded bug when TRACK_SPACE_USAGE is defined. * Add './configure --enable-mudflap' just for fun... * Fix: "Walk tall", "Think quick" * Fix: "... part no. 1234-56A" * Fix regression from BioLG merge: "It cost $14 million." * Fix come/came: "The dog came running..." * Fix year abbreviations: "He drove a souped-up '57 Chevy" * Fix sit, stand: "The dog stood still" * Fix act up, act out: "He is acting out." "The motor is acting up." * Fix notoriously, poorly: "The store was poorly stocked". * Fix: "strong" can be adverb * Add support for recognizing basic time zones during parsing. * Fix: verbs acting as adjectival modifiers: "a very politicized deal." * Fix: ".. nearly so well", "...almost so well". * Fix financial ranges: "It will cost $10 million to $20 million to build." * Expand handling of capitalized words that appear in entity names. * Expand the list of characters that are recognized as quotes. * Support usage of yes, no as sentence openers. * Better support for directives, commands. * Fix: "Ash Wednesday", "Fat Tuesday", etc. * Fix: post-verbal adj: "she wiped the table dry" * Fix: wish: "she wished me a happy birthday" Version 4.5.6 (24 May 2009) * Bugfix: fix non-thread-safe usage. * Changes to enable MinGW/Windows to compile. * Update of MSVC6 build files * Fix: pizza, fries, chopsticks. * Export word-sense database to Java apps. * Fix: "Was the man drunk or crazy or both?" Version 4.5.5 (10 May 2009) includes the following changes: * Bugfix: crash for zero-length sentences. Version 4.5.4 (9 May 2009) includes the following changes: * Fix: "sleep in": "A bed is something you sleep in." * Fix: "drinking": "Let's go drinking." * Fix go+bare infinitive: "Let's go shop", "Let's go swim" * Fix: "Let's go for a swim." "Let's go for a smoke". * Fix: "Let's not" "Let's not go" "Let's not cry" * Fix: ... is : "All he ever does is complain." * Fix: "You will die young/happy/unhappy" * Fix: "You should exercise to stay fit." * Fix: "We danced 'til dawn." * Fix: "tell off": "She had told him off." * Bugfix: sometimes spell checker would run even if turned off. Version 4.5.3 (14 April 2009) includes the following changes: * Haste makes waste! Revert a recent 'fix'. Version 4.5.2 (14 April 2009) includes the following changes: * Use re-entrant version of mbtowc in all code. * Fix run-time breakage on Mac OSX and FreeBSD. Version 4.5.1 (13 April 2009) includes the following changes: * Fix Assertion failed: negative constituent length! * Fix build break for Mac OSX. * Force use of UTF-8 locale in the command-line tool. Version 4.5.0 (10 April 2009) includes the following changes: * Hack around missing SQLite3 pkgconfig on MacOS * Fix adverbs: 'The motor ran hot', 'the door swung wide open', etc. * Fix: 'at risk of breakdown', 'under threat of fire' * Add regular-expression-based word guessing, from BioLG project. This provides support for many scientific/biomedical terms. * Add spell-guessing for unknown words. * Fix UTF8 support to be correctly thread-safe. * BioLG: fix post-numbering: 'it started on day one' * BioLG: add number ranges: 'it takes 2 to 3 times the effort' * BioLG: assorted adverb fixes, typical of scientific prose. * BioLG: initiate, attach, localize etc are optionally transitive. * BioLG: allow fork, branch, splice, export, etc to take particles. * BioLG: extended use of Greek letters in biomedical text. * BioLG: support parsing of Roman numerals. * BioLG: support Greek-letter-number combinations. * Fix: 'she was singing', etc. * Enable WordNet word-sense identification based on syntactical usage. Version 4.4.3 (11 March 2009) includes the following changes: * Look at JAVA_HOME to guess location of jni.h * Add dictionary maintenance utility script. * Add prototype German dictionary. * Fix sentences containing measurements, lengths, speeds. etc. * Add 1400 new adjectives, many of scientific origin. * Add 250 international currencies, including special utf8 symbols. * Performance optimization in sentence tokenization. * Add 1100 male, female given names (from Bruce Wilcox). * Cleanup parsing of "in-" date expressions, e.g. "in the 1940's". * Cleanup of assorted compiler warnings. * Fix handling of special utf8 characters in dictionary. * Fix hang when parsing certain utf8 input strings. * Make sure that most strings in the API are declared const char * * Add option to command-line client to print disjunct strings. Version 4.4.2 (15 January 2009) includes the following changes: * Fix: 'The keys are gone', 'It is a gone desire' * Fix: 'He poured me a glass', 'He wired me the money', etc. * Initial rough-in of corpus statistics based parse ranking. * Initial rough-in of corpus-guided word-sense identification. * Fix for googlecode bugs 38, 39 (Java, Ruby failure to load) * Add new API routine to return disjunct string. Version 4.4.1 (15 December 2008) includes the following changes: * Balance the dictionary tree; this speeds word-lookup slightly. * New MSVC6 build files from Evgenii Philippov. * Fix java server classes to pass along the link-grammar version number. Version 4.4.0 (7 December 2008) includes the following changes: * fix: recognize curly-single-quote ’ where straight quote can be used. * recognize and explicitly ignore emoticon types. * Include MSVC6 build files. * Apply patch needed for Ruby bindings. * fix: "Where did they come from?", per Viswanath IIIT * fix: "Where did they go to?" * fix: "It gives me peace of mind." * fix: many, many incorrectly identified mass nouns. * fix: ladle.v "molten hot" "piping hot" * fix: "It's a shame that...", "The crux of the plan is that..." * Performance improvements (about 11%) to prunce.c from Bruce Wilcox * fix: "He eats with me nightly." * Add new public api function: linkgrammar_get_version() * MSVC9 build files from Borislav Iordanov * Java network-efficient client-server classes from Borislav Iordanov Version 4.3.9 (8 October 2008) includes the following changes: * Issue 13: "John is altogether amazingly quick." * Nonstandard spelling "unequivocably" * Dictionary fixes for 'marginally', etc. "That one is marginally better" * Issue 7: Dictionary fixes for 'done': "I am done working" * dictionary entries for walk-up drivethru car-wash * dictionary: "I am through being mad", "It was a through flight", etc. * Issue 11: "You are doing well" * Issue 3: "I asked Jim a question", "I told Jim a story" * Passive subjects with objects: "I was told that crap, too" "...was asked..." * Fixes for Apple Mac OSX (crash on non-executable stack) * Early version of Filip Maric's boolean SAT solver * fix: "He talked quietly of revolt." * fix: "It consists mostly of sand.", "He talks, mostly of revolution." * fix: "He talked mostly to Ann.", "He talks a lot." * fix: than_usual: "He is taking longer than usual." * fix: a batch of new verbs from Roman Khlupin * fix: Fix crash on Apple Macintosh by correctly identifying the platform. * fix: "San Gabriel" "Block Island" "Great Southern Bank" "de la Rente" * fix: "I biked Johnson Creek." Version 4.3.8 (14 August 2008) includes the following changes: * Build fixes for Windows (missing bzero and thread-safe rand) * Fix several mem leaks, one in the Java jni code. * Fix crash of java6 jvm, due to blown stack limits. Version 4.3.7 (8 August 2008) includes the following changes: * Expanded list of given names to include those from 2005 US Census * Export a new java jni function, to get the inflected word. * Add a TO+ connector so that "I tend to agree" parses correctly. * Makefile fixes for Mac OS/X Leopard. Version 4.3.6 (21 July 2008) includes the following changes: * Fixes for Windows MS Visual-C builds. * Fix parsing of "He walked the dog.", "He sailed the boat." * Add support for right-apostrophe (’) which is a non-ASCII UTF8 char. * Add support for other non-ASCII UTF8 punctuation. * Fix crash on printing constituent tree of certain long sentences. * Avoid recursive error reporting for UTF8 dictionary errors. * Clarify error logging and error printing. * Add java getVersion() to return link-grammar version string. * Add more numbers to dict (e.g. twenty-seven, bazillion, half-dozen, etc.) * Foodstuffs: bagels, lox, tacos, guacamole, roe, neufchatel, mayo, etc. * Weights and measures: megabytes, °C, km² etc. * Performance improvements in printing of link-tree. * Convert assert into warning when no canonical linkages can be found. * Convert assert into warning when constituent andlist overflows. * Provide additional checks for constituent overflows. * Convert most error printfs into a formal error reporting system. * Remove all globals, library is now thread-safe. * Fix crash when sentence has square bracket, and doing constituents. Version 4.3.5 (29 April 2008) includes the following changes: * Added ant build file to create the link-grammar jar file. * Fix regression in command-line client of multiple-parse display. * Use MB_LEN_MAX, not MB_CUR_MAX for UTF8 support. * Fix a WIN32 compiler regression (no inline support in Windows). * Fix error in handling of UTF8 dictionaries. * Fix strncat() misuse in error.c * Fix capitalization errors in country names. * Fix parsing of "he angled left, he dodged left, he turned left". * Don't build the JNI library if Java isn't found. Fixes build on Windows. * Fix install bug for NetBSD systems. * Pre-detected entities cannot participate in G links. * There is no UTF8 support in windows, so stub it out. * Fix crash in constituent output, bug #22 in googlecode bugtacker. * Some small steps taken to eventually make library thread-safe. * There are three constituent string styles, enable all three. * Make the command-line flag errors less cyrptic. * Add readline (BSD editline) support. * Rename "grammar-parse" to the more logical "link-parser". * Small man page updates. * Export and cost, link cost via public API. Version 4.3.4 (16 March 2008) includes the following changes: * Fix regression of handling of capitalization at the start of sentences. * Fix dictionary search path so that it respects command-line input. * Fix rare but nasty crash when parsing long sentences in panic mode. * Add a method to set the dictionary path. * Fix all remaining compiler warnings. * Make parser capable of handling UTF8 strings and dictionaries. * Ongoing minor expansion of the Lithuanian (lt) dictionary. Version 4.3.3 (27 February 2008) includes the following changes: * Missing java is a warning, not an error. * man page for grammar-parse. * Removed cruft from the dictionary open routines. * configure tries to guess some non-standard jni.h locations. * Split up java library exports, should help cygwin builds. * Fix java library pre-linking bug. * Minor English dictionary additions. * Prototype Lithuanian (lt) dictionary. Version 4.3.2 (2 February 2008) includes the following changes: * Compile fixes for WIN32 * Dictionary fixes for given names. (Fixes a serious problem with 4.3.1) Version 4.3.1 (31 Jaunary 2008) includes the following changes: * A merger of significant parts of the "medical terms" dictionary from Peter Szolovits. This includes thousands of additional words. Version 4.3.0 (30 January 2008) includes the following changes: * New link types (Ct, Cta, Rn, Rw) for comparatives, so as to link relative clauses: "John is bigger than Dave is", "John wants more cookies than Dave wants". The Rw link is used to link question words to the relative clauses that follow them. * Dictionary Fixes for "Expresso is a coffee drink", "Teach me fetch", "I am pooped" as synonym for "I am tired", "Mother likes her", "Mommy loves me" and related. Also, directives involving "go": "Go play ball", "Go take a walk", "You and Rover go play with the ball." * Dictionary support for external entity markup. This includes the recognizition of personID0..personID60, dateID0..dateID60, organizationID0..organizationID60 and locationID0..locationID60 as appropriate words. * Fixes of numerous compile-time warnings. * Simple Java (JNI) bindings. Version 4.2.5 (11 November 2007) includes the following changes: * Security fix for a buffer overflow. CVE-2007-5395 link-grammar-4.7.4/msvc6/0000755000175000017500000000000011531775723014162 5ustar bloombloomlink-grammar-4.7.4/msvc6/link_grammar_exe/0000755000175000017500000000000011531775723017466 5ustar bloombloomlink-grammar-4.7.4/msvc6/link_grammar_exe/link_grammar_exe.dsp0000644000175000017500000001124611117253357023500 0ustar bloombloom# Microsoft Developer Studio Project File - Name="link_grammar_exe" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Console Application" 0x0103 CFG=link_grammar_exe - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "link_grammar_exe.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "link_grammar_exe.mak" CFG="link_grammar_exe - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "link_grammar_exe - Win32 Release" (based on "Win32 (x86) Console Application") !MESSAGE "link_grammar_exe - Win32 Debug" (based on "Win32 (x86) Console Application") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe RSC=rc.exe !IF "$(CFG)" == "link_grammar_exe - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c # ADD CPP /nologo /W3 /GX /O2 /I ".." /I "..\.." /I "..\..\.." /I "F:\ETCETERA\JAVA\jdk1.6.0\include\\" /I "F:\ETCETERA\JAVA\jdk1.6.0\include\win32\\" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c # ADD BASE RSC /l 0x419 /d "NDEBUG" # ADD RSC /l 0x419 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 /out:"Release/link-parser.exe" !ELSEIF "$(CFG)" == "link_grammar_exe - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c # ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I ".." /I "..\.." /I "..\..\.." /I "F:\ETCETERA\JAVA\jdk1.6.0\include\\" /I "F:\ETCETERA\JAVA\jdk1.6.0\include\win32\\" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c # ADD BASE RSC /l 0x419 /d "_DEBUG" # ADD RSC /l 0x419 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /out:"Debug/link-parser.exe" /pdbtype:sept !ENDIF # Begin Target # Name "link_grammar_exe - Win32 Release" # Name "link_grammar_exe - Win32 Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE="..\..\link-grammar\link-parser.c" # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # End Group # Begin Group "Resource Files" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # End Group # End Target # End Project link-grammar-4.7.4/msvc6/link_grammar_exe/Makefile.am0000644000175000017500000000004411117253357021512 0ustar bloombloomEXTRA_DIST= \ link_grammar_exe.dsp link-grammar-4.7.4/msvc6/link_grammar_dll/0000755000175000017500000000000011531775723017460 5ustar bloombloomlink-grammar-4.7.4/msvc6/link_grammar_dll/link_grammar_dll.dsp0000644000175000017500000002440711204312251023451 0ustar bloombloom# Microsoft Developer Studio Project File - Name="link_grammar_dll" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 CFG=link_grammar_dll - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "link_grammar_dll.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "link_grammar_dll.mak" CFG="link_grammar_dll - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "link_grammar_dll - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE "link_grammar_dll - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe MTL=midl.exe RSC=rc.exe !IF "$(CFG)" == "link_grammar_dll - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LINK_GRAMMAR_DLL_EXPORTS" /YX /FD /c # ADD CPP /nologo /MT /W3 /GX /O2 /I ".." /I "..\.." /I "..\..\.." /I "F:\ETCETERA\JAVA\jdk1.6.0\include\\" /I "F:\ETCETERA\JAVA\jdk1.6.0\include\win32\\" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LINK_GRAMMAR_DLL_EXPORTS" /YX /FD /c # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x419 /d "NDEBUG" # ADD RSC /l 0x419 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib C:\opencog\lg_svn1\gnuwin32_regex\lib\regex.lib /nologo /dll /machine:I386 /out:"Release/link-grammar.dll" !ELSEIF "$(CFG)" == "link_grammar_dll - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LINK_GRAMMAR_DLL_EXPORTS" /YX /FD /GZ /c # ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I ".." /I "..\.." /I "..\..\.." /I "F:\ETCETERA\JAVA\jdk1.6.0\include\\" /I "F:\ETCETERA\JAVA\jdk1.6.0\include\win32\\" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LINK_GRAMMAR_DLL_EXPORTS" /YX /FD /GZ /c # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x419 /d "_DEBUG" # ADD RSC /l 0x419 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib C:\opencog\lg_svn1\gnuwin32_regex\lib\regex.lib /nologo /dll /debug /machine:I386 /out:"Debug/link-grammar.dll" /pdbtype:sept !ENDIF # Begin Target # Name "link_grammar_dll - Win32 Release" # Name "link_grammar_dll - Win32 Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE="..\..\link-grammar\analyze-linkage.c" # End Source File # Begin Source File SOURCE="..\..\link-grammar\and.c" # End Source File # Begin Source File SOURCE="..\..\link-grammar\api.c" # End Source File # Begin Source File SOURCE="..\..\link-grammar\build-disjuncts.c" # End Source File # Begin Source File SOURCE="..\..\link-grammar\command-line.c" # End Source File # Begin Source File SOURCE="..\..\link-grammar\constituents.c" # End Source File # Begin Source File SOURCE="..\..\link-grammar\count.c" # End Source File # Begin Source File SOURCE="..\..\link-grammar\disjuncts.c" # End Source File # Begin Source File SOURCE="..\..\link-grammar\error.c" # End Source File # Begin Source File SOURCE="..\..\link-grammar\extract-links.c" # End Source File # Begin Source File SOURCE="..\..\link-grammar\fast-match.c" # End Source File # Begin Source File SOURCE="..\..\link-grammar\idiom.c" # End Source File # Begin Source File SOURCE="..\..\link-grammar\malloc-dbg.c" # End Source File # Begin Source File SOURCE="..\..\link-grammar\massage.c" # End Source File # Begin Source File SOURCE="..\..\link-grammar\post-process.c" # End Source File # Begin Source File SOURCE="..\..\link-grammar\pp_knowledge.c" # End Source File # Begin Source File SOURCE="..\..\link-grammar\pp_lexer.c" # End Source File # Begin Source File SOURCE="..\..\link-grammar\pp_linkset.c" # End Source File # Begin Source File SOURCE="..\..\link-grammar\prefix.c" # End Source File # Begin Source File SOURCE="..\..\link-grammar\preparation.c" # End Source File # Begin Source File SOURCE="..\..\link-grammar\print-util.c" # End Source File # Begin Source File SOURCE="..\..\link-grammar\print.c" # End Source File # Begin Source File SOURCE="..\..\link-grammar\prune.c" # End Source File # Begin Source File SOURCE="..\..\link-grammar\read-dict.c" # End Source File # Begin Source File SOURCE="..\..\link-grammar\read-regex.c" # End Source File # Begin Source File SOURCE="..\..\link-grammar\regex-morph.c" # End Source File # Begin Source File SOURCE="..\..\link-grammar\resources.c" # End Source File # Begin Source File SOURCE="..\..\link-grammar\spellcheck-hun.c" # End Source File # Begin Source File SOURCE="..\..\link-grammar\string-set.c" # End Source File # Begin Source File SOURCE="..\..\link-grammar\tokenize.c" # End Source File # Begin Source File SOURCE="..\..\link-grammar\utilities.c" # End Source File # Begin Source File SOURCE="..\..\link-grammar\word-file.c" # End Source File # Begin Source File SOURCE="..\..\link-grammar\word-utils.c" # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # Begin Source File SOURCE="..\..\link-grammar\analyze-linkage.h" # End Source File # Begin Source File SOURCE="..\..\link-grammar\and.h" # End Source File # Begin Source File SOURCE="..\..\link-grammar\api-structures.h" # End Source File # Begin Source File SOURCE="..\..\link-grammar\api-types.h" # End Source File # Begin Source File SOURCE="..\..\link-grammar\api.h" # End Source File # Begin Source File SOURCE="..\..\link-grammar\build-disjuncts.h" # End Source File # Begin Source File SOURCE="..\..\link-grammar\command-line.h" # End Source File # Begin Source File SOURCE="..\..\link-grammar\constituents.h" # End Source File # Begin Source File SOURCE="..\..\link-grammar\count.h" # End Source File # Begin Source File SOURCE="..\..\link-grammar\error.h" # End Source File # Begin Source File SOURCE="..\..\link-grammar\externs.h" # End Source File # Begin Source File SOURCE="..\..\link-grammar\extract-links.h" # End Source File # Begin Source File SOURCE="..\..\link-grammar\fast-match.h" # End Source File # Begin Source File SOURCE="..\..\link-grammar\idiom.h" # End Source File # Begin Source File SOURCE="..\..\link-grammar\link-features.h" # End Source File # Begin Source File SOURCE="..\..\link-grammar\link-includes.h" # End Source File # Begin Source File SOURCE="..\..\link-grammar\massage.h" # End Source File # Begin Source File SOURCE="..\..\link-grammar\post-process.h" # End Source File # Begin Source File SOURCE="..\..\link-grammar\pp_knowledge.h" # End Source File # Begin Source File SOURCE="..\..\link-grammar\pp_lexer.h" # End Source File # Begin Source File SOURCE="..\..\link-grammar\pp_linkset.h" # End Source File # Begin Source File SOURCE="..\..\link-grammar\prefix.h" # End Source File # Begin Source File SOURCE="..\..\link-grammar\preparation.h" # End Source File # Begin Source File SOURCE="..\..\link-grammar\print-util.h" # End Source File # Begin Source File SOURCE="..\..\link-grammar\print.h" # End Source File # Begin Source File SOURCE="..\..\link-grammar\prune.h" # End Source File # Begin Source File SOURCE="..\..\link-grammar\read-dict.h" # End Source File # Begin Source File SOURCE="..\..\link-grammar\read-regex.h" # End Source File # Begin Source File SOURCE="..\..\link-grammar\regex-morph.h" # End Source File # Begin Source File SOURCE=..\..\..\gnuwin32_regex\include\regex.h # End Source File # Begin Source File SOURCE="..\..\link-grammar\resources.h" # End Source File # Begin Source File SOURCE="..\..\link-grammar\spellcheck-hun.h" # End Source File # Begin Source File SOURCE="..\..\link-grammar\string-set.h" # End Source File # Begin Source File SOURCE="..\..\link-grammar\structures.h" # End Source File # Begin Source File SOURCE="..\..\link-grammar\tokenize.h" # End Source File # Begin Source File SOURCE="..\..\link-grammar\utilities.h" # End Source File # Begin Source File SOURCE="..\..\link-grammar\word-file.h" # End Source File # Begin Source File SOURCE="..\..\link-grammar\word-utils.h" # End Source File # End Group # Begin Group "Resource Files" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # End Group # End Target # End Project link-grammar-4.7.4/msvc6/link_grammar_dll/Makefile.am0000644000175000017500000000004411117253357021504 0ustar bloombloomEXTRA_DIST= \ link_grammar_dll.dsp link-grammar-4.7.4/msvc6/link_grammar_java_dll/0000755000175000017500000000000011531775723020461 5ustar bloombloomlink-grammar-4.7.4/msvc6/link_grammar_java_dll/link_grammar_java_dll.dsp0000644000175000017500000001115311204312251025445 0ustar bloombloom# Microsoft Developer Studio Project File - Name="link_grammar_java_dll" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 CFG=link_grammar_java_dll - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "link_grammar_java_dll.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "link_grammar_java_dll.mak" CFG="link_grammar_java_dll - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "link_grammar_java_dll - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE "link_grammar_java_dll - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe MTL=midl.exe RSC=rc.exe !IF "$(CFG)" == "link_grammar_java_dll - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LINK_GRAMMAR_JAVA_DLL_EXPORTS" /YX /FD /c # ADD CPP /nologo /MT /W3 /GX /O2 /I ".." /I "..\.." /I "..\..\.." /I "C:\java\jdk1.6.0_13\include\\" /I "C:\java\jdk1.6.0_13\include\win32\\" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LINK_GRAMMAR_JAVA_DLL_EXPORTS" /YX /FD /c # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x419 /d "NDEBUG" # ADD RSC /l 0x419 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 /out:"Release/link-grammar-java.dll" !ELSEIF "$(CFG)" == "link_grammar_java_dll - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LINK_GRAMMAR_JAVA_DLL_EXPORTS" /YX /FD /GZ /c # ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I ".." /I "..\.." /I "..\..\.." /I "C:\java\jdk1.6.0_13\include\\" /I "C:\java\jdk1.6.0_13\include\win32\\" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LINK_GRAMMAR_JAVA_DLL_EXPORTS" /YX /FD /GZ /c # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x419 /d "_DEBUG" # ADD RSC /l 0x419 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /out:"Debug/link-grammar-java.dll" /pdbtype:sept !ENDIF # Begin Target # Name "link_grammar_java_dll - Win32 Release" # Name "link_grammar_java_dll - Win32 Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE="..\..\link-grammar\jni-client.c" # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # Begin Source File SOURCE="..\..\link-grammar\jni-client.h" # End Source File # End Group # Begin Group "Resource Files" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # End Group # End Target # End Project link-grammar-4.7.4/msvc6/link_grammar_java_dll/Makefile.am0000644000175000017500000000005111117253357022503 0ustar bloombloomEXTRA_DIST= \ link_grammar_java_dll.dsp link-grammar-4.7.4/msvc6/Link_Grammar_All.dsw0000644000175000017500000000232311117253357020026 0ustar bloombloomMicrosoft Developer Studio Workspace File, Format Version 6.00 # WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! ############################################################################### Project: "link_grammar_dll"=".\link_grammar_dll\link_grammar_dll.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Project: "link_grammar_exe"=".\link_grammar_exe\link_grammar_exe.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ Begin Project Dependency Project_Dep_Name link_grammar_dll End Project Dependency }}} ############################################################################### Project: "link_grammar_java_dll"=".\link_grammar_java_dll\link_grammar_java_dll.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ Begin Project Dependency Project_Dep_Name link_grammar_dll End Project Dependency }}} ############################################################################### Global: Package=<5> {{{ }}} Package=<3> {{{ }}} ############################################################################### link-grammar-4.7.4/msvc6/Makefile.am0000644000175000017500000000015711117253357016213 0ustar bloombloomSUBDIRS= \ link_grammar_dll \ link_grammar_exe \ link_grammar_java_dll EXTRA_DIST= \ Link_Grammar_All.dsw link-grammar-4.7.4/TODO0000644000175000017500000000033410751655245013613 0ustar bloombloom List of ideas for possible improvements: ---------------------------------------- * Use wordnet to reduce the number for parses for sentences containing compound verb phrases, such as "give up", "give off", etc. link-grammar-4.7.4/Makefile.am0000644000175000017500000000145111242301140015132 0ustar bloombloomSUBDIRS=link-grammar data man link-grammar.xcode msvc6 msvc9 pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = link-grammar.pc ACLOCAL_AMFLAGS = -I m4 # Build and install the jar file in $(PREFIX)/share/java ... # XXX FIXME configure should look to see if it can find ant if HAVE_JAVA linkgrammar-@VERSION@.jar: ant javadir=$(datadir)/java java_DATA = linkgrammar-@VERSION@.jar if OS_WIN32 LN_SF = cp else LN_SF = ln -sf endif install-data-hook: ${LN_SF} ${javadir}/${java_DATA} ${DESTDIR}/${javadir}/linkgrammar.jar endif EXTRA_DIST = \ autogen.sh \ link-grammar.pc.in \ link-grammar.spec.in \ link-grammar.spec \ AUTHORS \ ChangeLog \ FindLinkGrammar.cmake\ LICENSE \ MAINTAINERS \ README \ TODO link-grammar-4.7.4/AUTHORS0000644000175000017500000000151611357714675014204 0ustar bloombloom Original Authors: Davy Temperley: http://theory.esm.rochester.edu/temperley/ Daniel Sleator: http://www.cs.cmu.edu/~sleator/ John Lafferty: http://www.cs.cmu.edu/~lafferty/ Much additional work has been done by many different developers. The current lead developer is Linas Vepstas: http://linas.org/ Some of the people who have contributed patches and fixes include: (In alphabetical order) Borislav Iordanov Vikas N Kumar Dom Lachowicz Marc Maurer Evgenii Philippov Sampo Pyysalo Murilo Saraiva de Queiroz Fridrich Strba Simon Stuart Peter Szolovits Vincent Untz Bruce Wilcox link-grammar-4.7.4/FindLinkGrammar.cmake0000644000175000017500000000371211242301140017107 0ustar bloombloom# - Try to find the link-grammar library; Once done this will define # # LINK_GRAMMAR_FOUND - system has the link-grammar library # LINK_GRAMMAR_INCLUDE_DIRS - the link-grammar include directory # LINK_GRAMMAR_LIBRARIES - The libraries needed to use link-grammar # LINK_GRAMMAR_DATA_DIR - the dir where you will find the dictionaries # Copyright (c) 2008, OpenCog.org (http://opencog.org) # # Redistribution and use is allowed according to the terms of the BSD license. # For details see the accompanying COPYING-CMAKE-SCRIPTS file. # Look for the header file FIND_PATH(LINK_GRAMMAR_INCLUDE_DIR link-grammar/link-includes.h) FIND_PATH(LINK_GRAMMAR_DATA_DIR 4.0.dict PATHS /usr/share/link-grammar/en/ /usr/local/share/link-grammar/en/) # Look for the library FIND_LIBRARY(LINK_GRAMMAR_LIBRARY NAMES link-grammar PATHS /usr/lib /usr/local/lib /opt/local/lib) # Copy the results to the output variables. IF (LINK_GRAMMAR_INCLUDE_DIR AND LINK_GRAMMAR_LIBRARY AND LINK_GRAMMAR_DATA_DIR) SET(LINK_GRAMMAR_FOUND 1) SET(LINK_GRAMMAR_LIBRARIES ${LINK_GRAMMAR_LIBRARY}) SET(LINK_GRAMMAR_INCLUDE_DIRS ${LINK_GRAMMAR_INCLUDE_DIR}) ELSE (LINK_GRAMMAR_INCLUDE_DIR AND LINK_GRAMMAR_LIBRARY AND LINK_GRAMMAR_DATA_DIR) SET(LINK_GRAMMAR_FOUND 0) SET(LINK_GRAMMAR_LIBRARIES) SET(LINK_GRAMMAR_INCLUDE_DIRS) ENDIF (LINK_GRAMMAR_INCLUDE_DIR AND LINK_GRAMMAR_LIBRARY AND LINK_GRAMMAR_DATA_DIR) # Report the results. IF (NOT LINK_GRAMMAR_FOUND) SET(LINK_GRAMMAR_DIR_MESSAGE "link-grammar was not found. Make sure LINK_GRAMMAR_LIBRARY, LINK_GRAMMAR_INCLUDE_DIR and LINK_GRAMMAR_DATA_DIR are set.") IF (NOT LINK_GRAMMAR_FIND_QUIETLY) MESSAGE(STATUS "${LINK_GRAMMAR_DIR_MESSAGE}") ELSE (NOT LINK_GRAMMAR_FIND_QUIETLY) IF (LINK_GRAMMAR_FIND_REQUIRED) MESSAGE(FATAL_ERROR "${LINK_GRAMMAR_DIR_MESSAGE}") ENDIF (LINK_GRAMMAR_FIND_REQUIRED) ENDIF (NOT LINK_GRAMMAR_FIND_QUIETLY) ENDIF (NOT LINK_GRAMMAR_FOUND) MARK_AS_ADVANCED( LINK_GRAMMAR_INCLUDE_DIR LINK_GRAMMAR_LIBRARY ) link-grammar-4.7.4/README0000644000175000017500000011363011526022265013776 0ustar bloombloom Link Grammar Parser ------------------- Version 4.7.4 The Link Grammar Parser implements the Sleator/Temperley/Lafferty theory of natural language parsing. This version of the parser is an extended, expanded version of the last official CMU release, and includes many enhancements and fixes created by many different developers. This latest version incorporates a substantial part (but not all) of the BioLG project. This code is released under the BSD license (which is GPL compatible), making it freely available for private and commercial use, with few restrictions. The terms of the license are given in the LICENSE file included with this software, and also available at http://www.link.cs.cmu.edu/link/license.html. Please see the web page http://www.abisource.com/projects/link-grammar/ for more information. This version is a continuation of the original parser posted at http://www.link.cs.cmu.edu/link CONTENTS of this directory: --------------------------- LICENSE The license describing terms of use link-grammar/*.c The program. (Written in ANSI-C) link-grammar/corpus/*.c Optional corpus statistics database. link-grammar/java/* Optional Java language bindings. link-grammar/minisat/* Optional SAT Solver. (Written in C++) link-grammar/sat-solver Optional SAT Solver. (Written in C++) data/en/* English language dictionaries. data/en/4.0.dict The file containing the dictionary definitions. data/en/4.0.knowledge The post-processing knowledge file. data/en/4.0.constituents The constituent knowledge file. data/en/4.0.affix The affix file. data/en/4.0.regex Regex-based morphology guesser. data/en/tiny.dict A small sample dictionary. data/en/words/* A directory full of word lists. data/en/4.0*.batch These files contain sentences (both grammatical and ungrammatical ones) that are handled correctly by this release of the system. These can be run through the parser with the command "./link-parser < 4.0.*.batch" COPYING The license for this code and data ChangeLog A compendium of recent changes. configure The GNU configuration script autogen.sh Developer's configure maintenance tool msvc6, msvc9 Microsoft Visual-C project files UNPACKING and signature verification: ------------------------------------- The system is distributed using the normal tar.gz format; it can be extracted using the "tar -zxf link-grammar.tar.gz" command at the command line. The files have been digitally signed to make sure that there was no corruption of the dataset during download, and to help ensure that no malicious changes were made to the code internals by third parties. The signatures can be checked with the gpg command: gpg --verify link-grammar-4.7.4.tar.gz.asc which should generate output identical to (except for the date): gpg: Signature made Tue Feb 26 19:41:07 2008 CST using RSA key ID C0389241 gpg: Good signature from "Linas Vepstas (current active email; others are inactive) " Alternately, the md5 checksums can be verified. These do not provide cryptographic security, but they can detect simple corruption. To verify the checksums, issue "md5sum -c MD5SUM" at the command line. CREATING the system: -------------------- To compile the link-grammar shared library and demonstration program, at the command line, type: ./configure make To install, change user to "root" and say make install ldconfig This will install the lib-link-grammar.so library into /usr/local/lib, the header files in /usr/local/include/link-grammar, and the dictionaries into /usr/local/share/link-grammar. Running 'ldconfig' will rebuild the shared library cache. By default, the Makefiles attempt to build the Java bindings. The use of the Java bindings is *OPTIONAL*; you do not need these if you do not plan to use link-grammar with Java. You can skip building the Java bindings by disabling as follows: ./configure --disable-java-bindings The /usr/local install target can be over-ridden using the standard GNU configure --prefix option, so for example: ./configure --prefix=/opt/link-grammar By using pkg-config (see below), non-standard install locations can be automatically detected. Additional config options are printed by ./configure --help The system has been tested and works well on 32 and 64-bit Linux systems, FreeBSD, MacOSX, as well as on many Microsoft Windows systems, under various different Windows development environments. Specific OS-dependent notes follow. BUILDING on MacOS: ------------------ Apple MacOSX users will probably need to obtain missing packages from MacPorts in order to successfully build on MacOS. See http://www.macports.org/ for details. See also: http://trac.macports.org/browser/trunk/dports/textproc/link-grammar/Portfile Users who intend to use the java bindings with java6 will need to make sure to compile link-grammar to produce a 64-bit binary, as this is not automatic on OSX. Do this during configure: ./configure CFLAGS="-arch x86_64" BUILDING on Windows ------------------- There are three different ways in which link-grammr can be compiled on Windows. One way is to use Cygwin, which provides a Linux compatibility layer for Windows. Unfortunately, the Cygwin system is not compatible with Java for Windows. Another way is use the MSVC system. A third way is to use the MinGW system, which uses the Gnu toolset to compile windows programs. Link-grammar now requires a working version of POSIX-standard regex libraries. Since these are not provided by Microsoft, a copy must be obtained elsewhere. One possibility is from the gnuwin32 system: http://gnuwin32.sourceforge.net/packages/regex.htm http://ftp.gnome.org/pub/gnome/binaries/win32/dependencies/regex.README These different build methods are NOT regularly tested, and some linkgrammar versions may have build issues. If you experience these, please submit patches that fix the problem to the mailing list. BUILDING on Windows (Cygwin) ---------------------------- The easiest way to have link-grammar working on MS Windows is to use Cygwin, a Linux-like environment for Windows making it possible to port software running on POSIX systems to Windows. Download and install Cygwin from http://www.cygwin.com/ Unfortunately, the Cygwin system is not compatible with Java, so if you need the Java bindings, you must use MSVC or MinGW, below. BUILDING on Windows (MinGW) --------------------------- Another way to build link-grammar is to use the MinGW/MSYS, which uses the Gnu toolset to compile Windows programs for Windows. This is probably the easiest way to obtain workable Java bindings for Windows. Download and install MinGW, MSYS and MSYS-DTK from http://mingw.org. Then build and install link-grammar with ./configure make make install If you used the standard installation paths, the directory /usr/ is mapped to C:\msys\1.0, so after 'make install', the libraries and executable will be found at C:\msys\1.0\local\bin and the dictionary files at C:\msys\1.0\local\share\link-grammar. In order to use the Java bindings you'll need to build two extra DLLs, by running the following commands from the link-grammar base directory: cd link-grammar gcc -g -shared -Wall -D_JNI_IMPLEMENTATION_ -Wl,--kill-at \ .libs/analyze-linkage.o .libs/and.o .libs/api.o \ .libs/build-disjuncts.o .libs/constituents.o \ .libs/count.o .libs/disjuncts.o .libs/disjunct-utils.o \ .libs/error.o .libs/expand.o .libs/extract-links.o \ .libs/fast-match.o .libs/idiom.o .libs/massage.o \ .libs/post-process.o .libs/pp_knowledge.o .libs/pp_lexer.o \ .libs/pp_linkset.o .libs/prefix.o .libs/preparation.o \ .libs/print-util.o .libs/print.o .libs/prune.o \ .libs/read-dict.o .libs/read-regex.o .libs/regex-morph.o \ .libs/resources.o .libs/spellcheck-aspell.o \ .libs/spellcheck-hun.o .libs/string-set.o .libs/tokenize.o \ .libs/utilities.o .libs/word-file.o .libs/word-utils.o \ -o /usr/local/bin/link-grammar.dll gcc -g -shared -Wall -D_JNI_IMPLEMENTATION_ -Wl,--kill-at \ .libs/jni-client.o /usr/local/bin/link-grammar.dll \ -o /usr/local/bin/link-grammar-java.dll This will create link-grammar.dll and link-grammar-java.dll in the directory c:\msys\1.0\local\bin . These files, together with link-grammar-*.jar, will be used by Java programs. Make sure that this directory is in the %PATH setting, as otherwise, the DLL's will not be found. BUILDING on Windows (MSVC) -------------------------- Microsoft Visual C/C++ project files can be found in the msvc6 and msvc9 directories. Please note that the regex package, which includes libraries and header files, must be seperately downloaded and installed, as described above. The MSVC project files *MUST* be modified to indicate the correct location of the regex libraries. The build files make use of two environment variables, GNUREGEX and JAVA_HOME. -- GNUREGEX must be pointing to an unzipped gnuwin32-regex distribution. -- JAVA_HOME must be pointing to a locally installed JDK. Those two can be set either as system environment variables (Windows users are supposed to know how to do this :) or as MSVC9 user macros. But just in case you don't, here's how: 1) Start > Control Panel > System (remember in Vista or 7 you need to switch to "Classic View" or "Large icons" respectively to see the System icon). 2) "Advanced system settings" (or "Advanced" tab under XP) 3) On all versions you will see a button with the caption "Environment Variables", press it.... (ALL REMAINING STEPS CORRELATE ON XP, VISTA, AND 7) 4) You now see two lists of environment variables... the top one says "User variables for " and is localized to your user account, the other says "System variables" and applies to ALL user accounts on that computer. 5) Press the "New ..." button corresponding to whether or not you want the variables to be valid on ALL accounts or just your own (either way the following steps remain the same) 6) In the "Variable name:" box, enter "GNUREGEX". 7) In the "Variable value" box, enter the path to your installation of GNUREGEX (on my system this is "C:\Program Files (x86)\GnuWin32" as I am on Windows 7 Ultimate x64) then press "OK" 8) Press the same "New ..." button and this time in the "Variable name" box enter "JAVA_HOME", and in the "Variable value" box enter the path to your Java SDK root folder. (IMPORTANT NOTE: On some systems this variable may already be defined automatically by the JAVA SDK installation! You should check the variables lists before creating a new one to avoid any conflict). 9) Press "OK" and close all Windows opened during the above steps. If you were running MSVC++ or your chosen development environment whilst performing the above steps, you should restart it! Once restarted you should be able to build the latest version of the code. RUNNING the program: -------------------- To run the program issue the Unix command: ./link-parser This starts the program. The program has many user-settable variables and options. These can be displayed by entering !var at the link-parser prompt. Entering !help will display some additional commands. The dictionaries contain some utf-8 punctuation. These may generate errors for users in a non-utf-8 locale, such as the "C" locale. The locale can be set, for example, by saying export LANG=en_US.UTF-8 at the shell prompt. By default, the parser will use dictionaries at the installed location (typically in /usr/local/share). Other locations can be specified on the command line; for example: link-parser ../path/to-my/modified/data/en When accessing dictionaries in non-standard locations, the standard filenames are still assumed (i.e. 4.0.dict, 4.0.affix, etc.) If you see errors similar to this: Warning: The word "encyclop" found near line 252 of en/4.0.dict matches the following words: encyclop This word will be ignored. then your UTF-8 locales are either not installed or not configured. The shell command `locale -a` should list en_US.utf8 as a locale. If not, then you need to `dpkg-reconfigure locales` and/or run `update-locale` or possibly `apt-get install locales`, or combinations or variants of these, depending on your operating system. TESTING the program: -------------------- The program can run in batch mode for testing the system on a large number of sentences. The following command runs the parser on a file called 4.0.batch ./link-parser < 4.0.batch The line "!batch" near the top of 4.0.batch turns on batch mode. In this mode sentences labeled with an initial "*" should be rejected and those not starting with a "*" should be accepted. The current batch file does report some errors, as do the files "4.0.biolg.batch" and "4.0.fixes.batch". Work is ongoing to fix these. The "4.0.fixes.batch" file contains sentences that have been fixed since the original 4.1 release of link-grammar. The "4.0.biolg.batch" contains biology/medical-text sentences from the BioLG project. USING the parser in your own applications: ------------------------------------------ There is an API (application program interface) to the parser. This makes it easy to incorporate it into your own applications. The API is documented on the web site. USING pkg-config: ----------------- To make compiling and linking easier, the current release uses the pkg-config system. To determine the location of the link-grammar header files, say `pkg-config --cflags link-grammar` To obtain the location of the libraries, say `pkg-config --libs link-grammar` Thus, for example, a typical makefile might include the targets: .c.o: cc -O2 -g -Wall -c $< `pkg-config --cflags link-grammar` $(EXE): $(OBJS) cc -g -o $@ $^ `pkg-config --libs link-grammar` JAVA bindings: -------------- This release includes Java bindings. Their use is optional. The bindings will be built automatically if jni.h can be found. Some common java JVM distributions (most notably, the ones from Sun) place this file in unusual locations, where it cannot be automatically found. To remedy this, make sure that JAVA_HOME is set. The configure script looks for jni.h in $JAVA_HOME/Headers and in $JAVA_HOME/include; it also examines corresponding locations for $JDK_HOME. If jni.h still cannot be found, specify the location with the CPPFLAGS variable: so, for example, export CPPFLAGS="-I/opt/jdk1.5/include/:/opt/jdk1.5/include/linux" or export CPPFLAGS="-I/c/java/jdk1.6.0/include/ -I/c/java/jdk1.6.0/include/win32/" Please note that the use of /opt is non-standard, and most system tools will fail to find packages installed there. The building of the Java bindings can be disabled by configuring as below: ./configure --disable-java-bindings Spell Checking: --------------- The parser will run a spell-checker at an early stage, if it encounters a word that it does not know, and cannot guess, based on morphology. The configure script looks for the aspell or hunspell spell-checkers; if the aspell devel environment is found, then aspell is used, else hunspell is used. Spell checking may be disabled at runtime, in the link-parser client with the !spell flag. Enter !help for more details. Corpus Statistics: ------------------ The parser now contains some experimental code for using corpus statistics to provide a parse ranking, and to assign WordNet word senses to word, based on their grammatical usage. An overview of the idea is given on the OpenCog blog, here: http://brainwave.opencog.org/2009/01/12/determining-word-senses-from-grammatical-usage/ It is planned that the Corpus statistics database will be used to guide the SAT solver. To enable the corpus statistics, specify ./configure --enable-corpus-stats prior to compiling. The database itself can be downloaded from http://www.abisource.com/downloads/link-grammar/sense-dictionary/ or http://gnucash.org/linas/nlp/data/linkgrammar-wsd/ The data is contained in an sqlite3 database file, disjuncts.20090430.db.bz2 Unzip this file (using bunzip2) rename it to "disjuncts.db", and place it in the subdirectory "sql", in the same directory that contains the "en" directory. For default unix installations, the final location would be /usr/local/share/link-grammar/sql/disjuncts.db where, by comparison, the usual dictionary would be at /usr/local/share/link-grammar/en/4.0.dict After this is installed, parse ranking scores should be printed automatically, as floating-point numbers: for example: Unique linkage, cost vector = (CORP=4.4257 UNUSED=0 DIS=1 AND=0 LEN=5) Lower numbers are better. The scores can be interpreted as -log_2 of a certain probability, so the lower the number, the higher the probability. The display of disjunct scores can be enabled with the !disjuncts flag, and senses with the !senses flag, at the link-parser prompt. Entering !var and !help will show all flags. Multiple parses are sorted and displayed in order from lowest to highest cost; the sort of can be set by saying !cost=1 for the traditional sort, and !cost=2 for corpus-based cost. Output similar to the below should be printed: linkparser> !disjunct Showing of disjunct used turned on. linkparser> !cost=2 cost set to 2 linkparser> !sense Showing of word senses turned on. linkparser> this is a test Found 1 linkage (1 had no P.P. violations) Unique linkage, cost vector = (CORP=4.4257 UNUSED=0 DIS=1 AND=0 LEN=5) +--Ost--+ +-Ss*b+ +-Ds-+ | | | | this.p is.v a test.n 2 is.v dj=Ss*b- Ost+ sense=be%2:42:02:: score=2.351568 2 is.v dj=Ss*b- Ost+ sense=be%2:42:05:: score=2.143989 2 is.v dj=Ss*b- Ost+ sense=be%2:42:03:: score=1.699292 4 test.n dj=Ost- Ds- sense=test%1:04:00:: score=0.000000 this.p 0.0 0.695 Wd- Ss*b+ is.v 0.0 7.355 Ss*b- Ost+ a 0.0 0.502 Ds+ test.n 1.0 9.151 Ost- Ds- Note that the sense labels are not terribly accurate; the verb "to be" is particularly hard to tag correctly. MULTI-THREADED USE: ------------------- The link-grammar library should be thread-safe as of version 4.3.6, although this has not yet been tested very well, and may possibly be buggy. To enable the thread-safe version of the library, run ./configure like so: ./configure --enable-pthreads The resulting library is thread-safe for all parsing and general use, with the exception of the startup/initialization code. That is, the initial open/creation of the parser dictionary should be done only once, from a single thread, and parsing should not be started until after the dictionary has been read and initialized. Parse options can be set on a per-thread basis, with the exception of verbosity, which is treated as a global. The library uses pthreads for the few spots where it needs to manage per-thread storage. It is possibly quite reasonable to abolish these few spots, thus making the library not only thread-safe, but thread agnostic (i.e. not require pthreads). The following exceptions and special notes apply: error.c -- uses pthreads to access error message area. utilities.c -- has global "verbosity". Uses pthreads for tracking memory usage. The memory usage code is just about obsolete, and could probably be discarded. jni-client.c - uses per-thread struct, but needs to be attached to JNIEnv somehow. malloc-dbg.c - not thread safe, not normally used; only for debugging. prefix.c - not thread-safe, but doesn't need to be; used only during initialization, and only if binreloc turned on. pp_lexer.c -- autogened code, original lex sources lost. This is only used when reading dictionaries, during initialization, and so doesn't need to be thread safe. utilities.h -- Windows doesn't have a thread-safe random-number generator, which means link-grammar for Windows is not currently thread-safe. BioLG merger: ------------- Much of the BioLG project changes have been merged into this version. The current version of link-grammar has superior parse coverage to BioLG on all texts, including biomedical texts. The original BioLG test suite can be found in data/en/4.0.biolg.batch. The following changes in BioLG have NOT been merged: -- Part of speech hinting. The BioLG code can accept part-of-speech hints for unknown words. -- XML I/O. The BioLG code can output parsed text in a certain idiosyncratic XML format. -- "term support". Link-grammar does support "entity placeholders", which provides an equivalant function. -- The link type CH. This was a large, intrusive, incompatible change to the dictionary, and it is not strictly required -- there is a better, alternative way of handling adj-noun-adj-noun chains commonly seen in biomedical text, and this has been implemented. All other BioLG changes, and in particular, extensive dictionary fixes, as well as regex morphology handling, have been incorporated. Performance issues: ------------------- The current parser experiences significant performance problems for long sentences that contain many conjunctions (and, or, but, etc.) This is primarily due to a combinatorial explosion of linkage possibilities for the conjunctions; the culprit is the indiscriminate processing done by the "fat linkage" algorithm. Work is underway to replace the "fat linkage" mechanism by a set of more tightly-focused linkage rules for conjunctions; this work is far from complete. The use of fat linkages is turned on by default; it can be disabled by specifying the !use-fat flag at the command-line, or by calling parse_options_use_fat_links(FALSE) from programs. SAT solver: ----------- The current parser uses an algorithm that runs in O(N^3) time, for a sentence containing N words. This algorithm is more or less a chart parser, a variant of the Earley parser. The SAT solver aims to replace the chart parser with an algorithm based on Boolean Satisfiability Theory; specifically using the MiniSAT solver. The SAT solver has a bit more overhead for shorter sentences, but is significantly faster for long sentences. To work properly, it needs to be attached to a parse ranking system. This work is incomplete, although the prototype works. it is not yet well-integrated with the system, and needs cleanup. The SAT solver is enabled by specifying ./configure --enable-sat-solver prior to compiling. COMMERCIAL use: --------------- The original authors would be pleased to discuss alternate licensing terms and/or additional research work, with those wanting to use this system under a paid contract. Academic products or papers should reference the various link grammar publications. ADDRESSES --------- If you have any questions, or find any bugs, please feel free to send a note to the mailing list: link-grammar@googlegroups.com Although all messages should go to the mailing list, the current maintainers can be contacted at: Dom Lachowicz - Linas Vepstas - The original authors of the Link Grammar parser are: Daniel Sleator sleator@cs.cmu.edu Computer Science Department 412-268-7563 Carnegie Mellon University www.cs.cmu.edu/~sleator Pittsburgh, PA 15213 Davy Temperley dtemp@theory.esm.rochester.edu Eastman School of Music 716-274-1557 26 Gibbs St. www.link.cs.cmu.edu/temperley Rochester, NY 14604 John Lafferty lafferty@cs.cmu.edu Computer Science Department 412-268-6791 Carnegie Mellon University www.cs.cmu.edu/~lafferty Pittsburgh, PA 15213 TODO -- Working Notes: ---------------------- Some working notes. Bad grammar: When a sentence fails to parse, look for: * confused words: its/it's, there/their, to/too, your/you're ... * missing apostrophes in possessives: "the peoples desires" * determiner agreement errors: "a books" * aux verb agreement errors: "to be hooks up" A/An determiners before consonants/vowels: fix this. Just adding linkages in a naive way is not enough, because there's no restriction on neighboring words: "I ate an apple." vs. "I ate a green apple". Should this be done in post-processing? or in pre-processing? (maybe easier to post-process, but more biologically natural as a pre-process step.) Conjunction cleanup: parser has some special-case code for dealing with conjunctions. Unfortunately, some of this code has hard-wired English words in them. These are in construct_either() and in set_is_conjunction(). Actually, all of massage.c Grep for XXX FIXME. These need to be refactored. Poor linkage choices: Compare "she will be happier than before" to "she will be more happy than before." Current parser makes "happy" the head word, and "more" a modifier w/EA link. I beleive the correct solution would be to make "more" the head (link it as a comparative), and make "happy" the dependent. This would harmonize rules for comparatives... and would eliminate/simplify rules for less,more. Repulsive parses: Sometimes, the existance of one parse should suggest that another parse must surely be wrong: if one parse is possible, then the other parses must surely be unlikely. For example: the conjunction and.j-g allows the "The Great Southern and Western Railroad" to be parsed as the single name of an entity. However, it also provides a pattern match for "John and Mike" as a single entity, which is almost certainly wrong. But "John and Mike" has an alternative parse, as a conventional-and -- a list of two people, and so the existance of this alternaive (and correct) parse suggests that perhaps the entity-and is really very much the wrong parse. That is, the mere possibility of certain parses should strongly disfavour other possible parses. (Exception: Ben & Jerry's ice cream; however, in this case, we could recognize Ben & Jerry as the name of a proper brand; but this is outside of the "normal" dictionary (?) (but maybe should be in the dictionary!)) More examples: "high water" can have A joining high.a and AN joining high.n; these two should either be collapsed into one, or one should be eliminated. incremental parsing: to avoid a combinatorial explosion of parses, it would be nice to have an incremental parsing, phrase by phrase, using a Viterbi-like algorithm to obtain the parse. Thus, for example, the parse of the last half of a long, run-on sentence should not be sensitive to the parse of the beginning of the sentence. Doing so would help with combinatorial explosion. So, for example, if the first half of a sentence has 4 plausible parses, and the last half has 4 more, then link-grammar reports 16 parses total. It would be much, much more useful to instead be given the factored results: i.e. the four plausible parses for the first half, and the four plausible parses for the last half. The lower combinatoric stress would ease the burden on downstream users of link-grammar. (This somewhat resembles the application of construction grammar ideas to the link-grammar dictionary). Caution: watch out for garden-path sentences: The horse raced past the barn fell. The old man the boat. The cotton clothing is made of grows in Mississippi. The current parser parses these perfectly; a viterbi parsr could trip on these. Registers: Consider the sentence "Thieves rob bank" -- a typical newspaper headline. LG currently fails to parse this, because the determiner is missing ("bank" is a count noun, not a mass noun, and thus requires a determiner. By contrast, "thieves rob water" parses just fine.) A fix for this would be to replace mandatory determiner links by (D- or {[[()]] & headline-flag}) which allows the D link to be ommitted if the headline-flag bit is set. Here, "headline-flag" could be a new link-type, but one that is not subject to planarity constraints. Note that this is easier said than done: if one simply adds a high-cost null link, and no headline-flag, then all sorts of ungrammatical sentences parse, with strange parses; while some grammatical sentences, which should parse, but currently don't, become parseable, but with crazy results. Assorted minor cleanup: -- Should provide a query that returns compile-time consts, e.g. the max number of characters in a word, or max words in a sentence -- Should remove compile-time constants, e.g. max words, max length etc. -- Split out parse-options, so that the command-line client options are not in the parse-options struct. Hand-refining verb patterns: A good reference for refining verb usage patterns is: COBUILD GRAMMAR PATTERNS 1: VERBS from THE COBUILD SERIES /from/ THE BANK OF ENGLISH HARPER COLLINS online at https://arts-ccr-002.bham.ac.uk/ccr/patgram/ http://www.corpus.bham.ac.uk/publications/index.shtml Quotations: Currently, tokenize.c ignores all ASCII double-quotes (grep for "quote_found" in the source). However, it does not do this for the various "curly" UTF8 quotes, such as ‘these’ and “these”. This results is some ugly parsing for sentences containing such quotes. (Note that these are in 4.0.affix). no-links-cross: Link Grammar uses a constraint that all linkages must be planar graphs. While this is mostly correct, it would probably be more correct to use "landmark transitivity" as articulated by Hudson in the Word Grammar theory. This might allow the elimination of most or all post-processing rules. This is done by making each link directional: one end of the link is the parent. (e.g. noun, noun-modifier: the noun is the parent). Parents are landmarks for children. Transitivity is applied to parent-child relationships. Specifically, the no-links-cross rule is replaced by two landmark transitivity rules: -- If B is a landmark for C, then A is also a type-L landmark for C -- If A is a landmark for C, then B is also a landmark for C where type-L means either a right-going or left-going link. See http://goertzel.org/ProwlGrammar.pdf for details. See also: http://www.phon.ucl.ac.uk/home/dick/enc/syntax.htm "to be fishing": Link grammar offers four parses of "I was fishing for evidence", two of which are given low scores, and two are given high scores. Of the two with high scores, one parse is clearly bad. Its links "to be fishing.noun" as opposed to the correct "to be fishing.gerund". That is, I can be happy, healthy and wise, but I certainly cannot be fishing.noun. This is perhaps not just a bug in the structure of the dictionary, but is perhaps deeper: link-grammar has little or no concept of lexical units (i.e. collocations, idioms, institutional phrases), which thus allows parses with bad word-senses to sneak in. The goal is to introduce more knowledge of lexical units into LG. Different word senses can have different grammar rules (and thus, the links employed reveal the sense of the word): for example: "I tend to agree" vs. "I tend to the sheep" -- these employ two different meanings for the verb "tend", and the grammatical constructions allowed for one meaning are not the same as those allowed for the other. Yet, the link rules for "tend.v" have to accommodate both senses, thus making the rules rather complex. Worse, it potentially allows for non-sense constructions. If, instead, we allowed the dictionary to contain different rules for "tend.meaning1" and "tend.meaning2", the rules would simplify (at the cost of inflating the size of the dictionary). Another example: "I fear so" -- the word "so" is only allowed with some, but not all, lexical senses of "fear". So e.g. "I fear so" is in the same semantic class as "I think so" or "I hope so", although other meanings of these verbs are otherwise quite different. [Sin2004] "New evidence, new priorities, new attitudes" in J. Sinclair, (ed) (2004) How to use corpora in language teaching, Amsterdam: John Benjamins See also: Pattern Grammar: A Corpus-Driven Approach to the Lexical Grammar of English Susan Hunston and Gill Francis (University of Birmingham) Amsterdam: John Benjamins (Studies in corpus linguistics, edited by Elena Tognini-Bonelli, volume 4), 2000 "holes" in collocations (aka "set phrases" of "phrasemes"): The link-grammar provides several mechanisms to support circumpositions or even more complicated multi-word structures. One mechanism is by ordinary links; see the V, XJ and RJ links. The other mechanism is by means of post-processing rules. However, rules for many common forms have not yet been written. The general problem is of supporting structures that have "holes" in the middle. For example, the adposition: ... from [xxx] on. "He never said another word from then on." "I promise to be quiet from now on." "Keep going straight from that point on." "We went straight from here on." ... from there on. "We went straight, from the house on to the woods." "We drove straight, from the hill onwards." Note that multiple words can fit in the slot [xxx]. Note the tangling of another prepositional phrase: "... from [xxx] on to [yyy]" More complicated collocations with holes include "First.. next..." "If ... then ..." 'Then' is optional, for example: "If it is raining, stay inside!" "if ... only ..." "If there were only more like you!" "... not only, ... but also ..." "Either ... or ..." "Both ... and ..." "Both June and Tom are coming" "ought ... if ..." "That ought to be the case, if John is not lying" "Someone ... who ..." "Someone is outside who wants to see you" The above are not currently supported. An example that is supported is the "non-referential it", e.g. "It ... that ..." "It seemed likely that John would go" The above is supported by means of special disjuncts for 'it' and 'that', which must occur in the same post-processing domain. See also: http://www.phon.ucl.ac.uk/home/dick/enc/syntax.htm#relative-clause http://www.phon.ucl.ac.uk/home/dick/enc/syntax.htm#extraposition "...from X and from Y" "By X, and by Y, ..." Here, X and Y might be rather long phrases, containing other prepositions. In this case, the usual link-grammar linkage rules will typically conjoin "and from Y" to some preposition in X, instead of the correct link to "from X". Although adding a cost to keep the lengths of X and Y approximately equal can help, it would be even better to recognize the "...from ... and from..." pattern. One possible way to implement this would be to give preference to and-links that have the same word on either end. More idiomatic than the above examples: "...the chip on X's shoulder" "to do X a favour" "to give X a look" The above are all examples of "set phrases" or "phrasemes", and are most commonly discussed in the context of MTT or Meaning-Text Theory of Igor Mel'cuk et al (search for "MTT Lexical Function" for more info). Mel'cuk treats set phrases as lexemes, and, for parsing, this is not directly relevent. However, insofar as phrasemes have a high mutual information content, they can dominate the syntactic structure of a sentence. MTT suggests that perhaps the correct way to understand the contents of the post-processing rules is as an implementation of 'lexical functions' projected onto syntax. That is, the post-processing rules allow only certain syntactical constructions, and these are the kinds of constructions one typically sees in certain kinds of lexical functions. Alternately, link-grammar suffers from a combinatoric explosion of possible parses of a given sentence. It would seem that lexical functions could be used to rule out many of these parses. On the other hand, the results are likely to be similar to that of statistical pare ranking (which presumably captures such quasi-idiomatic collocations at least weakly). Ref. I. Mel'cuk: "Collocations and Lexical Functions", in ''Phraseology: theory, analysis, and applications'' Ed. Anthony Paul Cowie (1998) Oxford University Press pp. 23-54.