旅游推荐数据分析可视化系统算法
旅游推荐数据分析可视化系统算法
本文档详细介绍了旅游推荐数据分析可视化系统中使用的各种算法,包括推荐算法、数据分析算法和可视化算法。
目录
- 推荐算法
- 基于用户的协同过滤推荐
- 基于浏览历史的推荐
- 主题推荐算法
- 亲子游推荐算法
- 文化游推荐算法
- 自然风光推荐算法
- 随机推荐算法
- 数据分析与可视化算法
- 词云生成算法
- 地理分布可视化
- 用户活跃度分析
- 评分与销量分析
- 价格分布分析
推荐算法
基于用户的协同过滤推荐
协同过滤是一种常用的推荐算法,通过分析用户之间的相似性,为目标用户推荐与其相似的用户喜欢的项目。本系统实现了基于用户的协同过滤算法。
算法步骤:
- 获取所有用户的评分数据,数据结构为
{用户ID: {景点标题: 评分}, ...}
- 计算目标用户与其他用户之间的相似度(使用余弦相似度)
- 根据相似度对其他用户进行降序排序
- 选择与目标用户最相似的N个用户喜欢的景点
- 过滤掉目标用户已经评分过的景点,生成最终推荐列表
核心代码:
def user_bases_collaborative_filtering(user_id, user_ratings, top_n=3):# 获取目标用户的评分数据target_user_ratings = user_ratings[user_id]# 初始化一个字段,用于保存其他用户与目标用户的相似度得分user_similarity_scores = {}# 将目标用户的评分转化为numpy数组target_user_ratings_list = np.array([rating for _ , rating in target_user_ratings.items()])# 计算目标用户与其他用户之间的相似度得分for user, ratings in user_ratings.items():if user == user_id:continue# 将其他用户的评分转化为numpy数组user_ratings_list = np.array([ratings.get(item,0) for item in target_user_ratings])# 计算余弦相似度similarity_score = cosine_similarity([user_ratings_list],[target_user_ratings_list])[0][0]user_similarity_scores[user] = similarity_score# 对用户相似度得分进行降序排序sorted_similar_user = sorted(user_similarity_scores.items(), key=lambda x:x[1], reverse=True)# 选择 TOP N 个相似用户喜欢的景点 作为推荐结果recommended_items = set()for similar_user, _ in sorted_similar_user[:top_n]:recommended_items.update(user_ratings[similar_user].keys())# 过滤掉目标用户已经评分过的景点recommended_items = [item for item in recommended_items if item not in target_user_ratings]return recommended_items
优点:
- 不需要了解项目的具体特征,只需要用户的历史行为数据
- 可以发现用户潜在的兴趣点,提供个性化推荐
- 随着系统使用量增加,推荐效果会逐渐提升
缺点:
- 冷启动问题:新用户或新项目缺乏足够的评分数据
- 数据稀疏性:用户通常只评价少量项目,导致用户-项目矩阵稀疏
- 计算复杂度随用户和项目数量增加而增加
基于浏览历史的推荐
基于用户浏览历史的推荐算法通过分析用户历史浏览过的景点,识别用户偏好的省份和评分阈值,推荐符合用户口味的景点。
算法步骤:
- 获取用户浏览过的景点信息
- 统计用户偏好的省份,找出用户最常浏览的前3个省份
- 计算用户浏览过的景点的平均评分
- 根据用户偏好的省份筛选景点,过滤掉用户已浏览过的景点
- 筛选评分高于用户浏览景点平均评分的景点作为推荐结果
- 如果推荐结果不足,补充随机推荐
核心代码:
def getBrowseBasedRecommendation(user_id, limit=10):from app.models import UserBrowseHistory, TravelInfotry:# 获取用户浏览过的景点ID列表browsed_travels = UserBrowseHistory.objects.filter(user_id=user_id)if not browsed_travels.exists():# 如果用户没有浏览记录,返回随机推荐return getRandomTravel()# 获取浏览过的景点ID列表browsed_travel_ids = [bt.travel_id for bt in browsed_travels]# 获取用户浏览过的景点信息browsed_travels_info = TravelInfo.objects.filter(id__in=browsed_travel_ids)# 统计用户偏好的省份province_count = {}for travel in browsed_travels_info:if travel.province not in province_count:province_count[travel.province] = 0province_count[travel.province] += 1# 获取前3个最受欢迎的省份favorite_provinces = []if province_count:sorted_provinces = sorted(province_count.items(), key=lambda x: x[1], reverse=True)favorite_provinces = [p[0] for p in sorted_provinces[:3]]# 计算平均评分avg_score = 0valid_scores = 0for travel in browsed_travels_info:try:score = float(travel.score)avg_score += scorevalid_scores += 1except ValueError:continueif valid_scores > 0:avg_score = avg_score / valid_scoreselse:avg_score = 4.0 # 默认平均分# 根据用户喜欢的省份筛选景点if favorite_provinces:all_travels = TravelInfo.objects.filter(province__in=favorite_provinces)else:# 如果没有偏好省份,获取所有景点all_travels = TravelInfo.objects.all()# 过滤出未浏览过且评分高于平均分的景点result_list = []for travel in all_travels:if travel.id not in browsed_travel_ids:try:travel_score = float(travel.score)if travel_score >= avg_score:result_list.append(travel)except ValueError:continue# 如果推荐结果不足,补充随机推荐if len(result_list) < limit:# 获取所有景点IDall_travel_ids = set(TravelInfo.objects.values_list('id', flat=True))# 排除已浏览和已推荐的IDexcluded_ids = set(browsed_travel_ids + [t.id for t in result_list])remaining_ids = list(all_travel_ids - excluded_ids)# 随机选择景点补充if remaining_ids:remaining_count = limit - len(result_list)sample_size = min(remaining_count, len(remaining_ids))random_ids = random.sample(remaining_ids, sample_size)random_travels = TravelInfo.objects.filter(id__in=random_ids)result_list.extend(random_travels)# 限制返回数量return result_list[:limit]except Exception as e:print(f"浏览历史推荐出错: {e}")# 出错时返回随机推荐return getRandomTravel()
优点:
- 不依赖用户评分数据,只需要浏览历史,适合解决冷启动问题
- 能够快速捕捉用户地理偏好,推荐相似区域的景点
- 实现简单,计算效率高
缺点:
- 可能过于强调地理位置,忽略其他特征
- 如果用户浏览历史不丰富,推荐效果可能不理想
- 不能很好地发现用户潜在的新兴趣
主题推荐算法
系统实现了三种主题推荐算法,分别针对亲子游、文化游和自然风光游,通过关键词匹配为用户提供特定主题的景点推荐。
亲子游推荐算法
算法步骤:
- 定义亲子游相关的关键词列表
- 遍历所有景点,检查景点介绍中是否包含亲子游关键词
- 如果找到的景点少于10个,则从评分较高的景点中补充
- 返回最终的推荐列表(不超过10个景点)
核心代码:
def getFamilyFriendlyTravel():travelList = getAllTravelInfoMapData()familyFriendlyList = []# 亲子游关键词keywords = ["亲子", "家庭", "儿童", "孩子", "小朋友", "游乐", "互动", "体验", "教育", "学习", "动物园", "植物园", "博物馆", "科技馆", "游乐园"]for travel in travelList:# 检查详情介绍中是否包含亲子游关键词if any(keyword in travel.detailIntro for keyword in keywords) or any(keyword in travel.shortIntro for keyword in keywords):familyFriendlyList.append(travel)# 如果找到的景点少于10个,则从评分较高的景点中补充if len(familyFriendlyList) < 10:remainingCount = 10 - len(familyFriendlyList)# 按评分排序(从高到低)sortedTravelList = sorted(travelList, key=lambda x: float(x.score) if x.score.replace('.', '', 1).isdigit() else 0, reverse=True)# 从排序后的列表中添加未包含在familyFriendlyList中的景点added = 0for travel in sortedTravelList:if travel not in familyFriendlyList:familyFriendlyList.append(travel)added += 1if added >= remainingCount:break# 如果找到的景点超过10个,只返回前10个return familyFriendlyList[:10]
文化游推荐算法
算法步骤:
- 定义文化游相关的关键词列表
- 遍历所有景点,检查景点介绍中是否包含文化游关键词
- 如果找到的景点少于10个,则从评分较高的景点中补充
- 返回最终的推荐列表(不超过10个景点)
核心代码:
def getCulturalTravel():travelList = getAllTravelInfoMapData()culturalList = []# 文化游关键词keywords = ["文化", "历史", "博物馆", "古迹", "古城", "名胜", "传统", "遗址", "遗产", "文物", "寺庙", "宫殿", "纪念馆", "民俗", "古建筑"]for travel in travelList:# 检查详情介绍中是否包含文化游关键词if any(keyword in travel.detailIntro for keyword in keywords) or any(keyword in travel.shortIntro for keyword in keywords):culturalList.append(travel)# 如果找到的景点少于10个,则从评分较高的景点中补充if len(culturalList) < 10:remainingCount = 10 - len(culturalList)# 按评分排序(从高到低)sortedTravelList = sorted(travelList, key=lambda x: float(x.score) if x.score.replace('.', '', 1).isdigit() else 0, reverse=True)# 从排序后的列表中添加未包含在culturalList中的景点added = 0for travel in sortedTravelList:if travel not in culturalList:culturalList.append(travel)added += 1if added >= remainingCount:break# 如果找到的景点超过10个,只返回前10个return culturalList[:10]
自然风光推荐算法
算法步骤:
- 定义自然风光相关的关键词列表
- 遍历所有景点,检查景点介绍中是否包含自然风光关键词
- 如果找到的景点少于10个,则从评分较高的景点中补充
- 返回最终的推荐列表(不超过10个景点)
核心代码:
def getNatureTravel():travelList = getAllTravelInfoMapData()natureList = []# 自然风光关键词keywords = ["自然", "风景", "山", "海", "湖", "森林", "湿地", "峡谷", "瀑布", "草原", "沙漠", "岛屿", "海滩", "国家公园", "保护区", "地质公园"]for travel in travelList:# 检查详情介绍中是否包含自然风光关键词if any(keyword in travel.detailIntro for keyword in keywords) or any(keyword in travel.shortIntro for keyword in keywords):natureList.append(travel)# 如果找到的景点少于10个,则从评分较高的景点中补充if len(natureList) < 10:remainingCount = 10 - len(natureList)# 按评分排序(从高到低)sortedTravelList = sorted(travelList, key=lambda x: float(x.score) if x.score.replace('.', '', 1).isdigit() else 0, reverse=True)# 从排序后的列表中添加未包含在natureList中的景点added = 0for travel in sortedTravelList:if travel not in natureList:natureList.append(travel)added += 1if added >= remainingCount:break# 如果找到的景点超过10个,只返回前10个return natureList[:10]
主题推荐算法的优点:
- 通过关键词匹配可以快速筛选特定主题的景点
- 不依赖用户历史数据,适用于所有用户
- 实现简单,易于扩展新的主题
主题推荐算法的缺点:
- 依赖景点描述的质量和关键词的准确性
- 不考虑用户个人偏好
- 简单的关键词匹配可能忽略语义层面的相关性
随机推荐算法
当无法进行个性化推荐时(例如新用户、推荐结果不足等情况),系统会使用随机推荐算法提供备选推荐。
算法步骤:
- 获取所有景点列表
- 随机选择10个景点作为推荐结果
核心代码:
def getRandomTravel():travelList = getAllTravelInfoMapData()maxLen = len(travelList)resultList = []for i in range(10):randomNum = random.randint(0,maxLen-1)resultList.append(travelList[randomNum])return resultList
优点:
- 简单实用,可以作为推荐算法的兜底方案
- 提供多样性,帮助用户发现意想不到的景点
- 不受冷启动问题影响
缺点:
- 不考虑用户个人喜好
- 推荐可能不相关,用户满意度可能较低
数据分析与可视化算法
词云生成算法
系统使用jieba分词和WordCloud库生成两种词云:景点介绍词云和用户评论词云。
算法步骤:
- 收集所有景点的详细介绍文本(或用户评论文本)
- 使用jieba进行中文分词
- 去除停用词(常见无意义词汇)
- 使用WordCloud生成词云图像
核心代码:
def getIntroCloudImg(targetImgSrc, resImgSrc):travelList = TravelInfo.objects.all()text = ''stopwords = ['的', '是', '在', '这', '那', '他', '她', '它', '我', '你','和','等','为','有','与']for travel in travelList:text += travel.detailIntrocut = jieba.cut(text)newCut = []for tex in cut:if tex not in stopwords:newCut.append(tex)string = ' '.join(newCut)img = Image.open(targetImgSrc)img_arr = np.array(img)wc = WordCloud(background_color='white',mask=img_arr,font_path='/System/Library/Fonts/STHeiti Light.ttc')wc.generate_from_text(string)# 绘制图片fig = plt.figure(1)plt.imshow(wc)plt.axis('off') # 不显示坐标轴plt.savefig(resImgSrc, dpi=500)
评论词云生成的代码类似,区别在于数据源是用户评论内容。
优点:
- 直观展示文本中的高频词汇
- 有助于快速把握景点特点或用户评价重点
- 视觉效果好,便于用户理解
缺点:
- 只关注词频,忽略词之间的语义关系
- 需要合理的停用词表以避免无意义高频词汇影响结果
- 对长尾词汇(低频但可能重要的词)展示不足
地理分布可视化
系统利用ECharts库实现了景点地理分布的热力图可视化,直观展示全国各地区景点的密集程度。
算法步骤:
- 收集所有景点的地理位置数据
- 统计各省份的景点数量
- 使用ECharts的地图组件生成热力图
核心代码:
def getGeoData():travelList = TravelInfo.objects.all()provinceDic = {}for travel in travelList:if travel.province not in provinceDic:provinceDic[travel.province] = 0provinceDic[travel.province] += 1geoData = []for name,value in provinceDic.items():geoData.append({'name': name,'value': value})return geoData
用户活跃度分析
系统通过分析用户注册时间的分布,生成用户活跃度时间分布图,展示平台用户增长情况。
算法步骤:
- 获取所有用户的创建时间
- 按月统计用户数量
- 使用ECharts生成柱状图或折线图
核心代码:
def getUserCreateTimeData():userList = User.objects.all().order_by('createTime')timeDic = {}for user in userList:createTime = user.createTime.strftime('%Y-%m')if createTime not in timeDic:timeDic[createTime] = 0timeDic[createTime] += 1resultList = []for name,value in timeDic.items():resultList.append({'name': name,'value': value})return resultList
评分与销量分析
系统通过分析景点的评分和销量数据,生成排行榜和图表,帮助用户识别高品质景点。
算法步骤:
- 获取所有景点的评分和销量数据
- 按评分或销量排序
- 生成Top10榜单或分布图表
核心代码:
def getAnthorData():travelList = TravelInfo.objects.all()# 按评分排序scoreTop10 = sorted(travelList, key=lambda x: float(x.score) if x.score.replace('.', '', 1).isdigit() else 0, reverse=True)[:10]# 按销量排序saleCountTop10 = sorted(travelList, key=lambda x: int(x.saleCount) if x.saleCount.isdigit() else 0, reverse=True)[:10]# 准备数据以适应前端展示scoreTop10Data = []for travel in scoreTop10:scoreTop10Data.append({'title': travel.title,'detailUrl': travel.detailUrl,'cover': travel.cover,'detailAddress': travel.detailAddress,'score': travel.score})return scoreTop10Data, saleCountTop10
价格分布分析
系统分析景点价格的分布情况,帮助用户了解旅游市场价格行情。
算法步骤:
- 获取所有景点的价格数据
- 对价格进行区间划分
- 统计各区间的景点数量
- 生成价格分布图表
核心代码:
@csrf_exempt
def priceChar(request):travelList = TravelInfo.objects.all()# 价格区间划分priceRanges = {"0-100": 0,"101-200": 0,"201-300": 0,"301-400": 0,"401-500": 0,"501以上": 0}# 统计各区间景点数量for travel in travelList:try:price = int(float(travel.price))if price <= 100:priceRanges["0-100"] += 1elif price <= 200:priceRanges["101-200"] += 1elif price <= 300:priceRanges["201-300"] += 1elif price <= 400:priceRanges["301-400"] += 1elif price <= 500:priceRanges["401-500"] += 1else:priceRanges["501以上"] += 1except ValueError:continue# 准备数据以适应前端展示labels = list(priceRanges.keys())data = list(priceRanges.values())return JsonResponse({'labels': labels,'data': data})
关于旅游推荐系统情感分析算法
本文档详细介绍了旅游推荐数据分析可视化系统中使用的情感分析算法,该算法主要用于分析用户对景点的评论情感倾向,帮助系统更好地理解用户体验和景点质量。
目录
- 情感分析概述
- 基于词典的情感分析
- 基于机器学习的情感分析
- 评论情感分布可视化
- 情感分析对推荐系统的影响
情感分析概述
情感分析(Sentiment Analysis),也称为意见挖掘(Opinion Mining),是一种通过计算机技术分析文本中情感倾向的方法。在旅游推荐系统中,情感分析主要用于识别用户对景点的评价是正面、负面还是中性的,从而帮助系统生成更符合用户偏好的推荐结果。
本系统使用了两种主要的情感分析方法:基于词典的情感分析和基于机器学习的情感分析。这两种方法各有优缺点,在实际应用中相互补充,以提高情感分析的准确性。
基于词典的情感分析
基于词典的情感分析是一种依赖预定义情感词典的方法,通过匹配文本中的情感词并计算其情感得分来确定整体情感倾向。
算法步骤:
- 对用户评论进行中文分词,去除停用词
- 使用情感词典(如知网HowNet情感词典、大连理工大学情感词典等)匹配分词结果
- 识别否定词、程度副词等修饰词,调整情感词的权重
- 计算整体情感得分,得出情感倾向判断
核心代码:
def analyze_sentiment_with_dictionary(comment):# 分词seg_list = jieba.cut(comment)words = [word for word in seg_list if word not in stopwords]# 情感得分计算sentiment_score = 0negative_modifier = Falsedegree_modifier = 1.0for i, word in enumerate(words):# 检查是否是情感词if word in sentiment_dict:word_score = sentiment_dict[word]# 考虑否定词的影响if negative_modifier:word_score = -word_scorenegative_modifier = False# 考虑程度副词的影响word_score = word_score * degree_modifierdegree_modifier = 1.0sentiment_score += word_score# 检查否定词elif word in negation_words:negative_modifier = True# 检查程度副词elif word in degree_words:degree_modifier = degree_dict.get(word, 1.0)# 情感分类if sentiment_score > threshold_positive:return "positive", sentiment_scoreelif sentiment_score < threshold_negative:return "negative", sentiment_scoreelse:return "neutral", sentiment_score
优点:
- 实现简单,计算效率高
- 不需要大量标注数据
- 对特定领域词汇的情感能有比较准确的判断
缺点:
- 严重依赖词典质量和覆盖面
- 难以处理复杂句式和隐含情感
- 对新词和网络用语适应性差
基于机器学习的情感分析
基于机器学习的情感分析通过训练模型来学习文本与情感标签之间的映射关系,能够更好地处理复杂的语义情况。本系统使用了CNN和LSTM模型进行情感分析。
算法步骤:
- 数据预处理:对评论文本进行分词、去停用词等处理
- 特征提取:将文本转换为词向量表示(如Word2Vec, GloVe等)
- 模型训练:使用标注好的数据集训练深度学习模型
- 情感分类:使用训练好的模型对新评论进行情感分类
核心代码:
def build_sentiment_model():# 构建模型model = Sequential()model.add(Embedding(max_features, embedding_dim, input_length=maxlen))model.add(Bidirectional(LSTM(lstm_units, dropout=0.2, recurrent_dropout=0.2)))model.add(Dense(64, activation='relu'))model.add(Dropout(0.5))model.add(Dense(3, activation='softmax')) # 3类:正面、负面、中性model.compile(loss='categorical_crossentropy',optimizer='adam',metrics=['accuracy'])return modeldef train_sentiment_model(model, X_train, y_train, X_val, y_val):# 训练模型early_stopping = EarlyStopping(monitor='val_loss', patience=3)history = model.fit(X_train, y_train,batch_size=batch_size,epochs=epochs,validation_data=(X_val, y_val),callbacks=[early_stopping])return model, historydef predict_sentiment(model, text):# 预处理文本processed_text = preprocess_text(text)# 转换为向量sequence = tokenizer.texts_to_sequences([processed_text])padded_sequence = pad_sequences(sequence, maxlen=maxlen)# 预测prediction = model.predict(padded_sequence)[0]sentiment_class = np.argmax(prediction)confidence = prediction[sentiment_class]# 映射到情感类别sentiment_map = {0: "negative", 1: "neutral", 2: "positive"}return sentiment_map[sentiment_class], confidence
优点:
- 能处理复杂的语义关系
- 自动学习特征,不需要人工构建特征
- 适应能力强,能处理新词和变化的语言表达
缺点:
- 需要大量标注数据进行训练
- 模型训练和预测的计算成本高
- 可解释性差,难以理解模型的决策过程
评论情感分布可视化
系统利用情感分析结果生成景点评论情感分布图表,以便直观展示用户对景点的整体评价倾向。
可视化算法步骤:
- 对景点的所有评论进行情感分析,获取情感分类结果
- 统计不同情感类别(正面、负面、中性)的数量
- 使用饼图或柱状图展示情感分布情况
核心代码:
@csrf_exempt
def sentiment_distribution(request):if request.method == 'POST':travel_id = request.POST.get('travel_id')try:travel = TravelInfo.objects.get(id=travel_id)comments = json.loads(travel.comments) if travel.comments else []# 情感分析结果统计sentiment_counts = {"positive": 0,"neutral": 0,"negative": 0}for comment in comments:content = comment.get('content', '')if content:# 对评论进行情感分析sentiment, _ = analyze_sentiment(content)sentiment_counts[sentiment] += 1# 准备饼图数据labels = list(sentiment_counts.keys())data = list(sentiment_counts.values())return JsonResponse({'labels': labels,'data': data,'title': f"{travel.title}评论情感分布"})except Exception as e:return JsonResponse({'error': str(e)}, status=400)return JsonResponse({'error': 'Invalid request'}, status=400)
情感分析的综合算法:
系统在实际应用中,会结合词典方法和机器学习方法的优势,采用集成策略进行情感分析:
def analyze_sentiment(text):# 使用词典方法分析dict_sentiment, dict_score = analyze_sentiment_with_dictionary(text)# 使用机器学习模型分析ml_sentiment, ml_confidence = predict_sentiment(model, text)# 加权融合两种结果if ml_confidence > high_confidence_threshold:# 如果机器学习模型置信度高,优先采用其结果final_sentiment = ml_sentimentelif abs(dict_score) > strong_opinion_threshold:# 如果词典方法发现强烈情感倾向,优先采用其结果final_sentiment = dict_sentimentelse:# 否则加权融合两种结果# 这里可以实现更复杂的融合逻辑if dict_sentiment == ml_sentiment:final_sentiment = dict_sentimentelse:# 冲突时的处理策略if ml_confidence > dict_confidence_equivalent:final_sentiment = ml_sentimentelse:final_sentiment = dict_sentimentreturn final_sentiment, max(ml_confidence, abs(dict_score)/max_dict_score)
情感分析对推荐系统的影响
情感分析结果在推荐系统中发挥着重要作用,主要体现在以下几个方面:
1. 推荐权重调整
系统会根据景点评论的情感分布情况调整该景点在推荐算法中的权重。评论情感越正面的景点会获得更高的推荐权重,从而更容易被推荐给用户。
算法示例:
def adjust_recommendation_weight(travel, sentiment_stats):# 计算情感分数(-1到1之间)total_comments = sum(sentiment_stats.values())if total_comments == 0:return default_weightsentiment_score = (sentiment_stats["positive"] - sentiment_stats["negative"]) / total_comments# 基础权重(可以是评分或其他因素)base_weight = float(travel.score) if travel.score.replace('.', '', 1).isdigit() else 3.0# 调整后的权重adjusted_weight = base_weight * (1 + sentiment_score * sentiment_weight_factor)return adjusted_weight
2. 个性化推荐优化
系统会分析用户历史浏览和评价过的景点的评论情感分布,了解用户偏好的评价类型,进一步优化个性化推荐效果。
算法示例:
def optimize_personalized_recommendation(user_id, candidate_travels):# 获取用户历史浏览的景点user_browsed_travels = UserBrowseHistory.objects.filter(user_id=user_id)# 分析用户偏好的评论情感分布user_sentiment_preference = analyze_user_sentiment_preference(user_browsed_travels)# 为候选景点评分scored_candidates = []for travel in candidate_travels:# 获取景点的评论情感分布travel_sentiment_stats = get_travel_sentiment_stats(travel)# 计算用户偏好与景点评论情感分布的匹配度sentiment_match_score = calculate_sentiment_match(user_sentiment_preference, travel_sentiment_stats)# 结合基础分数和情感匹配分数final_score = calculate_final_score(base_score=float(travel.score), sentiment_score=sentiment_match_score)scored_candidates.append((travel, final_score))# 排序并返回结果sorted_candidates = sorted(scored_candidates, key=lambda x: x[1], reverse=True)return [travel for travel, _ in sorted_candidates]
3. 情感趋势分析
系统会分析景点评论的情感变化趋势,识别用户情感的波动,从而预测景点质量的变化,及时调整推荐策略。
算法示例:
def analyze_sentiment_trends(travel_id, time_window=30):# 获取景点的所有评论travel = TravelInfo.objects.get(id=travel_id)comments = json.loads(travel.comments) if travel.comments else []# 按时间排序评论sorted_comments = sorted(comments, key=lambda x: x.get('date', ''))# 按时间窗口分组并分析情感趋势time_windows = []sentiment_scores = []current_window = []current_window_end = Nonefor comment in sorted_comments:comment_date = parse_date(comment.get('date', ''))if not comment_date:continueif current_window_end is None:# 初始化第一个时间窗口current_window_end = comment_date + datetime.timedelta(days=time_window)current_window.append(comment)elif comment_date <= current_window_end:# 评论属于当前时间窗口current_window.append(comment)else:# 处理当前窗口并创建新窗口if current_window:window_sentiment = calculate_window_sentiment(current_window)time_windows.append(current_window_end - datetime.timedelta(days=time_window))sentiment_scores.append(window_sentiment)# 创建新窗口current_window = [comment]current_window_end = comment_date + datetime.timedelta(days=time_window)# 处理最后一个窗口if current_window:window_sentiment = calculate_window_sentiment(current_window)time_windows.append(current_window_end - datetime.timedelta(days=time_window))sentiment_scores.append(window_sentiment)# 分析趋势trend = analyze_trend(sentiment_scores)return {'time_windows': [tw.strftime('%Y-%m-%d') for tw in time_windows],'sentiment_scores': sentiment_scores,'trend': trend}
通过以上三种方式,情感分析算法不仅能够帮助系统更准确地了解用户对景点的真实评价,还能动态调整推荐策略,提高推荐系统的性能和用户满意度。
相关文章:

