python - 如何避免在 SpaCy 中使用 Matcher 双重提取重叠模式?
问题描述
我需要通过 python Spacy Matcher 从 2 个列表中提取项目组合。问题如下:让我们有 2 个列表:
colors=['red','bright red','black','brown','dark brown']
animals=['fox','bear','hare','squirrel','wolf']
我通过以下代码匹配序列:
first_color=[]
last_color=[]
only_first_color=[]
for color in colors:
if ' ' in color:
first_color.append(color.split(' ')[0])
last_color.append(color.split(' ')[1])
else:
only_first_color.append(color)
matcher = Matcher(nlp.vocab)
pattern1 = [{"TEXT": {"IN": only_first_color}},{"TEXT":{"IN": animals}}]
pattern2 = [{"TEXT": {"IN": first_color}},{"TEXT": {"IN": last_color}},{"TEXT":{"IN": animals}}]
matcher.add("ANIMALS", None, pattern1,pattern2)
doc = nlp('bright red fox met black wolf')
matches = matcher(doc)
for match_id, start, end in matches:
string_id = nlp.vocab.strings[match_id] # Get string representation
span = doc[start:end] # The matched span
print(start, end, span.text)
它给出了输出:
0 3 bright red fox
1 3 red fox
4 6 black wolf
我怎样才能只提取'bright red fox'和'black wolf'?我应该更改模式规则还是对匹配进行后处理?
任何想法不胜感激!
解决方案
您可以使用spacy.util.filter_spans
:
过滤一系列Span对象并删除重复或重叠。对于创建命名实体(其中一个标记只能是一个实体的一部分)或在将跨度与
Retokenizer.merge
. 当跨度重叠时,(第一个)最长的跨度优于较短的跨度。
Python代码:
matches = matcher(doc)
spans = [doc[start:end] for _, start, end in matches]
for span in spacy.util.filter_spans(spans):
print(span.start, span.end, span.text)
输出:
0 3 bright red fox
4 6 black wolf
推荐阅读
- css - 带有 gridlisttiles 的断点
- function - 在子文件夹中搜索文件然后复制
- .net - 如何使用 VS 2017 在 .Net Framework 上创建 ASP.NET Core 应用程序
- c# - 在请求期间从资源服务器上的 Identity Server 4 身份验证服务器获取用户信息
- c - Windows 10下C程序无法连接SQLite
- android - Metal 和所有其他 c++ 平台共有哪些 c++ 数据类型
- python - 带 wtforms 的反向数字猜测烧瓶
- raspberry-pi - 我们可以使用树莓派从磨损操作系统中读取心跳数据吗
- python - 不重复的变化
- spring - 未调用 RefreshScopeRefreshedEvent 侦听器