2017-02-16 1 views
0

Für eine Datei, die Sätze wie diese hat: (. Oo)Parsing mehrzeilige Sätze aus einer Datei regex

He O O 
does O O 
, O O 
however O O 
, O O 
have B-MWE_LVC B-MWE_LVC_VERB 
an I-MWE_LVC O 
affair I-MWE_LVC B-MWE_LVC_NOUN 
with O O 
Clotho B-NE_PER O 
, O O 
the O O 
youngest O O 
aspect O O 
of O O 
Fate B-NE_MISC B-NE_MISC_SB 
. O O 

This O O 
is O O 
both O O 
awkward O O 
and O O 
intriguing O O 
to O O 
Norton B-NE_PER O 
since O O 
her O O 
past O O 
is O O 
his O O 
future B-SENT_BOUND O 
. O O 

I basierend jeden Satz extrahieren möchten auf dem RegexMuster, die das Ende eines jeden Satzes markiert . Ich habe einige Code unten writen dies zu analysieren, aber einen Fehler

Exception in thread "main" java.lang.StringIndexOutOfBoundsException erhalten: String-Index außerhalb des Bereichs: -1 bei java.lang.String.substring (Unbekannt Quelle) bei com.gyan.siapp.coref.resolve.test.main (test.java:46)

Leitung 46 ist: builder.append (strLine.substring (0, strLine.indexOf (‘ ')));

Mein Code:

public static void main(String args[]) { 
    StringBuilder builder = new StringBuilder(); 
    String folderPath ="C:/Users/Desktop/Data_And_Sentences/wiki50.iob"; 

    Scanner file = null; 
    try 
    { 
     file = new Scanner(new File(folderPath)); 
    } 
    catch (FileNotFoundException e) 
    { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

     List<String> sentences = new ArrayList<String>(); 

     String strLine; 

     //Read File Line By Line 

    Pattern matchExp = Pattern.compile ("(.*?)(. O O)"); 
     Matcher m = matchExp.matcher(strLine); 

     while (file.hasNext()) 
     { 

      while (!m.find()){ 
       builder.append(strLine.substring(0, strLine.indexOf(' '))); 
       builder.append(" "); 
      } 

      sentences.add(builder.toString()); 

      } 
      System.out.println(sentences); 
      //return sentences; 
    } 

Ist das der richtige Ansatz? Sollte ich eine andere Struktur als einen String Builder verwenden, um genügend Speicherplatz zu gewährleisten? Meine Vermutung ist, dass die gesamte Datei als eine Zeichenfolge gelesen wird, daher bekomme ich diese Ausnahme. Ist das richtig?

+1

Nicht das Muster jedes Mal neu kompilieren, Sie müssen das nur einmal außerhalb der Schleife tun.Wenn Sie Hilfe benötigen, können Sie den vollständigen Stack-Trace bereitstellen und angeben, welche Anweisung in Ihrem Code die Ausnahme auslöst. –

+0

@JimGarrison Bearbeitet Code nach Ihrer Empfehlung und haben die gesamte Fehlerbeschreibung zur Verfügung gestellt. Vielen Dank. – serendipity

+0

Wollten Sie den Inhalt an 'builder' anhängen, wenn es eine Übereinstimmung gibt? Entfernen Sie '!' Dann, 'while (m.find()) {' –

Antwort

-2

Ich weiß nicht, ob dies Ihnen helfen wird. Der folgende Code erzeugt eine Ausgabe als -

[Er, Er tut, Er tut,, Er tut es jedoch, Er tut es jedoch, Er tut es jedoch, Er tut es jedoch, Er tut jedoch mit, Er tut es jedoch mit, Er tut es jedoch mit, Er tut es jedoch mit dem, Er tut es jedoch mit dem Jüngsten, Er tut es jedoch mit dem Jüngsten Englisch: www.mjfriendship.de/en/index.php?op...39&Itemid=32 Er macht jedoch mit dem jüngsten Aspekt von, Er tut jedoch, mit, der jüngste Aspekt von, Er tut jedoch, mit, der jüngste Aspekt von. Er macht jedoch mit dem jüngsten Aspekt von. Er macht jedoch mit dem jüngsten Aspekt von. Dies tut er jedoch mit dem jüngsten Aspekt von. Dies ist, aber er tut, mit, der jüngste Aspekt von. Dies ist beides, Er tut es jedoch mit dem jüngsten Aspekt von. Das ist sowohl peinlich, Er macht jedoch mit dem jüngsten Aspekt von. Das ist sowohl peinlich als auch, aber er macht mit dem jüngsten Aspekt von. Das ist sowohl peinlich als auch faszinierend, Er macht jedoch mit dem jüngsten Aspekt von. Das ist sowohl unangenehm als auch faszinierend, aber er macht mit dem jüngsten Aspekt von. Das ist sowohl unangenehm als auch faszinierend, aber er macht mit dem jüngsten Aspekt von. Dies ist sowohl unangenehm als auch faszinierend, da er jedoch den jüngsten Aspekt von. Das ist sowohl unangenehm als auch faszinierend für sie, er macht jedoch mit dem jüngsten Aspekt von. Dies ist sowohl unangenehm als auch faszinierend seit ihrer Vergangenheit. Er tut dies jedoch mit dem jüngsten Aspekt von. Dies ist sowohl unangenehm als auch faszinierend, da ihre Vergangenheit mit dem jüngsten Aspekt von. Dies ist sowohl unangenehm als auch faszinierend, da ihre Vergangenheit seine ist. Er tut dies jedoch mit dem jüngsten Aspekt von. Dies ist sowohl unangenehm als auch faszinierend, da ihre Vergangenheit seine ist. Er tut dies jedoch mit dem jüngsten Aspekt von. Dies ist sowohl unangenehm als auch faszinierend, da ihre Vergangenheit seine ist.

]
<code> 
    public static void main(String args[]) { 
     StringBuilder builder = new StringBuilder(); 
     String folderPath ="C:/Users/Desktop/Data_And_Sentences/wiki50.iob"; 

     Scanner file = null; 
     try 
     { 
      file = new Scanner(new File(folderPath)); 
     } 
     catch (FileNotFoundException e) 
     { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     List<String> sentences = new ArrayList<String>(); 

     String strLine; 
     //String sentence = ""; 
     //Read File Line By Line 
     Pattern matchExp = Pattern.compile ("\\.* O O"); 
     while (file.hasNext()) 
     { 

      strLine = file.nextLine(); 
      System.out.println(strLine); 
      Matcher m = matchExp.matcher(strLine); 
      if(m.find()) { 
       System.out.println(strLine.substring(0, strLine.indexOf(" "))); 
       builder.append(strLine.substring(0, strLine.indexOf(" "))); 
       builder.append(" "); 
      } 
     } 
     System.out.println(sentences); 
     System.out.println(builder.toString()); 
     //return sentences; 
    } 
</code> 
+1

Bitte posten Sie keine Antwort als Antwort. Der Sinn von StackOverflow besteht darin, als Repository für _future_ reader zu dienen. Eine falsche Vermutung tut niemandem gut. –

0

Zu allererst Scanner.next() standardmäßig Funde und gibt die nächste vollständige Token dividiert durch „“ (Leerzeichen). Daher enthält strLine kein Leerzeichen, und strLine.indexOf ('') gibt -1 zurück und verursacht eine Ausnahme. Sie sollten die Datei Zeile für Zeile in eine Zeichenfolge lesen. Dann teile sie nach deinem Muster. \ n

StringBuilder input = new StringBuilder(); 
    while(file.hasNext()) { 
     input.append(file.nextLine()); 
    } 
    String[] sentences = input.toString().split("\\.* O O"); 
+0

Das hilft mir nicht wirklich, da ich nur das erste Wort jeder Zeile einfügen und einen Satz erstellen möchte. Ich möchte nicht, dass die zusätzlichen Tags und O O Teil meiner Ausgabe sind. Das ist das Ergebnis, nach dem ich suche. "Er hat jedoch eine Affäre mit Klotho, dem jüngsten Aspekt des Schicksals. Nächster Satz ......" – serendipity