6

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

谢谢!

4

2 回答 2

3

TL;DR:使用os 模块安全地构建路径,尤其是在 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'

通常,您将使用项目根目录中的相对路径,而不是绝对路径。那些更容易,当前操作系统的根有点棘手(你可以在这里找到答案)

(正如我们从评论中得出的那样,我提供了完整的答案)

编辑:也许 python 3 有这个链接说比 os, pathlib更好的东西。我从来没有使用过python 3,所以我不能说。

于 2018-06-27T23:47:20.130 回答
0

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

环境

  • 窗口 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核心7.3

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

  • 点安装 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 

最快的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) 。我已经复制了您的输入示例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

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

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

在stackoverflow中阅读了这个问题后,我想问一下:您是否尝试过将文件更改为ASCII并测试会发生什么?

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

我不知道 fastText 但我想执行你的代码,它有效。我遇到了 gcc 库的问题,我必须为 g++ 和核心安装相同的版本。

于 2018-06-28T05:32:12.320 回答