linux下构建fastext(官网翻译)

3 篇文章 0 订阅

官网安装链接,英文阅读无障碍转移:fastext

1. 安装步骤

首先,

Generally, fastText builds on modern Mac OS and Linux distributions.

fastext只支持linux和mac,非想在windows下用的话,你可以用gensim.models.fasttext。

依赖环境:

g++-4.7.2或以上
Python 2.7或python 3.4或以上
NumPy & SciPy

安装方式有两种

1)使用make安装(官网推荐)

cd到合适目录后($表示命令行提示符),

$ wget https://github.com/facebookresearch/fastText/archive/v0.2.0.zip
$ unzip v0.2.0.zip
$ cd fastText-0.2.0
$ make

2) 使用cmake安装

$ git clone https://github.com/facebookresearch/fastText.git
$ cd fastText
$ mkdir build && cd build && cmake ..
$ make && make install

安装成功后,你就构建了fastext工具包,可以直接命令使用,官网提供两种用途:

1)训练词向量

$ ./fasttext skipgram -input data.txt -output model

其中data.txt为train_data,model为输出路径 + model_name,程序运行后生成.bin和.vec两个文件,model.vec是包含单词vectors的文本文件,每行一个。model.bin是一个二进制文件,包含模型的参数以及字典和所有超参数。

data.txt中的数据格式可以为,以__label__x标记,其中__label__为标识符,x为对应分类号,标记与文本以\t分隔:

__label__0	张 汝 鹏 主 任 医 师 : 

数据生成python代码示例:

def read_data(path, tag):
    # 读原始数据
    new_line = []
    for line in open(path, 'r', encoding='utf-8'):
        line_split = ' '.join(line)
        label = label_mapping.get(tag)
        new_line.append(label + '\t' + line_split)
    return new_line


def write_to_txt(path, lines):
    # 写入文档
    with open(path, 'w', encoding='utf-8') as writer:
        for line in lines:
            writer.write(line)


def get_format_train_data():
    new_line = read_data(os.path.join(INPUT_PATH, 'key.data'), 'key')
    write_to_txt(os.path.join(PROCESS_PATH, 'train_data.txt'), new_line)


if __name__ == '__main__':
    get_format_train_data()
    print('complete!')

 模型训练完成后,可以使用如下命令训练词向量:

$ ./fasttext print-word-vectors model.bin < test.txt

 这将输出字向量到标准输出,每行一个向量。

2)文本分类

使用如下命令即可进行分类模型训练,其中train.txt为训练文本,格式同上,model为训练模型路径+名字。

$ ./fasttext supervised -input train.txt -output model

 使用训练模型进行测试,其中model.bin为上面训练好的模型名称,text.txt为测试集,格式同上:

$ ./fasttext test model.bin test.txt k

计算测试集中的P和R:

$ ./fasttext predict model.bin test.txt k

 输出测试集中最可能的k的标签

$ ./fasttext predict-prob model.bin test.txt k

2. 为python构建fastext接口,也就在python代码中使用,而不是把fasttext当做工具使用。

三种方法:

方法1.

$ git clone https://github.com/facebookresearch/fastText.git
$ cd fastText
$ pip install .

方法2.

$ git clone https://github.com/facebookresearch/fastText.git
$ cd fastText
$ python setup.py install

方法3.

$ pip install fasttext==0.8.3

 推荐使用方法3,操作简单,只要依赖环境支持即可。

这样可以使用import fasttext导入

使用代码示例:

import fasttext as ft
import os

INPUT_PATH = './training_data/'
RES_PATH = './res/'

def train():
    """训练"""
    classifier = ft.supervised(os.path.join(INPUT_PATH, 'train_data.txt'),
                               os.path.join(RES_PATH, 'key_fasttext.model'), label_prefix="__label__")


def test():
    """测试"""
    classifier = ft.load_model(os.path.join(RES_PATH, 'key_fasttext.model'), label_prefix="__label__")
    res = classifier.test(INPUT_PATH + 'test_data.txt')
    print('P', res.precision)
    print('R', res.recall)


def predict():
    """预测"""
    tests = ['签 名']
    classifier = ft.load_model(os.path.join(RES_PATH, 'key_fasttext.model.bin'))
    labels = classifier.predict(tests)
    print(labels)


def test_by_category():
    """按类别计算p,r,f1"""
    labels_right = []
    texts = []
    classifier = ft.load_model(os.path.join(RES_PATH, 'key_fasttext.model.bin'), label_prefix="__label__")
    for line in open(INPUT_PATH + 'test_data.txt'):
        label = line.split("\t", 1)[0].rstrip().replace("__label__", "")
        labels_right.append(label)
        texts.append(line.split("\t", 1)[1])
    # labels_predict = [['1'], ['1'], ['1'], ['0'], ['0'], ['0']]
    labels_predict = [e[0] for e in classifier.predict(texts)]  # 预测输出结果为二维形式
    # print(labels_predict)

    text_labels = list(set(labels_right))
    text_predict_labels = list(set(labels_predict))
    # print(text_predict_labels)
    # print(text_labels)

    res = classifier.test(INPUT_PATH + 'test_data.txt')
    print('total pre', res.precision)
    print('total recall', res.recall)

    A = dict.fromkeys(text_labels, 0)  # 预测正确的各个类的数目
    B = dict.fromkeys(text_labels, 0)  # 测试数据集中各个类的数目
    C = dict.fromkeys(text_predict_labels, 0)  # 预测结果中各个类的数目
    for i in range(0, len(labels_right)):
        B[labels_right[i]] += 1
        C[labels_predict[i]] += 1
        if labels_right[i] == labels_predict[i]:
            A[labels_right[i]] += 1
    print('predict data:', C)
    print('real data:', B)
    # 计算准确率,召回率,F值
    for key in B:
        # C是预测正的,B是本来正的
        p = round(A[key]/C[key], 6)
        r = round(A[key]/B[key], 6)
        f = p * r * 2 / (p + r)
        if key == '1':
            print("is_key:\tp:%f\tr:%f\tf1:%f" % (p, r, f))
        else:
            print("not_key:p:%f\tr:%f\tf1:%f" % (p, r, f))


if __name__ == '__main__':
    # reduce_data_for_fastext()
    # train()
    # predict()
    test_by_category()
    print('complete!')

note:

在不同的服务器上,我一样的进行

$ git clone https://github.com/facebookresearch/fastText.git
$ cd fastText
$ make

然后再pip install fasttext,然后,有的时候安装的是fasttext,有的时候是fastText???我不吉岛为什么。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值