#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 для хранения ваших тегов.
Ниже статья для справки: