Jump to content
  • 0

Omzetting woordenlijst naar FM


JeanWM

Question

Ik heb een database met de volgende kenmerken:

 

854000 entries

 

The format of each entry is

 

Where the POS tag is one or more of the following:

 

N Noun

P Plural

h Noun Phrase

V Verb (usu participle)

t Verb (transitive)

i Verb (intransitive)

A Adjective

v Adverb

C Conjunction

P Preposition

! Interjection

r Pronoun

D Definite Article

I Indefinite Article

o Nominative

 

Wat is de gemakkelijkste manier om het geheel op een deftige manier in een FM bestand te krijgen ?

 

Een deel van de entries ziet er als volgt uit:

 

's gravenhage	|h
'tween	|v
'tween decks	|v
.22	|N
0	|NA
1	|NA
1-dodecanol	|N
1-hitter	|N
10	|NA
100	|NA
1000	|NA
10000	|N
100000	|N
1000000	|N
1000000000	|N
1000000000000	|N
1000th	|A
100th	|A
10th	|A
11	|NA
11-plus	|N
11th	|A
12	|NA
120	|N
12th	|A
13	|NA

 

...voor een begin numeriek gedeelte en

 

frontal bone	h
frontal cortex	|h
frontal cyclone	h
frontal gyrus	h
frontal lobe	h
frontal sinus	|h
frontal suture	|h
frontality	N
frontally	v
frontbench	|N
frontbencher	|N
frontes	p
frontier	NA
frontier settlement	|h
frontierless	A
frontierlike	A
frontiersman	N
frontiersmen	p
frontis	N
frontispiece	N

 

... voor het 'woord' gedeelte.

 

Voor degene die de C++ code zou willen kennen

 

#include 
#include 
#include 
#include 

typedef unsigned char uchar;

int main() {
 string temp;
 string word;

 char t0[255];

 char strip[256];

 ifstream in0("cp437.dat");
 getline(in0, temp);
 getline(in0, temp);
 int i = 0;
 int j, j0, j1, j2, j3, j4, j5;
 while (!in0.eof()) {
   in0 >> j0 >> t0 >> j1 >> j2 >> j3 >> j4; // all ignored
   in0 >> j;
   strip[i] = (char)j;
   in0 >> j5; //also ignored
   ++i;
 }

 map pos;

 in0.close();

 ifstream in1("/home/kevina/moby/mpos/mobyposi.i");
 while (!in1.eof()) {
   getline(in1, temp, '\r');
   if (temp.size() == 0) break;
   word = "";
   unsigned int i;
   for (i = 0; i != temp.size(); ++i) {
     char c = (uchar)temp[i] < 0x80 ? temp[i] : strip[(uchar)temp[i]];
     if (c == '\x91')
word += "ae";
     else if (c == '\x9C' || c == '\x9D' || c == '\x9E')
word += '$';
     else if (c == '\xBE')
word += '~';
     else if (c == '\xD7') 
break;
     else
word += c;
   }
   ++i;
   string & t = pos[word];
   for (; i < temp.size(); ++i) {
     if (t.find(temp[i]) == string::npos)
t += temp[i];
   }
 }
 in1.close();

 in0.close();
 in0.open("/aux/local/wordnet1.6/dict/noun.lst");
 while(getline(in0, word)) {
   string & t = pos[word];
   if (t.size() == 0) t += '|';
   char c = word.find_first_of(" ") == string::npos ? 'N' : 'h';
   if (t.find(c) == string::npos)
     t += c;
 }
 in0.close();
 in0.open("/aux/local/wordnet1.6/dict/verb.lst");
 while(getline(in0, word)) {
   string & t = pos[word];
   if (t.size() == 0) t += '|';
   if (t.find('V') == string::npos)
     t += 'V';
 }
 in0.close();
 in0.open("/aux/local/wordnet1.6/dict/adj.lst");
 while(getline(in0, word)) {
   string & t = pos[word];
   if (t.size() == 0) t += '|';
   if (t.find('A') == string::npos)
     t += 'A';
 }
 in0.close();
 in0.open("/aux/local/wordnet1.6/dict/adv.lst");
 while(getline(in0, word)) {
   string & t = pos[word];
   if (t.size() == 0) t += '|';
   if (t.find('v') == string::npos)
     t += 'v';
 }

 map::iterator p, end;
 p   = pos.begin();
 end = pos.end();
 while (p != end) {
   cout << p->first << '\t' << p->second << endl;
   ++p;
 }
}

 

Mijn parsing formule werkt niet voor de volle 100 %

Link to comment

2 answers to this question

Recommended Posts

  • 0

Ik begrijp het niet helemaal. Wil je het word gedeelte en POS tag(s) in aparte velden ?

 

Je wilt 854000 entries importeren en vervolgens de word en bijbehorende POS(s) in de aparte velden ? Dan lijkt het heel makkelijk gewoon de tab zoeken in de string m.b.v position functie en dan is links van de tab je word en rechts van je tab de POS(s).

 

Groet,

 

WJ

Link to comment
  • 0

Met de eenvoudige parsing hebben we geen probleem.

Het herkennen van al of niet hoofdletters, ook geen probleem.

 

Waar het verkeerd loopt is met de Pos met het '|' teken.

Indien dat teken ertussen zit, krijg ik alleen het woord in een veld, al de rest niet.

 

Indien ik een substitute doe dan gebeurt er niks 8O , 't is dan precies of dat teken er helemaal niet is....

 

Ik denk het gewoon op te geven, heb al genoeg bloed zweet en nog iets gelaten om de lijst op te bouwen.

Nog eens hetzelfde op FM level is van 't goede teveel.....

Link to comment

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...