2016-12-14 14 views
0

У меня есть текстовый файл, который содержит следующую выборку UTF-8 текст:Обработка UTF-8 символов в текстовом файле в Java

ኣእምሮኣዊ/ADJ ጥዕና/N ።/PUN 

ቅድሚ/PRE ብዙሕ/ADJ ዓመታት/N “/PUN ኣእምሮኣዊ/ADJ ስንክልና/N ብጋኔን/N ወይ/CON እከይ/ADJ መናፍስቲ/N ኢዩ/V_AUX ዝመጽእ/V_REL “/PUN ዝብል/V_REL ግጉይ/ADJ ኣመለኻኽታ/N ነይሩ/V_GER ።/PUN 

ከም/CON ውጺኢቱ/N ድማ/CON ኣእምሮኣዊ/ADJ ስንክልና/N ዘጋጠሞም/ADJ ኣባላት/N ናይ/PRE ሓደ/NUM ሕብረተ-ሰብ/N ብኣሰቃቕን/ADJ ኢሰብኣውን/ADJ ኣገባብ/N ይተሓዙ/V_IMF ነይሮም/V_AUX ።/PUN 

реализация Lingpipe из HMM POS Tagger для Brown Корпус:

BrownCorpus класс читает архивный POS Corpus следующим образом:

public class BrownPosCorpus implements PosCorpus { 

    private final File mBrownZipFile; 

    public BrownPosCorpus(File brownZipFile) { 
    mBrownZipFile = brownZipFile; 
    } 

    public Parser<ObjectHandler<Tagging<String>>> parser() { 
    return new BrownPosParser(); 
    } 

    public Iterator<InputSource> sourceIterator() throws IOException { 
    return new BrownSourceIterator(mBrownZipFile); 
    } 

    static class BrownSourceIterator extends Iterators.Buffered<InputSource> { 
    private ZipInputStream mZipIn = null; 
    public BrownSourceIterator(File brownZipFile) throws IOException { 
     FileInputStream fileIn = new FileInputStream(brownZipFile); 
     mZipIn = new ZipInputStream(fileIn); 
    } 
    public InputSource bufferNext() { 
     ZipEntry entry = null; 
     try { 
     while ((entry = mZipIn.getNextEntry()) != null) { 
      if (entry.isDirectory()) continue; 
      String name = entry.getName(); 
      if (name.equals("brown/CONTENTS") 
      || name.equals("brown/README")) continue; 
      return new InputSource(mZipIn); 
     } 
     } catch (IOException e) { 
     // ignore and close and return null 
     } 
     Streams.closeQuietly(mZipIn); 
     return null;  
    } 
    } 
} 

класс BrownPosParser.java разбирает архивный коричневый поз корпус следующим образом:

public class BrownPosParser 
    extends StringParser<ObjectHandler<Tagging<String>>> { 

    @Override 
    public void parseString(char[] cs, int start, int end) { 
     String in = new String(cs,start,end-start); 
     String[] sentences = in.split("\n"); 
     for (int i = 0; i < sentences.length; ++i) 
      if (!Strings.allWhitespace(sentences[i])) 
       processSentence(sentences[i]); 
    } 

    public String normalizeTag(String rawTag) { 
     String tag = rawTag; 
     String startTag = tag; 
     // remove plus, default to first 
     int splitIndex = tag.indexOf('+'); 
     if (splitIndex >= 0) 
      tag = tag.substring(0,splitIndex); 

     int lastHyphen = tag.lastIndexOf('-'); 
     if (lastHyphen >= 0) { 
      String first = tag.substring(0,lastHyphen); 
      String suffix = tag.substring(lastHyphen+1); 
      if (suffix.equalsIgnoreCase("HL") 
       || suffix.equalsIgnoreCase("TL") 
       || suffix.equalsIgnoreCase("NC")) { 
       tag = first; 
      } 
     } 

     int firstHyphen = tag.indexOf('-'); 
     if (firstHyphen > 0) { 
      String prefix = tag.substring(0,firstHyphen); 
      String rest = tag.substring(firstHyphen+1); 
      if (prefix.equalsIgnoreCase("FW") 
       || prefix.equalsIgnoreCase("NC") 
       || prefix.equalsIgnoreCase("NP")) 
       tag = rest; 
     } 

     // neg last, and only if not whole thing 
     int negIndex = tag.indexOf('*'); 
     if (negIndex > 0) { 
      if (negIndex == tag.length()-1) 
       tag = tag.substring(0,negIndex); 
      else 
       tag = tag.substring(0,negIndex) 
        + tag.substring(negIndex+1); 
     } 
     // multiple runs to normalize 
     return tag.equals(startTag) ? tag : normalizeTag(tag); 
    } 

    private void processSentence(String sentence) { 
     String[] tagTokenPairs = sentence.split(" "); 
     List<String> tokenList = new ArrayList<String>(tagTokenPairs.length); 
     List<String> tagList = new ArrayList<String>(tagTokenPairs.length); 

     for (String pair : tagTokenPairs) { 
      int j = pair.lastIndexOf('/'); 
      String token = pair.substring(0,j); 
      String tag = normalizeTag(pair.substring(j+1)); 
      tokenList.add(token); 
      tagList.add(tag); 
     } 
     Tagging<String> tagging 
      = new Tagging<String>(tokenList,tagList); 
     getHandler().handle(tagging); 
    } 
} 

