Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从单词列表和句子列表创建平行语料库(Python)_Python_Regex_Nlp_Re - Fatal编程技术网

从单词列表和句子列表创建平行语料库(Python)

从单词列表和句子列表创建平行语料库(Python),python,regex,nlp,re,Python,Regex,Nlp,Re,我正在尝试创建一个用于监督机器学习的并行语料库 基本上,我希望有两个文件,一个每行有一个完整的句子,另一个只有特定的手动提取的术语,对应于同一行的句子 我已经创建了每行一句话的文件;现在,我想生成标签文件,每行中都有术语。为了便于说明,我提出了以下代码: import re list_of_terms = ["cake", "cola", "water", "stop"] sentences = ["Le

我正在尝试创建一个用于监督机器学习的并行语料库

基本上,我希望有两个文件,一个每行有一个完整的句子,另一个只有特定的手动提取的术语,对应于同一行的句子

我已经创建了每行一句话的文件;现在,我想生成标签文件,每行中都有术语。为了便于说明,我提出了以下代码:

import re

list_of_terms = ["cake", "cola", "water", "stop"]
sentences = ["Let's eat some cake.", "I'd like to have some cola to go with the cake.", "stop eating all this cake, you waterstopper", "I will never eat this again", "cake and cola and water"]
para = []
for line in sentences:
    s = re.findall(r"(?=\b("+'|'.join(list_of_terms)+r")\b)", line)
    para.append(s)
print(*para, sep = "\n")
这将产生我想要的输出:

['cake']
['cola', 'cake']
['stop', 'cake']
[]
['cake', 'cola', 'water']
不幸的是,对于我正在处理的语料库,代码并不能很好地工作。事实上,我面临着三种不同的例外

  • 对于一个语料库,re.findall函数始终向每个术语输出和附加的“”
  • [('criminal','')('responsibility','')('legal','')('fiscal','')('criminal','')('law','')

    我解决了这个问题,多亏了这个帖子中的最后一条评论:

    [x如果x!=''否则y代表x,y在re.findall(r“(?=\b(“+”|“.join(术语列表)+r”)\b)]

  • 但是,此方法引发ValueError,因为regex没有为我正在使用的另外两个语料库创建“”。对于那些我只使用try-except-block并运行示例代码并获得满意结果的语料库。但是,在这种情况下,regex为什么没有创建“”呢

  • 最后,另一个corpra提出了一个re.error“re.error:nothing to repeat at position 4950”,我还没有找到解决方法。我怀疑“术语列表”中有特殊字符;有没有办法事先过滤这些字符

  • 不用说,我对编码还是相当陌生,因为我的背景是翻译,而不是计算机科学。因此,如果能给出一个优雅的答案,我将不胜感激!:)


    注意:我使用的语料库都在ACTER语料库集合中:

    您需要
    重新转义
    术语列表中的每个项目,并使用明确的单词边界:

    re.findall(r"(?=(?<!\w)("+'|'.join(map(re.escape, list_of_terms))+r")(?!\w))", line)
    

    re.findall(r)(?=)试试
    re.findall(r)(?=)是的!这正是我要找的。谢谢你直截了当的回答。不过我真的需要理解那些正则表达式的特殊字符。如果你有时间,介意详细说明r(?=)是什么吗?