1. 程式人生 > >『Re』知識工程作業_主體識別

『Re』知識工程作業_主體識別

lib cname line lin 兩種 list loss pytho mat

作業要求

技術分享圖片

技術分享圖片

環境路徑

類似於這樣的,一共50篇文檔,

技術分享圖片

均為中文文檔,是法院判決書的合集。

程序

程序如下,我完全使用正則表達式來實現功能,

import re
import glob
import copy

name_list = glob.glob(‘./*.txt‘)

date_totul = []
indictee_totul = []
court_totul = []
procuratorate_totul = []
with open(‘./result.txt‘,‘a‘,encoding=‘utf-8‘) as f_r:
    for name in name_list:
        f_r.write(‘<{0}>\n\n‘.format(name.split(‘\\‘)[-1]))
        with open(name,encoding=‘utf-8‘) as f:
            lines = f.read()

            # 時間匹配
            #xxxx年xx月xx日;同年xx月xx日;xxxx年xx月x旬;xxxx年xx月底;xxxx年xx月;xx月xxx日
            # |優先匹配前面的,無符合才匹配後面的
            pattern_t = re.compile(
‘[0-9〇一二三四五六七八九]{4}年.{1,2}月.{1,3}日‘ ‘|同年.{1,2}月.{1,3}日‘ ‘|[0-9〇一二三四五六七八九]{4}年.{1,2}月.{1}旬‘ ‘|[0-9〇一二三四五六七八九]{4}年.{1,2}月底‘ ‘|[0-9〇一二三四五六七八九]{4}年.{1,2}月‘ ‘|[0-9〇一二三四五六七八九十]{1,2}月.{1,3}日‘) date_step = [date for date in pattern_t.findall(lines)] # print(date_step) for i in date_step: f_r.write(‘<time>{0}</time>\n\n‘.format(i)) date_totul.extend(date_step) # 被告匹配 pattern_i = re.compile(‘被告人(.{2,4}?)[,,]|被上訴人:(.+?)。|被執行人:(.+?)。‘) pattern_i2 = re.compile(‘被申訴人\(.+\):(.+)。|被申請人\(.+\):(.+)。‘) defendant = list(set([item[0] for item in re.findall(pattern_i,lines) + pattern_i2.findall(lines) if ‘死刑‘ not in item[0]])) if defendant != [] and defendant != [‘‘]: print(defendant) # indictee_totul.append(indictee_step) for item in defendant: f_r.write(‘<defendant>{0}</defendant>\n\n‘.format(item)) # 法院匹配 pattern_c = re.compile(‘[\n。,,《;](.{,15}?人民法院)‘) _court_list = [name.group(1) for name in pattern_c.finditer(lines)] _court_step = [] # print(_court_list) for _court in _court_list: _court_step.append(_court.split(‘。‘)[-1] .split(‘,‘)[-1] .split(‘《‘)[-1] .split(‘、‘)[-1] .split(‘;‘)[-1]) _court_step = list(set(_court_step)) for court_name in _court_step: if ‘由‘ in court_name or ‘向‘ in court_name or ‘受‘ in court_name or ‘和‘ in court_name: # print(name) _court_step.append(court_name.split(‘由‘)[-1]. split(‘向‘)[-1]. split(‘受‘)[-1]. split(‘和‘)[-1]) _court_step.remove(court_name) # print(_court_step) if ‘不服‘ in court_name or ‘後被‘ in court_name or ‘報請‘ in court_name or ‘書證‘ in court_name or ‘核準‘ in court_name or ‘指令‘ in court_name or ‘維持‘ in court_name or ‘撤銷‘ in court_name or ‘參照‘ in court_name: _court_step.append(copy.deepcopy(court_name[2::])) _court_step.remove(court_name) _court_step = list(set(_court_step)) if ‘人民法院‘ in _court_step: _court_step.remove(‘人民法院‘) for i in _court_step: f_r.write(‘<court>{0}</court>\n\n‘.format(i)) # print(name,_court_step) # 檢察院匹配 pattern_p = re.compile(‘審理(.+)指控‘) procuratorate_step = list(set([name.group(1) for name in pattern_p.finditer(lines)])) procuratorate_totul.extend(procuratorate_step) # print(name,procuratorate_step) for i in procuratorate_step: f_r.write(‘<procuratorate>{0}</procuratorate>\n\n‘.format(i)) # 地點匹配 pattern_pl_1 = re.compile(‘(.{2}省.+?縣)‘) pattern_pl_2 = re.compile(‘.{2}省.{2}市‘) pattern_pl_3 = re.compile(‘.{2}省.+?自治州‘) pattern_pl_4 = re.compile(‘.{2}省.+?鄉‘) pattern_pl_5 = re.compile(‘.{2}市.{2}區‘) pattern_pl_6 = re.compile(‘.{2}市.{2}鎮‘) pattern_pl_7 = re.compile(‘.{2}市.+?開發區‘) place_step = list(set([name.group(0) for name in pattern_pl_1.finditer(lines)])) place_step.extend(list(set([name.group(0) for name in pattern_pl_2.finditer(lines)]))) place_step.extend(list(set([name.group(0) for name in pattern_pl_3.finditer(lines)]))) place_step.extend(list(set([name.group(0) for name in pattern_pl_4.finditer(lines)]))) place_step.extend(list(set([name.group(0) for name in pattern_pl_5.finditer(lines)]))) place_step.extend(list(set([name.group(0) for name in pattern_pl_6.finditer(lines)]))) place_step.extend(list(set([name.group(0) for name in pattern_pl_7.finditer(lines)]))) place_step_n = [] for place_name in place_step: if len(place_name)<=15: # print(name,place_name) place_step_n.append(place_name) if ‘×ב in place_name: if place_name in place_step_n: place_step_n.append(place_name.split(‘×ב)[0]) place_step_n.remove(place_name) if ‘XX‘ in place_name: if place_name in place_step_n: place_step_n.append(place_name.split(‘XX‘)[0]) place_step_n.remove(place_name) # print(name, [(len(item)) for item in place_step_n]) # print(name,place_step,len(place_step)) # print(name,place_step_n,len(place_step_n)) for i in place_step_n: f_r.write(‘<location>{0}</location>\n\n‘.format(i)) f_r.write(‘</{0}>\n\n‘.format(name.split(‘\\‘)[-1]))

截取結果文檔中某一文件的結果貼出來,展示如下,

<11273.txt>

<time>1991年7月3日</time>

<time>2008年8月7日</time>

<time>2008年9月16日</time>

<time>2009年3月18日</time>

<time>2011年2月6日</time>

<time>2012年2月2日</time>

<time>2013年3月28日</time>

<time>2013年6月14日</time>

<time>2014年4月14日</time>

<time>2014年10月27日</time>

<time>2013年5月8日</time>

<time>5月10日</time>

<time>二〇一五年二月二十七日</time>

<defendant>楊飛程</defendant>

<court>雲南省麗江市中級人民法院</court>

<court>雲南省高級人民法院</court>

<court>最高人民法院</court>

<procuratorate>麗江市人民檢察院</procuratorate>

<location>雲南省麗江市</location>

<location>雲南省大理市</location>

<location>麗江市古城區</location>

<location>大理市</location>

</11273.txt>

re總結

這次使用了不少這則表達式,雖然不怎麽高深,不過還是略有心得,特此總結一下。

這裏給出一個比較完備的正則表達式介紹,但是自己的使用還是有一些自己的理解重點,所以這篇文章還要繼續233

幾個基礎函數

re.compile(pattern, flags=0)

將正則表達式模式編譯成一個正則表達式對象,它可以用於匹配使用它的match ()search ()等方法。

實際有兩種使用方式:

  pattern.匹配方法(string) 或者 re.匹配方法(pattern,string)

使用或|來強化匹配規則:

pattern_t = re.compile(
‘[0-9〇一二三四五六七八九]{4}年.{1,2}月.{1,3}日‘ ‘|同年.{1,2}月.{1,3}日‘ ‘|[0-9〇一二三四五六七八九]{4}年.{1,2}月.{1}旬‘ ‘|[0-9〇一二三四五六七八九]{4}年.{1,2}月底‘ ‘|[0-9〇一二三四五六七八九]{4}年.{1,2}月‘ ‘|[0-9〇一二三四五六七八九十]{1,2}月.{1,3}日‘)

re.findall(pattern, string, flags=0)

返回字符串

re.finditer(pattern, string, flags=0)

返回一個叠代器符合

正則表達式叠代器對象

之所以單提出來,是因為叠代器在匹配組groups的時候真的好用,

pattern_c = re.compile(‘[\n。,,《;](.{,15}?人民法院)‘)
_court_list = [name.group(1) for name in pattern_c.finditer(lines)]

group(1)表示匹配到的符合第一組的部分,2、3……類推,而0表示包含全部匹配的各個組結果的元組。

貪婪匹配

比如正則表達式:

‘審理(.+)指控‘

我希望不去貪婪匹配,那麽應該是

‘審理(.+)指控?‘

而非

‘審理(.+?)指控‘

『Re』知識工程作業_主體識別