使用 spaCy 将一个单词拆分为两个单词

问题描述 投票:0回答:1

我面临一个问题,由于收到的文本中缺少空格或新行,我需要将单个“单词”拆分为两个单词。我的目的是在利用更先进的 NLP 技术之前为此任务建立一个管道 (spaCy 3.5.4)。

识别待拆分词的标准如下:

  • 该单词应将
    .is_oov 
    设置为
    True
  • 单词的
    .shape_
    应采用
    XxxXxx
    或类似的格式,例如前面或后面有数字。

这是一个说明性示例:

for token in doc:
  if token.is_oov ==True:
    print (token.text, token.shape_)
    [split here...]

输出如下:

62.000Unbefristeter dd.dddXxxxx
KundenFlexible XxxxxXxxxx
WorkDiverse XxxxXxxxx
RabatteFlache XxxxxXxxxx
ArbeitsumfeldIhre XxxxxXxxx
Stellenauswahl Xxxxx

虽然最后一个示例是误报,但其余实例需要拆分为两个单词,并且必须保留文本以供后续处理。

我熟悉正则表达式,但我很好奇是否有更简单的使用 spaCy 的方法。

python nlp spacy tokenize
1个回答
0
投票

如果您想坚持使用 spaCy 的管道功能,您可以使用正则表达式(正则表达式)定义自定义分词器,根据需要分割单词(我无法预先排除您将遇到的所有边缘情况,但以下正则表达式是相对稳健):

import re

import spacy
from spacy.tokenizer import Tokenizer

test_str = (
    "62.000Unbefristeter KundenFlexible WorkDiverse RabatteFlache ArbeitsumfeldIhre"
    " Stellenauswahl another ANOTHER, AnnNother annOther another1 ANOTHER11, another?!"
)

# Define a regex that handles desired cases
infix_re = re.compile(r"[A-Z|a-z][a-z]+|[0-9][0-9.]+|[A-Z]+|[^\s]+")


# Define custom tokenizer that uses the regex
def custom_tokenizer(nlp_pipeline):
    return Tokenizer(nlp_pipeline.vocab, infix_finditer=infix_re.finditer)


nlp = spacy.load("en_core_web_trf")  # Load the pipeline
nlp.tokenizer = custom_tokenizer(nlp)  # Change the tokenizer
doc = nlp(test_str)  # Process
print(" ".join(tok.text for tok in doc))

输出

62.000 Unbefristeter Kunden Flexible Work Diverse Rabatte Flache Arbeitsumfeld Ihre Stellenauswahl another ANOTHER , Ann Nother ann Other another 1 ANOTHER 11 , another ?!

或者,(正如您在问题中提到的)您可以保持原始管道不变,并对 spaCy 标记化过程的输出标记使用正则表达式。您可能需要在 re.findall()

 中的每个 
tok.text 上使用
doc

© www.soinside.com 2019 - 2024. All rights reserved.