From cdcea6621a46bb7412051ca37b9ef7c516a53ba0 Mon Sep 17 00:00:00 2001
From: Wojciech Jaworski <wjaworski@mimuw.edu.pl>
Date: Sun, 26 Mar 2017 23:47:37 +0200
Subject: [PATCH] scalenie zdań i akapitów w NKJP1M

---
 NKJP2/ENIAM_NKJP.ml | 650 ++++++++++++++++++++++++++++++++++++--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 1 file changed, 36 insertions(+), 614 deletions(-)

diff --git a/NKJP2/ENIAM_NKJP.ml b/NKJP2/ENIAM_NKJP.ml
index e58d53c..a2b458a 100644
--- a/NKJP2/ENIAM_NKJP.ml
+++ b/NKJP2/ENIAM_NKJP.ml
@@ -199,10 +199,16 @@ let rec merge_tokens name id_p rev = function
         let id_div,id_ab,beg,len = parse_seg_corresp corresp in(
         (* if id_div <> id_p then (*failwith*)print_endline (Printf.sprintf "merge_tokens 4: %s %d %s" name id_p corresp); (*else*) *)
         let lemma,cat,interp = parse_disamb disamb in
-        merge_tokens name id_p ((id_div,id_ab,beg,nps,len,orth,lemma,cat,interp) :: rev) (segmentation,morphosyntax))
+        merge_tokens name id_p ((id_div,id_ab,(beg,len,nps,orth,lemma,cat,interp)) :: rev) (segmentation,morphosyntax))
   | [],[] -> List.rev rev
   | _ -> failwith "merge_tokens 1"
 
