Pertanyaan Memisahkan kalimat dengan python


Saya mencoba membagi kalimat dengan kata-kata.

words = content.lower().split()

ini memberi saya daftar kata-kata seperti

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

dan dengan kode ini:

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)

Saya mendapatkan sesuatu seperti:

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

jika Anda melihat kata "morningthe" dalam daftar, itu biasanya memiliki "-" di antara kata-kata. Sekarang, apakah ada cara saya dapat membaginya dalam dua kata seperti "morning","the"??


4
2018-01-27 21:57


asal


Jawaban:


Saya akan menyarankan solusi berbasis regex:

import re

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

Ini mencari semua kata - kelompok karakter alfabetis, mengabaikan simbol, seperator dan spasi.

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

Perhatikan bahwa jika Anda mengulang kata-kata, gunakan re.finditer yang mengembalikan objek generator mungkin lebih baik, karena Anda tidak menyimpan seluruh daftar kata sekaligus.


3
2018-01-27 22:02



Atau, Anda juga dapat menggunakan itertools.groupby bersama str.alpha() untuk mengekstrak kata-kata abjad saja dari string sebagai:

>>> 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: Solusi berbasis Regex jauh lebih bersih. Saya telah menyebutkan ini sebagai alternatif yang mungkin untuk mencapai ini.


Spesifik untuk OP: Jika semua yang Anda inginkan juga terpecah -- dalam daftar yang dihasilkan, maka Anda dapat mengganti tanda hubung '-' dengan ruang ' ' sebelum melakukan split. Oleh karena itu, kode Anda harus:

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

dimana words akan memegang nilai yang Anda inginkan.


3
2018-01-27 22:05



Mencoba melakukan ini dengan regexes akan mengirimi Anda gila, mis.

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

Pasti melihat nltk paket.


1
2018-01-27 22:23



Selain solusi yang sudah diberikan, Anda juga bisa meningkatkan clean_up_list berfungsi untuk melakukan pekerjaan yang lebih baik.

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

Sebenarnya, Anda bisa menerapkan blok di for word in word_list: ke seluruh kalimat untuk mendapatkan hasil yang sama.


0
2018-01-27 22:33



Anda juga bisa melakukan ini:

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

Pengembalian:

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

0
2018-01-28 03:45