我正在开发一个单词同义词应用程序,但遇到了挑战。挑战/问题是如何在我的应用程序数据库中映射一个单词及其同义词?
问问题
3383 次
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 回答