【问题标题】:Tagging of names using lucene/java使用 lucene/java 标记名称
【发布时间】:2011-08-31 14:05:12
【问题描述】:

我有我公司所有员工(5000 多名)的姓名。我想编写一个引擎,它可以在在线文章(博客/维基/帮助文档)中动态查找名称,并在用户电子邮件中使用“mailto”标签对其进行标记。

到目前为止,我计划从文章中删除所有停用词,然后在 lucene 索引中搜索每个词。但即使在这种情况下,我也看到很多查询命中索引,例如,如果有一篇文章有​​ 2000 个单词,并且只有两个人名引用,那么很可能会有 1000 个 lucene 查询。

有没有办法减少这些查询?或者完全以其他方式实现相同目标? 在此先感谢

【问题讨论】:

  • 我不确定我是否在关注,员工列表不是预先定义的吗?这些名字不是您的疑问吗?
  • @amit 员工名单是 5000,你问我是否应该搜索文章中的每个名字? 2000个word文档中有5000个查询?我想知道其他方式。
  • 您只有一份文件?如果你这样做了,lucene 不会帮助你太多..
  • @amit nope 我有很多文档,我以一个文档为例。但我想即时执行此操作。这意味着当用户在预览区域中键入他的 wiki 时,它应该在运行中用电子邮件地址标记名称
  • 如果我理解正确,您想做的是在您的姓名列表中搜索人们输入的字词,这样您就可以在他们输入的文本时向他们提供电子邮件地址等建议是您收藏中某个人的姓名。对吗?

标签: java lucene tagging


【解决方案1】:

如果您只有 5000 个名称,我会将它们放入内存中的哈希表中,而不是使用 Lucene。您可以通过多种方式对它们进行哈希处理(例如,昵称、first-last 或 last-first 等),并且仍然具有相对较小的内存占用和非常高效的性能。

【讨论】:

  • 不,为了简单起见,我还有很多名字,我使用了数字“5000”,它们实际上更多。
  • 好的,但是当您提出问题时,请提供足够的信息以获得适当的答案。退缩是在浪费每个人的时间。您能描述一下您要解决的实际问题吗?
  • 我不得不隐瞒一些信息的原因是因为我在一家公司工作,我不能提供很多关于我正在做什么的细节。就问题而言,确切的数字是 99655,它会随着时间的推移而增加。假设我将它们中的每一个都存储在 HashMap 中,您是否建议在 hashMap 中查找文章的每个单词?
  • 好吧,假设您的公司做得非常好,并且在未来三年内规模翻了一番(找到工作了吗?)所以现在您有 200,000 名员工。您的大多数人来自泰国,并且有 100 个字母的姓氏和名字(组合)。忽略键的大小,这意味着你的哈希表是 200K*0.1K = 20M。这很容易适合任何合理的机器。然后,您可以在恒定时间内查找您想要的任何内容:没有比这更有效的了。
  • (cont'd) 如果你关心加载数据,如果你需要多台机器上的数据等等,我建议你看一下Redis之类的键值存储。但我认为你没有那么多数据,它不适合现代机器的主存储器。
【解决方案2】:

http://en.wikipedia.org/wiki/Aho%E2%80%93Corasick_string_matching_algorithm
这个算法可能对你有用。这样做的方式是,您首先将整个名称列表编译成一个巨大的有限状态机(这可能需要一段时间),但是一旦构建了这个状态机,您就可以在任意数量的文档中运行它,并且非常有效地检测名称。
我认为它只会查看每个文档中的每个字符一次,因此它应该比标记文档并将每个单词与已知名称列表进行比较更有效。
网络上有许多可用于不同语言的实现。看看吧。

【讨论】:

  • 我认为他正在尝试即时处理用户的输入以查找标签。看起来他并没有尝试做批量标记。
  • 这是有道理的。我每五秒钟运行一次异步任务来进行标记。你的回答很有帮助。非常感谢
猜你喜欢
  • 2013-07-11
  • 1970-01-01
  • 1970-01-01
  • 2014-05-21
  • 2018-03-25
  • 1970-01-01
  • 2019-02-15
  • 1970-01-01
  • 2019-07-14
相关资源
最近更新 更多