在任意事物的列表(数组)中创建关联的最佳方法是什么?

时间:2013-07-19 02:46:14

标签: java json logic nlp

我正在制作一个单词定义测验应用程序,我的单词及其定义列表是JSON,结构如下:

"words": [
        {
            "word": "rescind",
            "type": "verb",
            "definition": "to take back, repeal as in a rule or policy"
        },
        {
            "word": "curtail",
            "type": "verb",
            "definition": "to reduce or lessen"
        },

等等。

在测验中,您将获得一个随机选择的单词,以及五个可供选择的定义。就像标准化的多项选择测试一样。

现在,我开始看到的一个问题是我的词语含义非常相似。我目前从列表中随机选取了4个错误的定义,但为了避免混淆,我想避免选择与正确选择类似的定义。

我应该如何创建这个“相似性”地图?我想到的一个解决方案是:

        {
            "word": "avid",
            "type": "adjective",
            "definition": "extremely excited about, enthusiastic about",
            "similar to": [
                "ardent",
                "fervent"
            ]
        },

但是我意识到这个解决方案有点糟糕,因为我必须互相转向并实现相同的列表,当我最终添加很多很多时,它会让真正的笨重来编辑词语的

那么你们认为什么是最好的解决方案?

1 个答案:

答案 0 :(得分:3)

一个简单的第一种方法是创建一个带有字段的Word类。

确保使用“word”字段覆盖equals()hashCode()(我调用dit“value”以区别于类名)(见下文):

public class Word {
    private final String value;
    private final String type;
    private final String definition;
    private final List<Word> synonymns = new ArrayList<Word>();

    public Word(String value, String type, String definition) {
        this.value = value;
        this.type = type;
        this.definition = definition;
    }

    // equals() and hashCode() based on the value field
    @Override
    public int hashCode() {
        return value.hashCode();
    }
    @Override
    public boolean equals(Object obj) {
         return obj instanceof Word && ((Word)obj).value.equals(value);
    }

    public String getValue() {
        return value;
    }
    public String getType() {
        return type;
    }
    public String getDefinition() {
        return definition;
    }
    public List<Word> getSynonymns() {
        return synonymns;
    }
}

根据值字段实施equals()hashCode()意味着您可以使用Set来防止重复:

Set<Word> words = new HashSet<Word>(); // wont allow two Word objects with the same value

您可以使用Set.add()的返回值,如果该集合尚未包含指定元素,则返回true,以检查正在添加的单词是否实际上是唯一的:

Word word = new Word("duplicate", "adjective", "another copy");
if (!words.add(word)) {
    // oops! set already contained that word
}

如果您想添加特殊酱汁,请将type设为枚举:

public enum PartOfSpeach {
    NOUN,
    VERB, // in USA "verb" includes all nouns, because any noun can be "verbed"
    ADJECTIVE,
    ADVERB
}

您可以考虑允许单词属于多种类型:

  • bark:动词:狗做什么
  • bark:名词:什么是树?

事实上,您可能会考虑为每个单词赋予多种含义:

public class Meaning {
    PartOfSpeach p;
    String definition;
    List<Word> synonyms; // synonyms belong to a particular *meaning* of a Word.
}