Django+node.js+MySQL+Jaccard 類似係数に基づくインテリジェントなニュース推奨システム - 機械学習アルゴリズム アプリケーション (すべての Python プロジェクト ソース コードを含む) + データセット


ここに画像の説明を挿入

序文

このプロジェクトは、ニュース記事内のキーワードを抽出し、これらのキーワードに基づいて関連ニュース コンテンツを取得するために使用される中国語単語分割ライブラリ jieba の技術的基盤に基づいて構築されています。このプロジェクトでは、Jaccard 類似性係数を使用して、異なるニュース記事間の類似性も計算しました。ユーザーがニュースを閲覧すると、システムはそのニュースに関連する他のニュースをインテリジェントに推奨できます。

まず、jieba単語分割データベースを利用してニュース記事の単語分割処理を行い、記事を単語に分割し、記事内のキーワードを特定します。これらのキーワードは記事のテーマと主要な内容を表します。

次に、抽出したキーワードをもとに他のニュース記事を検索し、類似したキーワードを含む記事を探します。これは、2 つのセットがどの程度類似しているかを測定する、異なる記事間の Jaccard 類似性係数を計算することで実現できます。

ユーザーが特定のニュースを閲覧していると、システムはニュースのキーワードや内容に基づいて他の関連ニュースを推奨します。この推奨システムは、ユーザーが関連するトピックやイベントをより深く理解できるように、より詳細な情報を提供します。

一般に、このプロジェクトは、jieba の単語分割技術と Jaccard の類似係数の計算に基づいたインテリジェントなニュース推奨システムを実装します。これにより、ニュース読者にとって、より豊かなニュース体験が提供され、関心のあるトピックやニュースイベントをより包括的に理解できるようになります。

全体的なデザイン

システムの全体構成図とシステムフローチャートを記載します。

システム全体構成図

システムの全体構成を図に示します。

ここに画像の説明を挿入

システムフローチャート

システムフローを図に示します。

ここに画像の説明を挿入

動作環境

この部分には、Python 環境、node.js フロントエンド環境、MySQL データベースが含まれます。

Python環境

このプロジェクトには Python 3.6 以降が必要です。Windows 環境では、Python に必要な構成を完了するために Anaconda をダウンロードすることをお勧めします。ダウンロード アドレスは https://www.anaconda.com/です使用されるパッケージは次のとおりです: Django==2.1PyMySQL==0.9.2jieba==0.39xlrd==1.1.0gensim==3.6.0

コマンド ライン ウィンドウに次のコマンドを入力して実行し、対応するバージョンの gensim パッケージをダウンロードします。

pip install gensim==3.6.0

他のパッケージも同様の方法でインストールされます。

node.jsフロントエンド環境

フロントエンド開発は、node.js 環境に依存し、Vue.js フレームワークを使用します。node.js の対応バージョンは 10.13 です。node.js 公式 Web サイトで、対応するシステムとバージョンを選択してインストールし、完了します。チュートリアルに従って Vue フレームワークを構築します。ダウンロードアドレスはhttps://nodejs.org/en/download/です。

インストールが完了したら、npmのグローバルモジュールが配置されているパスとキャッシュパスの環境設定を行い、2つのサブフォルダーnode_cacheと を作成しますnode_global

コマンド ライン ウィンドウに次のコマンドを入力して実行します (パスをローカル インストール パスに変更することを忘れないでください)。

npm config set prefix "D:\program files \nodejs\node_global"
npm config set cache "D:\program files\nodejs\node_cache"

「マイコンピュータ」→「プロパティ」→「システムの詳細設定」をクリックしてシステム設定インターフェースに入り、「詳細」→「環境変数」をクリックして構成インターフェースに入ります。

ユーザー変数パスにnode_globalフォルダーのパスを追加します。システム変数に NODE_PATH を追加します。これにより、node_cache フォルダーへのパスが入力されます。

node.js をベースに、npm を使用して関連する依存関係をインストールしますが、ここでは国内の淘宝網ミラー npm を使用することをお勧めします。

必要なテンプレート フレームワークの構築に役立つグローバル vue-cli スキャフォールディングをインストールするには、コマンド ラインに次のように入力します。

cnpm install -g vue-cli

インストールが完了したら、コマンド ライン ウィンドウに vue (小文字) と入力します。コマンド ライン ウィンドウに vue 情報が表示されたら、インストールが成功したことを示します。vue-V と入力してバージョンを表示できます。

