dongrixinyu / JioNLP

中文 NLP 预处理、解析工具包,准确、高效、易用 A Chinese NLP Preprocessing & Parsing Package www.jionlp.com

Home Page:http://www.jionlp.com/

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

[BUG]

xue-max opened this issue · comments

描述(Description)

问题:时间抽取的 TIME_CHAR_STRING 这个正则 有时候会抽取出一大串东西,然后导致 TimeExtractor类中的grid_search方法的双层for循环执行很久,大概抽取出400多长字符长度就需要执行4个多小时,更多字符的时候甚至会导致整个程序长时间在那运行,导致误以为程序卡死的假象
样例数据1:
【圆梦首都5日】活动团期2-6人私家团(天天发团)1-28人精品团·2024年全年团期第01期:2023.11.25-2023.11.29第02期:2023.12.02-2023.12.06第03期:2023.12.09-2023.12.13第04期:2023.12.16-2023.12.20第05期:2023.12.23-2023.12.27第06期:2023.12.30-2024.1.03(元旦)第07期:2024.1.06-2024.1.10第08期:2024.1.13-2024.1.17第09期:2024.1.20-2024.1.24第10期:2024.1.27-2024.1.31第11期:2024.2.03-2024.2.07第12期:2024.2.10-2024.2.14(春节)第13期:2024.2.17-2024.2.21第14期:2024.2.24-2024.2.28第15期:2024.3.02-2024.3.06第16期:2024.3.09-2024.3.13第17期:2024.3.16-2024.3.20第18期:2024.3.23-2024.3.27第19期:2024.3.30-2024.4.03第20期:2024.4.04-2024.4.08(清明节)第21期:2024.4.13-2024.4.17第22期:2024.4.20-2024.4.24第23期:2024.4.27-2024.5.01第24期:2024.5.01-2024.5.05(五一)第25期:2024.5.11-2024.5.15第26期:2024.5.18-2024.5.22第27期:2024.5.25-2024.5.29第28期:2024.6.01-2024.6.05第29期:2024.6.08-2024.6.12(端午节)第30期:2024.6.15-2024.6.19第31期:2024.6.22-2024.6.26第32期:2024.6.29-2024.7.03第33期:2024.7.06-2024.7.10第34期:2024.7.13-2024.7.17第35期:2024.7.20-2024.7.24第36期:2024.7.27-2024.7.31第37期:2024.8.03-2024.8.07第38期:2024.8.10-2024.8.14第39期:2024.8.17-2024.8.21第40期:2024.8.24-2024.8.28第41期:2024.8.31-2024.9.04第42期:2024.9.07-2024.9.11第43期:2024.9.14-2024.9.18(中秋节)第44期:2024.9.21-2024.9.25第45期:2024.10.01-2024.10.05(国庆)第46期:2024.10.02-2024.10.06(国庆)第47期:2024.10.12-2024.10.16第48期:2024.10.19-2024.10.23第49期:2024.10.26-2024.10.30第50期:2024.11.02-2024.11.06第51期:2024.11.09-2024.11.13第52期:2024.11.16-2024.11.20第53期:2024.11.23-2024.11.27第54期:2024.11.30-2024.12.04第55期:2024.12.07-2024.12.11第56期:2024.12.14-2024.12.18第57期:2024.12.21-2024.12.25淡季(11-2月):3480元/成人、2080元/儿童旺季(3-10月以及节假日):3680元/成人、2180元/儿童1.2米以下儿童:不占床、不含门票、早鸟价:出发前一周以上报名,可优惠100元每位!!
样例数据2:
昨日头条回顾: 突发!事发白云,56岁男子当场死亡...据媒体报道,1990年代“玉女歌手”黎明诗在积极抗癌大半年后,3月28日早晨在睡梦中离开人世,终年58岁。黎明诗唱片专辑封面当年,黎明诗凭借甜美的外表、美好的身材,成为很多少男心目中的“女神”,而她也曾有过一段选美经历。据了解,她在英国读书时,曾同妹妹一起参选当地的华裔小姐选美,分别获得亚军和季军。后来黎明诗随家人回到香港,参演了《霸王花》等作品。1990年,黎明诗被唱片公司看中,推出了多个专辑。因为她长得甜美、清纯,而被称为“玉女歌手”,代表作有《Goodbye My Love》《流离的爱》《停不了的爱》《爱上不爱我的人》等。在生活中,热爱交朋友的她,当时与梅艳芳是好闺蜜。网友:不敢相信....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... 白云区街坊群 欢迎加入“白云区街坊群”!群里有来自白云区24个镇街、各行业的街坊,在群里你能知道白云区的最新资讯,奇闻趣事,吃喝玩乐、生活交友、全职兼职、二手买卖等信息。识别添加下方小编微信邀请入群。 【温馨提醒】 想知道更多关于白云区本地的资讯请关注下方'白云视野'微信公众号公众号又改版了

  1. 版本(Version):
  • python 版本: (通过 python 可查) Python 3.8.16
  • jionlp 版本: (通过 jionlp.__version__ 可查) Version: 1.5.9
  1. jionlp的调用代码与输入文本(Code & Text):
xxxxxxxxxxxx
e.g.
import jionlp as jio
res = jio.ner.extract_time(context, time_base=time.time())  # context是上面的样例数据
print(res)
  1. 调用报错日志如下(Log):
xxxxxxxxxxxx
e.g.
trackback: XXXXXX

没有报错,但就是正则抽取到待处理的文本过长时,导致在time_extractor.py文件中的177行的grid_search( )方法执行时间过长(有时候会出现一两个月都没跑出来)【该方法的时间复杂度如果没看错就是O(n的平方),当n大了则需要运行很久】

期望行为(Expectation)

若返回结果不理想,描述你期望发生的事情(Please describe your expectation)
希望看看 TIME_CHAR_STRING 这个正则的写法看看能优化一下不,或是对于过长的文本是否需要考虑怎么个处理会好一点。
看看大神能否提供一些处理的方法给我参考一下,谢谢。

请顺手 star 一下右上角的⭐小星星

是死循环吗?卡死在正则上了是不是?

是死循环吗?卡死在正则上了是不是?

我提供的这两条案例数据不是卡死在正则里(但我不确定是否存在这现象,因为我目前的日志还没跟踪到有正则卡死现象),是在TimeExtractor类中的grid_search方法,这个方法是for循环里嵌套for循环,循环遍历的对象是那个正则所提取出来的字符串长度,从0到len(字符串),这双层for循环我自己测试的时候,460多字符的长度需要执行4个多小时,过于耗时

导致这么长的字符串出现是TIME_CHAR_STRING 这个正则表达式匹配出来的。就像我上面的程序截图的运行结果那样,正常那部分匹配的应该不同时间之间拆分开在不同结果,这样就能避免grid_search方法执行耗时过长。

我懂了,没有特别合适的办法解决这个问题。只能先限制时间字符串最长不超过 XX 个字符

你能改一下提个 pr 不