Mensa是Java的模式匹配开源库

15-02-10 banq
    

Mensa提供了一个强大且高效的模式匹配问题的解决方案,具体地说:Mensa可以很容易在源文本中发现出现的任何关键词,举例,你可以在一本小说(源文本)中发现所有的某个人物名称(关键词)。

dell-oss/Mensa · GitHub

Mensa能一次性快速有效处理源文本,无论你想在其中搜寻一个关键词或一百万个关键词。

Mensa不局限于匹配文本数据,只要是任意长符号序列,这些符号的数据类型可以是任意的,字符 byte number 音符等等。

标准的Java JDK内置了字符匹配搜索功能,包括字符串搜索和正则表达式。大部分情况确实很好,但是在下面问题场景就需要重新考虑:

1.标准库只适合操作内存中字符,它们不适合搜寻非常大的文本,这些文本无法放入整个内存中。

2.内置的正则表达式可以识别词边界,但是比简单字符串匹配需要更多时间,而不考虑词边界,"boy"将会匹配"30-day boycott,"显然这不是你想要的。(banq注:其实正则表达式很慢)

3.标准库不能很好地发现大量的关键词,你只能选择:要么为每个关键词执行一个单独文字或正则表达式搜索操作;要么创建一个正则表达式包含了每个关键词。

标准库随着搜寻关键词增加性能会损耗。

而Mensa可以很方便地实现这些:

1. Mensa是对抽象源文本操作,实现有两种基于内存in-memory和Streaming文本源,你可以定制一个文本源,比如,你能创建一个文本源从数据库 或从版本控制或从REST API 读取数据。

2.Mensa有一个选项来启用或禁用词边界word-boundary检测,当激活时,关键词将只有在被词边界分割时才会识别,构成词边界符号是由一个抽象符号分类器决定的,其实现之一是提供给字符符号,但是你也能促进一个定制符号分类器。比如一个基因搜索应用程序可以定义特定的核苷酸作为基因的界限。

3.一旦Mensa机器构建好,其性能依赖于被搜寻的文本,不是关键词的数量,一个给定的机器实例可以多次重用,甚至可以被并发线程来搜索多个源文本。

4.Mensa是使用Java泛型实现,它可以用来匹配任何类型的符号,这些符号也就是可由Java模板类型S定义的。

假设你的公司有一个门户网站,包含成千上万个网页,你要求编写一个程序,查询每个员工在这个门户中被提及了多少次,你能访问HR数据库,查询完整名称,包括员工的绰号,大概有25000个。使用Mensa步骤如下:

1.创建一个Mensa关键词集合

2.从HR数据库中读取员工完整名称和昵称,将每个名称加入到关键词集合

3.创建一个Mensa匹配机器

4.用关键词集合初始化它

5.对于门户中每个页面,创建一个Mensa源文本,然后基于这些源文本运行匹配机器,结果将会得到。

具体案例代码可见:examples

    

2