Revision: 6769
          
http://languagetool.svn.sourceforge.net/languagetool/?rev=6769&view=rev
Author:   dnaber
Date:     2012-04-22 11:43:18 +0000 (Sun, 22 Apr 2012)
Log Message:
-----------
#3520116: avoid some false positives

Modified Paths:
--------------
    trunk/JLanguageTool/src/java/org/languagetool/AnalyzedTokenReadings.java
    trunk/JLanguageTool/src/java/org/languagetool/rules/de/CaseRule.java
    trunk/JLanguageTool/src/test/org/languagetool/AnalyzedTokenReadingsTest.java
    trunk/JLanguageTool/src/test/org/languagetool/rules/de/CaseRuleTest.java

Modified: 
trunk/JLanguageTool/src/java/org/languagetool/AnalyzedTokenReadings.java
===================================================================
--- trunk/JLanguageTool/src/java/org/languagetool/AnalyzedTokenReadings.java    
2012-04-22 11:23:53 UTC (rev 6768)
+++ trunk/JLanguageTool/src/java/org/languagetool/AnalyzedTokenReadings.java    
2012-04-22 11:43:18 UTC (rev 6769)
@@ -105,9 +105,7 @@
   /**
    * Checks if the token has a particular POS tag.
    * 
-   * @param posTag
-   *          POS Tag to check
-   * @return True if it does.
+   * @param posTag POS tag to look for
    */
   public final boolean hasPosTag(final String posTag) {
     boolean found = false;
@@ -122,6 +120,25 @@
     return found;
   }
 
+  /**
+   * Checks if the token has a particular POS tag, whereas a part of the given 
POS tag needs to match.
+   *
+   * @param posTag POS tag substring to look for
+   * @since 1.8
+   */
+  public final boolean hasPartialPosTag(final String posTag) {
+    boolean found = false;
+    for (final AnalyzedToken reading : anTokReadings) {
+      if (reading.getPOSTag() != null) {
+        found = reading.getPOSTag().contains(posTag);
+        if (found) {
+          break;
+        }
+      }
+    }
+    return found;
+  }
+
   public final void addReading(final AnalyzedToken token) {
     final ArrayList<AnalyzedToken> l = new ArrayList<AnalyzedToken>();
     for (int i = 0; i < anTokReadings.length - 1; i++) {

Modified: trunk/JLanguageTool/src/java/org/languagetool/rules/de/CaseRule.java
===================================================================
--- trunk/JLanguageTool/src/java/org/languagetool/rules/de/CaseRule.java        
2012-04-22 11:23:53 UTC (rev 6768)
+++ trunk/JLanguageTool/src/java/org/languagetool/rules/de/CaseRule.java        
2012-04-22 11:43:18 UTC (rev 6769)
@@ -340,6 +340,8 @@
     myExceptionPhrases.add("Kleiner Bär");   // das Sternbild
     myExceptionPhrases.add("Zehn Gebote");
     myExceptionPhrases.add("Römische Reich Deutscher Nation");
+    myExceptionPhrases.add("ein absolutes Muss");
+    myExceptionPhrases.add("ein Muss");
   }
 
   private static final Set<String> substVerbenExceptions = new 
HashSet<String>();
@@ -419,7 +421,12 @@
         if (analyzedGermanToken2 != null) {
           readings = analyzedGermanToken2.getGermanReadings();
         }
-        potentiallyAddLowercaseMatch(ruleMatches, tokens[i], prevTokenIsDas, 
token);
+        boolean nextTokenIsPersonalPronoun = false;
+        if (i < tokens.length - 1) {
+          // avoid false alarm for "Das haben wir getan." etc:
+          nextTokenIsPersonalPronoun = tokens[i + 
1].hasPartialPosTag("PRO:PER") || tokens[i + 1].getToken().equals("Sie");
+        }
+        potentiallyAddLowercaseMatch(ruleMatches, tokens[i], prevTokenIsDas, 
token, nextTokenIsPersonalPronoun);
       }
       prevTokenIsDas = 
nounIndicators.contains(tokens[i].getToken().toLowerCase());
       if (readings == null) {
@@ -444,8 +451,8 @@
     return toRuleMatchArray(ruleMatches);
   }
 
