Вы повторяете строку. Таким образом, элементы являются символами. Чтобы получить слова из строки, вы можете использовать наивные методы, такие как str.split()
, что делает это для вас (теперь вы можете перебирать список строк (слова, разделенные по аргументу str.split(), по умолчанию: split on whitespace). Существует даже re.split()
, который является более мощным. Но я не думаю, что вам нужно разделив текст с регулярными выражениями.
То, что вы должны сделать, по крайней мере, в нижнем регистре вашу строку с str.lower()
или поставить все возможные вхождений (также с заглавными буквами) в словаре. Я настоятельно рекомендую первый вариант: последний не является практически осуществимым. Удаление препинания также является обязанностью для этого, но это все еще наивно. Если вам нужен более сложный метод, вам нужно разделить текст с помощью токенизатора слов. NLTK - хорошая отправная точка для этого, см. раздел nltk tokenizer. Но я твердо чувствую, что эта проблема не ваша главная или не влияет на вас в самом деле в решении вашего вопроса. :)
speech = """I've changed the path of the economy, and I've increased jobs in our own home state. We're headed in the right direction - you've all been a great help."""
# Maybe this dict makes more sense (list items as values). But for your question it doesn't matter.
contractions = {"ain't": ["am not", "are not", "is not", "has not", "have not"], "aren't": ["are not", "am not"], "i've": ["i have", ]} # ...
# with re you can define advanced regexes, but maybe
# from string import punctuation (suggestion from Martijn Pieters answer
# is still enough for you)
import re
def abbreviation_counter(input_text, abbreviation_dict):
count = 0
# what you want is a list of words. str.split() does this job for you.
# " " is default and you can also omit this. But if you really need better
# methods (see answer text abover), you have to take a word tokenizer tool
# or have to write your own.
for word in input_text.split(" "):
# and also clean word (remove ',', ';', ...) afterwards. The advantage of
# using re over `from string import punctuation` is that you have more
# control in what you want to remove. That means that you can add or
# remove easily any punctuation mark. It could be very handy. It could be
# also overpowered. If the latter is the case, just stick to Martijn Pieters
# solution.
if re.sub(',|;', '', word).lower() in abbreviation_dict:
count += 1
return count
print abbrev_counter(speech, contractions)
2 # yeah, it worked - I've included I've in your list :)
Это Литты немного расстраивает, чтобы дать ответ на то же время, как это делает Мартейн Питерс;), но я надеюсь, что я до сих пор породил некоторые значения для вас. Вот почему я отредактировал свой вопрос, чтобы дать вам несколько советов для будущей работы.
for word in speech.split (''): – Monkpit
Я не понимаю, что делают значения в вашем dict, у вас есть dict btw not a list –
В моем ответе я добавил много вещей, которые должен предоставить вам некоторые дополнительные услуги. – colidyre