Расщепление предложений в питоне

Я пытаюсь разбить предложения на слова.

words = content.lower().split()

это дает мне список слов, как

'evening,', 'and', 'there', 'was', 'morning--the', 'first', 'day.'

и с этим кодом:

def clean_up_list(word_list):
    clean_word_list = []
    for word in word_list:
        symbols = "~!@#$%^&*()_+`{}|\"?><`-=\][';/.,']"
        for i in range(0, len(symbols)):
            word = word.replace(symbols[i], "")
        if len(word) > 0:
            clean_word_list.append(word)

Я получаю что-то вроде:

'evening', 'and', 'there', 'was', 'morningthe', 'first', 'day'

если вы видите в списке слово "morningthe", между словами "-". Теперь, есть ли способ разделить их на два слова, как "morning","the"??

5 ответов

Я бы предложил решение на основе регулярных выражений:

import re

def to_words(text):
    return re.findall(r'\w+', text)

Это ищет все слова - группы буквенных символов, игнорируя символы, разделители и пробелы.

>>> to_words("The morning-the evening")
['The', 'morning', 'the', 'evening']

Обратите внимание, что если вы перебираете слова, используя re.finditer который возвращает объект генератора, вероятно, лучше, так как вам не нужно хранить весь список слов одновременно.

Кроме того, вы также можете использовать itertools.groupby вместе с str.alpha() извлечь из строки слова, содержащие только буквы

>>> from itertools import groupby
>>> sentence = 'evening, and there was morning--the first day.'

>>> [''.join(j) for i, j in groupby(sentence, str.isalpha) if i]
['evening', 'and', 'there', 'was', 'morning', 'the', 'first', 'day']

PS: решение на основе Regex намного чище. Я упомянул это как возможную альтернативу для достижения этой цели.


Конкретно для OP: Если все, что вы хотите, это также разделить на -- в результирующем списке, то вы можете сначала заменить дефисы '-' с пространством ' ' перед выполнением сплита. Следовательно, ваш код должен быть:

words = content.lower().replace('-', ' ').split()

где words будет держать значение, которое вы хотите.

Попытки сделать это с помощью регулярных выражений приведут вас в бешенство, например

>>> re.findall(r'\w+', "Don't read O'Rourke's books!")
['Don', 't', 'read', 'O', 'Rourke', 's', 'books']

Определенно посмотрите на nltk пакет.

Вы также можете сделать это:

import re

def word_list(text):
  return list(filter(None, re.split('\W+', text)))

print(word_list("Here we go round the mulberry-bush! And even---this and!!!this."))

Возвращает:

['Here', 'we', 'go', 'round', 'the', 'mulberry', 'bush', 'And', 'even', 'this', 'and', 'this']

Помимо предоставленных решений, вы также можете улучшить свои clean_up_list функция, чтобы сделать лучшую работу.

def clean_up_list(word_list):
    clean_word_list = []
    # Move the list out of loop so that it doesn't
    # have to be initiated every time.
    symbols = "~!@#$%^&*()_+`{}|\"?><`-=\][';/.,']"

    for word in word_list:
        current_word = ''
        for index in range(len(word)):
            if word[index] in symbols:
                if current_word:
                    clean_word_list.append(current_word)
                    current_word = ''
            else:
                current_word += word[index]

        if current_word:
            # Append possible last current_word
            clean_word_list.append(current_word)

    return clean_word_list

На самом деле, вы можете применить блок в for word in word_list: на все предложение, чтобы получить тот же результат.

Другие вопросы по тегам