MySQLデータベース

データは MySQL データベースに保存され、フロントエンドにコンテンツを提供し、バックエンドに計算を提供します。このプロジェクトはデータベース サーバー MySQL Community Server (GPL) - 5.6.39 を使用します。MySQL に移動して、ダウンロードする対応するバージョンを選択できます。公式 Web サイトのアドレスはhttps://www.mysql.com/downloads/です。node.js と同様に、MySQL の環境変数を設定し、システム変数でパスを選択し、MySQL ファイルの下の bin ファイルのパスを入力します。

管理者としてコマンド ライン ウィンドウを実行し、次のコマンドを入力して MySQL bin ファイルを入力します。

cd D:\program files\MySQL\mysql-5.6.39-winx64\bin

次のコマンドを入力します (管理者である必要があります。そうでない場合はエラーが報告されます)。

mysqld - install

サービスを開始するには、次のコマンドを入力します。

net start mysql

サービスが正常に開始されたら、MySQL データベースに入り、次のコマンドを入力します (最初のエントリにはパスワードは必要ありません。パスワードは後で追加できます)。

mysql -u root -P

net start mysqlデータベースに入るとき、再度コマンドを入力する必要はなく、コマンドライン状態でbinフォルダーに直接入り、mysql -u root -pコマンドを入力し、パスワードを入力してデータベースに入ります。

モジュールの実装

本プロジェクトはデータ前処理、発熱量計算、類似度計算、ニュース統計、APIインターフェース開発、フロントエンドインターフェース実装の6つのモジュールから構成されており、各モジュールの機能紹介と関連コードは以下の通りです。

1. データの前処理

データはウェブサイトの初期ニュースから取得されます。クローリングの際のソースデータはニュースのタイトル、本文、投稿時間のみです。ニュースの人気値の計算を容易にするために、ランダムな閲覧数とコメント数が使用されます。ニュースに追加されました。

ニュースデータの Excel リンクhttps://pan.baidu.com/s/1HRYvHmxIrGT7pmoizRe2cA、抽出コード: wezi ; SQL ステートメントを使用して、処理されたデータを MySQI データベースにインポートします。

2. 発熱量計算

各ニュースは人気度の値を計算します。この値は、後続のホット リストおよび推奨モジュールのニュースの並べ替えに使用されます。ニュースの人気度、閲覧数、コメント数には密接な関係があるが、不確定要素を除くとコメント数の比重が高くなり、同時に古いニュースの人気は時間の経過とともに低下する。人気値 = 特定のニュースの閲覧数 X 0.4 + 特定のニュースのコメント数 X0.5 - ニュースの公開日と現在の日付との時間差 (日) X0.1。

ニュース人気度値の計算に対応する関数コードは次のとおりです。

def calHotValue(self):
	base_time = datetime.now()
	sql = "select new_id, new_cate_id, new_seenum, new_disnum, new_time from new"
	self.cursor.execute(sql)
	result_list = self.cursor.fetchall()
	result = list()
    for row in result_list:
	    diff=base_time-datetime.strptime(str(row[4].date()),'%Y-%m-%d')
	    hot_value = row[2] * 0.4 + row[3] * 0.5 - diff.days * 0.1
	    result.append((row[0],row[1],hot_value))
    return result

3. 類似度の計算

本プロジェクトの推奨基準はニュース類似度であり、ニュースキーワードの一致度をニュース類似度の考慮に利用する。

1) ニュースワード分割処理

実装アイデア: Python の jieba 単語分割パッケージを使用して、ニュース タイトルごとに単語分割を実行します 単語分割にニュース タイトルを選択する理由は、ニュースの主題の特殊性のためです。ニュースを読むための最初の入り口は見出しです。見出しはニュース全体の高レベルの要約です。2 つのニュースの見出しの重複が多いほど、内容の類似性が高くなります。ニュースそのものの。

Python 関数を使用してxlrd.open_work()Excel ファイルを読み込みます。生データのロードに対応する関数は次のように実装されます。

#加载数据
def loadData(self):
	news_dict = dict()
	#使用xlrd加载xlsx格式文件,返回一个table对象
	table = xlrd.open_workbook(self.file).sheets()[0]
	#遍历每一行
	for row in range(1,table.nrows):
		#将每一列返回为一个数组
		line = table.row_values(row, start_colx=0, end_colx=None)
		new_id = int(line[0])
		news_dict.setdefault(new_id,{
    
    })       
		news_dict[new_id]["tag"]= line[1]
		news_dict[new_id]["title"] = line[5]
		news_dict[new_id]["content"] = line[-1]
	return news_dict