旅游推荐数据分析可视化系统算法
旅游推荐数据分析可视化系统算法 本文档详细介绍了旅游推荐数据分析可视化系统中使用的各种算法,包括推荐算法、数据分析算法和可视化算法。 目录 推荐算法 基于用户的协同过滤推荐基于浏览历史的推荐主题推荐算法 亲子游推荐算法文化游推荐算法自然风光推荐算法…...

c语言第一个小游戏:贪吃蛇小游戏08(贪吃蛇完结)
贪吃蛇撞墙和想不开咬死自己 #include <curses.h> #include <stdlib.h> struct snake{ int hang; int lie; struct snake *next; }; struct snake food; struct snake *head; struct snake *tail; int key; int dir; #define UP 1 #define DOWN -1 …...

使用PhpStudy搭建Web测试服务器
一、安装PhpStudy 从以下目录下载PhpStudy安装文件 Windows版phpstudy下载 - 小皮面板(phpstudy) (xp.cn) 安装成功之后打开如下界面 点击启动Apache 查看网站地址 在浏览器中输入localhost:88,出现如下页面就ok了 二、与Unity交互 1.配置下载文件路径,点击…...

c语言第一个小游戏:贪吃蛇小游戏06
实现贪吃蛇四方向的风骚走位 实现代码 #include <curses.h> #include <stdlib.h> struct snake{ int hang; int lie; struct snake *next; }; struct snake *head; struct snake *tail; int key; int dir; //全局变量 #define UP 1 //这个是宏定义&a…...

