gpt4 book ai didi

python - 如何将自定义规则添加到 spaCy 标记器以将 HTML 分解为单个标记?

转载 作者:行者123 更新时间:2023-12-05 05:01:47 25 4
gpt4 key购买 nike

我知道有很多资源可以解决这个问题,但我无法让 spaCy 完全按照我的意愿去做。

我想向我的 spaCy 标记器添加规则,以便我的文本中的 HTML 标记(例如 <br/> 等...)将成为单个标记。

我现在正在使用“merge_noun_chunks”管道,所以我得到了这样的标记:
"documentation<br/>The Observatory Safety System" (这是一个单一的 token )

我想添加一条规则,以便将其拆分为 3 个标记:
"documentation", "<br/>", "The Observatory Safety System"
我查找了很多资源:here , also here .但我无法让它在我的案例中起作用

我试过这个:

    
infix_re = re.compile(r'''<[\w+]\/>''')
prefix_re = compile_prefix_regex(nlp.Defaults.prefixes)
suffix_re = compile_suffix_regex(nlp.Defaults.suffixes)

return Tokenizer(nlp.vocab, prefix_search=prefix_re.search,
suffix_search=suffix_re.search,
infix_finditer=infix_re.finditer,
token_match=None)

我不确定我是否完全理解更改中缀的作用。我是否也应该删除 <来自前缀 as suggested here

最佳答案

实现这一目标的一种方法似乎涉及使分词器既有

  1. 分解包含没有空格的标签的标记,以及
  2. “ block 状”类似标签的序列作为单个标记。

要像示例中那样拆分标记,您可以修改标记器中缀(在 the manner described here 中):

infixes = nlp.Defaults.infixes + [r'([><])']
nlp.tokenizer.infix_finditer = spacy.util.compile_infix_regex(infixes).finditer

为确保标签被视为单个标记,您可以使用“特殊情况”(请参阅​​ the tokenizer overviewmethod docs)。您将为打开、关闭和空标签添加特殊情况,例如:

# open and close
for tagName in "html body i br p".split():
nlp.tokenizer.add_special_case(f"<{tagName}>", [{ORTH: f"<{tagName}>"}])
nlp.tokenizer.add_special_case(f"</{tagName}>", [{ORTH: f"</{tagName}>"}])

# empty
for tagName in "br p".split():
nlp.tokenizer.add_special_case(f"<{tagName}/>", [{ORTH: f"<{tagName}/>"}])

综合来看:

import spacy
from spacy.symbols import ORTH

nlp = spacy.load("en_core_web_trf")
infixes = nlp.Defaults.infixes + [r'([><])']
nlp.tokenizer.infix_finditer = spacy.util.compile_infix_regex(infixes).finditer

for tagName in "html body i br p".split():
nlp.tokenizer.add_special_case(f"<{tagName}>", [{ORTH: f"<{tagName}>"}])
nlp.tokenizer.add_special_case(f"</{tagName}>", [{ORTH: f"</{tagName}>"}])

for tagName in "br p".split():
nlp.tokenizer.add_special_case(f"<{tagName}/>", [{ORTH: f"<{tagName}/>"}])

这似乎产生了预期的结果。例如,申请 ...

text = """<body>documentation<br/>The Observatory <p> Safety </p> System</body>"""
print("Tokenized:")
for t in nlp(text):
print(t)

... 将单独打印整个标签:

# ... snip
documentation
<br/>
The
# ... snip

我找到了 the tokenizer's explain method在这方面很有帮助。它向您详细说明了标记化的原因。

关于python - 如何将自定义规则添加到 spaCy 标记器以将 HTML 分解为单个标记?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62601020/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com