元データを読み込んだ後、記事タイトルを分割する際に使用する変数news_dictに保存し、単語の分割は関数を使用していますjieba.analyse.extract_tags()文中に単音節の単語や句読点が多数存在します。これらの単語や句読点は単語分割時に削除する必要があります。実装方法は、フィルタリング用の非アクティブ語彙リスト (このプロジェクトのファイル) をロードし、抽出することです。ニュースstop_words.txtタイトルのキーワードに対応する関数 実装コードは以下の通りです。

#调用jieba分词获取每篇文章的关键词
def getKeyWords(self):
	news_key_words = list()
	#加载停用词表
	stop_words_list=[line.strip()for line in open 
	("./../files/stop_words.txt").readlines()]
	for new_id in self.news_dict.keys():
		if self._type == 1:
			#allowPOS 提取地名、名词、动名词、动词
			keywords = jieba.analyse.extract_tags( 
			self.news_dict[new_id]["title"]
			+self.news_dict[new_id]["content"],
		                   topK=10,
		                   withWeight=False,
		                   allowPOS=('ns', 'n', 'vn', 'v')
			              )
			news_key_words.append(str(new_id)+'\t'+",".join(keywords))
		elif self._type == 2:
			#cut_all :False 表示精确模式
			keywords=jieba.cut(self.news_dict[new_id]["title"],cut_all=False)
			kws = list()
		for kw in keywords:
			if kw not in stop_words_list and kw != " " and kw != " ":
	        	kws.append(kw)
	        	news_key_words.append(str(new_id)+'\t'+",".join(kws))
			else:
				print("请指定获取关键词的方法类型<1:TF-IDF 2:标题分词法>")
	return news_key_words

たとえば、タイトル「知識は力」の単語分割結果は、すべての人々の悩みを解消するためのバラエティ番組を作成する iQIYI の最初のシーズンで完璧に終了しました: 知識、力、最初のシーズン、完璧、エンディング、iQiyi、ビルド、みんな、安心、バラエティ番組。

2) 類似度を計算する

ニュースの類似性の計算には Jaccard 類似性係数が採用され、それに対応する関数は次のとおりです。

def getCorrelation(self):
	news_cor_list = list()
	for newid1 in self.news_tags.keys():
		id1_tags = set(self.news_tags[newid1].split(","))
		for newid2 in self.news_tags.keys():
			id2_tags = set(self.news_tags[newid2].split(","))
		if newid1 != newid2:
			print( newid1 + "\t" + newid2 + "\t" + str(id1_tags & id2_tags) )
			cor = ( len(id1_tags & id2_tags) ) / len (id1_tags | id2_tags)
			if cor > 0.0:
				news_cor_list.append([newid1,newid2,format(cor,".2f")])
	return news_cor_list

4. ニュース統計

指定されたラベルの下のニュースの統計は、ユーザーがラベルを選択した後に「あなたにおすすめ」モジュールのコンテンツの生成を準備するためのものです。ここで、ユーザーが選択できる指定されたラベルには、サミット、AI、テクノロジー、百度、インターネットなど 関連するコードは次のとおりです。

#获取每个标签下对应的文章
def getNewsTags(self):
	result = dict()
	for file in os.listdir(self.kw_path):
	   path = self.kw_path + file
	   for line in open(path, encoding= "utf-8").readlines():
	       try:
	           newid, tags = line.strip().split("\t")
	       except:
	           print("%s 下无对应标签" % newid)
	           for tag in tags.split(","):
	               if tag in ALLOW_TAGS:
	                 sql = "select new_hot from newhot where new_id=%s" % newid
	                   self.cursor.execute(sql)
	                   hot_value = self.cursor.fetchone()
	                   result.setdefault(tag,{
    
    })
	                   result[tag][newid]=hot_value[0]
    return result
#对每个标签下的新闻进行排序,并写入mysql
def writeToMySQL(self):
     for tag in self.result.keys():
         for newid in self.result[tag].keys():
             sql_w = "insert into newtag( new_tag,new_id,new_hot ) values('%s', '%s' ,%s)" % (tag, newid, self.result[tag][newid])
             try:
                 self.cursor.execute(sql_w)
                 self.db.commit()
           except:
               print("rollback", tag,newid,self.result[tag][newid])
               self.db.rollback()

