【问题标题】:fasttext cannot load training txt filefasttext 无法加载训练 txt 文件
【发布时间】:2018-11-27 03:02:01
【问题描述】:

我正在尝试使用 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 文件。

谢谢!

【问题讨论】:

  • 不确定是什么导致了这种行为,但 fasttext 仅适用于 Linux/MacOS。它需要良好的 C++ 支持。查看官方github repo。你也可以看看这个answer
  • 您可以添加更多代码和示例(我也可以上传您的文件)吗?我已经使用 wiki.simple.vec 和 data.train.txt 样本进行了尝试,并且效果很好: >>> 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')
  • 另外,如果你不习惯 Windows,你确定 cwd 指向正确的地方吗?您可以尝试使用 os.path.join() 并构建 .txt 文件的完整绝对路径,看看是否仍然存在问题。 Python 不像现代 MacOS 那样本身就是 Windows 的一部分,因此它的行为可能与您习惯的不同。 techibee.com/python/get-current-directory-using-python/2790
  • @user8212173,谢谢,我知道官方不支持,从lfd.uci.edu/~gohlke/pythonlibs拿了轮子,成功内置在我的windows机器上
  • 如果您需要使用包含 \n 和 \t(或 \b 或 \a 或其他一些)的 Windows 路径,这里有两种方法: "myfolder\\nfolder\\tfolder") 或在字符串常量前使用带有“r”的“原始”字符串 (r"myfolder\nfolder\tfolder")

标签: python windows utf-8 fasttext


【解决方案1】:

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

错误表明无法加载文件。由于您的环境之间的唯一区别是操作系统,因此线索是您没有正确定位文件,因为每个操作系统处理路径的方式不同。我觉得这是大多数 Python 程序员至少犯过一次的错误,因为它出乎意料。

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

我建议习惯于使用 os 模块,因为它可以跨平台工作。在评论中说他们的路径是“myfolder\nfolder\tfolder”;通过尝试为路径构建自己的字符串而不是使用 os 模块.. 在 Windows 上,即使文件夹没有以换行符 \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

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

编辑:也许 python 3 有一些东西 this link 说比 os 更好,pathlib。我从来没有使用过python 3,所以我不能说。

【讨论】:

  • 看起来很合理。但是我们不知道用户的环境。我用 Cygwin 创建了类似的东西,它在没有绝对路径的情况下工作。
  • @Miguel 你的评论毫无意义。我从来没有说过他应该使用绝对路径。我的回答说你通常不应该。我的回答完全独立于用户环境,这就是 os 模块的重点。原贴在评论中特别说他们有“myfolder\nfolder\tfolder”的路径;在 Windows 上,这失败不是因为文件夹以换行符 \n 和制表符 \t 开头,它们失败是因为 Windows 路径需要转义斜杠 (\)。使用 os,你不必知道。我会将此示例添加到我的答案中。
  • 好吧,实际上我想说的是,如果文件在根文件夹中,则不定义路径,即与操作系统无关。
【解决方案2】:

我花了一点时间来创建一个环境来测试您的代码。但我在 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-devel

  • pip install 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 制作了一个版本

执行你的代码sn-p后,花了一段时间,但生成了一个文件,但它只发生在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++ 和核心安装相同的版本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-01
    • 2021-03-29
    • 1970-01-01
    • 1970-01-01
    • 2019-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多