官网安装链接,英文阅读无障碍转移: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???我不吉岛为什么。。