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

Python 在围绕关键字的窗口中计算词汇表文件中的匹配项,python,regex,nlp,matching,vocabulary,Python,Regex,Nlp,Matching,Vocabulary,在我的研究中,我试图从语料库中统计存储在一个文件中的一系列复合词(如安全隐患)出现在目标关键字(如设施)的16字窗口内的次数(共现),每个短语1行。我不是一个程序员,我一直在尝试将其分为两个元素:首先从语料库中提取一个文件,其中我有一个匹配我的目标关键字的文件,前后有8个单词。然后尝试将我的“词汇表文件”与该摘录进行匹配。我在第1部分,已经尝试过了,但我只是得到了信息,并且正在努力尝试使用repr:任何建议都值得赞赏,或者其他方法来实现这一点。最终,我需要一个导出文件,其中包含我的词汇表单词,后

在我的研究中,我试图从语料库中统计存储在一个文件中的一系列复合词(如安全隐患)出现在目标关键字(如设施)的16字窗口内的次数(共现),每个短语1行。我不是一个程序员,我一直在尝试将其分为两个元素:首先从语料库中提取一个文件,其中我有一个匹配我的目标关键字的文件,前后有8个单词。然后尝试将我的“词汇表文件”与该摘录进行匹配。我在第1部分,已经尝试过了,但我只是得到了信息,并且正在努力尝试使用repr:任何建议都值得赞赏,或者其他方法来实现这一点。最终,我需要一个导出文件,其中包含我的词汇表单词,后面有一个计数,指示在该窗口中找到目标单词的频率。re.search logic的使用基于我在此留言板上找到的内容,这就是我尝试使用它的原因:

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()
非常感谢你的帮助,保罗,你的语料库已经准备好了吗?你真的应该确认一下

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

output.write(''.join(m.groups()) + '\n')
然后,您将发现您的组将只捕获每个窗口的最后一个单词。您需要加上一对括号:

m = re.search(r'((?:\S+\s+){0,8})facility((?:\s+\S+){0,8})', line)
(?:…)
是一个非捕获组:它定义了
{0,8}
的范围,但在结果中不给您额外的组

看看Python的官方版本,或者在web上搜索正则表达式教程。在任何情况下,也许你应该寻找一个现成的语料库工具,而不是重新发明轮子

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

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

foo bar设施bla foo bar baz设施foo bar


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

这种窗口类似于python,减去缩进。。。。它是什么语言,介意把这些信息添加到你的标签上吗?您可能还想澄清16个单词的窗口是指“{8个单词}{8个单词}”,还是这是一个灵活的窗口。感谢您的回复。对不起,我的第一篇文章在这里。是的,它是Python,添加了Python作为标记。这个窗口是绝对的,无论单词是否重复,我只需要抓住前面的8个单词和后面的8个单词。谢谢Lenz。已经使用过的现成工具LMOSS[link]可以让你输入一个语料库,选择一个搜索关键词粘贴你想要统计的词汇词出现在给定的词窗口中的搜索词。这是非常有用的。不幸的是,它只处理单个单词,我现在需要测试复合词。因此我涉足编程,你还知道其他的吗?一直在阅读Regex,并对您建议的搜索和组进行了更改。我现在得到了文本输出,虽然有些重复,但我需要调查。我不太喜欢co OCC,但我认为你应该在谷歌上搜索一个KWIC(上下文中的关键字)工具,并寻找一个允许你搜索多个单词的工具。但是,再次提醒你,如果你认为变体“安全”、“安全”、“安全”、“安全”等都属于同一个“单词”,你需要对你的语料库进行一些预处理(一个好的语料库工具可能会帮你做到这一点)。谢谢Lenz。上面的Python代码似乎非常接近我现在需要的内容,但它似乎没有在一行中找到所有出现的关键字。例如,如果前面或后面的单词少于8个,则不会捕获任何内容。有什么想法吗?如果您希望关键字在
行中出现不止一次,您可以使用
re.findall()
,或
re.finditer()
@len进行匹配:如果您编辑原始答案以包含解决问题的findall,您将获得一次更新投票:
context = re.findall(r'((?:\S+\s+){0,8})facility((?:\s+\S+){0,8})', line)