Hướng dẫn how do you split punctuation and words in python? - làm cách nào để bạn tách dấu câu và từ trong python?

Tôi đang cố gắng chia một chuỗi thành các từ và dấu câu, thêm dấu câu vào danh sách được tạo ra bởi sự phân chia.

Ví dụ:

>>> c = "help, me"
>>> print c.split()
['help,', 'me']

Điều tôi thực sự muốn danh sách trông giống như:

['help', ',', 'me']

Vì vậy, tôi muốn chuỗi phân chia ở khoảng trắng với dấu câu được chia từ các từ.

Tôi đã cố gắng phân tích cú pháp chuỗi trước và sau đó chạy chia tách:

>>> for character in c:
...     if character in ".,;!?":
...             outputCharacter = " %s" % character
...     else:
...             outputCharacter = character
...     separatedPunctuation += outputCharacter
>>> print separatedPunctuation
help , me
>>> print separatedPunctuation.split()
['help', ',', 'me']

Điều này tạo ra kết quả tôi muốn, nhưng bị chậm một cách đau đớn trên các tệp lớn.

Có cách nào để làm điều này hiệu quả hơn không?

Hướng dẫn how do you split punctuation and words in python? - làm cách nào để bạn tách dấu câu và từ trong python?

Fionnuala

89,8K7 Huy hiệu vàng109 Huy hiệu bạc147 Huy hiệu đồng7 gold badges109 silver badges147 bronze badges

Hỏi ngày 14 tháng 12 năm 2008 lúc 23:30Dec 14, 2008 at 23:30

1

Đây là cách ít nhiều là cách để làm điều đó:

>>> import re
>>> re.findall(r"[\w']+|[.,!?;]", "Hello, I'm a string!")
['Hello', ',', "I'm", 'a', 'string', '!']

Bí quyết là, không nghĩ về nơi để phân chia chuỗi, mà là những gì cần bao gồm trong các mã thông báo.

Caveats:

  • Dấu gạch dưới (_) được coi là một ký tự từ bên trong. Thay thế \ w, nếu bạn không muốn điều đó.
  • Điều này sẽ không hoạt động với (đơn) trích dẫn trong chuỗi.
  • Đặt bất kỳ dấu chấm câu bổ sung nào bạn muốn sử dụng ở nửa bên phải của biểu thức thông thường.
  • Bất cứ điều gì không được đề cập rõ ràng trong RE đều âm thầm bị rơi.

Đã trả lời ngày 15 tháng 12 năm 2008 lúc 1:53Dec 15, 2008 at 1:53

4

Đây là phiên bản nhận biết unicode:

re.findall(r"\w+|[^\w\s]", text, re.UNICODE)

Các chuỗi thay thế đầu tiên bắt được các chuỗi các ký tự từ (như được xác định bởi Unicode, vì vậy "Résumé" sẽ không biến thành

['help', ',', 'me']
4); Thứ hai bắt được các ký tự không từ cá nhân, bỏ qua khoảng trắng.

Lưu ý rằng, không giống như câu trả lời hàng đầu, điều này coi trích dẫn duy nhất là dấu câu riêng biệt (ví dụ: "Tôi" ->

['help', ',', 'me']
5). Điều này dường như là tiêu chuẩn trong NLP, vì vậy tôi coi đó là một tính năng.

Đã trả lời ngày 19 tháng 1 năm 2012 lúc 17:58Jan 19, 2012 at 17:58

LaclacLaC

12.6K5 Huy hiệu vàng37 Huy hiệu bạc38 Huy hiệu đồng5 gold badges37 silver badges38 bronze badges

1

Nếu bạn sẽ làm việc bằng tiếng Anh (hoặc một số ngôn ngữ phổ biến khác), bạn có thể sử dụng NLTK (có nhiều công cụ khác để làm điều này như Freeeling).

import nltk
nltk.download('punkt')
sentence = "help, me"
nltk.word_tokenize(sentence)

Hướng dẫn how do you split punctuation and words in python? - làm cách nào để bạn tách dấu câu và từ trong python?

sh37211

1.2711 Huy hiệu vàng15 Huy hiệu bạc35 Huy hiệu Đồng1 gold badge15 silver badges35 bronze badges

Đã trả lời ngày 8 tháng 11 năm 2018 lúc 16:16Nov 8, 2018 at 16:16

Hướng dẫn how do you split punctuation and words in python? - làm cách nào để bạn tách dấu câu và từ trong python?

1

Đây là mục của tôi.

Tôi nghi ngờ về việc điều này sẽ giữ được ý nghĩa hiệu quả như thế nào, hoặc nếu nó bắt được tất cả các trường hợp (lưu ý "!!!" được nhóm lại với nhau; điều này có thể hoặc không phải là một điều tốt).

>>> import re
>>> import string
>>> s = "Helo, my name is Joe! and i live!!! in a button; factory:"
>>> l = [item for item in map(string.strip, re.split("(\W+)", s)) if len(item) > 0]
>>> l
['Helo', ',', 'my', 'name', 'is', 'Joe', '!', 'and', 'i', 'live', '!!!', 'in', 'a', 'button', ';', 'factory', ':']
>>>

Một tối ưu hóa rõ ràng sẽ là biên dịch Regex trước khi tay (sử dụng re.compile) nếu bạn sẽ thực hiện việc này trên cơ sở từng dòng.

Đã trả lời ngày 15 tháng 12 năm 2008 lúc 1:30Dec 15, 2008 at 1:30

1

Đây là một bản cập nhật nhỏ cho việc thực hiện của bạn. Nếu bạn đang cố gắng làm bất cứ điều gì chi tiết hơn, tôi khuyên bạn nên xem xét NLTK mà Le Dorfier đề xuất.

