fasttext无法加载训练txt文件

时间:2018-06-18 09:37:22

标签: python windows utf-8 fasttext

我正在尝试使用fasttext python包在windows中训练一个fasttext分类器。我有一个像

这样的行的utf8文件
__label__type1 sample sentence 1
__label__type2 sample sentence 2
__label__type1 sample sentence 3 

当我跑步时

fasttext.supervised('data.train.txt','model', label_prefix='__label__', dim=300, epoch=50, min_count=1, ws=3, minn=4, pretrained_vectors='wiki.simple.vec')

我收到以下错误

File "fasttext\fasttext.pyx", line 256, in fasttext.fasttext.supervised (fasttext/fasttext.cpp:7265)
  File "fasttext\fasttext.pyx", line 182, in fasttext.fasttext.train_wrapper (fasttext/fasttext.cpp:5279)
ValueError: fastText: cannot load data.train.txt

当我检查目录中的文件类型时,我得到了

__pycache__:     directory
data.train.txt:  UTF-8 Unicode text, with very long lines, with CRLF line terminators
train.py:        Python script, ASCII text executable, with CRLF line terminators
wiki.simple.vec: UTF-8 Unicode text, with very long lines, with CRLF line terminators

此外,当我尝试在MacOs中使用相同的训练文件训练相同的分类器时,它可以正常工作。我试图理解为什么无法读取该txt文件。

谢谢!

2 个答案:

答案 0 :(得分:1)

TL; DR:使用os module安全地构建路径,尤其是在Python 2中

该错误表明无法加载该文件。由于环境之间的唯一区别是操作系统,因此可能是由于每个操作系统对路径的处理方式不同,所以您没有正确定位文件。我觉得这是大多数python程序员至少犯一次错误,因为这是意外的。

您可以对路径进行硬编码,但是如果您跨平台使用,则会遇到很多问题。就我而言,有时我会在Windows中快速开发一些东西,但随后会在* nix平台上进行大规模部署。

我建议改为习惯使用os模块,因为它可以跨平台工作。在评论中说,他们的路径为“ myfolder \ nfolder \ tfolder”;通过尝试为路径构造自己的字符串,而不是在Windows上使用os模块。即使文件夹的开头不是换行符\ n和制表符\ t,该文件夹仍然无法使用,因为Windows路径需要转义斜杠(\)。使用os,您不必知道。

>>> import os
>>> os.getcwd()
'C:\\Python27'
>>> os.path.abspath(os.sep)
'C:\\'
>>> os.chdir(os.path.join(os.path.abspath(os.sep, "Users", "Jeff"))
>>> os.getcwd()
'C:\\Users\\Jeff'

通常,您将使用项目根目录中的相对路径,而不是绝对路径。这些操作比较容易,当前操作系统的根本原因是有些棘手(您可以找到答案here

(我提供了我们从评论中得出的完整答案)

编辑:也许python 3有this link说的比操作系统pathlib好。我从未使用过python 3,所以我不能说。

答案 1 :(得分:0)

我花了一些时间来创建一个环境来测试您的代码。但是我在Windows中为我工作的工作是在Cygwin中安装fastText。我希望这个答案对遇到类似问题的人有所帮助。

  

环境

  • Windows 10

  • CYGWIN_NT-10.0 DESKTOP-RR909JI 2.10.0(0.325 / 5/3)2018-02-02 15:16 x86_64

  • gcc-g ++:7.3 | gcc-core 7.3

  • Python 2.7 | Python2-Cython 0.25.2 | python2pip | Python2-开发

  • pip安装fastText

  

文件

user@DESKTOP-RR909JI ~/projects
$ file *
data.txt:         ASCII text
data.train.txt:   Big-endian UTF-16 Unicode text
fasttext_ie.py:   Python script, ASCII text executable
model.bin:        data
wiki.simple.vec:  UTF-8 Unicode text, with very long lines 
  

fastest_ie.py

#!/usr/bin/python
import fasttext

fasttext.supervised('data.txt','model', label_prefix='__label__', dim=300, epoch=50, min_count=1, ws=3, minn=4, pretrained_vectors='wiki.simple.vec')

我已经下载了预训练的单词向量(wiki.simple.vec)from here。 我已经在data.txt中复制了您的输入示例,并使用UTF-16 data.train.txt

制作了一个版本

执行代码段后,花了一段时间,但生成了一个文件,但仅在ASCII文本文件中发生过:

user@DESKTOP-RR909JI ~/projects
$ ls -ltrh model.bin
-rw-r--r-- 1 user user 129M jun. 28 00:56 model.bin

它有很多字符串:

qateel
olympiques
lesothosaurus
delillo
satrapi
conferencing
numan
echinodermata
haast
tangerines
duat
vesey
rotaviruses
velox
chepstow
capitale
rock/pop
belasco
sardanapalus
jadis
macintyre
  

尝试使用UTF-16时

它没有生成文件,但是也没有完成该过程,只是在没有完成的情况下继续运行。

所以我们可以说,它失败了。

尽管fastText说UTF-8 it's supported

  

其中data.txt是包含UTF-8编码文本的训练文件。通过   默认情况下,单词向量将考虑字符n-gram从   3至6个字符。优化结束时,程序将保存   两个文件:model.bin和model.vec。 model.vec是一个文本文件   包含单词向量,每行一个。 model.bin是一个二进制文件   包含模型的参数以及字典,以及   所有超级参数。二进制文件可稍后用于计算   字向量或重新启动优化。

我通过Cygwin安装的版本可能会有所不同。

在读取stackoverflow中的this question之后,我还要问:您是否尝试过将文件更改为ASCII并测试会发生什么情况?

我所有的文件都在同一个根目录中。

我不知道fastText,但是我想执行您的代码,这是可行的。我的gcc库有问题,我必须为g ++和core安装相同的版本。