frprep 0.0.1.prealpha
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.yardopts +8 -0
 - data/CHANGELOG.rdoc +0 -0
 - data/LICENSE.rdoc +0 -0
 - data/README.rdoc +0 -0
 - data/lib/common/AbstractSynInterface.rb +1227 -0
 - data/lib/common/BerkeleyInterface.rb +375 -0
 - data/lib/common/CollinsInterface.rb +1165 -0
 - data/lib/common/ConfigData.rb +694 -0
 - data/lib/common/Counter.rb +18 -0
 - data/lib/common/DBInterface.rb +48 -0
 - data/lib/common/EnduserMode.rb +27 -0
 - data/lib/common/Eval.rb +480 -0
 - data/lib/common/FixSynSemMapping.rb +196 -0
 - data/lib/common/FrPrepConfigData.rb +66 -0
 - data/lib/common/FrprepHelper.rb +1324 -0
 - data/lib/common/Graph.rb +345 -0
 - data/lib/common/ISO-8859-1.rb +24 -0
 - data/lib/common/ML.rb +186 -0
 - data/lib/common/Maxent.rb +215 -0
 - data/lib/common/MiniparInterface.rb +1388 -0
 - data/lib/common/Optimise.rb +195 -0
 - data/lib/common/Parser.rb +213 -0
 - data/lib/common/RegXML.rb +269 -0
 - data/lib/common/RosyConventions.rb +171 -0
 - data/lib/common/SQLQuery.rb +243 -0
 - data/lib/common/STXmlTerminalOrder.rb +194 -0
 - data/lib/common/SalsaTigerRegXML.rb +2347 -0
 - data/lib/common/SalsaTigerXMLHelper.rb +99 -0
 - data/lib/common/SleepyInterface.rb +384 -0
 - data/lib/common/SynInterfaces.rb +275 -0
 - data/lib/common/TabFormat.rb +720 -0
 - data/lib/common/Tiger.rb +1448 -0
 - data/lib/common/TntInterface.rb +44 -0
 - data/lib/common/Tree.rb +61 -0
 - data/lib/common/TreetaggerInterface.rb +303 -0
 - data/lib/common/headz.rb +338 -0
 - data/lib/common/option_parser.rb +13 -0
 - data/lib/common/ruby_class_extensions.rb +310 -0
 - data/lib/fred/Baseline.rb +150 -0
 - data/lib/fred/FileZipped.rb +31 -0
 - data/lib/fred/FredBOWContext.rb +863 -0
 - data/lib/fred/FredConfigData.rb +182 -0
 - data/lib/fred/FredConventions.rb +232 -0
 - data/lib/fred/FredDetermineTargets.rb +324 -0
 - data/lib/fred/FredEval.rb +312 -0
 - data/lib/fred/FredFeatureExtractors.rb +321 -0
 - data/lib/fred/FredFeatures.rb +1061 -0
 - data/lib/fred/FredFeaturize.rb +596 -0
 - data/lib/fred/FredNumTrainingSenses.rb +27 -0
 - data/lib/fred/FredParameters.rb +402 -0
 - data/lib/fred/FredSplit.rb +84 -0
 - data/lib/fred/FredSplitPkg.rb +180 -0
 - data/lib/fred/FredTest.rb +607 -0
 - data/lib/fred/FredTrain.rb +144 -0
 - data/lib/fred/PlotAndREval.rb +480 -0
 - data/lib/fred/fred.rb +45 -0
 - data/lib/fred/md5.rb +23 -0
 - data/lib/fred/opt_parser.rb +250 -0
 - data/lib/frprep/AbstractSynInterface.rb +1227 -0
 - data/lib/frprep/Ampersand.rb +37 -0
 - data/lib/frprep/BerkeleyInterface.rb +375 -0
 - data/lib/frprep/CollinsInterface.rb +1165 -0
 - data/lib/frprep/ConfigData.rb +694 -0
 - data/lib/frprep/Counter.rb +18 -0
 - data/lib/frprep/FNCorpusXML.rb +643 -0
 - data/lib/frprep/FNDatabase.rb +144 -0
 - data/lib/frprep/FixSynSemMapping.rb +196 -0
 - data/lib/frprep/FrPrepConfigData.rb +66 -0
 - data/lib/frprep/FrameXML.rb +513 -0
 - data/lib/frprep/FrprepHelper.rb +1324 -0
 - data/lib/frprep/Graph.rb +345 -0
 - data/lib/frprep/ISO-8859-1.rb +24 -0
 - data/lib/frprep/MiniparInterface.rb +1388 -0
 - data/lib/frprep/Parser.rb +213 -0
 - data/lib/frprep/RegXML.rb +269 -0
 - data/lib/frprep/STXmlTerminalOrder.rb +194 -0
 - data/lib/frprep/SalsaTigerRegXML.rb +2347 -0
 - data/lib/frprep/SalsaTigerXMLHelper.rb +99 -0
 - data/lib/frprep/SleepyInterface.rb +384 -0
 - data/lib/frprep/SynInterfaces.rb +275 -0
 - data/lib/frprep/TabFormat.rb +720 -0
 - data/lib/frprep/Tiger.rb +1448 -0
 - data/lib/frprep/TntInterface.rb +44 -0
 - data/lib/frprep/Tree.rb +61 -0
 - data/lib/frprep/TreetaggerInterface.rb +303 -0
 - data/lib/frprep/do_parses.rb +142 -0
 - data/lib/frprep/frprep.rb +686 -0
 - data/lib/frprep/headz.rb +338 -0
 - data/lib/frprep/one_parsed_file.rb +28 -0
 - data/lib/frprep/opt_parser.rb +94 -0
 - data/lib/frprep/ruby_class_extensions.rb +310 -0
 - data/lib/rosy/AbstractFeatureAndExternal.rb +240 -0
 - data/lib/rosy/DBMySQL.rb +146 -0
 - data/lib/rosy/DBSQLite.rb +280 -0
 - data/lib/rosy/DBTable.rb +239 -0
 - data/lib/rosy/DBWrapper.rb +176 -0
 - data/lib/rosy/ExternalConfigData.rb +58 -0
 - data/lib/rosy/FailedParses.rb +130 -0
 - data/lib/rosy/FeatureInfo.rb +242 -0
 - data/lib/rosy/GfInduce.rb +1115 -0
 - data/lib/rosy/GfInduceFeature.rb +148 -0
 - data/lib/rosy/InputData.rb +294 -0
 - data/lib/rosy/RosyConfigData.rb +115 -0
 - data/lib/rosy/RosyConfusability.rb +338 -0
 - data/lib/rosy/RosyEval.rb +465 -0
 - data/lib/rosy/RosyFeatureExtractors.rb +1609 -0
 - data/lib/rosy/RosyFeaturize.rb +280 -0
 - data/lib/rosy/RosyInspect.rb +336 -0
 - data/lib/rosy/RosyIterator.rb +477 -0
 - data/lib/rosy/RosyPhase2FeatureExtractors.rb +230 -0
 - data/lib/rosy/RosyPruning.rb +165 -0
 - data/lib/rosy/RosyServices.rb +744 -0
 - data/lib/rosy/RosySplit.rb +232 -0
 - data/lib/rosy/RosyTask.rb +19 -0
 - data/lib/rosy/RosyTest.rb +826 -0
 - data/lib/rosy/RosyTrain.rb +232 -0
 - data/lib/rosy/RosyTrainingTestTable.rb +786 -0
 - data/lib/rosy/TargetsMostFrequentFrame.rb +60 -0
 - data/lib/rosy/View.rb +418 -0
 - data/lib/rosy/opt_parser.rb +379 -0
 - data/lib/rosy/rosy.rb +77 -0
 - data/lib/shalmaneser/version.rb +3 -0
 - data/test/frprep/test_opt_parser.rb +94 -0
 - data/test/functional/functional_test_helper.rb +40 -0
 - data/test/functional/sample_experiment_files/fred_test.salsa.erb +122 -0
 - data/test/functional/sample_experiment_files/fred_train.salsa.erb +135 -0
 - data/test/functional/sample_experiment_files/prp_test.salsa.erb +138 -0
 - data/test/functional/sample_experiment_files/prp_test.salsa.fred.standalone.erb +120 -0
 - data/test/functional/sample_experiment_files/prp_test.salsa.rosy.standalone.erb +120 -0
 - data/test/functional/sample_experiment_files/prp_train.salsa.erb +138 -0
 - data/test/functional/sample_experiment_files/prp_train.salsa.fred.standalone.erb +138 -0
 - data/test/functional/sample_experiment_files/prp_train.salsa.rosy.standalone.erb +138 -0
 - data/test/functional/sample_experiment_files/rosy_test.salsa.erb +257 -0
 - data/test/functional/sample_experiment_files/rosy_train.salsa.erb +259 -0
 - data/test/functional/test_fred.rb +47 -0
 - data/test/functional/test_frprep.rb +52 -0
 - data/test/functional/test_rosy.rb +20 -0
 - metadata +270 -0
 
    
        data/lib/frprep/headz.rb
    ADDED
    
    | 
         @@ -0,0 +1,338 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # name: Module Headz
         
     | 
