Конгресс США недавно выпустил серию документов 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
Дальнейшая работа в этой области будет включать очистку результатов для удаления некоторых записей «Нет», построение визуализации результатов и обучение меток распознаванию понятных для человека версий цитирования в судебных документах. В долгосрочной перспективе я надеюсь, что эти разработки помогут сделать юридическую информацию более доступной для всех, а не помещаться в дорогие базы данных.