当用户撰写文章时,我想根据现有标签列表自动生成用户写入的标签。
例如,我得到了一个列表:
曼哈顿 布鲁克林 皇后 ....
如果用户写了一篇包含这些关键词的文章,它就会出现在标签上。
就像用户有标题:“今天我在曼哈顿滑冰”,然后曼哈顿应该包含标签。
我曾考虑过预先标记列表,但如果标记列表变得很大,则速度非常慢。
你们有没有自动生成标签的解决方案?或者有任何想法实现这个问题?
提前感谢。
答案 0 :(得分:1)
根据您拥有的标签数量,在这种情况下,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;
}
}
在维基百科上阅读更多trie数据结构:http://en.wikipedia.org/wiki/Trie
答案 1 :(得分:0)
创意 - 客户端+服务器端解决方案:
你可能有一个标题文本字段,然后是另一个带有文章正文的输入(textarea)。当用户离开标题输入(或输入textarea输入)时,您需要触发一个事件。然后你可以从textarea中获取文本并将其与可用标签列表进行比较(如果你有数百个标签,这可能会很慢)。
如何比较:假设在服务器端,您生成了可用标记列表,并且您确实将该列表设置为页面上某些隐藏字段的内容。然后在客户端,您可以读取该隐藏字段的内容并将标记列表加载到某些列表var。 (或者你可以使用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);
}
}
我需要更具体的背景来提供更具体的答案(想法):)
答案 2 :(得分:0)