| 
      
 2 
     | 
    
         
            +
            # auth: albu@coli.uni-sb.de
         
     | 
| 
      
 3 
     | 
    
         
            +
            # 
         
     | 
| 
      
 4 
     | 
    
         
            +
            # modified KE Sept 04:
         
     | 
| 
      
 5 
     | 
    
         
            +
            # changed from old Sentence pkg to new SalsaTigerSentence pkg
         
     | 
| 
      
 6 
     | 
    
         
            +
            #
         
     | 
| 
      
 7 
     | 
    
         
            +
            # modified KE April 05:
         
     | 
| 
      
 8 
     | 
    
         
            +
            # suppress the flood of warnings
         
     | 
| 
      
 9 
     | 
    
         
            +
            #
         
     | 
| 
      
 10 
     | 
    
         
            +
            # modified SP June 05: added some more cases; change to SalsTigerRegXML
         
     | 
| 
      
 11 
     | 
    
         
            +
            # 
         
     | 
| 
      
 12 
     | 
    
         
            +
            # 
         
     | 
| 
      
 13 
     | 
    
         
            +
            # INIT: REXML TIGER sentence, 
         
     | 
| 
      
 14 
     | 
    
         
            +
            # FUNC: syn_nodes(term/non_term) -> heads   
         
     | 
| 
      
 15 
     | 
    
         
            +
            #  
         
     | 
| 
      
 16 
     | 
    
         
            +
            # 
         
     | 
| 
      
 17 
     | 
    
         
            +
            # usage:
         
     | 
| 
      
 18 
     | 
    
         
            +
            # 
         
     | 
| 
      
 19 
     | 
    
         
            +
            # h = Headz.new() 
         
     | 
| 
      
 20 
     | 
    
         
            +
            #
         
     | 
| 
      
 21 
     | 
    
         
            +
            # hash = h.get_sem_head(node) # node is a SalsaTigerXmlNode obj
         
     | 
| 
      
 22 
     | 
    
         
            +
            # 
         
     | 
| 
      
 23 
     | 
    
         
            +
            # head = hash["head"]
         
     | 
| 
      
 24 
     | 
    
         
            +
            # prep = hash["prep"]
         
     | 
| 
      
 25 
     | 
    
         
            +
            # 
         
     | 
| 
      
 26 
     | 
    
         
            +
            # if h.complex(head)
         
     | 
| 
      
 27 
     | 
    
         
            +
            #   print "preposition of conjunction involved"
         
     | 
| 
      
 28 
     | 
    
         
            +
            # end
         
     | 
| 
      
 29 
     | 
    
         
            +
             
     | 
| 
      
 30 
     | 
    
         
            +
            require "frprep/SalsaTigerRegXML"
         
     | 
| 
      
 31 
     | 
    
         
            +
             
     | 
| 
      
 32 
     | 
    
         
            +
            class Headz 
         
     | 
| 
      
 33 
     | 
    
         
            +
             
     | 
| 
      
 34 
     | 
    
         
            +
              def initialize()
         
     | 
| 
      
 35 
     | 
    
         
            +
                @Helpers = HeadzHelpers.new()
         
     | 
| 
      
 36 
     | 
    
         
            +
                @Verbose = false #KE 13.4.05: please not that many messages!
         
     | 
| 
      
 37 
     | 
    
         
            +
              end
         
     | 
| 
      
 38 
     | 
    
         
            +
              
         
     | 
