Java 分类器4J输出有缺陷

Java 分类器4J输出有缺陷,java,Java,我正在读一本关于机器学习的书,他们举了一个例子,说明如何检查字符串输入,看看一个单词是否可能是另一个单词的拼写错误(在本例中,一个名字的拼写不同)。运行该示例后,所有输出为0.0、.999或0.7071067811865475。我查看了API,发现它能够给出0到1之间的值范围,但我找不到任何东西来解释这个问题。我知道可能还有其他工具可以做同样的事情,但我想让这个工具正常工作。下面是我用来测试它的代码 import java.util.ArrayList; import java.util.Lis

我正在读一本关于机器学习的书,他们举了一个例子,说明如何检查字符串输入,看看一个单词是否可能是另一个单词的拼写错误(在本例中,一个名字的拼写不同)。运行该示例后,所有输出为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();
    }
}`
import java.util.ArrayList;
导入java.util.List;
导入net.sf.classifier4J.ClassifierException;
导入net.sf.classifier4J.vector.HashMapTermVectorStorage;
导入net.sf.classifier4J.vector.TermVectorStorage;
导入net.sf.classifier4J.vector.VectorClassifier;
公共级不列颠伊迪莱玛酒店{
英国公共图书馆(){
列表项=新的ArrayList();
条款。添加(“brittany spears”);
条款。添加(“brittney spears”);
条款。添加(“britany spears”);
条款。添加(“布兰妮·斯皮尔斯”);
条款。添加(“briteny spears”);
条款。添加(“britteny spears”);
条款。添加(“布氏长矛”);
条款。添加(“brittny spears”);
条款。添加(“布林提长矛”);
条款。添加(“britanny spears”);
条款。添加(“britiny spears”);
条款。添加(“britnet spears”);
条款。添加(“britiney spears”);
条款。添加(“布兰妮·斯皮尔斯”);
条款。添加(“布兰妮·斯皮尔斯”);
条款。添加(“britne Spessss”);
TermVectorStorage=新的HashMapTermVectorStorage();
向量分类器vc=新向量分类器(存储);
String correctString=“布兰妮·斯皮尔斯”;
for(字符串术语:术语){
试一试{
vc.teachMatch(“不列颠分类法”,更正字符串);
双重结果=风险分类(“英国分类法”,术语);
System.out.println(术语+“=”+结果);
}
渔获物(e){
e、 printStackTrace();
}
}
}
公共静态void main(字符串[]args){
BritneyDilemma bd=新的BritneyDilemma();
}
}`

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

每个字符串中都有正确的姓氏“spears”,而大多数字符串中的名字“britney”都搞乱了,因此VectorClassifier会找到一个匹配的单词和一个不匹配的单词。对于字符串“britney Spearssss”,它还会找到一个匹配的单词(本例中的名称为“britney”)和一个不匹配的单词(姓氏)。这就是为什么对于所有这些字符串,
VectorClassifier
给出相同的结果

对于完全匹配的字符串(“布兰妮·斯皮尔斯”),它给出接近1的最佳分数


对于没有匹配单词的字符串(“britne Spessss”),它给出零。

Classifier4J单词逐字。它可以处理词干,但不会拼写错误。因此,你最好看看算法


(我写了Classifier4J)

谢谢,我浏览了API,没有找到任何东西。多亏了你的回复,我才找到了源代码。