【发布时间】:2011-04-16 02:14:47
【问题描述】:
当用户写一篇文章时,我想根据现有的标签列表自动生成用户写的标签。
例如,我有一个类似的列表:
曼哈顿 布鲁克林 皇后区 ....
如果用户写了一篇包含这些关键词的文章,它将来到标签。
like 用户的标题是:“今天我在曼哈顿滑冰”,那么曼哈顿应该包含标签。
我曾经考虑过foreach标签列表,但是如果标签列表变得很大,它会很慢。
你们有什么自动生成标签的解决方案吗?或者有任何想法来解决这个问题?
提前致谢。
【问题讨论】:
当用户写一篇文章时,我想根据现有的标签列表自动生成用户写的标签。
例如,我有一个类似的列表:
曼哈顿 布鲁克林 皇后区 ....
如果用户写了一篇包含这些关键词的文章,它将来到标签。
like 用户的标题是:“今天我在曼哈顿滑冰”,那么曼哈顿应该包含标签。
我曾经考虑过foreach标签列表,但是如果标签列表变得很大,它会很慢。
你们有什么自动生成标签的解决方案吗?或者有任何想法来解决这个问题?
提前致谢。
【问题讨论】:
根据您拥有的标签数量,trie 在这种情况下可能会很好地工作。使用 trie,您可以构建标签前缀的树形数据结构。例如,如果您有“A”、“to”、“tea”、“ted”、“ten”、“i”、“in”和“inn”等标签,那么您将构建以下“前缀树” :
+ - i - + i + - n - + in + - n - + inn +
- A - + A +
- t - + t + - o - + to +
- e - + te + - n - + ten +
- a - + tea +
- d - + ted +
在这棵树中,“-字符-”表示边,“+字符串+”表示节点。一旦你构建了这个 trie,我会想象以下算法:
TrieNode root = rootOfTrie;
TrieNode current = root;
while (still typing)
{
switch (key pressed)
{
case letter:
if (current == null)
break;
bool found = false;
foreach (successor trie edge)
{
if (edge.Letter == letter)
{
current = sucessor edge.node;
found = true;
break;
}
}
if (!found)
current = null;
break;
case whitespace:
if (current != root && current != null && trie node is tag)
suggest node current as tag;
current = root;
break;
case backspace:
// You may want to handle this case by back-tracking in the trie.
current = null;
break;
default:
current = null;
break;
}
}
在 Wikipedia 上阅读更多 trie 数据结构:http://en.wikipedia.org/wiki/Trie
【讨论】:
理念——客户端+服务端解决方案:
您可能有一个标题文本字段,然后是另一个带有文章正文的输入(文本区域)。您需要一个在用户离开标题输入(或输入文本区域输入)时触发的事件。然后您可以从 textarea 中获取文本并将其与可用标签列表进行比较(如果您有数百个标签,这可能会很慢)。
如何比较:假设在服务器端,您生成了可用标签列表,并且您确实将该列表设置为页面上某个隐藏字段的内容。然后在客户端,您可以读取该隐藏字段的内容并将标签列表加载到某个列表变量。 (或者您可以为此使用ajax ..取决于您的技能)。现在您有了可用标签列表和一个句子(文章标题)。您可以拆分该句子并选择每个长度超过 2 个字符的单词(例如),然后检查该标签列表是否包含给定的单词(对于您从拆分中获得的每个单词)。
这个的伪代码:
foreach(string word in titleSplit)
{
if (listOfTags.contains(word))
{
// You have matching word-tag.
// Add it's text into your tags element, or to some collection
// which will be processed later on.
tags.add(word);
}
}
我需要更具体的上下文来提供更具体的答案(想法):)
【讨论】:
使用 HashSet 来存储您的标签。
以下文章供参考:
【讨论】: