用python写一个给json字段排序成和另一个一致的脚本
时间: 2024-03-21 14:38:22 浏览: 60
可以使用Python内置的json模块和collections模块中的OrderedDict类来实现。
首先,读取两个json文件,使用json.load()方法将json字符串转化为Python中的字典类型,并使用OrderedDict类将字典按照key值的ASCII码顺序排序。
示例代码如下:
```
import json
from collections import OrderedDict
# 读取json文件
with open('file1.json', 'r') as f1:
dict1 = json.load(f1, object_pairs_hook=OrderedDict)
with open('file2.json', 'r') as f2:
dict2 = json.load(f2, object_pairs_hook=OrderedDict)
# 排序json字段
sorted_dict1 = OrderedDict(sorted(dict1.items()))
sorted_dict2 = OrderedDict(sorted(dict2.items()))
# 判断两个json文件是否一致
if sorted_dict1 == sorted_dict2:
print("两个json文件排序后一致")
else:
print("两个json文件排序后不一致")
```
注意,使用OrderedDict类排序后,输出的json字符串中,字段的顺序将与原始json字符串中的顺序不同。
相关问题
给我一个实际的完整的代码和操作流程
为了给定一个更具体的例子,我们假设你已经成功地将DeepSeeker 1:14B模型部署到了本地环境中,并希望使用MovieLens小规模数据集(ml-latest-small)作为示例来展示整个流程。下面是详细的步骤和相应的Python代码片段。
### 环境配置
#### 安装依赖项
确保已安装所需的Python库和其他工具。如果你还没有设置好环境,请先运行以下命令:
```bash
pip install torch transformers pandas scikit-learn flask jieba numpy
```
### 加载预训练模型与数据集
我们将直接从Hugging Face加载DeepSeeker模型,并下载并解压MovieLens数据集:
```python
import os
from zipfile import ZipFile
import requests
from transformers import AutoModelForSequenceClassification, AutoTokenizer
import pandas as pd
# 设置工作路径
os.makedirs('data', exist_ok=True)
# 下载MovieLens数据集 (如果尚未存在)
if not os.path.exists('./data/ml-latest-small'):
url = "http://files.grouplens.org/datasets/movielens/ml-latest-small.zip"
r = requests.get(url, allow_redirects=True)
open("./data/movie_dataset.zip", 'wb').write(r.content)
with ZipFile("./data/movie_dataset.zip", 'r') as zip_ref:
zip_ref.extractall("data")
print("Dataset extracted.")
model_name_or_path = "path_to_your_local_deepseek_model" # 替换为你保存的DeepSeeker模型路径
tokenizer = AutoTokenizer.from_pretrained(model_name_or_path)
model = AutoModelForSequenceClassification.from_pretrained(model_name_or_path).to('cuda')
ratings_df = pd.read_csv('./data/ml-latest-small/ratings.csv')
movies_df = pd.read_csv('./data/ml-latest-small/movies.csv')
print("Loaded models and datasets.")
```
### 文本处理
接下来我们要对电影标题和描述字段做简单的文本清洗和分词处理:
```python
import jieba
def clean_text(text):
return ''.join(filter(lambda x: ord(x)<256 or '\u4e00'<x<'\u9fff', str(text)))
def tokenize(text):
tokens = list(jieba.cut(clean_text(text)))
return tokenizer.convert_tokens_to_ids(tokens)[:512] + [tokenizer.pad_token_id]*(512-len(tokens))
titles_and_genres = movies_df['title'] + ', ' + movies_df['genres']
tokenized_titles_and_genres = titles_and_genres.apply(tokenize)
```
### 训练或微调模型
由于这是一个较大的预训练语言模型,对于推荐系统来说可以直接应用于生成特征表示而不需要额外训练。但是如果你想尝试自定义任务,则可以根据具体情况设计适当的损失函数进行微调。
```python
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder
# 对用户ID进行编码转换为数字标签形式
user_encoder = LabelEncoder()
encoded_users = user_encoder.fit_transform(ratings_df.userId.values)
X_train_val, X_test, y_train_val, y_test = \
train_test_split(
tokenized_titles_and_genres,
encoded_users,
test_size=0.2,
random_state=42
)
# 进一步划分成训练集验证集...
```
注意这里的`y`代表的是用户的唯一标识符而不是评分值本身——因为我们关注点在于基于内容的推荐而非协同过滤方法。
### 推荐算法实现
现在我们可以编写推荐逻辑了。这里给出了一种简单的方式:对于任意一条记录,找到与其最相似的一批条目然后按平均得分排序选出Top-N个未看过的影片给予推荐。
```python
from scipy.spatial.distance import cosine
import heapq
class ContentBasedRecommender:
def __init__(self, model, item_embeddings, ratings_matrix=None):
self.model = model.eval() # 切换成推理模式
self.item_embeddings = item_embeddings.cpu().detach().numpy()
@staticmethod
def get_similarity(embedding_a, embedding_b):
"""计算两个嵌入之间的余弦距离"""
norm_a = embedding_a / np.linalg.norm(embedding_a)
norm_b = embedding_b / np.linalg.norm(embedding_b)
cos_sim = 1 - cosine(norm_a, norm_b) if any([norm_a.any(), norm_b.any()]) else 0.
return max(cos_sim, 0.)
def recommend_items(self, target_item_idx, n_recommendations=5):
similarities = [
(-ContentBasedRecommender.get_similarity(target_emb=self.item_embeddings[target_item_idx],
candidate_emb=self.item_embeddings[i]),
i)
for i in range(len(self.item_embeddings))
if i != target_item_idx]
top_n_indices = [idx for _, idx in heapq.nsmallest(n_recommendations, similarities)]
recommended_movies = movies_df.iloc[top_n_indices]['title'].tolist()
print(f"\nRecommendation based on {target_movie}: ", *recommended_movies, sep='\n\t• ')
recommender = ContentBasedRecommender(model=model, item_embeddings=item_embeddings)
test_movie_index = ... # 选取一部随机测试电影索引号
recommender.recommend_items(test_movie_index)
```
### 启动API服务器
最后把我们的推荐系统包装进Flask Web服务里边去方便对外提供RESTful API访问接口吧!
```python
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route('/recommend', methods=['POST'])
def api_recommend():
data = request.json
movie_title = data.get('movie_title')
try:
target_movie_index = int(movies_df[movies_df.title == movie_title].index[0])
recommendations = recommender.recommend_items(target_movie_index=target_movie_index)
response = {'status': 'success',
'message': f'Recommended items for "{movie_title}":\n{recommendations}'}
except Exception as e:
response = {'status': 'error',
'message': str(e)}
return jsonify(response)
if __name__ == '__main__':
app.run(host='localhost', port=8000)
```
以上就是关于如何利用本地化的DeepSeeker 1:14B模型结合MovieLens数据集来进行推荐系统开发的一个完整实例说明。请注意这个案例主要是为了让读者了解整体思路和技术要点,在实际生产环境下还需要更多的工程优化措施以及安全性和稳定性方面的考量。
---
python将json转换为字符串
在 Python 中将 JSON 对象或字典转换成字符串是非常常见的操作,通常用于准备数据以便在网络上传输、保存到文件中或是为了显示目的。Python 标准库中的 `json` 模块提供了简便的方法来处理这类任务。
### 使用 json.dumps() 方法
`json.dumps()` 函数可以把 Python 字典(或其他可序列化类型)转为 JSON 字符串表示形式。这是一个核心功能之一,语法简单直接:
#### 示例代码:
```python
import json
# 创建一个普通的 Python 字典对象作为例子
person_dict = {
"name": "张三",
"age": 30,
"city": "北京",
"hasChildren": False,
"titles": ["工程师", "作家"]
}
try:
# 将字典转化为 JSON 格式的字符串
person_json_string = json.dumps(person_dict, ensure_ascii=False)
print("原始字典:", person_dict)
print("JSON 字符串:")
print(person_json_string)
except (TypeError, ValueError) as e:
print(f"发生错误: {e}")
```
在这段代码里:
- `ensure_ascii=False`: 如果不加此参数,默认情况下非 ASCII 字符会被编码为 `\uXXXX` 形式;设置了 `False`, 则会保持原文输出中文字符等;
- 输出将是类似于这样的 JSON 字符串:
```json
{"name": "张三", "age": 30, "city": "北京", "hasChildren": false, "titles": ["工程师", "作家"]}
```
### 参数说明
除了基本的用法之外,`dumps()` 支持多个有用的参数来自定义生成后的 JSON 文本格式:
| 参数 | 描述 |
| --- | --- |
| skipkeys | 如果为 True,则跳过不可哈希(unhashable)类型的键值对。(默认是 False).|
| ensure_ascii | 若设为 False 可以正确地写出 Unicode 字符而不是转义序列。(如上面提到过的)。|
| check_circular | 如果为 False,则不会检查循环引用的问题。一般不需要关闭它除非你很清楚这样做不会有风险。(默认开启)。|
| allow_nan | 是否允许特殊的浮点数 NaN/Inf/-Inf 存在于数值字段之中,默认是 True 允许包含这些特殊值。|
| indent | 表示缩进级别数量,如果指定了正整数 n ,则产生的 JSON 数组元素和对象成员将会按照 n 空格进行美观排列打印出来。否则返回紧凑型表达。|
| separators | 当指定时,它应是一个长度为2元组 `(item_separator, key_separator)` 。这两个分隔符号分别用来替代列表项间的逗号+空格(", ") 和 键值之间的冒号+" "( ": " )。例如:`( ', ', ': ')`. 默认为空白分隔。
| sort_keys | 如果为 True,则最终得到的结果按字母顺序排序所有的 JSON 对象内的键名。|
通过调整这些参数可以让您的应用程序更好地控制所生成的 JSON 字符串的形式与内容。
阅读全文
相关推荐
















