我有一个语料库,其中包含一个简短的故事,包含5个“who”,“what”,“when”,“where”,“why”问题。我使用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个问题。对我来说这真的很好。任何帮助,理念是值得赞赏的。
答案 0 :(得分:1)
您正在以错误的方式测试空字符串。例如
if (sent2[j] != "") { ...
除非你使用的保证规范化它返回的字符串,否则这是不可靠的。 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
这可能不是导致程序失败的原因,但很可能是错误。