Word2vec 详解

 

 

Word2vec Tutorial

https://radimrehurek.com/gensim/models/word2vec.html

更新:下面交互式word2vec演示的完整HTTP服务器代码现在在Github上开源。有关文档的高性能相似性服务器,请参阅ScaleText.com

准备输入

从一开始,gensim的word2vec就需要一系列句子作为输入。每个句子都有一个单词列表(utf8字符串):

1

2

3

4

6

7

# import modules & set up logging

import gensim, logging

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

 

sentences = [['first', 'sentence'], ['second', 'sentence']]

# train word2vec on the two sentences

model = gensim.models.Word2Vec(sentences, min_count=1)

将输入保存为Python内置列表很方便,但是当输入很大时会占用大量RAM。

Gensim只需要在迭代时输入必须按顺序提供句子。无需将所有内容保存在RAM中:我们可以提供一个句子,处理它,忘记它,加载另一个句子......

例如,如果我们的输入遍布磁盘上的几个文件,每行一个句子,那么我们可以逐行处理输入文件,而不是将所有内容加载到内存列表中:

1

2

3

4

6

7

8

9

10

11

class MySentences(object):

    def __init__(self, dirname):

        self.dirname = dirname

 

    def __iter__(self):

        for fname in os.listdir(self.dirname):

            for line in open(os.path.join(self.dirname, fname)):

                yield line.split()

 

sentences = MySentences('/some/directory') # a memory-friendly iterator

model = gensim.models.Word2Vec(sentences)

假设我们想要进一步预处理文件中的单词 - 转换为unicode,小写,删除数字,提取命名实体......所有这些都可以在MySentences迭代器中完成,而word2vec不需要知道。所需要的只是输入产生一个句子(utf8单词列表)。

高级用户注意:调用Word2Vec(句子,iter = 1)将在句子迭代器上运行两次传递(或者,通常iter + 1次传递;默认iter = 5)。第一遍收集单词及其频率以构建内部字典树结构。第二次和随后的传递训练神经模型。这两个(或者,iter + 1)传递也可以手动启动,以防您的输入流不可重复(您只能承受一次传递),并且您可以通过其他方式初始化词汇表:

1

2

3

model = gensim.models.Word2Vec(iter=1# an empty model, no training yet

model.build_vocab(some_sentences)  # can be a non-repeatable, 1-pass generator

model.train(other_sentences)  # can be a non-repeatable, 1-pass generator

如果您对Python中的迭代器,迭代器和生成器感到困惑,请查看我们的Python数据流教程。

训练

Word2vec接受几个影响训练速度和质量的参数。

其中一个是修剪内部字典。在十亿字的语料库中只出现一次或两次的单词可能是无趣的错别字和垃圾。此外,没有足够的数据对这些单词进行任何有意义的培训,因此最好忽略它们:

1

model = Word2Vec(sentences, min_count=10# default value is 5

min_count 的合理值介于0到100之间,具体取决于数据集的大小。

另一个参数是NN层的大小,它们对应于训练算法具有的“自由度”:

1

model = Word2Vec(sentences, size=200# default value is 100

较大的尺寸值需要更多的训练数据,但可以产生更好(更准确)的模型。合理的价值在几十到几百。

最后一个主要参数(此处为完整列表)用于培训并行化,以加快培训:

1

model = Word2Vec(sentences, workers=4) # default = 1 worker = no parallelization

只有安装了Cython才有效 的workers参数。没有Cython,你只能使用一个核心因为GIL(并且word2vec训练将非常缓慢)。

更新:下面交互式word2vec演示的完整HTTP服务器代码现在在Github上开源。有关文档的高性能相似性服务器,请参阅ScaleText.com

准备输入

从一开始,gensim的word2vec就需要一系列句子作为输入。每个句子都有一个单词列表(utf8字符串):

1

2

3

4

6

7

# import modules & set up logging

import gensim, logging

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

 

sentences = [['first', 'sentence'], ['second', 'sentence']]

# train word2vec on the two sentences

model = gensim.models.Word2Vec(sentences, min_count=1)

将输入保存为Python内置列表很方便,但是当输入很大时会占用大量RAM。

Gensim只需要在迭代时输入必须按顺序提供句子。无需将所有内容保存在RAM中:我们可以提供一个句子,处理它,忘记它,加载另一个句子......

例如,如果我们的输入遍布磁盘上的几个文件,每行一个句子,那么我们可以逐行处理输入文件,而不是将所有内容加载到内存列表中:

1

2

3

4

6

7

8

9

10

11

class MySentences(object):

    def __init__(self, dirname):

        self.dirname = dirname

 

    def __iter__(self):

        for fname in os.listdir(self.dirname):

            for line in open(os.path.join(self.dirname, fname)):

                yield line.split()

 

sentences = MySentences('/some/directory') # a memory-friendly iterator

model = gensim.models.Word2Vec(sentences)

假设我们想要进一步预处理文件中的单词 - 转换为unicode,小写,删除数字,提取命名实体......所有这些都可以在MySentences迭代器中完成,而word2vec不需要知道。所需要的只是输入产生一个句子(utf8单词列表)。

高级用户注意:调用Word2Vec(句子,iter = 1)将在句子迭代器上运行两次传递(或者,通常iter + 1次传递;默认iter = 5)。第一遍收集单词及其频率以构建内部字典树结构。第二次和随后的传递训练神经模型。这两个(或者,iter + 1)传递也可以手动启动,以防您的输入流不可重复(您只能承受一次传递),并且您可以通过其他方式初始化词汇表:

1

2

3

model = gensim.models.Word2Vec(iter=1# an empty model, no training yet

model.build_vocab(some_sentences)  # can be a non-repeatable, 1-pass generator

model.train(other_sentences)  # can be a non-repeatable, 1-pass generator

如果您对Python中的迭代器,迭代器和生成器感到困惑,请查看我们的Python数据流教程。

训练

Word2vec接受几个影响训练速度和质量的参数。

其中一个是修剪内部字典。在十亿字的语料库中只出现一次或两次的单词可能是无趣的错别字和垃圾。此外,没有足够的数据对这些单词进行任何有意义的培训,因此最好忽略它们:

1

model = Word2Vec(sentences, min_count=10# default value is 5

min_count 的合理值介于0到100之间,具体取决于数据集的大小。

另一个参数是NN层的大小,它们对应于训练算法具有的“自由度”:

1

model = Word2Vec(sentences, size=200# default value is 100

较大的尺寸值需要更多的训练数据,但可以产生更好(更准确)的模型。合理的价值在几十到几百。

最后一个主要参数(此处为完整列表)用于培训并行化,以加快培训:

1

model = Word2Vec(sentences, workers=4) # default = 1 worker = no parallelization

只有安装了Cython才有效 的workers参数。没有Cython,你只能使用一个核心因为GIL(并且word2vec训练将非常缓慢)。

猜你喜欢

转载自blog.csdn.net/u014033218/article/details/89046212