2

抱歉,如果这是重复的,但我找不到答案,或者至少想知道是否有一种干净的方法可以做到这一点。我有一段需要从中提取某些实体的段落。

任何字母数字字符串,例如:PQ1234、Z123 等任何字母数字字符串后跟一个空格后的另一个数字:PQ1234 01、Z123 08 任何字母数字字符串后跟另一个空格后的数字:PQ1234 01 02、Z123 07 08。作为下面的具体示例,应提取粗体字符串:

01:曾经有一个叫AZ009的男孩,看着村子PQ123 01羊在B0199上吃草,觉得很无聊。为了自娱自乐,他唱道:“<strong>R0199 01 09!R0199 01 09R0199 01 09在追羊!”</p>

休息一下我想忽略的。我尝试使用 spacy 的 NOUN、PROPN 过滤器以及诸如 isalpha 和 isdigit 之类的字符串函数来进一步过滤它,但它变得过于基于规则并且无法很好地实现它。

我是 NLP 的新手,所以想知道是否有更聪明的方法,或者是否通过一些 RegEx 规则,我可以把它做得更好。

谢谢

4

1 回答 1

2

假设模式:

  • 以大写字母开头\b[A-Z]+
  • 继续一些数字和空格[\s\d]+
  • 并且总是以数字结尾[\d]\b

你可以试试:

import re

text = """Once, there was a boy named AZ009 who became bored when he watched over the village PQ123 01 sheep grazing on the B0199. To entertain himself, he sang out, “R0199 01 09! R0199 01 09! R0199 01 09 is chasing the sheep!”&quot;""

re.findall(r'\b[A-Z]+[\s\d]+[\d]\b', text)

[出去]:

['AZ009', 'PQ123 01', 'B0199', 'R0199 01 09', 'R0199 01 09', 'R0199 01 09']

如果您需要尝试提取的字符串偏移量/位置,请尝试:

for match in re.finditer(r'\b[A-Z]+[\s\d]+[\d]\b', text):
    print(match.start(), match.start() + len(match.group()), match.group())

[出去]:

28 33 AZ009
84 92 PQ123 01
114 119 B0199
157 168 R0199 01 09
170 181 R0199 01 09
183 194 R0199 01 09
于 2021-06-20T22:46:21.450 回答