6

我有以下代码:

import spacy
from spacy import displacy
from pathlib import Path

nlp = spacy.load('en_core_web_sm', parse=True, tag=True, entity=True)

sentence_nlp = nlp("John go home to your family")
svg = displacy.render(sentence_nlp, style="dep", jupyter=True)

output_path = Path("/images/dependency_plot.svg")
output_path.open("w", encoding="utf-8").write(svg)

我正在尝试将渲染文件写入图像文件夹中的 svg 文件。但是,我收到错误:

回溯(最近一次通话最后):

文件“”,第 8 行,在 output_path.open("w", encoding="utf-8").write(svg)

文件“C:\Users****\AppData\Local\Continuum\miniconda3\lib\pathlib.py”,第 1183 行,在 open opener=self._opener 中)

文件“C:\Users****\AppData\Local\Continuum\miniconda3\lib\pathlib.py”,第 1037 行,在 _opener return self._accessor.open(self, flags, mode)

文件“C:\Users****\AppData\Local\Continuum\miniconda3\lib\pathlib.py”,第 387 行,包装返回 strfunc(str(pathobj), *args) FileNotFoundError: [Errno 2] No such文件或目录:'\images\dependency_plot.svg'

该目录确实存在,所以我不确定我做错了什么。我还查看了 spacy 使用页面https://spacy.io/usage/visualizers#jupyter并且无法弄清楚我做错了什么。我正在使用 spyder(如果需要此信息)。请协助。

4

2 回答 2

4

我认为你有2个错误。首先你应该修正你的路径 - 添加“。”

从:

output_path = Path("/images/dependency_plot.svg")

至:

output_path = Path("./images/dependency_plot.svg")

第二个错误在这一行

svg = displacy.render(sentence_nlp, style="dep", jupyter=True)

我认为您需要删除jupyter=True才能将其写入 svg 文件。否则你会得到错误,比如TypeError: write() argument must be str, not None

这对我有用:

import spacy
from spacy import displacy
from pathlib import Path

nlp = spacy.load('en_core_web_sm', parse=True, tag=True, entity=True)

sentence_nlp = nlp("John go home to your family")
svg = displacy.render(sentence_nlp, style="dep")

output_path = Path("./images/dependency_plot.svg") # you can keep there only "dependency_plot.svg" if you want to save it in the same folder where you run the script 
output_path.open("w", encoding="utf-8").write(svg)
于 2019-05-17T12:30:49.953 回答
0

我遵循@Petr Matuska 的回答,遇到了每个人都在评论的错误。在调试时,我发现SpaCy 文档中也提到了两个问题。

  • jupyter=False当您想将树保存为 SVG 时,包括在渲染方法中。这样你就不会在 Jupyter 上看到输出,但你可以打开保存的文件来查看结果。
  • 使用整个文档而不是单个句子进行渲染。请参阅他们官方网站上的说明

重要说明由于每个可视化都是作为单独的 SVG 生成的,因此只有在一次渲染一个文档时才能导出 .svg 文件。(这是有道理的——毕竟,每个可视化都应该是一个独立的图形。)因此,不要一次渲染所有文档,而是遍历它们并分别导出它们。

  • 对于单个句子,将其用作sentences = ["This is an example."].

这是直接来自SpaCy 文档的代码片段,非常适合我。

import spacy
from spacy import displacy
from pathlib import Path

nlp = spacy.load("en_core_web_sm")
sentences = ["This is an example.", "This is another one."]
for sent in sentences:
    doc = nlp(sent)
    svg = displacy.render(doc, style="dep", jupyter=False)
    file_name = '-'.join([w.text for w in doc if not w.is_punct]) + ".svg"
    output_path = Path("/images/" + file_name)
    output_path.open("w", encoding="utf-8").write(svg)
于 2021-01-19T16:11:53.080 回答