Статьи

Подсчет цитат в законодательстве США (в формате XML)

Конгресс США недавно выпустил серию документов XML, содержащих законы США. Структура этих документов позволяет нам определить, какие разделы закона чаще всего цитируются. Изучение того, какие цитаты встречаются чаще всего, позволяет нам увидеть, о чем Конгресс больше всего думал.

Цитаты встречаются по многим причинам: оправдание добавления или пропуска в последующих законах, разъяснения или поправки, или отмены. Как и следовало ожидать, наиболее часто упоминаемые разделы касаются IRS (в частности, подоходного налога), социального обеспечения и военных закупок.

Чтобы прийти к такому результату, мы должны сначала посмотреть, как изложен Кодекс США. Законы подразделяются на иерархию единиц, которая допускает что угодно — от полного названия до отдельных предложений. Эти разделы имеют идентификатор и идентификатор — «идентификатор» используется в качестве ссылки на цитирование в документах XML и имеет форму, отличную от ссылок, используемых юридическим сообществом, в форме, подобной «25 USC Chapter 21 § 1901» ,

Иерархия XML определяет семнадцать различных уровней, которые можно цитировать: «заголовок», «субтитры», «глава», «подраздел», «часть», «подраздел», «подразделение», «подразделение», «статья», «подраздел» »,« раздел »,« подраздел »,« абзац »,« подпункт »,« пункт »,« подпункт »и« пункт ».

Мы можем использовать простое выражение XPath, чтобы получить одно из них, например раздел:

§?104.
 Federal Highway Administration

(a)
 The Federal Highway Administration is an administration
in the Department of Transportation.

Часть читаемой человеком цитаты содержится в «num». Чтобы получить цитату, которую узнает юрист, нам нужно взглянуть на «num» для родительского элемента.

from elementtree import ElementTree as ET
import os
 
dir = "G:\\us_code\\xml_uscAll@113-21"
 
def getParent(parent_map, elt, idx):
  try:
    parent = elt
    for i in range(idx):
      parent = parent_map.get(parent)
 
    return \
      parent.findall('{http://xml.house.gov/schemas/uslm/1.0}num')[0].text +
      ' ' +
      parent.findall('{http://xml.house.gov/schemas/uslm/1.0}heading')[0].text
  except:
    return "--No Heading--"

Как только мы найдем родителя, нам нужно пройти весь путь вверх по дереву:

def getTree(parent_map, t):
  tree = []
  parent = ""
  idx = 0
  while (parent != "--No Heading--"):
    parent = getParent(parent_map, t, idx)
    tree.append(parent)
    idx += 1
  return tree
 
usc26.xml: Title 26— Subtitle A— CHAPTER 1—

Это формирует основу для функции, которая создает индекс цитирования — список каждого узла XML, который может использоваться в цитировании, вместе с понятными для человека цитированием и именем. Это займет некоторое время, поэтому, если вы воспроизводите это усилие, вы можете сохранить результаты в файл.

dir = "G:\\us_code\\xml_uscAll@113-21"
urls = {}
 
def findElements(xpath, urls):
  for root, dirs, files in os.walk(dir):
    for f in files:
      if f.endswith('.xml'):
        tree = ET.parse(dir + "\\" + f)
        parent_map = dict((c, p) for p in tree.getiterator() for c in p)
        sections = tree.findall(xpath)
        for t in sections:
          urls[t.attrib.get('identifier')] = \
            (t.attrib.get('id'),
            getTree(parent_map, t),
            f)
 
refs = {}
refTypes = ['title', 'subtitle', 'chapter', \
  'subchapter', 'part', 'subpart', 'division', \
  'subdivision', 'article', 'subarticle', 'section', \
  'subsection', 'paragraph', 'subparagraph', 'clause', \
  'subclause', 'item']
 
for ref in refTypes:
  findElements('.//{http://xml.house.gov/schemas/uslm/1.0}' + ref, refs)
 
refs.items()[20]
('/us/usc/t2/s2102/b',
 ('id8a923648-f59b-11e2-8dfe-b6d89e949a2c',
  ['(b)  Issuance and publication of regulations',
   u'\xa7\u202f2102.  Duties of Commission',
   u'Part B\u2014 Senate Commission on Art',
   u'SUBCHAPTER V\u2014 HISTORICAL PRESERVATION AND FINE ARTS',
   u'CHAPTER 30\u2014 OPERATION AND MAINTENANCE OF CAPITOL COMPLEX',
   u'Title 2\u2014 THE CONGRESS',
   '--No Heading--'],
  'usc02.xml'))

Теперь, когда мы знаем, как искать цитату, нам нужно найти реальные цитаты. Как и HTML, в документах с кодом США для обозначения узла используется тег «href =», а также «ref href =». Тот же самый метод XPath, использованный выше, позволяет нам находить ссылки:

