非 R 用户可以使用命令行来使用 GloVe 算法,她在独立的仓库中,text2vec-cli

这是 text2vec-cli 的 README 内容:

text2vec-cli 适用于不了解 R,但是希望使用 GloVe 其他实现的用户,相比于原有的实现,text2vec 的速度更快,是它的两倍。text2vec 同时使用了 L1 正则化,这对于小数据集十分有用,比单纯的 GloVe 具有更好的泛化性。

text2vec 的一个限制是,它在内存中计算共现统计量。这个对于大语料库来说可能是一个问题。比如,你可以在一个 32gb 的机器上使用 window=10 的设置来处理包含 400000 独立字段的英文 wikipedia 文本。

安装

R

你需要安装 R 3.2+,参见 CRAN

对于主流的 linux 发行版,安装则更为简单:

Ubuntu

# change following line accordingly to your system:
# https://cran.r-project.org/bin/linux/ubuntu/
# here is string for ubuntu 14.04
echo 'deb https://cloud.r-project.org/bin/linux/ubuntu trusty/' | sudo tee --append /etc/apt/sources.list
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys E084DAB9
sudo apt-key update
# install dependencies
sudo apt-get install -y libssl-dev libcurl4-openssl-dev git
# isntall R
sudo apt-get install -y r-base r-base-dev

Centos/Fedora/RHEL

类似的步骤参见 这里

sudo yum install openssl-devel libcurl-openssl-devel R

text2vec

R 安装后,克隆这个仓库,同时将脚本设置为可执行的,

git clone https://github.com/dselivanov/text2vec-cli.git
cd text2vec-cli
# make scripts executable
chmod +x install.R vocabulary.R cooccurence.R glove.R analogy.R

安装 text2vec:

./install.R

使用

直接上代码!

wget http://mattmahoney.net/dc/text8.zip
./vocabulary.R files=text8.zip vocab_file=vocab.rds
./cooccurence.R files=text8.zip vocab_file=vocab.rds vocab_min_count=5 window_size=5 cooccurences_file=tcm.rds
./glove.R cooccurences_file=tcm.rds word_vectors_size=50 iter=10 x_max=10 convergence_tol=0.01
./analogy.R

注意

text2vec-cli 是为非 R 用户设计的,我们假设他们熟悉自己的编程语言,并能够使用它们熟悉的工具来预处理输入数据。

同时,与 text2vec R包相比,text2vec-cli 是单线程的(除了 GloVe 训练时多线程的)。

输入数据

text2vec 按行来处理数据文件,他将每个文件读入内存,处理文件,然后读取下一个文件。如果你的文本集是一个大文本,比如若干GB我们推荐使用 split 工具将它分割成区块。

比如,你的数据是 BIG_FILE.gz

  • 解压文件到流中,并将它输出到 pipe
  • 按行将流分解为不超过 100mb 的若干区块。
  • 将每个区块输出到 pipe 中,压缩并保存到磁盘中
gunzip -c BIG_FILE.gz | split --line-bytes=100m --filter='gzip --fast > ./chunk_$FILE.gz'

对于 OS X 用户,可以安装 coreutilsbrew install coreutils 或者使用 gsplit 而不是 split。

我们假设:

  1. 文档已经经过预处理(小写文本,词干化等)
  2. 输入文件等每一行代表一个文档。
  3. 词或者 tokens 使用空格分隔。
  4. 以 .gz, .bz2, .xz, .zip 可以自动解压。文件以 http://, https://, ftp://, 或者 ftps://

训练

为了拟合 GloVe 模型,用户需要下面的步骤,

生成词汇表

./vocabulary.R files=text8.zip vocab_file=vocab.rds

参数:

  1. files - 输入文件的文件名 多个文件使用英文逗号进行分割 files=file1,file2
  2. dir - 目录下的文件都会被使用
  3. vocab_file - 输出文件的文件名

生成共现矩阵信息

./cooccurence.R files=text8.zip vocab_file=vocab.rds vocab_min_count=5 window_size=5 cooccurences_file=tcm.rds

参数:

  1. files - 输入文件的文件名 多个文件使用英文逗号进行分割 files=file1,file2
  2. dir - 目录下的文件都会被使用
  3. vocab_file - 词汇表文件
  4. vocab_min_count - 删减词汇表,只使用出现超过指定次数的字段。
  5. window_size - 使用多少个临近的词汇用来计算共现信息。
  6. cooccurences_file - 输出文件

训练 GloVe 模型

./glove.R cooccurences_file=tcm.rds word_vectors_size=50 iter=10 x_max=10 convergence_tol=0.01

参数:

  1. cooccurences_file - 共现信息文件名
  2. word_vectors_size - 词向量的维度
  3. iter - 优化算法的迭代次数
  4. x_max - 最大共现值。与原有实现的 X_MAX对应。
  5. convergence_tol - 0.01 默认值。若每个 epoch 的模型改进小于指定值,则停止训练。
  6. lambda - L1 正则化参数. 一般在 1e-4 到 1e-5 之间.
  7. learning_rate - 0.2 默认值. AdaGrad 到初始速率. 不推荐修改。
  8. clip_gradients - 10 默认值。用这个数值来裁剪梯度。不推荐修改。
  9. alpha - 0.75 默认值。

测试 word-analogy 任务的准确性

./analogy.R
text2vecDmitry Selivanov 和其他开发者一起开发。 © 2016.
如果您发现了 bugs 等问题,请到GitHub 报告。