2010-08-06 11 views
5

mam:Wyodrębnianie zestaw słów z Python/NLTK, a następnie porównanie go do standardowego słownika angielskiego

from __future__ import division 
import nltk, re, pprint 
f = open('/home/a/Desktop/Projects/FinnegansWake/JamesJoyce-FinnegansWake.txt') 
raw = f.read() 
tokens = nltk.wordpunct_tokenize(raw) 
text = nltk.Text(tokens) 
words = [w.lower() for w in text] 

f2 = open('/home/a/Desktop/Projects/FinnegansWake/catted-several-long-Russian-novels-and-the-NYT.txt') 
englishraw = f2.read() 
englishtokens = nltk.wordpunct_tokenize(englishraw) 
englishtext = nltk.Text(englishtokens) 
englishwords = [w.lower() for w in englishwords] 

która jest prosto z podręcznika NLTK. To, co chcę teraz zrobić, to porównać vocab do wyczerpującego zestawu angielskich słów, takich jak OED, i wyodrębnić różnicę - zestaw słów Wake, które nie miały i prawdopodobnie nigdy nie będą w OED. Jestem raczej osobą werbalną niż osobą zorientowaną na matematykę, więc nie mam pojęcia, jak to zrobić, a podręcznik zbyt wiele szczegółów na temat rzeczy, których naprawdę nie chcę robić. Zakładam, że to tylko jedna lub dwie linijki kodu.

+0

Nawiasem mówiąc, w jaki sposób sformatować pytona w pytaniu z podświetleniem, tak jak w edytorze tekstu? – magnetar

+0

Wcięcie to wszystko. Zrobione automatycznie, jeśli zaznaczysz je i klikniesz przycisk z zerami i owadami nad edytorem. – katrielalex

+0

Aha, a twój kod nie jest najskuteczniejszy ... możesz rozsądnie używać iteratorów, aby zapisać wielokrotne podania. – katrielalex

Odpowiedz

4

Jeśli Angielski Słownik jest rzeczywiście zestaw (oby z zamienionymi na wyłącznie małe słów),

set(vocab) - english_dictionary 

daje zestaw słów, które są w zestawie vocab ale nie w jednym english_dictionary. (Szkoda, że ​​zmieniłeś vocab na listę według tej sorted, ponieważ musisz zamienić ją ponownie w zestaw, aby wykonywać operacje takie jak ta ustawiona różnica!).

Jeśli Angielski Słownik jest w jakimś innym formacie, nie naprawdę zbiorem czy nie składającego się wyłącznie z zamienionymi na wyłącznie małe słowy, musisz nam powiedzieć, co to jest format dla nas, aby być w stanie pomóc! -)

Edit: podany edit pO pokazuje, że zarówno words (co było poprzednio nazywane vocab) i englishwords (co ja wcześniej nazywana english_dictionary) są w rzeczywistości list zamienionymi na wyłącznie małe słowy, następnie

newwords = set(words) - set(englishwords) 

lub

newwords = set(words).difference(englishwords) 

to dwa sposoby wyrażania "zestawu słów, które nie są angielskimi". Ten pierwszy jest nieco bardziej zwięzły, drugi może być nieco bardziej czytelny (ponieważ używa on słowa "różnica" jawnie, zamiast znaku minus) i może jest nieco bardziej wydajny (ponieważ nie przekształca jawnie listy englishwords w set - choć, jeśli prędkość jest kluczowa, to musi być sprawdzona przez pomiar, ponieważ "wewnętrznie" difference nadal musi wykonać jakąś operację "transformacji do zestawu").

Jeśli jesteś zapalonym mieć listę jako wynik zamiast zestawu, sorted(newwords) daje alfabetycznie posortowana lista (list(newwords) dałby ci listę nieco szybciej, ale w całkowicie dowolnej kolejności, i podejrzewam cię raczej poczekaj trochę dodatkowego czasu i uzyskaj w zamian ładnie alfabetyczny wynik ;-).

+0

Zmieniono nieco treść pytania, aby odzwierciedlić te nowe informacje. – magnetar

+0

Dokładnie tego potrzebowałem. Dziękuję, Alex! – magnetar

+0

@tsimotki, nie ma za co.Zauważ, że przy obecnej reputacji możesz "przegłosować" odpowiedzi, które lubisz (na własne pytania lub inne) - w rzeczy samej, to naprawdę dziwne (dla każdego, kto ma wystarczającą ilość przedstawicieli), aby zaakceptować odpowiedź bez przechwytywania jej (akceptacja oznacza, że ​​to była najbardziej pomocny w rozwiązaniu problemu, a nie w przegrywaniu oznacza, że ​​naprawdę nie lubisz tego ... niezwykłego połączenia ;-). –

Powiązane problemy