hrefs = {}
titles = {}
refpath = './/{http://xml.house.gov/schemas/uslm/1.0}ref'
for root, dirs, files in os.walk(dir):
  for f in files:
    if f.endswith('.xml'):
      tree = ET.parse(dir + "\\" + f)
      root = tree.getroot()
      h = {t.attrib.get('href'): f + ' ' + t.text \
          for t in tree.findall(refpath)}
      hrefs = dict(hrefs.items() + h.items())
 
 
hrefs.items()[0]
Out[55]:
('/us/pl/109/280/s601/a/3',
 u'usc29.xml Pub. L. 109\u2013280, title VI, \xa7\u202f601(a)(3)')

У нас есть все, что нужно, чтобы найти, какие разделы часто цитируются, нам просто нужно их объединить Большая часть сложности здесь связана с отсутствующими записями (например, из-за того факта, что цитата может указывать на любую точку иерархии).

from collections import Counter
 
def countCitations(urls, hrefs):
  titles = Counter()
  subtitles = Counter()
  chapters = Counter()
  not_found = []
  for key in hrefs.keys():
    found = urls.get(key)
 
    title = "None"
    subtitle = "None"
    chapter = "None"
    file = "None"
 
    if (found != None):
      (id, history, file) = found
      if len(history) >= 2:
        title = history[-2]
        if len(history) >= 3:
          subtitle = history[-3]
          if len(history) >= 4:
            chapter = history[-4]
    else:
      not_found.append(key)
 
    titles[file + ": " + title] += 1
    subtitles[file + ": " + title + " - " + subtitle] += 1
    chapters[file + ": " + title + " - " + subtitle + " - " + chapter] += 1
  return (titles, subtitles, chapters, not_found)
 
(t, s, c, none) = countCitations(refs, hrefs)

Это возвращает результаты, которые свернуты в заголовки, субтитры и главы. В частности, обратите внимание на то, как по мере детализации результаты дают ясность в отношении того, что было наиболее важным в разделе приорты. В рамках «Общественное здравоохранение и социальное обеспечение» мы видим, что социальное обеспечение важно, а в «Вооруженных силах» мы видим, что «Общее военное право — персонал» важно.

None: None: 359662
usc42.xml: Title 42— THE PUBLIC HEALTH AND WELFARE: 6679
usc10.xml: Title 10— ARMED FORCES: 2078
usc16.xml: Title 16— CONSERVATION: 2068
usc42.xml: None: 1965
usc15.xml: Title 15— COMMERCE AND TRADE: 1796
usc07.xml: Title 7— AGRICULTURE: 1689
usc22.xml: Title 22— FOREIGN RELATIONS AND INTERCOURSE: 1684
usc20.xml: Title 20— EDUCATION: 1660
usc26.xml: Title 26— INTERNAL REVENUE CODE: 1610
None: None - None: 359662
usc42.xml: None - None: 1965
usc42.xml: Title 42— THE PUBLIC HEALTH AND WELFARE - CHAPTER 7— SOCIAL SECURITY: 1573
usc10.xml: Title 10— ARMED FORCES - Subtitle A— General Military Law: 1490
usc42.xml: Title 42— THE PUBLIC HEALTH AND WELFARE - CHAPTER 6A— PUBLIC HEALTH SERVICE: 1220
usc26.xml: Title 26— INTERNAL REVENUE CODE - Subtitle A— Income Taxes: 841
usc05.xml: None - None: 736
usc10.xml: None - None: 639
usc16.xml: Title 16— CONSERVATION - CHAPTER 1— NATIONAL PARKS, MILITARY PARKS, MONUMENTS, AND SEASHORES: 616
usc20.xml: Title 20— EDUCATION - CHAPTER 70— STRENGTHENING AND IMPROVEMENT OF ELEMENTARY AND SECONDARY SCHOOLS: 531
None: None - None - None: 359662
usc42.xml: None - None - None: 1965
usc26.xml: Title 26— INTERNAL REVENUE CODE - Subtitle A— Income Taxes - CHAPTER 1— NORMAL TAXES AND SURTAXES: 817
usc10.xml: Title 10— ARMED FORCES - Subtitle A— General Military Law - PART II— PERSONNEL: 738
usc05.xml: None - None - None: 736
usc42.xml: Title 42— THE PUBLIC HEALTH AND WELFARE - CHAPTER 7— SOCIAL SECURITY - SUBCHAPTER XVIII— HEALTH INSURANCE FOR AGED AND DISABLED: 663
usc10.xml: None - None - None: 639
usc38.xml: None - None - None: 497
usc10.xml: Title 10— ARMED FORCES - Subtitle A— General Military Law - PART IV— SERVICE, SUPPLY, AND PROCUREMENT: 496
usc15.xml: None - None - None: 428

Дальнейшая работа в этой области будет включать очистку результатов для удаления некоторых записей «Нет», построение визуализации результатов и обучение меток распознаванию понятных для человека версий цитирования в судебных документах. В долгосрочной перспективе я надеюсь, что эти разработки помогут сделать юридическую информацию более доступной для всех, а не помещаться в дорогие базы данных.