Lingpipe提供了一种可选择的拼写纠错方式,能对用户未输入完整的查询进行提示最相近的查询建议。
图片中显示了google搜索框中的选择性纠错模型对查询进行补充完整。
例如,首行搜索建议词是”amzon”,尽管用户输入查询”anaz”,这并不惊奇,因为那些以”anaz”为前缀的建议词的搜索结果比较小。
不仅有词的搜索建议,还有短语纠错建议。比如一些搜索词像”anazao salon”
搜索建议和拼写纠错之间的一个重要不同点为:搜索建议是在确定的搜索短语集中选择的。
I want to find anaz,是没有建议的短语的
找出有数量的短语
例如我们的demo,我们假设用户提供一批包含数量的短语。例如我们提供一批美国各州名及对应人口数。文件格式如下示例:
Alabama 4599000 Alaska 670000 Arizona 6166000 Arkansas 2811000 California 36458000 Colorado 4753000 Connecticut 3505000 Delaware 853000 District of Columbia 58200 Florida 18090000 ...
我们刚好使用州人口数(估计数目在2006年中段),用于人口搜索可能不是个好的方式。如果想查询美国各州的人口数却是个好方式。但是如果想找寻找旅游目的地,夏威夷和哥伦比亚特区比其它地方人口建议还多。通常上,数量将要被平衡最流行的结果,然后将反应用户的特殊偏好。
运行命令行demo
我们包含命令行的demo和GUI demo,我们西姆分别描述
1. 命令行
> ant complete-cmd |N| -3.95 New York -5.08 North Carolina -5.10 New Jersey -6.90 Nevada -7.26 New Mexico |New| -3.95 New York -5.10 New Jersey -7.26 New Mexico -7.83 New Hampshire -16.90 Nevada |New Y| -3.95 New York -15.10 New Jersey -17.26 New Mexico -17.83 New Hampshire |New Yor| -3.95 New York |Mew | -13.95 New York -15.10 New Jersey -17.26 New Mexico -17.83 New Hampshire |U| -6.87 Utah -13.04 California -13.67 Texas -13.95 New York -14.05 Florida |Uta| -6.87 Utah -23.04 California |ZebraFish|
这里用户输入一个查询,下面提示五个自动搜索建议词。其中下面的建议词按照分值排序,分值越高排在越上面。
同样我们也得到那些不是靠前缀匹配的建议词,例如用户输入'
运行GUI Demo
如果你喜欢玩查询,你既可以通过命令行的方式来得到,也可以通过GUI的方式得到
接口如下图所示:
输入
搜索问题
像lingpipe 中的javadoc中解释的那样,这个搜索建议工具能通过前缀匹配得到分值较高最相近的短语。建议短语得分是通过短语得分之和和最高得分来进行计算的,而且是最大似然概率估计打分。另外词的数量被所有数量之和分别进行。例如输入
代码示例
配置搜索建议demo的参数接口,只需要一些正确的短语及其数量组成的构造方法,以及权重编辑距离的搜索参数
下面是命令行的main方法代码,调用类src/AutoCompleteCommand.java
public static void main(String[] args) throws IOException { File wordsFile = new File(args[0]); String[] lines = FileLineReader.readLineArray(wordsFile,"ISO-8859-1"); Map.counter = new HashMap (200000); for (String line : lines) { int i = line.lastIndexOf(' '); if (i < 0) continue; String phrase = line.substring(0,i); String countString = line.substring(i+1); Float count = Float.valueOf(countString); counter.put(phrase,count); }
如上代码所示,使用FileLineReader.readLinesArray() 方法,按指定编码将日志词库文件转换为数组。然后将数组中的词语数字插入到Counter(一个map)中。
下一步配置编辑距离参数,来衡量目标短语的前缀与查询前缀的距离值。这个类采用的是 fix-weighted编辑距离,时间上的任何编辑距离都可以使用
double matchWeight = 0.0; double insertWeight = -10.0; double substituteWeight = -10.0; double deleteWeight = -10.0; double transposeWeight = Double.NEGATIVE_INFINITY; FixedWeightEditDistance editDistance = new FixedWeightEditDistance(matchWeight, deleteWeight, insertWeight, substituteWeight, substituteWeight, transposeWeight);
最后我们需要配置拼写纠错器:
int maxResults = 5; int maxQueueSize = 10000; double minScore = -25.0; AutoCompleter completer = new AutoCompleter(counter, editDistance, maxResults, maxQueueSize, minScore);
此外Counter和编辑距离,最大结果数量,最大搜索队列大小,返回结果最大分值等参数的配置。
最后,我们配置完所有参数并 运行搜索建议demo
for (int i = 1; i < args.length; ++i) { SortedSet> completions = completer.complete(args[i]);
下面java.util.SortedSet包含对象ScoredObject
我们得到completions对象后,打印它们:
System.out.println("\n|" + args[i] + "|"); for (ScoredObjectso : completions) System.out.printf("%6.2f %s\n", so.score(), so.getObject()); }
部署搜索建议
总共有3中参数,包括建议调整值,编辑距离和搜索参数。这个编辑距离和拼写纠错中的编辑距离很相似。
最大结果数量需要系统较多资源,所以结果集小相对来说计算简单些。
最大队列数量暗示在搜索建议工具调整前有多大的潜在搜索建议短语集。调整以后,错误结果会尽量减少,大大提高准确率