Qt应用程序启动时的一些思路:从单实例到性能优化的处理方案
程序启动时优化的价值 在桌面软件开发领域,应用程序的启动过程就像音乐的序曲,决定了用户对软件品质的第一印象。比如首次启动等待超过3秒时,会让大多数用户产生负面看法,而专业工具软件的容忍阈值甚至更低。Qt框架作为跨平台开发…...
【前端三剑客】Ajax技术实现前端开发
目录 一、原生AJAX 1.1AJAX 简介 1.2XML 简介 1.3AJAX 的特点 1.3.1AJAX 的优点 1.3.2AJAX 的缺点 1.4AJAX 的使用 1.4.1核心对象 1.4.2使用步骤 1.4.3解决IE 缓存问题 1.4.4AJAX 请求状态 二、jQuery 中的AJAX 2.1 get 请求 2.2 post 请求 三、跨域 3.1同源策略…...

一文详解Spring Boot如何配置日志
一、写在前面 对于日志文件,相信大家都并不陌生,通过在关键位置打印相关的日志,有利于快速跟踪和定位软件系统运行中存在的问题。 在之前的 Java 实现日志记录的文章中,我们介绍了能实现日志记录的主流框架有 Log4j、Log4j2、Lo…...

Springboot | 如何上传文件
文章目录 1. 核心上传逻辑:FileUploadController2. 使文件系统中的文件可通过 HTTP 访问:WebConfig3. 安全性配置:WebSecurityConfig4. 前端实现(这里用的是Angular) 在许多应用程序开发中,我们经常需要实现…...
axios结合AbortController取消文件上传
<template><div><input type"file" multiple change"handleFileUpload" /><button click"cancelUpload" :disabled"!isUploading">取消上传</button><div>总进度:{{ totalProgress }}…...

