summaryrefslogtreecommitdiffstats
path: root/JLanguageTool/src/java/de/danielnaber/languagetool/rules/bitext/DifferentLengthRule.java
blob: 995772cde2dfee0ab82982ade82a8de14a79c923 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
/* LanguageTool, a natural language style checker 
 * Copyright (C) 2010 Marcin Miłkowski (www.languagetool.org)
 * 
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301
 * USA
 */
package de.danielnaber.languagetool.rules.bitext;

import java.io.IOException;

import de.danielnaber.languagetool.AnalyzedSentence;
import de.danielnaber.languagetool.AnalyzedTokenReadings;
import de.danielnaber.languagetool.rules.RuleMatch;

/**
 * Checks if the translation has a really different length than the source
 * (smaller than 30% or longer by 250%).
 * 
 * @author Marcin Miłkowski
 *
 */
public class DifferentLengthRule extends BitextRule {
  
  static final String MSG = "Source and target translation lengths are very different!";

  @Override
  public String getDescription() { 
    return "Check if translation length is similar to source length";
  }
  
  @Override
  public String getId() {
    return "TRANSLATION_LENGTH";
  }

  public String getMessage() {
    return MSG;
  }
  
  /**
   * This method makes no sense for bitext, return null?? 
   */
  @Override
  public RuleMatch[] match(AnalyzedSentence text) throws IOException {
    // TODO Auto-generated method stub
    return null;
  }

  @Override
  public RuleMatch[] match(AnalyzedSentence sourceText,
      AnalyzedSentence targetText) throws IOException {
   
    if (isLengthDifferent(
        getPureText(sourceText), getPureText(targetText))) {
      final RuleMatch[] rm = new RuleMatch[1];
      final AnalyzedTokenReadings[] tokens = targetText.getTokens();
      final int len = tokens[tokens.length - 1].getStartPos() + tokens[tokens.length - 1].getToken().length();
      rm[0] = new RuleMatch(this, 1, len,
      MSG);
      return rm;
    }
    return new RuleMatch[0];
  }
  
  static boolean isLengthDifferent(final String src, final String trg) {
    final double skew = (((double) src.length() / (double) trg.length()) * 100.00);
    return (skew > 250 || skew < 30);
   }
  
  private static String getPureText(AnalyzedSentence text) {
    final StringBuilder sb = new StringBuilder();
    for (AnalyzedTokenReadings token : text.getTokens()) {
      sb.append(token.getToken());
    }
    return sb.toString();
  }

  public void reset() {
  }

}