【问题标题】:Extract word terms from sentence between the symbol '<>' and the nested case '<<>>' [duplicate]从符号“<>”和嵌套案例“<<>>”之间的句子中提取词项[重复]
【发布时间】:2019-06-24 12:52:03
【问题描述】:

命名实体识别新闻数据集(文本)

这是一个示例:

<LOC Qatar> and <LOC Japan>, who met in the <EVENT <S Asian> <E Cup>> final in <DATE February>, are in third place in their groups.

我正在尝试提取 之间的实体,嵌套标签中的问题和输出是:

['<LOC Qatar>',
 '<LOC Japan>',
 '<EVENT <S Asian>',
 '<E Cup>',
 '<DATE February>']

这是错误的,因为“EVENT S Asian”、“E Cup”应该是一串而不是两串。

我尝试过正则表达式,但效果不佳。

import re
s = """<LOC Qatar> and <LOC Japan>, 
who met in the <EVENT <S Asian> <E Cup>> final in <DATE February>, are in third place in their groups."""
re.findall('\<.*?\>',s)

实际结果:

['<LOC Qatar>',
 '<LOC Japan>',
 '<EVENT <S Asian>',
 '<E Cup>',
 '<DATE February>']

预期结果:

['<LOC Qatar>',
 '<LOC Japan>',
 '<EVENT <S Asian> <E Cup>>',
 '<DATE February>']

【问题讨论】:

  • 确实这个概念几乎是一样的,我试图在python中实现。

标签: python regex


【解决方案1】:

您想应用 cmets 中提到的 recursive 模式。 regex 模块给你机会(不是re 模块)。

代码如下:

# Import module
import regex as reg

# Your string
s = """<LOC Qatar> and <LOC Japan>, 
who met in the < EVENT < S Asian > < E Cup >> final in < DATE February > , are in third place in their groups. """

# Match pattern
my_list = reg.findall("<((?:[^<>]|(?R))*)>", s)
print(my_list)
# ['LOC Qatar', 'LOC Japan', ' EVENT < S Asian > < E Cup >', ' DATE February ']

如果你真的想要&lt;&gt;包围的字,可以加:

my_list = ['<' + elt + '>' for elt in my_list]
print(my_list)
# ['<LOC Qatar>', '<LOC Japan>', '< EVENT < S Asian > < E Cup >>', '< DATE February >']

【讨论】:

  • 非常感谢,您是对的。我试图使用re 实现(\&lt;([^&lt;&gt;]|\&lt;?R\&gt;)*\&gt;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-21
  • 1970-01-01
  • 2020-12-07
相关资源
最近更新 更多