5. APIインターフェース開発

APIインターフェースはフロントエンドと連携する機能です。ニュースカテゴリテーブルに定義されたカテゴリには、あなたにおすすめのニュースデータ(cateid=1)、ホットリスト(cateid=2)、その他の通常のカテゴリが含まれます。ユーザーが訪問すると、home()この関数が呼び出され、コードはフロントエンドに基づいています。渡された cateid パラメータによって、データ処理ロジックのどの部分を選択するかが決まります。関連するコードは次のとおりです。

def home(request):
    #从前端请求中获取cateid
    _cate = request.GET.get("cateid")
    if "username" not in request.session.keys():
    	return JsonResponse({
    
     "code":0 })
	total = 0 #总页数
	#如果cate 是为你推荐,走该部分逻辑tag_flag = 0表示不是从标签召回数据
	if _cate == "1":
        news, news_hot_value = getRecNews(request)
	#如果cate 是热度榜,走该部分逻辑
	elif _cate == "2":
        news,news_hot_value = getHotNews()
	#其他正常的请求获取
	else:
        _page_id = int(request.GET.get("pageid"))
           news = new.objects.filter(new_cate=_cate).order_by("-new_time")
        total = news.__len__()
        news = news[_page_id * 10:(_page_id+1) * 10]
#数据拼接
	result = dict()
	result["code"] = 2
	result["total"] = total
	result["cate_id"] = _cate
	result["cate_name"] = str(cate.objects.get(cate_id=_cate))
	result["news"] = list()
	for one in news:
		result["news"].append({
    
    
						      "new_id":one.new_id,
						      "new_title":str(one.new_title),
						      "new_time": one.new_time,
						      "new_cate": one.new_cate.cate_name,
							  "new_hot_value": news_hot_value[one.new_id] if _cate ==   "2" or _cate == "1" else 0 ,
      						  "new_content": str(one.new_content[:100])
        					  })
	return JsonResponse(result)

cateid が 1 の場合は、ユーザーが「あなたにおすすめ」モジュールを要求していることを意味し、cateid が 2 の場合は、ユーザーが「ホットリスト」モジュールを要求していることを意味し、cateid が 3 の場合、ユーザーが「ホットリスト」モジュールを要求していることを意味します。その他のニュースのカテゴリーでデータをリクエストします。

catied が 1 の場合、関数はhome ()function 内で呼び出されますgetRecNews ()getRecNews「あなたにおすすめ」の具体的なロジックを処理するために使用されますが、このときユーザーが初めてログインするのか、システム内で動作を生成した後に「あなたにおすすめモジュール」に戻るのかを判断する必要があります。ここで、パラメータは、異なる値がデータtag_Aagを取得するための異なるロジックを示すことを示すために使用されtag_Aag、関連する関数は次のとおりです。

# 热度榜排序逻辑:new_seenum*0.3+new_disnum*0.5+(new_date-base_data)* 0.2
def getHotNews():
    # 从新闻热度表中取top 20数据
    all_news = newhot.objects.order_by("new_hot").values("new_id", "new_hot")[:20]
    all_news_id = [one["new_id"] for one in all_news]
    all_news_hot_value = {
    
    one["new_id"]: one["new_hot"] for one in all_news}
    # 返回热度榜单数据
    return new.objects.filter(new_id__in=all_news_id), all_news_hot_value

