#python #nltk
#python #nltk
Вопрос:
У меня есть следующий фрагмент кода, чтобы найти количество слогов для всех слов в заданном входном тексте ‘sample.txt ‘ используя NLTK :
import re
import nltk
from curses.ascii import isdigit
from nltk.corpus import cmudict
import nltk.data
import pprint
d = cmudict.dict()
tokenizer = nltk.data.load('tokenizers/punkt/english.pickle')
fp = open("sample.txt")
data = fp.read()
tokens = nltk.wordpunct_tokenize(data)
text = nltk.Text(tokens)
words = [w.lower() for w in text]
print words #to print all the words in input text
regexp = "[A-Za-z] "
exp = re.compile(regexp)
def nsyl(word):
return max([len([y for y in x if isdigit(y[-1])]) for x in d[word]])
sum1 = 0
count = 0
count1 = 0
for a in words:
if exp.match(a)):
print a
print "no of syllables:",nysl(a)
sum1 = sum1 nysl(a)
print "sum of syllables:",sum1
if nysl(a)<3:
count = count 1
else:
count1 = count1 1
print "no of words with syll count less than 3:",count
print "no of complex words:",count1
Этот код сопоставит каждое входное слово со словарем cmu и выдаст количество слогов для слова. Но это не работает и выдает ошибку, если слово не найдено в словаре или я использую имя собственное во входных данных. Я хочу проверить, существует ли слово в словаре, и если это не так, пропустите его и продолжайте и рассмотрите следующее слово. Как мне это сделать?
Ответ №1:
Я предполагаю, что проблема заключается в ключевой ошибке. Замените ваше определение на
def nsyl(word):
lowercase = word.lowercase()
if lowercase not in d:
return -1
else:
return max([len([y for y in x if isdigit(y[-1])]) for x in d[lowercase]])
И наоборот, вы можете проверить, есть ли слово в словаре, прежде чем вызывать nsyl, и тогда вам не придется беспокоиться об этом в самом методе nsyl.
Комментарии:
1. groups.google.com/group/nltk-users/browse_thread/thread /… показывает использование версии lowercase(). Это должно позаботиться о существительных собственных.