Строки Python: исправьте пунктуацию, пожалуйста - PullRequest
0 голосов
/ 07 мая 2018

Программа правильно определяет слова независимо от пунктуации. У меня проблемы с интеграцией в spam_indicator (text).

def spam_indicator (text):

text=text.split()
w=0
s=0
words=[]

for char in string.punctuation:
    text = text.replace(char, '')
return word

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))

введите описание изображения здесь


Второй блок неправильный. Я пытаюсь убрать знаки препинания для запуска функции.

1 Ответ

0 голосов
/ 07 мая 2018

Попробуйте сначала удалить пунктуацию, а затем разбить текст на слова.

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?

...