# Adds [conj] features to nouns and NPs (define add-conj-features (recurse (chain (if-then (chain (syntax "(NP{1}\NP{1}){0}") (combinator (syntax "conj") (syntax "NP{0}"))) (replace-syntax "(NP[conj]{1}\NP{1}){0}")) (if-then (chain (syntax "(NP{1}\NP{1}){0}") (combinator (syntax ",{0}") (syntax "(NP[conj]{1}\NP{1}){0}"))) (replace-syntax "(NP[conj]{1}\NP{1}){0}")) (if-then (chain (syntax "NP{0}") (combinator (syntax "NP{0}") (syntax "(NP[conj]{1}\NP{1}){0}"))) (replace-syntax "NP[conj]{0}")) (if-then (chain (syntax "NP{0}") (combinator (syntax "N{0}") (syntax "(NP[conj]{1}\NP{1}){0}"))) (replace-syntax "NP[conj]{0}")) (if-then (chain (syntax "(NP{1}\NP{1}){0}") (combinator (syntax ",") (syntax "NP[conj]{0}"))) (replace-syntax "(NP[conj]{1}\NP{1}){0}")) (if-then (chain (syntax "NP{0}") (combinator (syntax "NP[conj]{0}") (syntax "(NP{1}\NP{1}){0}"))) (replace-syntax "NP[conj]{0}")) (if-then (chain (syntax "NP{0}") (combinator (syntax "(NP{1}/NP{1}){0}") (syntax "NP[conj]{0}"))) (replace-syntax "NP[conj]{0}")) # Same rules for nouns. (if-then (chain (syntax "(NP{1}\NP{1}){0}") (combinator (syntax "conj") (syntax "N{0}"))) (replace-syntax "(NP[conj]{1}\NP{1}){0}")) (if-then (chain (syntax "(N{1}\N{1}){0}") (combinator (syntax "conj") (syntax "N{0}"))) (replace-syntax "(N[conj]{1}\N{1}){0}")) (if-then (chain (syntax "(N{1}\N{1}){0}") (combinator (syntax ",{0}") (syntax "(N[conj]{1}\N{1}){0}"))) (replace-syntax "(N[conj]{1}\N{1}){0}")) (if-then (chain (syntax "N{0}") (combinator (syntax "N{0}") (syntax "(N[conj]{1}\N{1}){0}"))) (replace-syntax "N[conj]{0}")) (if-then (chain (syntax "NP{0}") (combinator (syntax "N{0}") (syntax "(N[conj]{1}\N{1}){0}"))) (replace-syntax "NP[conj]{0}")) (if-then (chain (syntax "(N{1}\N{1}){0}") (combinator (syntax ",") (syntax "N[conj]{0}"))) (replace-syntax "(N[conj]{1}\N{1}){0}")) (if-then (chain (syntax "N{0}") (combinator (syntax "N[conj]{0}") (syntax "(N{1}\N{1}){0}"))) (replace-syntax "N[conj]{0}")) (if-then (chain (syntax "N{0}") (combinator (syntax "(N{1}/N{1}){0}") (syntax "N[conj]{0}"))) (replace-syntax "N[conj]{0}")) # Rules for absorbing punctuation (if-then (chain (syntax "NP{0}") (combinator (union (syntax "N[conj]{0}") (syntax "NP[conj]{0}")) (union (syntax ".") (syntax ",")))) (replace-syntax "NP[conj]{0}")) (if-then (chain (syntax "NP{0}") (combinator (union (syntax ".") (syntax ",")) (union (syntax "N[conj]{0}") (syntax "NP[conj]{0}")))) (replace-syntax "NP[conj]{0}")) (if-then (chain (syntax "N{0}") (combinator (syntax "N[conj]{0}") (union (syntax ".") (syntax ",")))) (replace-syntax "N[conj]{0}")) (if-then (chain (syntax "N{0}") (combinator (union (syntax ".") (syntax ",")) (syntax "N[conj]{0}"))) (replace-syntax "N[conj]{0}")) # Add word features to PPs. # (if-then (chain (syntax "(PP{0}/NP{1}){0}") isTerminal) (replace-syntax "(PP[TEST]{0}/NP[0]{1}){0}")) (propagate-features) ))) (define find-adjunct-tree (chain (syntax "(S[0]{0}\NP{1}){0}") (combinator (syntax "(S[0]{0}\NP{1}){0}") (chain (syntax "((S{0]{0}\NP{1}){0}\(S{0]{0}\NP{1}){0}){2}") (head-subtree (combinator (syntax "(((S{0]{0}\NP{1}){0}\(S{0]{0}\NP{1}){0}){2}/NP{3}){2}") (syntax "NP{3}") )))))) (define replace-adjuncts (recurse (if-then find-adjunct-tree adjunct-to-argument))) (define find-np-tree (chain (syntax "NP{0}") (combinator (chain (syntax "NP{0}") (head-subtree (chain isTerminal (not (lf-regex ".*mention.*"))))) (chain (syntax "(NP{0}\NP{0}){1}") (head-subtree (combinator (syntax "((NP{0}\NP{0}){1}/NP{2}){1}") (syntax "NP{2}") )))))) (define find-noun-tree (chain (syntax "N{0}") (combinator (chain (syntax "N{0}") (head-subtree (chain isTerminal (not (lf-regex ".*mention.*"))))) (chain (syntax "(N{0}\N{0}){1}") (head-subtree (combinator (syntax "((N{0}\N{0}){1}/N{2}){1}") (syntax "N{2}") )))))) (define np-pp-args (recurse (if-then find-np-tree adjunct-to-argument))) (define noun-pp-args (recurse (if-then find-noun-tree adjunct-to-argument))) # (chain replace-adjuncts noun-pp-args np-pp-args add-conj-features) (chain replace-adjuncts add-conj-features)