在我的研究中,我试图从语料库中统计存储在文件中的一系列复合术语(例如,安全危险)在目标关键字(例如,设施)的16个单词窗口内出现的次数(例如,安全危险),每个短语一行。我不是一个程序员,一直试图将其分解为2个元素:首先从语料库中提取一个文件,在那里我有一个与我的目标关键字匹配,与8个单词之前和之后。然后尝试将我的“词汇文件”与该摘录进行匹配。在第1部分中,我已经尝试过了,但我只是在0x028FFE78>消息中获得了<_sre.SRE_Match对象,并且正在努力尝试使用repr:任何建议或其他方法都可以做到这一点。最终,我想要一个导出文件,其中包含我的词汇表单词,后面有一个计数,表明它们在该窗口中与我的目标单词一起被找到的频率。re.search逻辑的使用是基于我在这个留言板上找到的,这就是我尝试它的原因:
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()感谢你的帮助,保罗
发布于 2013-06-04 15:26:28
你的语料库已经是tokenized了吗?你真的应该确保它是正确的。
无论如何,我认为您对match对象的组感兴趣:
output.write(''.join(m.groups()) + '\n')然后,您会发现您的组将仅捕获每个窗口的最后一个单词。你需要多加一对括号:
m = re.search(r'((?:\S+\s+){0,8})facility((?:\s+\S+){0,8})', line)(?:...)是一个非捕获组:它定义了{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 bar设施bla foo bar baz设施foo bar
将只为第一次出现的"facility“生成一个匹配项,第二个匹配项在其右侧窗口中。第二个“工具”不会生成自己的匹配,因为re.findall()不会进行重叠匹配,这意味着它只在正确的上下文结束后才会寻找另一个“工具”。这也意味着,如果中间有9到15个单词,则第二个“设施”的左窗口将少于第一个“设施”已经消耗的窗口。
https://stackoverflow.com/questions/16905243
复制相似问题