Java 基于字典的零编辑距离命名实体识别:LingPipe、Lucene还是什么?

Java 基于字典的零编辑距离命名实体识别:LingPipe、Lucene还是什么?,java,nlp,Java,Nlp,我正在尝试根据一些文档执行字典。无论数据类型如何,我的字典都由字符串的键值对组成。我想搜索文档中的所有键,并在匹配发生时返回该键的对应值 问题是,我的字典相当大:~700万个键值-平均键长:8个,平均值长:20个字符 我尝试了使用MapDictionary的LingPipe,但在我想要的环境设置中,插入200000行后,它的内存不足。我不清楚为什么LingPipe在算法中使用map而不是hashmap 所以问题是,我以前没有任何关于Lucene的经验,我想知道这样的数字是否能让这样的事情变得更容

我正在尝试根据一些文档执行字典。无论数据类型如何,我的字典都由字符串的键值对组成。我想搜索文档中的所有键,并在匹配发生时返回该键的对应值

问题是,我的字典相当大:~700万个键值-平均键长:8个,平均值长:20个字符

我尝试了使用MapDictionary的LingPipe,但在我想要的环境设置中,插入200000行后,它的内存不足。我不清楚为什么LingPipe在算法中使用map而不是hashmap

所以问题是,我以前没有任何关于Lucene的经验,我想知道这样的数字是否能让这样的事情变得更容易

另外,我已经尝试过将数据分块到几个字典中,并将它们写到磁盘上,但速度相对较慢

谢谢你的帮助

干杯
Parsa

我想,如果您想重用LingPipe来执行NER,您可以覆盖它们的MapDictionary来存储和检索您选择的,而不是它们的(顺便说一句,它扩展了HashMap)


Lucene/solr可以用作键/值存储,但是如果您不需要额外的搜索功能,只需要一个纯粹的查找,其他选项可能更适合您的操作。

您能给我一些关于覆盖MapDictionary的建议吗?我不熟悉它们的代码结构,对此我感到困惑。扩展MapDictionary类并重写addEntry、iterator和phraseEntryIt函数,以便从外部数据存储中持久化和检索。目前,MapDictionary使用ObjectToSet类(HashMap的一种类型)将条目存储在内存中。听起来您可能想将这些存储到某种键/值存储中。因此,新类和重写函数将与外部db而不是ObjectToSet类进行接口。我按照您所说的做了,但唯一的问题是我显然是从键值db中获取迭代器,而键值db不能强制转换为迭代器,所以我应该如何重写db的迭代器以获取迭代器?很抱歉我的Java noobness。我现在覆盖迭代器的下一个方法,并从数据库中的每个键值对生成DictionaryEntry的新实例。但是这些实例并没有被释放,过了一段时间我的堆空间就用完了。我在这里做什么疯狂的事吗?谢谢