Author: nick
Date: Fri Sep 23 12:57:47 2011
New Revision: 1174719

URL: http://svn.apache.org/viewvc?rev=1174719&view=rev
Log:
TIKA-720 Add documentation for some of CharsetRecog_sbcs, and tweak the EBCDIC 
bit to avoid false matches for short snippets of HTML

Modified:
    
tika/trunk/tika-parsers/src/main/java/org/apache/tika/parser/txt/CharsetMatch.java
    
tika/trunk/tika-parsers/src/main/java/org/apache/tika/parser/txt/CharsetRecog_sbcs.java
    
tika/trunk/tika-parsers/src/test/java/org/apache/tika/parser/txt/TXTParserTest.java

Modified: 
tika/trunk/tika-parsers/src/main/java/org/apache/tika/parser/txt/CharsetMatch.java
URL: 
http://svn.apache.org/viewvc/tika/trunk/tika-parsers/src/main/java/org/apache/tika/parser/txt/CharsetMatch.java?rev=1174719&r1=1174718&r2=1174719&view=diff
==============================================================================
--- 
tika/trunk/tika-parsers/src/main/java/org/apache/tika/parser/txt/CharsetMatch.java
 (original)
+++ 
tika/trunk/tika-parsers/src/main/java/org/apache/tika/parser/txt/CharsetMatch.java
 Fri Sep 23 12:57:47 2011
@@ -282,4 +282,12 @@ public class CharsetMatch implements Com
     private InputStream         fInputStream = null;  // User's input stream, 
or null if the user
                                                       //   gave us a byte 
array.
 
+    public String toString() {
+       String s = "Match of " + fRecognizer.getName();
+       if(fRecognizer.getLanguage() != null) {
+          s += " in " + fRecognizer.getLanguage();
+       }
+       s += " with confidence " + fConfidence;
+       return s;
+    }
 }

Modified: 
tika/trunk/tika-parsers/src/main/java/org/apache/tika/parser/txt/CharsetRecog_sbcs.java
URL: 
http://svn.apache.org/viewvc/tika/trunk/tika-parsers/src/main/java/org/apache/tika/parser/txt/CharsetRecog_sbcs.java?rev=1174719&r1=1174718&r2=1174719&view=diff
==============================================================================
--- 
tika/trunk/tika-parsers/src/main/java/org/apache/tika/parser/txt/CharsetRecog_sbcs.java
 (original)
+++ 
tika/trunk/tika-parsers/src/main/java/org/apache/tika/parser/txt/CharsetRecog_sbcs.java
 Fri Sep 23 12:57:47 2011
@@ -13,6 +13,20 @@ import java.nio.ByteBuffer;
  * This class recognizes single-byte encodings. Because the encoding scheme is 
so
  * simple, language statistics are used to do the matching.
  * 
+ * The Recognizer works by first mapping from bytes in the encoding under test
+ *  into that Recognizer's ngram space. Normally this means performing a
+ *  lowercase, and excluding codepoints that don't correspond to numbers of
+ *  letters. (Accented letters may or may not be ignored or normalised, 
depending 
+ *  on the needs of the ngrams)
+ * Then, ngram analysis is run against the transformed text, and a confidence
+ *  is calculated.
+ * 
+ * For many of our Recognizers, we have one ngram set per language in each
+ *  encoding, and do a simultanious language+charset detection.
+ *  
+ * When adding new Recognizers, the easiest way is to byte map to an existing
+ *  encoding for which we have ngrams, excluding non text, and re-use the 
ngrams.
+ * 
  * @internal
  */
 abstract class CharsetRecog_sbcs extends CharsetRecognizer {
@@ -140,6 +154,10 @@ abstract class CharsetRecog_sbcs extends
                     }
                     
                     ignoreSpace = (mb == spaceChar);