| 
      
 39 
     | 
    
         
            +
              # head of one node
         
     | 
| 
      
 40 
     | 
    
         
            +
              def get_sem_head(node)
         
     | 
| 
      
 41 
     | 
    
         
            +
                gsh(node)
         
     | 
| 
      
 42 
     | 
    
         
            +
              end
         
     | 
| 
      
 43 
     | 
    
         
            +
              
         
     | 
| 
      
 44 
     | 
    
         
            +
              # all headz of top-nodes covering fe
         
     | 
| 
      
 45 
     | 
    
         
            +
              def get_fe_heads(fe)
         
     | 
| 
      
 46 
     | 
    
         
            +
                if (const = fe.children())
         
     | 
| 
      
 47 
     | 
    
         
            +
                  const.map { |node|
         
     | 
| 
      
 48 
     | 
    
         
            +
            	get_sem_head(node)
         
     | 
| 
      
 49 
     | 
    
         
            +
                  }
         
     | 
| 
      
 50 
     | 
    
         
            +
                else
         
     | 
| 
      
 51 
     | 
    
         
            +
                  $stderr.puts "Headz.get_sem_head: no children for FE #{fe}"
         
     | 
| 
      
 52 
     | 
    
         
            +
                  []
         
     | 
| 
      
 53 
     | 
    
         
            +
                end
         
     | 
| 
      
 54 
     | 
    
         
            +
              end
         
     | 
| 
      
 55 
     | 
    
         
            +
              
         
     | 
| 
      
 56 
     | 
    
         
            +
              def gsh (node)
         
     | 
| 
      
 57 
     | 
    
         
            +
                if !node then 
         
     | 
| 
      
 58 
     | 
    
         
            +
                  if @Verbose then $stderr.puts "Headz.gsh: no input node" end
         
     | 
| 
      
 59 
     | 
    
         
            +
                  return {}
         
     | 
| 
      
 60 
     | 
    
         
            +
             
     | 
| 
      
 61 
     | 
    
         
            +
                elsif node.is_terminal? then return Hash['head'=>node]
         
     | 
| 
      
 62 
     | 
    
         
            +
             
     | 
| 
      
 63 
     | 
    
         
            +
                else
         
     | 
| 
      
 64 
     | 
    
         
            +
                  case node.category
         
     | 
| 
      
 65 
     | 
    
         
            +
                  when 'AP'
         
     | 
| 
      
 66 
     | 
    
         
            +
            	return gsh(@Helpers.get_dtr(node,'HD'))
         
     | 
| 
      
 67 
     | 
    
         
            +
             
     | 
| 
      
 68 
     | 
    
         
            +
                  when 'AVP'
         
     | 
| 
      
 69 
     | 
    
         
            +
            	return gsh(@Helpers.get_dtr(node,'HD'))
         
     | 
| 
      
 70 
     | 
    
         
            +
                  when 'CAP', 'CAVP', 'CNP', 'CPP', 'CS', 'CVP'
         
     | 
| 
      
 71 
     | 
    
         
            +
            	conjs = @Helpers.get_conjuncts(node)
         
     | 
| 
      
 72 
     | 
    
         
            +
            	head = gsh(conjs.shift)
         
     | 
| 
      
 73 
     | 
    
         
            +
                    if head
         
     | 
| 
      
 74 
     | 
    
         
            +
                      head.update(Hash["conj"=>gsh_conjs(conjs)])
         
     | 
| 
      
 75 
     | 
    
         
            +
                    end
         
     | 
| 
      
 76 
     | 
    
         
            +
                    return head
         
     | 
| 
      
 77 
     | 
    
         
            +
             
     | 
| 
      
 78 
     | 
    
         
            +
                  when 'NM'
         
     | 
| 
      
 79 
     | 
    
         
            +
            	return gsh(@Helpers.get_rightmost_dtr(node,'NMC'))
         
     | 
| 
      
 80 
     | 
    
         
            +
                  when 'NP'
         
     | 
| 
      
 81 
     | 
    
         
            +
                    nk = @Helpers.get_rightmost_dtr(node,'NK')
         
     | 
| 
      
 82 
     | 
    
         
            +
                    if nk
         
     | 
| 
      
 83 
     | 
    
         
            +
                      return gsh(nk)
         
     | 
| 
      
 84 
     | 
    
         
            +
                    else
         
     | 
| 
      
 85 
     | 
    
         
            +
                      return gsh(@Helpers.get_rightmost_dtr(node, "NN"))
         
     | 
| 
      
 86 
     | 
    
         
            +
                    end
         
     | 
| 
      
 87 
     | 
    
         
            +
             
     | 
| 
      
 88 
     | 
    
         
            +
                  when 'PN'
         
     | 
| 
      
 89 
     | 
    
         
            +
            	pncs = @Helpers.get_dtrs(node,'PNC')
         
     | 
| 
      
 90 
     | 
    
         
            +
            	head = gsh(pncs.last)
         
     | 
| 
      
 91 
     | 
    
         
            +
                    if head
         
     | 
| 
      
 92 
     | 
    
         
            +
                      head.update(Hash["pncs"=>pncs])
         
     | 
| 
      
 93 
     | 
    
         
            +
                    end
         
     | 
| 
      
 94 
     | 
    
         
            +
                    return head
         
     | 
| 
      
 95 
     | 
    
         
            +
             
     | 
| 
      
 96 
     | 
    
         
            +
                  when 'PP'
         
     | 
| 
      
 97 
     | 
    
         
            +
            	return pp(node)
         
     | 
| 
      
 98 
     | 
    
         
            +
             
     | 
| 
      
 99 
     | 
    
         
            +
                  when 'S'
         
     | 
| 
      
 100 
     | 
    
         
            +
            	return s(node)
         
     | 
| 
      
 101 
     | 
    
         
            +
                  when 'VROOT'
         
     | 
| 
      
 102 
     | 
    
         
            +
                    dtrs = @Helpers.get_dtrs(node,'--')
         
     | 
| 
      
 103 
     | 
    
         
            +
             
     | 
| 
      
 104 
     | 
    
         
            +
                    # discourse level node with sentence nodes below?
         
     | 
| 
      
 105 
     | 
    
         
            +
                    # or conjunction with sentence nodes below?
         
     | 
| 
      
 106 
     | 
    
         
            +
                    discourselevel_dtr = dtrs.detect { |n| n.category == "DL"}
         
     | 
