【问题标题】:how to automatically generate tags from a article, base on a tag list?如何根据标签列表从文章中自动生成标签?
【发布时间】:2011-04-16 02:14:47
【问题描述】:

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

例如,我有一个类似的列表:

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

如果用户写了一篇包含这些关键词的文章,它将来到标签。

like 用户的标题是:“今天我在曼哈顿滑冰”,那么曼哈顿应该包含标签。

我曾经考虑过foreach标签列表,但是如果标签列表变得很大,它会很慢。

你们有什么自动生成标签的解决方案吗?或者有任何想法来解决这个问题?

提前致谢。

【问题讨论】:

    标签: c# .net asp.net tags


    【解决方案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;
       }
    }
    

    在 Wikipedia 上阅读更多 trie 数据结构:http://en.wikipedia.org/wiki/Trie

    【讨论】:

      【解决方案2】:

      理念——客户端+服务端解决方案:

      您可能有一个标题文本字段,然后是另一个带有文章正文的输入(文本区域)。您需要一个在用户离开标题输入(或输入文本区域输入)时触发的事件。然后您可以从 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);
          }
      }
      

      我需要更具体的上下文来提供更具体的答案(想法):)

      【讨论】:

      • 您好 Dampe,感谢您的快速响应,问题是我有数千个标签,如果 foreach 所有标签,那么它会像您说的那样,非常慢。
      • 啊,那我想这超出了我的范围:X 我不知道如何进行这种优化搜索。
      • 如果你的标签列表在内存中,哈希表会很快……另一方面……数据库中的索引表也可以完成这项工作……
      【解决方案3】:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-01-07
        • 2018-06-21
        • 2021-11-01
        • 1970-01-01
        • 2019-08-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多