如何根据标签列表自动生成文章中的标签?

时间:2011-04-16 02:14:48

标签: c# .net asp.net tags

当用户撰写文章时,我想根据现有标签列表自动生成用户写入的标签。

例如,我得到了一个列表:

曼哈顿 布鲁克林 皇后 ....

如果用户写了一篇包含这些关键词的文章,它就会出现在标签上。

就像用户有标题:“今天我在曼哈顿滑冰”,然后曼哈顿应该包含标签。

我曾考虑过预先标记列表,但如果标记列表变得很大,则速度非常慢。

你们有没有自动生成标签的解决方案?或者有任何想法实现这个问题?

提前感谢。

3 个答案:

答案 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)