fasttext简单理解及应用

fasttext作为NPL领域中机器学习的优秀范例值得研究。

模型架构

我对fasttext模型架构理解与CBOW很像。
在训练时,通过N-gram把词向量喂入模型,输出属于各类的概率,并比对标签修正模型
在预测时,输入的是词序列,输出的是属于各类概率,取最大概率
实际上还是一个单层的神经网络系统,一般来说损失函数用得softmax

但是它快的原因,在于使用了Hierarchical softmax其实就是所谓的霍夫曼树结构:该树每个叶节点都是一个词语,softmax的结果无非就是一个概率,那么我们要找某一个词时,就是计算到该单词的路径中概率积。

详细架构,我在论文精读中有介绍

参数调节

fasttext.supervised 参数如下

input_file                 训练文件路径(必须)
output                     输出文件路径(必须)
label_prefix               标签前缀 default __label__
lr                         学习率 default 0.1
lr_update_rate             学习率更新速率 default 100
dim                        词向量维度 default 100
ws                         上下文窗口大小 default 5
epoch                      epochs 数量 default 5
min_count                  最低词频 default 5
word_ngrams                n-gram 设置 default 1
loss                       损失函数 {ns,hs,softmax} default softmax
minn                       最小字符长度 default 0
maxn                       最大字符长度 default 0
thread                     线程数量 default 12
t                          采样阈值 default 0.0001
silent                     禁用 c++ 扩展日志输出 default 1
encoding                   指定 input_file 编码 default utf-8
pretrained_vectors         指定使用已有的词向量 .vec 文件 default None

在调参之前,对于训练数据的样本有这样的规定。
每条数据+"\t"+"label_prefix"+标签
也就是标签在每条数据之后,并用label_prefix作为前缀

目前我的实验中word_ngrams,minn,maxn是无法调节的。
主要调节的是min_count ,epoch。前者在数据小的情况下,调1的效果最好,epoch适量,在一定程度上增加该值会提高召回率。

  • 有关minn与maxn需要知道n-char的概念
    n-gram和n-char
    fasttext方法不同与word2vec方法,引入了两类特征并进行embedding。其中n-gram颗粒度是词与词之间,n-char是单个词之间。两类特征的存储均通过计算hash值的方法实现。
    n-gram

示例: who am I? n-gram设置为2

n-gram特征有,who, who am, am, am I, I
n-char

示例: where, n=3, 设置起止符<, >
n-char特征有,<wh, whe, her, ere, er>

所以对于中文而言,输出的词可能没必要再细分,故n-char可为0,但是在词与词语义中会有一定联系,根据情况来设定n-gram

预测问题
model.predict(list,k)
model.predict_proba(list,k)

第一个函数输出最有可能的k个类
第二个函数输出最有可能的k个类及其概率
第一个参数一定是list!!!!这个值得注意

词向量

fasttext可通过cbow/skipgram两种模型训练词向量
且训练出的词向量距离也能表示相近程度

def train_unsupervised(input, model="skipgram", lr=0.05, dim=100, 
                   ws=5, epoch=5, minCount=5, 
                   minCountLabel=0, minn=3, 
                   maxn=6, neg=5, wordNgrams=1, 
                   loss="ns", bucket=2000000, 
                   thread=12, lrUpdateRate=100,
                   t=1e-4, label="__label__", 
                   verbose=2, pretrainedVectors=""):

或用

  • 参数
    input_file 训练文件路径(必须)
    output 输出文件路径(必须)
    lr 学习率 default 0.05
    lr_update_rate 学习率更新速率 default 100
    dim 训练的词向量维度 default 100
    ws 上下文窗口大小 default 5
    epoch epochs 数量 default 5
    min_count 最低出现的词频 default 5
    word_ngrams n-grams 设置
    loss 损失函数 {ns,hs,softmax} default ns
    minn 最小字符长度 default 3
    maxn 最大字符长度 default 6
    thread 线程数量 default 12
    t 采样阈值 default 0.0001
    silent 禁用 c++ 扩展日志输出 default 1
    encoding 指定 input_file 的编码 default utf-8
    # skipgram model
    model = fasttext.skipgram('train.txt','model',lr = 0.1,dim = 300)
     
    # cbow model
    model = fasttext.cbow('train.txt','model',lr = 0.1,dim = 300)

例如我用评论作为训练集,

model = fasttext.skipgram('mydata2.txt','model',lr = 0.1,dim = 10)
print model['好评']
print model['不错']

输出:
[-1.0843074321746826, 0.21589583158493042, 0.1687242090702057, 0.11248864978551865, -0.8439181447029114, -1.3056985139846802, 0.5022682547569275, 0.08825510740280151, 0.8310032486915588, 0.04486303776502609]
[-0.7305361032485962, 1.175795078277588, 0.45464813709259033, -0.3532727360725403, -0.021342813968658447, -0.5648921728134155, 0.4911344051361084, 0.6292283535003662, 0.004915270954370499, 0.2739366292953491]

参考
https://blog.csdn.net/ymaini/article/details/81489599
https://blog.csdn.net/qq_32023541/article/details/80845913
https://www.jianshu.com/p/e828f02e41c8
论文:Bag of Tricks for Efficient Text Classification

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,919评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,567评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,316评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,294评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,318评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,245评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,120评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,964评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,376评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,592评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,764评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,460评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,070评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,697评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,846评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,819评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,665评论 2 354

推荐阅读更多精彩内容