このプロジェクトでは、映画データをテーマとし、データの収集、処理、分析、データの視覚化をプロジェクトプロセスとして採用し、数百万の映画データのオフライン処理と計算を実現できます。
プロジェクトリンク:https://github.com/GoAlers/Bigdata-movie
開発環境:IDEA + Pycharm + Centos7.0 + hadoop2.8 + hive2.3.0 + hbase2.0.0 + mysql5.7 + sqoop
- 1. Hadoopビッグデータプラットフォームのインストールとデプロイ、基本構成、パラメーターの最適化、および関連するコンポーネントのデプロイと管理を担当します。
- 2.クローラーが大量の映画データとデータクリーニングを収集し、ワードマップクラウド、matplotlibチャート、およびEchartsデータの視覚化を行う責任を負う分散ビッグデータプラットフォームを構築します。
- 3. Python / Javaを使用してMRプログラミングを記述し、特定の映画の統計をオフラインで計算します。sqoopツールを使用してデータを転送し、ハイブを使用して関連データを分析します。
- 4.機械学習アルゴリズムと関連ライブラリを使用して、映画レビューの感情分析を実現し、ユーザーの評価範囲と興行収入を予測し、合計スコアのtopNをカウントします。
1.データ収集(pachong.py)、クリーニング:Douban映画データを収集し、映画ボックスオフィスの総収入のランキングを取得し(上位20を取得)、冗長で空の単語を削除し、PythonのPyMysqlライブラリを使用してローカルMysqlデータベースに接続しますムービーテーブルは、データを視覚的に表示するためにデータをローカルに保存したり、ビッグデータ分析のためにビッグデータのHiveデータウェアハウスツールにデータをインポートしたりできます。
ソート | 映画名 | の種類 | 総興行収入(1万) | ゲームごと | 発売日 |
1 | ウルフウォリアー2 | アクション | 567928 | 38 | 2017/7/27 |
2 | ネザの悪魔の少年が世界にやってくる | アニメーション | 501324 | 24 | 2019/7/26 |
3 | 流転の地球 | SF | 468433 | 29 | 2019/2/5 |
4 | アベンジャーズ4:エンドゲーム | アクション | 425024 | 23 | 2019/4/24 |
5 | オペレーションレッドシー | アクション | 365079 | 33 | 2018/2/16 |
6 | 僕はチャイナタウン2 | コメディ | 339769 | 39 | 2018/2/16 |
7 | マーメイド | コメディ | 339211 | 44 | 2016/2/8 |
8 | 私と我和我的祖国 | プロット | 317152 | 36 | 2019/9/30 |
9 | 私は薬の神ではありません | プロット | 309996 | 27 | 2018/7/5 |
10 | 中国の船長 | プロット | 291229 | 27 | 2019/9/30 |
2.データの視覚化:データの視覚化は、データをより直感的で分析しやすくすることができます。視覚化技術は、データ分析とマイニングの最も重要なコンテンツであると言えます。Matplotlibは、Python言語に基づくオープンソースプロジェクトとして、Python用のデータプロットパッケージを提供して、プロフェッショナルで豊富なプロット機能を実現することを目指しています。
(1)映画興行ランキング
(2)映画レーティングランキングdouanscore.py
(3)Echartsが最近公開した映画
Echartsは主にデータの視覚化と表示に使用され、既存のほとんどのブラウザと互換性のあるオープンソースのJavaScriptライブラリです。Pythonでは、Echartsはデータ視覚化ツールライブラリであるPyechartsにパッケージ化されています。従来の折れ線グラフ、ヒストグラム、散布図、円グラフなど、直感的で豊富なカスタマイズ可能なデータ視覚化グラフを提供します。
(4)映画「囧ママ」の短い解説情報
元日映画「囧ママ」がインターネットで初公開されました。これまでのところ、そのドゥバン映画は6.0ポイントを獲得しています。ケース分析は、映画「囧ママ」のドゥバン人気の短いコメントを通じて行われ、データクロールはデータ収集ツールとしてOctopusソフトウェアを使用して実行されます。収集されるフィールドには、ユーザー名、評価、いいねの数、コメントコンテンツが含まれ、通常の式を使用してフィールドタグと一致します。DoubanMoviesが提供する評価スターシステムによると、推奨どおり、推奨、大丈夫、悪い、非常に悪いが表示されます。評価、フルスコアは5つ星、データ形式は次のとおりです。
(7)Pythonの単語頻度統計wordcount.py
3.ビッグデータ分析:
ビッグデータ処理の最も重要な部分はデータ分析です。データ分析は通常、バッチ処理とストリーム処理の2つのタイプに分けられます。バッチ処理は、処理フレームワークMapreduce、Sparkなどに対応する、一定期間内の大量のオフラインデータの統合処理です。ストリーム処理は、動的なリアルタイムデータ処理、つまり、データを受信しながら処理するためのものです。処理フレームワークには、Storm、Spark Streaming、Flinkなどが含まれます。この記事では、オフライン計算に焦点を当て、映画データ分析を紹介します。
(1)Mapreduceオフライン計算(mapreduce_hiveファイル)
Mapreduceプログラミングの単語頻度統計は、主に単語数のアイデアを使用し、所定の形式に従って単語と文を分割することによって単語頻度統計を実現します。統計データは、歴史映画のリリース情報です。マップステージは、主に単語のセグメンテーション統計を担当します。マップステージは、各文字列をキーと値のペアにマップし、単語を行ごとに(words、1)形式にマップします。シャッフルプロセスは結果をパーティション化してソートし、同じパーティションの出力に従って結合してディスクに書き込みます。最後に、パーティション化されたファイルが取得されます。最後に、reduceステージは各単語の数を要約してカウントし、データは最終的にHDFSに保存されます。この記事では、映画の単語を統計オブジェクトとして取り上げ、単語頻度統計の機能を実現します。単語頻度統計のフローチャートは次のとおりです。
マップステージコード:
インポートシステム
sys.stdinの行の場合:
ss = line.strip()。split( '')
ssのsの
場合:if s.strip()!= "":
print "%s \ t%s"%(s、1 )。
フェーズコードを減らす:
import sys
current_word = None
count_pool = []
sum = 0
sys.stdinの行の場合:
word、val = line.strip()。split( '\ t')
if current_word == None:
current_word = word
if current_word!= word:
for count in count_pool:
sum + = count
print " %s \ t%s "%(current_word、sum)
current_word = word
count_pool = []
sum = 0
count_pool.append(int(val))
for count in count_pool:
sum + = count
print"%s \ t%s " %(current_word、str(sum))
(2)Hiveデータウェアハウス
HiveはHadoopベースのデータウェアハウスツールであり、主に大規模な構造化ログのデータ統計を解決するために使用されます。構造化データファイルをテーブルにマッピングし、SQLのようなステートメントを使用してテーブル内のデータをクエリおよび統計的に分析できます。Sqoopデータ転送ツールを使用して、Mysqlデータベース情報をHiveデータウェアハウスにインポートします。
Hiveを使用すると、大量のデータ分析を実現でき、カスタム関数をサポートするため、MapReduceプログラミングが不要になります。この記事では、Doubanの過去の映画データに関する統計を行います。データがクリーンアップされ、null値と冗長なアイテムが削除された後、100,000を超える映画データが取得されます。一部のデータ形式は次のとおりです。
(3)映画の種類と興行成績movietype.py
(5)監督と映画タイプdirector.pyの関係
(6)映画の興行収入の予測(Eチケットの興行収入の予測.xls)
(7)映画音楽予測scorepredict.py
機械学習sklearnライブラリを使用して回帰モデルを構築し、5人のユーザーをランダムに選択してスコアを計算し、新しい映画のユーザーの評価範囲を予測し、最大、最小、平均の評価を出力します。
#encoding:utf-8
import numpy as np
import
pandas as pd import matplotlib.pyplot as plt
import re
from sklearn.linear_model import LinearRegression
#描画パーツデータ= pd.read_csv( 'lianxi / film-csv.txt'、encoding = 'utf-8'、delimiter = ';')
#ファイルデータの読み取り= data.iloc [:、:-1]#削除ファイル内の不正なデータ
data = data.drop(0).drop_duplicates()。reset_index()。drop( 'index'、axis = 1)#最初の行が空のデータを削除し、インデックスをリセットするため
#印刷データ
t = [] #range
(len(data))内のiの複数の
除算器に従ってムービータイプを分割します:a = re.split(u '/ | / |、|、| |'、data [u'movie Type ' ] [i])
for j in a:
t.append(j)
t = set(t)#繰り返されるタイプを削除します
tt = []
for i in t:#非標準タイプを削除して、既存のすべてのタイプを取得します。
if(len(i)<= 2)|(i == u '
合家欢'):tt.append(i)
#スコア予測
ID = [1050,1114,1048,1488,1102]#5つのユーザーIDデータ1
= pd.read_csv( 'lianxi / score.log'、delimiter = '、'、encoding = 'utf-8'、header = 0、names = [u'movie name '、u'userid'、u'score '])
data1 = data1 [data1 [u'userid']。isin(id)]#5つのユーザー関連データを削除します
data1 [u'movie name '] = data1 [u'movie name']。str.strip()#映画名のスペースを削除
しますall = [] #kの予測結果
をrange(len(id )):
#予測のための5回のモデリングのサイクルdfp1 = data1 [data1 [u'userid '] == id [k]]。reset_index()。drop(' index '、axis = 1)
datamerge = pd.merge(data上、DFP1、= U '电影名')#Using新しいユーザ評価と映画の内容をマージするマージを
LST = []
LSD = []
LSR = []
iの範囲内(LEN(datamerge)のために):#Separate映画の種類そして、
ttのjの監督と対応するボックスオフィス:
if j in datamerge [u'movie type '] [i]:
d = re.split(u'、|、| / | '、datamerge [u'ディレクター '] [i])
for k in d:
lsd.append(k.replace(u' '、u' '))
lst.append(j.replace(u' '、u' '))
lsr.append( datamerge [u 'スコア'] [i])
lsd1 = list(set(lsd))
for i in range(len(lsd1)):#映画の種類と興行収入を機械トレーニング用の連続量に変換します
for j in range(len(lsd)):
if lsd1 [i] == lsd [j]:
lsd [j] = i + 1
for i in range(len(tt)):
for j in range(len(lst )):
if tt [i] == lst [j]:lst
[j] = i + 1
lsd = pd.DataFrame(lsd、columns = [u '誘導演'])
lst = pd.DataFrame(lst、columns = [u '
影片クラス型'])lsr = pd.DataFrame(lsr、columns = [u '评分'])
a = pd.concat([lsd、lst、lsr]、axis = 1)
print(a)
trainx = a.iloc [:、0:2]#映画の種類と監督を特徴量として
trainy = a.iloc [:、2:3]#サンプル値としてのスコア
l =
LinearRegression()#モデリングl.fit(trainx、トレーニング)#トレーニング
anstest = pd.DataFrame([[5,10]]、columns = [u'director '、
u'film type'])ans = l.predict(anstest)
#predict all.append(ans [0] [0] )#結果を取得
print(u 'スコアの最大値は' + '%。2f'%max(all))
#output print(u 'スコアの最小値は' + '%。2f'%min(all))
print (u 'スコアの中央値は' + '%。2f'%np.median(all))
print(u 'スコアの平均値は' + '%。2f'%np.mean(all))