Điều này chỉ có thể nhanh hơn một chút vì '' .join () được sử dụng thay cho +=, được biết là nhanh hơn.

import string

d = "Hello, I'm a string!"

result = []
word = ''

for char in d:
    if char not in string.whitespace:
        if char not in string.ascii_letters + "'":
            if word:
                    result.append(word)
            result.append(char)
            word = ''
        else:
            word = ''.join([word,char])

    else:
        if word:
            result.append(word)
            word = ''
print result
['Hello', ',', "I'm", 'a', 'string', '!']

Đã trả lời ngày 15 tháng 12 năm 2008 lúc 1:05Dec 15, 2008 at 1:05

Hướng dẫn how do you split punctuation and words in python? - làm cách nào để bạn tách dấu câu và từ trong python?

Monkutmonkutmonkut

40.7K23 Huy hiệu vàng120 Huy hiệu bạc149 Huy hiệu đồng23 gold badges120 silver badges149 bronze badges

3

Điều này làm việc cho tôi

import re

i = 'Sandra went to the hallway.!!'
l = re.split('(\W+?)', i)
print(l)

empty = ['', ' ']
l = [el for el in l if el not in empty]
print(l)

Output:
['Sandra', ' ', 'went', ' ', 'to', ' ', 'the', ' ', 'hallway', '.', '', '!', '', '!', '']
['Sandra', 'went', 'to', 'the', 'hallway', '.', '!', '!']

Đã trả lời ngày 21 tháng 4 năm 2020 lúc 8:41Apr 21, 2020 at 8:41

Hướng dẫn how do you split punctuation and words in python? - làm cách nào để bạn tách dấu câu và từ trong python?

MalgomalgoMalgo

1.5631 Huy hiệu vàng15 Huy hiệu bạc 30 Huy hiệu Đồng1 gold badge15 silver badges30 bronze badges

Tôi nghĩ rằng bạn có thể tìm thấy tất cả sự giúp đỡ mà bạn có thể tưởng tượng trong NLTK, đặc biệt là vì bạn đang sử dụng Python. Có một cuộc thảo luận toàn diện về vấn đề này trong hướng dẫn.

Đã trả lời ngày 15 tháng 12 năm 2008 lúc 0:34Dec 15, 2008 at 0:34

Dkretzdkretzdkretz

37.1K13 Huy hiệu vàng80 Huy hiệu bạc136 Huy hiệu đồng13 gold badges80 silver badges136 bronze badges

Tôi đã đưa ra một cách để mã hóa tất cả các từ và các mẫu

['help', ',', 'me']
6 bằng cách sử dụng
['help', ',', 'me']
7 không cần mã hóa cứng:

>>> import re
>>> sentence = 'Hello, world!'
>>> tokens = [t.strip() for t in re.findall(r'\b.*?\S.*?(?:\b|$)', sentence)]
['Hello', ',', 'world', '!']

Ở đây

['help', ',', 'me']
8 là một mẫu phù hợp với bất cứ thứ gì không phải là không gian và
['help', ',', 'me']
9 được thêm vào để khớp với mã thông báo cuối cùng trong một chuỗi nếu đó là biểu tượng dấu câu.

Lưu ý những điều sau đây - điều này sẽ nhóm dấu chấm câu bao gồm nhiều hơn một biểu tượng:

['help', ',', 'me']
0

Tất nhiên, bạn có thể tìm và chia các nhóm như vậy với:

['help', ',', 'me']
1

Đã trả lời ngày 15 tháng 4 năm 2014 lúc 19:11Apr 15, 2014 at 19:11

Hướng dẫn how do you split punctuation and words in python? - làm cách nào để bạn tách dấu câu và từ trong python?

FrauhahnhenfrauhahnhenFrauHahnhen

1332 Huy hiệu bạc11 Huy hiệu đồng2 silver badges11 bronze badges

Thử cái này:

['help', ',', 'me']
2

Hướng dẫn how do you split punctuation and words in python? - làm cách nào để bạn tách dấu câu và từ trong python?

Aurasphere

3.74112 Huy hiệu vàng43 Huy hiệu bạc70 Huy hiệu đồng12 gold badges43 silver badges70 bronze badges

Đã trả lời ngày 18 tháng 4 năm 2017 lúc 9:03Apr 18, 2017 at 9:03

Bạn đã thử sử dụng Regex chưa?

http://docs.python.org/library/re.html#re-syntax


Nhân tiện. Tại sao bạn cần "," ở cái thứ hai? Bạn sẽ biết rằng sau mỗi văn bản được viết, tức là.

[0]

","

[1]

","

Vì vậy, nếu bạn muốn thêm "", bạn chỉ có thể làm điều đó sau mỗi lần lặp khi bạn sử dụng mảng ..

Đã trả lời ngày 14 tháng 12 năm 2008 lúc 23:34Dec 14, 2008 at 23:34

Filip Ekbergfilip EkbergFilip Ekberg

359K19 Huy hiệu vàng124 Huy hiệu bạc182 Huy hiệu đồng19 gold badges124 silver badges182 bronze badges

Trong trường hợp bạn không được phép nhập bất cứ thứ gì, hãy sử dụng điều này!

['help', ',', 'me']
3

Kosuke Sakai

2.1912 Huy hiệu vàng5 Huy hiệu bạc11 Huy hiệu đồng2 gold badges5 silver badges11 bronze badges

Đã trả lời ngày 27 tháng 11 năm 2019 lúc 9:14Nov 27, 2019 at 9:14