| 
      
 107 
     | 
    
         
            +
                    co_dtr = dtrs.detect { |n| n.category == "CO" }
         
     | 
| 
      
 108 
     | 
    
         
            +
                    if discourselevel_dtr
         
     | 
| 
      
 109 
     | 
    
         
            +
                      dtrs = discourselevel_dtr.children()
         
     | 
| 
      
 110 
     | 
    
         
            +
                    elsif co_dtr
         
     | 
| 
      
 111 
     | 
    
         
            +
                      dtrs = co_dtr.children()
         
     | 
| 
      
 112 
     | 
    
         
            +
                    end
         
     | 
| 
      
 113 
     | 
    
         
            +
             
     | 
| 
      
 114 
     | 
    
         
            +
             
     | 
| 
      
 115 
     | 
    
         
            +
                    # take first sentence node
         
     | 
| 
      
 116 
     | 
    
         
            +
                    sent_dtr = dtrs.detect {|n| n.category =~ /^C?S/}
         
     | 
| 
      
 117 
     | 
    
         
            +
                    if sent_dtr
         
     | 
| 
      
 118 
     | 
    
         
            +
                      return gsh(sent_dtr)
         
     | 
| 
      
 119 
     | 
    
         
            +
                    else          
         
     | 
| 
      
 120 
     | 
    
         
            +
            #          $stderr.puts "headz Warning: no sentence found below VROOT! Node #{node.id()}"
         
     | 
| 
      
 121 
     | 
    
         
            +
                      return nil
         
     | 
| 
      
 122 
     | 
    
         
            +
                    end
         
     | 
| 
      
 123 
     | 
    
         
            +
             
     | 
| 
      
 124 
     | 
    
         
            +
                  when 'VP'
         
     | 
| 
      
 125 
     | 
    
         
            +
            	return vp(node)
         
     | 
| 
      
 126 
     | 
    
         
            +
             
     | 
| 
      
 127 
     | 
    
         
            +
                  when 'MTA'
         
     | 
| 
      
 128 
     | 
    
         
            +
                    return gsh(@Helpers.get_rightmost_dtr(node,'ADC'))
         
     | 
| 
      
 129 
     | 
    
         
            +
             
     | 
| 
      
 130 
     | 
    
         
            +
                  when 'VZ'
         
     | 
| 
      
 131 
     | 
    
         
            +
            	return gsh(@Helpers.get_dtr(node,'HD'))
         
     | 
| 
      
 132 
     | 
    
         
            +
                  else
         
     | 
| 
      
 133 
     | 
    
         
            +
            	if @Verbose 
         
     | 
| 
      
 134 
     | 
    
         
            +
            	  $stderr.puts " Headz.gsh: no rule for #{node.category}" 
         
     | 
| 
      
 135 
     | 
    
         
            +
            	end
         
     | 
| 
      
 136 
     | 
    
         
            +
            	{}
         
     | 
| 
      
 137 
     | 
    
         
            +
                  end
         
     | 
| 
      
 138 
     | 
    
         
            +
                end
         
     | 
| 
      
 139 
     | 
    
         
            +
              end
         
     | 
| 
      
 140 
     | 
    
         
            +
              
         
     | 
| 
      
 141 
     | 
    
         
            +
              # flatten the processed conjs to a list of (head) Hashes 
         
     | 
| 
      
 142 
     | 
    
         
            +
              # containing no conj features themselves 
         
     | 
| 
      
 143 
     | 
    
         
            +
              def gsh_conjs(conjs)
         
     | 
| 
      
 144 
     | 
    
         
            +
                flat = Array.new
         
     | 
| 
      
 145 
     | 
    
         
            +
                
         
     | 
| 
      
 146 
     | 
    
         
            +
                conjs.each {|conj|
         
     | 
| 
      
 147 
     | 
    
         
            +
                  current = gsh(conj)
         
     | 
| 
      
 148 
     | 
    
         
            +
                  @Helpers.descend(current,flat)
         
     | 
| 
      
 149 
     | 
    
         
            +
                }
         
     | 
| 
      
 150 
     | 
    
         
            +
                
         
     | 
| 
      
 151 
     | 
    
         
            +
                flat
         
     | 
| 
      
 152 
     | 
    
         
            +
              end
         
     | 
| 
      
 153 
     | 
    
         
            +
             
         
     | 
| 
      
 154 
     | 
    
         
            +
              #####################################3
         
     | 
| 
      
 155 
     | 
    
         
            +
              def pp(node)
         
     | 
| 
      
 156 
     | 
    
         
            +
             
     | 
| 
      
 157 
     | 
    
         
            +
                prep = node.terminals_sorted().detect { |n| 
         
     | 
| 
      
 158 
     | 
    
         
            +
                  (pt = n.part_of_speech()) and 
         
     | 
| 
      
 159 
     | 
    
         
            +
                    (pt =~ /^APPR/ or 
         
     | 
| 
      
 160 
     | 
    
         
            +
                       pt =~ /^PWAV/ or
         
     | 
| 
      
 161 
     | 
    
         
            +
                       pt =~ /^C?PP/
         
     | 
| 
      
 162 
     | 
    
         
            +
                     )
         
     | 
| 
      
 163 
     | 
    
         
            +
                }
         
     | 
| 
      
 164 
     | 
    
         
            +
             
     | 
| 
      
 165 
     | 
    
         
            +
                if (lastnk = @Helpers.get_rightmost_dtr(node,'NK'))
         
     | 
| 
      
 166 
     | 
    
         
            +
                  head = gsh(lastnk)
         
     | 
| 
      
 167 
     | 
    
         
            +
                  if head and prep
         
     | 
| 
      
 168 
     | 
    
         
            +
                    head.update(Hash['prep'=>prep])      
         
     | 
| 
      
 169 
     | 
    
         
            +
                  end
         
     | 
| 
      
 170 
     | 
    
         
            +
             
     | 
| 
      
 171 
     | 
    
         
            +
                elsif (re = @Helpers.get_dtr(node,'RE'))
         
     | 
| 
      
 172 
     | 
    
         
            +
                  head = gsh(re)
         
     | 
| 
      
 173 
     | 
    
         
            +
                  if head and prep
         
     | 