+                } else if(mb == 0 && b != 0) {
+                   // Indicates an invalid character in the charset
+                   // Bump the ngram count up a bit to indicate uncertainty
+                   ngramCount += 4;
                 }
             }
             
@@ -181,38 +199,38 @@ abstract class CharsetRecog_sbcs extends
     abstract static class CharsetRecog_8859_1 extends CharsetRecog_sbcs
     {
         protected static byte[] byteMap = {
-            (byte) 0x20, (byte) 0x20, (byte) 0x20, (byte) 0x20, (byte) 0x20, 
(byte) 0x20, (byte) 0x20, (byte) 0x20, 
-            (byte) 0x20, (byte) 0x20, (byte) 0x20, (byte) 0x20, (byte) 0x20, 
(byte) 0x20, (byte) 0x20, (byte) 0x20, 
-            (byte) 0x20, (byte) 0x20, (byte) 0x20, (byte) 0x20, (byte) 0x20, 
(byte) 0x20, (byte) 0x20, (byte) 0x20, 
-            (byte) 0x20, (byte) 0x20, (byte) 0x20, (byte) 0x20, (byte) 0x20, 
(byte) 0x20, (byte) 0x20, (byte) 0x20, 
-            (byte) 0x20, (byte) 0x20, (byte) 0x20, (byte) 0x20, (byte) 0x20, 
(byte) 0x20, (byte) 0x20, (byte) 0x00, 
-            (byte) 0x20, (byte) 0x20, (byte) 0x20, (byte) 0x20, (byte) 0x20, 
(byte) 0x20, (byte) 0x20, (byte) 0x20, 
-            (byte) 0x20, (byte) 0x20, (byte) 0x20, (byte) 0x20, (byte) 0x20, 
(byte) 0x20, (byte) 0x20, (byte) 0x20, 
-            (byte) 0x20, (byte) 0x20, (byte) 0x20, (byte) 0x20, (byte) 0x20, 
(byte) 0x20, (byte) 0x20, (byte) 0x20, 
-            (byte) 0x20, (byte) 0x61, (byte) 0x62, (byte) 0x63, (byte) 0x64, 
(byte) 0x65, (byte) 0x66, (byte) 0x67, 
-            (byte) 0x68, (byte) 0x69, (byte) 0x6A, (byte) 0x6B, (byte) 0x6C, 
(byte) 0x6D, (byte) 0x6E, (byte) 0x6F, 
-            (byte) 0x70, (byte) 0x71, (byte) 0x72, (byte) 0x73, (byte) 0x74, 
(byte) 0x75, (byte) 0x76, (byte) 0x77, 
-            (byte) 0x78, (byte) 0x79, (byte) 0x7A, (byte) 0x20, (byte) 0x20, 
(byte) 0x20, (byte) 0x20, (byte) 0x20, 
-            (byte) 0x20, (byte) 0x61, (byte) 0x62, (byte) 0x63, (byte) 0x64, 
(byte) 0x65, (byte) 0x66, (byte) 0x67, 
-            (byte) 0x68, (byte) 0x69, (byte) 0x6A, (byte) 0x6B, (byte) 0x6C, 
(byte) 0x6D, (byte) 0x6E, (byte) 0x6F, 
-            (byte) 0x70, (byte) 0x71, (byte) 0x72, (byte) 0x73, (byte) 0x74, 
(byte) 0x75, (byte) 0x76, (byte) 0x77, 
-            (byte) 0x78, (byte) 0x79, (byte) 0x7A, (byte) 0x20, (byte) 0x20, 
(byte) 0x20, (byte) 0x20, (byte) 0x20, 
-            (byte) 0x20, (byte) 0x20, (byte) 0x20, (byte) 0x20, (byte) 0x20, 
(byte) 0x20, (byte) 0x20, (byte) 0x20, 
-            (byte) 0x20, (byte) 0x20, (byte) 0x20, (byte) 0x20, (byte) 0x20, 
(byte) 0x20, (byte) 0x20, (byte) 0x20, 
-            (byte) 0x20, (byte) 0x20, (byte) 0x20, (byte) 0x20, (byte) 0x20, 
(byte) 0x20, (byte) 0x20, (byte) 0x20, 
-            (byte) 0x20, (byte) 0x20, (byte) 0x20, (byte) 0x20, (byte) 0x20, 
(byte) 0x20, (byte) 0x20, (byte) 0x20, 
-            (byte) 0x20, (byte) 0x20, (byte) 0x20, (byte) 0x20, (byte) 0x20, 
(byte) 0x20, (byte) 0x20, (byte) 0x20, 
-            (byte) 0x20, (byte) 0x20, (byte) 0xAA, (byte) 0x20, (byte) 0x20, 
(byte) 0x20, (byte) 0x20, (byte) 0x20, 
-            (byte) 0x20, (byte) 0x20, (byte) 0x20, (byte) 0x20, (byte) 0x20, 
(byte) 0xB5, (byte) 0x20, (byte) 0x20, 
-            (byte) 0x20, (byte) 0x20, (byte) 0xBA, (byte) 0x20, (byte) 0x20, 
(byte) 0x20, (byte) 0x20, (byte) 0x20, 
-            (byte) 0xE0, (byte) 0xE1, (byte) 0xE2, (byte) 0xE3, (byte) 0xE4, 
(byte) 0xE5, (byte) 0xE6, (byte) 0xE7, 
-            (byte) 0xE8, (byte) 0xE9, (byte) 0xEA, (byte) 0xEB, (byte) 0xEC, 
(byte) 0xED, (byte) 0xEE, (byte) 0xEF, 
-            (byte) 0xF0, (byte) 0xF1, (byte) 0xF2, (byte) 0xF3, (byte) 0xF4, 
(byte) 0xF5, (byte) 0xF6, (byte) 0x20, 
-            (byte) 0xF8, (byte) 0xF9, (byte) 0xFA, (byte) 0xFB, (byte) 0xFC, 
(byte) 0xFD, (byte) 0xFE, (byte) 0xDF, 
-            (byte) 0xE0, (byte) 0xE1, (byte) 0xE2, (byte) 0xE3, (byte) 0xE4, 
(byte) 0xE5, (byte) 0xE6, (byte) 0xE7, 
-            (byte) 0xE8, (byte) 0xE9, (byte) 0xEA, (byte) 0xEB, (byte) 0xEC, 
(byte) 0xED, (byte) 0xEE, (byte) 0xEF, 
-            (byte) 0xF0, (byte) 0xF1, (byte) 0xF2, (byte) 0xF3, (byte) 0xF4, 
(byte) 0xF5, (byte) 0xF6, (byte) 0x20, 
-            (byte) 0xF8, (byte) 0xF9, (byte) 0xFA, (byte) 0xFB, (byte) 0xFC, 
(byte) 0xFD, (byte) 0xFE, (byte) 0xFF, 
+/* 0x00-0x07 */ (byte) 0x20, (byte) 0x20, (byte) 0x20, (byte) 0x20, (byte) 
0x20, (byte) 0x20, (byte) 0x20, (byte) 0x20, 
+/* 0x08-0x0f */ (byte) 0x20, (byte) 0x20, (byte) 0x20, (byte) 0x20, (byte) 
0x20, (byte) 0x20, (byte) 0x20, (byte) 0x20, 
+/* 0x10-0x17 */ (byte) 0x20, (byte) 0x20, (byte) 0x20, (byte) 0x20, (byte) 
0x20, (byte) 0x20, (byte) 0x20, (byte) 0x20, 
+/* 0x18-0x1f */ (byte) 0x20, (byte) 0x20, (byte) 0x20, (byte) 0x20, (byte) 
0x20, (byte) 0x20, (byte) 0x20, (byte) 0x20, 
+/* 0x20-0x27 */ (byte) 0x20, (byte) 0x20, (byte) 0x20, (byte) 0x20, (byte) 
0x20, (byte) 0x20, (byte) 0x20, (byte) 0x00, 
+/* 0x28-0x2f */ (byte) 0x20, (byte) 0x20, (byte) 0x20, (byte) 0x20, (byte) 
0x20, (byte) 0x20, (byte) 0x20, (byte) 0x20, 
+/* 0x30-0x37 */ (byte) 0x30, (byte) 0x31, (byte) 0x32, (byte) 0x33, (byte) 
0x34, (byte) 0x35, (byte) 0x36, (byte) 0x37, 
+/* 0x38-0x3f */ (byte) 0x38, (byte) 0x39, (byte) 0x40, (byte) 0x20, (byte) 
0x20, (byte) 0x20, (byte) 0x20, (byte) 0x20, 
+/* 0x40-0x47 */ (byte) 0x20, (byte) 0x61, (byte) 0x62, (byte) 0x63, (byte) 
0x64, (byte) 0x65, (byte) 0x66, (byte) 0x67, 
+/* 0x48-0x4f */ (byte) 0x68, (byte) 0x69, (byte) 0x6A, (byte) 0x6B, (byte) 
0x6C, (byte) 0x6D, (byte) 0x6E, (byte) 0x6F, 
+/* 0x50-0x57 */ (byte) 0x70, (byte) 0x71, (byte) 0x72, (byte) 0x73, (byte) 
0x74, (byte) 0x75, (byte) 0x76, (byte) 0x77, 
+/* 0x58-0x0f */ (byte) 0x78, (byte) 0x79, (byte) 0x7A, (byte) 0x20, (byte) 
0x20, (byte) 0x20, (byte) 0x20, (byte) 0x20, 
+/* 0x60-0x67 */ (byte) 0x20, (byte) 0x61, (byte) 0x62, (byte) 0x63, (byte) 
0x64, (byte) 0x65, (byte) 0x66, (byte) 0x67, 
+/* 0x68-0x6f */ (byte) 0x68, (byte) 0x69, (byte) 0x6A, (byte) 0x6B, (byte) 
0x6C, (byte) 0x6D, (byte) 0x6E, (byte) 0x6F, 
+/* 0x70-0x77 */ (byte) 0x70, (byte) 0x71, (byte) 0x72, (byte) 0x73, (byte) 
0x74, (byte) 0x75, (byte) 0x76, (byte) 0x77, 
+/* 0x78-0x7f */ (byte) 0x78, (byte) 0x79, (byte) 0x7A, (byte) 0x20, (byte) 
0x20, (byte) 0x20, (byte) 0x20, (byte) 0x20, 
+/* 0x80-0x87 */ (byte) 0x20, (byte) 0x20, (byte) 0x20, (byte) 0x20, (byte) 
0x20, (byte) 0x20, (byte) 0x20, (byte) 0x20, 
+/* 0x88-0x8f */ (byte) 0x20, (byte) 0x20, (byte) 0x20, (byte) 0x20, (byte) 
0x20, (byte) 0x20, (byte) 0x20, (byte) 0x20, 
+/* 0x90-0x97 */ (byte) 0x20, (byte) 0x20, (byte) 0x20, (byte) 0x20, (byte) 
0x20, (byte) 0x20, (byte) 0x20, (byte) 0x20, 
+/* 0x98-0x9f */ (byte) 0x20, (byte) 0x20, (byte) 0x20, (byte) 0x20, (byte) 
0x20, (byte) 0x20, (byte) 0x20, (byte) 0x20, 
+/* 0xa0-0xa7 */ (byte) 0x20, (byte) 0x20, (byte) 0x20, (byte) 0x20, (byte) 
0x20, (byte) 0x20, (byte) 0x20, (byte) 0x20, 
+/* 0xa8-0xaf */ (byte) 0x20, (byte) 0x20, (byte) 0xAA, (byte) 0x20, (byte) 
0x20, (byte) 0x20, (byte) 0x20, (byte) 0x20, 
+/* 0xb0-0xb7 */ (byte) 0x20, (byte) 0x20, (byte) 0x20, (byte) 0x20, (byte) 
0x20, (byte) 0xB5, (byte) 0x20, (byte) 0x20, 
+/* 0xb8-0xbf */ (byte) 0x20, (byte) 0x20, (byte) 0xBA, (byte) 0x20, (byte) 
0x20, (byte) 0x20, (byte) 0x20, (byte) 0x20, 
+/* 0xc0-0xc7 */ (byte) 0xE0, (byte) 0xE1, (byte) 0xE2, (byte) 0xE3, (byte) 
0xE4, (byte) 0xE5, (byte) 0xE6, (byte) 0xE7, 
+/* 0xc8-0xcf */ (byte) 0xE8, (byte) 0xE9, (byte) 0xEA, (byte) 0xEB, (byte) 
0xEC, (byte) 0xED, (byte) 0xEE, (byte) 0xEF, 
+/* 0xd0-0xd7 */ (byte) 0xF0, (byte) 0xF1, (byte) 0xF2, (byte) 0xF3, (byte) 
0xF4, (byte) 0xF5, (byte) 0xF6, (byte) 0x20, 
+/* 0xd8-0xdf */ (byte) 0xF8, (byte) 0xF9, (byte) 0xFA, (byte) 0xFB, (byte) 
0xFC, (byte) 0xFD, (byte) 0xFE, (byte) 0xDF, 
+/* 0xe0-0xe7 */ (byte) 0xE0, (byte) 0xE1, (byte) 0xE2, (byte) 0xE3, (byte) 
0xE4, (byte) 0xE5, (byte) 0xE6, (byte) 0xE7, 
+/* 0xe8-0xef */ (byte) 0xE8, (byte) 0xE9, (byte) 0xEA, (byte) 0xEB, (byte) 
0xEC, (byte) 0xED, (byte) 0xEE, (byte) 0xEF, 
+/* 0xf0-0xf7 */ (byte) 0xF0, (byte) 0xF1, (byte) 0xF2, (byte) 0xF3, (byte) 
0xF4, (byte) 0xF5, (byte) 0xF6, (byte) 0x20, 
+/* 0xf8-0xff */ (byte) 0xF8, (byte) 0xF9, (byte) 0xFA, (byte) 0xFB, (byte) 
0xFC, (byte) 0xFD, (byte) 0xFE, (byte) 0xFF, 
         };
 
         public String getName()
@@ -1341,15 +1359,16 @@ abstract class CharsetRecog_sbcs extends
         // This maps EBCDIC 500 codepoints onto either space (not of 
interest), or a lower
         //  case ISO_8859_1 number/letter/accented-letter codepoint for ngram 