+let rec split_sentences id_div id_ab rev rev2 = function
+    (id_div2,id_ab2,token) :: l ->
+       if id_div = id_div2 && id_ab = id_ab2 then split_sentences id_div id_ab (token :: rev) rev2 l else
+       split_sentences id_div2 id_ab2 [token] ((id_div,id_ab,List.rev rev) :: rev2) l
+  | [] -> List.rev ((id_div,id_ab,List.rev rev) :: rev2)
+
 let rec merge_sentences name id_p rev = function
     ({corref=""; prefix="segm"; numbers=[id_segm_p;id_segm_s]; suffix="s"},segm_tokens) :: segmentation,
     ({corref="ann_segmentation.xml"; prefix="segm"; numbers=[c_segm_p;c_segm_s]; suffix="s"},
@@ -211,10 +217,34 @@ let rec merge_sentences name id_p rev = function
         if id_segm_p <> c_segm_p || id_segm_p <> id_morph_p then failwith "merge_sentences 2" else
         if id_segm_s <> c_segm_s || c_segm_s <> id_morph_s then failwith "merge_sentences 3" else
         let tokens = merge_tokens name id_p [] (segm_tokens,morph_tokens) in
-        merge_sentences name id_p ((id_segm_p,id_segm_s,tokens) :: rev) (segmentation,morphosyntax)
+        let id_s = string_of_int id_segm_p ^ "." ^ string_of_int id_segm_s in
+        if tokens = [] then failwith "merge_sentences 4" else
+        let id_div,id_ab,token = List.hd tokens in
+        let l = match split_sentences id_div id_ab [token] [] tokens with
+          [id_div,id_ab,tokens] -> [id_div,id_ab,id_s,tokens]
+        | [id_div1,id_ab1,tokens1;id_div2,id_ab2,tokens2] -> [id_div2,id_ab2,id_s^"b",tokens2;id_div1,id_ab1,id_s^"a",tokens1]
+        | [id_div1,id_ab1,tokens1;id_div2,id_ab2,tokens2;id_div3,id_ab3,tokens3] -> [id_div3,id_ab3,id_s^"c",tokens3;id_div2,id_ab2,id_s^"b",tokens2;id_div1,id_ab1,id_s^"a",tokens1]
+        | _ -> failwith (Printf.sprintf "merge_sentences 5: %s %d %d" name id_div id_ab) in
+        merge_sentences name id_p (l @ rev) (segmentation,morphosyntax)
   | [],[] -> List.rev rev
   | _ -> failwith "merge_sentences"
 
+let rec merge_paragraph id_div id_ab rev = function
+    (id_div2,id_ab2,id_s,tokens) :: sentences ->
+      if id_div <> id_div2 || id_ab <> id_ab2 then List.rev rev, (id_div2,id_ab2,id_s,tokens) :: sentences
+      else merge_paragraph id_div id_ab ((id_s,tokens) :: rev) sentences
+  | [] -> List.rev rev, []
+
+let rec merge_paragraphs name id_p rev = function
+    ({corref=""; prefix="txt"; numbers=[id_div;id_ab]; suffix="ab"},paragraph) :: paragraphs,
+    (id_div2,id_ab2,id_s,tokens) :: sentences ->
+       if id_div <> id_div2 && id_ab <> id_ab2 then failwith "merge_paragraphs 1" else
+       let l,sentences = merge_paragraph id_div id_ab [id_s,tokens] sentences in
+       (* Printf.printf "%d.%d: %s\n" id_div id_ab (String.concat " " (Xlist.map l fst)); *)
+       merge_paragraphs name id_p ((paragraph,l) :: rev) (paragraphs,sentences)
+  | [],[] -> List.rev rev
+  | _ -> failwith ("merge_paragraphs 2: " ^ name ^ " " ^ string_of_int id_p)
+
 let rec merge_entries name rev = function
     ({corref=""; prefix="txt"; numbers=[id_div]; suffix="div"},paragraphs) :: text,
     ({corref="text.xml"; prefix="txt"; numbers=[c_div]; suffix="div"},
@@ -223,7 +253,8 @@ let rec merge_entries name rev = function
      {corref=""; prefix="morph"; numbers=[id_morph_p]; suffix="p"},morph_sentences) :: morphosyntax ->
         if id_div <> c_div || c_div <> id_segm_p || id_segm_p <> c_segm_p || c_segm_p <> id_morph_p then failwith "merge_entries 2" else
         let sentences = merge_sentences name id_div [] (segm_sentences,morph_sentences) in
-        merge_entries name ((id_div,paragraphs,sentences) :: rev) (text,segmentation,morphosyntax)
+        let paragraphs = merge_paragraphs name id_div [] (paragraphs,sentences) in
+        merge_entries name ((id_div,paragraphs) :: rev) (text,segmentation,morphosyntax)
   | [],[],[] -> List.rev rev
   | _ -> failwith "merge_entries"
 
@@ -232,6 +263,7 @@ let nkjp_path = "../../NLP resources/NKJP-PodkorpusMilionowy-1.2/"
 let _ =
   let names = get_folders nkjp_path in
   Xlist.iter names (fun name ->
+    if name = "030-2-000000012" then () else
     (* print_endline name; *)
     let typ,channel = load_header nkjp_path name in
     (* print_endline typ; *)
@@ -271,7 +303,7 @@ frekwencje kanałów
      28 prasa_tygodnik
 
 frekwencje łączne typów-kanałów
-      127 fakt    ksiazka
+    127 fakt    ksiazka
      56 inf-por ksiazka
     283 konwers mowiony
       2 listy   ksiazka
@@ -292,613 +324,3 @@ frekwencje łączne typów-kanałów
     387 urzed   prasa_inne
 
     *)
-(*
-
-type id = {hash: bool; suffix: string; numbers: int list}
-
-let empty_id = {hash = false; suffix = ""; numbers = []}
-
-let parse_id s =
-  if String.length s = 0 then empty_id else
-  if String.length s < 6 then failwith "za krótkie id"  else
-    let hash,s = if (String.get s 0) = '#' then true, String.sub s 1 (String.length s - 1) else false, s in
-    if String.sub s 0 4 <> "wal_" then failwith "id nie ma wal" else
-      let s = String.sub s 4 (String.length s - 4) in
-      let s,suf = match Str.split (Str.regexp "-") s with
-          [s;suf] -> s,suf
-        | _ -> failwith ("parse_id: zła ilość '-' " ^ s) in
-      let id = {hash = hash; suffix = suf; numbers = try Xlist.map (Xstring.split "\\." s) int_of_string with _ -> failwith ("parse_id: " ^ s)} in
-      id
-
-let string_of_id id =
-  (if id.hash then "#" else "") ^ "wal_" ^ (String.concat "." (Xlist.map id.numbers string_of_int)) ^ "-" ^ id.suffix
-
-type tei =
-    Symbol of string
-  | TEIstring of string
-  | Binary of bool
-  | Numeric of int
-  | F of string * tei
-  | Fset of string * tei list
-  | Fs of string * tei list
-  | Id of id
-  | SameAs of id * string
-
-let rec tei_to_string = function
-    Symbol s -> Printf.sprintf "Symbol %s" s
-  | TEIstring s -> Printf.sprintf "String %s" s
-  | Binary b -> Printf.sprintf "Binary %s" (string_of_bool b)
-  | Numeric n -> Printf.sprintf "Numeric %d" n
-  | F(s,t) -> Printf.sprintf "F(%s,%s)" s (tei_to_string t)
-  | Fset(s,l) -> Printf.sprintf "Fset(%s,[%s])" s (String.concat ";" (Xlist.map l tei_to_string))
-  | Fs(s,l) -> Printf.sprintf "Fs(%s,[%s])" s (String.concat ";" (Xlist.map l tei_to_string))
-  | Id id -> Printf.sprintf "Id(%s)" (string_of_id id)
-  | SameAs(id,s) -> Printf.sprintf "F(Id,%s)" s
-
-let rec parse_tei = function
-    Xml.Element("f",["name",name],[Xml.Element("vColl",["org","set"],set)]) ->
-    Fset(name,List.rev (Xlist.map set parse_tei))
-  | Xml.Element("f", ["name",name],[]) -> Fset(name,[])
-  | Xml.Element("f", ["name",name],[tei]) -> F(name,parse_tei tei)
-  | Xml.Element("f", ["name",name],set) -> Fset(name,List.rev (Xlist.map set parse_tei))
-  | Xml.Element("fs", ["type",name], l) -> Fs(name,List.rev (Xlist.rev_map l parse_tei))
-  | Xml.Element("fs", ["xml:id",id;"type",name], l) -> Fs(name,Id(parse_id id) :: List.rev (Xlist.rev_map l parse_tei))
-  | Xml.Element("symbol",["value",value],[]) -> Symbol value
-  | Xml.Element("string",[], [Xml.PCData s]) -> TEIstring s
-  | Xml.Element("string",[], []) -> TEIstring ""
-  | Xml.Element("binary",["value",value],[]) -> Binary(try bool_of_string value with _ -> failwith "parse_tei")
-  | Xml.Element("numeric",["value",value],[]) -> Numeric(try int_of_string value with _ -> failwith "parse_tei")
-  | Xml.Element("fs", ["sameAs", same_as; "type",name], []) -> SameAs(parse_id same_as,name)
-  | Xml.Element("fs", ["sameAs", same_as], []) -> SameAs(parse_id same_as,"")
-  | xml -> failwith ("parse_tei: " ^ Xml.to_string_fmt xml)
-
-let parse_gf = function
-    "subj" -> SUBJ
-  | "obj" -> OBJ
-  | s -> failwith ("parse_gf: " ^ s)
-
-let parse_control arg = function
-    "controller" -> {arg with cr="1" :: arg.cr}
-  | "controllee" -> {arg with ce="1" :: arg.cr}
-  | "controller2" -> {arg with cr="2" :: arg.cr}
-  | "controllee2" -> {arg with ce="2" :: arg.cr}
-  | s -> failwith ("parse_control: " ^ s)
-
-let parse_case = function
-    "nom" -> Case "nom"
-  | "gen" -> Case "gen"
-  | "dat" -> Case "dat"
-  | "acc" -> Case "acc"
-  | "inst" -> Case "inst"
-  | "loc" -> Case "loc"
-  | "str" -> Str
-  | "pred" -> Case "pred"
-  | "part" -> Part
-  | "postp" -> Case "postp"
-  | "agr" -> CaseAgr
-  | s -> failwith ("parse_case: " ^ s)
-
-let parse_aspect = function
-    "perf" -> Aspect "perf"
-  | "imperf" -> Aspect "imperf"
-  | "_" -> AspectUndef
-  | "" -> AspectNA
-  | s -> failwith ("parse_aspect: " ^ s)
-
-let parse_negation = function
-    "_" -> NegationUndef
-  | "neg" -> Negation
-  | "aff" -> Aff
-  | "" -> NegationNA
-  | s -> failwith ("parse_negation: " ^ s)
-
-let parse_number = function
-    "sg" -> Number "sg"
-  | "pl" -> Number "pl"
-  | "agr" -> NumberAgr
-  | "_" -> NumberUndef
-  | s -> failwith ("parse_number: " ^ s)
-
-let parse_gender = function
-    "m1" -> Gender "m1"
-  | "m3" -> Gender "m3"
-  | "n" -> Genders["n1";"n2"]
-  | "f" -> Gender "f"
-  | "m1.n" -> Genders["m1";"n1";"n2"]
-  | "_" -> GenderUndef
-  | "agr" -> GenderAgr
-  | s -> failwith ("parse_gender: " ^ s)
-
-let parse_grad = function
-    "pos" -> Grad "pos"
-  | "com" -> Grad "com"
-  | "sup" -> Grad "sup"
-  | "_" -> GradUndef
-  | s -> failwith ("parse_grad: " ^ s)
-
-let rec parse_restr = function
-    "natr" -> Natr
-  | "atr" -> Atr
-  | "ratr" -> Ratr
-  | "atr1" -> Atr1
-  | "ratr1" -> Ratr1
-  | s -> failwith ("parse_restr: " ^ s)
-
-
-let parse_comp = function
-    "int" -> Int,[]
-  | "rel" -> Rel,[]
-  | "co" -> CompTypeUndef,[Comp "co"] (* subst qub prep comp *)
-  | "kto" -> CompTypeUndef,[Comp "kto"] (* subst *)
-  | "ile" -> CompTypeUndef,[Comp "ile"] (* num adv *)
-  | "jaki" -> CompTypeUndef,[Comp "jaki"] (* adj *)
-  | "który" -> CompTypeUndef,[Comp "który"] (* adj *)
-  | "czyj" -> CompTypeUndef,[Comp "czyj"] (* adj *)
-  | "jak" -> CompTypeUndef,[Comp "jak"] (* prep conj adv *)
-  | "kiedy" -> CompTypeUndef,[Comp "kiedy"] (* comp adv *)
-  | "gdzie" -> CompTypeUndef,[Comp "gdzie"] (* qub adv *)
-  | "odkąd" -> CompTypeUndef,[Comp "odkąd"] (* adv *)
-  | "skąd" -> CompTypeUndef,[Comp "skąd"] (* adv *)
-  | "dokąd" -> CompTypeUndef,[Comp "dokąd"] (* adv *)
-  | "którędy" -> CompTypeUndef,[Comp "którędy"] (* adv *)
-  | "dlaczego" -> CompTypeUndef,[Comp "dlaczego"] (* adv *)
-  | "czemu" -> CompTypeUndef,[Comp "czemu"] (* adv *)
-  | "czy" -> CompTypeUndef,[Comp "czy"] (* qub conj *)
-  | "jakby" -> CompTypeUndef,[Comp "jakby"] (* qub comp *)
-  | "jakoby" -> CompTypeUndef,[Comp "jakoby"] (* qub comp *)
-  | "gdy" -> CompTypeUndef,[Gdy] (* adv; gdyby: qub comp *)
-  | "dopóki" -> CompTypeUndef,[Comp "dopóki"] (* comp *)
-  | "zanim" -> CompTypeUndef,[Comp "zanim"] (* comp *)
-  | "jeśli" -> CompTypeUndef,[Comp "jeśli"] (* comp *)
-  | "żeby2" -> CompTypeUndef,[Zeby]
-  | "żeby" -> CompTypeUndef,[Comp "żeby"] (* qub comp *)
-  | "że" -> CompTypeUndef,[Comp "że"] (* qub comp *)
-  | "aż" -> CompTypeUndef,[Comp "aż"] (* qub comp *)
-  | "bo" -> CompTypeUndef,[Comp "bo"] (* qub comp *)
-  | s -> failwith ("parse_comp: " ^ s)
-
-let load_type_constrains = function
-  | Symbol value ->
-    (match parse_comp value with
-       CompTypeUndef,[c] -> c
-     | _ -> failwith "load_type_constrains")
-  | xml -> failwith ("load_type_constrains:\n " ^ tei_to_string xml)
-
-let load_ctype = function
-  | F("type",Fs("type_def", x)) ->
-    (match x with
-     | [F("conjunction",Symbol value)] -> parse_comp value
-     | [F("conjunction",Symbol value);Fset("constraints",set)] ->
-       (match parse_comp value with
-          CompTypeUndef, _ -> failwith "load_ctype"
-        | ctype,[] -> ctype, List.rev (Xlist.rev_map set load_type_constrains)
-        | _ -> failwith "load_ctype")
-     | l -> failwith ("load_ctype 2:\n " ^ String.concat "\n" (Xlist.map l tei_to_string)))
-  | xml -> failwith ("load_ctype:\n " ^ tei_to_string xml)
-
-let load_lemmas_set = function
-  | TEIstring mstring -> mstring
-  | xml -> failwith ("load_lemmas_set:\n " ^ tei_to_string xml)
-
-let check_lemma s =
-  match Str.full_split (Str.regexp "(\\|)") s with
-    [Str.Text s] -> Lexeme s
-  | [Str.Text "E"; Str.Delim "("; Str.Text g; Str.Delim ")"] -> Elexeme(parse_gender g)
-  | _ -> failwith "check_lemma"
-
-let make_lemma = function
-  | _,_,[lemma] -> check_lemma lemma
-  | "XOR","concat",lemmas -> XOR(Xlist.map lemmas check_lemma)
-  | "OR","coord",lemmas -> ORcoord(Xlist.map lemmas check_lemma)
-  | "OR","concat",lemmas -> ORconcat(Xlist.map lemmas check_lemma)
-  | _ -> failwith "make_lemma"
-
-let process_lex_phrase lemma = function
-    NP(case),number,GenderUndef,GradUndef,NegationUndef,ReflUndef -> [SUBST(number,case),lemma]
-  | PrepNP(prep,case),number,GenderUndef,GradUndef,NegationUndef,ReflUndef -> [PREP case,Lexeme prep;SUBST(number,case),lemma]
-  | AdjP(case),number,gender,grad,NegationUndef,ReflUndef -> [ADJ(number,case,gender,grad),lemma]
-  | PrepAdjP(prep,case),number,gender,grad,NegationUndef,ReflUndef -> [PREP case,Lexeme prep;ADJ(number,case,gender,grad),lemma]
-  | InfP(aspect),NumberUndef,GenderUndef,GradUndef,negation,ReflTrue -> [INF(aspect,negation),lemma;QUB,Lexeme "się"]
-  | InfP(aspect),NumberUndef,GenderUndef,GradUndef,negation,refl -> [INF(aspect,negation),lemma]
-  | PpasP(case),number,gender,GradUndef,negation,ReflUndef -> [PPAS(number,case,gender,AspectUndef,negation),lemma]
-  | PrepPpasP(prep,case),number,gender,GradUndef,negation,ReflUndef -> [PREP case,Lexeme prep;PPAS(number,case,gender,AspectUndef,negation),lemma]
-  | PactP(case),number,gender,GradUndef,negation,ReflTrue -> [PACT(number,case,gender,AspectUndef,negation),lemma;QUB,Lexeme "się"]
-  | PactP(case),number,gender,GradUndef,negation,refl -> [PACT(number,case,gender,AspectUndef,negation),lemma]
-  | PrepGerP(prep,case),number,GenderUndef,GradUndef,negation,ReflTrue -> [PREP case,Lexeme prep;GER(number,case,GenderUndef,AspectUndef,negation),lemma;QUB,Lexeme "się"]
-  | PrepGerP(prep,case),number,GenderUndef,GradUndef,negation,refl -> [PREP case,Lexeme prep;GER(number,case,GenderUndef,AspectUndef,negation),lemma]
-  | Qub,NumberUndef,GenderUndef,GradUndef,NegationUndef,ReflUndef -> [QUB,lemma]
-  | AdvP(mode),NumberUndef,GenderUndef,grad,NegationUndef,ReflUndef -> [ADV grad,lemma]
-  | phrase,number,gender,grad,negation,reflex ->
-    Printf.printf "%s %s %s %s %s %s\n" (ENIAMwalStringOf.phrase phrase) (ENIAMwalStringOf.number number)
-      (ENIAMwalStringOf.gender gender) (ENIAMwalStringOf.grad grad) (ENIAMwalStringOf.negation negation) (ENIAMwalStringOf.refl reflex); []
-
-let new_schema r cr ce morfs =
-  {psn_id=(-1); gf=r; role=""; role_attr=""; mode=[]; sel_prefs=[]; cr=cr; ce=ce; morfs=morfs}
-
-let rec process_lex lex = function
-  | Phrase(ComparP prep),arguments,Lexeme "",Lexeme "" ->
-    LexPhrase([COMPAR,Lexeme prep],(Ratrs,Xlist.map arguments (fun morf -> new_schema ARG [] [] [morf])))
-  | PhraseAbbr(Xp mode,[argument]),_,_,_ ->
-    let lex = {lex with lex_argument=argument; lex_mode=mode :: lex.lex_mode} in
-    process_lex lex (lex.lex_argument,lex.lex_arguments,lex.lex_lemma,lex.lex_numeral_lemma)
-  (* | PhraseAbbr(Advp mode,[]),[],lemma,Lexeme ""  ->
-    let poss = process_lex_phrase lemma (AdvP,lex.lex_number,lex.lex_gender,lex.lex_degree,lex.lex_negation,lex.lex_reflex) in
-    LexPhrase(poss,lex.lex_modification) *)
-  | Phrase (NumP(case)),[],lemma,num_lemma -> LexPhrase([NUM(case,GenderUndef),num_lemma;SUBST(NumberUndef,CaseUndef),lemma],lex.lex_modification)
-  | Phrase (PrepNumP(prep,case)),[],lemma,num_lemma  -> LexPhrase([PREP case,Lexeme prep;NUM(case,GenderUndef),num_lemma;SUBST(NumberUndef,CaseUndef),lemma],lex.lex_modification)
-  | PhraseComp(Cp,(ctype,[Comp comp])),[],lemma,Lexeme "" ->
-    if lex.lex_reflex = ReflTrue then LexPhrase([COMP ctype,Lexeme comp;PERS(lex.lex_negation),lemma;QUB,Lexeme "się"],lex.lex_modification)
-        else LexPhrase([COMP ctype,Lexeme comp;PERS(lex.lex_negation),lemma],lex.lex_modification)
-  | PhraseComp(Cp,(ctype,[Comp comp1;Comp comp2])),[],lemma,Lexeme "" ->
-    if lex.lex_reflex = ReflTrue then LexPhrase([COMP ctype,XOR[Lexeme comp1;Lexeme comp2];PERS(lex.lex_negation),lemma;QUB,Lexeme "się"],lex.lex_modification)
-        else LexPhrase([COMP ctype,XOR[Lexeme comp1;Lexeme comp2];PERS(lex.lex_negation),lemma],lex.lex_modification)
-  | Phrase phrase,[],lemma,Lexeme ""  ->
-    let poss = process_lex_phrase lemma (phrase,lex.lex_number,lex.lex_gender,lex.lex_degree,lex.lex_negation,lex.lex_reflex) in
-    LexPhrase(poss,lex.lex_modification)
-  | (argument,arguments,lemma,numeral_lemma) ->
-    let s = Printf.sprintf "%s [%s] %s %s\n" (ENIAMwalStringOf.morf argument)
-      (String.concat ";" (Xlist.map arguments ENIAMwalStringOf.morf))
-      (ENIAMwalStringOf.lex lemma) (ENIAMwalStringOf.lex numeral_lemma) in
-    failwith ("process_lex: " ^ s)
-
-(* UWAGA: refl_id może się zmienić wraz z wersją Walentego *)
-let refl_id = 25
-let refl_position = {empty_position with role="Lemma"; mode=["lemma"]; morfs=[MorfId refl_id]}
-
-let rec load_category = function
-  | F("category",Fs("category_def",x)) ->
-    (match x with
-     | [F("name",Symbol value)] -> value, []
-     | [F("name",Symbol value);Fset("constraints",set)] ->
-       value, List.rev (Xlist.rev_map set (load_phrase (ref [])))
-     | l -> failwith ("load_category 2:\n " ^ String.concat "\n" (Xlist.map l tei_to_string)))
-  | xml -> failwith ("load_category:\n " ^ tei_to_string xml)
-
-and load_modification_def = function (*pomocnicza do load_lex *)
-  | [F("type",Symbol value)] -> parse_restr value, []
-  | [F("type",Symbol value); Fset("positions",set)] ->
-    parse_restr value, List.rev (Xlist.rev_map set (load_position (-1) (-1) (ref IntMap.empty)))
-  | x -> Printf.printf "%s\n" (tei_to_string (List.hd x));
-    failwith "load_modification_def:\n"
-
-and load_lex arg xml = match xml with
-  | F("argument",set) ->
-    let mode = ref [] in
-    let a = load_phrase mode set in
-    {arg with lex_argument = a; lex_mode = !mode}
-  | Fset("arguments",set) ->
-    {arg with lex_arguments=List.rev (Xlist.rev_map set (load_phrase (ref [])))}
-  | F("modification",Fs("modification_def",x)) -> {arg with lex_modification = load_modification_def x}
-  | F("lemma",Fs("lemma_def",[F("selection_mode",Symbol value1);
-                              F("cooccurrence",Symbol value2);
-                              Fset("lemmas",lemmas)])) ->
-    {arg with lex_lemma = make_lemma (value1, value2, List.rev (Xlist.rev_map lemmas load_lemmas_set))}
-  |  F("numeral_lemma",Fs("numeral_lemma_def",[F("selection_mode",Symbol value1);
-                                               F("cooccurrence",Symbol value2);
-                                               Fset("lemmas",lemmas)])) ->
-    {arg with lex_numeral_lemma = make_lemma (value1, value2, List.rev (Xlist.rev_map lemmas load_lemmas_set))}
-  | F("negation",Symbol value) -> {arg with lex_negation = parse_negation value}
-  | F("degree",Symbol value) -> {arg with lex_degree = parse_grad value}
-  | F("number",Symbol value) -> {arg with lex_number = parse_number value}
-  | F("reflex",Binary true) -> {arg with lex_reflex = ReflTrue}
-  | F("reflex",Binary false) -> {arg with lex_reflex = ReflFalse}
-  | Fset("reflex",[]) -> {arg with lex_reflex = ReflEmpty}
-  | Fset("gender",[Symbol value]) -> {arg with lex_gender = parse_gender value}
-  | xml ->
-    Printf.printf "%s\n" (tei_to_string xml);
-    failwith "load_lex:\n "
-
-and load_phrase mode = function
-  | Fs("np",[F("case",Symbol a)]) -> Phrase (NP(parse_case a));
-  | Fs("prepnp", [F("preposition",Symbol a);F("case",Symbol b)]) -> Phrase (PrepNP(a, parse_case b))
-  | Fs("adjp", [F("case",Symbol a)]) -> Phrase (AdjP(parse_case a))
-  | Fs("prepadjp", [F("preposition",Symbol a);F("case",Symbol b)]) -> Phrase (PrepAdjP(a, parse_case b))
-  | Fs("comprepnp", [e;F("complex_preposition",TEIstring a)]) -> Phrase (ComprepNP(a))
-  | Fs("comprepnp", [F("complex_preposition",TEIstring a)]) -> Phrase (ComprepNP(a))
-  | Fs("cp", [a]) -> PhraseComp(Cp,load_ctype a)
-  | Fs("ncp", [F("case",Symbol a);b]) -> PhraseComp(Ncp(parse_case a),load_ctype b)
-  | Fs("prepncp", [F("preposition",Symbol a);F("case",Symbol b);c]) -> PhraseComp(Prepncp(a, parse_case b),load_ctype c)
-  | Fs("infp", [F("aspect",Symbol a)]) -> Phrase (InfP(parse_aspect a))
-  | Fs("xp", [a]) -> let x,y = load_category a in mode:=x :: !mode; PhraseAbbr(Xp x,y)
-  | Fs("xp", [e;a]) -> let x,y = load_category a in mode:=x :: !mode; PhraseAbbr(Xp x,y)
-  | Fs("advp", [F("category",Symbol a)]) -> mode:=a :: !mode; Phrase(AdvP(a))
-  | Fs("advp", [e;F("category",Symbol a)]) -> mode:=a :: !mode; Phrase(AdvP(a))
-  | Fs("nonch", []) -> mode:="nonch" :: !mode; PhraseAbbr(Nonch,[])
-  | Fs("or", []) -> Phrase Or
-  | Fs("refl", []) -> mode:="refl" :: !mode; LexPhrase([QUB,Lexeme "się"],(Natr,[]))
-  | Fs("E", []) -> E Null
-  | Fs("lex", x) ->
-    let lex = Xlist.fold x empty_lex load_lex in
-    mode := lex.lex_mode @ !mode;
-    process_lex lex (lex.lex_argument,lex.lex_arguments,lex.lex_lemma,lex.lex_numeral_lemma)
-  | Fs("fixed", [F("argument",a);F("string",TEIstring b)]) -> Phrase (FixedP((*snd (load_phrase a),*)b))
-  | Fs("possp", [e]) -> mode:="possp" :: !mode; PhraseAbbr(Possp,[])
-  | Fs("possp", []) -> mode:="possp" :: !mode; PhraseAbbr(Possp,[])
-  | Fs("recip", []) -> mode:="recip" :: !mode; LexPhrase([QUB,Lexeme "się"],(Natr,[]))
-  | Fs("distrp", [e]) -> mode:="distrp" :: !mode; PhraseAbbr(Distrp,[])
-  | Fs("distrp", []) -> mode:="distrp" :: !mode; PhraseAbbr(Distrp,[])
-  | Fs("compar", [F("compar_category",Symbol value)]) -> Phrase(ComparP value)
-  | Fs("gerp", [F("case",Symbol a)]) -> Phrase (GerP(parse_case a))
-  | Fs("prepgerp", [F("preposition",Symbol a);F("case",Symbol b)]) -> Phrase (PrepGerP(a, parse_case b))
-  | Fs("nump", [F("case",Symbol a)]) -> Phrase (NumP(parse_case a))
-  | Fs("prepnump", [F("preposition",Symbol a);F("case",Symbol b)]) -> Phrase (PrepNumP(a, parse_case b))
-  | Fs("ppasp", [F("case",Symbol a)]) -> Phrase (PpasP(parse_case a))
-  | Fs("prepppasp", [F("preposition",Symbol a);F("case",Symbol b)]) -> Phrase (PrepPpasP(a, parse_case b))
-  | Fs("qub", []) -> Phrase Qub
-  | Fs("pactp", [F("case",Symbol a)]) -> Phrase (PactP(parse_case a))
-  | Fs("adverb",[F("adverb",Symbol s)]) -> LexPhrase([ADV (Grad "pos"),Lexeme s],(Natr,[]))
-  | xml -> failwith ("load_phrase match:\n " ^ tei_to_string xml)
-
-and load_phrase_id ent sch psn phrases mode = function
-    | Fs(morf,Id{hash=false; numbers=[ent_id;sch_id;psn_id;id]; suffix="phr"} :: l) ->
-      if ent_id = ent && sch_id = sch && psn_id = psn then
-       let morf = load_phrase mode (Fs(morf, l)) in
-       phrases := IntMap.add_inc (!phrases) id morf (fun morf2 -> if morf = morf2 then morf else failwith "load_phrase_id");
-       MorfId id
-     else failwith (Printf.sprintf "load_phrase %d %d" ent ent_id)
-    | Fs(morf, l) -> load_phrase mode (Fs(morf, l))
-    | _ -> failwith "load_phrase_id"
-
-
-and load_control arg = function
-  | Symbol  value -> parse_control arg value
-  | xml -> failwith ("load_control:\n " ^ tei_to_string xml)
-
-and load_position_info ent sch phrases arg = function
-  | F("function",Symbol  value) -> {arg with gf = parse_gf value}
-  | Fset("phrases",phrases_set) ->
-    let mode = ref [] in
-    let morfs = List.rev (Xlist.rev_map phrases_set (load_phrase_id ent sch arg.psn_id phrases mode)) in
-    {arg with morfs = morfs; mode = StringSet.to_list (StringSet.of_list (!mode))}
-  | Fset("control",control_set) -> Xlist.fold control_set arg load_control
-  | Id{hash=false; numbers=[ent_id;sch_id;id]; suffix="psn"} ->
-     if ent_id = ent && sch_id = sch then {arg with psn_id = id}
-     else failwith (Printf.sprintf "load_position_info %d %d" ent ent_id)
-  | xml -> failwith ("load_position_info:\n " ^ tei_to_string xml)
-
-and load_position ent sch phrases = function
-  | Fs("position", listt) ->
-    Xlist.fold listt empty_position (load_position_info ent sch phrases)
-  | xml -> failwith ("load_position:\n " ^ tei_to_string xml)
-
-let parse_opinion = function
-    "cer" -> Pewny
-  | "col" -> Potoczny
-  | "unc" -> Watpliwy
-  | "dat" -> Archaiczny
-  | "bad" -> Zly
-  | "vul" -> Wulgarny
-  | "unk" -> Nieokreslony
-  | "met" -> Metaforyczny
-  | "dom" -> Dziedzinowy
-  | "rar" -> Sporadyczny
-  | "wątpliwy" -> Watpliwy
-  | "dobry" -> Pewny
-  | "zły" -> Zly
-  | x -> failwith ("parse_opinion: " ^ x)
-
-let load_schema_info ent phrases (arg:schema) = function
-  | F("opinion",Symbol opinion_value) -> {arg with opinion = parse_opinion opinion_value}
-  | F("inherent_sie",Binary b) -> {arg with reflexiveMark = b}
-  | F("aspect",Symbol aspect_value) -> {arg with aspect = parse_aspect aspect_value}
-  | Fset("aspect", []) -> arg
-  | F("negativity",Symbol negativity_value) -> {arg with negativity = parse_negation negativity_value}
-  | Fset("negativity",[]) -> arg
-  | F("predicativity",Binary true) -> {arg with predicativity = PredTrue}
-  | F("predicativity",Binary false) -> {arg with predicativity = PredFalse}
-  | Fset("positions", positions) ->
-    {arg with positions = List.rev (Xlist.rev_map positions (load_position ent arg.sch_id phrases))}
-  | F("text_rep",TEIstring text_rep) -> {arg with text_rep = text_rep}
-  | Id{hash=false; numbers=[ent_id;id]; suffix="sch"} -> if ent_id = ent then {arg with sch_id = id} else failwith (Printf.sprintf "load_schema_info %d %d" ent ent_id)
-  | xml -> failwith ("load_schema_info\n " ^ tei_to_string xml)
-
-let load_schema ent phrases = function
-    Fs("schema", schema) ->
-    let result = {sch_id = (-1); opinion = OpinionUndef; reflexiveMark = false; aspect = AspectUndef;
-                  negativity = NegationUndef; predicativity = PredUndef; positions = []; text_rep=""} in
-    let result = Xlist.fold schema result (load_schema_info ent phrases) in
-    result
-  | xml -> failwith ("load_schema:\n " ^ tei_to_string xml)
-
-let load_phrases_set ent = function
-  | SameAs({hash=true; numbers=[ent_id;sch_id;psn_id;phr_id]; suffix="phr"},"phrase") ->
-      if ent_id <> ent then failwith (Printf.sprintf "load_phrases_set %d %d" ent ent_id) else
-      sch_id,psn_id,phr_id
-  | xml -> failwith ("load_phrases_set :\n " ^ tei_to_string xml)
-
-let load_example_info ent arg = function
-  | F("meaning",SameAs({hash=true; numbers=[ent_id;id]; suffix="mng"},"lexical_unit")) ->
-      if ent_id = ent then {arg with meaning = id} else failwith (Printf.sprintf "load_example_info %d %d" ent ent_id)
-  | Fset("phrases",phrases_set) ->
-    {arg with phrases = List.rev (Xlist.rev_map phrases_set (load_phrases_set ent))}
-  | F("sentence",TEIstring sentence_string) -> {arg with sentence = sentence_string}
-  | F("source",Symbol source_value) -> {arg with source = source_value}
-  | F("opinion",Symbol opinion_value) -> {arg with opinion = parse_opinion opinion_value}
-  | F("note",TEIstring note_string) -> {arg with note = note_string}
-  | Id{hash=false; numbers=[ent_id;id]; suffix="exm"} -> if ent_id = ent then {arg with exm_id = id} else failwith (Printf.sprintf "load_example_info %d %d" ent ent_id)
-  | xml -> failwith ("load_example_info: \n " ^ tei_to_string xml)
-
-let load_example ent = function
-  | Fs("example",example_elements) ->
-    let result = {exm_id = (-1); meaning = (-1); phrases = []; sentence = "";
-                  source = ""; opinion = OpinionUndef; note = "";} in
-    let result = Xlist.fold example_elements result (load_example_info ent) in
-    result
-  | xml -> failwith ("load_example: \n " ^ tei_to_string xml)
-
-let load_self_prefs_sets name ent frm = function
-  | Numeric value -> if name = "synsets" then SynsetId value else failwith "load_self_prefs_sets"
-  | Symbol value -> if name = "predefs" then Predef value else failwith "load_self_prefs_sets"
-  | Fs("relation",[F("type",Symbol value);F("to",SameAs({hash=true; numbers=[ent_id;frm_id;arg_id]; suffix="arg"}, "argument"))]) ->
-    if ent_id <> ent || frm_id <> frm || name <> "relations" then failwith (Printf.sprintf "load_self_prefs_sets %d %d" ent ent_id)
-    else RelationArgId(value,arg_id)
-  | xml -> failwith ("load_self_prefs_sets: \n " ^ tei_to_string xml)
-
-let load_argument_self_prefs ent frm = function
-  | Fset(name,self_prefs_set) ->
-    List.rev (Xlist.rev_map self_prefs_set (load_self_prefs_sets name ent frm))
-  | xml -> failwith ("load_argument_self_prefs: \n " ^ tei_to_string xml)
-
-let load_argument_info ent frm arg = function
-  | F("role",Symbol value) -> {arg with role = value}
-  | F("role_attribute",Symbol value) -> {arg with role_attribute = value}
-  | F("sel_prefs",Fs("sel_prefs_groups", self_prefs)) ->
-    {arg with sel_prefs = List.flatten (List.rev (Xlist.rev_map self_prefs (load_argument_self_prefs ent frm)))}
-  (* | Id id -> {arg with arg_id = id} *)
-  | Id{hash=false; numbers=[ent_id;frm_id;id]; suffix="arg"} ->
-     if ent_id = ent && frm_id = frm then {arg with arg_id = id}
-     else failwith (Printf.sprintf "load_argument_info %d %d" ent ent_id)
-  | xml -> failwith ("load_argument_info :\n " ^ tei_to_string xml)
-
-let load_arguments_set ent frm = function
-  | Fs("argument", info) ->
-    let result = {arg_id = (-1); role = ""; role_attribute = ""; sel_prefs = []} in
-    let result = Xlist.fold info result (load_argument_info ent frm) in
-    result
-  | xml -> failwith ("load_arguments_set :\n " ^ tei_to_string xml)
-
-let load_meanings_set ent = function
-  | SameAs({hash=true; numbers=[ent_id;id]; suffix="mng"},"lexical_unit") ->
-      if ent_id = ent then id else failwith (Printf.sprintf "load_meanings_set %d %d" ent ent_id)
-  | xml -> failwith ("load_meanings_set :\n " ^ tei_to_string xml)
-
-let load_frame ent = function
-  | Fs("frame",[
-      Id{hash=false; numbers=[ent_id;id]; suffix="frm"};
-      F("opinion",Symbol opinion);
-      Fset("meanings",meanings_set);
-      Fset("arguments",arguments_set)]) ->
-    if ent_id <> ent then failwith (Printf.sprintf "load_frame %d %d" ent ent_id) else
-    {frm_id = id;
-     opinion = parse_opinion opinion;
-     meanings = List.rev (Xlist.rev_map meanings_set (load_meanings_set ent));
-     arguments = List.rev (Xlist.rev_map arguments_set (load_arguments_set ent id))}
-  | xml -> failwith ("load_frame :\n " ^ tei_to_string xml)
-
-let load_meaning_info ent arg = function
-  | F("name",TEIstring name_string) -> {arg with name = name_string}
-  | F("variant",TEIstring variant_string) -> {arg with variant = variant_string}
-  | F("plwnluid",Numeric value) -> {arg with plwnluid = value}
-  | F("gloss",TEIstring gloss_string) -> {arg with gloss = gloss_string}
-  | Id{hash=false; numbers=[ent_id;id]; suffix="mng"} -> if ent_id = ent then {arg with mng_id = id} else failwith (Printf.sprintf "load_meaning_info %d %d" ent ent_id)
-  | xml -> failwith ("load_meaning_info:\n " ^ tei_to_string xml)
-
-
-let load_meaning ent = function
-  | Fs("lexical_unit", meaning_info) ->
-    Xlist.fold meaning_info empty_meaning (load_meaning_info ent)
-  | xml -> failwith ("load_meaning:\n " ^ tei_to_string xml)
-
-let load_alter_connection ent = function
-  | Fs("connection", [
-      F("argument",SameAs({hash=true; numbers=[ent_id;frm_id;arg_id]; suffix="arg"},"argument"));
-      Fset("phrases",phrases)]) ->
-   if ent_id <> ent then failwith (Printf.sprintf "load_alter_connection %d %d" ent ent_id) else
-     let phrases,sch_set = Xlist.fold phrases (IntMap.empty,IntSet.empty) (fun (phrases,sch_set) phrase ->
-       let sch_id,psn_id,phr_id = load_phrases_set ent phrase in
-       IntMap.add_inc phrases psn_id [phr_id] (fun l -> phr_id :: l),
-       IntSet.add sch_set sch_id) in
-     if IntSet.size sch_set <> 1 then failwith (Printf.sprintf "load_alter_connection: |sch_set|=%d" (IntSet.size sch_set)) else
-     IntSet.min_elt sch_set, frm_id,
-     {argument = arg_id; phrases = IntMap.fold phrases [] (fun l psn phrs -> (psn,phrs) :: l)}
-  | xml -> failwith ("load_alter_connections: \n " ^ tei_to_string xml)
-
-let load_alternations ent = function
-  | Fs("alternation",[Fset("connections",connections_set)]) ->
-      let conns,sch_set,frm_set = Xlist.fold connections_set ([],IntSet.empty,IntSet.empty) (fun (conns,sch_set,frm_set) conn ->
-        let sch_id,frm_id,conn = load_alter_connection ent conn in
-        conn :: conns, IntSet.add sch_set sch_id, IntSet.add frm_set frm_id) in
-      if IntSet.size sch_set <> 1 then failwith (Printf.sprintf "load_alternations: |sch_set|=%d" (IntSet.size sch_set)) else
-      if IntSet.size frm_set <> 1 then failwith (Printf.sprintf "load_alternations: |frm_set|=%d" (IntSet.size sch_set)) else
-      {schema=IntSet.min_elt sch_set; frame=IntSet.min_elt frm_set; connections=List.rev conns}
-  | xml -> failwith ("load_alternations: \n " ^ tei_to_string xml)
-
-let load_entry phrases = function
-  | Xml.Element("entry",["xml:id",id], l) ->
-    (* print_endline id; *)
-    let id = match parse_id id with
-        {hash=false; numbers=[id]; suffix="ent"} -> id
-      | _ -> failwith "process_meanings" in
-    let entry = {empty_entry with ent_id = id} in
-    Xlist.fold l entry (fun e -> function
-          Xml.Element("form", [], [
-            Xml.Element("orth",[],[Xml.PCData orth]);
-            Xml.Element("pos",[],[Xml.PCData pos])]) -> (*print_endline orth;*) {e with form_orth=orth; form_pos=pos}
-        | xml -> (match parse_tei xml with
-            | Fs("syntactic_layer", [Fset("schemata",schemata_set)]) -> {e with schemata = List.rev (Xlist.rev_map schemata_set (load_schema id phrases))}
-            | Fs("examples_layer", [Fset("examples",examples_set)]) -> {e with examples = List.rev (Xlist.rev_map examples_set (load_example id))}
-            | Fs("semantic_layer", [Fset("frames",frame_set)]) -> {e with frames = List.rev (Xlist.rev_map frame_set (load_frame id))}
-            | Fs("meanings_layer", [Fset("meanings",meanings_set)]) -> {e with meanings = List.rev (Xlist.rev_map meanings_set (load_meaning id))}
-            | Fs("connections_layer",[Fset("alternations",alternations)]) -> {e with alternations = List.rev (Xlist.rev_map alternations (load_alternations id))}
-            | Fs("general_info",[F("status",TEIstring status)]) -> {e with status=status}
-            | xml -> failwith ("load_entry: \n" ^ tei_to_string xml)))
-   | xml -> failwith ("load_entry: \n" ^ Xml.to_string_fmt xml)
-
-let load_walenty filename =
-  begin
-    match Xml.parse_file filename with
-      Xml.Element("TEI", _,
-                  [Xml.Element("teiHeader",_,_) ;
-                   Xml.Element("text",[],[Xml.Element("body",[],entries)])]) ->
-        let phrases = ref IntMap.empty in
-        let walenty = List.rev (Xlist.rev_map entries (load_entry phrases)) in
-        walenty, !phrases
-    | _ -> failwith "load_walenty"
-  end
-
-let correct_expansion = function
-    [{gf=ARG; cr=[]; ce=[]; morfs=[Phrase(FixedP s)]};p] -> [LexPhrase([FIXED,Lexeme s],(Ratr,[p]))]
-  | [{gf=ARG; cr=[]; ce=[]; morfs=[LexPhrase([pos,Lexeme "własny"],(Natr,[]))]};{morfs=[a;b]} as p] ->
-    [a;b;LexPhrase([pos,Lexeme "własny"],(Atr,[p]))]
-  | _ -> failwith "correct_expansion"
-
-let load_expansion = function
-    Fs("expansion",[F("opinion",Symbol opinion);Fset("phrases",[p])]) -> [load_phrase (ref []) p]
-  | Fs("expansion",[F("opinion",Symbol opinion);Fset("positions",set)]) -> correct_expansion (List.rev (Xlist.rev_map set (load_position (-1) (-1) (ref IntMap.empty))))
-  | tei -> failwith ("load_expansion: \n" ^ tei_to_string tei)
-
-let load_rentry = function
-  | Xml.Element("entry",["xml:id",id], [phrase;exp]) ->
-    let id = match parse_id id with
-        {hash=false; numbers=[id]; suffix="exp"} -> id
-      | _ -> failwith "process_meanings" in
-    let morf = load_phrase (ref []) (parse_tei phrase) in
-    let expansions = match parse_tei exp with
-        | Fs("phrase_type_expansions", [Fset("expansions",expansions)]) -> List.flatten (List.rev (Xlist.rev_map expansions load_expansion))
-        | Fs("phrase_type_expansions", [F("expansions",expansion)]) -> load_expansion expansion
-        | tei -> failwith ("load_entry: \n" ^ tei_to_string tei) in
-    id,morf,expansions
-  | xml -> failwith ("load_entry: \n" ^ Xml.to_string_fmt xml)
-
-let expands_supplement = [
-  (-2), PhraseAbbr(Nonch,[]), [
-    LexPhrase([SUBST(NumberUndef,Str),Lexeme "co"],(Natr,[]));
-    LexPhrase([SUBST(NumberUndef,Str),Lexeme "coś"],(Natr,[]));
-    LexPhrase([SUBST(NumberUndef,Str),Lexeme "nic"],(Natr,[]));
-    LexPhrase([SUBST(NumberUndef,Str),Lexeme "to"],(Natr,[]));
-    ];
-  (-3), Phrase (AdvP "pron"), [
-    LexPhrase([ADV (Grad "pos"),Lexeme "tak"],(Natr,[]));
-    LexPhrase([ADV (Grad "pos"),Lexeme "jak"],(Natr,[]))
-    ]]
-
-let load_expands filename =
-  begin
-    match Xml.parse_file filename with
-      Xml.Element("TEI", _,
-                  [Xml.Element("teiHeader",_,_) ;
-                   Xml.Element("text",[],[Xml.Element("body",[],entries)])]) ->
-      expands_supplement @ List.rev (Xlist.rev_map entries load_rentry)
-    | _ -> failwith "load_walenty"
-  end
-
-let subtypes = [
-  "int",[
-    "co"; "czemu"; "czy"; "czyj"; "dlaczego"; "dokąd"; "gdzie"; "ile"; "jak";
-    "jaki"; "kiedy"; "kto"; "którędy"; "który"; "odkąd"; "skąd"; "jakoby"];
-  "rel",[
-    "co"; "dokąd"; "gdzie"; "jak"; "jakby"; "jaki"; "jakoby"; "kiedy"; "kto";
-    "którędy"; "który"; "odkąd"; "skąd"]]
-
-let equivs = ["jak",["niczym"]; "przeciw",["przeciwko"]]
-*)
--
libgit2 0.22.2