python - spacy 标记化合并了错误的标记

标签 python python-3.x nlp tokenize spacy

我想使用 spacy 来标记维基百科的抓取内容。理想情况下它会像这样工作:

text = 'procedure that arbitrates competing models or hypotheses.[2][3] Researchers also use experimentation to test existing theories or new hypotheses to support or disprove them.[3][4]'

# run spacy
spacy_en = spacy.load("en")
doc = spacy_en(text, disable=['tagger', 'ner'])
tokens = [tok.text.lower() for tok in doc]

# desired output
# tokens = [..., 'models', 'or', 'hypotheses', '.', '[2][3]', 'Researchers', ...

# actual output
# tokens = [..., 'models', 'or', 'hypotheses.[2][3', ']', 'Researchers', ...]

问题在于“假设。[2][3]”被粘合在一起形成一个 token 。

如何防止 spacy 将这个“[2][3]”连接到前一个 token ? 只要是从假设这个词和句末的点分开就可以了,我不在乎它是如何处理的。但个别单词和语法应该远离句法噪音。

例如,以下任何一个都是理想的输出:

  • “假设”、“.”、“[2][”、“3]”
  • '假设'、'.'、'[2'、'][3]'

最佳答案

我认为你可以尝试使用中缀:

import re
import spacy
from spacy.tokenizer import Tokenizer

infix_re = re.compile(r'''[.]''')

def custom_tokenizer(nlp):
  return Tokenizer(nlp.vocab, infix_finditer=infix_re.finditer)

nlp = spacy.load('en')
nlp.tokenizer = custom_tokenizer(nlp)
doc = nlp(u"hello-world! I am hypothesis.[2][3]")
print([t.text for t in doc])

更多相关信息https://spacy.io/usage/linguistic-features#native-tokenizers

关于python - spacy 标记化合并了错误的标记,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54359606/

相关文章:

python - 如何将英语单词与 Python 中的渐进式结合?

python - 如何在主 Flask 模块之外登录?

python - 给定一个 Python 列表列表,找到所有可能的保持每个子列表顺序的平面列表?

python - 如何将 pip3 用于 python 3.6 而不是 python 3.5?

python - 将代码写入文件,然后执行

python - 为从文件中读取的行分配名称

java - 如何使用 stanford NLP 解析 Penn Tree Bank 并获取所有子树?

python - 为什么我的 pygame 代码没有画出这个圆圈?

c++ - 如何将 Python 编译成 C++ .exe

python - 如何在给定引理和标记的情况下反转词形还原过程?