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