【问题标题】:Sklearn TFIDF on large corpus of documents大型文档语料库上的 Sklearn TFIDF
【发布时间】:2018-12-27 14:15:17
【问题描述】:

在实习项目的上下文中,我必须对大量文件 (~18000) 执行 tfidf 分析。我正在尝试使用 sklearn 中的 TFIDF 矢量化器,但我面临以下问题:如何避免一次将所有文件加载到内存中?根据我在其他帖子上阅读的内容,使用可迭代对象似乎是可行的,但是如果我使用例如 [open(file) for file in os.listdir(path)] 作为 raw_documents 输入对于 fit_transform() 函数,我收到“打开的文件太多”错误。 提前感谢您的建议! 干杯! 保罗

【问题讨论】:

  • 你试过genism tfidf模型吗?
  • 试试“[open(fn).read() for fn in os.listdir(path)]”?这一次将所有文件加载到内存中。但是内存很少是文本数据的问题。
  • @SreeramTP 我现在正在尝试坚持使用 sklearn,但如果我找不到解决方案,我会尝试一下,谢谢 ;)
  • 好的。 Genism 模型内存效率高且速度快。您可以从这里了解更多信息:radimrehurek.com/gensim/intro.html
  • @phi 这个问题是它会从内存中一次加载文件中的所有 txt 以创建该列表,但我认为使用括号而不是括号的完全相同的语法可能会起作用,因为它创建了一个我认为的生成器:''(open(fn).read() for fn in os.listdir(path))''。我目前正在尝试!谢谢:)

标签: python scikit-learn tfidfvectorizer


【解决方案1】:

您是否尝试过 TfidfVectorizer 中的 input='filename' 参数?像这样的:

raw_docs_filepaths = [#List containing the filepaths of all the files]

tfidf_vectorizer =  TfidfVectorizer(`input='filename'`)
tfidf_data = tfidf_vectorizer.fit_transform(raw_docs_filepaths)

这应该可以工作,因为在这种情况下,矢量化器将在处理该文件时一次打开一个文件。这可以通过交叉检查source code here来确认

def decode(self, doc):
...
...
    if self.input == 'filename':
        with open(doc, 'rb') as fh:
            doc = fh.read()
...
...

【讨论】:

  • 非常感谢您花时间回答!这可能正是我想要的!与此同时,我找到了一个 hacky 方法,通过提供一个生成器而不是 list 作为 fit_transform 的输入:file_objects = (open(os.path.join(txt_train_path, file)).read() for file in train_files if file.endswith("txt")
  • 在这个https://stackoverflow.com/questions/51633775/store-tf-idf-matrix-and-update-existing-matrix-on-new-articles-in-pandas#51634394 中需要你帮助吗?
猜你喜欢
  • 2015-11-21
  • 2015-01-24
  • 1970-01-01
  • 2011-08-22
  • 1970-01-01
  • 1970-01-01
  • 2023-03-09
  • 2018-11-17
  • 1970-01-01
相关资源
最近更新 更多