как автоматически генерировать теги из статьи на основе списка тегов?

#c# #.net #asp.net #tags

#c# #.net #asp.net #Теги

Вопрос:

когда пользователь пишет статью, я хочу автоматически генерировать теги из базы пользовательских записей в существующем списке тегов.

например, я получил список, подобный:

Манхэттен, Бруклин, Квинс….

если пользователь напишет статью, содержащую эти ключевые слова, она попадет в теги.

если у пользователя есть заголовок: «Сегодня я катался на коньках в Манхэттене», то в Manhattan должны быть включены теги.

я рассматривал возможность создания списка тегов foreach, но это очень медленно, если список тегов достигает большого размера.

У вас, ребята, есть какие-нибудь решения для автоматической генерации тегов? или есть какие-либо идеи по реализации этой проблемы?

заранее спасибо.

Ответ №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 amp;amp; current != null amp;amp; 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

Ответ №2:

Идея — решение на стороне клиента сервера:

Вероятно, у вас есть текстовое поле заголовка, а затем другой ввод (textarea) с текстом статьи. Вам нужно событие, которое запускается, когда пользователь покидает ввод заголовка (или вводит ввод текстовой области). Затем вы можете взять текст из textarea и сравнить его со списком доступных тегов (это может быть довольно медленно, если у вас сотни тегов).

Как сравнить: Предположим, что на стороне сервера вы сгенерировали список доступных тегов и установили этот список в качестве содержимого некоторого скрытого поля на странице. Затем на стороне клиента вы можете прочитать содержимое этого скрытого поля и загрузить список тегов в некоторый list 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);
    }
}
  

Мне нужен более конкретный контекст, чтобы предоставить более конкретный ответ (идея) 🙂

Комментарии:

1. Привет, Дэмп, спасибо за твой быстрый ответ, проблема в том, что у меня тысячи тегов, если использовать все теги, то, как ты и сказал, это будет очень медленно.

2. Ах, тогда, я думаю, это не в моей лиге: X Я не знаю, как выполнить такой оптимизированный поиск.

3. если ваш список тегов находится в памяти, хэш-таблица будет быстрой … с другой стороны… индексированная таблица в базе данных также может выполнять эту работу…

Ответ №3:

Используйте HashSet для хранения ваших тегов.

Ниже статья для справки:

http://social.msdn.microsoft.com/Forums/en-US/csharplanguage/thread/6a994e32-efc3-4f4b-8b60-ab357d5c1020/