Word2vec 学习笔记

0. 引言

最近研究向量检索,看到有同事使用 MeCab、Doc2Vec,所以把 Word2vec 这块知识学习一下。

1. Word2vec 简介

Word2vec 即 word to vector,顾名思义,就是把词转换成向量,该方法在 2013 年由谷歌公司提出并实现。

笼统地说,Word2vec 的原理是根据词语的上下文来提取一个词的语义,在统计上,词义相同的词的上下文也应该比较类似。例如"猫"和"狗"都是人类的宠物,可能会和"喂"“可爱”"粘人"之类的词一起出现,通过这样的规律,我们可以得出"猫"和"狗"这两个词的相似性。

该方法使在深度学习中使用很大的词表成为可能。

Word2vec 可以解决 One-Hot 表示法的词向量维度高且无法体现词语意义的问题,也就是说 One-Hot 表示法的 0 和 1 是无规律的,而 Word2vec 产生的词向量能体现词语间的关系。

该方法有以下特点:

  • 第一,算法效率高,可以在百万数量级的词典和上亿规模的数据上训练;
  • 第二,得到的词向量可以较好地反映词间的语义关系。

Word2vec 提出两种基本模型:

  • CBOW:连续词袋模型
  • SG:跳词模型

1-1. CBOW

CBOW 即 Continuous Bag-of-Words,是通过一个词的上下文来预测这个词的含义。

在这里插入图片描述

1-2. SG

SG 即 Skip-Gram,是通过一个词语来预测上下文词语。

在这里插入图片描述

2. 实战

下面实战的对象语言是日文,如果想尝试中文,请自行搜索其他文档。

安装MeCab,

sudo dnf install mecab

安装词典,

sudo dnf install mecab-ipadic

安装开发包(用于gensim),

sudo dnf install mecab-devel

安装Python绑定,

pip install mecab-python3

安装gensim,

pip install gensim

下载 wiki 记事(日文),

curl https://dumps.wikimedia.org/jawiki/latest/jawiki-latest-pages-articles.xml.bz2
-o jawiki-latest-pages-articles.xml.bz2

整理 wiki 记事,

git clone https://github.com/attardi/wikiextractor; cd wikiextractor
rm -rf .git
vi wikiextractor/extract.py

--- modify
ANCHOR_CLASS = r'[^][\x00-\x08\x0a-\x1F]'
ExtLinkBracketedRegex = re.compile(
    '\[((' + '|'.join(wgUrlProtocols) + ')' + EXT_LINK_URL_CLASS + r'+)' +
    r'\s*((?:' + ANCHOR_CLASS + r'|\[\[' + ANCHOR_CLASS + r'+\]\])' + r'*?)\]',
    re.I | re.S | re.U)

EXT_IMAGE_REGEX = re.compile(
    r"""^(http://|https://)([^][<>"\x00-\x20\x7F\s]+)
    /([A-Za-z0-9_.,~%\-+&;#*?!=()@\x80-\xFF]+)\.(gif|png|jpg|jpeg)$""",
    re.I | re.X | re.S | re.U)
---

refer: https://github.com/attardi/wikiextractor/pull/182/commits/45662a5c914a1fb896bbdbbc26be5b3ea598cc51

python setup.py install
python -m wikiextractor.WikiExtractor ../jawiki-latest-pages-articles.xml.bz2
# 该命令将从指定目录中提取所有包含 "wiki" 的文本文件并将其合并到一个名为 "wiki.txt" 的文件中。
find text/ | grep wiki | awk '{system("cat "$0" >> wiki.txt")}'
# 下面这个过程比较花时间
mecab -Owakati wiki.txt -o wiki_wakati.txt
nkf -w --overwrite wiki_wakati.txt

训练,

from gensim.models import word2vec
import logging

logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)
sentences = word2vec.Text8Corpus('./wiki_wakati.txt')

model = word2vec.Word2Vec(sentences, size=200, min_count=20, window=15)
model.save("./wiki.model")

推理1,在推理过程中,可以提取与指定为正向的词语相似的词语。

from gensim.models import word2vec

model = word2vec.Word2Vec.load("./wiki.model")
results = model.wv.most_similar(positive=['講義'])
for result in results:
    print(result)

推理2,如果指定多个正向词语,可以提取与这些词语语义相近的词语。

from gensim.models import word2vec

model = word2vec.Word2Vec.load("../../dataset/w2v_wiki/wiki.model")
results = model.wv.most_similar(positive=['メジャー',"野球"])
for result in results:
    print(result)

推理3,通过指定正向和反向词语,可以进行语义消减。

from gensim.models import word2vec

model = word2vec.Word2Vec.load("../../dataset/w2v_wiki/wiki.model")
results = model.wv.most_similar(positive=['東京',"ロンドン"],negative=["日本"])
for result in results:
    print(result)

完结!

相关推荐

  1. NLP - word2vec详解

    2024-03-21 12:46:03       27 阅读
  2. Word2Vec原理+gensim实现

    2024-03-21 12:46:03       67 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-21 12:46:03       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-21 12:46:03       106 阅读
  3. 在Django里面运行非项目文件

    2024-03-21 12:46:03       87 阅读
  4. Python语言-面向对象

    2024-03-21 12:46:03       96 阅读

热门阅读

  1. python图形化编程pygame游戏模块

    2024-03-21 12:46:03       35 阅读
  2. 八大排序算法之快速排序

    2024-03-21 12:46:03       43 阅读
  3. 面试宝典:解决MySQL主从不一致的策略

    2024-03-21 12:46:03       39 阅读
  4. React面试总结

    2024-03-21 12:46:03       42 阅读
  5. C++:指针 引用 普通变量适用场景

    2024-03-21 12:46:03       44 阅读
  6. NodeJs接入腾讯云存储COS

    2024-03-21 12:46:03       40 阅读
  7. 机器学习:随机森林算法

    2024-03-21 12:46:03       43 阅读
  8. webpack从零开始搭建vue项目

    2024-03-21 12:46:03       88 阅读
  9. Python实战:Pandas数据合并与重塑

    2024-03-21 12:46:03       44 阅读
  10. OkHttp

    OkHttp

    2024-03-21 12:46:03      43 阅读