Spacy 为 Doc 返回不一致的结果。例子?

数据挖掘 Python nlp
2022-01-28 14:16:16

我开始使用 Spacy,我只是在试验给定的例子。奇怪的是,当我使用他们的实验控制台在他们的容器上运行它们时,它给我的结果与我在本地运行它们时不同。

例如,当我从他们的控制台运行以下示例时,

import spacy

nlp = spacy.load('en_core_web_md')  # make sure to use larger model!
tokens = nlp(u'dog cat banana')

for token1 in tokens:
    for token2 in tokens:
        print(token1.text, token2.text, token1.similarity(token2))

它给了我:

dog dog 1.0
dog cat 0.80168545
dog banana 0.24327646
cat dog 0.80168545
cat cat 1.0
cat banana 0.2815437
banana dog 0.24327646
banana cat 0.2815437
banana banana 1.0

但是当我在本地运行完全相同的东西时,它给了我:

dog dog 1.0
dog cat 0.0
dog banana 0.0
cat dog 0.0
cat cat 1.0
cat banana -0.044681177
banana dog -7.828739e+17
banana cat -8.242222e+17
banana banana 1.0

对我来说,前者是有道理的,而不是我的本地结果。对于其他示例,问题也仍然存在。我感到很困惑!当地发生了什么?

  • 斯派西:'2.0.12'
  • Python 3.6.5 Anaconda, Inc.
  • Mac OSx 10.13.5

我不确定它是否相关,但我在 Jupyter 中运行它时遇到了这个错误,所以我在启动 Jupyter 之前,按照 git 中的建议在终端中导出了以下内容:

export LC_ALL=en_US.UTF-8
export LANG=en_US.UTF-8
2个回答

正如我在您的帖子中评论的那样 - 我认为您的环境有问题。如果你不能解决这个问题,你应该在 spacy 团队的 GitHub 上提交一个错误。

我测试了相同的代码,并且在使用不同大小的语言模型时只能看到与网站相比的结果差异。如果您使用默认命令安装了英文模型:python -m spacy download en,那么默认情况下您将获得最小的模型。您应该使用中型模型来产生结果。我比较下面的两个

剧本

import spacy

# Small setup
nlp_small = spacy.load('en')
tokens_s = nlp_small(u'dog cat banana')

# Medium setup
nlp_medium = spacy.load('en_core_web_md')
tokens_m = nlp_medium(u'dog cat banana')

# large setup would use 'en_core_web_lg' ...


print('Results using small model:\n')
for token1 in tokens_s:
    for token2 in tokens_s:
        print(token1.text, token2.text, token1.similarity(token2))

print('\nResults using medium model:\n')
for token1 in tokens_m:
    for token2 in tokens_m:
        print(token1.text, token2.text, token1.similarity(token2))

输出

Results using small model:

dog dog 1.0
dog cat 0.53906965
dog banana 0.28761008
cat dog 0.53906965
cat cat 1.0
cat banana 0.4875216
banana dog 0.28761008
banana cat 0.4875216
banana banana 1.0

Results using medium model:

dog dog 1.0
dog cat 0.8016855
dog banana 0.24327648
cat dog 0.8016855
cat cat 1.0
cat banana 0.28154367
banana dog 0.24327648
banana cat 0.28154367
banana banana 1.0

使用中型模型时,结果显然更好 - 它们与网站上的结果相匹配。


这是在conda 环境中用于产生这些结果的 spacy 版本:

n1k31t4@n1k31t4~$ conda list | grep spacy
spacy                     2.0.12                    <pip>

以及 Python 版本信息:

n1k31t4@n1k31t4:~$ ipython
Python 3.6.6 | packaged by conda-forge | (default, Jul 26 2018, 09:53:17) 
Type 'copyright', 'credits' or 'license' for more information
IPython 6.5.0 -- An enhanced Interactive Python. Type '?' for help.

虽然我在 Linux 上运行了脚本(OP 使用 MacOSX),而且我的 Python 版本新……但我不希望这些东西能解释结果的差异。

浏览spacy git page中报告的问题后,发现主要是某些版本的包特别是 numpy 存在问题。请参阅此已关闭线程按照建议,我做了:

conda update --all

使用以下软件包(即使在 ipython 中),一切都按预期工作:

  • Python 3.6.5 Anaconda, Inc.
  • 空间:2.0.12
  • 麻木:1.15.2
  • 蟒蛇:6.5.0
  • Mac OSx 10.13.5

快乐的自然语言处理!