`
orange.lpai
  • 浏览: 89469 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Lingpipe中的spell模块-搜索建议

阅读更多
搜索建议
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|


这里用户输入一个查询,下面提示五个自动搜索建议词。其中下面的建议词按照分值排序,分值越高排在越上面。
同样我们也得到那些不是靠前缀匹配的建议词,例如用户输入'<new>时,下面提示的词第五个为''Nevada"。
运行GUI Demo
如果你喜欢玩查询,你既可以通过命令行的方式来得到,也可以通过GUI的方式得到
接口如下图所示:
输入<New Y>下拉框有三个提示
搜索问题
像lingpipe 中的javadoc中解释的那样,这个搜索建议工具能通过前缀匹配得到分值较高最相近的短语。建议短语得分是通过短语得分之和和最高得分来进行计算的,而且是最大似然概率估计打分。另外词的数量被所有数量之和分别进行。例如输入<Mew y>匹配"New York"需要对第一个字母'M'替换为'N'。这中分值利用权重编辑距离来计算,仅仅只为拼写提示。
代码示例
配置搜索建议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<String,Float> counter = new HashMap<String,Float>(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<ScoredObject<String>> completions
            = completer.complete(args[i]);




下面java.util.SortedSet包含对象ScoredObject<String>objects,它由字符串和分值组成,
我们得到completions对象后,打印它们:
System.out.println("\n|" + args[i] + "|");
        for (ScoredObject<String> so : completions)
            System.out.printf("%6.2f %s\n", so.score(), so.getObject());
    }

    
部署搜索建议
总共有3中参数,包括建议调整值,编辑距离和搜索参数。这个编辑距离和拼写纠错中的编辑距离很相似。
最大结果数量需要系统较多资源,所以结果集小相对来说计算简单些。
最大队列数量暗示在搜索建议工具调整前有多大的潜在搜索建议短语集。调整以后,错误结果会尽量减少,大大提高准确率
  • 大小: 13.1 KB
  • 大小: 6.5 KB
分享到:
评论
1 楼 申公子 2014-02-10  
你好 请问就lingpipe中文分词 情感分析方面的问题和你讨论下吗?

相关推荐

Global site tag (gtag.js) - Google Analytics