Векторизованная форма функции очистки для НЛП - PullRequest
0 голосов
/ 03 апреля 2019

Я сделал следующую функцию для очистки текстовых примечаний моего набора данных:

import spacy
nlp = spacy.load("en")
def clean(text):
    """
    Text preprocessing for english text
    """
    # Apply spacy to the text
    doc=nlp(text)
    # Lemmatization, remotion of noise (stopwords, digit, puntuaction and singol characters)
    tokens=[token.lemma_.strip() for token in doc if 
            not token.is_stop and not nlp.vocab[token.lemma_].is_stop # Remotion StopWords
            and not token.is_punct # Remove puntuaction
            and not token.is_digit # Remove digit
           ]
    # Recreation of the text
    text=" ".join(tokens)

    return text.lower()

Проблема в том, что когда я хочу очистить весь текст моего набора данных, это занимает час и час. (мой набор данных состоит из 70 тысяч строк и от 100 до 5000 слов в строке)

Я пытался использовать swifter, чтобы запустить метод apply для нескольких потоков, например: data.note_line_comment.swifter.apply(clean)

Но лучше не стало, так как это заняло почти час.

Мне было интересно, есть ли какой-нибудь способ сделать векторизованную форму моей функции или, возможно, и другой способ ускорить процесс. Есть идеи?

1 Ответ

1 голос
/ 03 апреля 2019

Короткий ответ

Этот тип проблемы по своей природе требует времени.

Длинный ответ

  • Использование регулярных выражений
  • Изменение конвейера пространства

Чем больше информации о строках вам нужно для принятия решения, тем дольше это займет.

Хорошая новость заключается в том, что если очистка текста относительно упрощена, несколько регулярныхвыражения могут помочь.

В противном случае вы используете просторный конвейер, чтобы помочь удалить биты текста, который является дорогостоящим, поскольку по умолчанию он выполняет множество функций:

  1. Tokenisation
  2. Лемматизация
  3. Разбор зависимостей
  4. NER
  5. Chunking

В качестве альтернативы, вы можете попробовать еще раз свою задачу и отключить аспекты простотыконвейер, который вам не нужен, который может немного ускорить его.

Например, возможно, отключить распознавание именованных объектов, разметку и анализ зависимостей ...

nlp = spacy.load("en", disable=["parser", "tagger", "ner"])

Затем попробуйте снова, это ускорится.

...