Jak inni sugerowane, WordNet database files są doskonałym źródłem dla części mowy. Mimo to przykłady użyte do wydobycia słów nie są całkowicie poprawne. Każda linia jest właściwie "zestawem synonimów" składającym się z wielu synonimów i ich definicji. Około 30% słów pojawia się tylko jako synonimy, więc po wypakowaniu pierwszego słowa brakuje dużej ilości danych.
Format linia jest dość prosta do analizowania (search.c
, funkcja parse_synset
), ale jeśli wszystko jesteś zainteresowany to słowa, odpowiednia część linii jest sformatowany jako:
NNNNNNNN NN a NN word N [word N ...]
Odpowiadają do:
- offset bajtowy w pliku (8 znaków liczby całkowitej)
- Numer pliku (2) charakter całkowitej
- Część mowy (1 znak)
- Liczba słów (2 znaków hex kodowany)
- N wystąpień ...
- Słowo spacjami zastąpione podkreśleniami, opcjonalny komentarz w nawiasach
- Worda słownikowa ID (unikatowy identyfikator występowanie)
Przykładowo z data.adj
:
00004614 00 s 02 cut 0 shortened 0 001 & 00004412 a 0000 | with parts removed; "the drastically cut film"
- offset bajtowy w pliku to 4614
- Numer pliku jest 0
- Część mowy jest
s
, co odpowiada przymiotnik (wnutil.c
, funkcja getpos
)
- Liczba słów jest 2
- Pierwsze słowo to
cut
z identyfikatorem leksykalnym 0
- Drugie słowo to
shortened
z leksykalnego ID 0
krótki skrypt Perl po prostu zrzucić słowa z data.*
plików:
#!/usr/bin/perl
while (my $line = <>) {
# If no 8-digit byte offset is present, skip this line
if ($line !~ /^[0-9]{8}\s/) { next; }
chomp($line);
my @tokens = split(/ /, $line);
shift(@tokens); # Byte offset
shift(@tokens); # File number
shift(@tokens); # Part of speech
my $word_count = hex(shift(@tokens));
foreach (1 .. $word_count) {
my $word = shift(@tokens);
$word =~ tr/_/ /;
$word =~ s/\(.*\)//;
print $word, "\n";
shift(@tokens); # Lexical ID
}
}
GIST z powyższym scenariuszu można znaleźć here.
Bardziej odporny analizator składni, który pozostaje wierny oryginalnemu źródłu, można znaleźć pod adresem here.
Oba skrypty są używane w podobny sposób: ./wordnet_parser.pl DATA_FILE
.
Jakich plików używasz? – Lucidnonsense
Należy zauważyć, że WordNet 3.0 nie ** zawiera ** koniugacji, np. jeśli wyszukasz słowo "są" na liście czasowników, nic nie wyjdzie. Oczywiście "być" jest tam, więc czasownik istnieje, tylko nie koniugacja. – Luc