【问题标题】:Q&A system from corpus in javajava语料库问答系统
【发布时间】:2015-02-10 21:17:10
【问题描述】:

我有一个包含 5 个“谁”、“什么”、“何时”、“在哪里”、“为什么”问题的短篇故事的语料库。我使用Stanford NLP API 将故事分成句子,然后我得到句子中每个单词的引理,给我基本单词。我对问题也这样做。我将故事和句子保存在单独的文件中,我使用 WS4J 来帮助我确定故事中的哪个句子可以回答每个问题。

我正在使用这种方法,它接受 2 个字符串(问题和可能的)并将它们相互比较并返回一个值,该值是否是问题的可能答案。

    public int compSen(double prob, String sen1, String sen2) {

        int cant = 0;

//        String sen2c = remStopWords(sen2);

        String[] sent1 = getWords(sen1);

        String[] sent2 = getWords(sen2);

        for (int s = 0; s < sent2.length - 1; s++) {
            for (int m = s + 1; m < sent2.length; m++) {

                if (sent2[s] != "" && sent2[s].equals(sent2[m])) {

                    sent2[m] = "";
                }
            }
        }

        for (int i = 0; i < sent1.length; i++) {

            for (int j = 0; j < sent2.length; j++) {

                if (sent2[j] != "") {
                    double res = compWord(sent1[i].trim(), sent2[j].trim());
                    if (res >= prob) {
//                    System.out.println(sent1[i] + " " + sent2[j]);
//                    System.out.println(res);
                        cant++;
                    }
                }

            }
        }

        return cant;
    }

我的另一个比较单词的方法是这样的:

    public double compWord(String word1, String word2) {

        ILexicalDatabase db = new NictWordNet();
        WS4JConfiguration.getInstance().setMFS(true);
        RelatednessCalculator rc = new Path(db);
//        String word1 = "gender";
//        String word2 = "sex";
        List<POS[]> posPairs = rc.getPOSPairs();
        double maxScore = -1D;

        for (POS[] posPair : posPairs) {
            List<Concept> synsets1 = (List<Concept>) db.getAllConcepts(word1, posPair[0].toString());
            List<Concept> synsets2 = (List<Concept>) db.getAllConcepts(word2, posPair[1].toString());

            for (Concept synset1 : synsets1) {
                for (Concept synset2 : synsets2) {
                    Relatedness relatedness = rc.calcRelatednessOfSynset(synset1, synset2);
                    double score = relatedness.getScore();
                    if (score > maxScore) {
                        maxScore = score;
                    }
                }
            }
        }

        if (maxScore == -1D) {
            maxScore = 0.0;
        }

//        System.out.println(word1);
//        System.out.println(word2);
//
//        System.out.println(maxScore);
//        System.out.println("sim('" + word1 + "', '" + word2 + "') =  " + maxScore);
        return maxScore;
    }

我想知道是否有另一种方法可以更好地回答给定故事的语料库中的问题,因为我的方法非常基础,我设法回答了 20 个问题中的近 1-3 个问题。对我来说,这真的很好.任何帮助,想法表示赞赏。

【问题讨论】:

    标签: java system stanford-nlp analyzer corpus


    【解决方案1】:

    您正在以错误的方式测试空字符串。例如

    if (sent2[j] != "") { ...
    

    除非您使用 API 保证 规范化它返回的字符串,否则这是不可靠的。 Java 不保证所有空字符串都是与"" 相同的对象。以下是测试字符串是否为空的可靠方法:

    if ("".equal(sent2[j])) { ... // works even for a null !!!
    
    if (sent2[j].equals("") { ...
    
    if (sent2[j].length() == 0) { ...
    
    if (sent2[j].isEmpty()) { ... // Java 6 onwards
    

    这可能不是导致程序失败的原因,但很可能是一个错误。

    【讨论】:

    • 请编辑您的问题以将正确代码放入其中。由于您的问题目前是写的,我的答案很可能是正确的答案。如果您想获得不同版本问题的答案,那么您应该更新它。
    • 是的,不是这样,这不是真正的编码错误。我在寻求一种更好的方法来比较一段文本与另一段的相似性。不只是逐字逐句,而是句子的意思。这就是我使用 Standford NLP API 的原因。不过谢谢你的提示。
    • 所以...解决您的问题! '因为现在你问的方式意味着人们要么不明白你在问什么,要么在看到明显伪造的示例代码后放弃尝试。说真的,你有责任把你的问题写好……如果你想让它们得到回答。
    • 如何解决?在代码的底部,我会尽力解释我想要实现的目标。
    • 怎么样?这取决于你。你是理解你想问什么的人。 >>表达
    猜你喜欢
    • 1970-01-01
    • 2011-07-12
    • 1970-01-01
    • 2020-07-22
    • 1970-01-01
    • 2020-12-08
    • 2012-03-04
    • 1970-01-01
    • 2017-12-03
    相关资源
    最近更新 更多