Как удалить пунктуацию?

Я использую токенизатор от в nltk в Python.

есть целая куча ответов для удаления пунктуаций на форуме уже. Однако ни один из них не решает все следующие вопросы вместе:

  1. более одного символа в строке. Например, предложение: он сказал: "Вот оно.- Поскольку за запятой следует кавычка, токенизатор не удаляется ."в предложении. Токенизатор даст ['он', "сказал",",", "это", "с", "это".вместо ["Он", "сказал", "это", "с", "это"]. Некоторые другие примеры включают '...', '--', '!?и так далее.
  2. удалить символ в конце предложения. то есть предложение: Hello World. Токенизатор даст ['Hello', ' World.вместо ['Hello', 'World']. Обратите внимание на точку в конце слова "Мир". Некоторые другие примеры включают"--",", " в начале, середине или конце любого символа.
  3. удалить символы с символами спереди и после. т. е. '*u*', '''','""'

есть ли элегантный способ решения обеих проблем?

2 ответов


если вы хотите маркировать вашу строку все в одном кадре, я думаю, ваш единственный выбор будет использовать nltk.tokenize.RegexpTokenizer. Следующий подход позволит вам использовать пунктуацию в качестве маркера для удаления символов алфавита (как указано в вашем третьем требовании) перед удалением пунктуации в целом. Другими словами, этот подход удалит *u* перед снятием всех знаков препинания.

один из способов сделать это, то, чтобы токенизировать на пробелы, как так:

>>> from nltk.tokenize import RegexpTokenizer
>>> s = '''He said,"that's it." *u* Hello, World.'''
>>> toker = RegexpTokenizer(r'((?<=[^\w\s])\w(?=[^\w\s])|(\W))+', gaps=True)
>>> toker.tokenize(s)
['He', 'said', 'that', 's', 'it', 'Hello', 'World']  # omits *u* per your third requirement

этот должны соответствовать всем трем критериям, указанным выше. Обратите внимание, однако, что этот токенизатор не будет возвращать токены, такие как "A". Кроме того, я только обозначаю отдельные буквы, которые начинаются и конец с пунктуацией. В Противном Случае: "Иди.- не вернула бы жетон. Возможно, Вам потребуется внести нюансы в регулярное выражение другими способами, в зависимости от того, как выглядят ваши данные и каковы ваши ожидания.


Решение 1: обозначьте и снимите знаки препинания с токенов

>>> from nltk import word_tokenize
>>> import string
>>> punctuations = list(string.punctuation)
>>> punctuations
['!', '"', '#', '$', '%', '&', "'", '(', ')', '*', '+', ',', '-', '.', '/', ':', ';', '<', '=', '>', '?', '@', '[', '\', ']', '^', '_', '`', '{', '|', '}', '~']
>>> punctuations.append("''")
>>> sent = '''He said,"that's it."'''
>>> word_tokenize(sent)
['He', 'said', ',', "''", 'that', "'s", 'it', '.', "''"]
>>> [i for i in word_tokenize(sent) if i not in punctuations]
['He', 'said', 'that', "'s", 'it']
>>> [i.strip("".join(punctuations)) for i in word_tokenize(sent) if i not in punctuations]
['He', 'said', 'that', 's', 'it']

решение 2: Удалите пунктуацию, затем обозначьте

>>> import string
>>> string.punctuation
'!"#$%&\'()*+,-./:;<=>?@[\]^_`{|}~'
>>> sent = '''He said,"that's it."'''
>>> " ".join("".join([" " if ch in string.punctuation else ch for ch in sent]).split())
'He said that s it'
>>> " ".join("".join([" " if ch in string.punctuation else ch for ch in sent]).split()).split()
['He', 'said', 'that', 's', 'it']