python - 使用 spacy 或 nltk 从段落中提取文本

标签 python nlp nltk spacy

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

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

01:曾经,有个叫AZ009的男孩,看着村里的PQ123 01羊在B0199吃草,感到很无聊。 。为了自娱自乐,他唱道:“R0199 01 09! R0199 01 09! R0199 01 09正在追羊!”

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

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

谢谢

最佳答案

假设模式:

  • 以大写字母开头\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']

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

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

关于python - 使用 spacy 或 nltk 从段落中提取文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68052645/

相关文章:

python - U模式和w+模式下如何写文件?

machine-learning - 计算词性标注器准确度的参数

python - NLTK 和停用词失败 #lookuperror

ios - NSLinguisticTagger enumerateTagsInRange 在具有 NSLinguisticTagSchemeNameTypeOrLexicalClass 的设备上不起作用

python-3.x - 在 NLTK 中使用英国国家语料库

python - 预测即将出现的单词的 POS 标签

python - nltk:word_tokenize 更改引号

python - 如何让用户在 python 中输入 true/false?

Python lambda 不从函数获取变量

python - 使用 sqlalchemy 从 MySQL 数据库中读取巨大的数据集并插入到 postgres 数据库中而不会出现内存问题