计算围绕关键字的窗口中的词汇表文件的匹配

时间:2013-06-03 20:26:01

标签: python regex nlp matching vocabulary

对于我的研究,我试图从语料库中计算存储在文件中的一系列复合词(例如安全隐患)的次数(共现),每个短语1行,出现在16个字内目标关键字的窗口(例如工厂)。我不是程序员,一直试图把它分成两个元素:首先从语料库中提取一个文件,我的目标关键字匹配,前后8个字。然后尝试将我的“词汇表文件”与该摘录匹配。我在第1部分,尝试了这个,但我只是得到了< _sre.SRE_Match对象在0x028FFE78>消息,我正在努力尝试使用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()

任何帮助表示赞赏,保罗

1 个答案:

答案 0 :(得分:1)

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

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

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 facility bla foo bar baz facility foo bar

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