2010-06-16 2 views
2

У меня очень большая база данных статей различной длины. В статьях есть элементы HTML. Я должен вставить некоторые объявления (простые < скрипт > элементов) в теле каждой статьи, когда она отображается (я знаю, я ненавижу объявления, которые прерывают чтение).Алгоритм разделения статьи без нарушения потока чтения или кода HTML

Проблема заключается в том, что каждое объявление должно быть вставлено примерно в одну позицию в каждой статье. Самое простое решение - просто разбить статью на фиксированное количество символов (без разрыва слов) и вставить рекламный код. Это, однако, рискует вставить объявление в середине тега HTML.

Я мог бы пойти регулярки пути, но я думал о следующем решении, с помощью JS:

  1. Установить подсчитывать персонаж порога. Например, «добавление должно быть вставлено примерно в 200 слов».
  2. Установленные принятые отклонения в каждом направлении, скажем -20, +20 символов.
  3. Петля через каждый текстовый узел внутри статьи, и при этом, сохранить количество от общего количества символов до сих пор
  4. После того, как счетчик превышает пороговое значение, сделайте следующее решение:

    4.1 , Если счетчик превышает пороговое значение на значение ниже, чем положительное принятое отклонение (например, 17 символов), вставьте рекламный код сразу после текущего текстового узла.

    4.2. Если счетчик больше суммы порога и отклонения, откат назад к предыдущему текстовому узлу и принятие того же решения, только на этот раз используйте предыдущий счетчик и проверьте, меньше ли это разницы между порогом и отклонением , а если нет, вставьте объявление между текущим узлом и предыдущим.

    4.3. Если сбой 4.1 и 4.2 (что означает, что предыдущий узел достиг слишком низкого количества символов, а текущий узел - слишком высокий), вставьте объявление после любого количества символов, необходимого в текущем элементе.

Я знаю, что это запутанное, но это первая вещь из моего ума, и она имеет то преимущество, что, пытаясь вставить объявление между текстовыми узлами, возможно, он не будет нарушать поток статьи как плохо как это было бы, если бы я просто вставить его в (как конечного 4,3 случая)

Вот некоторые псевдо-код, который я поставил вместе, я не доверяю своим англо-объясняя навыки:

threshold = 200 
deviation = 20 
current_count = 0 

for each node in article_nodes { 
    previous_count = current_count 
    current_count = current_count + node.length 
    if current_count < threshold { 
     continue // next interation 
    } 

    if current_count > threshold + deviation { 
     if previous_count < threshdold - deviation { 
      // insert ad in current node 
     } else { 
      // insert ad between the current and previous nodes 
     } 
    } else { 
     // insert ad after the current node 
    } 

    break; 
} 

Am Я слишком усложняю материал, или я пропускаю более простое и элегантное решение?

PS: на стороне сервера и на стороне клиента все в порядке.

+0

Если объявления являются элементами сценария, действительно ли важно, где вы их размещаете? Может быть, вы можете привести пример? – 2010-06-16 19:17:25

+0

Это важно, потому что то, что эти объявления в основном делают, - это вставлять содержимое в их местоположение на странице. У меня даже нет примера, потому что у меня нет никакого контроля над тем, какие объявления будут отображаться, откуда издатель и т. Д., Извините. –

+0

Вероятно, вы должны определить свой «счет» символов как символы без пробелов. – gnarf

ответ

1
  1. Я бы вставлял объявление в идеале при разрыве абзаца (возможно, в теге p) или в разрыв строки (возможно, в теге br).

Несоблюдение этого требования при слове break. И в противном случае заставьте его между персонажами. (Чтобы охватить странные угловые случаи.)

Итак, вот К.И.С.С. Решение:

  1. Считайте буквы, слова, строки и абзацы, как вы идете.

Просто сделать сбой каскадного в стороне предпочтительного решения:

  1. если вы получите до 2000 chracters - только силой в рекламе и начать отсчет снова все с нуля.

Этого никогда не будет, кроме как в странных случаях.

  1. Если вы добираетесь до 250 слов - просто вставляйте объявление и начинайте считать все снова с нуля.

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

  1. Если вы получите 50 новых линий - только силой в рекламе и начать отсчет снова все с нуля ,

Это случалось бы иногда, когда писатели не использовали перерывы в параграфах.

  1. И, наконец, если вы доберетесь до 3 новых абзацев - положите в объявление и начните считать все снова с нуля.

Это то, что обычно случается.

I не будет беспокоиться о сложных идеях, таких как возврат в близлежащие кейсы и т. Д. Это просто не стоит. Это почти всегда дает вам лучшее общее долгосрочное решение для принятия последовательных простых «каскадных отказов». Сделайте это, и все готово!

Это гораздо больше, чем наука, чем-то вроде этого. Вам понравится выше, надеюсь, что это поможет!

Очевидно, мелодия числа, которые я поставил в псевдокоде выше. Большая часть работы на такой работе - тюнинговые параметры на фактическом стенде. Написание самого кода - ничто, вам нужно создать хороший тестовый стенд, чтобы вы могли сделать это перед вашими глазами и увидеть, как он работает (в идеале - «циферблаты» для параметров, чтобы вы могли видеть результаты в реальном времени, вы знаете?) Вот как ты это делаешь!

Смежные вопросы