Сочетание текста и удаление пунктуации в NLTK и scikit-learn
Я использую комбинацию NLTK и scikit-learn
CountVectorizer
для слов и токенизации слов.
Ниже приведен пример простого использования CountVectorizer
:
from sklearn.feature_extraction.text import CountVectorizer
vocab = ['The swimmer likes swimming so he swims.']
vec = CountVectorizer().fit(vocab)
sentence1 = vec.transform(['The swimmer likes swimming.'])
sentence2 = vec.transform(['The swimmer swims.'])
print('Vocabulary: %s' %vec.get_feature_names())
print('Sentence 1: %s' %sentence1.toarray())
print('Sentence 2: %s' %sentence2.toarray())
Будет напечатан
Vocabulary: ['he', 'likes', 'so', 'swimmer', 'swimming', 'swims', 'the']
Sentence 1: [[0 1 0 1 1 0 1]]
Sentence 2: [[0 0 0 1 0 1 1]]
Теперь, скажем, я хочу удалить стоп-слова и остановить слова. Один из вариантов - сделать это следующим образом:
from nltk import word_tokenize
from nltk.stem.porter import PorterStemmer
#######
# based on http://www.cs.duke.edu/courses/spring14/compsci290/assignments/lab02.html
stemmer = PorterStemmer()
def stem_tokens(tokens, stemmer):
stemmed = []
for item in tokens:
stemmed.append(stemmer.stem(item))
return stemmed
def tokenize(text):
tokens = nltk.word_tokenize(text)
stems = stem_tokens(tokens, stemmer)
return stems
########
vect = CountVectorizer(tokenizer=tokenize, stop_words='english')
vect.fit(vocab)
sentence1 = vect.transform(['The swimmer likes swimming.'])
sentence2 = vect.transform(['The swimmer swims.'])
print('Vocabulary: %s' %vect.get_feature_names())
print('Sentence 1: %s' %sentence1.toarray())
print('Sentence 2: %s' %sentence2.toarray())
Какие принты:
Vocabulary: ['.', 'like', 'swim', 'swimmer']
Sentence 1: [[1 1 1 1]]
Sentence 2: [[1 0 1 1]]
Но как мне лучше избавиться от символов пунктуации в этой второй версии?
Ответы
Ответ 1
Есть несколько вариантов, попробуйте удалить пунктуацию перед токенизацией. Но это означало бы, что don't
→ dont
import string
def tokenize(text):
text = "".join([ch for ch in text if ch not in string.punctuation])
tokens = nltk.word_tokenize(text)
stems = stem_tokens(tokens, stemmer)
return stems
Или попробуйте удалить пунктуацию после токенизации.
def tokenize(text):
tokens = nltk.word_tokenize(text)
tokens = [i for i in tokens if i not in string.punctuation]
stems = stem_tokens(tokens, stemmer)
return stems
EDITED
Вышеприведенный код будет работать, но он довольно медленный, поскольку он повторяется один и тот же текст несколько раз:
- Как только удалить пунктуацию
- Второй раз tokenize
- В третий раз.
Если у вас есть больше шагов, например, удаление цифр или удаление стоп-слов или нижнего индекса и т.д.
Было бы лучше объединить шаги вместе как можно больше, вот несколько более эффективных ответов, которые более эффективны, если ваши данные требуют более предварительных шагов: