0

我做了以下函数来清理我的数据集的文本注释:

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()

问题是当我想清理我所有的数据集文本时,需要一个小时一个小时。(我的数据集是 70k 行,每行 100 到 5000 个单词)

我尝试使用swifter这样的多线程运行该apply方法:data.note_line_comment.swifter.apply(clean)

但它并没有变得更好,因为它花了将近一个小时。

我想知道是否有任何方法可以制作我的函数的矢量化形式,或者可能还有其他方法来加快这个过程。任何想法 ?

4

1 回答 1

1

简短的回答

这种类型的问题本质上需要时间。

长答案

  • 使用正则表达式
  • 改变 spacy 管道

做出决定所需的有关字符串的信息越多,所需的时间就越长。

好消息是,如果您对文本的清理相对简化,一些正则表达式可能会起到作用。

否则,您将使用 spacy 管道来帮助删除成本高昂的文本位,因为它默认执行许多操作:

  1. 代币化
  2. 词形还原
  3. 依赖解析
  4. NER
  5. 分块

或者,您可以再次尝试您的任务并关闭您不想要的 spacy 管道的各个方面,这可能会加快它的速度。

例如,可能关闭命名实体识别、标记和依赖解析......

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

然后再试一次,它会加速。

于 2019-04-03T18:08:19.447 回答