Wortpaare in Texten erkennen

Status
Nicht offen für weitere Antworten.

kognitio

Aktives Mitglied
Hallo,
ich möchte aus Texten Wortpaare erkennen und herausschreiben. Also, wenn in einem Text steht "new york", dann soll dies auch als solches erkannt werden.
Bis jetzt habe ich folgende Idee.
Ich gehe durch einen Text hindurch und lese die Wort einzeln in eine TreeMap ein. Danach wird der text wieder eingelesen und jedes wort in der TreeMap wird mit den Worten des Textes verglichen. Wenn er eines findet, dann soll es zusammen mit dem nächsten Wort als "einen" String zusammennehmen und erneut in eine TreeMap einlesen.
Am Ende dann einfach alle "keys" auslesen, deren "values" größer ist als 2 oder 3.
Also im Prinzip, wenn in einem Text steht:" New York has a new opinion about ...", dann soll das Programm, wenn es "new" vergleicht "new york" und "new opinion" als einen String zusammenpacken.
So ist der Plan, aber ich habe Probleme, mit dem zweiten einlesen in die TreeMap, da ich nicht weiß, wie er es finden soll und dann wissen soll, dass er das nächste Wort mit dazu packen soll.
Der Code sieht bis jetzt so aus:
Code:
public class coll
{
        public static void main(String [] args)
                throws Exception
        {
                BufferedReader in = new BufferedReader(new FileReader("test.txt"));
                BufferedWriter raus = new BufferedWriter(new FileWriter("Gesamt.txt"));
                String rein;
                String wort;
                TreeMap zusammen = new TreeMap();
                TreeMap word = new TreeMap();
                while ((rein=in.readLine())!=null)
                {
                        StringTokenizer st = new StringTokenizer(rein);
                        while (st.hasMoreTokens())
                        {
                                wort = st.nextToken();
                                word.put(wort, wort);
                        }
                }


                Set set = word.entrySet();
                for(Iterator iter = set.iterator(); iter.hasNext();)
                {
                        Map.Entry entry = (Map.Entry) iter.next();
                        wort = (String) entry.getKey();
                        {
                                while ((rein=in.readLine())!=null)
                                {
                                        StringTokenizer st = new StringTokenizer(rein);
                                        while (st.hasMoreTokens())
                                        {
                                                String neu;
                                                neu = st.nextToken();
                                                if (wort.matches(neu))              //das hier istr natürlich mehr oder weniger unsinn, aber ich weiß nicht, wie anders...
                                                                                              //hier muss ich die Wort zusammenlegen und erneut einlesen, aber wie...?
                                                {
                                                        raus.write(wort);
                                                        raus.flush();
                                                        raus.newLine();
                                                }
                                        }
                                }               
                        }
                }

        }
}

wenn jemand eine Idee hat, wäre ich dankbar ...
P.S.: Der oben beschriebene Weg fiel mir heute ein, aber vielleicht gibt es auch einen viel geeigneteren Weg, also, wenn jemand einen weiß ...
 
ehrlich gesagt versteh ich nicht ganz was du machen willst...
was soll gezählt werden bzw. was soll zusammengefügt werden ??
 
ehrlich gesagt was das Ganze soll ?!

Du speicherst dir alle Wörter die in einem Text vorkeommen in einer Map - was als key, was als value...
danach gehst du nochmal den text durch und suchst für jedes gespeicherte Wort ein Paar - was speicherst du dann und was zählst du ?
 
ok:
zuerst speichere ich alles in einer Map, um eine Wortliste zu erstellen, da ich danach nur den "key" auslese, habe ich jedes Wort das vorkommt genau "einmal".
danach gehe ich nocheinmal duch den text und (jetzt kommt der teil den ich nicht hinbekomme) lese das erste wort ein und vergleich es mit dem ersten eintrag aus der map. ist der erste eintrag aus der map identlisch mit der der wortliste, wenn ja, nimm das nächste wort dazu (also das zweit) und speichere dieses paar in einer neuen map. danach gehe zum zweiten wort und schau, ob es mit dem ersten eintrag aus der Map identlisch ist, wen ja usw., wenn nein, gehe zum drittem...
das ganze mit einem beispiel
der text:
Code:
new york is happy about the new statue
das erste wort in der treemap ist dann
Code:
about

und dann soll fogendes geschehen:
ist "about" = "new".... nein, also weiter zum nächste:
ist "about" = "york"... nein, usw..... bis
ist "about" = "about", ja, dann speichere in einer neuen Map "about + the" als einen key-eintrag.
dann weiter:
ist "about" = "the" ... nein usw...

ist zwar immer noch ein wenig konfus, aber verständlicher, oder?

dann gehe ich nocheinnmal durch den text und zähle die wortpaare, wie oft sie vorkommen, und schreibe sie heraus, wenn sie öfters, als 2 o. 3 mal vorkommen.
Thats's the idea.
 
ok - verstanden (mit was man sich so alles die zeit vertreiben kann *g*)

als erstes würde ich beim erstenmal keine Map nehmen - du liest jedes Wort ein und speicherst es - ich sehe da keine key - value beziehung...

Ich würde da ein Set nehmen (z.b. HashSet da Ordnung egal ist) - wenn du willst dass jedes Wort nur einmal aufgenommen wird - ansonsten ArrayList z.b.....

Den Text würde ich in einem String halten.
Code:
String text = // les den Text aus der datei (ohne \n !!);
String[] words = text.split(" "); // trenne alle wörter - delimiter ist das leerzeichen
Set wordList = new HashSet(Arrays.asList(words)); // erstelle Set mit den eingelesen wörtern

usw. - mir stellt sich doch die Frage nach dem Sinn. Warum speicherst du nicht gleich alle zweier paare ? also "new york" , "york is", "is happy" usw.

da wenn ich dich richtig verstanden habe du jedes wort des textes einliest und dann wenn dieses Wort gefunden wurde das Nachbar wort mitreinholst....
 
gute Frage, warum speichere ich nicht gleich alle paare.... oh mann, manchmal sieht man den wald vor lauter bäumen nicht, oder 🙂
aber wie mach ich das algorithmisch?

ich lese die worte über den StringTokenizer ein und speichere dann die Worte so ab:
Code:
StringTokenizer stw = new StringTokenizer(meinString);
String paare = stw.nextToken() + " " + stw.nextToken();

aber wenn er dann mit
Code:
while (stw.hasNextToken())
den nächsten Token einliest, dann nimmt er den übernächsten?
also:
"new york has a new statute" speichert er dann doch ab mit

"new york"
"has a"
"new staute"

und ich will das ja so:

"new york"
"york has"
"has a"
"a new"
"new statute"
 
les sie in einen Array ein (entweder per Tokenizer oder per split)
und dann:
Code:
for(int i = 0; i < wordArray.length; i++) {
  if(i < wordArray.length - 1) {
    String wort1 = wordArray[i];
    String wort2 = wordArray[i+1];
    // mach was mit den beiden wörter
  }
}
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben