我正在研究文本分类问题,我尝试过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)
答案 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
答案 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的词汇表来转换此哈希数据。我现在没有时间进行测试,但是我想它会更快。希望这会有所帮助。