# 为你推荐的数据获取逻辑
def getRecNews(request):
    tags = request.GET.get('tags')
    baseclick = request.GET.get("baseclick")
    tag_flag = 0 if tags == "" else 1
    tags_list = tags.split(",")
    uname = request.session["username"]

    # 标签召回逻辑
    if tag_flag == 1 and int(baseclick) == 0:
        num = (20 / len(tags_list)) + 1
        news_id_list = list()
        news_id_hot_dict = dict()
        for tag in tags_list:
            result = newtag.objects.filter(new_tag=tag).values("new_id", "new_hot")[:num]
            for one in result:
                news_id_list.append(one["new_id"])
                news_id_hot_dict[one["new_id"]] = one["new_hot"]
        return new.objects.filter(new_id__in=news_id_list)[:20], news_id_hot_dict

    # 正常排序逻辑
    elif tag_flag == 0:
        # 首先判断用户是否有浏览记录
        # 如果有该用户的浏览记录,则从浏览的新闻获取相似的新闻返回
        if newbrowse.objects.filter(user_name=uname).exists():
            # 判断用户浏览的新闻是否够10个,如果够每个取两个相似,不够则每个取20/真实个数+1相似
            num = 0
            browse_dict = newbrowse.objects.filter(user_name=uname).order_by("new_browse_time").values("new_id")[:10]
            if browse_dict.__len__() < 10:
                num = (20 / browse_dict.__len__()) + 1
            else:
                num = 2
                news_id_list = list()
                all_news_hot_value = dict()
                # 遍历最近浏览的N篇新闻,每篇新闻取num篇相似新闻
                for browse_one in browse_dict:
                    for one in newsim.objects.filter(new_id_base=browse_one["new_id"]).order_by("-new_correlation")[:num]:
                        news_id_list.append(one.new_id_sim)
                        all_news_hot_value[one.new_id_sim] = (newhot.objects.filter(new_id=browse_one["new_id"])[0]).new_hot
			return new.objects.filter(new_id__in=news_id_list)[:20], all_news_hot_value

        # 如果该用户没有浏览记录,第一次进入系统且没有选择任何标签,返回热度榜单数据的20~40
        else:
            # 从新闻热度表中取top20 新闻数据
            all_news = newhot.objects.order_by("-new_hot").values("new_id", "new_hot")[20:40]
            all_news_id = [one["new_id"] for one in all_news]
            all_news_hot_value = {
    
    one["new_id"]: one["new_hot"] for one in all_news}
            print(all_news_hot_value)
            # 返回热度榜单数据
			return new.objects.filter(new_id__in=all_news_id), all_news_hot_value

6. フロントエンドインターフェースの実現

フロントエンド インターフェイスは、フロントエンドとバックエンド間の対話を直接操作して、推奨プロセス全体を完了します。

1) ロジックを実行する

パフォーマンス: ログイン後、ユーザーはラベル選択インターフェイスに入り、ラベルを選択して (または直接スキップして)、ホーム ページ (推奨ページとホット リストを含む) に入ります。また、ユーザーを切り替えて操作を変更することもできます。

#选择用户登录
def login(request):
    if request.method == "GET":
        result = dict()
        result["users"]=ALLOW_USERS
        result["tags"]=ALLOW_TAGS
        return JsonResponse(result)
    elif request.method == "POST":
        #从前端获取用户名并写入 session
        uname = request.POST.get('username')
        request.session["username"]=uname
        #前端将标签以逗号拼接的字符串形式返回
        tags= request.POST.get('tags')
        return JsonResponse({
    
    "username": uname, 
"tags": tags,"baseclick":0 , "code": 1})

#主页
def home(request):
#从前端请求中获取cate
    _cate = request.GET.get("cateid")
    if "username" not in request.session.keys():
        return JsonResponse({
    
     "code":0 })
    total = 0 #总页数
    #如果cate 是推荐页面,走该部分逻辑tag_flag = 0表示不是从标签召回数据
    if _cate == "1":
        news, news_hot_value = getRecNews(request)
    #如果cate 是热度榜,走该部分逻辑
    elif _cate == "2":
        news,news_hot_value = getHotNews()
    #其他正常的请求获取
    else:
        _page_id = int(request.GET.get("pageid"))
        news = new.objects.filter(new_cate=_cate).order_by("-new_time")
        total = news.__len__()
        news = news[_page_id * 10:(_page_id+1) * 10]

#切换用户
def switchuser(request):
    if "username" in request.session.keys():
        uname = request.session["username"]
        #删除新闻浏览表中的记录
        newbrowse.objects.filter(user_name=uname).delete()
        print("删除用户: %s 的新闻浏览记录 ..." % uname)
        #删除session值
        del request.session["username"]
        print("用户: %s 执行了切换用户动作,删除其对应的session值 ..." % uname)
    return JsonResponse({
    
    "code":1})
#return HttpResponseRedirect("/index/login/")

2) フロントエンドインターフェースのデータ構成

ローカル IP アドレスを次のように設定しALLOWED_HOSTS = ['192.168.43.155','127.0.0.1']、データベース構成とパスワード検証部分を設定して、フロントエンドがデータベースの内容を取得する権限を持っていることを確認します。

