spaCy V3.0 基于规则匹配(2)----高效的短语匹配器和依存句法匹配器
1 短語(yǔ)匹配器(PhraseMatcher)
1.1 基本用法
對(duì)于需要匹配大型術(shù)語(yǔ)列表的情況,可以通過(guò)PhraseMatcher和創(chuàng)建Doc對(duì)象來(lái)代替詞符匹配模式(token patterns),可以獲得總體上更高的效率。Doc模式可以包含單個(gè)或多個(gè)詞符。
import spacy from spacy.matcher import PhraseMatchernlp = spacy.load("zh_core_web_sm") matcher = PhraseMatcher(nlp.vocab) terms = ['失速區(qū)','喘振區(qū)','油膜破壞','電機(jī)漏磁']# 注意:只有使用 nlp.make_doc 才能加速patterns = [nlp.make_doc(text) for text in terms] matcher.add("TerminologyList", patterns)doc = nlp("軸承絕緣擊穿,電機(jī)漏磁電流通過(guò)軸承造成油膜破壞。二次風(fēng)系統(tǒng)擋板誤關(guān),引起系統(tǒng)阻力增大,造成風(fēng)壓與進(jìn)入的風(fēng)量不匹配,使風(fēng)機(jī)進(jìn)入喘振區(qū)。") matches = matcher(doc) for match_id, start, end in matches:span = doc[start:end]print(span.text)注意:patterns 是一個(gè)Doc列表。
創(chuàng)建patterns,每個(gè)短語(yǔ)都必須使用nlp對(duì)象進(jìn)行處理。如果加載了預(yù)訓(xùn)練模型,則在循環(huán)或列表中執(zhí)行此操作很容易變得低效和費(fèi)時(shí)。如果您只需要分詞和詞法屬性,那么可以運(yùn)行nlp.make_doc,它只使用了分詞器(tokenizer)。當(dāng)然還可以使用nlp.tokenizer.pipe方法,將文本作為流進(jìn)行處理,以得到進(jìn)一步的速度提升。
錯(cuò)誤用法:
- patterns = [nlp(term) for term in LOTS_OF_TERMS]
正確用法:
- patterns = [nlp.make_doc(term) for term in LOTS_OF_TERMS]
- patterns = list(nlp.tokenizer.pipe(LOTS_OF_TERMS))
1.2 匹配其他Token屬性
默認(rèn)情況下,PhraseMatcher將逐字匹配Token的文本,Token.text. 但通過(guò)在初始化時(shí)設(shè)置attr參數(shù),可以更改匹配器(PhraseMatcher)在將短語(yǔ)模式(patterns)與文檔進(jìn)行比較時(shí)使用的Token屬性。
注意:在前面的例子中,生成patterns列表用的是nlp.make_doc,它只使用了分詞器(tokenizer)。對(duì)于本節(jié)需要匹配其他Token屬性的情況,就要根據(jù)需要加入相應(yīng)的組件。你可以直接使用nlp或通過(guò) nlp.select_pipes()選擇性的禁用某些組件。
比如:根據(jù)形狀匹配數(shù)字Token(如IP地址)。使用Token的Shape屬性將不必?fù)?dān)心這些字符串如何分詞,并且能夠根據(jù)幾個(gè)示例找到Tokens及其組合。下面我們將匹配形狀ddd.d.d.d和ddd.ddd.d.d:
matcher = PhraseMatcher(nlp.vocab, attr="SHAPE") matcher.add("IP", [nlp("127.0.0.1"), nlp("127.127.0.0")])doc = nlp("通常路由器有像'192.168.1.1'或'192.168.2.1'這樣的IP地址。") for match_id, start, end in matcher(doc):print("Matched based on token shape:", doc[start:end])當(dāng)然從理論上講,此方法對(duì)POS等屬性也同樣適用。例如,基于詞性標(biāo)簽(tag)匹配的模式nlp(“我喜歡花”)將返回“我愛(ài)狗”的匹配。還可以匹配像IS_PUNCT這樣的布爾屬性,以匹配具有與模式相同的標(biāo)點(diǎn)符號(hào)和非標(biāo)點(diǎn)符號(hào)序列的短語(yǔ)。但是這么做很容易讓人迷惑,且與編寫(xiě)一個(gè)或兩個(gè)Token模式相比也沒(méi)有太大的優(yōu)勢(shì)。
2 依存句法匹配器
DependencyMatcher使用Semgrex操作符匹配依存句法分析中的模式。它需要一個(gè)包含依存句法解析器的模型,比如DependencParser。DependencMatcher模式?jīng)]有定義Matcher patterns中相鄰Token的列表,而是匹配依存關(guān)系分析中的Roken并指定它們之間的關(guān)系。
依存句法匹配器的patterns由字典列表組成,每個(gè)字典描述要匹配的Token及其與patterns中現(xiàn)有Token的關(guān)系。除了第一個(gè)字典(它僅使用RIGHT_ID和RIGHT_ATTRS定義anchor token)之外,每個(gè)pattern 都應(yīng)該具有以下4個(gè)鍵:
| LEFT_ID | 關(guān)系符左邊的節(jié)點(diǎn)名稱(chēng),該節(jié)點(diǎn)此前要出現(xiàn)在patters字典列表 str |
| REL_OP | 表明左右兩節(jié)點(diǎn)關(guān)系的操作符 str |
| RIGHT_ID | 關(guān)系符右側(cè)節(jié)點(diǎn)名稱(chēng)(該名稱(chēng)不能重復(fù)) str |
| RIGHT_ATTRS | 要匹配的關(guān)系符右側(cè)節(jié)點(diǎn)的屬性,其格式與Token Matcher中的patters相同 Dict[str, Any] |
添加到patterns中的每個(gè)附加Token,都通過(guò)關(guān)系操作符REL_OP鏈接到現(xiàn)有名稱(chēng)為L(zhǎng)EFT_ID的Token。新Token被命名為RIGHT_ID并由具有RIGHT_ATTRS描述的屬性。
重要提示:由于用LEFT_ID和RIGHT_ID來(lái)作為識(shí)別Token的唯一名稱(chēng),patters字典列表中的順序就非常重要。所有作為L(zhǎng)EFT_ID出現(xiàn)的節(jié)點(diǎn),必須在前面的字典中作為RIGHT_ID被定義過(guò)!!!!
依存句法匹配器可用的操作符
| A < B | A是B的直接子節(jié)點(diǎn) |
| A > B | A是B的直接頭節(jié)點(diǎn) |
| A << B | A能夠通過(guò)多個(gè)子節(jié)點(diǎn)到頭節(jié)點(diǎn)關(guān)系跳轉(zhuǎn)路徑到達(dá)B |
| A >> B | A能夠通過(guò)多個(gè)頭節(jié)點(diǎn)到子節(jié)點(diǎn)關(guān)系跳轉(zhuǎn)路徑到達(dá)B |
| A . B | A是B的位置左鄰節(jié)點(diǎn), 即:A.i == B.i - 1 (A、B在同一依存解析樹(shù)中,i是其Doc中的位置索引。 下同) |
| A .* B | A是B的位置前序節(jié)點(diǎn), 即:A.i < B.i |
| A ; B | A是B的位置右鄰節(jié)點(diǎn), 即:A.i == B.i + 1 |
| A ;* B | A是B的位置后序節(jié)點(diǎn), 即:A.i > B.i |
| A $+ B | B是A的右鄰?fù)?jí)節(jié)點(diǎn), 即:A.head == B.head and A.i == B.i - 1 |
| A $- B | B是A的左鄰?fù)?jí)節(jié)點(diǎn), 即:A.head == B.head and A.i == B.i + 1 |
| A $++ B | B是A的位置后序同級(jí)節(jié)點(diǎn), 即:A.head == B.head and A.i < B.i |
| A $-- B | B是A的位置前序同級(jí)節(jié)點(diǎn), 即:A.head == B.head and A.i > B.i |
- 依存句法匹配器的patterns
如果要從以下句子中找出“造成”什么后果:
1 “軸承絕緣擊穿,電機(jī)漏磁電流通過(guò)軸承造成油膜破壞。”
2 “冷渣器內(nèi)部冷卻水管泄漏造成灰渣板結(jié)。”
我們要找到以下關(guān)系:
- 造成的直接賓語(yǔ)(dobj)
- 直接賓語(yǔ)(dobj)的復(fù)合名詞修飾或形容詞修飾(也可以沒(méi)有修飾)
運(yùn)行結(jié)果:
[(4851363122962674176, [5, 7, 6]), (4851363122962674176, [19, 21, 20])] anchor_word: 造成 w_object: 板結(jié) object_modifier: 灰渣 anchor_word: 造成 w_object: 破壞 object_modifier: 油膜提高匹配速度的重要提示:
當(dāng)token patterns能夠潛在匹配句子中的許多token,或者當(dāng)關(guān)系運(yùn)算符在依存關(guān)系解析中的路徑較長(zhǎng)時(shí)(如<<、>>、*以及;*關(guān)系運(yùn)算符),匹配速度可能會(huì)比較慢。
為了提高匹配速度,操作符盡可能具體。例如,盡量使用 > 而不是 >> ,使用包含語(yǔ)義標(biāo)簽和其他Token屬性,而不是像 {} 匹配句子中任何Token。
總結(jié)
以上是生活随笔為你收集整理的spaCy V3.0 基于规则匹配(2)----高效的短语匹配器和依存句法匹配器的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【51单片机】开关状态检测
- 下一篇: 不容错过的BT-474细胞传代实验心得分