Last active
October 7, 2018 18:19
-
-
Save tlinkowski/ca99e78498b877504fec2b70f294b2f4 to your computer and use it in GitHub Desktop.
Two ways of modeling a Natural Language Processing subdomain: 1) using subtype hierarchies in both dimensions, 2) using a subtype hierarchy in one dimension and a parametrized hierarchy in another dimension
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import java.util.List; | |
import java.util.Locale; | |
import java.util.stream.Stream; | |
/* **************************************** | |
* 1) CORE LANGUAGE-SPECIFIC TYPES (AXIS Z) | |
******************************************/ | |
/* | |
* 1.A) PART OF SPEECH | |
* https://en.wikipedia.org/wiki/Part_of_speech | |
*/ | |
// | |
// 1.A.I) ENGLISH PART OF SPEECH | |
// | |
/** | |
* Implementing classes consist of one or more part-of-speech tags (each tag provided by a different tagger). | |
*/ | |
interface PartOfSpeech { | |
} | |
class EnglishPartOfSpeech implements PartOfSpeech { | |
private final Type1EnglishTag type1Tag = Type1EnglishTag.TO; // SIMPLIFICATION | |
private final Type2EnglishTag type2Tag = Type2EnglishTag.GENERAL_PREPOSITION; // SIMPLIFICATION | |
boolean isInfinitiveMarker() { | |
return type1Tag == Type1EnglishTag.TO && type2Tag == Type2EnglishTag.INFINITIVE_MARKER; | |
} | |
} | |
enum Type1EnglishTag { | |
// SIMPLIFICATION (partial content) | |
TO // "to" as a preposition or an infinitive marker | |
} | |
enum Type2EnglishTag { | |
// SIMPLIFICATION (partial content) | |
GENERAL_PREPOSITION, // e.g. "to" in "I said to him that..." | |
INFINITIVE_MARKER // "to", e.g. in "I want to ask." | |
} | |
// | |
// 1.A.II) GERMAN PART OF SPEECH | |
// | |
class GermanPartOfSpeech implements PartOfSpeech { | |
private final Type1GermanTag type1Tag = Type1GermanTag.POSTPOSITION; // SIMPLIFICATION | |
boolean isPostposition() { | |
return type1Tag == Type1GermanTag.POSTPOSITION; | |
} | |
} | |
enum Type1GermanTag { | |
// SIMPLIFICATION (partial content) | |
POSTPOSITION, // e.g. "zufolge" | |
} | |
/* | |
* 1.B) CONSTITUENT | |
* https://en.wikipedia.org/wiki/Phrase_structure_grammar | |
*/ | |
interface ConstituentType { | |
} | |
enum EnglishConstituentType implements ConstituentType { | |
// SIMPLIFICATION (partial content) | |
VERB_PHRASE, // e.g. "is doing nice" | |
WH_WORD_NOUN_PHRASE // e.g. "whose daughter" | |
} | |
// enum GermanConstituentType missing as of yet | |
/* | |
* 1.C) DEPENDENCY | |
* https://en.wikipedia.org/wiki/Dependency_grammar | |
*/ | |
interface DependencyType { | |
} | |
enum EnglishDependencyType implements DependencyType { | |
// SIMPLIFICATION (partial content) | |
NOMINAL_SUBJECT, // e.g. "he" <- "walks" in "He walks." | |
PHRASAL_VERB_PARTICLE // e.g. "shut" -> "down" in "It was shut down." | |
} | |
// enum GermanDependencyType missing as of yet | |
/* *************** | |
* 2) HELPER TYPES | |
*****************/ | |
interface TextualRange { | |
String text(); | |
int startOffset(); // inclusive | |
int endOffset(); // exclusive | |
} | |
interface Seq { | |
/** | |
* Stub for <a href="https://www.jooq.org/products/jOOλ/javadoc/0.9.12/org/jooq/lambda/Seq.html#ofType-java.util.stream.Stream-java.lang.Class-">Seq.ofType()</a>. | |
*/ | |
@SuppressWarnings("unchecked") | |
static <T, U> Stream<U> ofType(Stream<? extends T> stream, Class<? extends U> type) { | |
return stream.filter(type::isInstance).map(t -> (U) t); | |
} | |
} | |
/** | |
* Defines the stage of text processing (AXIS Y). | |
*/ | |
enum Stage { | |
UNPROCESSED, | |
TOKENIZED, // tokens present | |
SENTENCIZED, // sentences present | |
TAGGED, // parts of speech present | |
PARSED // syntax present | |
} | |
/* *************************** | |
* 3) SOLUTION USING SUBTYPING | |
*****************************/ | |
/* | |
* 3.A) GENERIC HIERARCHY (AXIS Y OVER X) | |
*/ | |
// | |
// 3.A.I) UNPROCESSED | |
// | |
interface LocalizedText extends TextualRange { | |
Locale locale(); | |
default Stage maxStage() { | |
return Stage.UNPROCESSED; | |
} | |
} | |
// | |
// 3.A.II) WITH TOKENS | |
// | |
enum TokenType { | |
WORD, NUMERIC // SIMPLIFICATION | |
} | |
interface Token extends TextualRange { | |
TokenType tokenType(); | |
} | |
interface TokenizedText extends LocalizedText { | |
Stream<? extends Token> tokenStream(); | |
int tokenCount(); | |
@Override | |
default Stage maxStage() { | |
return Stage.TOKENIZED; | |
} | |
} | |
// | |
// 3.A.III) WITH SENTENCES | |
// | |
interface Sentence extends TextualRange { | |
List<? extends Token> tokens(); | |
default Stage stage() { | |
return Stage.SENTENCIZED; | |
} | |
} | |
interface SentencizedText extends TokenizedText { | |
List<? extends Sentence> sentences(); | |
@Override | |
default Stage maxStage() { | |
return Stage.SENTENCIZED; | |
} | |
} | |
// | |
// 3.A.IV) WITH PARTS OF SPEECH | |
// | |
interface TaggedToken<P extends PartOfSpeech> extends Token { | |
P partOfSpeech(); // see section 1.A above | |
} | |
interface TaggedSentence<P extends PartOfSpeech> extends Sentence { | |
@Override | |
List<? extends TaggedToken<P>> tokens(); | |
@Override | |
default Stage stage() { | |
return Stage.TAGGED; | |
} | |
} | |
interface TaggedText<P extends PartOfSpeech> extends SentencizedText { | |
// some (or even all) sentences may remain untagged | |
Stream<? extends TaggedSentence<P>> taggedSentenceStream(); | |
@Override | |
default Stage maxStage() { | |
return Stage.TAGGED; | |
} | |
} | |
// | |
// 3.A.V) WITH SYNTAX | |
// | |
interface Constituent<C extends ConstituentType, P extends PartOfSpeech> { | |
Stream<? extends Constituent<C, P>> childStream(); | |
} | |
interface ConstituentBranch<C extends ConstituentType, P extends PartOfSpeech> extends Constituent<C, P> { | |
C type(); // see section 1.B above | |
} | |
interface ConstituentLeaf<C extends ConstituentType, P extends PartOfSpeech> extends Constituent<C, P> { | |
TaggedToken<P> token(); | |
@Override | |
default Stream<? extends Constituent<C, P>> childStream() { | |
return Stream.empty(); | |
} | |
} | |
interface Dependency<D extends DependencyType, P extends PartOfSpeech> { | |
D type(); // see section 1.C above | |
TaggedToken<P> governor(); | |
TaggedToken<P> dependent(); | |
} | |
interface SentenceSyntax<C extends ConstituentType, D extends DependencyType, P extends PartOfSpeech> { | |
ConstituentBranch<C, P> constituentTree(); | |
List<? extends Dependency<D, P>> dependencies(); | |
} | |
interface ParsedSentence<C extends ConstituentType, D extends DependencyType, P extends PartOfSpeech> extends TaggedSentence<P> { | |
SentenceSyntax<C, D, P> syntax(); | |
@Override | |
default Stage stage() { | |
return Stage.PARSED; | |
} | |
} | |
interface ParsedText<C extends ConstituentType, D extends DependencyType, P extends PartOfSpeech> extends TaggedText<P> { | |
// some (or even all) sentences may remain unparsed | |
Stream<? extends ParsedSentence<C, D, P>> parsedSentenceStream(); | |
@Override | |
default Stage maxStage() { | |
return Stage.PARSED; | |
} | |
} | |
/* *********************** | |
* 4) PRODUCERS OF THE API | |
*************************/ | |
interface TextProcessingRequest { // SIMPLIFICATION | |
Locale locale(); | |
String text(); | |
Stage targetStage(); | |
} | |
interface TextProcessor { | |
LocalizedText processText(TextProcessingRequest request); | |
} | |
/* *********************** | |
* 5) CONSUMERS OF THE API | |
*************************/ | |
/* | |
* 5.A) DIRECT CONSUMERS | |
*/ | |
class GermanPostpositionChecker { | |
void checkTaggedText(TaggedText<GermanPartOfSpeech> text) { | |
text.taggedSentenceStream().forEach(this::checkTaggedSentence); | |
} | |
private void checkTaggedSentence(TaggedSentence<GermanPartOfSpeech> sentence) { | |
sentence.tokens().stream() | |
.filter(this::isPostposition) | |
.forEach(this::checkPostposition); | |
} | |
private boolean isPostposition(TaggedToken<GermanPartOfSpeech> token) { | |
return token.partOfSpeech().isPostposition(); | |
} | |
private void checkPostposition(TaggedToken<GermanPartOfSpeech> token) { | |
// logic | |
} | |
} | |
class EnglishNominalSubjectChecker { | |
void checkNominalSubjects(ParsedText<?, EnglishDependencyType, EnglishPartOfSpeech> text) { | |
text.parsedSentenceStream().forEach(this::checkNominalSubjects); | |
} | |
private void checkNominalSubjects(ParsedSentence<?, EnglishDependencyType, EnglishPartOfSpeech> sentence) { | |
sentence.syntax().dependencies().stream() | |
.filter(this::isCertainTypeOfNominalSubjectDependency) | |
.forEach(this::checkNominalSubject); | |
} | |
private boolean isCertainTypeOfNominalSubjectDependency(Dependency<EnglishDependencyType, EnglishPartOfSpeech> dependency) { | |
return dependency.type() == EnglishDependencyType.NOMINAL_SUBJECT && true; // SIMPLIFICATION | |
} | |
private void checkNominalSubject(Dependency<EnglishDependencyType, EnglishPartOfSpeech> dependency) { | |
checkNominalGovernor(dependency.governor()); | |
checkNominalDependent(dependency.dependent()); | |
} | |
private void checkNominalGovernor(TaggedToken<EnglishPartOfSpeech> governor) { | |
if (checkGovernorPartOfSpeech(governor.partOfSpeech())) { | |
// logic | |
} | |
} | |
private void checkNominalDependent(TaggedToken<EnglishPartOfSpeech> dependent) { | |
if (checkDependentPartOfSpeech(dependent.partOfSpeech())) { | |
// logic | |
} | |
} | |
private boolean checkGovernorPartOfSpeech(EnglishPartOfSpeech partOfSpeech) { | |
return true; // SIMPLIFICATION | |
} | |
private boolean checkDependentPartOfSpeech(EnglishPartOfSpeech partOfSpeech) { | |
return true; // SIMPLIFICATION | |
} | |
} | |
class EnglishRelevantConstituentHandler { | |
void handleRelevantConstituents(ParsedText<EnglishConstituentType, ?, EnglishPartOfSpeech> text) { | |
text.parsedSentenceStream().forEach(this::handleRelevantConstiuents); | |
} | |
private void handleRelevantConstiuents(ParsedSentence<EnglishConstituentType, ?, EnglishPartOfSpeech> sentence) { | |
Constituents.flatConstituentStream(sentence.syntax().constituentTree()) | |
.filter(this::isRelevantConstituent) | |
.forEach(this::handleRelevantConstituent); | |
} | |
private boolean isRelevantConstituent(Constituent<EnglishConstituentType, EnglishPartOfSpeech> constituent) { | |
return true; // SIMPLIFICATION | |
} | |
private void handleRelevantConstituent(Constituent<EnglishConstituentType, EnglishPartOfSpeech> constituent) { | |
// logic | |
} | |
} | |
class Constituents { | |
/** | |
* Returns the constituent and all its descendants as a flattended Stream. | |
*/ | |
static <C extends ConstituentType, P extends PartOfSpeech> Stream<Constituent<C, P>> flatConstituentStream(Constituent<C, P> constituent) { | |
return Stream.concat( | |
Stream.of(constituent), | |
constituent.childStream().flatMap(Constituents::flatConstituentStream) | |
); | |
} | |
} | |
/* | |
* 5.B) INDIRECT CONSUMERS | |
*/ | |
interface ProcessedTextConsumer { // SIMPLIFICATION | |
Locale supportedLocale(); | |
Stage requiredStage(); | |
void consume(LocalizedText text); | |
} | |
class SampleUniversalTokenizedTextConsumer implements ProcessedTextConsumer { | |
@Override | |
public Locale supportedLocale() { | |
return Locale.ROOT; | |
} | |
@Override | |
public Stage requiredStage() { | |
return Stage.TOKENIZED; | |
} | |
@Override | |
public void consume(LocalizedText text) { | |
handleTokenizedText((TokenizedText) text); | |
} | |
private void handleTokenizedText(TokenizedText tokenizedText) { | |
// logic | |
} | |
} | |
class SampleGermanTaggedConsumer implements ProcessedTextConsumer { | |
@Override | |
public Locale supportedLocale() { | |
return Locale.GERMAN; | |
} | |
@Override | |
public Stage requiredStage() { | |
return Stage.TAGGED; | |
} | |
@Override | |
public void consume(LocalizedText text) { | |
// UNSAFE UNCHECKED CAST! | |
TaggedText<GermanPartOfSpeech> germanTaggedText = (TaggedText<GermanPartOfSpeech>) text; | |
new GermanPostpositionChecker().checkTaggedText(germanTaggedText); | |
} | |
} | |
class SampleEnglishParsedTextConsumer implements ProcessedTextConsumer { | |
@Override | |
public Locale supportedLocale() { | |
return Locale.ENGLISH; | |
} | |
@Override | |
public Stage requiredStage() { | |
return Stage.PARSED; | |
} | |
@Override | |
public void consume(LocalizedText text) { | |
// UNSAFE UNCHECKED CAST! | |
ParsedText<?, EnglishDependencyType, EnglishPartOfSpeech> englishParsedText | |
= (ParsedText<?, EnglishDependencyType, EnglishPartOfSpeech>) text; | |
new EnglishNominalSubjectChecker().checkNominalSubjects(englishParsedText); | |
} | |
} | |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> | |
<html> | |
<head> | |
<meta content="text/html; charset=ISO-8859-1" http-equiv="content-type"> | |
<title>File Compare</title> | |
<style type="text/css"> | |
#page { | |
font-family: sans-serif; | |
} | |
table { | |
border-collapse: collapse; | |
} | |
td { | |
white-space: nowrap; | |
font-family: monospace; | |
font-size: x-small; | |
vertical-align: top; | |
} | |
td.fileName { | |
background: #E6E6E6; | |
font-family: sans-serif; | |
font-size: small; | |
} | |
td.lineNumber { | |
text-align: right; | |
background: #FFC800; | |
} | |
td.added { | |
background: #BEF0BE; | |
} | |
td.removed { | |
background: #C8C8FF; | |
} | |
td.changed { | |
background: #FFC8C8; | |
} | |
td.equal { | |
background: #FFFFFF; | |
} | |
td.empty { | |
background: #F2F2F2; | |
} | |
</style> | |
<link rel="stylesheet" href="style.css" type="text/css"> | |
</head> | |
<body> | |
<table> | |
<tr> | |
<td colspan="2" class="filename">Parametrization-for-Z-Axis-Solution.java</td> | |
<td colspan="2" class="filename">Subtyping-for-Z-Axis-Solution.java</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">1</td><td class="equal">import java.util.List;</td><td class="lineNumber">1</td><td class="equal">import java.util.List;</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">2</td><td class="equal">import java.util.Locale;</td><td class="lineNumber">2</td><td class="equal">import java.util.Locale;</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">3</td><td class="equal">import java.util.stream.Stream;</td><td class="lineNumber">3</td><td class="equal">import java.util.stream.Stream;</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">4</td><td class="equal"></td><td class="lineNumber">4</td><td class="equal"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber">5</td><td class="equal">/* ****************************************</td><td class="lineNumber">5</td><td class="equal">/* ****************************************</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">6</td><td class="equal"> * 1) CORE LANGUAGE-SPECIFIC TYPES (AXIS Z)</td><td class="lineNumber">6</td><td class="equal"> * 1) CORE LANGUAGE-SPECIFIC TYPES (AXIS Z)</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">7</td><td class="equal"> ******************************************/</td><td class="lineNumber">7</td><td class="equal"> ******************************************/</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">8</td><td class="equal"></td><td class="lineNumber">8</td><td class="equal"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber">9</td><td class="equal">/*</td><td class="lineNumber">9</td><td class="equal">/*</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">10</td><td class="equal"> * 1.A) PART OF SPEECH</td><td class="lineNumber">10</td><td class="equal"> * 1.A) PART OF SPEECH</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">11</td><td class="equal"> * https://en.wikipedia.org/wiki/Part_of_speech</td><td class="lineNumber">11</td><td class="equal"> * https://en.wikipedia.org/wiki/Part_of_speech</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">12</td><td class="equal"> */</td><td class="lineNumber">12</td><td class="equal"> */</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">13</td><td class="equal"></td><td class="lineNumber">13</td><td class="equal"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber">14</td><td class="equal">//</td><td class="lineNumber">14</td><td class="equal">//</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">15</td><td class="equal">// 1.A.I) ENGLISH PART OF SPEECH</td><td class="lineNumber">15</td><td class="equal">// 1.A.I) ENGLISH PART OF SPEECH</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">16</td><td class="equal">//</td><td class="lineNumber">16</td><td class="equal">//</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">17</td><td class="equal"></td><td class="lineNumber">17</td><td class="equal"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber">18</td><td class="equal">/**</td><td class="lineNumber">18</td><td class="equal">/**</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">19</td><td class="equal"> * Implementing classes consist of one or more part-of-speech tags (each tag provided by a different tagger).</td><td class="lineNumber">19</td><td class="equal"> * Implementing classes consist of one or more part-of-speech tags (each tag provided by a different tagger).</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">20</td><td class="equal"> */</td><td class="lineNumber">20</td><td class="equal"> */</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">21</td><td class="equal">interface PartOfSpeech {</td><td class="lineNumber">21</td><td class="equal">interface PartOfSpeech {</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">22</td><td class="equal">}</td><td class="lineNumber">22</td><td class="equal">}</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">23</td><td class="equal"></td><td class="lineNumber">23</td><td class="equal"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber">24</td><td class="equal">class EnglishPartOfSpeech implements PartOfSpeech {</td><td class="lineNumber">24</td><td class="equal">class EnglishPartOfSpeech implements PartOfSpeech {</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">25</td><td class="equal"> private final Type1EnglishTag type1Tag = Type1EnglishTag.TO; // SIMPLIFICATION</td><td class="lineNumber">25</td><td class="equal"> private final Type1EnglishTag type1Tag = Type1EnglishTag.TO; // SIMPLIFICATION</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">26</td><td class="equal"> private final Type2EnglishTag type2Tag = Type2EnglishTag.GENERAL_PREPOSITION; // SIMPLIFICATION</td><td class="lineNumber">26</td><td class="equal"> private final Type2EnglishTag type2Tag = Type2EnglishTag.GENERAL_PREPOSITION; // SIMPLIFICATION</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">27</td><td class="equal"></td><td class="lineNumber">27</td><td class="equal"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber">28</td><td class="equal"> boolean isInfinitiveMarker() {</td><td class="lineNumber">28</td><td class="equal"> boolean isInfinitiveMarker() {</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">29</td><td class="equal"> return type1Tag == Type1EnglishTag.TO && type2Tag == Type2EnglishTag.INFINITIVE_MARKER;</td><td class="lineNumber">29</td><td class="equal"> return type1Tag == Type1EnglishTag.TO && type2Tag == Type2EnglishTag.INFINITIVE_MARKER;</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">30</td><td class="equal"> }</td><td class="lineNumber">30</td><td class="equal"> }</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">31</td><td class="equal">}</td><td class="lineNumber">31</td><td class="equal">}</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">32</td><td class="equal"></td><td class="lineNumber">32</td><td class="equal"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber">33</td><td class="equal">enum Type1EnglishTag {</td><td class="lineNumber">33</td><td class="equal">enum Type1EnglishTag {</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">34</td><td class="equal"> // SIMPLIFICATION (partial content)</td><td class="lineNumber">34</td><td class="equal"> // SIMPLIFICATION (partial content)</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">35</td><td class="equal"> TO // "to" as a preposition or an infinitive marker</td><td class="lineNumber">35</td><td class="equal"> TO // "to" as a preposition or an infinitive marker</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">36</td><td class="equal">}</td><td class="lineNumber">36</td><td class="equal">}</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">37</td><td class="equal"></td><td class="lineNumber">37</td><td class="equal"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber">38</td><td class="equal">enum Type2EnglishTag {</td><td class="lineNumber">38</td><td class="equal">enum Type2EnglishTag {</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">39</td><td class="equal"> // SIMPLIFICATION (partial content)</td><td class="lineNumber">39</td><td class="equal"> // SIMPLIFICATION (partial content)</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">40</td><td class="equal"> GENERAL_PREPOSITION, // e.g. "to" in "I said to him that..."</td><td class="lineNumber">40</td><td class="equal"> GENERAL_PREPOSITION, // e.g. "to" in "I said to him that..."</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">41</td><td class="equal"> INFINITIVE_MARKER // "to", e.g. in "I want to ask."</td><td class="lineNumber">41</td><td class="equal"> INFINITIVE_MARKER // "to", e.g. in "I want to ask."</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">42</td><td class="equal">}</td><td class="lineNumber">42</td><td class="equal">}</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">43</td><td class="equal"></td><td class="lineNumber">43</td><td class="equal"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber">44</td><td class="equal">//</td><td class="lineNumber">44</td><td class="equal">//</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">45</td><td class="equal">// 1.A.II) GERMAN PART OF SPEECH</td><td class="lineNumber">45</td><td class="equal">// 1.A.II) GERMAN PART OF SPEECH</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">46</td><td class="equal">//</td><td class="lineNumber">46</td><td class="equal">//</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">47</td><td class="equal"></td><td class="lineNumber">47</td><td class="equal"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber">48</td><td class="equal">class GermanPartOfSpeech implements PartOfSpeech {</td><td class="lineNumber">48</td><td class="equal">class GermanPartOfSpeech implements PartOfSpeech {</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">49</td><td class="equal"> private final Type1GermanTag type1Tag = Type1GermanTag.POSTPOSITION; // SIMPLIFICATION</td><td class="lineNumber">49</td><td class="equal"> private final Type1GermanTag type1Tag = Type1GermanTag.POSTPOSITION; // SIMPLIFICATION</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">50</td><td class="equal"></td><td class="lineNumber">50</td><td class="equal"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber">51</td><td class="equal"> boolean isPostposition() {</td><td class="lineNumber">51</td><td class="equal"> boolean isPostposition() {</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">52</td><td class="equal"> return type1Tag == Type1GermanTag.POSTPOSITION;</td><td class="lineNumber">52</td><td class="equal"> return type1Tag == Type1GermanTag.POSTPOSITION;</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">53</td><td class="equal"> }</td><td class="lineNumber">53</td><td class="equal"> }</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">54</td><td class="equal">}</td><td class="lineNumber">54</td><td class="equal">}</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">55</td><td class="equal"></td><td class="lineNumber">55</td><td class="equal"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber">56</td><td class="equal">enum Type1GermanTag {</td><td class="lineNumber">56</td><td class="equal">enum Type1GermanTag {</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">57</td><td class="equal"> // SIMPLIFICATION (partial content)</td><td class="lineNumber">57</td><td class="equal"> // SIMPLIFICATION (partial content)</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">58</td><td class="equal"> POSTPOSITION, // e.g. "zufolge"</td><td class="lineNumber">58</td><td class="equal"> POSTPOSITION, // e.g. "zufolge"</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">59</td><td class="equal">}</td><td class="lineNumber">59</td><td class="equal">}</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">60</td><td class="equal"></td><td class="lineNumber">60</td><td class="equal"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber">61</td><td class="equal">/*</td><td class="lineNumber">61</td><td class="equal">/*</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">62</td><td class="equal"> * 1.B) CONSTITUENT</td><td class="lineNumber">62</td><td class="equal"> * 1.B) CONSTITUENT</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">63</td><td class="equal"> * https://en.wikipedia.org/wiki/Phrase_structure_grammar</td><td class="lineNumber">63</td><td class="equal"> * https://en.wikipedia.org/wiki/Phrase_structure_grammar</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">64</td><td class="equal"> */</td><td class="lineNumber">64</td><td class="equal"> */</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">65</td><td class="equal">interface ConstituentType {</td><td class="lineNumber">65</td><td class="equal">interface ConstituentType {</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">66</td><td class="equal">}</td><td class="lineNumber">66</td><td class="equal">}</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">67</td><td class="equal"></td><td class="lineNumber">67</td><td class="equal"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber">68</td><td class="equal">enum EnglishConstituentType implements ConstituentType {</td><td class="lineNumber">68</td><td class="equal">enum EnglishConstituentType implements ConstituentType {</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">69</td><td class="equal"> // SIMPLIFICATION (partial content)</td><td class="lineNumber">69</td><td class="equal"> // SIMPLIFICATION (partial content)</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">70</td><td class="equal"> VERB_PHRASE, // e.g. "is doing nice"</td><td class="lineNumber">70</td><td class="equal"> VERB_PHRASE, // e.g. "is doing nice"</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">71</td><td class="equal"> WH_WORD_NOUN_PHRASE // e.g. "whose daughter"</td><td class="lineNumber">71</td><td class="equal"> WH_WORD_NOUN_PHRASE // e.g. "whose daughter"</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">72</td><td class="equal">}</td><td class="lineNumber">72</td><td class="equal">}</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">73</td><td class="equal"></td><td class="lineNumber">73</td><td class="equal"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber">74</td><td class="equal">// enum GermanConstituentType missing as of yet</td><td class="lineNumber">74</td><td class="equal">// enum GermanConstituentType missing as of yet</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">75</td><td class="equal"></td><td class="lineNumber">75</td><td class="equal"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber">76</td><td class="equal">/*</td><td class="lineNumber">76</td><td class="equal">/*</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">77</td><td class="equal"> * 1.C) DEPENDENCY</td><td class="lineNumber">77</td><td class="equal"> * 1.C) DEPENDENCY</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">78</td><td class="equal"> * https://en.wikipedia.org/wiki/Dependency_grammar</td><td class="lineNumber">78</td><td class="equal"> * https://en.wikipedia.org/wiki/Dependency_grammar</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">79</td><td class="equal"> */</td><td class="lineNumber">79</td><td class="equal"> */</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">80</td><td class="equal">interface DependencyType {</td><td class="lineNumber">80</td><td class="equal">interface DependencyType {</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">81</td><td class="equal">}</td><td class="lineNumber">81</td><td class="equal">}</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">82</td><td class="equal"></td><td class="lineNumber">82</td><td class="equal"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber">83</td><td class="equal">enum EnglishDependencyType implements DependencyType {</td><td class="lineNumber">83</td><td class="equal">enum EnglishDependencyType implements DependencyType {</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">84</td><td class="equal"> // SIMPLIFICATION (partial content)</td><td class="lineNumber">84</td><td class="equal"> // SIMPLIFICATION (partial content)</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">85</td><td class="equal"> NOMINAL_SUBJECT, // e.g. "he" <- "walks" in "He walks."</td><td class="lineNumber">85</td><td class="equal"> NOMINAL_SUBJECT, // e.g. "he" <- "walks" in "He walks."</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">86</td><td class="equal"> PHRASAL_VERB_PARTICLE // e.g. "shut" -> "down" in "It was shut down."</td><td class="lineNumber">86</td><td class="equal"> PHRASAL_VERB_PARTICLE // e.g. "shut" -> "down" in "It was shut down."</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">87</td><td class="equal">}</td><td class="lineNumber">87</td><td class="equal">}</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">88</td><td class="equal"></td><td class="lineNumber">88</td><td class="equal"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber">89</td><td class="equal">// enum GermanDependencyType missing as of yet</td><td class="lineNumber">89</td><td class="equal">// enum GermanDependencyType missing as of yet</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">90</td><td class="equal"></td><td class="lineNumber">90</td><td class="equal"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber">91</td><td class="equal">/* ***************</td><td class="lineNumber">91</td><td class="equal">/* ***************</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">92</td><td class="equal"> * 2) HELPER TYPES</td><td class="lineNumber">92</td><td class="equal"> * 2) HELPER TYPES</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">93</td><td class="equal"> *****************/</td><td class="lineNumber">93</td><td class="equal"> *****************/</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">94</td><td class="equal">interface TextualRange {</td><td class="lineNumber">94</td><td class="equal">interface TextualRange {</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">95</td><td class="equal"> String text();</td><td class="lineNumber">95</td><td class="equal"> String text();</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">96</td><td class="equal"></td><td class="lineNumber">96</td><td class="equal"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber">97</td><td class="equal"> int startOffset(); // inclusive</td><td class="lineNumber">97</td><td class="equal"> int startOffset(); // inclusive</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">98</td><td class="equal"></td><td class="lineNumber">98</td><td class="equal"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber">99</td><td class="equal"> int endOffset(); // exclusive</td><td class="lineNumber">99</td><td class="equal"> int endOffset(); // exclusive</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">100</td><td class="equal">}</td><td class="lineNumber">100</td><td class="equal">}</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">101</td><td class="equal"></td><td class="lineNumber">101</td><td class="equal"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber">102</td><td class="equal">interface Seq {</td><td class="lineNumber">102</td><td class="equal">interface Seq {</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">103</td><td class="equal"></td><td class="lineNumber">103</td><td class="equal"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber">104</td><td class="equal"> /**</td><td class="lineNumber">104</td><td class="equal"> /**</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">105</td><td class="equal"> * Stub for <a href="https://www.jooq.org/products/jOOλ/javadoc/0.9.12/org/jooq/lambda/Seq.html#ofType-java.util.str<br>eam.Stream-java.lang.Class-">Seq.ofType()</a>.</td><td class="lineNumber">105</td><td class="equal"> * Stub for <a href="https://www.jooq.org/products/jOOλ/javadoc/0.9.12/org/jooq/lambda/Seq.html#ofType-java.util.str<br>eam.Stream-java.lang.Class-">Seq.ofType()</a>.</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">106</td><td class="equal"> */</td><td class="lineNumber">106</td><td class="equal"> */</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">107</td><td class="equal"> @SuppressWarnings("unchecked")</td><td class="lineNumber">107</td><td class="equal"> @SuppressWarnings("unchecked")</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">108</td><td class="equal"> static <T, U> Stream<U> ofType(Stream<? extends T> stream, Class<? extends U> type) {</td><td class="lineNumber">108</td><td class="equal"> static <T, U> Stream<U> ofType(Stream<? extends T> stream, Class<? extends U> type) {</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">109</td><td class="equal"> return stream.filter(type::isInstance).map(t -> (U) t);</td><td class="lineNumber">109</td><td class="equal"> return stream.filter(type::isInstance).map(t -> (U) t);</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">110</td><td class="equal"> }</td><td class="lineNumber">110</td><td class="equal"> }</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">111</td><td class="equal">}</td><td class="lineNumber">111</td><td class="equal">}</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">112</td><td class="equal"></td><td class="lineNumber">112</td><td class="equal"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber">113</td><td class="equal">/**</td><td class="lineNumber">113</td><td class="equal">/**</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">114</td><td class="equal"> * Defines the stage of text processing (AXIS Y).</td><td class="lineNumber">114</td><td class="equal"> * Defines the stage of text processing (AXIS Y).</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">115</td><td class="equal"> */</td><td class="lineNumber">115</td><td class="equal"> */</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">116</td><td class="equal">enum Stage {</td><td class="lineNumber">116</td><td class="equal">enum Stage {</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">117</td><td class="equal"> UNPROCESSED,</td><td class="lineNumber">117</td><td class="equal"> UNPROCESSED,</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">118</td><td class="equal"> TOKENIZED, // tokens present</td><td class="lineNumber">118</td><td class="equal"> TOKENIZED, // tokens present</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">119</td><td class="equal"> SENTENCIZED, // sentences present</td><td class="lineNumber">119</td><td class="equal"> SENTENCIZED, // sentences present</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">120</td><td class="equal"> TAGGED, // parts of speech present</td><td class="lineNumber">120</td><td class="equal"> TAGGED, // parts of speech present</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">121</td><td class="equal"> PARSED // syntax present</td><td class="lineNumber">121</td><td class="equal"> PARSED // syntax present</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">122</td><td class="equal">}</td><td class="lineNumber">122</td><td class="equal">}</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">123</td><td class="equal"></td><td class="lineNumber">123</td><td class="equal"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber">124</td><td class="equal">/* ***************************</td><td class="lineNumber">124</td><td class="equal">/* ***************************</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">125</td><td class="equal"> * 3) SOLUTION USING SUBTYPING</td><td class="lineNumber">125</td><td class="equal"> * 3) SOLUTION USING SUBTYPING</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">126</td><td class="equal"> *****************************/</td><td class="lineNumber">126</td><td class="equal"> *****************************/</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">127</td><td class="equal"></td><td class="lineNumber">127</td><td class="equal"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber">128</td><td class="equal">/*</td><td class="lineNumber">128</td><td class="equal">/*</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">129</td><td class="equal"> * 3.A) GENERIC HIERARCHY (AXIS Y OVER X)</td><td class="lineNumber">129</td><td class="equal"> * 3.A) GENERIC HIERARCHY (AXIS Y OVER X)</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">130</td><td class="equal"> */</td><td class="lineNumber">130</td><td class="equal"> */</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">131</td><td class="equal"></td><td class="lineNumber">131</td><td class="equal"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber">132</td><td class="equal">//</td><td class="lineNumber">132</td><td class="equal">//</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">133</td><td class="equal">// 3.A.I) UNPROCESSED</td><td class="lineNumber">133</td><td class="equal">// 3.A.I) UNPROCESSED</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">134</td><td class="equal">//</td><td class="lineNumber">134</td><td class="equal">//</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">135</td><td class="equal">interface LocalizedText extends TextualRange {</td><td class="lineNumber">135</td><td class="equal">interface LocalizedText extends TextualRange {</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">136</td><td class="equal"> Locale locale();</td><td class="lineNumber">136</td><td class="equal"> Locale locale();</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">137</td><td class="equal"></td><td class="lineNumber">137</td><td class="equal"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber">138</td><td class="equal"> default Stage maxStage() {</td><td class="lineNumber">138</td><td class="equal"> default Stage maxStage() {</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">139</td><td class="equal"> return Stage.UNPROCESSED;</td><td class="lineNumber">139</td><td class="equal"> return Stage.UNPROCESSED;</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">140</td><td class="equal"> }</td><td class="lineNumber">140</td><td class="equal"> }</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">141</td><td class="equal">}</td><td class="lineNumber">141</td><td class="equal">}</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">142</td><td class="equal"></td><td class="lineNumber">142</td><td class="equal"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber">143</td><td class="equal">//</td><td class="lineNumber">143</td><td class="equal">//</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">144</td><td class="equal">// 3.A.II) WITH TOKENS</td><td class="lineNumber">144</td><td class="equal">// 3.A.II) WITH TOKENS</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">145</td><td class="equal">//</td><td class="lineNumber">145</td><td class="equal">//</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">146</td><td class="equal">enum TokenType {</td><td class="lineNumber">146</td><td class="equal">enum TokenType {</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">147</td><td class="equal"> WORD, NUMERIC // SIMPLIFICATION</td><td class="lineNumber">147</td><td class="equal"> WORD, NUMERIC // SIMPLIFICATION</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">148</td><td class="equal">}</td><td class="lineNumber">148</td><td class="equal">}</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">149</td><td class="equal"></td><td class="lineNumber">149</td><td class="equal"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber">150</td><td class="equal">interface Token extends TextualRange {</td><td class="lineNumber">150</td><td class="equal">interface Token extends TextualRange {</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">151</td><td class="equal"> TokenType tokenType();</td><td class="lineNumber">151</td><td class="equal"> TokenType tokenType();</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">152</td><td class="equal">}</td><td class="lineNumber">152</td><td class="equal">}</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">153</td><td class="equal"></td><td class="lineNumber">153</td><td class="equal"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber">154</td><td class="equal">interface TokenizedText extends LocalizedText {</td><td class="lineNumber">154</td><td class="equal">interface TokenizedText extends LocalizedText {</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">155</td><td class="equal"> Stream<? extends Token> tokenStream();</td><td class="lineNumber">155</td><td class="equal"> Stream<? extends Token> tokenStream();</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">156</td><td class="equal"></td><td class="lineNumber">156</td><td class="equal"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber">157</td><td class="equal"> int tokenCount();</td><td class="lineNumber">157</td><td class="equal"> int tokenCount();</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">158</td><td class="equal"></td><td class="lineNumber">158</td><td class="equal"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber">159</td><td class="equal"> @Override</td><td class="lineNumber">159</td><td class="equal"> @Override</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">160</td><td class="equal"> default Stage maxStage() {</td><td class="lineNumber">160</td><td class="equal"> default Stage maxStage() {</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">161</td><td class="equal"> return Stage.TOKENIZED;</td><td class="lineNumber">161</td><td class="equal"> return Stage.TOKENIZED;</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">162</td><td class="equal"> }</td><td class="lineNumber">162</td><td class="equal"> }</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">163</td><td class="equal">}</td><td class="lineNumber">163</td><td class="equal">}</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">164</td><td class="equal"></td><td class="lineNumber">164</td><td class="equal"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber">165</td><td class="equal">//</td><td class="lineNumber">165</td><td class="equal">//</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">166</td><td class="equal">// 3.A.III) WITH SENTENCES</td><td class="lineNumber">166</td><td class="equal">// 3.A.III) WITH SENTENCES</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">167</td><td class="equal">//</td><td class="lineNumber">167</td><td class="equal">//</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">168</td><td class="equal">interface Sentence extends TextualRange {</td><td class="lineNumber">168</td><td class="equal">interface Sentence extends TextualRange {</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">169</td><td class="equal"> List<? extends Token> tokens();</td><td class="lineNumber">169</td><td class="equal"> List<? extends Token> tokens();</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">170</td><td class="equal"></td><td class="lineNumber">170</td><td class="equal"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber">171</td><td class="equal"> default Stage stage() {</td><td class="lineNumber">171</td><td class="equal"> default Stage stage() {</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">172</td><td class="equal"> return Stage.SENTENCIZED;</td><td class="lineNumber">172</td><td class="equal"> return Stage.SENTENCIZED;</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">173</td><td class="equal"> }</td><td class="lineNumber">173</td><td class="equal"> }</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">174</td><td class="equal">}</td><td class="lineNumber">174</td><td class="equal">}</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">175</td><td class="equal"></td><td class="lineNumber">175</td><td class="equal"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber">176</td><td class="equal">interface SentencizedText extends TokenizedText {</td><td class="lineNumber">176</td><td class="equal">interface SentencizedText extends TokenizedText {</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">177</td><td class="equal"> List<? extends Sentence> sentences();</td><td class="lineNumber">177</td><td class="equal"> List<? extends Sentence> sentences();</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">178</td><td class="equal"></td><td class="lineNumber">178</td><td class="equal"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber">179</td><td class="equal"> @Override</td><td class="lineNumber">179</td><td class="equal"> @Override</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">180</td><td class="equal"> default Stage maxStage() {</td><td class="lineNumber">180</td><td class="equal"> default Stage maxStage() {</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">181</td><td class="equal"> return Stage.SENTENCIZED;</td><td class="lineNumber">181</td><td class="equal"> return Stage.SENTENCIZED;</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">182</td><td class="equal"> }</td><td class="lineNumber">182</td><td class="equal"> }</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">183</td><td class="equal">}</td><td class="lineNumber">183</td><td class="equal">}</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">184</td><td class="equal"></td><td class="lineNumber">184</td><td class="equal"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber">185</td><td class="equal">//</td><td class="lineNumber">185</td><td class="equal">//</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">186</td><td class="equal">// 3.A.IV) WITH PARTS OF SPEECH</td><td class="lineNumber">186</td><td class="equal">// 3.A.IV) WITH PARTS OF SPEECH</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">187</td><td class="equal">//</td><td class="lineNumber">187</td><td class="equal">//</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">188</td><td class="changed">interface TaggedToken<P extends PartOfSpeech> extends Token {</td><td class="lineNumber">188</td><td class="changed">interface TaggedToken extends Token {</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">189</td><td class="changed"> P partOfSpeech(); // see section 1.A above</td><td class="lineNumber">189</td><td class="changed"> PartOfSpeech partOfSpeech(); // see section 1.A above</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">190</td><td class="equal">}</td><td class="lineNumber">190</td><td class="equal">}</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">191</td><td class="equal"></td><td class="lineNumber">191</td><td class="equal"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber">192</td><td class="changed">interface TaggedSentence<P extends PartOfSpeech> extends Sentence {</td><td class="lineNumber">192</td><td class="changed">interface TaggedSentence extends Sentence {</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">193</td><td class="equal"> @Override</td><td class="lineNumber">193</td><td class="equal"> @Override</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">194</td><td class="changed"> List<? extends TaggedToken<P>> tokens();</td><td class="lineNumber">194</td><td class="changed"> List<? extends TaggedToken> tokens();</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">195</td><td class="equal"></td><td class="lineNumber">195</td><td class="equal"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber">196</td><td class="equal"> @Override</td><td class="lineNumber">196</td><td class="equal"> @Override</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">197</td><td class="equal"> default Stage stage() {</td><td class="lineNumber">197</td><td class="equal"> default Stage stage() {</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">198</td><td class="equal"> return Stage.TAGGED;</td><td class="lineNumber">198</td><td class="equal"> return Stage.TAGGED;</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">199</td><td class="equal"> }</td><td class="lineNumber">199</td><td class="equal"> }</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">200</td><td class="equal">}</td><td class="lineNumber">200</td><td class="equal">}</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">201</td><td class="equal"></td><td class="lineNumber">201</td><td class="equal"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber">202</td><td class="changed">interface TaggedText<P extends PartOfSpeech> extends SentencizedText {</td><td class="lineNumber">202</td><td class="changed">interface TaggedText extends SentencizedText {</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">203</td><td class="equal"> // some (or even all) sentences may remain untagged</td><td class="lineNumber">203</td><td class="equal"> // some (or even all) sentences may remain untagged</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">204</td><td class="changed"> Stream<? extends TaggedSentence<P>> taggedSentenceStream();</td><td class="lineNumber">204</td><td class="changed"> Stream<? extends TaggedSentence> taggedSentenceStream();</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">205</td><td class="equal"></td><td class="lineNumber">205</td><td class="equal"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber">206</td><td class="equal"> @Override</td><td class="lineNumber">206</td><td class="equal"> @Override</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">207</td><td class="equal"> default Stage maxStage() {</td><td class="lineNumber">207</td><td class="equal"> default Stage maxStage() {</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">208</td><td class="equal"> return Stage.TAGGED;</td><td class="lineNumber">208</td><td class="equal"> return Stage.TAGGED;</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">209</td><td class="equal"> }</td><td class="lineNumber">209</td><td class="equal"> }</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">210</td><td class="equal">}</td><td class="lineNumber">210</td><td class="equal">}</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">211</td><td class="equal"></td><td class="lineNumber">211</td><td class="equal"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber">212</td><td class="equal">//</td><td class="lineNumber">212</td><td class="equal">//</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">213</td><td class="equal">// 3.A.V) WITH SYNTAX</td><td class="lineNumber">213</td><td class="equal">// 3.A.V) WITH SYNTAX</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">214</td><td class="equal">//</td><td class="lineNumber">214</td><td class="equal">//</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">215</td><td class="changed">interface Constituent<C extends ConstituentType, P extends PartOfSpeech> {</td><td class="lineNumber">215</td><td class="changed">interface Constituent {</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">216</td><td class="changed"> Stream<? extends Constituent<C, P>> childStream();</td><td class="lineNumber">216</td><td class="changed"> Stream<? extends Constituent> childStream();</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">217</td><td class="equal">}</td><td class="lineNumber">217</td><td class="equal">}</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">218</td><td class="equal"></td><td class="lineNumber">218</td><td class="equal"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber">219</td><td class="changed">interface ConstituentBranch<C extends ConstituentType, P extends PartOfSpeech> extends Constituent<C, P> {</td><td class="lineNumber">219</td><td class="changed">interface ConstituentBranch extends Constituent {</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">220</td><td class="changed"> C type(); // see section 1.B above</td><td class="lineNumber">220</td><td class="changed"> ConstituentType type(); // see section 1.B above</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">221</td><td class="equal">}</td><td class="lineNumber">221</td><td class="equal">}</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">222</td><td class="equal"></td><td class="lineNumber">222</td><td class="equal"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber">223</td><td class="changed">interface ConstituentLeaf<C extends ConstituentType, P extends PartOfSpeech> extends Constituent<C, P> {</td><td class="lineNumber">223</td><td class="changed">interface ConstituentLeaf extends Constituent {</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">224</td><td class="changed"> TaggedToken<P> token();</td><td class="lineNumber">224</td><td class="changed"> TaggedToken token();</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">225</td><td class="equal"></td><td class="lineNumber">225</td><td class="equal"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber">226</td><td class="equal"> @Override</td><td class="lineNumber">226</td><td class="equal"> @Override</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">227</td><td class="changed"> default Stream<? extends Constituent<C, P>> childStream() {</td><td class="lineNumber">227</td><td class="changed"> default Stream<? extends Constituent> childStream() {</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">228</td><td class="equal"> return Stream.empty();</td><td class="lineNumber">228</td><td class="equal"> return Stream.empty();</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">229</td><td class="equal"> }</td><td class="lineNumber">229</td><td class="equal"> }</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">230</td><td class="equal">}</td><td class="lineNumber">230</td><td class="equal">}</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">231</td><td class="equal"></td><td class="lineNumber">231</td><td class="equal"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber">232</td><td class="changed">interface Dependency<D extends DependencyType, P extends PartOfSpeech> {</td><td class="lineNumber">232</td><td class="changed">interface Dependency {</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">233</td><td class="changed"> D type(); // see section 1.C above</td><td class="lineNumber">233</td><td class="changed"> DependencyType type(); // see section 1.C above</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">234</td><td class="changed"></td><td class="lineNumber">234</td><td class="changed"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber">235</td><td class="changed"> TaggedToken<P> governor();</td><td class="lineNumber">235</td><td class="changed"> TaggedToken governor();</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">236</td><td class="changed"></td><td class="lineNumber">236</td><td class="changed"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber">237</td><td class="changed"> TaggedToken<P> dependent();</td><td class="lineNumber">237</td><td class="changed"> TaggedToken dependent();</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">238</td><td class="equal">}</td><td class="lineNumber">238</td><td class="equal">}</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">239</td><td class="equal"></td><td class="lineNumber">239</td><td class="equal"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber">240</td><td class="changed">interface SentenceSyntax<C extends ConstituentType, D extends DependencyType, P extends PartOfSpeech> {</td><td class="lineNumber">240</td><td class="changed">interface SentenceSyntax {</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">241</td><td class="changed"> ConstituentBranch<C, P> constituentTree();</td><td class="lineNumber">241</td><td class="changed"> ConstituentBranch constituentTree();</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">242</td><td class="changed"></td><td class="lineNumber">242</td><td class="changed"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber">243</td><td class="changed"> List<? extends Dependency<D, P>> dependencies();</td><td class="lineNumber">243</td><td class="changed"> List<? extends Dependency> dependencies();</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">244</td><td class="equal">}</td><td class="lineNumber">244</td><td class="equal">}</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">245</td><td class="equal"></td><td class="lineNumber">245</td><td class="equal"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber">246</td><td class="changed">interface ParsedSentence<C extends ConstituentType, D extends DependencyType, P extends PartOfSpeech> extends TaggedSent<br>ence<P> {</td><td class="lineNumber">246</td><td class="changed">interface ParsedSentence extends TaggedSentence {</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">247</td><td class="changed"> SentenceSyntax<C, D, P> syntax();</td><td class="lineNumber">247</td><td class="changed"> SentenceSyntax syntax();</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">248</td><td class="equal"></td><td class="lineNumber">248</td><td class="equal"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber">249</td><td class="equal"> @Override</td><td class="lineNumber">249</td><td class="equal"> @Override</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">250</td><td class="equal"> default Stage stage() {</td><td class="lineNumber">250</td><td class="equal"> default Stage stage() {</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">251</td><td class="equal"> return Stage.PARSED;</td><td class="lineNumber">251</td><td class="equal"> return Stage.PARSED;</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">252</td><td class="equal"> }</td><td class="lineNumber">252</td><td class="equal"> }</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">253</td><td class="equal">}</td><td class="lineNumber">253</td><td class="equal">}</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">254</td><td class="equal"></td><td class="lineNumber">254</td><td class="equal"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber">255</td><td class="changed">interface ParsedText<C extends ConstituentType, D extends DependencyType, P extends PartOfSpeech> extends TaggedText<P> <br>{</td><td class="lineNumber">255</td><td class="changed">interface ParsedText extends TaggedText {</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">256</td><td class="equal"> // some (or even all) sentences may remain unparsed</td><td class="lineNumber">256</td><td class="equal"> // some (or even all) sentences may remain unparsed</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">257</td><td class="changed"> Stream<? extends ParsedSentence<C, D, P>> parsedSentenceStream();</td><td class="lineNumber">257</td><td class="changed"> Stream<? extends ParsedSentence> parsedSentenceStream();</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">258</td><td class="equal"></td><td class="lineNumber">258</td><td class="equal"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber">259</td><td class="equal"> @Override</td><td class="lineNumber">259</td><td class="equal"> @Override</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">260</td><td class="equal"> default Stage maxStage() {</td><td class="lineNumber">260</td><td class="equal"> default Stage maxStage() {</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">261</td><td class="equal"> return Stage.PARSED;</td><td class="lineNumber">261</td><td class="equal"> return Stage.PARSED;</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">262</td><td class="equal"> }</td><td class="lineNumber">262</td><td class="equal"> }</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">263</td><td class="equal">}</td><td class="lineNumber">263</td><td class="equal">}</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">264</td><td class="equal"></td><td class="lineNumber">264</td><td class="equal"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">265</td><td class="added">/*</td> | |
</tr> | |
<tr> | |
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">266</td><td class="added"> * 3.B) LANGUAGE-SPECIFIC HIERARCHY (AXIS Z OVER Y OVER X)</td> | |
</tr> | |
<tr> | |
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">267</td><td class="added"> */</td> | |
</tr> | |
<tr> | |
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">268</td><td class="added"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">269</td><td class="added">//</td> | |
</tr> | |
<tr> | |
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">270</td><td class="added">// 3.B.I) ENGLISH</td> | |
</tr> | |
<tr> | |
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">271</td><td class="added">//</td> | |
</tr> | |
<tr> | |
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">272</td><td class="added"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">273</td><td class="added">// 3.B.I.a) ENGLISH PARTS OF SPEECH</td> | |
</tr> | |
<tr> | |
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">274</td><td class="added">interface EnglishTaggedToken extends TaggedToken {</td> | |
</tr> | |
<tr> | |
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">275</td><td class="added"> @Override</td> | |
</tr> | |
<tr> | |
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">276</td><td class="added"> EnglishPartOfSpeech partOfSpeech();</td> | |
</tr> | |
<tr> | |
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">277</td><td class="added">}</td> | |
</tr> | |
<tr> | |
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">278</td><td class="added"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">279</td><td class="added">interface EnglishTaggedSentence extends TaggedSentence {</td> | |
</tr> | |
<tr> | |
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">280</td><td class="added"> @Override</td> | |
</tr> | |
<tr> | |
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">281</td><td class="added"> List<? extends EnglishTaggedToken> tokens();</td> | |
</tr> | |
<tr> | |
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">282</td><td class="added">}</td> | |
</tr> | |
<tr> | |
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">283</td><td class="added"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">284</td><td class="added">interface EnglishTaggedText extends TaggedText {</td> | |
</tr> | |
<tr> | |
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">285</td><td class="added"> @Override // some (or even all) sentences may remain untagged</td> | |
</tr> | |
<tr> | |
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">286</td><td class="added"> default Stream<? extends EnglishTaggedSentence> taggedSentenceStream() {</td> | |
</tr> | |
<tr> | |
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">287</td><td class="added"> return Seq.ofType(sentences().stream(), EnglishTaggedSentence.class);</td> | |
</tr> | |
<tr> | |
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">288</td><td class="added"> }</td> | |
</tr> | |
<tr> | |
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">289</td><td class="added">}</td> | |
</tr> | |
<tr> | |
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">290</td><td class="added"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">291</td><td class="added">// 3.B.I.b) ENGLISH SYNTAX</td> | |
</tr> | |
<tr> | |
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">292</td><td class="added">interface EnglishConstituent extends Constituent {</td> | |
</tr> | |
<tr> | |
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">293</td><td class="added"> @Override</td> | |
</tr> | |
<tr> | |
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">294</td><td class="added"> Stream<? extends EnglishConstituent> childStream();</td> | |
</tr> | |
<tr> | |
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">295</td><td class="added">}</td> | |
</tr> | |
<tr> | |
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">296</td><td class="added"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">297</td><td class="added">interface EnglishConstituentBranch extends EnglishConstituent, ConstituentBranch {</td> | |
</tr> | |
<tr> | |
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">298</td><td class="added"> @Override</td> | |
</tr> | |
<tr> | |
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">299</td><td class="added"> EnglishConstituentType type();</td> | |
</tr> | |
<tr> | |
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">300</td><td class="added">}</td> | |
</tr> | |
<tr> | |
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">301</td><td class="added"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">302</td><td class="added">interface EnglishConstituentLeaf extends EnglishConstituent, ConstituentLeaf {</td> | |
</tr> | |
<tr> | |
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">303</td><td class="added"> @Override</td> | |
</tr> | |
<tr> | |
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">304</td><td class="added"> EnglishTaggedToken token();</td> | |
</tr> | |
<tr> | |
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">305</td><td class="added"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">306</td><td class="added"> @Override</td> | |
</tr> | |
<tr> | |
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">307</td><td class="added"> default Stream<? extends EnglishConstituent> childStream() {</td> | |
</tr> | |
<tr> | |
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">308</td><td class="added"> return Stream.empty();</td> | |
</tr> | |
<tr> | |
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">309</td><td class="added"> }</td> | |
</tr> | |
<tr> | |
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">310</td><td class="added">}</td> | |
</tr> | |
<tr> | |
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">311</td><td class="added"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">312</td><td class="added">interface EnglishDependency extends Dependency {</td> | |
</tr> | |
<tr> | |
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">313</td><td class="added"> @Override</td> | |
</tr> | |
<tr> | |
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">314</td><td class="added"> EnglishDependencyType type();</td> | |
</tr> | |
<tr> | |
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">315</td><td class="added"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">316</td><td class="added"> @Override</td> | |
</tr> | |
<tr> | |
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">317</td><td class="added"> EnglishTaggedToken governor();</td> | |
</tr> | |
<tr> | |
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">318</td><td class="added"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">319</td><td class="added"> @Override</td> | |
</tr> | |
<tr> | |
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">320</td><td class="added"> EnglishTaggedToken dependent();</td> | |
</tr> | |
<tr> | |
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">321</td><td class="added">}</td> | |
</tr> | |
<tr> | |
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">322</td><td class="added"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">323</td><td class="added">interface EnglishSentenceSyntax extends SentenceSyntax {</td> | |
</tr> | |
<tr> | |
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">324</td><td class="added"> @Override</td> | |
</tr> | |
<tr> | |
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">325</td><td class="added"> EnglishConstituentBranch constituentTree();</td> | |
</tr> | |
<tr> | |
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">326</td><td class="added"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">327</td><td class="added"> @Override</td> | |
</tr> | |
<tr> | |
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">328</td><td class="added"> List<? extends EnglishDependency> dependencies();</td> | |
</tr> | |
<tr> | |
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">329</td><td class="added">}</td> | |
</tr> | |
<tr> | |
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">330</td><td class="added"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">331</td><td class="added">interface EnglishParsedSentence extends EnglishTaggedSentence, ParsedSentence {</td> | |
</tr> | |
<tr> | |
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">332</td><td class="added"> @Override</td> | |
</tr> | |
<tr> | |
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">333</td><td class="added"> EnglishSentenceSyntax syntax();</td> | |
</tr> | |
<tr> | |
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">334</td><td class="added">}</td> | |
</tr> | |
<tr> | |
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">335</td><td class="added"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">336</td><td class="added">interface EnglishParsedText extends EnglishTaggedText, ParsedText {</td> | |
</tr> | |
<tr> | |
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">337</td><td class="added"> @Override // some (or even all) sentences may remain unparsed</td> | |
</tr> | |
<tr> | |
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">338</td><td class="added"> default Stream<? extends EnglishParsedSentence> parsedSentenceStream() {</td> | |
</tr> | |
<tr> | |
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">339</td><td class="added"> return Seq.ofType(sentences().stream(), EnglishParsedSentence.class);</td> | |
</tr> | |
<tr> | |
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">340</td><td class="added"> }</td> | |
</tr> | |
<tr> | |
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">341</td><td class="added">}</td> | |
</tr> | |
<tr> | |
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">342</td><td class="added"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">343</td><td class="added">//</td> | |
</tr> | |
<tr> | |
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">344</td><td class="added">// 3.B.II) GERMAN</td> | |
</tr> | |
<tr> | |
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">345</td><td class="added">//</td> | |
</tr> | |
<tr> | |
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">346</td><td class="added"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">347</td><td class="added">// 3.B.II.a) GERMAN PARTS OF SPEECH</td> | |
</tr> | |
<tr> | |
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">348</td><td class="added">interface GermanTaggedToken extends TaggedToken {</td> | |
</tr> | |
<tr> | |
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">349</td><td class="added"> @Override</td> | |
</tr> | |
<tr> | |
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">350</td><td class="added"> GermanPartOfSpeech partOfSpeech();</td> | |
</tr> | |
<tr> | |
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">351</td><td class="added">}</td> | |
</tr> | |
<tr> | |
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">352</td><td class="added"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">353</td><td class="added">interface GermanTaggedSentence extends TaggedSentence {</td> | |
</tr> | |
<tr> | |
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">354</td><td class="added"> @Override</td> | |
</tr> | |
<tr> | |
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">355</td><td class="added"> List<? extends GermanTaggedToken> tokens();</td> | |
</tr> | |
<tr> | |
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">356</td><td class="added">}</td> | |
</tr> | |
<tr> | |
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">357</td><td class="added"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">358</td><td class="added">interface GermanTaggedText extends TaggedText {</td> | |
</tr> | |
<tr> | |
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">359</td><td class="added"> @Override</td> | |
</tr> | |
<tr> | |
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">360</td><td class="added"> default Stream<? extends GermanTaggedSentence> taggedSentenceStream() {</td> | |
</tr> | |
<tr> | |
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">361</td><td class="added"> return Seq.ofType(sentences().stream(), GermanTaggedSentence.class);</td> | |
</tr> | |
<tr> | |
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">362</td><td class="added"> }</td> | |
</tr> | |
<tr> | |
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">363</td><td class="added">}</td> | |
</tr> | |
<tr> | |
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">364</td><td class="added"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">365</td><td class="added">// 3.B.II.b) GERMAN SYNTAX (missing as of yet)</td> | |
</tr> | |
<tr> | |
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">366</td><td class="added"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber"></td><td class="empty"></td><td class="lineNumber">367</td><td class="added"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber">265</td><td class="equal">/* ***********************</td><td class="lineNumber">368</td><td class="equal">/* ***********************</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">266</td><td class="equal"> * 4) PRODUCERS OF THE API</td><td class="lineNumber">369</td><td class="equal"> * 4) PRODUCERS OF THE API</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">267</td><td class="equal"> *************************/</td><td class="lineNumber">370</td><td class="equal"> *************************/</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">268</td><td class="equal"></td><td class="lineNumber">371</td><td class="equal"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber">269</td><td class="equal">interface TextProcessingRequest { // SIMPLIFICATION</td><td class="lineNumber">372</td><td class="equal">interface TextProcessingRequest { // SIMPLIFICATION</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">270</td><td class="equal"> Locale locale();</td><td class="lineNumber">373</td><td class="equal"> Locale locale();</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">271</td><td class="equal"></td><td class="lineNumber">374</td><td class="equal"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber">272</td><td class="equal"> String text();</td><td class="lineNumber">375</td><td class="equal"> String text();</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">273</td><td class="equal"></td><td class="lineNumber">376</td><td class="equal"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber">274</td><td class="equal"> Stage targetStage();</td><td class="lineNumber">377</td><td class="equal"> Stage targetStage();</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">275</td><td class="equal">}</td><td class="lineNumber">378</td><td class="equal">}</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">276</td><td class="equal"></td><td class="lineNumber">379</td><td class="equal"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber">277</td><td class="equal">interface TextProcessor {</td><td class="lineNumber">380</td><td class="equal">interface TextProcessor {</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">278</td><td class="equal"> LocalizedText processText(TextProcessingRequest request);</td><td class="lineNumber">381</td><td class="equal"> LocalizedText processText(TextProcessingRequest request);</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">279</td><td class="equal">}</td><td class="lineNumber">382</td><td class="equal">}</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">280</td><td class="equal"></td><td class="lineNumber">383</td><td class="equal"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber">281</td><td class="equal">/* ***********************</td><td class="lineNumber">384</td><td class="equal">/* ***********************</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">282</td><td class="equal"> * 5) CONSUMERS OF THE API</td><td class="lineNumber">385</td><td class="equal"> * 5) CONSUMERS OF THE API</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">283</td><td class="equal"> *************************/</td><td class="lineNumber">386</td><td class="equal"> *************************/</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">284</td><td class="equal"></td><td class="lineNumber">387</td><td class="equal"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber">285</td><td class="equal">/*</td><td class="lineNumber">388</td><td class="equal">/*</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">286</td><td class="equal"> * 5.A) DIRECT CONSUMERS</td><td class="lineNumber">389</td><td class="equal"> * 5.A) DIRECT CONSUMERS</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">287</td><td class="equal"> */</td><td class="lineNumber">390</td><td class="equal"> */</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">288</td><td class="equal"></td><td class="lineNumber">391</td><td class="equal"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber">289</td><td class="equal">class GermanPostpositionChecker {</td><td class="lineNumber">392</td><td class="equal">class GermanPostpositionChecker {</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">290</td><td class="changed"> void checkTaggedText(TaggedText<GermanPartOfSpeech> text) {</td><td class="lineNumber">393</td><td class="changed"> void checkTaggedText(GermanTaggedText text) {</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">291</td><td class="equal"> text.taggedSentenceStream().forEach(this::checkTaggedSentence);</td><td class="lineNumber">394</td><td class="equal"> text.taggedSentenceStream().forEach(this::checkTaggedSentence);</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">292</td><td class="equal"> }</td><td class="lineNumber">395</td><td class="equal"> }</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">293</td><td class="equal"></td><td class="lineNumber">396</td><td class="equal"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber">294</td><td class="changed"> private void checkTaggedSentence(TaggedSentence<GermanPartOfSpeech> sentence) {</td><td class="lineNumber">397</td><td class="changed"> private void checkTaggedSentence(GermanTaggedSentence sentence) {</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">295</td><td class="equal"> sentence.tokens().stream()</td><td class="lineNumber">398</td><td class="equal"> sentence.tokens().stream()</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">296</td><td class="equal"> .filter(this::isPostposition)</td><td class="lineNumber">399</td><td class="equal"> .filter(this::isPostposition)</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">297</td><td class="equal"> .forEach(this::checkPostposition);</td><td class="lineNumber">400</td><td class="equal"> .forEach(this::checkPostposition);</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">298</td><td class="equal"> }</td><td class="lineNumber">401</td><td class="equal"> }</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">299</td><td class="equal"></td><td class="lineNumber">402</td><td class="equal"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber">300</td><td class="changed"> private boolean isPostposition(TaggedToken<GermanPartOfSpeech> token) {</td><td class="lineNumber">403</td><td class="changed"> private boolean isPostposition(GermanTaggedToken token) {</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">301</td><td class="equal"> return token.partOfSpeech().isPostposition();</td><td class="lineNumber">404</td><td class="equal"> return token.partOfSpeech().isPostposition();</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">302</td><td class="equal"> }</td><td class="lineNumber">405</td><td class="equal"> }</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">303</td><td class="equal"></td><td class="lineNumber">406</td><td class="equal"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber">304</td><td class="equal"></td><td class="lineNumber">407</td><td class="equal"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber">305</td><td class="changed"> private void checkPostposition(TaggedToken<GermanPartOfSpeech> token) {</td><td class="lineNumber">408</td><td class="changed"> private void checkPostposition(GermanTaggedToken token) {</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">306</td><td class="equal"> // logic</td><td class="lineNumber">409</td><td class="equal"> // logic</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">307</td><td class="equal"> }</td><td class="lineNumber">410</td><td class="equal"> }</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">308</td><td class="equal">}</td><td class="lineNumber">411</td><td class="equal">}</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">309</td><td class="equal"></td><td class="lineNumber">412</td><td class="equal"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber">310</td><td class="equal">class EnglishNominalSubjectChecker {</td><td class="lineNumber">413</td><td class="equal">class EnglishNominalSubjectChecker {</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">311</td><td class="equal"></td><td class="lineNumber">414</td><td class="equal"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber">312</td><td class="changed"> void checkNominalSubjects(ParsedText<?, EnglishDependencyType, EnglishPartOfSpeech> text) {</td><td class="lineNumber">415</td><td class="changed"> void checkNominalSubjects(EnglishParsedText text) {</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">313</td><td class="equal"> text.parsedSentenceStream().forEach(this::checkNominalSubjects);</td><td class="lineNumber">416</td><td class="equal"> text.parsedSentenceStream().forEach(this::checkNominalSubjects);</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">314</td><td class="equal"> }</td><td class="lineNumber">417</td><td class="equal"> }</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">315</td><td class="equal"></td><td class="lineNumber">418</td><td class="equal"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber">316</td><td class="changed"> private void checkNominalSubjects(ParsedSentence<?, EnglishDependencyType, EnglishPartOfSpeech> sentence) {</td><td class="lineNumber">419</td><td class="changed"> private void checkNominalSubjects(EnglishParsedSentence sentence) {</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">317</td><td class="equal"> sentence.syntax().dependencies().stream()</td><td class="lineNumber">420</td><td class="equal"> sentence.syntax().dependencies().stream()</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">318</td><td class="equal"> .filter(this::isCertainTypeOfNominalSubjectDependency)</td><td class="lineNumber">421</td><td class="equal"> .filter(this::isCertainTypeOfNominalSubjectDependency)</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">319</td><td class="equal"> .forEach(this::checkNominalSubject);</td><td class="lineNumber">422</td><td class="equal"> .forEach(this::checkNominalSubject);</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">320</td><td class="equal"> }</td><td class="lineNumber">423</td><td class="equal"> }</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">321</td><td class="equal"></td><td class="lineNumber">424</td><td class="equal"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber">322</td><td class="changed"> private boolean isCertainTypeOfNominalSubjectDependency(Dependency<EnglishDependencyType, EnglishPartOfSpeech> depen<br>dency) {</td><td class="lineNumber">425</td><td class="changed"> private boolean isCertainTypeOfNominalSubjectDependency(EnglishDependency dependency) {</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">323</td><td class="equal"> return dependency.type() == EnglishDependencyType.NOMINAL_SUBJECT && true; // SIMPLIFICATION</td><td class="lineNumber">426</td><td class="equal"> return dependency.type() == EnglishDependencyType.NOMINAL_SUBJECT && true; // SIMPLIFICATION</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">324</td><td class="equal"> }</td><td class="lineNumber">427</td><td class="equal"> }</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">325</td><td class="equal"></td><td class="lineNumber">428</td><td class="equal"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber">326</td><td class="changed"> private void checkNominalSubject(Dependency<EnglishDependencyType, EnglishPartOfSpeech> dependency) {</td><td class="lineNumber">429</td><td class="changed"> private void checkNominalSubject(EnglishDependency dependency) {</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">327</td><td class="equal"> checkNominalGovernor(dependency.governor());</td><td class="lineNumber">430</td><td class="equal"> checkNominalGovernor(dependency.governor());</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">328</td><td class="equal"> checkNominalDependent(dependency.dependent());</td><td class="lineNumber">431</td><td class="equal"> checkNominalDependent(dependency.dependent());</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">329</td><td class="equal"> }</td><td class="lineNumber">432</td><td class="equal"> }</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">330</td><td class="equal"></td><td class="lineNumber">433</td><td class="equal"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber">331</td><td class="changed"> private void checkNominalGovernor(TaggedToken<EnglishPartOfSpeech> governor) {</td><td class="lineNumber">434</td><td class="changed"> private void checkNominalGovernor(EnglishTaggedToken governor) {</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">332</td><td class="equal"> if (checkGovernorPartOfSpeech(governor.partOfSpeech())) {</td><td class="lineNumber">435</td><td class="equal"> if (checkGovernorPartOfSpeech(governor.partOfSpeech())) {</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">333</td><td class="equal"> // logic</td><td class="lineNumber">436</td><td class="equal"> // logic</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">334</td><td class="equal"> }</td><td class="lineNumber">437</td><td class="equal"> }</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">335</td><td class="equal"> }</td><td class="lineNumber">438</td><td class="equal"> }</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">336</td><td class="equal"></td><td class="lineNumber">439</td><td class="equal"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber">337</td><td class="changed"> private void checkNominalDependent(TaggedToken<EnglishPartOfSpeech> dependent) {</td><td class="lineNumber">440</td><td class="changed"> private void checkNominalDependent(EnglishTaggedToken dependent) {</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">338</td><td class="equal"> if (checkDependentPartOfSpeech(dependent.partOfSpeech())) {</td><td class="lineNumber">441</td><td class="equal"> if (checkDependentPartOfSpeech(dependent.partOfSpeech())) {</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">339</td><td class="equal"> // logic</td><td class="lineNumber">442</td><td class="equal"> // logic</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">340</td><td class="equal"> }</td><td class="lineNumber">443</td><td class="equal"> }</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">341</td><td class="equal"> }</td><td class="lineNumber">444</td><td class="equal"> }</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">342</td><td class="equal"></td><td class="lineNumber">445</td><td class="equal"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber">343</td><td class="equal"> private boolean checkGovernorPartOfSpeech(EnglishPartOfSpeech partOfSpeech) {</td><td class="lineNumber">446</td><td class="equal"> private boolean checkGovernorPartOfSpeech(EnglishPartOfSpeech partOfSpeech) {</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">344</td><td class="equal"> return true; // SIMPLIFICATION</td><td class="lineNumber">447</td><td class="equal"> return true; // SIMPLIFICATION</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">345</td><td class="equal"> }</td><td class="lineNumber">448</td><td class="equal"> }</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">346</td><td class="equal"></td><td class="lineNumber">449</td><td class="equal"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber">347</td><td class="equal"> private boolean checkDependentPartOfSpeech(EnglishPartOfSpeech partOfSpeech) {</td><td class="lineNumber">450</td><td class="equal"> private boolean checkDependentPartOfSpeech(EnglishPartOfSpeech partOfSpeech) {</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">348</td><td class="equal"> return true; // SIMPLIFICATION</td><td class="lineNumber">451</td><td class="equal"> return true; // SIMPLIFICATION</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">349</td><td class="equal"> }</td><td class="lineNumber">452</td><td class="equal"> }</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">350</td><td class="equal">}</td><td class="lineNumber">453</td><td class="equal">}</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">351</td><td class="equal"></td><td class="lineNumber">454</td><td class="equal"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber">352</td><td class="equal">class EnglishRelevantConstituentHandler {</td><td class="lineNumber">455</td><td class="equal">class EnglishRelevantConstituentHandler {</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">353</td><td class="equal"></td><td class="lineNumber">456</td><td class="equal"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber">354</td><td class="changed"> void handleRelevantConstituents(ParsedText<EnglishConstituentType, ?, EnglishPartOfSpeech> text) {</td><td class="lineNumber">457</td><td class="changed"> void handleRelevantConstituents(EnglishParsedText text) {</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">355</td><td class="equal"> text.parsedSentenceStream().forEach(this::handleRelevantConstiuents);</td><td class="lineNumber">458</td><td class="equal"> text.parsedSentenceStream().forEach(this::handleRelevantConstiuents);</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">356</td><td class="equal"> }</td><td class="lineNumber">459</td><td class="equal"> }</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">357</td><td class="equal"></td><td class="lineNumber">460</td><td class="equal"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber">358</td><td class="changed"> private void handleRelevantConstiuents(ParsedSentence<EnglishConstituentType, ?, EnglishPartOfSpeech> sentence) {</td><td class="lineNumber">461</td><td class="changed"> private void handleRelevantConstiuents(EnglishParsedSentence sentence) {</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">359</td><td class="changed"> Constituents.flatConstituentStream(sentence.syntax().constituentTree())</td><td class="lineNumber">462</td><td class="changed"> EnglishConstituents.flatConstituentStream(sentence.syntax().constituentTree())</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">360</td><td class="equal"> .filter(this::isRelevantConstituent)</td><td class="lineNumber">463</td><td class="equal"> .filter(this::isRelevantConstituent)</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">361</td><td class="equal"> .forEach(this::handleRelevantConstituent);</td><td class="lineNumber">464</td><td class="equal"> .forEach(this::handleRelevantConstituent);</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">362</td><td class="equal"> }</td><td class="lineNumber">465</td><td class="equal"> }</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">363</td><td class="equal"></td><td class="lineNumber">466</td><td class="equal"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber">364</td><td class="changed"> private boolean isRelevantConstituent(Constituent<EnglishConstituentType, EnglishPartOfSpeech> constituent) {</td><td class="lineNumber">467</td><td class="changed"> private boolean isRelevantConstituent(EnglishConstituent constituent) {</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">365</td><td class="equal"> return true; // SIMPLIFICATION</td><td class="lineNumber">468</td><td class="equal"> return true; // SIMPLIFICATION</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">366</td><td class="equal"> }</td><td class="lineNumber">469</td><td class="equal"> }</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">367</td><td class="equal"></td><td class="lineNumber">470</td><td class="equal"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber">368</td><td class="changed"> private void handleRelevantConstituent(Constituent<EnglishConstituentType, EnglishPartOfSpeech> constituent) {</td><td class="lineNumber">471</td><td class="changed"> private void handleRelevantConstituent(EnglishConstituent constituent) {</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">369</td><td class="equal"> // logic</td><td class="lineNumber">472</td><td class="equal"> // logic</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">370</td><td class="equal"> }</td><td class="lineNumber">473</td><td class="equal"> }</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">371</td><td class="equal">}</td><td class="lineNumber">474</td><td class="equal">}</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">372</td><td class="equal"></td><td class="lineNumber">475</td><td class="equal"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber">373</td><td class="changed">class Constituents {</td><td class="lineNumber">476</td><td class="changed">class EnglishConstituents {</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">374</td><td class="equal"> /**</td><td class="lineNumber">477</td><td class="equal"> /**</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">375</td><td class="equal"> * Returns the constituent and all its descendants as a flattended Stream.</td><td class="lineNumber">478</td><td class="equal"> * Returns the constituent and all its descendants as a flattended Stream.</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">376</td><td class="equal"> */</td><td class="lineNumber">479</td><td class="equal"> */</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">377</td><td class="changed"> static <C extends ConstituentType, P extends PartOfSpeech> Stream<Constituent<C, P>> flatConstituentStream(Constitue<br>nt<C, P> constituent) {</td><td class="lineNumber">480</td><td class="changed"> static Stream<EnglishConstituent> flatConstituentStream(EnglishConstituent constituent) {</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">378</td><td class="equal"> return Stream.concat(</td><td class="lineNumber">481</td><td class="equal"> return Stream.concat(</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">379</td><td class="equal"> Stream.of(constituent),</td><td class="lineNumber">482</td><td class="equal"> Stream.of(constituent),</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">380</td><td class="changed"> constituent.childStream().flatMap(Constituents::flatConstituentStream)</td><td class="lineNumber">483</td><td class="changed"> constituent.childStream().flatMap(EnglishConstituents::flatConstituentStream)</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">381</td><td class="equal"> );</td><td class="lineNumber">484</td><td class="equal"> );</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">382</td><td class="equal"> }</td><td class="lineNumber">485</td><td class="equal"> }</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">383</td><td class="equal">}</td><td class="lineNumber">486</td><td class="equal">}</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">384</td><td class="equal"></td><td class="lineNumber">487</td><td class="equal"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber">385</td><td class="equal"></td><td class="lineNumber">488</td><td class="equal"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber">386</td><td class="equal">/*</td><td class="lineNumber">489</td><td class="equal">/*</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">387</td><td class="equal"> * 5.B) INDIRECT CONSUMERS</td><td class="lineNumber">490</td><td class="equal"> * 5.B) INDIRECT CONSUMERS</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">388</td><td class="equal"> */</td><td class="lineNumber">491</td><td class="equal"> */</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">389</td><td class="equal">interface ProcessedTextConsumer { // SIMPLIFICATION</td><td class="lineNumber">492</td><td class="equal">interface ProcessedTextConsumer { // SIMPLIFICATION</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">390</td><td class="equal"> Locale supportedLocale();</td><td class="lineNumber">493</td><td class="equal"> Locale supportedLocale();</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">391</td><td class="equal"></td><td class="lineNumber">494</td><td class="equal"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber">392</td><td class="equal"> Stage requiredStage();</td><td class="lineNumber">495</td><td class="equal"> Stage requiredStage();</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">393</td><td class="equal"></td><td class="lineNumber">496</td><td class="equal"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber">394</td><td class="equal"> void consume(LocalizedText text);</td><td class="lineNumber">497</td><td class="equal"> void consume(LocalizedText text);</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">395</td><td class="equal">}</td><td class="lineNumber">498</td><td class="equal">}</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">396</td><td class="equal"></td><td class="lineNumber">499</td><td class="equal"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber">397</td><td class="equal">class SampleUniversalTokenizedTextConsumer implements ProcessedTextConsumer {</td><td class="lineNumber">500</td><td class="equal">class SampleUniversalTokenizedTextConsumer implements ProcessedTextConsumer {</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">398</td><td class="equal"></td><td class="lineNumber">501</td><td class="equal"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber">399</td><td class="equal"> @Override</td><td class="lineNumber">502</td><td class="equal"> @Override</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">400</td><td class="equal"> public Locale supportedLocale() {</td><td class="lineNumber">503</td><td class="equal"> public Locale supportedLocale() {</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">401</td><td class="equal"> return Locale.ROOT;</td><td class="lineNumber">504</td><td class="equal"> return Locale.ROOT;</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">402</td><td class="equal"> }</td><td class="lineNumber">505</td><td class="equal"> }</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">403</td><td class="equal"></td><td class="lineNumber">506</td><td class="equal"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber">404</td><td class="equal"> @Override</td><td class="lineNumber">507</td><td class="equal"> @Override</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">405</td><td class="equal"> public Stage requiredStage() {</td><td class="lineNumber">508</td><td class="equal"> public Stage requiredStage() {</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">406</td><td class="equal"> return Stage.TOKENIZED;</td><td class="lineNumber">509</td><td class="equal"> return Stage.TOKENIZED;</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">407</td><td class="equal"> }</td><td class="lineNumber">510</td><td class="equal"> }</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">408</td><td class="equal"></td><td class="lineNumber">511</td><td class="equal"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber">409</td><td class="equal"> @Override</td><td class="lineNumber">512</td><td class="equal"> @Override</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">410</td><td class="equal"> public void consume(LocalizedText text) {</td><td class="lineNumber">513</td><td class="equal"> public void consume(LocalizedText text) {</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">411</td><td class="equal"> handleTokenizedText((TokenizedText) text);</td><td class="lineNumber">514</td><td class="equal"> handleTokenizedText((TokenizedText) text);</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">412</td><td class="equal"> }</td><td class="lineNumber">515</td><td class="equal"> }</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">413</td><td class="equal"></td><td class="lineNumber">516</td><td class="equal"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber">414</td><td class="equal"> private void handleTokenizedText(TokenizedText tokenizedText) {</td><td class="lineNumber">517</td><td class="equal"> private void handleTokenizedText(TokenizedText tokenizedText) {</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">415</td><td class="equal"> // logic</td><td class="lineNumber">518</td><td class="equal"> // logic</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">416</td><td class="equal"> }</td><td class="lineNumber">519</td><td class="equal"> }</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">417</td><td class="equal">}</td><td class="lineNumber">520</td><td class="equal">}</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">418</td><td class="equal"></td><td class="lineNumber">521</td><td class="equal"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber">419</td><td class="equal">class SampleGermanTaggedConsumer implements ProcessedTextConsumer {</td><td class="lineNumber">522</td><td class="equal">class SampleGermanTaggedConsumer implements ProcessedTextConsumer {</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">420</td><td class="equal"></td><td class="lineNumber">523</td><td class="equal"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber">421</td><td class="equal"> @Override</td><td class="lineNumber">524</td><td class="equal"> @Override</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">422</td><td class="equal"> public Locale supportedLocale() {</td><td class="lineNumber">525</td><td class="equal"> public Locale supportedLocale() {</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">423</td><td class="equal"> return Locale.GERMAN;</td><td class="lineNumber">526</td><td class="equal"> return Locale.GERMAN;</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">424</td><td class="equal"> }</td><td class="lineNumber">527</td><td class="equal"> }</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">425</td><td class="equal"></td><td class="lineNumber">528</td><td class="equal"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber">426</td><td class="equal"> @Override</td><td class="lineNumber">529</td><td class="equal"> @Override</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">427</td><td class="equal"> public Stage requiredStage() {</td><td class="lineNumber">530</td><td class="equal"> public Stage requiredStage() {</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">428</td><td class="equal"> return Stage.TAGGED;</td><td class="lineNumber">531</td><td class="equal"> return Stage.TAGGED;</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">429</td><td class="equal"> }</td><td class="lineNumber">532</td><td class="equal"> }</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">430</td><td class="equal"></td><td class="lineNumber">533</td><td class="equal"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber">431</td><td class="equal"> @Override</td><td class="lineNumber">534</td><td class="equal"> @Override</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">432</td><td class="equal"> public void consume(LocalizedText text) {</td><td class="lineNumber">535</td><td class="equal"> public void consume(LocalizedText text) {</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">433</td><td class="changed"> // UNSAFE UNCHECKED CAST!</td><td class="lineNumber">536</td><td class="changed"> GermanTaggedText germanTaggedText = (GermanTaggedText) text; // SAFE CAST</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">434</td><td class="changed"> TaggedText<GermanPartOfSpeech> germanTaggedText = (TaggedText<GermanPartOfSpeech>) text;</td><td class="lineNumber"></td><td class="changed"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber">435</td><td class="equal"> new GermanPostpositionChecker().checkTaggedText(germanTaggedText);</td><td class="lineNumber">537</td><td class="equal"> new GermanPostpositionChecker().checkTaggedText(germanTaggedText);</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">436</td><td class="equal"> }</td><td class="lineNumber">538</td><td class="equal"> }</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">437</td><td class="equal">}</td><td class="lineNumber">539</td><td class="equal">}</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">438</td><td class="equal"></td><td class="lineNumber">540</td><td class="equal"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber">439</td><td class="equal">class SampleEnglishParsedTextConsumer implements ProcessedTextConsumer {</td><td class="lineNumber">541</td><td class="equal">class SampleEnglishParsedTextConsumer implements ProcessedTextConsumer {</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">440</td><td class="equal"></td><td class="lineNumber">542</td><td class="equal"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber">441</td><td class="equal"> @Override</td><td class="lineNumber">543</td><td class="equal"> @Override</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">442</td><td class="equal"> public Locale supportedLocale() {</td><td class="lineNumber">544</td><td class="equal"> public Locale supportedLocale() {</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">443</td><td class="equal"> return Locale.ENGLISH;</td><td class="lineNumber">545</td><td class="equal"> return Locale.ENGLISH;</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">444</td><td class="equal"> }</td><td class="lineNumber">546</td><td class="equal"> }</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">445</td><td class="equal"></td><td class="lineNumber">547</td><td class="equal"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber">446</td><td class="equal"> @Override</td><td class="lineNumber">548</td><td class="equal"> @Override</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">447</td><td class="equal"> public Stage requiredStage() {</td><td class="lineNumber">549</td><td class="equal"> public Stage requiredStage() {</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">448</td><td class="equal"> return Stage.PARSED;</td><td class="lineNumber">550</td><td class="equal"> return Stage.PARSED;</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">449</td><td class="equal"> }</td><td class="lineNumber">551</td><td class="equal"> }</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">450</td><td class="equal"></td><td class="lineNumber">552</td><td class="equal"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber">451</td><td class="equal"> @Override</td><td class="lineNumber">553</td><td class="equal"> @Override</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">452</td><td class="equal"> public void consume(LocalizedText text) {</td><td class="lineNumber">554</td><td class="equal"> public void consume(LocalizedText text) {</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">453</td><td class="changed"> // UNSAFE UNCHECKED CAST!</td><td class="lineNumber">555</td><td class="changed"> EnglishParsedText englishParsedText = (EnglishParsedText) text; // SAFE CAST</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">454</td><td class="changed"> ParsedText<?, EnglishDependencyType, EnglishPartOfSpeech> englishParsedText</td><td class="lineNumber"></td><td class="changed"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber">455</td><td class="changed"> = (ParsedText<?, EnglishDependencyType, EnglishPartOfSpeech>) text;</td><td class="lineNumber"></td><td class="changed"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber">456</td><td class="equal"> new EnglishNominalSubjectChecker().checkNominalSubjects(englishParsedText);</td><td class="lineNumber">556</td><td class="equal"> new EnglishNominalSubjectChecker().checkNominalSubjects(englishParsedText);</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">457</td><td class="equal"> }</td><td class="lineNumber">557</td><td class="equal"> }</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">458</td><td class="equal">}</td><td class="lineNumber">558</td><td class="equal">}</td> | |
</tr> | |
<tr> | |
<td class="lineNumber">459</td><td class="equal"></td><td class="lineNumber">559</td><td class="equal"></td> | |
</tr> | |
<tr> | |
<td class="lineNumber">460</td><td class="equal"></td><td class="lineNumber">560</td><td class="equal"></td> | |
</tr> | |
</table> | |
</body> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import java.util.List; | |
import java.util.Locale; | |
import java.util.stream.Stream; | |
/* **************************************** | |
* 1) CORE LANGUAGE-SPECIFIC TYPES (AXIS Z) | |
******************************************/ | |
/* | |
* 1.A) PART OF SPEECH | |
* https://en.wikipedia.org/wiki/Part_of_speech | |
*/ | |
// | |
// 1.A.I) ENGLISH PART OF SPEECH | |
// | |
/** | |
* Implementing classes consist of one or more part-of-speech tags (each tag provided by a different tagger). | |
*/ | |
interface PartOfSpeech { | |
} | |
class EnglishPartOfSpeech implements PartOfSpeech { | |
private final Type1EnglishTag type1Tag = Type1EnglishTag.TO; // SIMPLIFICATION | |
private final Type2EnglishTag type2Tag = Type2EnglishTag.GENERAL_PREPOSITION; // SIMPLIFICATION | |
boolean isInfinitiveMarker() { | |
return type1Tag == Type1EnglishTag.TO && type2Tag == Type2EnglishTag.INFINITIVE_MARKER; | |
} | |
} | |
enum Type1EnglishTag { | |
// SIMPLIFICATION (partial content) | |
TO // "to" as a preposition or an infinitive marker | |
} | |
enum Type2EnglishTag { | |
// SIMPLIFICATION (partial content) | |
GENERAL_PREPOSITION, // e.g. "to" in "I said to him that..." | |
INFINITIVE_MARKER // "to", e.g. in "I want to ask." | |
} | |
// | |
// 1.A.II) GERMAN PART OF SPEECH | |
// | |
class GermanPartOfSpeech implements PartOfSpeech { | |
private final Type1GermanTag type1Tag = Type1GermanTag.POSTPOSITION; // SIMPLIFICATION | |
boolean isPostposition() { | |
return type1Tag == Type1GermanTag.POSTPOSITION; | |
} | |
} | |
enum Type1GermanTag { | |
// SIMPLIFICATION (partial content) | |
POSTPOSITION, // e.g. "zufolge" | |
} | |
/* | |
* 1.B) CONSTITUENT | |
* https://en.wikipedia.org/wiki/Phrase_structure_grammar | |
*/ | |
interface ConstituentType { | |
} | |
enum EnglishConstituentType implements ConstituentType { | |
// SIMPLIFICATION (partial content) | |
VERB_PHRASE, // e.g. "is doing nice" | |
WH_WORD_NOUN_PHRASE // e.g. "whose daughter" | |
} | |
// enum GermanConstituentType missing as of yet | |
/* | |
* 1.C) DEPENDENCY | |
* https://en.wikipedia.org/wiki/Dependency_grammar | |
*/ | |
interface DependencyType { | |
} | |
enum EnglishDependencyType implements DependencyType { | |
// SIMPLIFICATION (partial content) | |
NOMINAL_SUBJECT, // e.g. "he" <- "walks" in "He walks." | |
PHRASAL_VERB_PARTICLE // e.g. "shut" -> "down" in "It was shut down." | |
} | |
// enum GermanDependencyType missing as of yet | |
/* *************** | |
* 2) HELPER TYPES | |
*****************/ | |
interface TextualRange { | |
String text(); | |
int startOffset(); // inclusive | |
int endOffset(); // exclusive | |
} | |
interface Seq { | |
/** | |
* Stub for <a href="https://www.jooq.org/products/jOOλ/javadoc/0.9.12/org/jooq/lambda/Seq.html#ofType-java.util.stream.Stream-java.lang.Class-">Seq.ofType()</a>. | |
*/ | |
@SuppressWarnings("unchecked") | |
static <T, U> Stream<U> ofType(Stream<? extends T> stream, Class<? extends U> type) { | |
return stream.filter(type::isInstance).map(t -> (U) t); | |
} | |
} | |
/** | |
* Defines the stage of text processing (AXIS Y). | |
*/ | |
enum Stage { | |
UNPROCESSED, | |
TOKENIZED, // tokens present | |
SENTENCIZED, // sentences present | |
TAGGED, // parts of speech present | |
PARSED // syntax present | |
} | |
/* *************************** | |
* 3) SOLUTION USING SUBTYPING | |
*****************************/ | |
/* | |
* 3.A) GENERIC HIERARCHY (AXIS Y OVER X) | |
*/ | |
// | |
// 3.A.I) UNPROCESSED | |
// | |
interface LocalizedText extends TextualRange { | |
Locale locale(); | |
default Stage maxStage() { | |
return Stage.UNPROCESSED; | |
} | |
} | |
// | |
// 3.A.II) WITH TOKENS | |
// | |
enum TokenType { | |
WORD, NUMERIC // SIMPLIFICATION | |
} | |
interface Token extends TextualRange { | |
TokenType tokenType(); | |
} | |
interface TokenizedText extends LocalizedText { | |
Stream<? extends Token> tokenStream(); | |
int tokenCount(); | |
@Override | |
default Stage maxStage() { | |
return Stage.TOKENIZED; | |
} | |
} | |
// | |
// 3.A.III) WITH SENTENCES | |
// | |
interface Sentence extends TextualRange { | |
List<? extends Token> tokens(); | |
default Stage stage() { | |
return Stage.SENTENCIZED; | |
} | |
} | |
interface SentencizedText extends TokenizedText { | |
List<? extends Sentence> sentences(); | |
@Override | |
default Stage maxStage() { | |
return Stage.SENTENCIZED; | |
} | |
} | |
// | |
// 3.A.IV) WITH PARTS OF SPEECH | |
// | |
interface TaggedToken extends Token { | |
PartOfSpeech partOfSpeech(); // see section 1.A above | |
} | |
interface TaggedSentence extends Sentence { | |
@Override | |
List<? extends TaggedToken> tokens(); | |
@Override | |
default Stage stage() { | |
return Stage.TAGGED; | |
} | |
} | |
interface TaggedText extends SentencizedText { | |
// some (or even all) sentences may remain untagged | |
Stream<? extends TaggedSentence> taggedSentenceStream(); | |
@Override | |
default Stage maxStage() { | |
return Stage.TAGGED; | |
} | |
} | |
// | |
// 3.A.V) WITH SYNTAX | |
// | |
interface Constituent { | |
Stream<? extends Constituent> childStream(); | |
} | |
interface ConstituentBranch extends Constituent { | |
ConstituentType type(); // see section 1.B above | |
} | |
interface ConstituentLeaf extends Constituent { | |
TaggedToken token(); | |
@Override | |
default Stream<? extends Constituent> childStream() { | |
return Stream.empty(); | |
} | |
} | |
interface Dependency { | |
DependencyType type(); // see section 1.C above | |
TaggedToken governor(); | |
TaggedToken dependent(); | |
} | |
interface SentenceSyntax { | |
ConstituentBranch constituentTree(); | |
List<? extends Dependency> dependencies(); | |