Я не знаю, почему вы думаете, что вам нужен 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