Как изящно удалить эллипсы n-длины из строк (NLP с простором)? - PullRequest
1 голос
/ 08 июля 2019

В настоящее время я выполняю очистку данных в этом наборе спам-текстовых сообщений .В этом текстовом сообщении много эллипсов, например:

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']


Таким образом, новая функция дает ожидаемый результат, но я думаю, что это не самое элегантное решение.У кого-нибудь есть альтернативные идеи?

Ответы [ 2 ]

0 голосов
/ 08 июля 2019

Это удалит эллипсы из 2 или 3 периодов:

import re

regex = r"[.]{2,3}"
test_str = "Go until jurong point, crazy.. Available only. in bugis n great world la e buffet... Cine there got amore wat..."
subst = ""

result = re.sub(regex, subst, test_str)

if result:
    print (result)

Вы также можете поиграть с ним здесь , если хотите.

0 голосов
/ 08 июля 2019

Если вас вообще не заботит пунктуация (кажется, что так вы удаляете запятую в предложенном вами примере), вам следует рассмотреть вопрос об удалении всех знаков препинания.

import re

sent = 'Go until jurong point, crazy.. Available only in bugis n great world la e buffet... Cine there got amore wat...'
multipunc = re.compile("[\.,]+")
sent = multipunc.sub(" ", sent).lower().split()

Эта функция в настоящее время не учитывает знаки препинания, кроме . и ,. Если вы хотите удалить что-либо, кроме буквенно-цифровых символов, вы можете использовать класс символов \w.

...