(****************************************************************) (* Unit Test for the LinkGrammar Ocaml API *) (* also doubles as an example of API usage *) (* *) (* Given a file name, with one sentence per line, parses all *) (* sentences in the file -- it prints the linkage diagram, and *) (* the constituent tree for each linkage *) (* *) (* The unit test is to run this on the file "4.0.batch" *) (* 4.0.batch is a *) (* file containing about 900 sentences that is part of the *) (* linkgrammar distribution under "data" directory *) (* *) (* Author: Ramu Ramamurthy ramu_ramamurthy at yahoo dot com *) (* (C) 2006 *) (* *) (* This is released under the BSD license *) (****************************************************************) open Linkgrammar;; (* LinkGrammar constituent tree algorithm has a bug on the 3rd linkage on the following sentence in 4.0.batch *) let buggyStr = "This is the man whose dog I bought";; let printLinkages sentparse po = let numLinkages = sentNumValidLinkages sentparse in let () = Printf.printf "num of linkages = %d\n" numLinkages in if numLinkages > 0 then for i = 0 to (numLinkages-1) do let linkage = linkageCreate sentparse i po in let () = linkageSetSublinkage linkage 0 in ( Printf.printf "linkage %d is: %s\n" i (linkagePrintDiagram linkage); flush stdout; printConstituentTree linkage ); done ;; let parseAndPrint sent po = let numLinkages = sentParse sent po in let () = Printf.printf "num of linkages = %d\n" numLinkages in let () = flush stdout in if numLinkages > 0 then printLinkages sent po else let () = poSetMaxNullCount po (sentLength sent) in let () = poSetMinNullCount po 1 in let numLinkages = sentParse sent po in let () = Printf.printf "num of linkages = %d\n" numLinkages in let () = flush stdout in if numLinkages > 0 then printLinkages sent po ;; let parseFromFile dict po fname = let in_c = open_in fname in try while true do let str = input_line in_c in if (String.length str) > 0 then if str.[0] <> '!' && str <> buggyStr then ( let () = Printf.printf "---------- parsing %s\n" str in let sent = sentCreate dict str in parseAndPrint sent po ); done with x -> () ;; let po = poCreate ();; let () = poSetLinkageLimit po 1000;; let defaultDict = dictCreate ("en");; let () = Printf.printf "Enter input file:\n";; let inp = read_line ();; let () = parseFromFile defaultDict po inp;;