java - Classifier4j 输出有缺陷

标签 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();
    }
}`

最佳答案

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

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

对于完全匹配的字符串(“britney spears”),它给出接近 1 的最佳分数。

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

关于java - Classifier4j 输出有缺陷,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30557611/

相关文章:

java - "return new A()"和 "return a = new A()"有什么区别

java - struts2 jSTL 迭代器标签

Java web start 启动失败 - JRE 7 32位(运行在64位windows系统上)

java - Java中的线程安全循环缓冲区

java - 结果集存储在 hashMap 中,行数为零

java - 思科 JTAPI 到 CUCM

java - JSP Tomcat 不良资源

java - 将文件从 DCM4CHEE 移动到 FTP 服务器

java - 查找 self 和运行时 jar

java - 在 Eclipse.ini 中更改堆大小没有帮助