我正在使用Doc2Vec分析某些段落,并希望获得火车数据的确定性矢量表示。基于official documentation,似乎我需要在Python 3中设置参数“ seed”和“ workers”以及PYTHONHASHSEED环境变量。因此,我编写了如下脚本。
import os
from gensim.models.doc2vec import TaggedDocument
from gensim.models import Doc2Vec
def main():
# Check whether the environment variable has been set successfully
print(os.environ.get('PYTHONHASHSEED'))
docs = [TaggedDocument(['Apple', 'round', 'apple', 'red', 'Apple', 'juicy', 'apple', 'sweet'], ['A']),
TaggedDocument(['I', 'have', 'a', 'little', 'frog', 'His', 'name', 'is', 'Tiny', 'Tim'], ['B']),
TaggedDocument(['On', 'top', 'of', 'spaghetti', 'all', 'covered', 'with', 'cheese'], ['C'])]
# Loop 3 times to check whether consistent results are produced within each run
for i in range(3):
model = Doc2Vec(min_count=1, seed=12345, workers=1)
model.build_vocab(docs)
model.train(docs, total_examples=model.corpus_count, epochs=model.epochs)
print(model.docvecs['B'])
if __name__ == '__main__':
os.environ['PYTHONHASHSEED'] = '12345'
main()
问题在于每次运行时它确实会产生确定性的结果,但是当我再次运行整个脚本时,它会给出不同的结果。我的环境变量设置是否有问题,还是我错过了其他东西?
我使用的是Python 3.6.5。
答案 0 :(得分:2)
我相信在代码中设置PYTHONHASHSEED
为时已晚:需要在操作系统环境中设置,然后才能完全运行Python解释器。当Python启动时,它会检查以决定在执行过程中 all 字典是否将使用指定的随机种子。 (以后每次创建字典时都不会再次检查。)
但是,还要注意,您通常不应该对这些算法强加确定性,而是要使您的评估能够承受较小的运行间抖动。较大的抖动可能表明您的数据或元参数充足还可能导致其他问题,但强制确定性隐藏了这种宝贵的间接强度信号。
有关Gensim项目常见问题的问题,在第11季度和第12季度还有更多讨论:
答案 1 :(得分:0)
我认为您应该使用以下代码来修复 PYTHONHASHSEED
import os
import sys
hashseed = os.getenv('PYTHONHASHSEED')
if not hashseed:
os.environ['PYTHONHASHSEED'] = '0'
os.execv(sys.executable, [sys.executable] + sys.argv)