0

对于我的研究,我试图从语料库中计算存储在文件中的一系列复合术语(例如安全危害)出现在 16 个单词的窗口中的次数(每个短语 1 行)目标关键字(例如设施)。我不是程序员,一直试图将其分解为 2 个元素:首先从语料库中提取一个文件,其中我的目标关键字匹配,前后 8 个单词。然后尝试将我的“词汇文件”与该摘录相匹配。我在第 1 部分,已经尝试过这个,但我只是收到 <_sre.SRE_Match object at 0x028FFE78> 消息并且正在努力尝试使用 repr:任何建议表示赞赏或其他方法来做到这一点。最终,我想要一个导出文件,其中包含我的词汇单词,并在它们之后进行计数,指示在该窗口中使用我的目标单词找到它们的频率。

input=open("Corpus.txt", "r")
matches=[]
lines=input.readlines()
for line in lines:
  m=re.search(r'(\S+\s+){0,8}facility(\s+\S+){0,8}',line)
  if m:
    matches.append(m)
    for m in matches:
      output.write(str(m))
      output.close()

任何帮助表示赞赏,保罗

4

1 回答 1

1

你的语料库已经标记化了吗?你真的应该确保它是。

无论如何,我认为您对匹配对象的组感兴趣:

output.write(''.join(m.groups()) + '\n')

然后您会发现您的组将只捕获每个窗口的最后一个单词。你需要多加一对括号:

m = re.search(r'((?:\S+\s+){0,8})facility((?:\s+\S+){0,8})', line)

The(?:...)是一个非捕获组:它定义了 的范围{0,8},但它不会在结果中为您提供额外的组。

查看 Python 的官方RegEx Howto,或在网上搜索 RegEx 教程。无论如何,也许您应该寻找现成的语料库工具,而不是重新发明轮子。

编辑:
为了在一行中匹配多次出现的关键字,请使用re.findall()(返回列表)或re.finditer()(返回迭代器):

context = re.findall(r'((?:\S+\s+){0,8})facility((?:\s+\S+){0,8})', line)

context将是对的列表,即。关键字每次出现的左侧和右侧窗口。但是请注意,如果相同关键字的两次出现之间的单词少于 8 个,它仍然不起作用,例如。

foo 酒吧设施 bla foo 酒吧 baz 设施 foo 酒吧

将只为第一次出现的“facility”生成一个匹配项,第二个匹配项在其右侧窗口中。第二个“设施”不会生成它自己的匹配,因为re.findall()不进行重叠匹配,这意味着它只会在正确的上下文结束后寻找另一个“设施”。这也意味着,如果中间有 9 到 15 个单词,第二个“设施”的左侧窗口将缺少第一个已经消耗的内容。

于 2013-06-04T07:26:28.203 回答