【问题标题】:What would be the best way to create association in a list (array) of arbitrary things?在任意事物的列表(数组)中创建关联的最佳方法是什么?
【发布时间】:2013-07-19 02:46:14
【问题描述】:

我正在制作一个单词定义测验应用程序,我的单词列表及其定义采用 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"
            ]
        },

但我意识到这个解决方案有点糟糕,因为我必须找到彼此的单词并实现相同的列表,当我最终添加大量单词。

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

【问题讨论】:

    标签: java json logic nlp


    【解决方案1】:

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

    确保使用“word”字段覆盖equals()hashCode()(我称它为“值”以将其与类名区分开来)(见下文):

    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;
        }
    }
    

    基于 value 字段实现 equals()hashCode() 意味着您可以通过使用 Set 来防止重复:

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

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

    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
    }
    

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

    • 吠声:动词:狗做什么
    • 树皮:名词:覆盖一棵树的东西

    事实上,您可以考虑每个单词有多种含义:

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

    【讨论】:

    • 我确实有一个 Word 类,这就是我现在的实现。如果我(嗯,不是我,我不会添加)几个月后添加单词,我可以预见问题,我不记得已经有类似的单词,或者如果我忘记更新每个单词使用新的同义词。这行得通,但必须有更好的方法。
    • 添加的时候可以随时添加一个函数,先查看是否已经存在。如果您指定需要添加哪些单词,我相信也可以创建一个添加同义词的功能。
    • 哇,hashcode 的东西看起来很有前途。谢谢!这可能是要走的路。
    • 是的 - 这真的很重要。阅读 javadoc(链接在我的答案中)以了解 hashCode 和 equals 以及它们应该如何相互对齐。了解这些东西会让你成为一个更好的程序员并帮助你找到工作,因为这是一个常见的面试问题!
    猜你喜欢
    • 2021-03-09
    • 1970-01-01
    • 2021-03-18
    • 1970-01-01
    • 1970-01-01
    • 2011-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多