Попробуйте сначала удалить пунктуацию, а затем разбить текст на слова.
def spam_indicator(text):
for char in string.punctuation:
text = text.replace(char, ' ') # N.B. replace with ' ', not ''
text = text.split()
w = 0
s = 0
words = []
for word in text:
if word.lower() not in words:
words.append(word.lower())
w=w+1
if word.lower() in SPAM_WORDS:
s=s+1
return float("{:.2f}".format(s/w))
В ваш код можно внести множество улучшений.
- Используйте набор для
words
, а не список. Поскольку набор не может содержать дубликаты, вам не нужно проверять, видели ли вы уже слово, прежде чем добавлять его в набор.
- Используйте
str.translate()
для удаления знаков препинания. Вы хотите заменить пунктуацию пробелом, чтобы split()
разделял текст на слова.
- Используйте
round()
вместо преобразования в строку, а затем в число с плавающей точкой.
Вот пример:
import string
def spam_indicator(text):
trans_table = {ord(c): ' ' for c in string.punctuation}
text = text.translate(trans_table).lower()
text = text.split()
word_count = 0
spam_count = 0
words = set()
for word in text:
if word not in SPAM_WORDS:
words.add(word)
word_count += 1
else:
spam_count += 1
return round(spam_count / word_count, 2)
Вы должны позаботиться о том, чтобы не делить на 0, если нет слов, не являющихся спамом. Во всяком случае, я не уверен, что вы хотите в качестве значения индикатора спама. Возможно, это должно быть количество спам-слов, деленное на общее количество слов (как спама, так и не спама), чтобы его значение было от 0 до 1?