| 
      
 174 
     | 
    
         
            +
                    head.update(Hash['prep'=>prep])      
         
     | 
| 
      
 175 
     | 
    
         
            +
                  end
         
     | 
| 
      
 176 
     | 
    
         
            +
                else
         
     | 
| 
      
 177 
     | 
    
         
            +
                  if @Verbose then $stderr.puts " pp: no rule for #{node}" end
         
     | 
| 
      
 178 
     | 
    
         
            +
                end
         
     | 
| 
      
 179 
     | 
    
         
            +
             
     | 
| 
      
 180 
     | 
    
         
            +
                head
         
     | 
| 
      
 181 
     | 
    
         
            +
              end
         
     | 
| 
      
 182 
     | 
    
         
            +
              
         
     | 
| 
      
 183 
     | 
    
         
            +
              ################
         
     | 
| 
      
 184 
     | 
    
         
            +
              def s(node)
         
     | 
| 
      
 185 
     | 
    
         
            +
                head = @Helpers.get_dtr(node,'HD')
         
     | 
| 
      
 186 
     | 
    
         
            +
                if !head
         
     | 
| 
      
 187 
     | 
    
         
            +
            #      $stderr.puts " s: no head for #{node}"
         
     | 
| 
      
 188 
     | 
    
         
            +
                  return Hash[]
         
     | 
| 
      
 189 
     | 
    
         
            +
                end
         
     | 
| 
      
 190 
     | 
    
         
            +
                
         
     | 
| 
      
 191 
     | 
    
         
            +
                if head.outdeg() == 0
         
     | 
| 
      
 192 
     | 
    
         
            +
                  return gsh(head)
         
     | 
| 
      
 193 
     | 
    
         
            +
                end
         
     | 
| 
      
 194 
     | 
    
         
            +
             
     | 
| 
      
 195 
     | 
    
         
            +
                oc = @Helpers.get_dtr(node,'OC')
         
     | 
| 
      
 196 
     | 
    
         
            +
                case head.category
         
     | 
| 
      
 197 
     | 
    
         
            +
                when 'VVFIN' 
         
     | 
| 
      
 198 
     | 
    
         
            +
                  if svp = @Helpers.get_dtr(node,'SVP') then 
         
     | 
| 
      
 199 
     | 
    
         
            +
                    h = gsh(head)
         
     | 
| 
      
 200 
     | 
    
         
            +
                    if h
         
     | 
| 
      
 201 
     | 
    
         
            +
                      return h.update(Hash['svp'=>gsh(svp), 'oc'=>gsh(oc)]) 
         
     | 
| 
      
 202 
     | 
    
         
            +
                    else
         
     | 
| 
      
 203 
     | 
    
         
            +
                      return h
         
     | 
| 
      
 204 
     | 
    
         
            +
                    end
         
     | 
| 
      
 205 
     | 
    
         
            +
                  else 
         
     | 
| 
      
 206 
     | 
    
         
            +
                    return gsh(head)
         
     | 
| 
      
 207 
     | 
    
         
            +
                  end
         
     | 
| 
      
 208 
     | 
    
         
            +
             
     | 
| 
      
 209 
     | 
    
         
            +
                when 'VAFIN'
         
     | 
| 
      
 210 
     | 
    
         
            +
                  if oc && headd = @Helpers.get_dtr(oc,'HD')
         
     | 
| 
      
 211 
     | 
    
         
            +
                    h = gsh(headd)
         
     | 
| 
      
 212 
     | 
    
         
            +
                    if h
         
     | 
| 
      
 213 
     | 
    
         
            +
                      return h.update(Hash['oc'=>gsh(oc)])
         
     | 
| 
      
 214 
     | 
    
         
            +
                    else
         
     | 
| 
      
 215 
     | 
    
         
            +
                      return h
         
     | 
| 
      
 216 
     | 
    
         
            +
                    end
         
     | 
| 
      
 217 
     | 
    
         
            +
            	
         
     | 
| 
      
 218 
     | 
    
         
            +
                  elsif pd = @Helpers.get_dtr(node,'PD') && head = @Helpers.get_dtr(pd,'HD')
         
     | 
| 
      
 219 
     | 
    
         
            +
                    return gsh(head)
         
     | 
| 
      
 220 
     | 
    
         
            +
                  
         
     | 
| 
      
 221 
     | 
    
         
            +
                  else 
         
     | 
| 
      
 222 
     | 
    
         
            +
                    if @Verbose then $stderr.puts " s: no rule for #{node}" end
         
     | 
| 
      
 223 
     | 
    
         
            +
                  end
         
     | 
| 
      
 224 
     | 
    
         
            +
                else
         
     | 
| 
      
 225 
     | 
    
         
            +
                  if @Verbose then $stderr.puts " s: no rule for #{node}" end
         
     | 
| 
      
 226 
     | 
    
         
            +
                end  
         
     | 
| 
      
 227 
     | 
    
         
            +
              end
         
     | 
| 
      
 228 
     | 
    
         
            +
              
         
     | 
| 
      
 229 
     | 
    
         
            +
              ################
         
     | 
| 
      
 230 
     | 
    
         
            +
              def vp(node)
         
     | 
| 
      
 231 
     | 
    
         
            +
                head = gsh(@Helpers.get_dtr(node,'HD'))
         
     | 
| 
      
 232 
     | 
    
         
            +
                tmp = @Verbose
         
     | 
| 
      
 233 
     | 
    
         
            +
                @Verbose = false
         
     | 
| 
      
 234 
     | 
    
         
            +
                newHash = Hash.new
         
     | 
| 
      
 235 
     | 
    
         
            +
                ["da","oa"].each { |type| 
         
     | 
| 
      
 236 
     | 
    
         
            +
                  if (dtr = @Helpers.get_dtr(node,type.upcase))
         
     | 
| 
      
 237 
     | 
    
         
            +
            	newHash[type] = gsh(dtr)
         
     | 
| 
      
 238 
     | 
    
         
            +
                  end
         
     | 
| 
      
 239 
     | 
    
         
            +
                }
         
     | 
| 
      
 240 
     | 
    
         
            +
                @Verbose = tmp
         
     | 
| 
      
 241 
     | 
    
         
            +
                if head 
         
     | 
| 
      
 242 
     | 
    
         
            +
                  return head.update(newHash) 
         
     | 
