更快的sklearn-tf-idf矢量器



我试图在一个项目中使用sklearn的Tfidf矢量器,但Tfidf向量器似乎占用了很多时间。。。

import spacy
from sklearn.feature_extraction.text import TfidfVectorizer
def tokenize_spacy(sentence):
nlp = spacy.load('ja_core_news_lg')
doc = nlp(sentence)
return [w.text for w in doc]
def read_corpus(filename):
corpus = []
with open(filename, 'r', encoding='utf-8') as fin:
for line in fin:
line = line.rstrip('n')
corpus.append(line)
return corpus
vectorizer = TfidfVectorizer(tokenizer=tokenize_spacy, ngram_range=(1, 4), stop_words=stop_words)
corpus = read_corpus(args.corpus)
matrix = vectorizer.fit_transform(corpus)

模型'ja_core_news_lg'来自这里,语料库文件的大小为2.7GB,stop_words是长度小于100的数组。矢量器已经运行了48个多小时,所以我想知道是否有办法更有效地安装矢量器,或者是否有更快的替代方法。

我有56个CPU,但这个程序似乎只在其中一个CPU上运行。我已经看到了这个答案,但由于我之后需要进行vectorizer.get_feature_names(),所以使用HashingVectorizer似乎不太适合我

任何帮助都将不胜感激,非常感谢!

矢量器不是问题所在,它是使您速度减慢的令牌化器。

对于每个文档,tokenize函数都会重新加载spacy模型,这显然需要花费大量时间。相反,尝试只加载一次spacy模型:

nlp = spacy.load('ja_core_news_lg')
def tokenize_spacy(sentence):
doc = nlp(sentence)
return [w.text for w in doc]
def read_corpus(filename):
corpus = []
with open(filename, 'r', encoding='utf-8') as fin:
for line in fin:
line = line.rstrip('n')
corpus.append(line)
return corpus
vectorizer = TfidfVectorizer(tokenizer=tokenize_spacy, ngram_range=(1, 4), stop_words=stop_words)
corpus = read_corpus(args.corpus)
matrix = vectorizer.fit_transform(corpus)

这有什么不同吗?

最新更新