我正在用Java开发一个应用程序,它将解析XML文件并从中检索关键字并将其存储在我的数据库中。然后,用户可以搜索这些关键字,他们可以检索相关数据。
现在问题是XML文件有像“literacy_male”,“infantmortalityrate_female”等字样。对于第一个我可以在存储之前将单词拆分为“_”,但对于第二个我不知道我是怎么回事可以把这个词分成有意义的词。
我正在使用Apache Lucene进行全文搜索。
答案 0 :(得分:1)
没有纯粹的算法方法来实现您的目标,也没有办法以高可靠性来实现。你基本上需要有一个“有意义”单词的词典来搜索,并在搜索字典中找到作为你的组合前缀的最长单词后,在长组合中“剥离”每个单词。但是,如果你有“workmanhours”并将其解析为“workman”“小时”,那么你可能会感到厌烦,因为它可能应该是“工作”“男人”“小时”。
您可以通过索引选定的字符序列而不是单词来精确搜索方案。例如,构建一个以前导元音开头的所有序列的索引,然后类似地将搜索项删除到前导元音。
答案 1 :(得分:1)
一种可能性是通过添加完全相同字符串的所有子字符串来增加索引大小。所以对于“abc”,你将存储:“a”,“b”,“c”,“ab”,“bc”,“abc”(它是O(n ^ 2)个字符串)。
另一种可能性是使用通配符。索引你拥有的任何东西,并搜索:
<term>*
,a*<term>*
,...,z*<term>*
而不是<term>
。它将花费更多的时间,但它不会增加索引大小。
注意:有必要搜索这么多术语,因为你不能使用通配符作为术语的第一个字母。
a*<term>*
表示搜索所有字词以a开头,然后没有字符或任何字符,然后<term>
,然后再搜索没有字符或任何字符。
有关lucene中术语和外卡的更多信息:http://lucene.apache.org/java/2_0_0/queryparsersyntax.html
编辑:
这些组合将提供(在我看来)最佳解决方案:
索引字符串的所有后缀,然后为每个术语(而不是查询!) - 而不是搜索<term>
搜索<term>*
。如果该术语作为子字符串存在,它也至少启动一个前缀,它会找到它。
例如:如果您有"lifeexpectancy"
,则会编入索引:
"lifeexpectancy","ifeexpectancy","feexpectancy","eexpectancy",....,"y"
对于同一示例,当您要搜索life expectancy
时,您将搜索life* expectancy*
答案 2 :(得分:0)
您需要设置一些有关如何格式化XML文件的规则,以使其正常工作。
我猜你不能操纵XML文件(或者它已经被创建和填充了)?
如果可以(或者由代码生成),您需要设置一些规则,例如
,
_
代替使用此规则,您将能够编写一个可以理解关键字字符串的解析器。
如果你不能这样做,你需要解析一个关键字并尝试不同的解析(比如“{by _
”)并查看哪一个产生最佳输出。但这将具有挑战性并导致时间。
还请将XML文件的示例添加到原始问题中。
答案 3 :(得分:0)
计算机不聪明,他们理解你告诉他们的东西。所以,如果你在生成你的XML文件时保持一些标准会更容易。否则我认为没有办法将“infantmortalityrat”转换为“婴儿+死亡率+率“
答案 4 :(得分:0)
如果你有可以包含在该字符串中的字符串数据库,你可以这样做:
按照您可以识别的分隔符(例如_
,,
,-
,...)拆分字符串,之后,每个部分都可以分解为尽可能多的部分通过DB中最短字符串的总和来识别
就像它有10个字符串中的字符串,DB中的最短字符串是4个字符,你可以得到这些组合:
4,6
5,5
6,4
10
没有4,4,2或者像这样
然后你可以在数据库中查找每个部分,如果每个部分都存在,你可以说它被分成“意味着完整的单词”
但是没有那个数据库,或者没有太常见的字典,你可能会坚持这个或者几乎不可能
答案 5 :(得分:0)
是的,即使没有拆分字符,也可以将字符串拆分为单词。这可以在O(n)附近非常有效地解决。考虑使用前缀字符串正则表达式并从您的字符串逐字提取。您也可以http://code.google.com/p/graph-expression/wiki/RegexpOptimization检查此工具。
使用拼写检查自动机进行搜索大多数可支持的字符串分割,有更强大的(更有效的方法,它使用全局优化而非本地优先)方法。查看本教程,了解它如何在中文单词字符串http://alias-i.com/lingpipe/demos/tutorial/chineseTokens/read-me.html
上完成