Не знам защо мислите, че имате нужда от NLTK само за да изключите думите от речника; прост речник (който може да сте инсталирали някъде като /usr/share/dict/words
или можете да изтеглите такъв от интернет) е всичко, от което се нуждаете:
with open('/usr/share/dict/words') as f:
dictwords = {word.strip() for word in f}
with open(mypath) as f:
names = [word for line in f for word in line.rstrip().split()
if word.lower() not in dictwords]
Вашият words
списък може да включва имена, но ако е така, ще ги включва с главни букви, така че:
dictwords = {word.strip() for word in f if word.islower()}
Или, ако искате да поставите собствените имена в белия списък, вместо думите от речника в черен списък:
with open('/usr/share/dict/propernames') as f:
namewords = {word.strip() for word in f}
with open(mypath) as f:
names = [word for line in f for word in line.rstrip().split()
if word.title() in namewords]
Но това наистина няма да проработи. Вижте "Джим Уайт" от вашия пример. Неговото фамилно име очевидно ще присъства във всеки речник, а първото му име ще присъства в много (като кратка версия на "джими", като обща романизация на арабската буква "джим" и т.н.). „Марк“ също е често срещана дума в речника. И обратното, „Воля“ е много често срещано име, въпреки че искате да го третирате като дума, а „Щастие“ е необичайно име, но поне няколко души го имат.
Така че, за да направите тази работа дори и най-малкото, вероятно искате да комбинирате множество евристики. Първо, вместо една дума да бъде или винаги име, или никога име, всяка дума има вероятност да бъде използвана като име в някакъв съответен корпус - Уайт може да е име в 13,7% от времето, Марк 41,3%, Джим 99,1% , Щастие 0,1% и т.н. След това, ако не е първата дума в изречение, но е с главна буква, много по-вероятно е да е име (колко повече? Не знам, ще трябва да тествате и да настроите за вашия конкретен вход), и ако е с малки букви, е по-малко вероятно да е име. Бихте могли да внесете повече контекст – например имате много пълни имена, така че ако нещо е възможно собствено име и се появи точно до нещо, което е обичайно фамилно име, по-вероятно е това да е собствено име. Можете дори да опитате да анализирате граматиката (добре е, ако се откажете от някои изречения; те просто няма да получат никакви данни от граматическото правило), така че ако две съседни думи работят само като част от изречение, едното, ако второто е глагол, те вероятно не са име и фамилия, дори ако същата втора дума може да бъде съществително (и име) в друг контекст. И така нататък.
person
abarnert
schedule
03.08.2014