自然语言处理之gensim库使用

但凡谈及自然语言处理,我们都会想到词向量,那么怎么快速地获得词向量呢?最简单的方法就是word2vec。本文不深究word2vec的原理,网上很多细致深入的解读,大家可以自行搜索。今天总结一下如何快速训练自己的词向量,作为参考手册。

1、 语料

丰富、高质量的语料是词向量成功第一步。

前两天学到一个名词,叫自监督学习,word2vec就是其中一种。自己监督自己,很容受到噪声的干扰,如果数据不干净,结果也会谬以千里。

word2vec虽然不是统计算法,但是训练过程中很大程度上在理解上下文,在理解共现关系。丰富的语料,才能保证对词语正确的理解。很多低频词由于训练不足,词向量基本是随机初始化的,导致在计算词语top-n相似词语的时候出现一些匪夷所思的噪声。

所以请一定多获取数据,多思考怎么把数据过滤得更干净。

2、分词

词向量,词向量,故名思义,首先要有词语,使用分词工具把语料分割为词语序列。

中文分词哪家强?常用的有jieba、ltp(哈工大)、thulac(清华)...这几种分词工具各有优劣。不过对于具体领域的任务,我们通常通过加载额外的领域词典,来对分词工具进行补充。这里可能还涉及领域内的新词发现,不展开了。

如果你觉得这些工具都是垃圾,可以自行训练分词模型,常用的有动态规划,隐马尔可夫,以及深度学习分词算法。

3、构建词向量模型

gensim正式登场,其实可以直接使用word2vec库,但是个人觉得gensim库功能更全面,推荐使用。

  • 读取语料,如果你的数据很少,那就简单,把数据全部读到内存中。存到一个二位数组里,[[w1,w2,...], ...], 里面的数组表述文本,外面表示所有文本的集合。但是当你的语料很大时,建议逐步加载。官方建议定义一个数据读取的类:
class MyCorpus(object):
    """An interator that yields sentences (lists of str)."""
    def __init__(self, corpus_file, stopwords_dict=None):
        self.corpus_file = corpus_file
        self.stopwords_dict = stopwords_dict

    def __iter__(self):
        count = 0
        for line in open(self.corpus_file):
            # assume there's one document per line, tokens separated by whitespace
            if self.stopwords_dict is not None:
                # 过滤停用词
                line_seg = line.split(" ")
                line_seg = [w for w in line_seg if w not in stopwords_dict]
                line = " ".join(line_seg)
            count += 1
            if count % 10000 == 0:
                print(f"load {count} lines ...")
            yield utils.simple_preprocess(line)

也可以使用gensim的函数:gensim.models.word2vec.PathLineSentences。

  • 模型训练,
sentences = MyCorpus(input_file, stopwords_dict=stopwords_dict)
gensim.models.Word2Vec(sentences, size=vec_size, window=5, min_count=5, sample=1e-5, workers=8, sg=0)
model.wv.save_word2vec_format(output_file, binary=False)

其中size表示词向量的维度;window表示生成训练数据的窗口;min_count表示最小的词频,小于最小词频的词语会被直接过滤掉,不会参与模型训练;sample是正样本降采样的概率大小,来降低高频词的训练次数,避免过度拟合;worker多线程数;sg选训练模式,1表示使用skip-gram(通过当前词语预测上下文词语),0表示使用cbow(通过上下文词语预测当前词语)。

最终通过model.wv.save_word2vec_format把模型保存下来。

4、应用

词向量的应用,最直观的就是计算近义词了,比如你输入“如花”,可能召回“似玉”。

  • 加载模型
 model = gensim.models.KeyedVectors.load_word2vec_format(output_file)
  • 计算top-n相似词
topn_simi_words = model.most_similar("如花", topn=K)

除计算近义词,比较炫酷的应用是通过词向量减法来获取一些潜在关系,比如王子-公主=国王-王后,这也是当年词向量出来后,给的demo,让人觉得眼前一亮。此外,现在训练深度学习模型,通常喜欢预训练词向量,克服标注数据不足的问题。

词向量让我们能够从几何的角度理解语义,并可视化,是一个从抽象到具体的炫酷过程。虽然咱们只是观众,忍不住要欢呼,牛逼!词向量很容易推广到其他类型的iterm,只要能够能到有意义的iterm序列,就能得到iterm向量。最近有野心者觉得一切皆可embedding,一切可以向量化,你觉得可能么?

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