标签层次结构和
这是一个实际的问题,通常适用于标记项目(是的,这也适用于StackOverflow,不,这不是有关StackOverflow的问题)。
整个标记问题可帮助将相似项(无论是什么,如笑话,博客文章,等等)组合在一起。但是,(通常但并非严格地)存在标签的层次结构,这意味着某些标签也暗示着其他标签。用一个熟悉的例子," c#" so标记还意味着" .net"。另一个例子,在笑话数据库中," blondes"标签表示" derisive"标签,类似于" irish"或者" belge"或者" canadian"等,具体取决于笑话的国家/地区。
如果有的话,我们在项目中如何处理?我将提供一个答案,描述我在两种不同情况下使用的两种不同方法(实际上是相同的机制,但在两种不同的环境中实现),但我不仅对相似的机制感兴趣,而且也对我们对层次结构问题的看法感兴趣。
解决方案
我实现的机制是不使用给定的标签,而是使用间接查找表(严格来说不是DBMS术语),该表将标签链接到许多隐含的标签(显然,标签与其自身链接在一起才能起作用)。
在python项目中,查找表是一个以标签为键的字典,其中包含标签的值集(标签为纯字符串)。
在一个数据库项目中(无论是哪个RDBMS引擎),都有以下表格:
[Tags] tagID integer primary key tagName text [TagRelations] tagID integer # first part of two-field key tagID_parent integer # second part of key trlValue float
其中trlValue是[0,1]空间中的一个值,用于为每个链接的标签提供重力;自对标签关系在trlValue中始终带有1.0,而其余的是通过算法计算的(不是请考虑我给出的示例笑话数据库;一个['blonde','derisive',0.5]记录将与一个['pondian','derisive',0.5]相关联,因此建议给所有其他嘲笑性笑话。
这是一个棘手的问题。这两个极端是本体(一切都是分层的)和民俗疗法(标签没有分层)。我已经在WikiAnswers上回答了这个问题,并引用了Clay Shirky的"本体论被高估"一文,该文章声称我们不应设置任何层次结构。
实际上,我想说的不是一个分层系统,而是一个语义网络,在标签含义之间存在明显的距离。我的意思是:数学比实验物理学更接近园艺。
建立这样一个网络的可能性:建立标签对,让人们判断感知的距离(使用1-10之类的度量,意思是[synonyms,alike,...,antonyms],...等),在搜索时,搜索特定距离内的所有标签。
如果从相反方向([a,b]关闭-> [b,a,]关闭)来测量,距离是否必须相等?还是接近意味着[a,b]关闭而[b,c]关闭-> [a,b]关闭?
也许第一个单词默认会触发另一个语义字段?如果我们是从"社会工作者"开始的,那么"分析师" ist就在附近。如果我们从"程序员"开始,那么"分析师"也在附近。但是从这些点中的任何一个开始,我们可能都不会将另一个算作接近("琐碎的工作人员"绝不接近"程序员")。
因此,我们将只能在两个方向(以随机顺序)进行判断和对。
[TagRelations] tagId integer closeTagId integer proximity integer
选择相似标签的示例:
select closeTagId from TagRelations where tagId = :tagID and proximity < 3