使用 spacy 或 nltk 从段落中提取文本
Extracting text from a passage using spacy or nltk
抱歉,如果这是重复的,但我找不到答案,或者至少想知道是否有一种干净的方法可以做到这一点。
我有一个段落,我需要从中提取某些实体。
任何字母数字字符串,例如:PQ1234、Z123 等
space 后跟另一个数字的任何字母数字字符串:PQ1234 01、Z123 08
space 后跟另一个数字的任何字母数字字符串:PQ1234 01 02,Z123 07 08。作为下面的具体示例,应提取 bold 中的字符串:
01: 从前,有一个叫AZ009的男孩,他看着村子里的PQ123 01羊在草地上吃草,感到无聊B0199。为了自娱自乐,他唱道:“R0199 01 09! R0199 01 09! R0199 01 09在追羊!”
休息所有我想忽略的。我尝试使用 spacy 的 NOUN、PROPN 过滤器以及 isalpha 和 isdigit 等字符串函数来进一步过滤它,但它变得过于基于规则,无法很好地实现它。
我是 NLP 的新手,所以想知道是否有更聪明的方法,或者如果通过一些 RegEx 规则,我可以做得更好。
谢谢
假设模式:
- 以大写字母开头
\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!”"""
re.findall(r'\b[A-Z]+[\s\d]+[\d]\b', text)
[输出]:
['AZ009', 'PQ123 01', 'B0199', 'R0199 01 09', 'R0199 01 09', 'R0199 01 09']
如果您需要要提取的字符串 offsets/positions,请尝试:
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
抱歉,如果这是重复的,但我找不到答案,或者至少想知道是否有一种干净的方法可以做到这一点。 我有一个段落,我需要从中提取某些实体。
任何字母数字字符串,例如:PQ1234、Z123 等 space 后跟另一个数字的任何字母数字字符串:PQ1234 01、Z123 08 space 后跟另一个数字的任何字母数字字符串:PQ1234 01 02,Z123 07 08。作为下面的具体示例,应提取 bold 中的字符串:
01: 从前,有一个叫AZ009的男孩,他看着村子里的PQ123 01羊在草地上吃草,感到无聊B0199。为了自娱自乐,他唱道:“R0199 01 09! R0199 01 09! R0199 01 09在追羊!”
休息所有我想忽略的。我尝试使用 spacy 的 NOUN、PROPN 过滤器以及 isalpha 和 isdigit 等字符串函数来进一步过滤它,但它变得过于基于规则,无法很好地实现它。
我是 NLP 的新手,所以想知道是否有更聪明的方法,或者如果通过一些 RegEx 规则,我可以做得更好。
谢谢
假设模式:
- 以大写字母开头
\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!”"""
re.findall(r'\b[A-Z]+[\s\d]+[\d]\b', text)
[输出]:
['AZ009', 'PQ123 01', 'B0199', 'R0199 01 09', 'R0199 01 09', 'R0199 01 09']
如果您需要要提取的字符串 offsets/positions,请尝试:
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