spring中的@Async注解详解
一、核心功能与作用 Async 是Spring框架提供的异步方法执行注解,用于将方法标记为异步任务,使其在独立线程中执行,从而提升应用的响应速度和吞吐量。其主要作用包括: 非阻塞调用:主线程调用被标记方法后立即返回&…...

MyBatis 报错:Column count doesn‘t match value count at row 1 详解与解决
本文适用于使用 MyBatis MySQL 开发中出现 “Column count doesnt match value count at row 1” 报错的朋友,尤其是在批量插入或更新数据时,遇到 XML 映射文件中 insert 标签报错的问题。 一、遇到的问题: 二、错误原因分析 列数与值数量不…...
第四天——贪心算法——种花
1. 题目 有一个花坛,其中0 表示该位置是空的,可以种花。1 表示该位置已经有花,不能种花。 规则:新种的花不能种在相邻的位置(即如果某个位置已经种了花,它的左右两个相邻位置不能再种花)。给定…...

【人工智能】自然语言编程革命:腾讯云CodeBuddy实战5步搭建客户管理系统,效率飙升90%
CodeBuddy 导读一、产品介绍1.1 **什么是腾讯云代码助手?**1.2 插件安装1.2.1 IDE版本要求1.2.2 注意事项1.2.4 插件安装1.2.4.1 环境安装1.2.4.2 安装腾讯云AI代码助手** 1.2.5 功能介绍1.2.5.1 Craft(智能代码生成)1.2.5.2 Chat(…...

麦肯锡110页PPT企业组织效能提升调研与诊断分析指南
“战略清晰、团队拼命、资源充足,但业绩就是卡在瓶颈期上不去……”这是许多中国企业面临的真实困境。表面看似健康的企业,往往隐藏着“组织亚健康”问题——跨部门扯皮、人才流失、决策迟缓、市场反应滞后……麦肯锡最新研究揭示:组织健康度…...

【MySQL】第二弹——MySQL表的增删改查(CRUD)初阶
文章目录 🎓一. CRUD🎓二. 新增(Create)🎓三. 查询(Rertieve)📖1. 全列查询📖2. 指定列查询📖3. 查询带有表达式📖4. 起别名查询(as )📖 5. 去重查询(distinct)📖6. 排序…...
内存、磁盘、CPU区别,Hadoop/Spark与哪个联系密切
1. 内存、磁盘、CPU的区别和作用 1.1 内存(Memory) 作用: 内存是计算机的短期存储器,用于存储正在运行的程序和数据。它的访问速度非常快,比磁盘快几个数量级。在分布式计算中,内存用于缓存中间结果、存储…...
hz2新建Keyword页面
新建一个single-keywords.php即可,需要筛选项再建taxonomy-knowledge-category.php 参考:https://www.tkwlkj.com/customize-wordpress-category-pages.html WordPress中使用了ACF创建了自定义产品分类products,现在想实现自定义产品分类下的…...

离散制造企业WMS+MES+QMS+条码管理系统高保真原型全解析
在离散型制造企业的生产过程中,库存管理混乱、生产进度不透明、质检流程繁琐等问题常常成为制约企业发展的瓶颈。为了帮助企业实现全流程数字化管控,我们精心打造了一款基于离散型制造企业(涵盖单件生产、批量生产、混合生产模式)…...
【并发编程基石】CAS无锁算法详解:原理、实现与应用场景
一、什么是CAS? CAS(Compare-And-Swap) 是现代并发编程的核心算法之一,它通过处理器指令级的原子操作实现线程安全,无需传统锁机制。其核心逻辑可以用一个公式表示: CAS(V, E, N) {if (V E) { // 比较当…...
(自用)Java学习-5.8(总结,springboot)
一、MySQL 数据库 表关系 一对一、一对多、多对多关系设计外键约束与级联操作 DML 操作 INSERT INTO table VALUES(...) DELETE FROM table WHERE... UPDATE table SET colval WHERE...DQL 查询 基础查询:SELECT * FROM table WHERE...聚合函数:COUNT()…...
GOOSE 协议中MAC配置
在 GOOSE(Generic Object Oriented Substation Event)协议中,主站(Publisher)发送的 MAC 地址不需要与从站(Listener)的 MAC 地址一致,其通信机制与 MAC 地址的匹配逻辑取决于 GOOSE…...
机器学习之决策树与决策森林:机器学习中的强大工具
机器学习之决策树与决策森林:机器学习中的强大工具 摘要:本文深入探讨决策树和决策森林在机器学习中的应用优势及其适用场景。决策树凭借其易于配置、原生处理多种数据类型、鲁棒性及可解释性等特点,在小数据集和表格数据处理方面表现卓越。…...
【Redis】谈谈Redis的设计
Redis(Remote Dictionary Service)是一个高性能的内存键值数据库,其设计核心是速度、简单性和灵活性。以下从架构、数据结构、持久化、网络模型等方面解析 Redis 的设计实现原理: 1. 核心设计思想 内存优先:数据主要存…...
【C++】流(Stream)详解:标准流、文件流和字符串流
【C】流(Stream)详解:标准流、文件流和字符串流 在C编程中,流(Stream)是一个非常重要的概念,它为我们提供了统一的数据输入输出接口。本文将详细介绍C中的三种主要流类型:标准流、文件流和字符串流。 一、标准流(Standard Strea…...

基于 Spring Boot 瑞吉外卖系统开发(十三)
基于 Spring Boot 瑞吉外卖系统开发(十三) 查询套餐 在查询套餐信息时包含套餐的分类名,分类名称在category表中,因此这里需要进行两表关联查询。 自定义SQL如下: select s.* ,c.name as category_name from setmeal…...

POSE识别 神经网络
Pose 识别模型介绍 Pose 识别是计算机视觉领域的一个重要研究方向,其目标是从图像或视频中检测出人体的关键点位置,从而估计出人体的姿态。这项技术在许多领域都有广泛的应用,如动作捕捉、人机交互、体育分析、安防监控等。 Pose 识别模型的…...
CSS3 基础知识、原理及与CSS的区别
CSS3 基础知识、原理及与CSS的区别 CSS3 基础知识 CSS3 是 Cascading Style Sheets 的第3个版本,是CSS技术的升级版本,于1999年开始制订,2001年5月23日W3C完成了CSS3的工作草案。 CSS3 主要模块 选择器:更强大的元素选择方式盒…...
电能质量扰动信号信号通过hilbert变换得到瞬时频率
利用Hilbert变换从电能质量扰动信号中提取瞬时频率、瞬时幅值、Hilbert谱和边际谱的详细步骤及MATLAB代码实现。该流程适用于电压暂降、暂升、谐波、闪变等扰动分析。 1. Hilbert变换与特征提取流程 1.1 基本步骤 信号预处理:滤波去噪(如小波去噪&…...
Linux工作台文件操作命令全流程解析(高级篇之awk精讲)
全文目录 1 工具介绍2 核心优势3 命令格式3.1 命令格式说明3.2 组成部分详解3.2.1 选项3.2.2 模式3.2.3 动作3.2.4 输入文件 4 使用说明4.1 常用示例4.2 awk 编程解析4.2.1 基础说明4.2.2 编程进阶 4.3 温馨提示 5 内置变量6 参考文献 写在前面 前面一篇《Linux工作台文件操作命…...

力扣119题:杨辉三角II(滚动数组)
小学生一枚,自学信奥中,没参加培训机构,所以命名不规范、代码不优美是在所难免的,欢迎指正。 标签: 杨辉三角、滚动数组 语言: C 题目: 给定一个非负索引 rowIndex,返回「杨辉三角…...