March 19, 2020

让 spaCy 通过引入 stanza 的 pipeline 来支持中文

让 spaCy 通过引入 stanza 的 pipeline 来支持中文

github 在此: https://github.com/explosion/spacy-stanza

首先安装好依赖:

pip install stanza
pip install spacy_stanza

然后下载 stanza 的中文 model:

>>> import stanza
>>> stanza.download('zh')

尝鲜:

import stanza
from spacy_stanza import StanzaLanguage

snlp = stanza.Pipeline(lang="zh")
nlp = StanzaLanguage(snlp)

doc = nlp('当地时间3月18日,美国总统特朗普在社交媒体账号上表示,经过双方共同同意,美国将与加拿大临时关闭边境,暂停非必要的往来。不过,双边贸易活动不受影响。')
for token in doc:
    print(token.text, token.lemma_, token.pos_, token.dep_, token.ent_type_)
当地 当地 NOUN nmod
时间 时间 NOUN nmod
3 3 NUM nummod DATE
月 月 NOUN clf DATE
18 18 NUM nummod DATE
日 日 NOUN nmod:tmod DATE
, , PUNCT punct
美国 美国 PROPN nmod GPE
总统 总统 NOUN nsubj
特朗普 特朗普 PROPN appos PERSON
在 在 ADP case
社交 社交 NOUN nmod
媒体 媒体 NOUN nmod
账号 账号 NOUN obl
上 上 ADP acl
表示 表示 VERB root
, , PUNCT punct
经过 经过 ADP case
双 双 NUM nummod
方 方 NOUN obl
共同 共同 ADV advmod
同意 同意 VERB ccomp
, , PUNCT punct
美国 美国 PROPN nsubj GPE
将 将 ADV advmod
与 与 ADP case
加拿大 加拿大 PROPN obl GPE
临时 临时 ADV advmod
关闭 关闭 VERB advcl
边境 边境 NOUN obj
, , PUNCT punct
暂停 暂停 VERB parataxis
非 非 VERB acl:relcl
必要 必要 ADJ amod
的 的 PART mark:relcl
往来 往来 NOUN obj
。 。 PUNCT punct
不过 不过 ADV mark
, , PUNCT punct
双 双 NUM nummod
边 边 NOUN nmod
贸易 贸易 NOUN nmod
活动 活动 NOUN nsubj
不受 不受 VERB root
影响 影响 NOUN obj
。 。 PUNCT punct
>>>
>>> print(doc.ents)
(3月18日, 美国, 特朗普, 美国, 加拿大)

句法依赖分析:

import spacy
from spacy import displacy
from pathlib import Path
import os


# displacy.serve(doc, style="dep")

svg = spacy.displacy.render(doc, style="dep")
# svg = displacy.render(doc, style="dep", jupyter=False)
# output_path = Path(os.path.join("./", "sentence.svg"))
# output_path.open('w', encoding="utf-8").write(svg)