| 
      
 243 
     | 
    
         
            +
                else 
         
     | 
| 
      
 244 
     | 
    
         
            +
                  return newHash 
         
     | 
| 
      
 245 
     | 
    
         
            +
                end
         
     | 
| 
      
 246 
     | 
    
         
            +
              end
         
     | 
| 
      
 247 
     | 
    
         
            +
              
         
     | 
| 
      
 248 
     | 
    
         
            +
              ################
         
     | 
| 
      
 249 
     | 
    
         
            +
              # Access
         
     | 
| 
      
 250 
     | 
    
         
            +
              def head(h)
         
     | 
| 
      
 251 
     | 
    
         
            +
                return h['head']
         
     | 
| 
      
 252 
     | 
    
         
            +
              end
         
     | 
| 
      
 253 
     | 
    
         
            +
             
     | 
| 
      
 254 
     | 
    
         
            +
              def complex(h)
         
     | 
| 
      
 255 
     | 
    
         
            +
                prep(h) or conj(h)
         
     | 
| 
      
 256 
     | 
    
         
            +
              end
         
     | 
| 
      
 257 
     | 
    
         
            +
             
     | 
| 
      
 258 
     | 
    
         
            +
              def prep(h)
         
     | 
| 
      
 259 
     | 
    
         
            +
                return h['prep']
         
     | 
| 
      
 260 
     | 
    
         
            +
              end
         
     | 
| 
      
 261 
     | 
    
         
            +
             
     | 
| 
      
 262 
     | 
    
         
            +
              def conj(h)
         
     | 
| 
      
 263 
     | 
    
         
            +
                return h['conj']
         
     | 
| 
      
 264 
     | 
    
         
            +
              end
         
     | 
| 
      
 265 
     | 
    
         
            +
             
     | 
| 
      
 266 
     | 
    
         
            +
             
     | 
| 
      
 267 
     | 
    
         
            +
              
         
     | 
| 
      
 268 
     | 
    
         
            +
            end # Class Headz
         
     | 
| 
      
 269 
     | 
    
         
            +
             
     | 
| 
      
 270 
     | 
    
         
            +
             
     | 
| 
      
 271 
     | 
    
         
            +
            class HeadzHelpers
         
     | 
| 
      
 272 
     | 
    
         
            +
              @Verbose = true
         
     | 
| 
      
 273 
     | 
    
         
            +
              
         
     | 
| 
      
 274 
     | 
    
         
            +
              # Conjunction
         
     | 
| 
      
 275 
     | 
    
         
            +
              
         
     | 
| 
      
 276 
     | 
    
         
            +
              def get_conjuncts(node)
         
     | 
| 
      
 277 
     | 
    
         
            +
                conjuncts = get_dtrs(node,'CJ')
         
     | 
| 
      
 278 
     | 
    
         
            +
              end
         
     | 
| 
      
 279 
     | 
    
         
            +
             
     | 
| 
      
 280 
     | 
    
         
            +
              # flatten
         
     | 
| 
      
 281 
     | 
    
         
            +
              def descend(current,flat)
         
     | 
| 
      
 282 
     | 
    
         
            +
                if current.nil?
         
     | 
| 
      
 283 
     | 
    
         
            +
                  return flat
         
     | 
| 
      
 284 
     | 
    
         
            +
                end
         
     | 
| 
      
 285 
     | 
    
         
            +
             
     | 
| 
      
 286 
     | 
    
         
            +
                if current.has_key?("conj") then
         
     | 
| 
      
 287 
     | 
    
         
            +
                  tmp = current.delete("conj")
         
     | 
| 
      
 288 
     | 
    
         
            +
                  flat.push current
         
     | 
| 
      
 289 
     | 
    
         
            +
                  tmp.each {|item|     
         
     | 
| 
      
 290 
     | 
    
         
            +
            	descend(item,flat)}
         
     | 
| 
      
 291 
     | 
    
         
            +
                else 
         
     | 
| 
      
 292 
     | 
    
         
            +
                  flat.push current 
         
     | 
| 
      
 293 
     | 
    
         
            +
                end
         
     | 
| 
      
 294 
     | 
    
         
            +
              end
         
     | 
| 
      
 295 
     | 
    
         
            +
              
         
     | 
| 
      
 296 
     | 
    
         
            +
              # Zugriff
         
     | 
| 
      
 297 
     | 
    
         
            +
              
         
     | 
| 
      
 298 
     | 
    
         
            +
              def get_dtr(node,label)
         
     | 
| 
      
 299 
     | 
    
         
            +
                if (dtrs = node.children_by_edgelabels([label]))
         
     | 
| 
      
 300 
     | 
    
         
            +
                  dtrs.first
         
     | 
| 
      
 301 
     | 
    
         
            +
                else
         
     | 
| 
      
 302 
     | 
    
         
            +
                  if @Verbose then $stderr.puts " SelectHeadDtr: no #{label} dtr for #{node}" end
         
     | 
| 
      
 303 
     | 
    
         
            +
                  nil
         
     | 
| 
      
 304 
     | 
    
         
            +
                end
         
     | 
| 
      
 305 
     | 
    
         
            +
              end
         
     | 
| 
      
 306 
     | 
    
         
            +
              
         
     | 
| 
      
 307 
     | 
    
         
            +
              def get_dtrs(node,label)
         
     | 
| 
      
 308 
     | 
    
         
            +
                if ! dtrs = node.children_by_edgelabels([label])
         
     | 
| 
      
 309 
     | 
    
         
            +
                  if @Verbose then $stderr.puts " SelectHeadDtr: no #{label} dtr for #{node}" end
         
     | 
| 
      
 310 
     | 
    
         
            +
                else
         
     | 
| 
      
 311 
     | 
    
         
            +
                  dtrs
         
     | 
| 
      
 312 
     | 
    
         
            +
                end
         
     | 
| 
      
 313 
     | 
    
         
            +
              end
         
     | 
| 
      
 314 
     | 
    
         
            +
              
         
     | 
| 
      
 315 
     | 
    
         
            +
              def get_rightmost_dtr(node,label)
         
     | 
| 
      
 316 
     | 
    
         
            +
                children = node.children_by_edgelabels([label])
         
     | 
| 
      
 317 
     | 
    
         
            +
                if re = children.last then re
         
     | 
| 
      
 318 
     | 
    
         
            +
                else 
         
     | 
