Некоторое время тому назад я писал (http://dastapov.dreamwidth.org/78794.html) о скрипте, с помощью которого я извлекаю данные о фильмах с сайта imdb.com. После нескольких недель эксплуатации скрипт оброс дополнительными возможностями, главная из которых - "декодирование" оценки фильма с помощью IMDB Movie Decoder Ring.
Что это за "декодирование" и зачем оно нужно? А для того, чтобы ответить на вопрос: "фильм с оценкой 6.1 - это фильм плохой, хороший или так себе?". Если бы оценки посетителей были бы распределены равномерно в интервале от 1 до 10, то можно было бы утверждать, что фильм с оценкой 6.1 - скорее хороший, чем средний. Однако фильмов с оценкой 1 и 2 на imdb.com почти нет, а фильмов с оценкой в интервале [5;7] - очень много. Как же можно содержательно интерпретировать оценку?
Например, так: можно заменить оценку X на процентное отношение фильмов, имеющих оценку <=X, к общему количеству фильмов. Если более 50% фильмов в базе imdb.com имеют оценку <=X, то можно считать, что фильм - скорее хороший. Более того, подобные процентные отношения можно рассчитать отдельно для всех жанров, к которым относится фильм, и тогда можно будет ответить на вопрос, как выбранная нами мелодрама (жанры Comedy, Drama) соотносится с другими комедиями и драмами.
Чтобы не выполнять каждый раз обработку всей базы imdb, Tom Moertel свел подобные расчеты в удобную компактную таблицу, которую он назвал IMDB Movie Decoder Ring. Табличка эта предназначена для использования вручную, но я, как человек ленивый, тоже не захотел связываться с обработкой сырых данных с imdb.com, и запихнул эту табличку в свой скрипт. Теперь в таблице результатов добавились две колонки: процент всех фильмов, оцененных ниже, чем этот, и (в отдельной колонке) подобные проценты по всем жанрам фильма, через запятую.
В результате можно выяснить, что, например, фильм "Broken English (2007)", имеющий оценку 6.3 -- едва-едва попадает в категорию "скорее хорошие". Он "лучше" всего 51% фильмов в базе imdb. Кроме того, если посмотреть на его положение в каждом из жанров -- Comedy, Drama, Romance -- то окажется, что он лучше 55% комедий, но - всего лишь 42% драм и 46% романтических фильмов. Получается, что для комедии оценка 6.3 - это "хорошо", а для драмы - всего лишь "удовлетворительно.
Полный текст скрипта - под катом.
Вот скрипт:
Рядом надо положить файл decoder-ring следующего содержания (поля разделены табуляциями):
Что это за "декодирование" и зачем оно нужно? А для того, чтобы ответить на вопрос: "фильм с оценкой 6.1 - это фильм плохой, хороший или так себе?". Если бы оценки посетителей были бы распределены равномерно в интервале от 1 до 10, то можно было бы утверждать, что фильм с оценкой 6.1 - скорее хороший, чем средний. Однако фильмов с оценкой 1 и 2 на imdb.com почти нет, а фильмов с оценкой в интервале [5;7] - очень много. Как же можно содержательно интерпретировать оценку?
Например, так: можно заменить оценку X на процентное отношение фильмов, имеющих оценку <=X, к общему количеству фильмов. Если более 50% фильмов в базе imdb.com имеют оценку <=X, то можно считать, что фильм - скорее хороший. Более того, подобные процентные отношения можно рассчитать отдельно для всех жанров, к которым относится фильм, и тогда можно будет ответить на вопрос, как выбранная нами мелодрама (жанры Comedy, Drama) соотносится с другими комедиями и драмами.
Чтобы не выполнять каждый раз обработку всей базы imdb, Tom Moertel свел подобные расчеты в удобную компактную таблицу, которую он назвал IMDB Movie Decoder Ring. Табличка эта предназначена для использования вручную, но я, как человек ленивый, тоже не захотел связываться с обработкой сырых данных с imdb.com, и запихнул эту табличку в свой скрипт. Теперь в таблице результатов добавились две колонки: процент всех фильмов, оцененных ниже, чем этот, и (в отдельной колонке) подобные проценты по всем жанрам фильма, через запятую.
В результате можно выяснить, что, например, фильм "Broken English (2007)", имеющий оценку 6.3 -- едва-едва попадает в категорию "скорее хорошие". Он "лучше" всего 51% фильмов в базе imdb. Кроме того, если посмотреть на его положение в каждом из жанров -- Comedy, Drama, Romance -- то окажется, что он лучше 55% комедий, но - всего лишь 42% драм и 46% романтических фильмов. Получается, что для комедии оценка 6.3 - это "хорошо", а для драмы - всего лишь "удовлетворительно.
Полный текст скрипта - под катом.
Вот скрипт:
#!/bin/bash
# Decoder ring taken from http://community.moertel.com/ss/space/IMDB+Movie-Rating+Decoder+Ring
request="$@"
file="imdb_dump.html"
decoder="decoder-ring"
wget -q -U Firefox "http://www.google.com/search?q=$request site:imdb.com&btnI=I\`m Feeling Lucky" -O "$file"
title=$(grep "<title>" "$file" | sed -e 's/<[^ ]*>//g')
rating=$(grep -A1 "<b>User Rating:</b>" "$file" | grep -o '[0-9][0-9./]*' | sed -e 's/\/.*//')
votes=$(grep -o '[0-9,]* votes' "$file")
genre=$(grep -A1 "<h5>Genre:</h5>" "$file" | grep -o ">[A-Z][a-zA-Z]*<" | sed -e 's/[<>]//g' \
| paste - - - - - - - - - | sed -e 's/[ \t]*$//' -e 's/\t/,/g')
url=http://www.imdb.com/$(grep -o 'title/tt[0-9]*' "$file" | head -1)
runtime=$(grep -A1 Runtime "$file" | tail -1)
column=1
r=$(echo $rating | sed -e 's/\.//' -e 's/$/0/' )
if [ -n "$r" ] ; then
for treshold in 400 500 525 550 575 600 625 650 675 700 725 750 775 800 825 850 875 900 1000 ; do
if [ "$r" -le "$treshold" ] ; then break
else column=$(( $column + 1 ))
fi
done
all_genres_rating=$(head -1 $decoder | cut -f $column)
rating_regexp=$(echo $genre | sed -e 's/,/\|/g')
per_genre_rating=`grep -E "($rating_regexp)" $decoder | cut -f $column \
| paste - - - - - - - - - | sed -e 's/[ \t]*$//' -e 's/\t/,/g'`
fi
echo "$request|$title|$url|$genre|$runtime|$rating|$votes|$all_genres_rating|$per_genre_rating" | tee -a movies.csv
Рядом надо положить файл decoder-ring следующего содержания (поля разделены табуляциями):
All genres 10 23 27 33 39 46 51 60 66 74 79 86 89 93 95 97 98 99 Action 22 40 44 51 56 61 66 73 77 82 85 89 91 93 95 96 97 98 Adult 1 9 18 49 73 92 96 98 98 99 99 99 ++ ++ ++ ++ ++ ++ Adventure 14 30 33 41 46 52 56 65 69 75 78 83 86 91 93 95 96 97 Animation 4 15 18 24 28 33 35 44 48 57 62 69 76 84 89 94 96 98 Biography 3 5 7 12 15 23 29 40 50 62 70 83 87 94 97 99 ++ ++ Comedy 9 23 27 35 40 48 55 64 71 78 84 90 93 95 97 98 99 99 Crime 7 20 24 31 37 45 52 63 69 76 81 89 92 95 97 98 99 99 Documentary 5 11 13 16 19 22 25 32 37 46 53 66 73 83 88 93 96 98 Drama 4 13 16 22 27 35 42 53 60 71 78 87 91 96 97 99 99 ++ Family 14 34 39 48 55 62 66 76 80 86 88 92 94 97 98 99 99 99 Fantasy 13 26 30 38 45 52 56 65 69 76 79 84 87 91 93 95 96 97 Game Show 29 29 29 29 29 43 43 43 43 43 43 43 57 71 71 71 71 71 History 2 4 4 8 10 14 18 26 33 45 51 64 74 84 89 94 96 98 Horror 35 56 61 68 72 78 81 86 89 92 93 96 96 97 98 98 98 99 Music 7 14 16 20 24 30 34 40 47 53 60 68 74 82 87 91 95 97 Musical 8 18 19 27 31 37 44 52 60 71 77 85 90 95 97 98 99 ++ Mystery 7 21 26 33 38 46 51 62 69 78 81 86 89 93 95 96 98 98 News 0 0 0 0 20 40 40 40 40 40 40 60 60 60 60 60 60 60 Reality TV 28 40 40 52 56 60 64 64 68 68 72 72 80 84 88 92 92 96 Romance 4 14 17 24 30 39 46 59 66 76 82 89 93 97 98 99 99 ++ Sci-Fi 26 43 47 52 57 62 65 71 74 79 81 86 89 93 94 96 97 98 Short 4 8 9 12 15 19 23 30 37 49 57 72 77 87 93 97 98 99 Sport 8 20 24 30 35 45 52 64 68 76 81 88 91 95 97 98 99 ++ Talk Show 25 25 25 25 25 25 25 25 25 25 25 50 50 50 50 75 75 75 Thriller 15 35 40 48 54 62 67 75 80 86 88 93 95 97 98 98 99 99 War 5 9 11 15 18 23 28 34 43 50 59 71 77 86 92 95 97 99 Western 14 23 26 34 42 47 52 68 76 81 83 90 95 96 97 98 99 99
(no subject)
Date: 2008-04-12 04:28 am (UTC)(no subject)
Date: 2008-04-12 12:34 pm (UTC)