matching
         // Because we map to ISO_8859_1, we can re-use the ngrams from those 
detectors
+        // To avoid mis-detection, we skip many of the control characters in 
the 0x00-0x3f range 
         protected static byte[] byteMap = {
-/* 0x00-0x07 */ (byte)0x20, (byte)0x20, (byte)0x20, (byte)0x20, (byte)0x20, 
(byte)0x20, (byte)0x20, (byte)0x20,
+/* 0x00-0x07 */ (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, 
(byte)0x00, (byte)0x00, (byte)0x00,
 /* 0x08-0x0f */ (byte)0x20, (byte)0x20, (byte)0x20, (byte)0x20, (byte)0x20, 
(byte)0x20, (byte)0x20, (byte)0x20,
 /* 0x10-0x17 */ (byte)0x20, (byte)0x20, (byte)0x20, (byte)0x20, (byte)0x20, 
(byte)0x20, (byte)0x20, (byte)0x20,
 /* 0x18-0x1f */ (byte)0x20, (byte)0x20, (byte)0x20, (byte)0x20, (byte)0x20, 
(byte)0x20, (byte)0x20, (byte)0x20,
 /* 0x20-0x27 */ (byte)0x20, (byte)0x20, (byte)0x20, (byte)0x20, (byte)0x20, 
(byte)0x20, (byte)0x20, (byte)0x20,
-/* 0x28-0x2f */ (byte)0x20, (byte)0x20, (byte)0x20, (byte)0x20, (byte)0x20, 
(byte)0x20, (byte)0x20, (byte)0x20,
-/* 0x30-0x37 */ (byte)0x20, (byte)0x20, (byte)0x20, (byte)0x20, (byte)0x20, 
(byte)0x20, (byte)0x20, (byte)0x20,
-/* 0x38-0x3f */ (byte)0x20, (byte)0x20, (byte)0x20, (byte)0x20, (byte)0x20, 
(byte)0x20, (byte)0x20, (byte)0x20,
+/* 0x28-0x2f */ (byte)0x20, (byte)0x20, (byte)0x20, (byte)0x20, (byte)0x20, 
(byte)0x20, (byte)0x00, (byte)0x00,
+/* 0x30-0x37 */ (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, 
(byte)0x00, (byte)0x00, (byte)0x00,
+/* 0x38-0x3f */ (byte)0x20, (byte)0x20, (byte)0x20, (byte)0x20, (byte)0x00, 
(byte)0x00, (byte)0x00, (byte)0x00,
 /* 0x40-0x47 */ (byte)0x20, (byte)0x20, (byte)0xe2, (byte)0xe4, (byte)0xe0, 
(byte)0xe1, (byte)0xe3, (byte)0xe5,
 /* 0x48-0x4f */ (byte)0xe7, (byte)0xf1, (byte)0x20, (byte)0x20, (byte)0x20, 
(byte)0x20, (byte)0x20, (byte)0x20,
 /* 0x50-0x57 */ (byte)0x20, (byte)0xe9, (byte)0xea, (byte)0xeb, (byte)0xe8, 
(byte)0xed, (byte)0xee, (byte)0xef,

Modified: 
tika/trunk/tika-parsers/src/test/java/org/apache/tika/parser/txt/TXTParserTest.java
URL: 
http://svn.apache.org/viewvc/tika/trunk/tika-parsers/src/test/java/org/apache/tika/parser/txt/TXTParserTest.java?rev=1174719&r1=1174718&r2=1174719&view=diff
==============================================================================
--- 
tika/trunk/tika-parsers/src/test/java/org/apache/tika/parser/txt/TXTParserTest.java
 (original)
+++ 
tika/trunk/tika-parsers/src/test/java/org/apache/tika/parser/txt/TXTParserTest.java
 Fri Sep 23 12:57:47 2011
@@ -58,7 +58,7 @@ public class TXTParserTest extends TestC
         assertTrue(content.contains("autodetection"));
         assertTrue(content.contains("stream"));
     }
-
+    
     public void testUTF8Text() throws Exception {
         String text = 
"I\u00F1t\u00EBrn\u00E2ti\u00F4n\u00E0liz\u00E6ti\u00F8n";
 
@@ -202,6 +202,17 @@ public class TXTParserTest extends TestC
 
         assertEquals("text/plain", metadata.get(Metadata.CONTENT_TYPE));
         assertEquals("IBM500", metadata.get(Metadata.CONTENT_ENCODING));
+        
+        // Additional check that it isn't too eager on short blocks of text
+        metadata = new Metadata();
+        writer = new StringWriter();
+        parser.parse(
+                new ByteArrayInputStream("<html><body>hello 
world</body></html>".getBytes("UTF-8")),
+                new WriteOutContentHandler(writer),
+                metadata,
+                new ParseContext());
+
+        assertNotSame("IBM500", metadata.get(Metadata.CONTENT_ENCODING));
     }
 
 }


Reply via email to