我需要某种 Java 解决方案来满足以下要求:
- 在文本中搜索某些术语(每个术语可以是 1-3 个单词)。例如:{“你好世界”,“你好”}。匹配需要准确。
- 大约有 500 种术语组,每个组包含大约 30 个术语。
- 每个文本最多可包含 4000 个单词。
性能是一个重要问题。
谢谢, 罗德
我需要某种 Java 解决方案来满足以下要求:
性能是一个重要问题。
谢谢, 罗德
我为定制的垃圾邮件过滤器做了类似的事情。
我发现一种既简单又快速的技术是:
intern()
每个单词,以简化步骤 3 中的比较。Term
类,封装一个最多包含三个字符串的数组。它的equals()
方法可以对字符串进行指针比较,而不是调用String.equals()
. Term
为输入中的每组 2 或 3 个连续单词创建一个实例。Multimap
(来自 Google Collections)将每个术语映射到它出现的文件集。使用正则表达式。请参阅:http: //java.sun.com/docs/books/tutorial/essential/regex/
这似乎有两个部分。想出一个像样的算法,并用Java实现它。(暂时让我们抛开肯定“外面”有人已经实现了这个想法,你可能会找到一些想法。)
似乎我们想避免重复昂贵的工作。但目前尚不清楚成本将在哪里。所以我想你需要准备好对一些候选方法进行基准测试。还要记住什么是“足够好”。
从你能想到的最简单的事情开始。测量它。你可能会得到令人惊讶的结果,那就是它已经足够好了。停在那儿!例如,这真的很愚蠢:
read text into String (4k, that's not too big)
for each term
use regexp to find matches in text
但它可能会给出亚秒级的响应时间。如果您将 200 毫秒的响应缩短到 100 毫秒,您的用户真的会关心吗?他们会为此付出多少?
另一种方法。我想知道这个更快吗?
prepare a collection of terms keyed by first word
tokenize the text
for each token
find terms that match
check for match (using look ahead for multi-word terms)
至于用Java实现。如果需要,单独的问题会询问具体问题。