| 
      
 319 
     | 
    
         
            +
                  if @Verbose then $stderr.puts " SelectHeadDtr: no #{label} dtrs for #{node}" end
         
     | 
| 
      
 320 
     | 
    
         
            +
                  nil 
         
     | 
| 
      
 321 
     | 
    
         
            +
                end
         
     | 
| 
      
 322 
     | 
    
         
            +
              end
         
     | 
| 
      
 323 
     | 
    
         
            +
             
     | 
| 
      
 324 
     | 
    
         
            +
            #   def l2h(list)
         
     | 
| 
      
 325 
     | 
    
         
            +
            #     h = Hash.new
         
     | 
| 
      
 326 
     | 
    
         
            +
            #     while (list.length > 1) do
         
     | 
| 
      
 327 
     | 
    
         
            +
            #       h[list.shift] = list.shift
         
     | 
| 
      
 328 
     | 
    
         
            +
            #     end
         
     | 
| 
      
 329 
     | 
    
         
            +
            #     if list.length == 1 then 
         
     | 
| 
      
 330 
     | 
    
         
            +
            #       $stderr.puts "l2h: odd number of elems: " + list.join(" / ")
         
     | 
| 
      
 331 
     | 
    
         
            +
            #     end
         
     | 
| 
      
 332 
     | 
    
         
            +
            #     h
         
     | 
| 
      
 333 
     | 
    
         
            +
            #   end
         
     | 
| 
      
 334 
     | 
    
         
            +
              
         
     | 
| 
      
 335 
     | 
    
         
            +
            end # Class HeadzHelpers
         
     | 
| 
      
 336 
     | 
    
         
            +
             
     | 
| 
      
 337 
     | 
    
         
            +
             
     | 
| 
      
 338 
     | 
    
         
            +
             
     | 
| 
         @@ -0,0 +1,28 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # -*- encoding: utf-8 -*-
         
     | 
| 
      
 2 
     | 
    
         
            +
            # AB, 2010-11-25
         
     | 
| 
      
 3 
     | 
    
         
            +
             
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            ##############################
         
     | 
| 
      
 6 
     | 
    
         
            +
            # class for managing the parses of one file
         
     | 
| 
      
 7 
     | 
    
         
            +
            class OneParsedFile
         
     | 
| 
      
 8 
     | 
    
         
            +
              attr_reader :filename
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
              def initialize(filename,   # string: core of filename for the parse file
         
     | 
| 
      
 11 
     | 
    
         
            +
            		 complete_filename, # string: complete filename of parse file
         
     | 
| 
      
 12 
     | 
    
         
            +
            		 obj_with_iterator) # object with each_sentence method, see above
         
     | 
| 
      
 13 
     | 
    
         
            +
                @obj_with_iterator = obj_with_iterator
         
     | 
| 
      
 14 
     | 
    
         
            +
                @filename = filename
         
     | 
| 
      
 15 
     | 
    
         
            +
                @complete_filename = complete_filename
         
     | 
| 
      
 16 
     | 
    
         
            +
              end
         
     | 
| 
      
 17 
     | 
    
         
            +
             
     | 
| 
      
 18 
     | 
    
         
            +
              # yield each parse sentence as a tuple
         
     | 
| 
      
 19 
     | 
    
         
            +
              # [ salsa/tiger xml sentence, tab format sentence, mapping]
         
     | 
| 
      
 20 
     | 
    
         
            +
              # of a SalsaTigerSentence object, a FNTabSentence object,
         
     | 
| 
      
 21 
     | 
    
         
            +
              # and a hash: FNTab sentence lineno(integer) -> array:SynNode
         
     | 
| 
      
 22 
     | 
    
         
            +
              # pointing each tab word to one or more SalsaTigerSentence terminals
         
     | 
| 
      
 23 
     | 
    
         
            +
              def each_sentence()
         
     | 
| 
      
 24 
     | 
    
         
            +
                @obj_with_iterator.each_sentence(@complete_filename) { |st_sent, tab_sent, mapping|
         
     | 
| 
      
 25 
     | 
    
         
            +
                  yield [st_sent, tab_sent, mapping]
         
     | 
| 
      
 26 
     | 
    
         
            +
                }  
         
     | 
| 
      
 27 
     | 
    
         
            +
              end
         
     | 
| 
      
 28 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,94 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # -*- encoding: utf-8 -*-
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            # AB, 2010-11-25
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            require 'optparse'
         
     | 
| 
      
 6 
     | 
    
         
            +
            require 'frprep/FrPrepConfigData'
         
     | 
| 
      
 7 
     | 
    
         
            +
            require 'frprep/SynInterfaces'
         
     | 
| 
      
 8 
     | 
    
         
            +
            module FrPrep
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
              # This class parses options for FrPrep.
         
     | 
| 
      
 11 
     | 
    
         
            +
              class OptParser
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
                # Main class method.
         
     | 
| 
      
 14 
     | 
    
         
            +
                # OP expects cmd_args to be an array like ARGV.
         
     | 
| 
      
 15 
     | 
    
         
            +
                def self.parse(cmd_args)
         
     | 
| 
      
 16 
     | 
    
         
            +
                  @prg_name = 'frprep'
         
     | 
| 
      
 17 
     | 
    
         
            +
                  @@options = {}
         
     | 
| 
      
 18 
     | 
    
         
            +
                  
         
     | 
| 
      
 19 
     | 
    
         
            +
                  parser = create_parser
         
     | 
| 
      
 20 
     | 
    
         
            +
                  
         
     | 
| 
      
 21 
     | 
    
         
            +
                  # If no options provided print the help.
         
     | 
| 
      
 22 
     | 
    
         
            +
                  if cmd_args.empty?
         
     | 
| 
      
 23 
     | 
    
         
            +
                    $stderr.puts('You have to provide some options.',
         
     | 
| 
      
 24 
     | 
    
         
            +
                                "Please start with <#{@prg_name} --help>.")
         
     | 
| 
      
 25 
     | 
    
         
            +
                    exit(1)
         
     | 
| 
      
 26 
     | 
    
         
            +
                  end
         
     | 
| 
      
 27 
     | 
    
         
            +
                  
         
     | 
| 
      
 28 
     | 
    
         
            +
                  # Parse ARGV and provide the options hash.
         
     | 
