Word2Vec and Text Classifier
 2018-03-11

Word2Vec

  1. Skip-gram
    通过目标词汇来预测上下文。
    如:
    我 是 一名 合格 的 共产党员。
    窗口设置为2,生成对(Pair[input, label])为:
    (是, 我), (一名, 我), | (我, 是), (一名, 是), (合格, 是), | (我, 一名), ...
    
  2. CBOW (Continuous bag of words)
    上下文预测目标词汇
    
  3. 使用工具
    pip install word2vec
    
    import word2vec
    word2vec.word2vec('large_pre.dat', 'wordsVec.bin', size=300, verbose=True)
    
    数据格式要求: 空格间隔每个词。
    中文分词工具: jieba (pip)
    

    评价词向量

    ```python model = word2vec.load(“wordsVec.bin”)

    全部的单词

    model.vocab

    第几个单词

    model.vocab[index]

词向量矩阵

model.vectors

获取最近的10(默认)个

indexs = model.cosine(“西瓜”) vocabs = [model.vocab[index] for index in indexs]


4. 其他工具

gensim fasttext glove …


5. 数据来源和预处理

— 搜狗实验室全网新闻数据 http://www.sogou.com/labs/resource/list_news.php — 编码转变和content抽取 由于默认为gbk编码,需要转换成Linux上的utf-8 cat data | iconv -f gbk -t utf-8 -c | grep </content> > utf8data


# FastText --- 文本分类
## 简介

可以训练词向量,可以进行有监督的文本分类,在训练过程中会自动训练词向量,也可以导入预训练的词向量,训练速度极快。 https://github.com/facebookresearch/fastText/archive/v0.1.0.zip


1. 入门

pip install fasttext # 不支持预处理词向量 github下载安装编译,通过CLI运行 数据通过空格分割,结尾是__label___(Yes) # Yes是标签名,前缀可自定义

2. python

import logging import fasttext logging.basicConfig(format=”%(asctime)s : %(levelname)s : %(message)s”, level=logging.INFO)

classifier = fasttext.supervised(“./yes_no_wellformat_train.stat”, “./yes_no_classified.model”, label_prefix=”label”, dim=300, epoch=2, word_ngrams=1, ws=10 )

result = classifier.test(“./yes_no_wellformat_dev.stat”) print(result.precision) print(result.recall) # 召回率 print(result.nexamples) print(classifier.predict_proba([‘对于 散 在 的 比较 小 的 宫颈 腺 囊肿 一般 不需 治疗 , 只要 每年 检查 即可 ; 对于 密集 的 较 小 的 纳氏囊肿 或 比较 大 的 囊肿 , 可 考虑 光疗 、 激光 、 微波 、 自凝 刀 等 物>理治疗 ; 对于 较 大 的 突出 于 宫颈 表面 的 , 可 考虑 电刀 切除 治疗 。’])) # 需要空格分开


3. CLI

./fasttext supervised -input yes_no_wellformat_train.stat -output model -dim 300 -pretrainedVectors vocab_emb.dict -epoch 2 -loss ns


4. 效果
* epoch 不宜太大
* 预处理词向量意义不大,具体应该和规模有关
* dim大一些有好处

5. Tips
* 预处理的词向量格式

单词数 维度 单词 数字(用空格分割)

可以通过减少精度来降低词向量占用的磁盘空间 ```