【问题标题】:How to extract data from a dataset using regex in Python?如何在 Python 中使用正则表达式从数据集中提取数据?
【发布时间】:2018-10-12 18:25:16
【问题描述】:

我有一个数据集,我想从这个数据集中提取同位特征。

در
همین
حال
،
<coref coref_coref_class="set_0" coref_mentiontype="ne" markable_scheme="coref" coref_coreftype="ident">
نجیب
 الله
خواجه
عمری
 ,
 </coref>
<coref coref_coref_class="set_0" coref_mentiontype="np" markable_scheme="coref" coref_coreftype="atr">
سرپرست
وزارت
تحصیلات
عالی
افغانستان
</coref>
گفت
که
در
سه
ماه
گذشته
در
۳۳
ولایت
کشور
<coref coref_coreftype="ident" coref_coref_class="empty" coref_mentiontype="ne" markable_scheme="coref">
خدمات
ملکی
</coref>
از
حدود
۱۴۹
هزار

我想将数据集中的数据存储在两个列表中。在find_atr 列表中,我存储了coref 标签包含coref_coreftype="atr" 的数据。对于find_ident 列表,我想存储coref_coreftype="ident" 的数据所以我们在这个数据集中的最后一个coref 标记上有另一个具有coref_coref_class="empty" 的coref 标记。我不想存储带有标签coref_coref_class="empty" 的数据。现在在我提到的正则表达式上,它应该只包括那些coref_coref_class="set_.*?" 而不是coref_coref_class="empty" 但它仍然存储coref_coref_class="empty" 的数据,它应该只存储coref_coref_class="set_.*?"。

如何避免:

i_ident = []
j_atr = []
find_ident = re.findall(r'<coref.*?coref_coref_class="set_.*?coref_mentiontype="ne".*?coref_coreftype="ident".*?>(.*?)</coref>', read_dataset, re.S)
ident_list = list(map(lambda x: x.replace('\n', ' '), find_ident))
for i in range(len(ident_list)):
    i_ident.append(str(ident_list[i]))

find_atr = re.findall(r'<coref.*?coref_coreftype="atr".*?>(.*?)</coref>', read_dataset, re.S)
atr_list = list(map(lambda x: x.replace('\n', ' '), find_atr))
#print(coref_list)
for i in range(len(atr_list)):
    j_atr.append(str(atr_list[i]))

print(i_ident)
print()
print(j_atr)

【问题讨论】:

  • 你所拥有的看起来像 XML,所以使用 ElementTree 可能会起作用。
  • @Lomtrur,它不是 XML 文件。它基于 MMAX2,我使用盐对其进行转换。现在我的文件有这个结构。正则表达式有什么问题?为什么它包含 coref_coref_class="empty"
  • 我看到这一行find_atr = re.findall(r'&lt;coref.*?coref_coreftype="atr".*?&gt;(.*?)&lt;/coref&gt;', read_dataset, re.S) 只是验证类型,但它会检索任何类。我不确定这是否是问题
  • @GVelascoh,find_atr=.... 运行良好,它只检索那些具有 'coref_coreftype="atr"' 的。问题在于 find_ident = re.findall(r'(.*?) ', read_dataset, re.S) 从数据集的最后一行提取 coref_coref_class="empty",我在 find_indent 中提到只提取 coref_coref_class="set_"。这就是为什么它提取为 'empty ' 类。
  • 我不明白你的描述,你能提供想要的输出吗?

标签: python


【解决方案1】:

我将您的数据集文件缩减为:

A
<coref coref_coref_class="set_0" coref_mentiontype="ne" markable_scheme="coref" coref_coreftype="ident">
B
</coref>
<coref coref_coref_class="set_0" coref_mentiontype="np" markable_scheme="coref" coref_coreftype="atr">
C
</coref>
D
<coref coref_coreftype="ident" coref_coref_class="empty" coref_mentiontype="ne" markable_scheme="coref">
E
</coref>
F

并尝试了这段代码,与您提供的几乎相同:

import re

with open ("test_dataset.log", "r") as myfile:
    read_dataset = myfile.read()

i_ident = []
j_atr = []
find_ident = re.findall(r'<coref.*?coref_coref_class="set_.*?coref_mentiontype="ne".*?coref_coreftype="ident".*?>(.*?)</coref>', read_dataset, re.S)
ident_list = list(map(lambda x: x.replace('\n', ' '), find_ident))
for i in range(len(ident_list)):
    i_ident.append(str(ident_list[i]))

find_atr = re.findall(r'<coref.*?coref_coreftype="atr".*?>(.*?)</coref>', read_dataset, re.S)
atr_list = list(map(lambda x: x.replace('\n', ' '), find_atr))
#print(coref_list)
for i in range(len(atr_list)):
    j_atr.append(str(atr_list[i]))

print(i_ident)
print()
print(j_atr)

得到了这个输出,这对我来说似乎是正确的:

[' B ']

[' C ']

【讨论】:

  • 我尝试了您的数据集,它可以工作,但是当我再次尝试使用我的数据集时,它给出的结果与之前的结果相同。我不知道为什么
  • 当你说你的数据集时,那是一个更长的文件还是问题帖子中的相同?可能是嵌套标签问题吗?
  • 是的,它是为共指解析任务注释的 5K 单词。该文件的结构与我在此处发布的相同。如果是嵌套标签问题,为什么它可以提取coref_coreftype="atr"。
  • 您可以在输出中包含匹配行以验证哪些行与正则表达式匹配,以及文件中没有嵌套或意外标签
  • 谢谢,我也试试。我们可以改变正则表达式的结构,但我没有任何想法。
猜你喜欢
  • 2011-04-21
  • 2018-01-07
  • 2013-04-04
  • 2017-02-28
  • 1970-01-01
  • 2019-05-13
  • 1970-01-01
  • 2010-11-27
相关资源
最近更新 更多