Classifier4j输出存在缺陷

时间:2015-05-31 12:47:00

标签: java

我正在编写一本关于机器学习的书,他们给出了一个如何检查字符串输入的示例,以查看单词是否可能是另一个单词的拼写错误(在这种情况下,名人姓名的拼写不同)。运行示例后,所有输出都是0.0,.999或0.7071067811865475。我浏览了API,并且它能够提供0到1之间的一系列值,但我找不到任何解释这个问题的东西。我知道可能还有其他工具可以做同样的事情,但我想让这个工具正常工作。这是我用来测试它的代码。

import java.util.ArrayList;
import java.util.List;

import net.sf.classifier4J.ClassifierException;
import net.sf.classifier4J.vector.HashMapTermVectorStorage;
import net.sf.classifier4J.vector.TermVectorStorage;
import net.sf.classifier4J.vector.VectorClassifier;


public class BritneyDilemma {


public BritneyDilemma() {
        List<String> terms = new ArrayList<String>(); 
        terms.add("brittany spears");
        terms.add("brittney spears");
        terms.add("britany spears");
        terms.add("britny spears");
        terms.add("briteny spears");
        terms.add("britteny spears");
        terms.add("briney spears");
        terms.add("brittny spears");
        terms.add("brintey spears");
        terms.add("britanny spears");
        terms.add("britiny spears");
        terms.add("britnet spears");
        terms.add("britiney spears");
        terms.add("britney spears");
        terms.add("britney spearssssss");
        terms.add("britne spessssss");


        TermVectorStorage storage = new HashMapTermVectorStorage(); 
        VectorClassifier vc = new VectorClassifier(storage); 
        String correctString = "britney spears";
        for (String term : terms) {
            try {
                vc.teachMatch("britCatagory", correctString);
                double result = vc.classify("britCatagory", term);
                System.out.println(term + " = " + result);
            }
            catch (ClassifierException e) {
                e.printStackTrace();
            }
        }
}

public static void main(String[] args) {
    BritneyDilemma bd = new BritneyDilemma();
    }
}`

2 个答案:

答案 0 :(得分:2)

VectorClassifier基本上将传入的字符串拆分为标记(单词)并检查它们是否出现在正确的字符串中(即传递给teachMatch方法的字符串),同时考虑到频率这些字。 VectorClassifier 计算单词的可能性。如果你查看它的源代码,你可以自己检查一下。

你有正确的姓氏&#34;长矛&#34;在每个字符串中,名称&#34; britney&#34;在大多数字符串中混乱,因此VectorClassifier找到一个匹配的单词和一个不匹配的单词。对于字符串&#34; britney spearssssss&#34;它还会找到一个匹配的单词(名称&#34; britney&#34;在这种情况下)和一个不匹配的单词(姓氏)。这就是为什么,对于所有这些字符串,VectorClassifier会给出相同的结果。

对于完全匹配的字符串(&#34; britney spears&#34;),它会给出接近1的最佳分数。

对于没有匹配单词的字符串(&#34; britne spessssss&#34;),它给出零。

答案 1 :(得分:0)

Classifier4J字逐字逐句。它确实处理词干,但不处理拼写错误。为此,您最好查看edit distance算法。

(我写过Classifier4J)