1

我正在开发一个单词同义词应用程序,但遇到了挑战。挑战/问题是如何在我的应用程序数据库中映射一个单词及其同义词?

4

3 回答 3

1

使用地图,如下所示:

Map<String, List<String>> synonyms;

在上面,映射的键是单词,对应的值是同义词列表。

在数据库方面,创建一个同义词表和一个词表,同义词表中的每个词都会持有一个对该词的外键引用。这可以很容易地映射到上述数据结构。

于 2013-06-13T15:37:31.890 回答
1

同义词是可交换的但不是及物的。

我找不到一个例子,所以下面的人造一个:

bank
synonym(bank) = money-institute   => synonym(money-institute) = bank
synonym(bank) = place-to-sit      => synonym(money-institute) = bank

place-to-sit:
synonym(place-to-sit) = bank
synonym(place-to-sit) = chair

NOT synonym(chair) = money-institute

这意味着您只需要一个没有顺序的对列表,并且两个都是另一个的同义词,反之亦然。还有更多你不需要做的。

public class SynonymTable {

private Map<Word, Set<Word>> synonymTable = new HashMap<>();

public Set<Word> getSynonyms(Word word) {
    return synonymTable.get(word);
}

public void registerSynonym(Word word, Word... synonymsOfWord) {
    for (Word syn : synonymsOfWord) {
        putSynonymTable(word, syn); // synonym(word) = syn
        putSynonymTable(syn, word); // synonym(syn) = word
    }
}

private void putSynonymTable(Word word, Word synonymOfWord) {
    Set syns = synonymTable.get(word);
    if (syns == null) {
        syns = new TreeSet<Word>();
        synonymTable.put(word, syns);
    }
    syns.add(synonymOfWord);
}
...

数据库变体

CREATE TABLE TWord (
    wordId INT AUTO_INCR,
    wordText VARCHAR(80),
    INDEX(wordText),
    PRIMARY KEY(wordId)
);
CREATE TABLE TSynonym (
    wordFk INT NOT NULL,
    synonymFk INT NOT NULL,
    CONSTRAINT FOREIGN KEY (wordFk) REFERENCES TWord(wordId),
    CONSTRAINT FOREIGN KEY (synonymFk) REFERENCES TWord(wordId),
    PRIMARY KEY(wordFk, synonymFk)
);
于 2013-06-13T16:18:41.600 回答
0

如果您的应用程序像问题中描述的那样简单,那么正如其他答案中建议的那样,带有 Set 或 list 值的 Map 就足够了。如果您对第三方库感到满意,您可以查看Guava 的 Multimap。根据文档:

类似于 Map 的集合,但可以将多个值与单个键相关联。如果您使用相同的键但值不同的两次调用 put(K, V),则多重映射包含从键到两个值的映射。

于 2013-06-13T15:53:03.770 回答