python скачать - Как избавиться от пунктуации с помощью токенизатора NLTK?




на русском (7)

Вам не нужно NLTK для удаления знаков препинания. Вы можете удалить его с помощью простого python. Для строк:

import string
s = '... some string with punctuation ...'
s = s.translate(None, string.punctuation)

Или для unicode:

import string
translate_table = dict((ord(char), None) for char in string.punctuation)   
s.translate(translate_table)

а затем используйте эту строку в своем токенизаторе.

В модуле PS string есть несколько других наборов элементов, которые можно удалить (например, цифры).

Я только начинаю использовать NLTK, и я не совсем понимаю, как получить список слов из текста. Если я использую nltk.word_tokenize() , я получаю список слов и знаков препинания. Мне нужны только слова. Как я могу избавиться от пунктуации? Также word_tokenize не работает с несколькими предложениями: точки добавляются к последнему слову.


Ниже код удалит все знаки препинания, а также не буквенные символы. Скопированы из их книги.

http://www.nltk.org/book/ch01.html

import nltk

s = "I can't do this now, because I'm so tired.  Please give me some time. @ sd  4 232"

words = nltk.word_tokenize(s)

words=[word.lower() for word in words if word.isalpha()]

print(words)

вывод

['i', 'ca', 'do', 'this', 'now', 'because', 'i', 'so', 'tired', 'please', 'give', 'me', 'some', 'time', 'sd']

Взгляните на другие параметры токенизации, которые предоставляет here nltk. Например, вы можете определить токенизатор, который выбирает последовательности буквенно-цифровых символов в качестве токенов и бросает все остальное:

from nltk.tokenize import RegexpTokenizer

tokenizer = RegexpTokenizer(r'\w+')
tokenizer.tokenize('Eighty-seven miles to go, yet.  Onward!')

Вывод:

['Eighty', 'seven', 'miles', 'to', 'go', 'yet', 'Onward']

Как отмечено в комментариях, начинаются с sent_tokenize (), потому что word_tokenize () работает только с одним предложением. Вы можете отфильтровать пунктуацию с помощью фильтра (). И если у вас есть строки в unicode, убедитесь, что это объект unicode (а не «str», закодированный с некоторой кодировкой типа «utf-8»).

from nltk.tokenize import word_tokenize, sent_tokenize

text = '''It is a blue, small, and extraordinary ball. Like no other'''
tokens = [word for sent in sent_tokenize(text) for word in word_tokenize(sent)]
print filter(lambda word: word not in ',-', tokens)

Я думаю, вам нужно какое-то регулярное выражение (следующий код находится в Python 3):

import string
import re
import nltk

s = "I can't do this now, because I'm so tired.  Please give me some time."
l = nltk.word_tokenize(s)
ll = [x for x in l if not re.fullmatch('[' + string.punctuation + ']+', x)]
print(l)
print(ll)

Вывод:

['I', 'ca', "n't", 'do', 'this', 'now', ',', 'because', 'I', "'m", 'so', 'tired', '.', 'Please', 'give', 'me', 'some', 'time', '.']
['I', 'ca', "n't", 'do', 'this', 'now', 'because', 'I', "'m", 'so', 'tired', 'Please', 'give', 'me', 'some', 'time']

Должен хорошо работать в большинстве случаев, поскольку он удаляет пунктуацию при сохранении токенов типа «нет», которые не могут быть получены из токенизаторов регулярных выражений, таких как wordpunct_tokenize .


Я просто использовал следующий код, который удалил всю пунктуацию:

tokens = nltk.wordpunct_tokenize(raw)

type(tokens)

text = nltk.Text(tokens)

type(text)  

words = [w.lower() for w in text if w.isalpha()]

Соответствующая документация на Python предлагает использовать стиль кодирования EAFP (проще просить прощения, чем разрешения) . Это означает, что код

try:
    os.makedirs(path)
except OSError as exception:
    if exception.errno != errno.EEXIST:
        raise
    else:
        print "\nBE CAREFUL! Directory %s already exists." % path

лучше, чем альтернатива

if not os.path.exists(path):
    os.makedirs(path)
else:
    print "\nBE CAREFUL! Directory %s already exists." % path

Документация предполагает это именно из-за состояния гонки, обсуждаемого в этом вопросе. Кроме того, как упоминают другие, преимущество в производительности при запросе один раз, а не в два раза больше ОС. Наконец, аргумент, предложенный, возможно, в пользу второго кода в некоторых случаях - когда разработчик знает среду, в которой работает приложение, - может быть защищен только в специальном случае, когда программа создала частную среду для (и другие экземпляры одной и той же программы).

Даже в этом случае это плохая практика и может привести к длительной бесполезной отладке. Например, тот факт, что мы устанавливаем разрешения для каталога, не должен оставлять нас с разрешениями на показ, которые установлены надлежащим образом для наших целей. Родительский каталог можно установить с другими разрешениями. В общем, программа должна всегда работать правильно, и программисту не следует ожидать какой-либо конкретной среды.







python nlp tokenize nltk