Как автоматически генерировать теги из статьи, основываясь на списке тегов? - PullRequest
0 голосов
/ 16 апреля 2011

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

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

Manhattan Brooklyn Квинс ....

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

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

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

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

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

Ответы [ 3 ]

1 голос
/ 16 апреля 2011

В зависимости от количества тегов, которые у вас есть, три в этом случае может хорошо работать.С помощью 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 +

В этом дереве "- символ -" обозначает ребро, а "+ строка +" обозначает узел.После того, как вы построили это дерево, я представляю следующий алгоритм:

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;
   }
}

Подробнее о структурах данных дерева в Википедии: http://en.wikipedia.org/wiki/Trie

0 голосов
/ 16 апреля 2011

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

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

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

0 голосов
/ 16 апреля 2011

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

Возможно, у вас есть заголовок текстового поля, а затем другой ввод (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);
    }
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...