#数据库
#mysql配置
DB_HOST = "127.0.0.1"
DB_PORT = 3306
DB_USER = "root"
DB_PASSWD = "12345678"
DB_NAME = "newsrec"
DATABASES = {
    
    
    'default': {
    
    
        'ENGINE': 'django.db.backends.mysql',
        'NAME': DB_NAME,
        'USER': DB_USER,
        'PASSWORD': DB_PASSWD,
        'HOST': DB_HOST,
        'PORT': DB_PORT
    }
}
#密码验证
AUTH_PASSWORD_VALIDATORS = [
    {
    
    
        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    },
    {
    
    
        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
    },
    {
    
    
        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
    },
    {
    
    
        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
    },
]
#配置可使用的用户,以便完善整个界面的应用演示
ALLOW_USERS = ["张三","李四","王五"]
#配置选择用户进入下一页可被显示的标签
ALLOW_TAGS = ["峰会","AI","技术","百度","互联网","金融","旅游","扶贫","改革开放","战区","公益","中国","脱贫","经济","慈善","文化","文学","国风","音乐","综艺","101"]

3) フロントエンドインターフェース構成

フロントエンド インターフェイスの構成には、JavaScript 言語、Vue スキャフォールディング、および HTML 言語が使用されます。

import Vue from 'vue'
import App from './App'
import router from './router'
import animate from 'animate.css'
import './assets/style/common.less'
import commontool from './assets/js/tool'
import store from './store'
import layer from 'vue-layer'
Vue.prototype.$layer = layer(Vue)
Vue.use(commontool)
Vue.config.productionTip = false
new Vue({
    
    
  el: '#app',
  router,
  store,
  components: {
    
     App },
  template: '<App/>'
})
//此处为“主页(Home)”、“新闻页面(News)”、“登陆页面(Login)”三种页面提供了路由
import Vue from 'vue'
import Router from 'vue-router'
import store from '../store'
import home from '@/pages/Home'
import news from '@/pages/News'
import login from '@/pages/Login'
Vue.use(Router)
const router = new Router({
    
    
  routes: [
    {
    
    
      path: '/',
      name: 'home',
      component: home,
      meta: {
    
    
        needLogin: true
      }
    },
    {
    
    
      path: '/news',
      name: 'news',
      component: news,
      meta: {
    
    
        needLogin: true
      }
    },
    {
    
    
      path: '/login',
      name: 'login',
      component: login,
      meta: {
    
    
        needLogin: false
      }
    }
  ]
})
router.beforeEach((to, from, next) => {
    
    
  if (to.meta.needLogin) {
    
    
    if (store.state.vuexlogin.isLogin || localStorage.getItem('username')) {
    
    
      next()
    } else {
    
    
      next({
    
    
        path: '/login',
        query: {
    
    redirect: to.fullPath}
      })
    }
  } else {
    
    
    next()
  }
})
export default router
#JavaScript语言三种Vue构架(Home.vue,Login.vue,News.vue)
#前端是一个网页界面,用到了HTML语言。主要涉及一点界面属性(例如界面文字编码格式)的配置
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width,initial-scale=1.0">
    <title>Recommon</title>
    <link href="./static/style/reset.css" rel="stylesheet" />
  </head>
  <body style="margin:0">
    <div id="app"></div>
  </body>
</html>

システムテスト

プロジェクトを開始するプロセスは次のとおりです。 コマンド ライン ウィンドウで、バックエンド ファイル ディレクトリ ( NewsRecSys/NewsRec) を入力し、次のコマンドを実行します。

python manage.py runserver 0.0.0.0:8000

図に示す結果が表示され、バックエンド サービスが正常に開始されたことが示されます。

ここに画像の説明を挿入

新しいコマンド ライン ウィンドウを開き、フロントエンド ファイル ディレクトリ ( NewsRecSys/NewsRec-Vue) に入り、次の 2 つのコマンドを順番に実行します。

cnpm install

タオバオの国産画像 cnpm を使用すると、図に示すように、速度制限のある一部のコンポーネントの不完全な読み込みによって引き起こされるエラーを回避できます。

npm run dev

ここに画像の説明を挿入

図に示す結果が表示され、フロントエンド サービスが正常に開始されたことがわかります。

ここに画像の説明を挿入

図に示すように、ブラウザに URL http://127.0.0.1:8001を入力し、プロジェクト サービスにアクセスし、ログイン ユーザーを選択して、ラベル選択インターフェイスに入ります。

ここに画像の説明を挿入

図に示すように、ユーザーは特定のタグを選択し、「システムに入る」ボタンをクリックしてタグに含まれるコンテンツの好みを伝えるか、タグを選択せず​​に「スキップ」ボタンをクリックしてシステムに直接入ることができます。 。

