类型错误:文件必须具有“写入”属性

问题描述

我正在尝试训练 FastText 模型。

from gensim.test.utils import datapath
from gensim.models.fasttext import FastText
from gensim.test.utils import get_tmpfile
embedding_size = 300
window_size = 10
min_word = 5
down_sampling = 1e-2
corpus_file = datapath('data.cor')
model = FastText(size=embedding_size,window=window_size,min_count=min_word,sample=down_sampling,sg=1,iter=100)
model.build_vocab(corpus_file=corpus_file)
total_words = model.corpus_total_words
model.train(corpus_file=corpus_file,total_words=total_words,epochs=5)
fname = get_tmpfile("fasttext.model")
model.save(fname)

但是出现如下错误

Traceback (most recent call last):
  File "C:\ProgramData\Anaconda3\lib\site-packages\gensim\utils.py",line 692,in save
    _pickle.dump(self,fname_or_handle,protocol=pickle_protocol)
TypeError: file must have a 'write' attribute

During handling of the above exception,another exception occurred:

Traceback (most recent call last):
  File "E:/untitled1/dfgd.py",line 21,in <module>
    model.save(fname)
  File "C:\ProgramData\Anaconda3\lib\site-packages\gensim\models\fasttext.py",line 1017,in save
    super(FastText,self).save(*args,**kwargs)
  File "C:\ProgramData\Anaconda3\lib\site-packages\gensim\models\base_any2vec.py",line 621,in save
    super(BaseAny2VecModel,self).save(fname_or_handle,**kwargs)
  File "C:\ProgramData\Anaconda3\lib\site-packages\gensim\utils.py",line 695,in save
    self._smart_save(fname_or_handle,separately,sep_limit,ignore,pickle_protocol=pickle_protocol)
  File "C:\ProgramData\Anaconda3\lib\site-packages\gensim\utils.py",line 547,in _smart_save
compress,subname)
  File "C:\ProgramData\Anaconda3\lib\site-packages\gensim\utils.py",line 609,in _save_specials
restores.extend(val._save_specials(cfname,None,pickle_protocol,compress,subname))
  File "C:\ProgramData\Anaconda3\lib\site-packages\gensim\utils.py",in _save_specials
    np.save(subname(fname,attrib),np.ascontiguousarray(val))
  File "C:\ProgramData\Anaconda3\lib\site-packages\numpy\lib\npyio.py",line 536,in save
    pickle_kwargs=pickle_kwargs)
  File "C:\ProgramData\Anaconda3\lib\site-packages\numpy\lib\format.py",line 644,in write_array
    array.tofile(fp)
OSError: 418859700 requested and 0 written

我之前训练过模型,窗口大小设置为 9 及以下。当时没有问题,也没有出现错误。 如何修复此错误

解决方法

为什么要将大型模型文件写入“临时”目录?您不想将其保存到您可以控制的明确位置吗? .save() 方法将采用您选择的任何路径。

另请注意,无论何时出现此类错误,都可能隐藏了其他一些磁盘 IO 问题,例如当前用户权限不足、数据空间不足、命名卷的路径类型非法、现有的不可更改文件等

这有助于:

  • 检查所涉及的实际确切路径(fname 的值)

  • 在同一路径上尝试其他更简单的操作,无论是从 Python 代码中,还是在它之外。 (您可以使用基本的 Python 操作将一行写入该路径吗?您可以使用 shell 操作列出该路径的封闭目录,或在该位置创建一个存根文件吗?等等)您可能会从其他人那里得到更明确的错误尝试,这显示了真正的问题。

最后,虽然像 Gensim、Python 以及它们所依赖的各种科学计算库都在 Windows 上得到官方支持,但它们往往会得到更多开发人员的关注、实际使用以及在 Linux/Unix 上的测试基于系统——所以大量的示例/教程代码,以及来自高质量答案的建议,在那里效果最好。如果现在或将来您可以选择使用非 Windows 系统进行此类工作,则可以避免很多小问题。