我面临一个问题,由于收到的文本中缺少空格或新行,我需要将单个“单词”拆分为两个单词。我的目的是在利用更先进的 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 的方法。
如果您想坚持使用 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
。