使用sklearn.feature_extraction.text.TfidfVectorizer
我想训练一个带有Bag of Words tf-idf数据的分类器。
我有一个大的未标记的语料库和一个较小的标记语料库。
我打算使用标记语料库来构建分类器,基于一包带有tf-idf模型的单词。 但是,我更喜欢使用完整的语料库(包括未标记的数据)来计算idf统计信息。
使用sklearn时可以吗?
我想到的一个解决方案是构建所有语料库的模型,然后删除属于未标记数据的行。然而,语料库可能很大,可以存放在公羊中。
答案 0 :(得分:1)
如果我理解正确的话。您可以将TFIDF模型与所有数据相匹配,然后在较小的标记语料库上调用transform
:
vec =TfidfVectorizer()
model = vec.fit(alldata)
tagged_data_tfidf = vec.transform(tagged_data)
答案 1 :(得分:0)
感谢@JAB,这就是我想要的。
关于不适合RAM的数据,如果数据分布在不同的源上,可以使用迭代器或多个迭代器。就我而言,标记数据存储在文件中,而我的数据存储在mongoDB中: 文件迭代器:
workspace.onDidOpenTextDocument((doc: TextDocument) => {
if (doc.languageId == "JS" && doc.uri.scheme === "file") {
...
}
});
mongoDB迭代器:
class File2Doc(object):
def __init__(self, top_dir):
self.top_dir = top_dir
def __iter__(self):
for root, dirs, files in os.walk(self.top_dir):
for fname in filter(lambda fname: fname.endswith('.txt'), files):
with open(os.path.join(root, fname), encoding='utf8', errors='ignore') as file:
document = file.read()
yield document
将两者结合在一个迭代器中:
class Mongo2Doc(object):
"""
an iterator that builds a find pymongo cursor and saves the text field in the mongodb collection
"""
def __init__(self, query):
self.cur = query.cur
self.text_field = query.text_field
def __iter__(self):
for document in self.cur:
yield document[self.text_field]
用法示例:
class MyDocIterator(object):
'''
Expects a list of [folders] (paths) and/or a list of mongoDB [queries]
mongoDB queries have the form (collection_name, {find_query}, {projection: or text_field})
example:
mongo_query = [mongo_client.db.collection, {'optional_query': 'some_value'}, {'text':1}]
'''
def __init__(self, folders=None, mongo_query=None):
self.folders = folders
self.mongo_query = mongo_query
if self.folders is not None:
assert isinstance(self.folders, list), 'folders should be a list'
if self.mongo_query is not None:
assert isinstance(self.mongo_query,
list), 'Mongo query should be a list'
if self.folders is None and self.mongo_query is None:
raise TypeError(
'Please specify at least one folder or one mongo query')
def __iter__(self):
k = []
if self.folders is not None:
f = [File2Doc(folder) for folder in self.folders]
k.extend(f)
if self.mongo_query is not None:
m = [Mongo2Doc(query) for query in self.mongo_query]
k.extend(m)
return chain.from_iterable(k)
同样适用于TfidfVectorizer