package_scope.py 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426
  1. """Phase 6 migration from interface/getAttributes.py.
  2. This module hosts the package/scope-related functions migrated verbatim from
  3. ``BiddingKG.dl.interface.getAttributes`` as part of the Phase 6 assembly
  4. re-organization. It provides:
  5. - The ``dict_role_id`` and ``role2id_dict`` role-id mapping constants.
  6. - ``getPackageScopePattern`` and the module-level ``pattern_packageScope``
  7. regex used to identify package-scope keywords.
  8. - ``getPackagesFromArticle`` which extracts package/标段 information from an
  9. article's sentences and injects the resulting package entities into the
  10. entity list.
  11. - ``getPackage`` which resolves the package a given entity belongs to based
  12. on the package scope.
  13. """
  14. from __future__ import absolute_import
  15. import re
  16. import os
  17. import copy
  18. import pandas as pd
  19. from BiddingKG.dl.common.Utils import uniform_package_name, find_package
  20. from BiddingKG.dl.interface.Entitys import Entity
  21. dict_role_id = {"0":"tenderee",
  22. "1":"agency",
  23. "2":"win_tenderer",
  24. "3":"second_tenderer",
  25. "4":"third_tenderer"}
  26. role2id_dict = {"tenderee":0,
  27. "agency":1,
  28. "win_tenderer":2,
  29. "second_tenderer":3,
  30. "third_tenderer":4}
  31. def getPackageScopePattern():
  32. '''
  33. @summary: 获取包的作用域关键词
  34. '''
  35. df = pd.read_excel(os.path.join(os.path.dirname(__file__), "..", "interface", "end.xls"))
  36. pattern = "("
  37. for item in df["list_word"]:
  38. item = str(item).replace("(","\(").replace(")","\)").replace(".","\.").replace("[","\[").replace("]","\]").replace("-","\-")
  39. pattern += item+"|"
  40. pattern = pattern[:-1]+")[::是为]|业绩.{,30}标段[0-9A-Za-z一二三四五六七八九十]{0,3}|##attachment##"
  41. return pattern
  42. pattern_packageScope = getPackageScopePattern()
  43. def getPackagesFromArticle(list_sentence, list_entity):
  44. '''
  45. @param:
  46. list_sentence:文章的句子list
  47. @summary: 将包的信息插入list_entity中
  48. @return: type:list if [包号,句子index,词偏移,标段号] meaning:文章的包/标段信息
  49. '''
  50. if len(list_sentence) == 0:
  51. return None
  52. list_sentence.sort(key=lambda x: x.sentence_index)
  53. PackageList = []
  54. PackageList_scope = []
  55. PackageSet = set()
  56. dict_packageCode = dict()
  57. main_body_pack = set() # 2024/04/28 保存正文包号
  58. # package_number_pattern = re.compile(
  59. # '((施工|监理|监测|勘察|设计|劳务)(标段)?[0-9一二三四五六七八九十ⅠⅡⅢⅣⅤⅥⅦa-zA-Z]{,4}(标段?|包))|(([a-zA-Z]包[:)]?)?第?[0-9一二三四五六七八九十ⅠⅡⅢⅣⅤⅥⅦa-zA-Z]{1,4}标[段包]?)|((标[段号的包项]|([标分子]|合同|项目|采购|()包|包[组件号])[0-9一二三四五六七八九十ⅠⅡⅢⅣⅤⅥⅦA-Za-z]{1,4})|(([,;。、:(]|第)[0-9一二三四五六七八九十ⅠⅡⅢⅣⅤⅥⅦ]{1,4}分?包)|([a-zA-Z][0-9]{,3}分?[包标])|.{,1}((包组|包件|包号|分?包|标[段号的包]|子项目)编?号?[::]?[a-zA-Z0-9一二三四五六七八九十ⅠⅡⅢⅣⅤⅥⅦ-]+)|[,;。、:(]包[0-9一二三四五六七八九十ⅠⅡⅢⅣⅤⅥⅦ]{1,4}[^\w]') # 标号
  60. # package_number_pattern = re.compile(
  61. # '((施工|监理|监测|勘察|设计|劳务)(标段)?:?第?([一二三四五六七八九十]{1,3}|[ⅠⅡⅢⅣⅤⅥⅦ]{1,3}|[a-zA-Z0-9]{1,9}\-?[a-zA-Z0-9-]{,9})?[分子]?(标[段包项]?|包[组件标]?|合同[包段]))\
  62. # |(([a-zA-Z]包[:()]?)?第?([一二三四五六七八九十]{1,3}|[ⅠⅡⅢⅣⅤⅥⅦ]{1,3}|[a-zA-Z0-9]{1,9}\-?[a-zA-Z0-9-]{,9})[分子]?(标[段包项]?|合同[包段]))\
  63. # |(([,;。、:(]|第)?([一二三四五六七八九十]{1,3}|[ⅠⅡⅢⅣⅤⅥⅦ]{1,3}|[a-zA-Z0-9]{1,9}\-?[a-zA-Z0-9-]{,9})[分子]?(标[段包项]?|包[组件标]?|合同[包段]))\
  64. # |((标[段包项]|标段(包)|包[组件标]|[标分子(]包)(\[|【)?:?([一二三四五六七八九十]{1,3}|[ⅠⅡⅢⅣⅤⅥⅦ]{1,3}|[a-zA-Z0-9]{1,9}\-?[a-zA-Z0-9-]{,9}))\
  65. # |[,;。、:(](标的?|项目|子项目?)(\[|【)?:?([一二三四五六七八九十]+|[0-9]{1,9})\
  66. # |((([标分子(]|合同|项目|采购)包|[,。]标的|子项目|[分子]标|标[段包项]|包[组件标]?)编?号[::]?[a-zA-Z0-9一二三四五六七八九十ⅠⅡⅢⅣⅤⅥⅦ-]{1,9})\
  67. # |[,;。、:(]?(合同|分|子)?包:?([一二三四五六七八九十]{1,3}|[ⅠⅡⅢⅣⅤⅥⅦ]{1,3}|[a-zA-Z0-9]{1,9}\-?[a-zA-Z0-9-]{,9})')
  68. other_package_pattern = re.compile(
  69. '((项目|物资|设备|场次|标段|标的|产品)(名称)?)[::]([^,。]{2,50}?)[,。]') # # 2020/11/23 大网站规则 调整 package_N_name_pattern, package_N_name_pattern 中的项目 改为 子项目
  70. win_tenderer_pattern = re.compile('(中标候?选?人|供应商)(名称)?[::](.{2,25})[,。]') # 2020/11/23 大网站规则 调整
  71. model_pattern = re.compile('(型号|序号)[::]([^,。]{2,20})[,。]') # 2020/11/23 大网站规则 调整
  72. number_pattern = re.compile("[0-9A-Za-z一二三四五六七八九十ⅠⅡⅢⅣⅤⅥⅦ]{1,4}")
  73. package_code_pattern = re.compile("(?:编号[::]?\s*)([-\dA-Za-z\(\)]{1,20})")
  74. # 纯数字类型的包号统一,例如:'01','1'
  75. re_digital = re.compile("^\d+$")
  76. def changeIndexFromWordToWords(tokens, word_index):
  77. '''
  78. @summary:转换某个字的字偏移为词偏移
  79. '''
  80. before_index = 0
  81. after_index = 0
  82. for i in range(len(tokens)):
  83. after_index = after_index + len(tokens[i])
  84. if before_index <= word_index and after_index >= word_index:
  85. return i
  86. before_index = after_index
  87. package_names = []
  88. def extractPackageCode(tokens, word_index, size=20, pattern=package_code_pattern):
  89. '''
  90. @summary:抽取包附近的标段号
  91. @param:
  92. tokens:包所在句子的分词
  93. word_index:包所在字偏移
  94. size:左右各取多少个词
  95. pattern:提取标段号的正则
  96. @return: type:string,meaning:标段号
  97. '''
  98. index = changeIndexFromWordToWords(tokens, word_index)
  99. if index < size:
  100. begin = index
  101. else:
  102. begin = index - size
  103. if index + size > len(tokens):
  104. end = len(tokens)
  105. else:
  106. end = index + size
  107. # 拿到左右两边的词语组成短语
  108. text = "".join(tokens[begin:end])
  109. # 在短语中的字偏移
  110. new_word_index = word_index - len("".join(tokens[:begin]))
  111. min_distance = len(text)
  112. packageCode = None
  113. for the_iter in re.finditer(pattern, text):
  114. # 算出最小距离
  115. distance = min([abs(new_word_index - the_iter.span()[0]), abs(new_word_index - the_iter.span()[1])])
  116. if distance < min_distance:
  117. min_distance = distance
  118. packageCode = the_iter.group(1)
  119. return packageCode
  120. def get_package():
  121. PackageList_scope = []
  122. True_package = set()
  123. for i in range(len(list_sentence)):
  124. PackageList_item = []
  125. PackageList_item_scope = []
  126. content = list_sentence[i].sentence_text
  127. # content = content.replace('号,', '号:').replace(':', ':').replace('(', '(').replace(')', ')')
  128. # # .replace('-包',' 包').replace('包-', '包 ').replace('-标', ' 标').replace('标段-', '标段 ').replace('-合同包', ' 合同包') # 72760191 标段:№10
  129. # content = re.sub('[一二三四五六七八九十\d](标[段包项]|包[组件标])编号', ' 标段编号', content)
  130. #
  131. # for it in re.finditer('CA标|(每个?|所有|相关|个|各|不分)[分子]?(标[段包项]?|包[组件标]?|合同包)|(质量|责任)三包|包[/每]|标段(划分|范围)|(承|压缩|软|皮|书|挂)包\
  132. # |标[识注签贴配]|[商油]标号|第X包|第[一二三四五六七八九十]+至[一二三四五六七八九十]+(标[段包项]?|包[组件标]?|合同[包段])\
  133. # |\.(docx|doc|pdf|xlsx|xls|jpg)|[一二三四五]次|五金|\d+[年月]|[\d.,]+万?元|\d+\.\d+', content):
  134. # content = content.replace(it.group(0), ' ' * len(it.group(0)))
  135. # tokens = list_sentence[i].tokens
  136. # _names = []
  137. # for iter in re.finditer(package_number_pattern, content):
  138. # if re.search('(业绩|信誉要求):', content[:iter.start()]): # 前面有业绩或信誉的标段去掉
  139. # continue
  140. # # print('提取到标段:%s, 前后文:%s'%(iter.group(), content[iter.start()-5:iter.end()+5]))
  141. # if re.match('\d', iter.group(0)) and re.search('\d\.$', content[:iter.start()]): # 排除2.10标段3 5.4标段划分 这种情况
  142. # # print('过滤掉错误包:', iter.group())
  143. # continue
  144. # if re.search('[承每书/]包|XX|xx', iter.group(0)) or re.search('\d包[/每]\w|一包[0-9一二三四五六七八九十]+', content[iter.start():iter.end()+3]) or re.search('[a-zA-Z0-9一二三四五六七八九十ⅠⅡⅢⅣⅤⅥⅦ-]{6,}', iter.group(0)):
  145. # # print('过滤掉错误包:', iter.group())
  146. # continue
  147. # elif iter.end()+2 < len(content) and re.search('标准|标的物|标志|包装|划分|标书', content[iter.start():iter.end()+2]):
  148. # # print('过滤掉错误包:',iter.group())
  149. # continue
  150. # elif re.search('同一(标段?|包)', content[max(0, iter.start()-2):iter.end()]): # 不得参加同一标段
  151. # # print('过滤掉错误包:', iter.group())
  152. # continue
  153. # elif re.search('三包', content[max(0, iter.start()-2):iter.end()]) and re.search('第三包', content[max(0, iter.start()-2):iter.end()])==None: # 规规章和“三包”规定
  154. # # print('过滤掉错误包:', iter.group())
  155. # continue
  156. # elif re.search('[1-9]\d{2,}$|\d{4,}|^[1-9]\d{2,}|合同包[A-Za-z]{2,}', iter.group(0)):
  157. # # print('过滤掉错误包号5:', iter.group(0))
  158. # continue
  159. tokens = list_sentence[i].tokens
  160. _names = []
  161. for iter in find_package(content):
  162. temp_package_number = uniform_package_name(iter.group(0))
  163. True_package.add(temp_package_number)
  164. PackageList_item.append({"name": temp_package_number, "sentence_index": list_sentence[i].sentence_index,
  165. "offsetWords_begin": changeIndexFromWordToWords(tokens, iter.span()[0]),
  166. "offsetWord_begin": iter.span()[0], "offsetWord_end": iter.span()[1]})
  167. # PackageList_item.append([temp_package_number,i,changeIndexFromWordToWords(tokens,iter.span()[0]),iter.span()[0],iter.span()[1]])
  168. code = extractPackageCode(tokens, iter.span()[0])
  169. if code is not None:
  170. dict_packageCode[temp_package_number] = code
  171. PackageSet.add(temp_package_number)
  172. if not list_sentence[i].in_attachment: # 保存不在附件的包号
  173. main_body_pack.add(temp_package_number)
  174. # 识别packageScope
  175. for iter in re.finditer(pattern_packageScope, content):
  176. PackageList_item_scope.append({"name": "", "sentence_index": list_sentence[i].sentence_index,
  177. "offsetWords_begin": changeIndexFromWordToWords(tokens, iter.span()[0]),
  178. "offsetWord_begin": iter.span()[0], "offsetWord_end": iter.span()[1]})
  179. # PackageList_item_scope.append(["",i,changeIndexFromWordToWords(tokens,iter.span()[0]),iter.span()[0],iter.span()[1]])
  180. PackageList_item_scope = PackageList_item + PackageList_item_scope
  181. PackageList_item_scope.sort(key=lambda x: x["offsetWord_begin"])
  182. PackageList_scope = PackageList_scope + PackageList_item_scope
  183. PackageList_item.sort(key=lambda x: x["sentence_index"])
  184. return PackageList_scope, True_package
  185. def get_win_project():
  186. '''获取多个项目多个中标人的项目'''
  187. PackageList_scope = []
  188. True_package = set()
  189. # 2020/11/23 大网站规则 调整
  190. if len(PackageSet) == 0 and len(
  191. set([it.entity_text for it in list_entity if
  192. it.entity_type in ['org', 'company'] and it.label == 2])) > 1:
  193. for i in range(len(list_sentence)):
  194. PackageList_item = []
  195. PackageList_item_scope = []
  196. content = list_sentence[i].sentence_text
  197. tokens = list_sentence[i].tokens
  198. names = re.findall(other_package_pattern, content)
  199. N_names = re.findall(win_tenderer_pattern, content)
  200. if len(names) != 1 or len(N_names) != 1:
  201. continue
  202. for iter in re.finditer(other_package_pattern, content):
  203. temp_package_number = iter.group(4)
  204. xinghao = re.search(model_pattern, content)
  205. if xinghao:
  206. temp_package_number = temp_package_number + '+' + xinghao.group(2)
  207. # print('新正则采购包名补充',temp_package_number)
  208. if re.search(re_digital, temp_package_number):
  209. temp_package_number = str(int(temp_package_number))
  210. True_package.add(temp_package_number)
  211. PackageList_item.append(
  212. {"name": temp_package_number, "sentence_index": list_sentence[i].sentence_index,
  213. "offsetWords_begin": changeIndexFromWordToWords(tokens, iter.span()[0]),
  214. "offsetWord_begin": iter.span()[0], "offsetWord_end": iter.span()[1]})
  215. # PackageList_item.append([temp_package_number,i,changeIndexFromWordToWords(tokens,iter.span()[0]),iter.span()[0],iter.span()[1]])
  216. code = extractPackageCode(tokens, iter.span()[0])
  217. if code is not None:
  218. dict_packageCode[temp_package_number] = code
  219. PackageSet.add(temp_package_number)
  220. if not list_sentence[i].in_attachment: # 保存不在附件的包号
  221. main_body_pack.add(temp_package_number)
  222. # 识别packageScope
  223. for iter in re.finditer(pattern_packageScope, content):
  224. PackageList_item_scope.append({"name": "", "sentence_index": list_sentence[i].sentence_index,
  225. "offsetWords_begin": changeIndexFromWordToWords(tokens,
  226. iter.span()[0]),
  227. "offsetWord_begin": iter.span()[0],
  228. "offsetWord_end": iter.span()[1]})
  229. # PackageList_item_scope.append(["",i,changeIndexFromWordToWords(tokens,iter.span()[0]),iter.span()[0],iter.span()[1]])
  230. PackageList_item_scope = PackageList_item + PackageList_item_scope
  231. PackageList_item_scope.sort(key=lambda x: x["offsetWord_begin"])
  232. PackageList_scope = PackageList_scope + PackageList_item_scope
  233. PackageList_item.sort(key=lambda x: x["sentence_index"])
  234. return PackageList_scope, True_package
  235. def get_package_scope(PackageList_scope):
  236. PackageList = []
  237. pattern_punctuation = "[::()\(\),,。;;]"
  238. # print("===packageList_scope",PackageList_scope)
  239. for i in range(len(list_sentence)):
  240. for j in range(len(PackageList_scope)):
  241. if i == PackageList_scope[j]["sentence_index"] and PackageList_scope[j]["name"] != "":
  242. _flag = False
  243. left_str = list_sentence[i].sentence_text[
  244. PackageList_scope[j]["offsetWord_begin"] - 30:PackageList_scope[j][
  245. "offsetWord_begin"] + 1]
  246. right_str = list_sentence[i].sentence_text[
  247. PackageList_scope[j]["offsetWord_begin"]:PackageList_scope[j]["offsetWord_begin"] + 30]
  248. _left_find = re.findall(pattern_punctuation, left_str)
  249. _right_find = re.findall(pattern_punctuation, right_str)
  250. # print(left_str)
  251. if re.search("同", left_str[-1:]) is not None and PackageList_scope[j]["name"] == "一":
  252. continue
  253. if re.search("划分", right_str[:10]) is not None:
  254. continue
  255. if len(_left_find) > 0 and _left_find[-1] in [":", ":"]:
  256. _flag = True
  257. if len(_right_find) > 0 and _right_find[0] in [":", ":"]:
  258. _flag = True
  259. if _flag:
  260. scope_begin = [PackageList_scope[j]["sentence_index"],
  261. PackageList_scope[j]["offsetWords_begin"]]
  262. else:
  263. scope_begin = [PackageList_scope[j]["sentence_index"], 0] # 2024/10/10 改为包作用域开始位置为包号所在句子开头
  264. # if j == 0:
  265. # scope_begin = [0, 0]
  266. # else:
  267. # scope_begin = [PackageList_scope[j - 1]["sentence_index"],
  268. # PackageList_scope[j - 1]["offsetWords_begin"]]
  269. if j == len(PackageList_scope) - 1:
  270. scope_end = [list_sentence[-1].sentence_index,
  271. changeIndexFromWordToWords(list_sentence[-1].tokens,
  272. len(list_sentence[
  273. -1].sentence_text))]
  274. else:
  275. scope_end = [PackageList_scope[j + 1]["sentence_index"],
  276. PackageList_scope[j + 1]["offsetWords_begin"]]
  277. if j>0 and PackageList_scope[j - 1]["sentence_index"] == PackageList_scope[j]["sentence_index"] and \
  278. PackageList_scope[j - 1]["offsetWord_begin"] <= PackageList_scope[j]["offsetWord_begin"] and \
  279. PackageList_scope[j - 1]["offsetWord_end"] >= PackageList_scope[j]["offsetWord_end"]:
  280. continue
  281. # add package to entity
  282. _pack_entity = Entity(doc_id=list_sentence[0].doc_id, entity_id="%s_%s_%s_%s" % (
  283. list_sentence[0].doc_id, i, PackageList_scope[j]["offsetWord_begin"],
  284. PackageList_scope[j]["offsetWord_begin"]), entity_text=PackageList_scope[j]["name"],
  285. entity_type="package", sentence_index=PackageList_scope[j]["sentence_index"],
  286. begin_index=changeIndexFromWordToWords(list_sentence[i].tokens,
  287. PackageList_scope[j][
  288. "offsetWord_begin"]),
  289. end_index=changeIndexFromWordToWords(list_sentence[i].tokens,
  290. PackageList_scope[j]["offsetWord_end"]),
  291. wordOffset_begin=PackageList_scope[j]["offsetWord_begin"],
  292. wordOffset_end=PackageList_scope[j]["offsetWord_end"],
  293. in_attachment=list_sentence[i].in_attachment)
  294. list_entity.append(_pack_entity)
  295. copy_pack = copy.copy(PackageList_scope[j])
  296. copy_pack["scope"] = [scope_begin, scope_end]
  297. copy_pack["hit"] = set()
  298. copy_pack["pointer"] = _pack_entity
  299. PackageList.append(copy_pack)
  300. return PackageList
  301. PackageList_scope, True_package = get_package()
  302. # PackageList_scope2, True_package2 = get_win_project() # 20240508 与表格提取重复,去掉
  303. # if len(True_package2) > 2: # 同时包含多标段及多中标人的
  304. # PackageList_scope = PackageList_scope + PackageList_scope2
  305. PackageList = get_package_scope(PackageList_scope)
  306. # if len(PackageSet)<2: # 20230922只提取到一个包号的去掉,都放在默认包project 2024/02/02 注释掉,防止多标段每篇公告只公布一个标段的没法提取标段号
  307. # return [], set(), {}
  308. return PackageList, PackageSet, dict_packageCode, main_body_pack
  309. def getPackage(packageList,sentence_index,begin_index,roleid,MAX_DIS=None,DIRECT=None):
  310. '''
  311. @param:
  312. packageList:文章的包的信息,包号-sent_index-词偏移-字偏移-[[前作用域句子,句内偏移],[后作用域句子,句内偏移]]-匹配集合
  313. sentence_index:实体所在的句子
  314. begin_index:实体所在句子的起始位置
  315. @return:公司实体所属的包
  316. @summary: 优化多标段,确定标段作用域之后,寻找作用域包含该实体的所有包,从前往后找到一个还没有该roleid的包返回,若找到的包都有roleid,则返回第一个,若没有找到包,返回None
  317. '''
  318. '''
  319. if len(packageList)==0:
  320. return None
  321. before_index = None
  322. after_index = None
  323. equal_index = None
  324. equal_count = 0
  325. for pack_index in range(len(packageList)):
  326. if packageList[pack_index][1]>sentence_index and after_index is None:
  327. after_index = pack_index
  328. if packageList[pack_index][1]<sentence_index:
  329. before_index = pack_index
  330. if packageList[pack_index][1]==sentence_index and equal_index is None:
  331. equal_index = pack_index
  332. #当前句子和之前句子未找到包
  333. if before_index is None and equal_index is None:
  334. return None
  335. else:
  336. if after_index is None:
  337. end_index = len(packageList)
  338. else:
  339. end_index = after_index
  340. #只在当前句子找到一个包号
  341. if end_index-max((before_index if before_index is not None else -1,equal_index if equal_index is not None else -1))==1:
  342. return packageList[end_index-1][0]
  343. else:
  344. for i in range(max((before_index if before_index is not None else -1,equal_index if equal_index is not None else -1)),end_index):
  345. if packageList[i][2]>int(begin_index):
  346. if packageList[i-1][4]:
  347. return packageList[i-1][0]
  348. else:
  349. if packageList[i][4]:
  350. return packageList[i-1][0]
  351. else:
  352. return packageList[i][0]
  353. return packageList[end_index-1][0]
  354. '''
  355. if len(packageList)==0:
  356. return None,False
  357. list_legalPack = []
  358. for pack_index in range(len(packageList)):
  359. if DIRECT=="L" and (packageList[pack_index]["sentence_index"]>sentence_index or (packageList[pack_index]["sentence_index"]==sentence_index and packageList[pack_index]["offsetWords_begin"]>begin_index)):
  360. continue
  361. if DIRECT=="R" and (packageList[pack_index]["sentence_index"]<sentence_index or (packageList[pack_index]["sentence_index"]==sentence_index and packageList[pack_index]["offsetwords_begin"]<begin_index)):
  362. continue
  363. if (packageList[pack_index]["scope"][0][0]<sentence_index or (packageList[pack_index]["scope"][0][0]==sentence_index and packageList[pack_index]["scope"][0][1]<=begin_index)) and (packageList[pack_index]["scope"][1][0]>sentence_index or (packageList[pack_index]["scope"][1][0]==sentence_index and packageList[pack_index]["scope"][1][1]>=begin_index)):
  364. if MAX_DIS is not None:
  365. if abs(sentence_index-packageList[pack_index]["sentence_index"])<=MAX_DIS:
  366. list_legalPack.append(pack_index)
  367. else:
  368. list_legalPack.append(pack_index)
  369. # if (packageList[pack_index]["scope"][0][0] < sentence_index
  370. # or (packageList[pack_index]["scope"][0][0] == sentence_index
  371. # and packageList[pack_index]["scope"][0][1] <= begin_index))
  372. # and (packageList[pack_index]["scope"][1][0] > sentence_index
  373. # or (packageList[pack_index]["scope"][1][0] == sentence_index
  374. # and packageList[pack_index]["scope"][1][1] >= begin_index)):
  375. # pass
  376. _flag = True
  377. for _index in list_legalPack:
  378. if roleid in packageList[_index]["hit"]:
  379. continue
  380. else:
  381. _flag = False
  382. packageList[_index]["hit"].add(roleid)
  383. return packageList[_index]["pointer"],_flag
  384. if len(list_legalPack)>0:
  385. return packageList[0]["pointer"],_flag
  386. return None,False
  387. __all__ = ["getPackage", "getPackageScopePattern", "getPackagesFromArticle", "pattern_packageScope", "dict_role_id", "role2id_dict"]