分类档案: 字符串匹配

使用ACORA一次处理数百个停用词

“80%的曾夫人论坛分析是花费在清洁曾夫人论坛上,其中20%的花费是在抱怨清洁曾夫人论坛” – 长社 and 大曾夫人论坛宝

这是我听到的最好的报价之一 PyData 2013。当处理大量曾夫人论坛时,通常只有一小部分与一个曾夫人论坛相关’的分析,尝试清洁它可能会很痛苦。但这也是 基本阶段, 所以让’使它尽可能的无痛。

一个示例是巨大的日志文件。说我们’重新处理多TB的Apache日志文件,如下所示:

1
2
3
4
5
6
7
8
9
10
127.0.0.1 - - [17/七月/2013:07:22:38 -0500] “获取/static/js/bootstrap-dropdown.js HTTP / 1.1” 304 - "http://127.0.0.1/" “ Mozilla / 5.0(Macintosh;英特尔Mac OS X 10_7_4)AppleWebKit / 537.36(KHTML,例如Gecko)Chrome / 28.0.1500.71 Safari / 537.36”
127.0.0.1 - - [17/七月/2013:07:22:38 -0500] “获取/static/js/bootstrap-scrollspy.js HTTP / 1.1” 304 - "http://127.0.0.1/" “ Mozilla / 5.0(Macintosh;英特尔Mac OS X 10_7_4)AppleWebKit / 537.36(KHTML,例如Gecko)Chrome / 28.0.1500.71 Safari / 537.36”
127.0.0.1 - - [17/七月/2013:07:22:38 -0500] “获取/static/js/bootstrap-tab.js HTTP / 1.1” 304 - "http://127.0.0.1/" “ Mozilla / 5.0(Macintosh;英特尔Mac OS X 10_7_4)AppleWebKit / 537.36(KHTML,例如Gecko)Chrome / 28.0.1500.71 Safari / 537.36”
127.0.0.1 - - [17/七月/2013:07:22:38 -0500] “获取/static/js/bootstrap-tooltip.js HTTP / 1.1” 304 - "http://127.0.0.1/" “ Mozilla / 5.0(Macintosh;英特尔Mac OS X 10_7_4)AppleWebKit / 537.36(KHTML,例如Gecko)Chrome / 28.0.1500.71 Safari / 537.36”
127.0.0.1 - - [17/七月/2013:07:22:38 -0500] “获取/static/js/bootstrap-popover.js HTTP / 1.1” 304 - "http://127.0.0.1/" “ Mozilla / 5.0(Macintosh;英特尔Mac OS X 10_7_4)AppleWebKit / 537.36(KHTML,例如Gecko)Chrome / 28.0.1500.71 Safari / 537.36”
127.0.0.1 - - [17/七月/2013:07:22:38 -0500] “获取/static/js/bootstrap-button.js HTTP / 1.1” 304 - "http://127.0.0.1/" “ Mozilla / 5.0(Macintosh;英特尔Mac OS X 10_7_4)AppleWebKit / 537.36(KHTML,例如Gecko)Chrome / 28.0.1500.71 Safari / 537.36”
127.0.0.1 - - [17/七月/2013:07:22:38 -0500] “获取/static/js/bootstrap-collapse.js HTTP / 1.1” 304 - "http://127.0.0.1/" “ Mozilla / 5.0(Macintosh;英特尔Mac OS X 10_7_4)AppleWebKit / 537.36(KHTML,例如Gecko)Chrome / 28.0.1500.71 Safari / 537.36”
127.0.0.1 - - [17/七月/2013:07:22:38 -0500] “获取/static/js/bootstrap-carousel.js HTTP / 1.1” 304 - "http://127.0.0.1/" “ Mozilla / 5.0(Macintosh;英特尔Mac OS X 10_7_4)AppleWebKit / 537.36(KHTML,例如Gecko)Chrome / 28.0.1500.71 Safari / 537.36”
127.0.0.1 - - [17/七月/2013:07:22:38 -0500] “获取/static/js/bootstrap-typeahead.js HTTP / 1.1” 304 - "http://127.0.0.1/" “ Mozilla / 5.0(Macintosh;英特尔Mac OS X 10_7_4)AppleWebKit / 537.36(KHTML,例如Gecko)Chrome / 28.0.1500.71 Safari / 537.36”
127.0.0.1 - - [17/七月/2013:07:22:39 -0500] “ GET /favicon.ico HTTP / 1.1” 404 4025 “-” “ Mozilla / 5.0(Macintosh;英特尔Mac OS X 10_7_4)AppleWebKit / 537.36(KHTML,例如Gecko)Chrome / 28.0.1500.71 Safari / 537.36”

这是包含数千行的有用曾夫人论坛,我们’d想使用 我之前提到的大文件处理脚本。但是,有些行’不关心–所以你可以写一个简单的条件:

1
2
3
4
打开('mylogfile.txt', 'r') f:
    对于 线 f:
        如果 “ some_keyword” 线:
            做点什么()

如果您有2件事情该怎么办’t want 在 each 线?

1
2
3
4
打开('mylogfile.txt', 'r') f:
    对于 线 f:
        如果 (“ some_keyword” 线) (“ other_keyword” 线):
            做点什么()

如果您有3件事情该怎么办’t want 在 each 线?

1
2
3
4
5
6
7
8
9
打开('mylogfile.txt', 'r') f:
    对于 线 f:
        线_is_ok = 真正
        对于 停用词 [“ some_keyword”, “ other_keyword”, “不”]:
            如果 停用词 线:
                线_is_ok =
                打破 #退出循环
        如果 线_is_ok: #仅在line_is_ok未被篡改的情况下处理行
            做点什么()

但这变得超级低效,有点愚蠢。每个额外的关键字都需要通过该行。使用此代码,基本上所有情况都是最坏的情况。

带上ACORA!

阿科拉 是Stefan Behnel’的库基于 Aho-Corasick字符串匹配算法。无需深入了解其背后的数学原理,它基本上会将您拥有的所有停用词编译为一个über-停用词,这意味着在您的日志文件行中对该停用词进行一次扫描将检查所有停用词。例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
阿科拉 进口 AcoraBuilder
 
#创建停用词列表-这些是条目
#我们想忽略的
停用词 = ['.js', '.ico', '.css', '.jpg', ...]
 
#将它们输入新的Acora Builder中
停用词_matcher = AcoraBuilder()
对于 停用词 停用词:
    停用词_matcher.(停用词)
 
#now让它构造超级停用词
停用词_matcher = 停用词_matcher.建立()
 
#this使用生成器迭代匹配项
#发现任何东西都会停止
对于 比赛 停用词_matcher.寻找者(线_from_log_file):
    打印 “找到匹配:{0}”.格式(比赛)

但是我们如何将其从以前集成到行扫描器中呢?像这样!

1
2
3
4
5
6
7
8
打开('mylogfile.txt', 'r') f:
    对于 线 f:
        线_is_ok = 真正
        对于 比赛 停用词_matcher.寻找者(线):
            线_is_ok =
            打破 #退出循环
        如果 线_is_ok:
            做点什么()

We’ve用单个ACORA匹配器替换了整个多个停用词匹配的for循环。

性能说明

阿科拉很棒,但是如果只有几个停用词或只有几行,性能可能会下降。当您有大约20个以上的停用词并且至少有1000个左右的日志文件行要扫描时,它的性能最佳。