Как уже предложили, то WordNet database files являются отличным источником для частей речи. Тем не менее, примеры, используемые для извлечения слов, не совсем корректны. Каждая строка на самом деле представляет собой «набор синонимов», состоящий из нескольких синонимов и их определения. Около 30% слов появляются только как синонимы, поэтому простое извлечение первого слова пропускает большой объем данных.
Формат строки довольно прост для синтаксического анализа (search.c
, функция parse_synset
), но если все, что вы заинтересованы в слова, то соответствующая часть строки в формате:
NNNNNNNN NN a NN word N [word N ...]
Они соответствуют чтобы:
- байтовое смещение в пределах файла (8 символов целого числа)
- номер файла (2 символа целое число)
- Части речи (1 символ)
- Количества слов (2 символа, шестнадцатеричное)
- N вхождений ...
- Слово с пробелами заменяются символы подчеркивания, дополнительный комментарий в скобках
- Слово лексический ID (уникальный случай ID)
Например, из data.adj
:
00004614 00 s 02 cut 0 shortened 0 001 & 00004412 a 0000 | with parts removed; "the drastically cut film"
- Byte смещение в файле 4614
- номер файла 0
- Часть речи
s
, соответствующее прилагательное (wnutil.c
, функция getpos
)
- Количество слов 2
- Первое слово is
cut
с лексикой ID 0
- Второе слово
shortened
с лексической ID 0
короткий скрипт на Perl, чтобы просто сбросить слова из data.*
файлов:
#!/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
}
}
Сущностью вышеприведенного сценария можно найти here.
Более надежный парсер, который остается верным исходному источнику, можно найти here.
Оба сценария используются аналогичным образом: ./wordnet_parser.pl DATA_FILE
.
Какие файлы вы используете? – Lucidnonsense
Обратите внимание, что WordNet 3.0 не ** содержит ** сопряжения, например. если вы ищете слово «есть» в списке глаголов, оно ничего не придумает. Конечно, «быть» там, так что глагол есть, а не сопряжение. – Luc