Проблема заключается в следующем ошибка произошла при разборе UTF-8 корпус: Ключевая проблема заключается в BrownPosParser.java:

java.lang.StringIndexOutOfBoundsException: String index out of range: -1 

[java]  at java.lang.String.substring(String.java:1967) 

[java]  at BrownPosParser.processSentence(BrownPosParser.java:72) 

трассировку стека приводится ниже:

C:\Lingpipe-Ver-4.1.2\Experiments\NER\posTags>ant eval-brown 
Buildfile: C:\Lingpipe-Ver-4.1.2\Experiments\NER\posTags\build.xml 

compile: 

[javac] Compiling 11 source files to C:\Lingpipe-Ver-4.1.2\Experiments\NER\posTags\build\classes 


eval-brown: 

[java] COMMAND PARAMETERS: 

[java] Sent eval rate=5 

[java] Toks before eval=1000000 

[java] Max n-best eval=32 

[java] Max n-gram=8 

[java] Num chars=128 

[java] Lambda factor=8.0 

[java] Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: -1 

[java]  at java.lang.String.substring(String.java:1967) 

[java]  at BrownPosParser.processSentence(BrownPosParser.java:72) 

[java]  at BrownPosParser.parseString(BrownPosParser.java:20) 

[java]  at com.aliasi.corpus.StringParser.parse(StringParser.java:71) 

[java]  at EvaluatePos.parseCorpus(EvaluatePos.java:123) 

[java]  at EvaluatePos.run(EvaluatePos.java:75) 

[java]  at EvaluatePos.main(EvaluatePos.java:183) 

[java] Java Result: 1 

Какую часть кода следует изменить для правильного анализа UTF-8 pos corpus?

Любая помощь очень ценится.

+0

В чем именно ваш вопрос? – pringi

+0

И вопрос в том, что? Какая связь между вашим текстовым файлом и двумя классами? Что не так, чего вы ожидаете? – RealSkeptic

+0

Это хороший пример сценария Ge'ez (используется в Эфиопии). Но я не вижу никаких вопросов в вашем посте. Что вы хотите узнать? –

ответ

0

Не уверен, что он решит вашу проблему; но установить Изменение Charset строку:

mZipIn = new ZipInputStream(fileIn); 

к

mZipIn = new ZipInputStream(new BufferedInputStream(fileIn), Charset.forName("UTF-8")); 
+0

Проверьте также, есть ли в вашем файле пустые строки. p.s Kemey? – Eritrean

+0

Спасибо за ваш ответ и комментарий @ Эритреан - Эртрави Хоуи (Эри Бра). Я проверю это прямо сейчас. – user3359138

0

Найти и устранить последовательные пробела, пробел в начале или в конце строки и убедитесь, что все маркеры имеют/в корпусе.

Это работает.