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

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

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"??


person Yun Tae Hwang    schedule 27.01.2017    source источник
comment
Вам нужно разделить все разделители, а не только пробелы. Это описано в других вопросах StackOverflow.   -  person Prune    schedule 28.01.2017
comment
возможный дубликат stackoverflow.com/q/13209288/3865495   -  person CoconutBandit    schedule 28.01.2017
comment
Вам нужно использовать метод strip() для удаления ненужных символов на концах строки. т.е. 'x-'.strip(',:-') -> 'x', но 'x-y'.strip(',:-') -> 'x-y'. Однако, если вы хотите работать с реальными текстами, вам нужен более сложный подход... Может быть, NTLK будет хорошим началом?   -  person myaut    schedule 28.01.2017
comment
Используйте nltk.word_tokenize(content) или re.findall(r'\w+',content).   -  person DYZ    schedule 28.01.2017


Ответы (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, которое возвращает объект генератора, вероятно, лучше, так как вам не нужно хранить весь список слов сразу.

person FlipTack    schedule 27.01.2017


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

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

Обязательно посмотрите на пакет nltk.

person John Machin    schedule 27.01.2017

Помимо уже приведенных решений, вы также можете улучшить свою функцию 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: ко всему предложению, чтобы получить тот же результат.

person Ares Ou    schedule 27.01.2017

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

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']
person Jason Baker    schedule 28.01.2017