ここに画像の説明を挿入

インターフェースの上部にはさまざまなカラムがあり、「あなたへのおすすめ」カラムはユーザーの行動に応じて継続的に更新され、現在のレコメンド状況が表示されます。他のカラム(海外ニュース、インターネットなど)のコンテンツは対応しています。 「背景を入力」列を選択するか、Web サイトhttp://127.0.0.1:8000/admin/を入力して背景を入力します (アカウントとパスワードは両方とも管理者です)。ホームページのインターフェースを図に示します。

ここに画像の説明を挿入

インターフェイスの左側には、現在選択されている列の下にコンテンツがあり、コンテンツをクリックしてニュースの詳細ページに入ります。インターフェイスの右側には、現時点でのニュースの人気を反映する、日付とともに更新されたホット リストが表示されます。

ニュースタイトルをクリックすると、以下の図のような画面が表示されます。コンテンツの詳細ページでは、インターフェイスの上部は依然として列であり、左側は日付、カテゴリ、ビュー数、テキストを含むニュース コンテンツの詳細であり、インターフェイスの右側は「類似の推奨事項」を推奨するものです。このニュースに似たニュースが他に 5 件あります。

ここに画像の説明を挿入

1. ユーザー行動を生成する際の推奨事項

ユーザーがいくつかのニュースをチェックした後、「あなたへのおすすめ」欄のおすすめ状況は下図のようになります。ユーザー「張三」のもとで「国際ニュース」と「インターネット」のニュースをいくつかチェックし、「おすすめ」欄のおすすめ状況を確認します。 for you」欄 次に、同じ欄の関連ニュースが表示されます。

ここに画像の説明を挿入

2. ユーザーがニュースを閲覧する際の推奨事項

ユーザーがニュースを閲覧すると、図のように右側に「あなたも好きかもしれません」と同様のレコメンドとして、そのニュースに似たニュースが5件表示されます。

ここに画像の説明を挿入

3. 新規ユーザーに対するコールド スタートの推奨事項

新しく入ったユーザーは、現在のホットリストからニュースを推奨します。閲覧履歴がなく、タグを何も選択せずに初めてシステムにアクセスした場合、20~40桁の人気リストデータが返され、結果は図のようになります。

ここに画像の説明を挿入

人気リストを推奨しない上位数社は、ユーザーにパーソナライズされたサービスを提供するために推奨されるシステムであり、「他のユーザーのコピー」を再構成するものではないため、人気リストに頼りすぎず、人気リストを参照する必要があります。その具体的な理由としては、ロングテール効果が考えられます。

ロングテール効果の根源は「個性化」「顧客力」「薄利多売の大きな市場」を重視することです。市場を非常に小さな市場に分割したい場合、これらの小さな市場の蓄積が明らかなロングテール効果をもたらすことがわかります。書籍を例に挙げると、Barnes&Noble には平均 130,000 冊の書籍が棚にあります。Amazon の売上の半分以上は、リストの 130,000 位以外にランクされている書籍によるものです。

4. 新規ユーザーへの自主タグの推奨

ユーザーを選択してタグ選択インターフェイスに入ります。ここでは図のように「Summit」「AI」「Technology」「Baidu」「Internet」の5つのタブを選択します。

ここに画像の説明を挿入

システムのホームページ インターフェイスに入ると、図に示すように、[あなたへのおすすめ] 列で、「サミット」、「AI」、および「インターネット」関連のコンテンツが推奨されていることがわかります。
ここに画像の説明を挿入

プロジェクトのソースコードのダウンロード

詳細については、ブログ リソースのダウンロード ページをご覧ください。


その他の情報ダウンロード

人工知能関連の学習ルートと知識システムについて学び続けたい場合は、私の他のブログ「重い | 完全な人工知能 AI 学習 - 基本知識学習ルート、すべての資料は料金を支払わずにネットワーク ディスクから直接ダウンロードできます」を参照してください。 「ルーチンへの注意
このブログでは、Github の有名なオープンソース プラットフォーム、AI テクノロジー プラットフォーム、および関連分野の専門家 (Datawhale、ApacheCN、AI Youdao、Huang Haiguang 博士など) について言及しています。関連資料は約 100G あります。友達全員を助けてください。

おすすめ

転載: blog.csdn.net/qq_31136513/article/details/132617120