首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用多种语言提取法院文件引文

用多种语言提取法院文件引文
EN

Code Review用户
提问于 2017-01-03 16:13:07
回答 1查看 166关注 0票数 5

我有20,000多份法庭文件,我想从其中提取具体的数据:日期,文件编号,判决。我正在使用Python和Regex来执行此操作。

判决采用三种语言(德语、法语和意大利语),其中一些语言的格式略有不同。我正在尝试为各种数据点开发函数,这些数据点考虑到了这一点和不同的语言。

我觉得我的功能很笨拙。有没有人有更多的琵琶方法来开发这些功能?

代码语言:javascript
复制
def gericht(doc):
    Gericht = re.findall(
       r"Beschwerde gegen [a-z]+ [A-Z][a-züöä]+ ([^\n\n]*)", doc)
    Gericht1 = re.findall(
       r"Beschwerde nach [A-Za-z]. [0-9]+ [a-z]+. [A-Z]+ [a-z]+ [a-z]+[A-Za-z]+ [a-z]+ [0-9]+. [A-Za-z]+ [0-9]+ ([^\n\n]*)", doc)
    Gericht2 = re.findall(
       r"Revisionsgesuch gegen das Urteil ([^\n\n]*)", doc)
    Gericht3 = re.findall(
       r"Urteil des ([^\n\n]*)", doc)
    Gericht_it = re.findall(
       r"ricorso contro la sentenza emanata il [0-9]+ [a-z]+ [0-9]+ [a-z]+ ([^\n\n]*)", doc)
    Gericht_fr = re.findall(
       r"recours contre l'arrêt ([^\n\n]*)", doc)
    Gericht_fr_1 = re.findall(
       r"recours contre le jugement ([^\n\n]*)", doc)
    Gericht_fr_2 = re.findall(
       r"demande de révision de l'arrêt ([^\n\n]*)", doc)

    try:
       if Gericht != None:
          return Gericht[0]
    except:
         None

    try:
       if Gericht1 != None:
          return Gericht1[0]
    except:
        None

    try:
       if Gericht2 != None:
          return Gericht2[0]
    except:
       None

    try:
       if Gericht3 != None:
          return Gericht3[0]
    except:
       None

    try:
      if Gericht_it != None:
          return Gericht_it[0]
    except:
      None

    try:
     if Gericht_fr != None:
       Gericht_fr = Gericht_fr[0].replace('de la ', '').replace('du ', '')
         return Gericht_fr
    except:
      None

   try:
       if Gericht_fr_1 != None:
           Gericht_fr_1 = Gericht_fr_1[0].replace('de la ', '').replace('du ', '')
           return Gericht_fr_1
   except:
       None

   try:
      if Gericht_fr_2 != None:
         Gericht_fr_2 = Gericht_fr_2[0].replace('de la ', '').replace('du ', '')
         return Gericht_fr_2
   except:
       None
EN

回答 1

Code Review用户

回答已采纳

发布于 2017-01-03 16:38:17

总是使用4个空格作为缩进;3,4和5。如果你是一个空格外,那么它可以打破你的代码,所以这真的很重要。

您对所有不同的正则表达式都做了大致相同的操作,因此您应该使用循环中的公共代码遍历regexes。但是,我会更改您的公共代码,使其不替换de ladu,并且不需要try-except,因为您可以检查gericht是否真实,因此如果是None或空数组,则不会对其进行索引。采取:

代码语言:javascript
复制
REGEXES = [
    r"Beschwerde gegen [a-z]+ [A-Z][a-züöä]+ ([^\n\n]*)",
    r"Beschwerde nach [A-Za-z]. [0-9]+ [a-z]+. [A-Z]+ [a-z]+ [a-z]+[A-Za-z]+ [a-z]+ [0-9]+. [A-Za-z]+ [0-9]+ ([^\n\n]*)",
    r"Revisionsgesuch gegen das Urteil ([^\n\n]*)",
    r"Urteil des ([^\n\n]*)",
    r"ricorso contro la sentenza emanata il [0-9]+ [a-z]+ [0-9]+ [a-z]+ ([^\n\n]*)",
    r"recours contre l'arrêt ([^\n\n]*)",
    r"recours contre le jugement ([^\n\n]*)",
    r"demande de révision de l'arrêt ([^\n\n]*)",
]

def gericht(doc):
    for regex in REGEXES:
        gericht = re.findall(regex, doc)
        if gericht:
            return gericht[0]

但是,这是不必要地在文档中查找正则表达式的所有项,这不是您想要的。你只想要第一个。要在不编辑正则表达式的情况下做到这一点,您可以使用itertools.chain并使用re.finditer。这能让你:

代码语言:javascript
复制
from itertools import chain

def gericht(doc):
    gericht = next(chain.from_iterable(re.finditer(r, doc) for r in REGEXES), None)
    if gericht is not None:
        return gericht.group(0)

您可能会更改这一点,将所有正则表达式与|合并在一起,但这样就不会将第一个正则表达式优先于其他正则表达式。可与以下方面合作:

代码语言:javascript
复制
def gericht(doc):
    gericht = next(re.finditer('|'.join(REGEXES), doc), None)
    if gericht is not None:
        return gericht.group(0)

但我对雷克斯不太在行。

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

https://codereview.stackexchange.com/questions/151579

复制
相关文章

相似问题

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