Summary

正则执行5天的任务,靠自造的轮子15分钟搞定

文章译自:Vikash Singh的https://dev.to/vi3k6i5/regex-was-taking-5-days-to-run-so-i-built-a-tool-that-did-it-in-15-minutes-c98 我之前的工作多是文本数据相关的,处理工具使用Python和正则,故拜读并翻译,分享。 正文 程序员处理文本时,通常需要先对数据进行清洗。有时是替换关键字,如以’JavaScript’替换’Javascript’。其它的时候,只是想找出文档中是否有提到过‘JavaScript’。 这样的数据清理工作是大部分数据科学项目处理文本的的标准。 数据科学从数据清洗开始 我最近有一项很相似任务要处理。我在Belong.co任职数据科学家,我有一半的时间在处理自然语言。 当我用我们的文档合集训练一个Word2Vec模型时,这个模型提供同义词作为相似条目,”Javascripting”会作为”JavaScript”的相似条目。 为解决这个问题,我写了正则表达式(Regex)用标准名称替换所有已知同义词。这个正则用’JavaScript’替换’Javascripting’,解决了一个问题,却引入了另一个。 有些人,遇到问题时,想“我知道,我会使用正则表达式。”现在,他们有两个问题了。 以上引用来自于stack-exchange问题,我也遇到了这种情况。 事实证明,搜索和替换关键字的数量在100以内,正则的处理速度快。但我的合集有数以千计的关键词和数百万文档。 我对我的正则代码执行基准测试,发现完成一次任务需要5天。我的反应是: 很明显,有些事情需要搞定。 [更新] 我从尝试优化在使用的正则表达式着手,我了解到编译的表达式更快,所以转而使用它。为了一次替换多个条目,有一个group选项,我也使用了它。但那些包含特殊字符的关键字还是有问题,如’C++’,‘.Net’。链接 在表达式加载时对关键字进行排序也能优化性能。 我从这个Link受益匪浅,基于字典树(Trie)的正则更快Link。在项目开始时,我不知道这个库,但我深入的方向和使用字典树(Tire)是相同的。 我不是说正则都不好,只是真的很难理解那么多不同的实现形式。我使用的是Python版本,RUST有一个编译版本运行起来会更快,另外,C++的版本会更快一些。 如果只是是关心速度,你可以试其中一个。我需要的是更容易控制和更易理解,所以我打造了一个工具。这帮我将细节简化以确保任何了解一点正则的人就能使用。 [更新结束] 我在办公室和Stack-overflow到处询问,得到了一些建议。Vinay,Suresh和Stack Overflow都指出这个优雅的算法叫Aho-Corasick算法和Trie字典方法。我查找了下现有方案,但没什么收获 。 所以我编写了自己的实现方法,FlashText腾空出世。 在探究FlashText之前,让我们先看一下它运行得效果如何。 FlashText查找条目与正则的时间开销的比较 上图是编译后的正则与FlashText处理同一文档的对比。当关键字增加时,正则的处理时间几乎是线性增加的,而FlashText却不受影响。 FlashText将我之前的工作由5天缩减到15分钟!! FlashText和正则替换条目时间开销的比较 以上基准测试用到的代码的链接A和链接B。 那么,FlashText是啥? FlashText是我在GitHub开源的Python库,它能高效的查找和替换关键字。 使用FlashText需要先将关键字的列表传给它。这个列表将会在内部使用用以构建Trie字典。然后你将一个字符串传给FlashText以声明你想执行替换还是查找。 替换模式,会将替换关键字保新的字段串中。查找模式则是返回在字符找到的关键字的列表. This will all happen in one pass over the input string. 这是一个兴奋的用户: 28x faster than a compiled regexp for… Continue reading 正则执行5天的任务,靠自造的轮子15分钟搞定

Linux · Summary

Linux tc-how to work on different IPs

#!/bin/bash interface=eth0 ip1=192.168.1.1 ip2=172.16.1.1 delay1=100ms delay2=200ms tc qdisc add dev $interface root handle 1: prio tc qdisc add dev $interface parent 1:1 netem delay $delay1 10ms 25% tc filter add dev $interface parent 1: protocol ip prio 1 u32 match ip dst $ip1 flowid 1:1 tc qdisc add dev $interface parent 1:2 netem delay $delay2… Continue reading Linux tc-how to work on different IPs

python · Summary

Python: OverflowError: signed char is greater than maximum

Here the pseudo code about the flow: It runs into the error: with a special character ‘À’  which its binary value is 192 My way to resolve this error is to update typecode of the array from ‘b’ (signed char) to ‘B’ (unsigned char). Reason: Data from the file should not in a range which from… Continue reading Python: OverflowError: signed char is greater than maximum

Cisco

Cisco IPS – Inline VLAN Pair mode

Setup Cisco IPS on EVE I failed to setup Cisco IPS on EVE(ver 2.0.3-53). What I did: Download Cisco IPS ova file via: http://certcollection.org/forum/topic/270568-ips-4240-ver-7-unholy-darkness/page__hl__%20cisco%20%20ips (https://mega.nz/#!W99UnTIa!-3k6bQwiD_DhNCDFfL6TWlU69KoRwIYeaJE9JlDOASY) Did everything been listed in following instructions for IPS Interfaces http://certcollection.org/forum/topic/266792-emulating-ips-on-unl/ http://www.cznetlab.cz/index.php?cat=cciesec&subcat=unlips My problem is: Cisco IPS failed to ping anything out of it, I run traffic capture on IPS’s interface,… Continue reading Cisco IPS – Inline VLAN Pair mode

python · windows

Try ansible on Windows

Background: Here is the environment about NetBrain performance testing: 1 windows server for License/Workspace server 5 windows servers for Network Server 5 windows servers for Automation server It really took us a lot of time to deploy our product/collect logs on theses servers. My colleague wrote a client-server application and try to do the things by… Continue reading Try ansible on Windows