В настоящее время я выполняю очистку данных в этом наборе спам-текстовых сообщений .В этом текстовом сообщении много эллипсов, например:
mystr = 'Go until jurong point, crazy.. Available only in bugis n great world la e buffet... Cine there got amore wat...'
Как видите, существуют эллипсы с 2 периодами (..
) или 3 периодами (...
)
Первоначально я решил написать функцию spacy_tokenizer
, которая маркирует мои строки, удаляет стоп-слова и знаки препинания:
import spacy
nlp = spacy.load('en_core_web_sm')
from nltk.corpus import stopwords
stopWords = set(stopwords.words('english'))
print(stopWords)
import string
punctuations = string.punctuation
def spacy_tokenizer(sentence):
# Create token object
mytokens = nlp(sentence)
# Case normalization and Lemmatization
mytokens = [ word.lemma_.lower() if word.lemma_ != "-PRON-" else word.lower_ for word in mytokens ]
# Remove stop words and punctuations
mytokens = [ word.strip(".") for word in mytokens if word not in stopWords and word not in punctuations ]
# return preprocessed list of tokens
return mytokens
Однако эта функция не избавляет от эллипсов
IN: print(spacy_tokenizer(mystr))
OUT: ['go', 'jurong', 'point', 'crazy', '', 'available', 'bugis', 'n', 'great', 'world', 'la', 'e', 'buffet', '', 'cine', 'get', 'amore', 'wat', '']
Как видите, есть токены с len(token) = 0
, которые выглядят как ''
Мой обходной путь - добавить еще одно понимание списка к spacy_tokenizer
, которое выглядит примерно так: [ word for word in mytokens if len(word) > 0]
def spacy_tokenizer(sentence):
# Create token object
mytokens = nlp(sentence)
# Case normalization and Lemmatization
mytokens = [ word.lemma_.lower() if word.lemma_ != "-PRON-" else word.lower_ for word in mytokens ]
# Remove stop words and punctuations
mytokens = [ word.strip(".") for word in mytokens if word not in stopWords and word not in punctuations ]
# remove empty strings
mytokens = [ word for word in mytokens if len(word) > 0]
return mytokens
IN: print(spacy_tokenizer(mystr))
OUT: ['go', 'jurong', 'point', 'crazy', 'available', 'bugis', 'n', 'great', 'world', 'la', 'e', 'buffet', 'cine', 'get', 'amore', 'wat']
Таким образом, новая функция дает ожидаемый результат, но я думаю, что это не самое элегантное решение.У кого-нибудь есть альтернативные идеи?