我想知道从输入文本生成标记云的最佳方法是什么(当用户键入它时)。例如,如果用户输入一个包含"科幻、科技、特效"关键词的故事文本,标签云将根据这些关键词在每个故事中的出现频率,按照相关度排序。标记云将按降序显示并使用相同的字体大小,这不是显示算法,而是我应该实现的搜索算法。我使用mysql和php。我应该坚持MATCH吗?对条款?我应该实现标签表吗?
我有一个mysql表包含很多故事。当用户输入他/她自己的故事时,我希望显示一个标记云,其中包含从输入文本中提取的最频繁的单词,这些单词出现在保存在数据库中的这组故事中。标签云将仅用于向用户显示他/她在自己的故事中输入的单词的相关性,根据这些单词在所有用户输入的所有故事中出现的频率。
我认为您需要做的第一件事是更清楚地定义标记系统的目的。您是否希望简单地基于文本中出现最频繁的单词构建标记?在我看来,这是考虑到搜索排名而设计的。
…或者你希望你的内容更好地组织,标签云是一种提供更好的用户体验的方式,并在内容片段之间创建更明显的关系(即这两个都被标记为科幻,所以将它们显示在科幻类别中)。
如果是前者,您可能不需要做任何事情,除了:
- 用分隔符分隔文本,如单个空格
explode(' ', $content);
- 有一个列表(可能在配置文件中或在脚本本身中),这些单词将经常出现,你想从标签(和,或,this, the等)中排除。你可以像这样把它们从页面上摘下来:http://www.esldesk.com/vocabulary/pronouns, http://www.english-grammar-revolution.com/list-of-conjunctions.html
然后,您只需要决定一个单词出现的次数(百分比或数字),并将这些标签存储在一个表中,该表显示了标签和内容之间的联系。
要实现"当用户输入"部分,你只需要使用一点jQuery的ajax功能来不断调用构建标签列表的脚本(即keydown)。
另一个选项(更好的用户体验)将包含许多相同的元素,但您必须考虑更多。我会考虑以下几点:
- 你想限制某些标签(也许你不想让任何人都可以创建新的标签)?
- 如何处理同义词
- 如果你支持多种语言
- 如果您希望优先建议现有标签(可能接近)而不是建议新标签
一旦你完全定义了逻辑和用户体验,你可以回到搜索算法。MATCH和AGAINST都是不错的选择,但你可能会发现一个简单的LIKE就可以了。
祝你好运=)
如果希望在用户输入时生成标记云,有两种方法:
- 直接从输入文本更新标签云
- 将输入文本发送到后端(使用ajax/comet实时),然后保存,计算词频并返回数据,从中生成云。
我将使用前者使用jQuery插件,如- http://plugins.jquery.com/plugin-tags/tag-cloud