0

我需要某种 Java 解决方案来满足以下要求:

  1. 在文本中搜索某些术语(每个术语可以是 1-3 个单词)。例如:{“你好世界”,“你好”}。匹配需要准确。
  2. 大约有 500 种术语组,每个组包含大约 30 个术语。
  3. 每个文本最多可包含 4000 个单词。

性能是一个重要问题。

谢谢, 罗德

4

3 回答 3

3

我为定制的垃圾邮件过滤器做了类似的事情。

我发现一种既简单又快速的技术是:

  1. 首先将输入文件拆分为单词。
  2. 调用intern()每个单词,以简化步骤 3 中的比较。
  3. 创建一个Term类,封装一个最多包含三个字符串的数组。它的equals()方法可以对字符串进行指针比较,而不是调用String.equals(). Term为输入中的每组 2 或 3 个连续单词创建一个实例。
  4. 使用 a Multimap(来自 Google Collections)将每个术语映射到它出现的文件集。
于 2009-10-14T17:10:22.583 回答
0

使用正则表达式。请参阅:http: //java.sun.com/docs/books/tutorial/essential/regex/

于 2009-10-14T16:56:17.370 回答
0

这似乎有两个部分。想出一个像样的算法,并用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实现。如果需要,单独的问题会询问具体问题。

于 2009-10-14T17:10:59.133 回答