| 
      
 29 
     | 
    
         
            +
                  # Check if everything is correct and handle exceptions
         
     | 
| 
      
 30 
     | 
    
         
            +
                  begin
         
     | 
| 
      
 31 
     | 
    
         
            +
                    parser.parse(cmd_args)
         
     | 
| 
      
 32 
     | 
    
         
            +
                  rescue OptionParser::InvalidArgument => e
         
     | 
| 
      
 33 
     | 
    
         
            +
                    arg = e.message.split.last
         
     | 
| 
      
 34 
     | 
    
         
            +
                    $stderr.puts "The provided argument #{arg} is currently not supported!"
         
     | 
| 
      
 35 
     | 
    
         
            +
                    $stderr.puts "Please colsult <#{@prg_name} --help>."
         
     | 
| 
      
 36 
     | 
    
         
            +
                    exit(1)
         
     | 
| 
      
 37 
     | 
    
         
            +
                  rescue OptionParser::InvalidOption => e
         
     | 
| 
      
 38 
     | 
    
         
            +
                    $stderr.puts "You have provided an #{e.message}."
         
     | 
| 
      
 39 
     | 
    
         
            +
                    $stderr.puts "Please colsult <#{@prg_name} --help>."
         
     | 
| 
      
 40 
     | 
    
         
            +
                    exit(1)
         
     | 
| 
      
 41 
     | 
    
         
            +
                  rescue
         
     | 
| 
      
 42 
     | 
    
         
            +
                    raise
         
     | 
| 
      
 43 
     | 
    
         
            +
                  end
         
     | 
| 
      
 44 
     | 
    
         
            +
             
     | 
| 
      
 45 
     | 
    
         
            +
                  
         
     | 
| 
      
 46 
     | 
    
         
            +
                  exp = FrPrepConfigData.new(@@options[:exp_file])
         
     | 
| 
      
 47 
     | 
    
         
            +
             
     | 
| 
      
 48 
     | 
    
         
            +
                  # AB: this stuff should be move into FrPrepConfigData.
         
     | 
| 
      
 49 
     | 
    
         
            +
                  # sanity checks
         
     | 
| 
      
 50 
     | 
    
         
            +
                  unless exp.get("prep_experiment_ID") =~ /^[A-Za-z0-9_]+$/
         
     | 
| 
      
 51 
     | 
    
         
            +
                    raise "Please choose an experiment ID consisting only of the letters A-Za-z0-9_."
         
     | 
| 
      
 52 
     | 
    
         
            +
                  end
         
     | 
| 
      
 53 
     | 
    
         
            +
             
     | 
| 
      
 54 
     | 
    
         
            +
                  SynInterfaces.check_interfaces_abort_if_missing(exp)
         
     | 
| 
      
 55 
     | 
    
         
            +
             
     | 
| 
      
 56 
     | 
    
         
            +
                  exp
         
     | 
| 
      
 57 
     | 
    
         
            +
                end
         
     | 
| 
      
 58 
     | 
    
         
            +
             
     | 
| 
      
 59 
     | 
    
         
            +
                private
         
     | 
| 
      
 60 
     | 
    
         
            +
                def self.create_parser
         
     | 
| 
      
 61 
     | 
    
         
            +
                  OptionParser.new do |opts|
         
     | 
| 
      
 62 
     | 
    
         
            +
                    opts.banner = <<STOP
         
     | 
| 
      
 63 
     | 
    
         
            +
            Fred Preprocessor <FrPrep>. Preprocessing stage before Fred and Rosy
         
     | 
| 
      
 64 
     | 
    
         
            +
            for further frame/word sense assignment and semantic role assignment.
         
     | 
| 
      
 65 
     | 
    
         
            +
             
     | 
| 
      
 66 
     | 
    
         
            +
            Usage: frprep -h|-e FILENAME'
         
     | 
| 
      
 67 
     | 
    
         
            +
            STOP
         
     | 
| 
      
 68 
     | 
    
         
            +
                    opts.separator ''
         
     | 
| 
      
 69 
     | 
    
         
            +
                    opts.separator 'Program specific options:'
         
     | 
| 
      
 70 
     | 
    
         
            +
                    
         
     | 
| 
      
 71 
     | 
    
         
            +
                    opts.on('-e', '--expfile FILENAME',
         
     | 
| 
      
 72 
     | 
    
         
            +
                            'Provide the path to an experiment file.',
         
     | 
| 
      
 73 
     | 
    
         
            +
                            'FrPrep will preprocess data according to the specifications',
         
     | 
| 
      
 74 
     | 
    
         
            +
                            'given in your experiment file.',
         
     | 
| 
      
 75 
     | 
    
         
            +
                            'This option is required!',
         
     | 
| 
      
 76 
     | 
    
         
            +
                            'Also consider the documentation on format and features.'
         
     | 
| 
      
 77 
     | 
    
         
            +
                            ) do |exp_file|
         
     | 
| 
      
 78 
     | 
    
         
            +
                      @@options[:exp_file] = File.expand_path(exp_file)
         
     | 
| 
      
 79 
     | 
    
         
            +
                    end
         
     | 
| 
      
 80 
     | 
    
         
            +
             
     | 
| 
      
 81 
     | 
    
         
            +
                    opts.separator ''
         
     | 
| 
      
 82 
     | 
    
         
            +
                    opts.separator 'Common options:'
         
     | 
| 
      
 83 
     | 
    
         
            +
                    
         
     | 
| 
      
 84 
     | 
    
         
            +
                    opts.on_tail('-h', '--help', 'Show this help message.') do
         
     | 
| 
      
 85 
     | 
    
         
            +
                      puts opts
         
     | 
| 
      
 86 
     | 
    
         
            +
                      exit
         
     | 
| 
      
 87 
     | 
    
         
            +
                    end
         
     | 
| 
      
 88 
     | 
    
         
            +
                    
         
     | 
| 
      
 89 
     | 
    
         
            +
                  end
         
     | 
| 
      
 90 
     | 
    
         
            +
             
     | 
| 
      
 91 
     | 
    
         
            +
                end # def self.parse
         
     | 
| 
      
 92 
     | 
    
         
            +
             
     | 
| 
      
 93 
     | 
    
         
            +
              end # class OptParser
         
     | 
| 
      
 94 
     | 
    
         
            +
            end # module FrPrep
         
     |