Как моделировать интерпретации рэпа - PullRequest
27 голосов
/ 20 августа 2009

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

альтернативный текст http://img146.imageshack.us/img146/6882/clocal.png

(Оригинальная лирика подверглась цензуре; нажмите здесь , чтобы увидеть их)

В любом случае, мой вопрос заключается в том, как смоделировать эти аннотации в моем приложении. Прямо сейчас я храню текст и аннотации в виде одного большого куска HTML в следующем формате:

<div class="lyrics">
  With the goons I spy
  <a href="#note1">Stay in tune with ma</a>
  <a href="#note2">She like damn
  This the realest since 'Kumbaya'</a>
  Kumbayay Killa Cam my lord 
</div>

<div class="annotations">
  <div id="note1">
"Ma" refers to ladies, generally, and specifically also the woman singing the hook;  "Stay in tune" is a musical metaphor: he literally stays in tune with the singer and also in the sense that he has game.
  </div>
  <div id="note2">
Kumbaya is a campfire singalong.
  </div>
</div>

, а затем обработать его с помощью этого метода для вывода:

class Song < ActiveRecord::Base
  include ActionView::Helpers

  def annotated_lyrics
    lyrics = read_attribute('annotated_lyrics')
    return if lyrics.blank?

    require 'hpricot'
    doc = Hpricot lyrics

    doc.at('.lyrics').inner_html = doc.at('.lyrics').inner_html.strip
    doc.search("a[@href^='#note']").set('class', 'tooltip').each do |t|
      t.inner_html = t.inner_html.strip
    end
    doc.search("div[@id^='note']").set('class', 'annotation').each do |a|
      a.inner_html = auto_link(a.inner_html.strip, :all, :target => '_blank')
    end
    simple_format doc.html.strip
  end
end

и все остальное я делаю с jQuery и фантастическим qTip плагином.

Это прекрасно работает для отображения, но, поскольку мое приложение не знает о связи между аннотациями и текстами, будет трудно, скажем, добавить интерфейс для обновления отдельной встроенной аннотации (или вообще вообще).

С другой стороны, я не знаю, как лучше всего представить это в ActiveRecord. Я полагаю, что песня может иметь аннотации "have_many", но как бы я представлял, какие тексты были аннотированы? Я мог бы сохранить индекс начала и конца слова, но это кажется болезненным и чувствительным к незначительным изменениям в тексте.

Ответы [ 5 ]

8 голосов
/ 29 августа 2009

А как насчет того, чтобы представить текст такой песни (с благодарностью Народному чемпиону)?

Well it's that [grain grippa][1] from Houston, Tex
That bar sippa, that bar no plex
I'm straight up outta that [Swishahouse][2]
Where G. Dash write all the checks
So [check the neck, check the wrist][3]
I'm balla status from head to toe

[1]Referring to the wood grain steering wheel common to luxury cars
[2]Swisha House is the record label Paul Wall records for
[3]"Look at my watch and necklace because they are expensive"

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

Итак, для базы данных создайте таблицы Lyric, LyricLine и Annotation. Аннотации имеют значения LyricLineIds, StartChar и EndChar и поле Значение или Описание. Лирические строки - это текст каждой строки, связанный с лирической сущностью LyricIds. Тексты песен хранят информацию о песне, информацию о языке, что угодно.

Этот формат должен быть довольно простым для генерации из базы данных, и его преимущество в том, что он более «читабелен», чем XML, и может редактироваться на месте, так что вы можете протестировать его намного проще, прежде чем разрабатывать весь пользовательский интерфейс. .

Мне понравился этот вопрос, и я с нетерпением жду возможности увидеть прогресс сайта. Интересная работа!

3 голосов
/ 20 августа 2009
  1. Токенизируйте свою лирику, чтобы вы могли идентифицировать слово в лирике, используя, например, строка и номер слова. Другим вариантом является использование позиций символов для ваших аннотаций. В любом случае, как всегда, позаботьтесь о кодировке текста песни.
  2. Далее, никогда больше не трогай текст. Лучше не хранить их как HTML, но как XML или как простой текст.
  3. Не комментируйте в текстах. Используйте модель, в которой вы можете прикрепить позицию в тексте к аннотации. Используйте аннотацию-отступ.

Отдельная аннотация позволит вам со временем добавлять больше функций, например, позволять многим пользователям комментировать один и тот же текст. Генерирование HTML-кода, который вы храните в виде большого двоичного объекта, легко сделать из скрытых аннотаций.

Возможно, вас заинтересуют (xml) модели данных инструментов аннотаций, которые достаточно хорошо известны среди лингвистов: например, MMAX2 и Каллисто. Они легко конвертируются в модели баз данных.

1 голос
/ 02 ноября 2010

XML также будет отличной моделью.

<song>
  <title>...</title>
  <lyrics>
    <verse>
      <line>Well it's that <dd>grain grippa</dd><dt>Referring to the wood grain steering wheel common to luxury cars</dt> from Houston, Tex</line>
      <line>That bar sippa, that bar no plex</line>
      <line>I'm straight up outta that <dd>Swishahouse</dd><dt>Swisha House is the record label Paul Wall records for</dt></line>
      <line>Where G. Dash write all the checks</line>
      <line>So <dd>check the neck, check the wrist</dd><dt>"Look at my watch and necklace because they are expensive"</dt></line>
      <line>I'm balla status from head to toe</line>
    </verse>
    <chorus>
      <line>...</line>
    </chorus>
    <verse>...</verse>
    <repeat-chorus/>
  </lyrics>
</song>

Довольно легко редактировать и обновлять. Создание пользовательского интерфейса для него, вероятно, не составит труда. Если вы открыли создание записей для общественности, вы можете изменить <dd> и <dt> на <phrase> и <definition>. Но dd и dt - это стандарт HTML, поэтому я использовал их в первую очередь. Это позволит вам использовать простой CSS для придания ему стиля с небольшой любовью от JavaScript, чтобы он выглядел потрясающе. (Кстати, сайт потрясающий.)

0 голосов
/ 20 августа 2009

Что касается связывания аннотаций и текстов песен, у вас может быть несколько подходов:

  1. Ссылка, как предлагается выше, аннотации на точные места в текстах (например, номера строк, слова символы).

  2. Создание словарных фраз / слов <-> аннотации. Непосредственно перед отображением поиска словарь и вставьте в страницу аннотации. Если скорость или специфичность касается каждой записи в Словарь может быть помечен соответствующими песнями. Если вы хотите, чтобы ваши аннотации были небольшие изменения в тексте, чем при поиске совпадений в тексте для использования аннотированной фразы Самая длинная метрика общей подпоследовательности .

  3. Объединение № 1 и № 2

0 голосов
/ 20 августа 2009

Ваш первый инстинкт установки ассоциаций с песней, имеющей много аннотаций, определенно сработает. Два возможных подхода к хранению индексов запуска и остановки аннотации:

  1. Сохраните начальную и конечную строки, в которых произошла лирика (считайте разрывы строк в вашем файле лирики)

или

  1. Сохраните начальную и конечную границу слова (или просто пробел), который обозначает аннотацию. Это, по крайней мере, позволит вам исправить большинство опечаток, не нарушая индекс аннотации.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...