2010-02-18 12 views

Odpowiedz

8

Zobacz Kevin's word lists. W szczególności "Część bazy danych mowy". Będziesz musiał sam wykonać pewne minimalne przetwarzanie tekstu, aby samemu uzyskać bazę danych na wiele plików, ale można to zrobić bardzo łatwo za pomocą kilku komend grep.

Warunki licencji są dostępne na stronie "readme".

30

To jest wysoko notowany wynik Google, więc wykopię to dwuletnie pytanie, aby zapewnić znacznie lepszą odpowiedź niż dotychczasowa.

Strona "Listy słów Kevina" zawiera stare listy z 2000 roku, oparte na WordNet 1.6.

Znacznie lepiej jest przejść do wersji http://wordnet.princeton.edu/wordnet/download/current-version/ i pobrać WordNet 3.0 (wersja tylko do bazy danych) lub inną wersję najnowszą, kiedy to czytasz.

Parsowanie jest bardzo proste; po prostu zastosuj wyrażenie z "/^(\S+?)[\s%]/", aby pobrać każde słowo, a następnie zastąp wszystkie "_" (podkreślenia) w wynikach spacjami. Na koniec zrzuć wyniki do dowolnego formatu pamięci. Otrzymasz oddzielne listy przymiotników, przysłówków, rzeczowników, czasowników, a nawet specjalne (bardzo bezużyteczne/użyteczne w zależności od tego, co robisz) listę o nazwie "zmysły", która odnosi się do naszych zmysłów węchu, wzroku, słuchu itp. , np. słowa takie jak "koszula" lub "gryzący".

Ciesz się! Pamiętaj, aby dołączyć informację o prawach autorskich, jeśli używasz jej w projekcie.

+1

Jakich plików używasz? – Lucidnonsense

+0

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

25

Jeśli pobierzesz tylko pliki bazy danych z http://wordnet.princeton.edu/wordnet/download/current-version/ można wyodrębnić słowa, uruchamiając następujące polecenia:

egrep -o "^[0-9]{8}\s[0-9]{2}\s[a-z]\s[0-9]{2}\s[a-zA-Z_]*\s" data.adj | cut -d ' ' -f 5 > conv.data.adj 
egrep -o "^[0-9]{8}\s[0-9]{2}\s[a-z]\s[0-9]{2}\s[a-zA-Z_]*\s" data.adv | cut -d ' ' -f 5 > conv.data.adv 
egrep -o "^[0-9]{8}\s[0-9]{2}\s[a-z]\s[0-9]{2}\s[a-zA-Z_]*\s" data.noun | cut -d ' ' -f 5 > conv.data.noun 
egrep -o "^[0-9]{8}\s[0-9]{2}\s[a-z]\s[0-9]{2}\s[a-zA-Z_]*\s" data.verb | cut -d ' ' -f 5 > conv.data.verb 

Lub jeśli tylko chcą pojedyncze słowa (bez podkreślenia)

egrep -o "^[0-9]{8}\s[0-9]{2}\s[a-z]\s[0-9]{2}\s[a-zA-Z]*\s" data.adj | cut -d ' ' -f 5 > conv.data.adj 
egrep -o "^[0-9]{8}\s[0-9]{2}\s[a-z]\s[0-9]{2}\s[a-zA-Z]*\s" data.adv | cut -d ' ' -f 5 > conv.data.adv 
egrep -o "^[0-9]{8}\s[0-9]{2}\s[a-z]\s[0-9]{2}\s[a-zA-Z]*\s" data.noun | cut -d ' ' -f 5 > conv.data.noun 
egrep -o "^[0-9]{8}\s[0-9]{2}\s[a-z]\s[0-9]{2}\s[a-zA-Z]*\s" data.verb | cut -d ' ' -f 5 > conv.data.verb 
+0

Nie wydaje się, aby dodać wiele do tego, co zostało powiedziane 4 lata temu. – Mephy

+15

Mów za siebie, to jest dokładnie to, czego potrzebowałem. Dzięki Chilly! –

4

http://icon.shef.ac.uk/Moby/mpos.html

Każdy wpis słownika fragmentu mowy składa się z pola słowa lub frazy, po którym następuje separator pola (ASCII 215) i część sp eech dziedziną, która jest kodowana za pomocą poniższych symboli ASCII (wielkość liter ma znaczenie):

Noun       N 
Plural       p 
Noun Phrase      h 
Verb (usu participle)   V 
Verb (transitive)    t 
Verb (intransitive)    i 
Adjective      A 
Adverb       v 
Conjunction      C 
Preposition      P 
Interjection     ! 
Pronoun       r 
Definite Article    D 
Indefinite Article    I 
Nominative      o 
9

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.

+0

Dziękuję bardzo za dodanie tej przydatnej odpowiedzi na to starsze pytanie. Z pewnością znacznie ułatwiłeś mi życie. Zrobiłbym 99 razy więcej, gdybym mógł. –