Счетчик слов в Python чувствителен к тому, что слово заключено в кавычки? - PullRequest
0 голосов
/ 27 октября 2018

У меня проблема с моей программой на Python. Я пытаюсь составить счетчик слов, упражнение из Упражнение .

Теперь моя программа должна пройти 13 тестов, каждый из которых представляет собой разные строки с пробелами, символами, цифрами и т. Д. Раньше у меня была проблема, потому что я заменял все не буквы и не цифры на пробел. Это создало проблему для слов типа "don't", потому что это разделило бы его на две строки, don и t. Чтобы противостоять этому, я добавил оператор if, исключающий замену одиночных отметок ', что сработало.

Однако, одна из строк, которую я должен проверить, это "Joe can't tell between 'large' and large.". Проблема в том, что, поскольку я исключаю ' рынки, здесь large и 'large' рассматриваются как две разные вещи, а также одно и то же слово. Как мне сказать моей программе «стереть» кавычки , окружающие слово?

Вот мой код, и я добавил два сценария, один из которых является строкой выше, а другой - другой строкой только с одной ' отметкой, которую не следует удалять:

def word_count(phrase):
    count = {}
    for c in phrase:
        if not c.isalpha() and not c.isdigit() and c != "'":
            phrase = phrase.replace(c, " ")
    for word in phrase.lower().split():
        if word not in count:
            count[word] = 1
        else:
            count[word] += 1
    return count

print(word_count("Joe can't tell between 'large' and large."))
print(word_count("Don't delete that single quote!"))

Спасибо за вашу помощь.

Ответы [ 2 ]

0 голосов
/ 27 октября 2018

Модуль string содержит несколько хороших текстовых констант - для вас важно было бы punctuation.Модуль collection содержит Counter - специализированный словарный класс, используемый для подсчета вещей:

from collections import Counter 
from string import punctuation

# lookup in set is fastest 
ps = set(string.punctuation)  # "!#$%&'()*+,-./:;<=>?@[\]^_`{|}~

def cleanSplitString(s):
    """cleans all punctualtion from the string s and returns split words."""
    return ''.join([m for m in s if m not in ps]).lower().split()

def word_count(sentence):
    return dict(Counter(cleanSplitString(sentence))) # return a "normal" dict

print(word_count("Joe can't tell between 'large' and large.")) 
print(word_count("Don't delete that single quote!"))

Вывод:

{'joe': 1, 'cant': 1, 'tell': 1, 'between': 1, 'large': 2, 'and': 1}
{'dont': 1, 'delete': 1, 'that': 1, 'single': 1, 'quote': 1}

Если вы хотите сохранитьзнаки препинания внутри слов, используйте:

def cleanSplitString_2(s):
    """Cleans all punctuations from start and end of words, keeps them if inside."""
    return [w.strip(punctuation) for w in s.lower().split()] 

Вывод:

{'joe': 1, "can't": 1, 'tell': 1, 'between': 1, 'large': 2, 'and': 1}
{"don't": 1, 'delete': 1, 'that': 1, 'single': 1, 'quote': 1} 

Чтение strip()

0 голосов
/ 27 октября 2018

Используйте .strip(), чтобы снять первый и последний символы, как только они появятся в списке - https://python -reference.readthedocs.io / en / latest / docs / str / strip.html

def word_count(phrase):
    count = {}
    for c in phrase:
        if not c.isalpha() and not c.isdigit() and c != "'":
            phrase = phrase.replace(c, " ")
    print(phrase)
    for word in phrase.lower().split():
        word = word.strip("\'")
        if word not in count:
            count[word] = 1
        else:
            count[word] += 1
    return count
...