首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在关键字周围的窗口中计算词汇文件中的匹配项

在关键字周围的窗口中计算词汇文件中的匹配项
EN

Stack Overflow用户
提问于 2013-06-04 04:26:01
回答 1查看 426关注 0票数 0

在我的研究中,我试图从语料库中统计存储在文件中的一系列复合术语(例如,安全危险)在目标关键字(例如,设施)的16个单词窗口内出现的次数(例如,安全危险),每个短语一行。我不是一个程序员,一直试图将其分解为2个元素:首先从语料库中提取一个文件,在那里我有一个与我的目标关键字匹配,与8个单词之前和之后。然后尝试将我的“词汇文件”与该摘录进行匹配。在第1部分中,我已经尝试过了,但我只是在0x028FFE78>消息中获得了<_sre.SRE_Match对象,并且正在努力尝试使用repr:任何建议或其他方法都可以做到这一点。最终,我想要一个导出文件,其中包含我的词汇表单词,后面有一个计数,表明它们在该窗口中与我的目标单词一起被找到的频率。re.search逻辑的使用是基于我在这个留言板上找到的,这就是我尝试它的原因:

代码语言:javascript
复制
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()

感谢你的帮助,保罗

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-06-04 15:26:28

你的语料库已经是tokenized了吗?你真的应该确保它是正确的。

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

代码语言:javascript
复制
output.write(''.join(m.groups()) + '\n')

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

代码语言:javascript
复制
m = re.search(r'((?:\S+\s+){0,8})facility((?:\s+\S+){0,8})', line)

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

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

编辑:

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

代码语言:javascript
复制
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个单词,则第二个“设施”的左窗口将少于第一个“设施”已经消耗的窗口。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16905243

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档