OpenNLP doccat培训师总是导致“ 1种结果模式”

我正在评估OpenNLP用作文档分类程序。我有一个经过整理的训练语料库,其中包含大约150个类别的大约4k文件。文档中有很多共享的单词,大多数都是不相关的单词-但是这些单词中有很多变得以n-gram的形式变得有意义,因此我使用以下参数:

        TrainingParameters params = new TrainingParameters();
        params.put(TrainingParameters.ITERATIONS_PARAM,20000);
        params.put(TrainingParameters.CUTOFF_PARAM,10);
        DoccatFactory dcFactory = new DoccatFactory(new FeatureGenerator[] { new NGramFeatureGenerator(3,10) });
        params.put(AbstractTrainer.ALGORITHM_PARAM,NaiveBayesTrainer.NAIVE_BAYES_VALUE);

其中一些类别适用于几乎完全相同的文档(想想样板法律文档,在各个文档实例之间可能只有名称和地址不同)-并且将与测试集中的文档大部分相同。但是,无论我如何调整这些参数,我都无法脱离“ 1结果模式”的结果。运行测试时,测试集中的每个文档都标记有“类别A”。

通过从先前对BagOfWordsFeatureGenerator的使用向NGramFeatureGenerator的使用,以及从maxent到Naive Bayes的使用,我确实设法实现了输出的单个细微变化。更改之前,测试集中的每个文档都被分配为“类别A”,但是更改之后,所有文档现在都被分配为“类别B”。但是除此之外,我似乎根本无法移动拨盘。

我尝试摆弄迭代,截止,ngram大小,使用maxent而不是贝叶斯等。但全部无济于事。

我在互联网上发现的教程示例代码使用了更小的训练集,迭代次数更少,并且至少能够执行一些基本的区分。

通常在这种情况下-令人困惑的是缺乏预期的行为-工程师忘记了进行一些简单的切换,或者对基本的理解有一些致命的缺乏。我非常有能力克服这些失败。另外,尽管我读过几本O'Reilly的书籍,但我都没有接受数据科学方面的培训。因此,问题可能出在程序上。训练集太小了吗?迭代次数是否降低了一个数量级?使用其他算法会更合适吗?我完全感到惊讶的是,没有任何调整甚至使表盘略微偏离“ 1结果”结果。

任何回应表示赞赏。

iCMS 回答:OpenNLP doccat培训师总是导致“ 1种结果模式”

这个问题的答案并非来自提出问题的方向。事实证明,OpenNLP文档中有一个代码示例是错误的,并且没有任何参数调整可以解决它。我已经向该项目提交了一份jira,因此应该解决该问题。但是对于那些在此之前就这样来到这里的人来说,这是一个破败:

文档(错误):

const LoginForm = (props) => {
  const [username,setUsername] = useState("");
  const [password,setPassword] = useState("");
  const [routeRedirect,setRouteRedirect] = useState(false);
  const [error,setError] = useState(false);

  const login = (e) => {
    e.preventDefault();
    const admin = {
      username,password,};
    axios
      .post("/login/authenticate",admin)
      .then((res) => {
        if (res.data.errors) {
          setError(true);
        } else {
          return null;
        }
      })
      .catch((err) => console.log(err));
    setRouteRedirect(true);
  };
  return (
    <ContactWrapper>
      <ContactContainer>
        {routeRedirect ? (
          <Fragment>Hello</Fragment>
        ) : (
          <Fragment>
            <Title>LOGIN</Title>
            <LoginForm onSubmit={login}>
              <FormLabel>Username:</FormLabel>
              <FormInput
                type="text"
                name="username"
                onChange={(e) => setUsername(e.target.value)}
              />
              <FormLabel>Password:</FormLabel>
              <FormInput
                type="password"
                name="password"
                onChange={(e) => setPassword(e.target.value)}
              />
              <LoginButton type="submit">Login</LoginButton>
            </LoginForm>
          </Fragment>
        )}
      </ContactContainer>
    </ContactWrapper>
  );
};

export default LoginForm;

应该是这样的:

String inputText = ...
DocumentCategorizerME myCategorizer = new DocumentCategorizerME(m);
double[] outcomes = myCategorizer.categorize(inputText);
String category = myCategorizer.getBestCategory(outcomes);

DocumentCategorizerME.categorize()需要一个数组;由于这是运行代码的第二个明显的自记录错误,因此我假设必要的array参数应该是字符串形式的文档数组;相反,它需要 单个文档中的一系列令牌。

本文链接:https://www.f2er.com/1683378.html

大家都在问