Spacy-长时间进行预处理和词形化处理

时间:2018-09-19 02:22:17

标签: nlp text-processing spacy lemmatization

我正在研究文本分类问题,我尝试过WordNetLemmmatizer,然后尝试使用TF-IDF,CountVectorizer。现在,我正在尝试使用Spacy清理文本,然后再输入TF-IDF。输入文件有大约20,000条记录,每条记录只有很少的句子。文件的总大小为45MB。

使用WordNet进行合法化仅需几秒钟。但是下面的代码使用Spacy花费的时间太长。 20分钟后,我的笔记本电脑被挂起。请为如何优化Spacy进行文本预处理和词义化提供建议。

我正在使用Spacy 2.0.12。

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

def spacy_lemma_text(text):
    doc = nlp(text)
    tokens = [tok.lemma_.lower().strip() for tok in doc if tok.lemma_ != '-PRON-']
    tokens = [tok for tok in tokens if tok not in nltk_stopwords and tok not in punctuations]
    tokens = ' '.join(tokens)
    return tokens

df['spacy_lemma_text'] = df['text'].apply(spacy_lemma_text)

2 个答案:

答案 0 :(得分:0)

想到了几种可能的解释:

  • nltk_stopwords是一个列表,而不是集合,因此像tok not in nltk_stopwords这样的检查采用线性时间而不是常数。尝试在函数定义之前添加nltk_stopwords = set(nltk_stopwords)

  • 您可能正在运行其他spacy模型,而不仅仅是lemmatiser和tokeniser。最好明确一点(例如https://spacy.io/api/tokenizer中的示例):

    from spacy.lang.en import English
    tokenizer = English().Defaults.create_tokenizer(nlp)
    tokens = tokenizer(u'This is a sentence')
    assert len(tokens) == 4
  • 您是否多次加载了spacy模型?
  • 尽管不太可能,但您可能内存不足。在磁盘上分页会大大降低您的速度。检入系统监视器/任务管理器

答案 1 :(得分:0)

如果要遍历多个文档,则应该使用spacy的nlp.pipe函数。这将允许您合并批处理大小以及多线程。 Spacy无法按照您的建议进行设置。

另外,我认为使用nltk的停用词将成为瓶颈。如果您使用的是spacy,请继续使用spacy的停用词。相对于nltk,应该对它们进行优化以用于spacy。

{ 
    "_id" : ObjectId("5ba21ff752461dcdf9426823"), 
    "Name" : "DEFAULT"
}
{ 
    "_id" : ObjectId("5ba223b152468da741dfa316"), 
    "Name" : "Domain_1"
}
{ 
    "_id" : ObjectId("5ba223b252468da741dfa318"), 
    "name" : "ReadDomain"
}

这将使您保留存储在numpy数组中的伪哈希数据。然后可以通过访问spacy的词汇表来转换此哈希数据。我现在没有时间进行测试,但是我想它会更快。希望这会有所帮助。