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