如何在 PyCharm 中设置 PYTHONHASHSEED 环境变量来测试 Word2Vec 模型?

How to set PYTHONHASHSEED environment variable in PyCharm for testing Word2Vec model?

我需要编写一个完全可重现的 Word2Vec 测试,并且需要将 PYTHONHASHSEED 设置为一个固定值。这是我目前的设置-yp

# conftest.py
@pytest.fixture(autouse=True)
def env_setup(monkeypatch):
    monkeypatch.setenv("PYTHONHASHSEED", "123")

# test_w2v.py

def test_w2v():
    assert os.getenv("PYTHONHASHSEED") == "123"
    expected_words_embeddings = np.array(...)
    w2v = Word2Vec(my_tokenized_sentences, workers=1, seed=42, hashfxn=hash)
    words_embeddings = np.array([w2v.wv.get_vector(word) for word in sentence for sentence in my_tokenized_sentences)])
    np.testing.assert_array_equal(expected_words_embeddings, words_embeddings)

奇怪的是。

如果我 运行 通过执行 PYTHONHASHSEED=123 python3 -m pytest test_w2v.py 从终端进行测试,测试将毫无问题地通过。但是,如果我 运行 来自 PyCharm 的测试(使用 pytest,从 Edit Configurations -> Templates -> Python tests -> pytest 设置)然后它失败。最有趣的是,它不会在 assert os.getenv("PYTHONHASHSEED") == "123" 时失败,但会在 np.testing.assert_array_equal(expected_words_embeddings, words_embeddings)

时失败

为什么会这样,有没有办法解决这个问题?

您不能在 Python 代码中设置 PYTHONHASHSEED;它需要在 Python 解释器启动之前设置,因为这是解释器唯一一次查询它。您可以在启动 PyCharm 之前全局设置它,或者可能有一个 PyCharm 选项可以为您从 PyCharm 触发的任何执行环境设置环境变量。 (参见示例:

但更一般地说,您通常不应该尝试让您的 gensim Word2Vec 测试具有这种确定性。

如果您正在测试的内容 对精确参数敏感 – 因为只有精确播种和(慢得多)单线程训练才能在您选择的容差范围内,或者得到您从之前的 运行 复制的确切答案 – 那么您并没有真正验证算法在通常受制于的各种真实随机性下的贡献。在 gensim FAQ 中查看更多讨论。