-  private void potentiallyAddLowercaseMatch(List<RuleMatch> ruleMatches, 
AnalyzedTokenReadings tokenReadings, boolean prevTokenIsDas, String token) {
-    if (prevTokenIsDas) {
+  private void potentiallyAddLowercaseMatch(List<RuleMatch> ruleMatches, 
AnalyzedTokenReadings tokenReadings, boolean prevTokenIsDas, String token, 
boolean nextTokenIsPersonalPronoun) {
+    if (prevTokenIsDas && !nextTokenIsPersonalPronoun) {
       // e.g. essen -> Essen
       if (Character.isLowerCase(token.charAt(0)) && 
!substVerbenExceptions.contains(token)) {
         final String msg = "Substantivierte Verben werden groß geschrieben.";

Modified: 
trunk/JLanguageTool/src/test/org/languagetool/AnalyzedTokenReadingsTest.java
===================================================================
--- 
trunk/JLanguageTool/src/test/org/languagetool/AnalyzedTokenReadingsTest.java    
    2012-04-22 11:23:53 UTC (rev 6768)
+++ 
trunk/JLanguageTool/src/test/org/languagetool/AnalyzedTokenReadingsTest.java    
    2012-04-22 11:43:18 UTC (rev 6769)
@@ -55,4 +55,26 @@
     aTok3.setWhitespaceBefore(true);
     assertEquals(aTok3, tokenReadings.getAnalyzedToken(0));
   }
+
+  public void testHasPosTag() {
+    AnalyzedTokenReadings tokenReadings = new AnalyzedTokenReadings(new 
AnalyzedToken("word", "POS:FOO:BAR", "lemma"));
+    assertTrue(tokenReadings.hasPosTag("POS:FOO:BAR"));
+    assertFalse(tokenReadings.hasPosTag("POS:FOO:bar"));
+    assertFalse(tokenReadings.hasPosTag("POS:FOO"));
+    assertFalse(tokenReadings.hasPosTag("xaz"));
+  }
+
+  public void testHasPartialPosTag() {
+    AnalyzedTokenReadings tokenReadings = new AnalyzedTokenReadings(new 
AnalyzedToken("word", "POS:FOO:BAR", "lemma"));
+    assertTrue(tokenReadings.hasPartialPosTag("POS:FOO:BAR"));
+    assertTrue(tokenReadings.hasPartialPosTag("POS:FOO:"));
+    assertTrue(tokenReadings.hasPartialPosTag("POS:FOO"));
+    assertTrue(tokenReadings.hasPartialPosTag(":FOO:"));
+    assertTrue(tokenReadings.hasPartialPosTag("FOO:BAR"));
+
+    assertFalse(tokenReadings.hasPartialPosTag("POS:FOO:BARX"));
+    assertFalse(tokenReadings.hasPartialPosTag("POS:foo:BAR"));
+    assertFalse(tokenReadings.hasPartialPosTag("xaz"));
+  }
+
 }

Modified: 
trunk/JLanguageTool/src/test/org/languagetool/rules/de/CaseRuleTest.java
===================================================================
--- trunk/JLanguageTool/src/test/org/languagetool/rules/de/CaseRuleTest.java    
2012-04-22 11:23:53 UTC (rev 6768)
+++ trunk/JLanguageTool/src/test/org/languagetool/rules/de/CaseRuleTest.java    
2012-04-22 11:43:18 UTC (rev 6769)
@@ -92,15 +92,44 @@
 
     // correct sentences:
     assertEquals(0, rule.match(langTool.getAnalyzedSentence("Das fahrende 
Auto.")).length);
+    assertEquals(0, rule.match(langTool.getAnalyzedSentence("Das können wir so 
machen.")).length);
+    assertEquals(0, rule.match(langTool.getAnalyzedSentence("Denn das Fahren 
ist einfach.")).length);
     assertEquals(0, rule.match(langTool.getAnalyzedSentence("Das Fahren ist 
einfach.")).length);
-    assertEquals(0, rule.match(langTool.getAnalyzedSentence("Denn das Fahren 
ist einfach.")).length);
-    assertEquals(0, rule.match(langTool.getAnalyzedSentence("Das können wir so 
machen.")).length);
+    assertEquals(0, rule.match(langTool.getAnalyzedSentence("Das Gehen fällt 
mir leicht.")).length);
+    assertEquals(0, rule.match(langTool.getAnalyzedSentence("Das Ernten der 
Kartoffeln ist mühsam.")).length);
+    assertEquals(0, rule.match(langTool.getAnalyzedSentence("Entschuldige das 
späte Weiterleiten.")).length);
+    assertEquals(0, rule.match(langTool.getAnalyzedSentence("Ich liebe das 
Lesen.")).length);
+    assertEquals(0, rule.match(langTool.getAnalyzedSentence("Das Betreten des 
Rasens ist verboten.")).length);
+    assertEquals(0, rule.match(langTool.getAnalyzedSentence("Das haben wir aus 
eigenem Antrieb getan.")).length);
+    assertEquals(0, rule.match(langTool.getAnalyzedSentence("Das haben 
wir.")).length);
+    assertEquals(0, rule.match(langTool.getAnalyzedSentence("Das haben wir 
schon.")).length);
+    assertEquals(0, rule.match(langTool.getAnalyzedSentence("Das lesen sie 
doch sicher in einer Minute durch.")).length);
+    assertEquals(0, rule.match(langTool.getAnalyzedSentence("Das lesen Sie 
doch sicher in einer Minute durch!")).length);
+
+    // Source of the following examples: 
http://www.canoo.net/services/GermanSpelling/Amtlich/GrossKlein/pgf57-58.html
+    assertEquals(0, rule.match(langTool.getAnalyzedSentence("Das Lesen fällt 
mir schwer.")).length);
+    assertEquals(0, rule.match(langTool.getAnalyzedSentence("Sie hörten ein 
starkes Klopfen.")).length);
+    assertEquals(0, rule.match(langTool.getAnalyzedSentence("Wer erledigt das 
Fensterputzen?")).length);
+    assertEquals(0, rule.match(langTool.getAnalyzedSentence("Viele waren am 
Zustandekommen des Vertrages beteiligt.")).length);
+    assertEquals(0, rule.match(langTool.getAnalyzedSentence("Die Sache kam ins 
Stocken.")).length);
+    assertEquals(0, rule.match(langTool.getAnalyzedSentence("Das ist zum 
Lachen.")).length);
+    assertEquals(0, rule.match(langTool.getAnalyzedSentence("Euer Fernbleiben 
fiel uns auf.")).length);
+    assertEquals(0, rule.match(langTool.getAnalyzedSentence("Uns half nur noch 
lautes Rufen.")).length);
+    assertEquals(0, rule.match(langTool.getAnalyzedSentence("Die Mitbewohner 
begnügten sich mit Wegsehen und Schweigen.")).length);
+    assertEquals(0, rule.match(langTool.getAnalyzedSentence("Sie wollte auf 
Biegen und Brechen gewinnen.")).length);
+    assertEquals(0, rule.match(langTool.getAnalyzedSentence("Er klopfte mit 
Zittern und Zagen an.")).length);
+    assertEquals(0, rule.match(langTool.getAnalyzedSentence("Ich nehme die 
Tabletten auf Anraten meiner Ärztin.")).length);
+    assertEquals(0, rule.match(langTool.getAnalyzedSentence("Sie hat ihr Soll 
erfüllt.")).length);
+    assertEquals(0, rule.match(langTool.getAnalyzedSentence("Dies ist ein 
absolutes Muss.")).length);
+    assertEquals(0, rule.match(langTool.getAnalyzedSentence("Das Lesen fällt 
mir schwer.")).length);
+
     // incorrect sentences:
     assertEquals(1, rule.match(langTool.getAnalyzedSentence("Das fahren ist 
einfach.")).length);
     assertEquals(1, rule.match(langTool.getAnalyzedSentence("Denn das fahren 
ist einfach.")).length);
     assertEquals(1, rule.match(langTool.getAnalyzedSentence("Denn das laufen 
ist einfach.")).length);
     assertEquals(1, rule.match(langTool.getAnalyzedSentence("Denn das essen 
ist einfach.")).length);
     assertEquals(1, rule.match(langTool.getAnalyzedSentence("Denn das gehen 
ist einfach.")).length);
+    // TODO: detect all the cases not preceded with 'das'
   }
 
   public void testPhraseExceptions() throws IOException {

This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.


------------------------------------------------------------------------------
For Developers, A Lot Can Happen In A Second.
Boundary is the first to Know...and Tell You.
Monitor Your Applications in Ultra-Fine Resolution. Try it FREE!
http://p.sf.net/sfu/Boundary-d2dvs2
_______________________________________________
Languagetool-cvs mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/languagetool-cvs

Reply via email to