Yufan_Zhou commited on
Commit
0701598
·
1 Parent(s): 40c05c4

Fix imports, add generate_user_profile_final, and clean up old directories

Browse files
Files changed (27) hide show
  1. app.py +1 -1
  2. deepsite +0 -1
  3. generate_user_profile/output/all_profile_40.json +0 -7
  4. {generation_user_profile → generate_user_profile_final}/code/__init__.py +0 -0
  5. {generation_user_profile → generate_user_profile_final}/code/based_data.py +62 -105
  6. {generation_user_profile → generate_user_profile_final}/code/config.py +0 -0
  7. generate_user_profile_final/code/count_nodes.py +139 -0
  8. generation_user_profile/code/generate_profile.py → generate_user_profile_final/code/generate_profile_ind.py +414 -308
  9. generate_user_profile_final/code/read_profile_summaries.py +134 -0
  10. {generation_user_profile → generate_user_profile_final}/code/select_attributes.py +89 -150
  11. {generation_user_profile → generate_user_profile_final}/code/web_api_bridge.py +48 -30
  12. {generation_user_profile → generate_user_profile_final}/data/occupations_english.json +0 -0
  13. generation_user_profile/code/data/100.json +0 -395
  14. generation_user_profile/code/data/attribute_embeddings.pkl +0 -3
  15. generation_user_profile/code/data/attributes_merged.json +0 -0
  16. generation_user_profile/code/data/large_attributes copy.json +0 -0
  17. generation_user_profile/code/data/large_attributes.json +0 -67
  18. generation_user_profile/code/data/occupations_english copy.json +0 -933
  19. generation_user_profile/code/data/occupations_english.json +0 -42
  20. generation_user_profile/code/output/new_user_profiles.json +0 -39
  21. generation_user_profile/code/temp_input.json +0 -17
  22. generation_user_profile/data/100.json +0 -395
  23. generation_user_profile/data/attribute_embeddings.pkl +0 -3
  24. generation_user_profile/data/attributes_merged.json +0 -0
  25. generation_user_profile/data/large_attributes.json +0 -0
  26. generation_user_profile/output/selected_paths.json +0 -898
  27. generation_user_profile/output/user_profile.json +0 -383
app.py CHANGED
@@ -14,7 +14,7 @@ os.environ.pop('HTTPS_PROXY', None)
14
  current_dir = Path(__file__).parent
15
  # Use the improved generation method from generate_user_profile_final
16
  code_dir = current_dir / "generate_user_profile_final" / "code"
17
- sys.path.append(str(code_dir))
18
 
19
  # Import necessary modules
20
  from web_api_bridge import generate_profile_from_input
 
14
  current_dir = Path(__file__).parent
15
  # Use the improved generation method from generate_user_profile_final
16
  code_dir = current_dir / "generate_user_profile_final" / "code"
17
+ sys.path.insert(0, str(code_dir))
18
 
19
  # Import necessary modules
20
  from web_api_bridge import generate_profile_from_input
deepsite DELETED
@@ -1 +0,0 @@
1
- Subproject commit deccc784affba25b019ac02bd54c4899a9eaa86f
 
 
generate_user_profile/output/all_profile_40.json DELETED
@@ -1,7 +0,0 @@
1
- {
2
- "metadata": {
3
- "profiles_completed": 0,
4
- "total_profiles": 40,
5
- "description": "包含40个用户档案的集合"
6
- }
7
- }
 
 
 
 
 
 
 
 
{generation_user_profile → generate_user_profile_final}/code/__init__.py RENAMED
File without changes
{generation_user_profile → generate_user_profile_final}/code/based_data.py RENAMED
@@ -31,7 +31,9 @@ def get_occupations() -> List[str]:
31
  return _occupations_cache
32
 
33
  try:
34
- file_path = os.path.join(os.path.dirname(__file__), 'data', 'occupations_english.json')
 
 
35
  with open(file_path, 'r', encoding='utf-8') as f:
36
  _occupations_cache = json.load(f)
37
  return _occupations_cache
@@ -151,35 +153,34 @@ def generate_career_info(age: int) -> Dict[str, str]:
151
 
152
  def generate_location() -> Dict[str, str]:
153
  """
154
- 生成加拿大的地理位置信息,从加拿大的城市中随机选择一个城市
155
 
156
  Returns
157
  -------
158
  Dict[str, str]
159
- - country : 加拿大
160
- - city : 加拿大中随机选择的城市名
161
  """
162
  gc = GeonamesCache()
163
 
164
- # ---- 固定选择加拿大作为国家 ----
165
- country_code = "CA" # 加拿大的国家代码
166
  countries = gc.get_countries()
167
- country = countries[country_code]
168
 
169
- # ---- 过滤出加拿大的所有城市 ----
170
- cities = gc.get_cities()
171
- canada_cities_list = [
172
  city for city in cities.values()
173
  if city["countrycode"] == country_code
174
  ]
175
 
176
- # ---- 若加拿大没有城市数据,使用默认值 ----
177
- if not canada_cities_list:
178
- return {"country": "Canada", "city": "Toronto"}
179
 
180
  # ---- 随机选择一个城市 ----
181
- city_data = random.choice(canada_cities_list)
182
-
183
  return {"country": country["name"], "city": city_data["name"]}
184
 
185
 
@@ -207,26 +208,14 @@ def generate_personal_values(age: int, gender: str, occupation: str, location: D
207
  value_type = random.choice(['positive', 'negative', 'neutral'])
208
 
209
  prompt = f"""
210
- Generate a single, concise phrase describing a person's core values and belief system, based on the following profile:
211
- - Age: {age}
212
- - Gender: {gender}
213
- - Occupation: {occupation}
214
- - Location: {location['city']}, {location['country']}
215
-
216
- The value system's tone should be primarily **{value_type.upper()}**.
217
- - For **POSITIVE** values, the belief system should be oriented towards principles of growth, connection, optimism, or benevolence.
218
- - For **NEGATIVE** values, the belief system should be oriented towards principles of cynicism, pessimism, selfishness, or nihilism.
219
- - For **NEUTRAL** values, the belief system should be oriented towards principles of pragmatism, stoicism, individualism, or detached observation.
220
-
221
- The generated phrase must describe a belief system that is **internally coherent**. It can either align with or contrast against the person's background.
222
-
223
- **EXTREMELY IMPORTANT CONSTRAINT:**
224
- The value system MUST be centered on the individual's internal world, personal principles, or their relationship with abstract concepts like fate, nature, work, or self. It **MUST NOT**, under any circumstances, be about their relationship with a local community, neighborhood, social groups, or collective social identity. Any response focused on community is considered a failure.
225
 
226
- Generate one short, impactful phrase that captures the essence of this individualistic belief system.
227
 
228
- **CRITICAL:** You must format your response EXACTLY as a valid JSON object with this structure:
229
 
 
230
  {{
231
  "values_orientation": "short phrase describing their values"
232
  }}
@@ -282,34 +271,27 @@ def generate_life_attitude(age: int = None, gender: str = None, occupation: str
282
 
283
  # 创建提示词
284
  prompt = f"""
285
- Generate three specific attributes describing a person's life attitude, based on their profile and core values.
286
-
287
- **Profile:**
288
- - Age: {age}
289
- - Gender: {gender}
290
- - Occupation: {occupation}
291
- - Location: {location['city']}, {location['country']}
292
- - Core Values: {values_orientation}
293
-
294
- **Instructions:**
295
- 1. The generated attitude must be a direct and logical extension of the person's Core Values.
296
- 2. Avoid broad concepts like 'community' or 'balance'. Focus on the individual.
297
- 3. Generate ONLY the following three attributes, each as a single, distinct sentence.
298
-
299
- **Attribute Definitions:**
300
- - **attitude**: A single, concise sentence (5-10 words) defining their core belief or metaphor for life. This is their internal philosophy.
301
- - **attitude_details**: A single sentence (15-20 words) describing the specific, observable behaviors that result from this attitude. This is how their philosophy manifests externally.
302
- - **coping_mechanism**: A single sentence (5-10 words) describing a specific, recurring action or ritual they use to handle stress, challenges, or adversity.
303
-
304
- **CRITICAL:** You must format your response EXACTLY as a valid JSON object with this structure:
305
- {{
306
- "attitude": "single sentence",
307
- "attitude_details": "single sentence",
308
- "coping_mechanism": "single sentence"
309
- }}
310
-
311
- DO NOT include any text before or after the JSON. The response must be parseable by json.loads().
312
- """
313
 
314
  messages = [
315
  {"role": "system", "content": "You are an assistant that generates realistic human life attitudes in ONE SENTENCE, including positive, neutral, and negative outlooks. You ALWAYS respond with valid JSON objects that can be parsed by json.loads()."},
@@ -350,10 +332,10 @@ DO NOT include any text before or after the JSON. The response must be parseable
350
  }
351
 
352
  def generate_personal_story(age: int, gender: str, occupation: str, location: Dict[str, str],
353
- values_orientation: str, life_attitude: Dict[str, str]) -> Dict[str, Union[str, List[str]]]:
354
  """根据人物的基本信息生成个人故事。
355
 
356
- 使用GPT根据年龄、性别、职业、地区、价值观和生活态度生成一个人物的详细故事和关键生活事件
357
  故事可以包含各种正面或负面的经历,包括极端情况。
358
 
359
  Args:
@@ -367,7 +349,6 @@ def generate_personal_story(age: int, gender: str, occupation: str, location: Di
367
  Returns:
368
  Dict: 包含以下字段的字典:
369
  - personal_story: 个人故事描述
370
- - key_life_events: 关键生活事件列表
371
  """
372
  # 提取生活态度信息
373
  attitude = life_attitude.get("attitude", "")
@@ -387,14 +368,12 @@ def generate_personal_story(age: int, gender: str, occupation: str, location: Di
387
  Core Values: {values_orientation}
388
  Life Attitude: {attitude} ({attitude_category})
389
 
390
- IMPORTANT: The story can be positive, negative, or a mix of both. Please do not avoid including life experiences that may be controversial or have negative consequences. The narration should be as specific as possible, objective, and free from any subjective comments or value judgments. This could be a random event unrelated to the background, or a significant turning point in their life. Please avoid including anything related to community building.
391
 
392
- Please provide:
393
- 1. {num_stories} brief personal stories (each 100-150 words) that explain different aspects of how this person became who they are today
394
- 2. 1-2 key life events for each story (with approximate ages when they occurred)
395
 
396
  CRITICAL: You must format your response EXACTLY as a valid JSON object with this structure:
397
- {{"personal_stories": ["story 1", "story 2", ...], "key_life_events": [["event 1 for story 1", "event 2 for story 1"], ["event 1 for story 2", ...], ...]}}
398
 
399
  DO NOT include any text before or after the JSON. The response must be parseable by json.loads().
400
  """
@@ -406,50 +385,32 @@ def generate_personal_story(age: int, gender: str, occupation: str, location: Di
406
  try:
407
  response = get_completion(messages, temperature=0.8)
408
 
409
- # 解析JSON响应,只使用新的多故事格式
410
  result = parse_gpt_response(
411
  response,
412
- expected_fields=["personal_stories", "key_life_events"],
413
  field_defaults={
414
- "personal_stories": [],
415
- "key_life_events": [[]]
416
  }
417
  )
418
 
419
  # 处理多故事格式
420
  stories = result["personal_stories"]
421
- events = result["key_life_events"]
422
 
423
  # 确保有数据
424
- if not stories or not events:
425
- raise ValueError("Failed to generate personal stories or key life events")
426
 
427
  # 将多故事格式转换为统一的格式
428
  # 将所有故事连接起来,用分隔符隔开
429
  combined_story = "\n\n".join([f"Story {i+1}: {story}" for i, story in enumerate(stories)])
430
 
431
- # 将所有事件展平并标记每个故事的事件
432
- all_events = []
433
- for i, event_group in enumerate(events):
434
- for event in event_group:
435
- all_events.append(f"Story {i+1}: {event}")
436
-
437
- # 如果没有事件,添加一个默认事件
438
- if not all_events:
439
- all_events = ["Story 1: Significant life event"]
440
-
441
  return {
442
- "personal_story": combined_story,
443
- "key_life_events": all_events
444
  }
445
  except Exception as e:
446
- print(f"\nError in generate_personal_story_and_interests: {e}")
447
  raise
448
-
449
- return {
450
- "personal_story": combined_story,
451
- "key_life_events": all_events
452
- }
453
 
454
  def generate_interests_and_hobbies(personal_story: Dict[str, Any]) -> Dict[str, Any]:
455
  """根据人物的故事生成兴趣爱好列表。
@@ -475,21 +436,17 @@ def generate_interests_and_hobbies(personal_story: Dict[str, Any]) -> Dict[str,
475
 
476
  # 创建提示词
477
  prompt = f"""
478
- Based on the person's story below, infer **exactly two** distinct hobbies or interests.
 
 
479
 
480
- **Personal Story:**
481
- {story_text}
 
482
 
483
- **Instructions:**
484
- 1. **Infer, do not extract.** The interests should be logical deductions from the story, not words pulled directly from the text.
485
- 2. **Embrace complexity.** The interests can be positive (e.g., painting), negative (e.g., chain smoking), or neutral. Non-traditional or unexpected interests are encouraged if they fit the character's psychology.
486
- 3. **Ensure solitude.** Per critical instructions, the inferred interests MUST be solitary activities and not related to community-building.
487
- 4. **Be descriptive.** Each interest should be a short, descriptive phrase (around 3-5 words).
488
-
489
- **CRITICAL:** You must format your response EXACTLY as a valid JSON object with this structure:
490
- {{
491
  "interests": ["interest1", "interest2"]
492
- }}
493
 
494
  DO NOT include any text before or after the JSON. The response must be parseable by json.loads().
495
  """
 
31
  return _occupations_cache
32
 
33
  try:
34
+ # 修改路径,使用项目根目录下的data文件夹
35
+ project_root = os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))
36
+ file_path = os.path.join(project_root, 'data', 'occupations_english.json')
37
  with open(file_path, 'r', encoding='utf-8') as f:
38
  _occupations_cache = json.load(f)
39
  return _occupations_cache
 
153
 
154
  def generate_location() -> Dict[str, str]:
155
  """
156
+ 生成印度随机城市的地理位置信息。
157
 
158
  Returns
159
  -------
160
  Dict[str, str]
161
+ - country : 始终为 "India"
162
+ - city : 随机城市名
163
  """
164
  gc = GeonamesCache()
165
 
166
+ # ---- 固定国家为印度 ----
167
+ country_code = "IN"
168
  countries = gc.get_countries()
169
+ country = countries[country_code]
170
 
171
+ # ---- 过滤出印度的所有城市 ----
172
+ cities = gc.get_cities()
173
+ in_cities_list = [
174
  city for city in cities.values()
175
  if city["countrycode"] == country_code
176
  ]
177
 
178
+ # ---- 若意外无数据,兼底处理 ----
179
+ if not in_cities_list:
180
+ return {"country": country["name"], "city": "Mumbai"}
181
 
182
  # ---- 随机选择一个城市 ----
183
+ city_data = random.choice(in_cities_list)
 
184
  return {"country": country["name"], "city": city_data["name"]}
185
 
186
 
 
208
  value_type = random.choice(['positive', 'negative', 'neutral'])
209
 
210
  prompt = f"""
211
+ Generate a concise description of a person's core values and belief system based on:
212
+ Age: {age}, Gender: {gender}, Occupation: {occupation}, Location: {location['city']}, {location['country']}
 
 
 
 
 
 
 
 
 
 
 
 
 
213
 
214
+ IMPORTANT: This person has a {value_type.upper()} value system. Their values may be entirely consistent with their personal background or may conflict with it. Avoid introducing unnecessary contrasts or contradictions in their beliefs. Try to avoid being related to the community as much as possible. Avoid using words with similar meanings to ‘balance’ and ‘balance’.
215
 
216
+ Please generate a short phrase that clearly captures the essence of this person's core values and beliefs without adding conflicting ideas or turnarounds.
217
 
218
+ CRITICAL: You must format your response EXACTLY as a valid JSON object with this structure:
219
  {{
220
  "values_orientation": "short phrase describing their values"
221
  }}
 
271
 
272
  # 创建提示词
273
  prompt = f"""
274
+ Generate specific attributes about a person's life attitude based on the following information:
275
+
276
+ Age: {age}
277
+ Gender: {gender}
278
+ Occupation: {occupation}
279
+ Location: {location['city']}, {location['country']}
280
+ Core Values: {values_orientation}
281
+
282
+ IMPORTANT: This person's attitude toward life can be positive, neutral, or negative. In a negative state, they may hold a pessimistic, cynical, or even nihilistic view of life. Avoid involving concepts such as community or balance. Avoid using words with similar meanings to ‘balance’ and ‘balance’.
283
+
284
+ I need you to generate ONLY the following specific attributes, each expressed as a single sentence:
285
+
286
+ 1. attitude: A single, concise sentence (5-10 words) describing their overall life attitude
287
+ 2. attitude_details: A single sentence (15-20 words) explaining how this attitude manifests in their daily life
288
+ 3. coping_mechanism: A single sentence (5-10 words) describing how they deal with challenges
289
+
290
+ CRITICAL: You must format your response EXACTLY as a valid JSON object with this structure:
291
+ {{"attitude": "single sentence", "attitude_details": "single sentence", "coping_mechanism": "single sentence"}}
292
+
293
+ DO NOT include any text before or after the JSON. The response must be parseable by json.loads().
294
+ """
 
 
 
 
 
 
 
295
 
296
  messages = [
297
  {"role": "system", "content": "You are an assistant that generates realistic human life attitudes in ONE SENTENCE, including positive, neutral, and negative outlooks. You ALWAYS respond with valid JSON objects that can be parsed by json.loads()."},
 
332
  }
333
 
334
  def generate_personal_story(age: int, gender: str, occupation: str, location: Dict[str, str],
335
+ values_orientation: str, life_attitude: Dict[str, str]) -> Dict[str, str]:
336
  """根据人物的基本信息生成个人故事。
337
 
338
+ 使用GPT根据年龄、性别、职业、地区、价值观和生活态度生成一个人物的详细故事。
339
  故事可以包含各种正面或负面的经历,包括极端情况。
340
 
341
  Args:
 
349
  Returns:
350
  Dict: 包含以下字段的字典:
351
  - personal_story: 个人故事描述
 
352
  """
353
  # 提取生活态度信息
354
  attitude = life_attitude.get("attitude", "")
 
368
  Core Values: {values_orientation}
369
  Life Attitude: {attitude} ({attitude_category})
370
 
371
+ IMPORTANT: The story can be positive, negative, or a mix of both. Please do not avoid including life experiences that may be controversial or have negative consequences. The narration should be as specific as possible, objective, and free from any subjective comments or value judgments. The stories that unfold should be closely related to their country and region, reflecting events that could genuinely happen to the people there. This could be a random event unrelated to the background, or a significant turning point in their life. Please avoid including anything related to community building.
372
 
373
+ Please provide {num_stories} brief personal stories (each 150-200 words).
 
 
374
 
375
  CRITICAL: You must format your response EXACTLY as a valid JSON object with this structure:
376
+ {{"personal_stories": ["story 1", "story 2", ...]}}
377
 
378
  DO NOT include any text before or after the JSON. The response must be parseable by json.loads().
379
  """
 
385
  try:
386
  response = get_completion(messages, temperature=0.8)
387
 
388
+ # 解析JSON响应,只获取个人故事
389
  result = parse_gpt_response(
390
  response,
391
+ expected_fields=["personal_stories"],
392
  field_defaults={
393
+ "personal_stories": []
 
394
  }
395
  )
396
 
397
  # 处理多故事格式
398
  stories = result["personal_stories"]
 
399
 
400
  # 确保有数据
401
+ if not stories:
402
+ raise ValueError("Failed to generate personal stories")
403
 
404
  # 将多故事格式转换为统一的格式
405
  # 将所有故事连接起来,用分隔符隔开
406
  combined_story = "\n\n".join([f"Story {i+1}: {story}" for i, story in enumerate(stories)])
407
 
 
 
 
 
 
 
 
 
 
 
408
  return {
409
+ "personal_story": combined_story
 
410
  }
411
  except Exception as e:
412
+ print(f"\nError in generate_personal_story: {e}")
413
  raise
 
 
 
 
 
414
 
415
  def generate_interests_and_hobbies(personal_story: Dict[str, Any]) -> Dict[str, Any]:
416
  """根据人物的故事生成兴趣爱好列表。
 
436
 
437
  # 创建提示词
438
  prompt = f"""
439
+ Based on the following personal story and key life events, infer two to three hobbies or interests this person might use to relax. These activities can be positive or negative and may include non-traditional, controversial, or unexpected ones, such as various sports, traveling, or even smoking, drinking, or using marijuana. Please make inferences about the person’s possible interests based on the story, rather than simply extracting them directly from the story.
440
+
441
+ Personal Story: {story_text}
442
 
443
+ IMPORTANT: Avoid including anything related to community-building activities.
444
+
445
+ Please extract 2 hobbies or interests based on these reflections and format your response as a JSON object:
446
 
447
+ {{
 
 
 
 
 
 
 
448
  "interests": ["interest1", "interest2"]
449
+ }}
450
 
451
  DO NOT include any text before or after the JSON. The response must be parseable by json.loads().
452
  """
{generation_user_profile → generate_user_profile_final}/code/config.py RENAMED
File without changes
generate_user_profile_final/code/count_nodes.py ADDED
@@ -0,0 +1,139 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ """
3
+ 统计 attributes_merged.json 文件中的节点数量
4
+
5
+ 该脚本递归遍历 JSON 文件中的所有嵌套结构,统计所有的键(节点)数量。
6
+ 每个键都被视为一个节点,无论其值是空对象还是包含更多嵌套结构的对象。
7
+ """
8
+
9
+ import json
10
+ import os
11
+
12
+
13
+ def count_nodes_recursive(data):
14
+ """
15
+ 递归统计 JSON 对象中的节点数量
16
+
17
+ Args:
18
+ data: JSON 对象(字典或其他数据类型)
19
+
20
+ Returns:
21
+ int: 节点总数
22
+ """
23
+ if not isinstance(data, dict):
24
+ return 0
25
+
26
+ count = 0
27
+ for key, value in data.items():
28
+ # 每个键都算作一个节点
29
+ count += 1
30
+ # 如果值是字典,递归统计其中的节点
31
+ if isinstance(value, dict):
32
+ count += count_nodes_recursive(value)
33
+
34
+ return count
35
+
36
+
37
+ def analyze_json_structure(data, level=0, max_display_level=3):
38
+ """
39
+ 分析并显示 JSON 结构的层次信息
40
+
41
+ Args:
42
+ data: JSON 对象
43
+ level: 当前层级
44
+ max_display_level: 最大显示层级
45
+
46
+ Returns:
47
+ dict: 包含统计信息的字典
48
+ """
49
+ if not isinstance(data, dict):
50
+ return {"nodes": 0, "levels": 0, "leaf_nodes": 0}
51
+
52
+ stats = {"nodes": 0, "levels": level + 1, "leaf_nodes": 0}
53
+
54
+ for key, value in data.items():
55
+ stats["nodes"] += 1
56
+
57
+ if level < max_display_level:
58
+ indent = " " * level
59
+ print(f"{indent}- {key}")
60
+
61
+ if isinstance(value, dict):
62
+ if len(value) == 0:
63
+ # 空字典视为叶子节点
64
+ stats["leaf_nodes"] += 1
65
+ else:
66
+ # 递归分析子结构
67
+ sub_stats = analyze_json_structure(value, level + 1, max_display_level)
68
+ stats["nodes"] += sub_stats["nodes"]
69
+ stats["levels"] = max(stats["levels"], sub_stats["levels"])
70
+ stats["leaf_nodes"] += sub_stats["leaf_nodes"]
71
+ else:
72
+ # 非字典值视为叶子节点
73
+ stats["leaf_nodes"] += 1
74
+
75
+ return stats
76
+
77
+
78
+ def main():
79
+ """主函数"""
80
+ file_path = "/home/zhou/deeppersona/generate_user_profile_final/data/attributes_merged.json"
81
+
82
+ # 检查文件是否存在
83
+ if not os.path.exists(file_path):
84
+ print(f"错误: 文件 {file_path} 不存在")
85
+ return
86
+
87
+ try:
88
+ # 读取 JSON 文件
89
+ print(f"正在读取文件: {file_path}")
90
+ with open(file_path, 'r', encoding='utf-8') as f:
91
+ data = json.load(f)
92
+
93
+ print("=" * 60)
94
+ print("JSON 文件节点统计结果")
95
+ print("=" * 60)
96
+
97
+ # 统计总节点数
98
+ total_nodes = count_nodes_recursive(data)
99
+ print(f"总节点数量: {total_nodes}")
100
+
101
+ # 详细结构分析
102
+ print("\n" + "=" * 60)
103
+ print("结构分析")
104
+ print("=" * 60)
105
+
106
+ print("\n前3层结构预览:")
107
+ print("-" * 30)
108
+ stats = analyze_json_structure(data)
109
+
110
+ print(f"\n详细统计信息:")
111
+ print(f"- 总节点数: {stats['nodes']}")
112
+ print(f"- 最大层级深度: {stats['levels']}")
113
+ print(f"- 叶子节点数: {stats['leaf_nodes']}")
114
+ print(f"- 中间节点数: {stats['nodes'] - stats['leaf_nodes']}")
115
+
116
+ # 计算文件大小
117
+ file_size = os.path.getsize(file_path)
118
+ print(f"\n文件信息:")
119
+ print(f"- 文件大小: {file_size:,} 字节 ({file_size/1024:.2f} KB)")
120
+ print(f"- 平均每个节点: {file_size/total_nodes:.2f} 字节")
121
+
122
+ # 顶层分类统计
123
+ if isinstance(data, dict):
124
+ print(f"\n顶层分类数量: {len(data)}")
125
+ print("顶层分类列表:")
126
+ for i, key in enumerate(data.keys(), 1):
127
+ sub_count = count_nodes_recursive(data[key])
128
+ print(f" {i:2d}. {key}: {sub_count} 个子节点")
129
+
130
+ except json.JSONDecodeError as e:
131
+ print(f"JSON 解析错误: {e}")
132
+ except FileNotFoundError:
133
+ print(f"文件未找到: {file_path}")
134
+ except Exception as e:
135
+ print(f"发生错误: {e}")
136
+
137
+
138
+ if __name__ == "__main__":
139
+ main()
generation_user_profile/code/generate_profile.py → generate_user_profile_final/code/generate_profile_ind.py RENAMED
@@ -7,6 +7,8 @@ import os
7
  import random
8
  import sys
9
  import time
 
 
10
  from typing import Dict, List, Any, Optional
11
  from config import get_completion
12
  import subprocess
@@ -24,23 +26,64 @@ def safe_str(value):
24
  def get_project_root() -> str:
25
  """获取项目根目录的路径"""
26
  current_dir = os.path.dirname(os.path.abspath(__file__))
27
- project_root = os.path.abspath(os.path.join(current_dir, '..', '..'))
28
  return project_root
29
 
30
 
31
- def save_json_file(file_path: str, data: Dict) -> None:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
32
  """保存JSON文件
33
 
34
  Args:
35
  file_path: 目标文件路径
36
  data: 要保存的数据
 
 
 
 
37
  """
38
  try:
39
- os.makedirs(os.path.dirname(file_path), exist_ok=True)
40
- with open(file_path, 'w', encoding='utf-8') as f:
 
 
 
 
 
41
  json.dump(data, f, ensure_ascii=False, indent=2)
 
42
  except Exception as e:
43
  print(f"保存JSON文件时出错: {e}")
 
44
 
45
 
46
  def extract_paths(obj: Dict, prefix: str = "") -> List[str]:
@@ -64,16 +107,14 @@ def extract_paths(obj: Dict, prefix: str = "") -> List[str]:
64
  return paths
65
 
66
 
67
- # 已删除不再需要的generate_attribute_value函数
68
-
69
 
70
- def generate_category_attributes(category_paths: Dict, base_summary: str, category_name: str) -> Dict:
71
- """按类别批量生成属性值。
72
 
73
  参数:
74
- category_paths: 类下的所有属性路径及其结构。
75
- base_summary: 基础摘要文本
76
- category_name: 类名称。
77
 
78
  返回:
79
  Dict: 生成的所有属性值。
@@ -90,109 +131,93 @@ def generate_category_attributes(category_paths: Dict, base_summary: str, catego
90
  else:
91
  collect_leaf_paths(value, path)
92
 
93
- collect_leaf_paths(category_paths, category_name)
94
 
95
  # 如果没有叶子节点,直接返回空字典
96
  if not leaf_paths:
97
  return {}
98
 
99
- # 构建提示,一次性生成所有属性值
100
- system_prompt = """You are an AI assistant specialized in generating attribute values for personal profiles. Based on the provided base summary and multiple attribute paths, generate logically consistent values for each attribute path that:
101
- 1. Are factually consistent with the information present in the base summary.
102
- 2. Maintain strict logical consistency with each other, ensuring no contradictions or logical flaws are introduced.
103
- 3. Are semantically relevant to their respective attribute paths.
104
- 4. Are plausible, realistic, and contain appropriate detail while upholding overall credibility of the profile.
105
- IMPORTANT: Avoid including anything related to community-building activities.
106
-
107
- Format your response as a JSON object where each key is the attribute path and each value is the generated attribute value (not exceeding 50 characters).
108
- Example format:
109
- {
110
- "Category.Subcategory.AttributePath1": "Generated value 1",
111
- "Category.Subcategory.AttributePath2": "Generated value 2"
112
- }
113
- """
114
-
115
- # 如果叶子节���过多,分批处理
116
- MAX_PATHS_PER_BATCH = 50 # 每批处理的最大路径数
117
- all_generated_values = {}
118
 
119
- # 将叶子节点分批
120
- batches = [leaf_paths[i:i + MAX_PATHS_PER_BATCH] for i in range(0, len(leaf_paths), MAX_PATHS_PER_BATCH)]
 
 
 
121
 
122
- print(f" 正在生成 {category_name} 下的 {len(leaf_paths)} 个属性值,分 {len(batches)} 批处理...")
 
 
 
123
 
124
- for batch_index, batch_paths in enumerate(batches):
125
- user_prompt = f"Base Summary:\n{base_summary}\n\nCategory: {category_name}\n\nAttribute Paths to generate values for (Batch {batch_index+1}/{len(batches)}):\n"
126
- for path in batch_paths:
127
- user_prompt += f"- {path}\n"
128
- user_prompt += "\nPlease generate suitable values for all these attributes that are consistent with the base summary and fit the semantic context of each attribute path."
129
-
130
- messages = [
131
- {"role": "system", "content": system_prompt},
132
- {"role": "user", "content": user_prompt}
133
- ]
134
-
135
  try:
136
- print(f" 正在生成第 {batch_index+1}/{len(batches)} 批,包含 {len(batch_paths)} 个属性...")
137
- response = get_completion(messages)
138
- if not response:
139
- print(f" 生成第 {batch_index+1} 批属性值失败: 空响应")
140
- continue
141
-
142
- # 尝试解析JSON响应
143
- try:
144
- import json
145
- import re
146
-
147
- # 检查响应是否包含在Markdown代码块中
148
- json_match = re.search(r'```(?:json)?\s*([\s\S]+?)\s*```', response)
149
- if json_match:
150
- # 提取代码块中的JSON内容
151
- json_content = json_match.group(1).strip()
152
- batch_values = json.loads(json_content)
153
- else:
154
- # 尝试直接解析整个响应
155
- batch_values = json.loads(response)
156
-
157
- print(f" 成功生成第 {batch_index+1} 批的 {len(batch_values)} 个属性值")
158
- all_generated_values.update(batch_values)
159
- except json.JSONDecodeError as e:
160
- print(f" 解析第 {batch_index+1} 批属性值JSON失败: {e}")
161
- print(f" 响应内容: {response[:100]}..." if len(response) > 100 else f"响应内容: {response}")
162
- except Exception as e:
163
- print(f" 生成第 {batch_index+1} 批属性值时出错: {e}")
164
-
165
- print(f" 所有批次处理完成,共生成 {len(all_generated_values)} 个属性值")
166
- return all_generated_values
167
 
168
 
169
- def generate_final_summary(profile: Dict) -> str:
170
- """Generate a final summary for the user profile.
171
 
172
- Args:
173
- profile: The complete user profile data.
174
- Returns:
175
- str: The final summary text.
 
176
  """
177
  system_prompt = """
178
- Your Task: Create a believable and engaging personal profile, 150-400 words, based on the provided text. Your ultimate goal is a narrative that feels like it comes from a real, self-aware person.The description can be divided into a few paragraphs
179
 
180
  Content Requirements:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
181
 
182
- Adopt a first-person perspective ("I," "my," "me"). The output should be a seamless narrative, not just a list of facts.
183
-
184
- !! GUIDELINES FOR A HUMAN-LIKE AND COHERENT NARRATIVE !!
185
-
186
- 1. **Ensure an Authentic Voice:**
187
- Your narrative should generally reflect the tone and sophistication suggested by the profile's data.
188
- However, if the language in the source text seems inconsistent with the character's stated age or background, your primary duty is to adopt a voice that is truly authentic to the character's context. You must **translate** the *meaning* of the data into a believable voice, rather than copying the source text's style verbatim.
189
 
190
- 2. **Build a Plausible Narrative from the Facts:**
191
- Your narrative must be grounded in the source text. Do not invent new core facts. You can and should add minor, plausible details that bridge gaps between facts to make the narrative more vivid and realistic.
192
- Additionally, if a core fact in the source data appears highly implausible or contradictory in a real-world context, you should creatively reframe it to make the story believable. Instead of stating the implausible fact directly, you can frame it as part of a unique circumstance, a powerful memory, a personal aspiration, or a fantasy. Your goal is to produce a believable story, even if it requires creatively interpreting the source data to resolve inconsistencies.
193
-
194
- """
195
- user_prompt = f"Complete Profile (in JSON format):\n{json.dumps(profile, ensure_ascii=False, indent=2)}\n\nPlease generate an objective and factual summary in English that covers all core information from the profile in clear, coherent paragraphs. The summary should be between 150-400 words."
196
 
197
  messages = [
198
  {"role": "system", "content": system_prompt},
@@ -202,13 +227,15 @@ Adopt a first-person perspective ("I," "my," "me"). The output should be a seaml
202
  try:
203
  response = get_completion(messages)
204
  summary = response.strip() if response else ""
205
- # Enforce the word limit between 300-400 words
206
  word_count = len(summary.split())
207
- if word_count < 150:
208
- print(f"Warning: Summary is only {word_count} words, less than the target minimum of 300 words")
209
  elif word_count > 400:
210
  summary = enforce_word_limit(summary, 400)
211
- print(f"Summary was trimmed to 400 words (from {word_count})")
 
 
212
  return summary
213
  except Exception as e:
214
  print(f"Error generating final summary: {e}")
@@ -248,36 +275,45 @@ def generate_section(template_section: Dict, base_info: str, section_name: str,
248
 
249
  print(f"{indent_str}正在生成 {section_name} 部分...")
250
 
251
- # 无论是一级大类还是子类一次性生成所有属性
252
- # 使用新函数次性生成所有属性值
253
- all_attributes = generate_category_attributes(template_section, base_info, section_name)
254
-
255
- # 如果成功生成了属性值,将其添加到结果中
256
- if all_attributes:
257
- # 构建结果字典
258
- for path, value in all_attributes.items():
259
- # 分解路径
260
- parts = path.split('.')
261
- # 跳过第一部分(大类名称)
262
- if len(parts) > 1 and parts[0] == section_name:
263
- parts = parts[1:]
264
-
265
- # 递归构建嵌套字典
266
- current = section_result
267
- for i, part in enumerate(parts):
268
- if i == len(parts) - 1: # 最后一个部分,设置值
269
- current[part] = value
270
- print(f"{indent_str} - {'.'.join(parts)}: {value}")
271
- else:
272
- if part not in current:
273
- current[part] = {}
274
- current = current[part]
275
 
276
- return section_result
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
277
 
278
- # 如果一次性生成失败,返回空结果
279
- print(f"{indent_str}一次性生成失败,返回空结果")
280
- # 不再使用递归方式生成属性值
 
 
 
 
 
 
 
 
281
 
282
  return section_result
283
 
@@ -290,77 +326,87 @@ def enforce_word_limit(text: str, limit: int = 300) -> str:
290
  return text
291
 
292
 
293
- def append_profile_to_json(file_path: str, profile: Dict) -> None:
294
  """追加个人资料到 JSON 文件
295
 
296
  参数:
297
  file_path: 目标文件路径
298
  profile: 要追加的个人资料
 
 
 
 
299
  """
300
  try:
301
- # Create output directory if it doesn't exist
302
- output_dir = os.path.join(os.path.dirname(__file__), "output")
303
- os.makedirs(output_dir, exist_ok=True)
304
-
305
- # Append the profile to the JSON file
306
- output_file = os.path.join(output_dir, "new_user_profiles.json")
307
-
308
- # Load existing profiles if the file exists
309
- if os.path.exists(output_file):
310
- with open(output_file, "r", encoding="utf-8") as f:
311
- profiles = json.load(f)
312
  else:
313
- profiles = []
314
-
315
- # Append the new profile
316
- profiles.append(profile)
 
 
 
317
 
318
- # Write back to the file
319
- with open(output_file, "w", encoding="utf-8") as f:
320
  json.dump(profiles, f, ensure_ascii=False, indent=2)
 
321
  except Exception as e:
322
  print(f"追加个人资料到 JSON 文件时出错: {e}")
323
- # Continue execution even if there's an error with the output file
324
 
325
 
326
- def generate_single_profile(template=None, profile_index=None) -> Dict:
327
- """生成单个用户档案。
328
 
329
  参数:
330
  template: 可选的用于生成的模板。
331
  profile_index: 要生成的档案索引。
 
332
 
333
  返回:
334
  Dict: 生成的用户档案。
335
  """
336
 
337
- # 第一步:运行 select_attributes.py 选择属性
338
- print(f'\n第一步:运行 select_attributes.py 选择属性...')
 
339
  try:
340
- # 使用subprocess运行select_attributes.py
341
- subprocess_result = subprocess.run(
342
- ["python", os.path.join(os.path.dirname(__file__), "select_attributes.py")],
343
- capture_output=False, # 直接输出到终端,而不是捕获
344
- text=True,
345
- check=True
346
- )
347
- print("\nselect_attributes.py 运行完,属性选择完毕")
348
- print("\n第二步:按一级属性批量生成内容...")
 
 
 
 
 
 
 
 
349
  except Exception as e:
350
  print(f"Error executing select_attributes functions: {e}")
351
  return {}
352
 
353
  # Load basic profile information and selected paths (base info is only a reference for GPT generation)
354
- # 使用相对路径获取用户配置文件路径
355
- base_info_path = os.path.join(os.path.dirname(os.path.dirname(__file__)), 'output', 'user_profile.json')
 
356
  with open(base_info_path, 'r', encoding='utf-8') as f:
357
  base_info = json.load(f)
358
  if 'Occupations' not in base_info:
359
  print("Warning: 'Occupations' key is missing in the user profile. Setting it to an empty list.")
360
  base_info['Occupations'] = []
361
 
362
- # 使用相对路径获取选定路径文件路径
363
- selected_paths_path = os.path.join(os.path.dirname(os.path.dirname(__file__)), 'output', 'selected_paths.json')
364
  with open(selected_paths_path, 'r', encoding='utf-8') as f:
365
  selected_paths = json.load(f)
366
 
@@ -375,171 +421,236 @@ def generate_single_profile(template=None, profile_index=None) -> Dict:
375
  profile = {
376
  "Base Info": base_info,
377
  "Generated At": time.strftime("%Y-%m-%d %H:%M:%S"),
378
- "Profile Index": (profile_index + 1) if profile_index is not None else 1
379
  }
380
 
381
  # 步骤1:生成 Demographic Information
 
382
  demographic_input = (
383
  "Base Information (for reference):\n" + json.dumps(base_info, ensure_ascii=False, indent=2) + "\n\n"
384
- "Instructions: Based on the `base_info` provided, **develop and elaborate on** the 'Demographic Information' section in English. Your task is to **appropriately expand upon and enrich** the existing information from `base_info`. Focus on elaborating on the given data points, adding further relevant details, or providing context to make the demographic profile more comprehensive and insightful. While you should avoid simply repeating the `base_info` verbatim, ensure that all generated content is **directly built upon and logically extends** the information available in `base_info`, rather than introducing entirely new, unrelated demographic facts. The goal is a coherent, more descriptive, and enhanced version of the original data."
 
385
  )
386
  demographic_template = selected_paths.get("Demographic Information")
387
- if isinstance(demographic_template, dict):
388
- demographic_template = json.dumps(demographic_template, ensure_ascii=False)
389
  if demographic_template and demographic_template != "":
390
  print('Generating Demographic Information...')
391
- demographic_section = generate_section(json.loads(demographic_template), demographic_input, "Demographic Information")
392
- profile["Demographic Information"] = demographic_section
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
393
  else:
394
  print('No valid "Demographic Information" template found in selected_paths, skipping Demographic Information.')
395
-
396
  # 步骤2:生成职业信息
397
  career_template = selected_paths.get("Career and Work Identity")
398
- if isinstance(career_template, dict):
399
- career_template = json.dumps(career_template, ensure_ascii=False)
400
  if career_template and career_template != "":
401
  print('Generating Career and Work Identity...')
402
  # Construct input for Career and Work Identity, including Demographic Information
403
  career_input = (
404
  "Base Information (for reference):\n" + json.dumps(base_info, ensure_ascii=False, indent=2) + "\n\n"
 
405
  "Demographic Information (for reference):\n" + json.dumps(profile.get("Demographic Information", {}), ensure_ascii=False, indent=2) + "\n\n"
406
- "Instructions: Based on the `base_info` and `Demographic Information` provided above, **develop and elaborate on** the 'Career and Work Identity' section in English. "
407
- "Your aim is to distill and articulate the career identity, professional journey, and work-related aspirations that are **evident or can be reasonably inferred from the combined `base_info` and `Demographic Information`**. "
408
  "Offer fresh insights by providing a **deeper, more nuanced interpretation or by highlighting connections within the provided data** that illuminate these aspects. "
409
  "Ensure that this elaboration is **logically consistent with and directly stems from** the provided information. "
410
  "**Do not introduce new career details or aspirations that are not grounded in or clearly supported by the source material.** "
411
  "The section should be an insightful and coherent expansion of what can be understood from the source material."
412
  )
413
- career_info_section = generate_section(json.loads(career_template), career_input, "Career and Work Identity")
414
- profile["Career and Work Identity"] = career_info_section
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
415
  else:
416
  print('No valid "Career and Work Identity" template found in selected_paths, skipping.')
417
- # Optionally, to stop overall generation if career is mandatory, you could return profile here; else just continue.
418
- # return profile
419
 
420
  # 步骤3:生成 Core Values, Beliefs, and Philosophy
421
  pv_orientation = base_info.get("personal_values", {}).get("values_orientation", "")
422
  if not isinstance(pv_orientation, str):
423
  pv_orientation = json.dumps(pv_orientation, ensure_ascii=False)
424
  core_input = (
 
425
  "Demographic Information (for reference):\n" + json.dumps(profile.get("Demographic Information", {}), ensure_ascii=False, indent=2) + "\n\n"
426
  "Career Information (for reference):\n" + json.dumps(profile.get("Career and Work Identity", {}), ensure_ascii=False, indent=2) + "\n\n"
427
  "Personal Values (for reference):\n" + pv_orientation + "\n\n"
428
- "Instructions: Based on the full context provided (including base_info, Demographic Information, and Career Information), develop and elaborate on the 'Core Values, Beliefs, and Philosophy' section in English. Your aim is to distill and articulate the core values, beliefs, and philosophical outlook that are evident or can be reasonably inferred from the provided information. Offer fresh insights by providing a deeper, more nuanced interpretation or by highlighting connections between all data points that illuminate these guiding principles. Pay special attention to the person's location and background, infusing the philosophical outlook with relevant cultural nuances from their region. Ensure that this elaboration is logically consistent with and directly stems from the provided information. Do not introduce new values, beliefs, or philosophies that are not grounded in or clearly supported by the source material. The section should be an insightful and coherent expansion of what can be understood from the source material.IMPORTANT: Avoid including anything related to community-building activities."
429
  )
430
  core_template = selected_paths.get("Core Values, Beliefs, and Philosophy")
431
- if isinstance(core_template, dict):
432
- core_template = json.dumps(core_template, ensure_ascii=False)
433
  if core_template and core_template != "":
434
  print('Generating Core Values, Beliefs, and Philosophy...')
435
- core_values_section = generate_section(json.loads(core_template), core_input, "Core Values, Beliefs, and Philosophy")
436
- profile["Core Values, Beliefs, and Philosophy"] = core_values_section
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
437
  else:
438
  print('No valid "Core Values, Beliefs, and Philosophy" template found in selected_paths, skipping.')
439
 
440
- # 步骤4:生成 Lifestyle and Daily Routine 及 Cultural and Social Context
441
  life_attitude = base_info["life_attitude"]
442
-
443
- # 将各部分转换为字符串以便在提示中使用
444
- base_info_str = json.dumps(base_info, ensure_ascii=False, indent=2)
445
- demographic_info_str = json.dumps(profile.get("Demographic Information", {}), ensure_ascii=False, indent=2)
446
- career_info_str = json.dumps(profile.get("Career and Work Identity", {}), ensure_ascii=False, indent=2)
447
- core_values_str = json.dumps(profile.get("Core Values, Beliefs, and Philosophy", {}), ensure_ascii=False, indent=2)
448
-
449
  lifestyle_input = (
450
- "## Full Profile Context (for reference)\n\n"
451
- f"### Base Information:\n{base_info_str}\n\n"
452
- f"### Demographic Information:\n{demographic_info_str}\n\n"
453
- f"### Career and Work Identity:\n{career_info_str}\n\n"
454
- f"### Core Values, Beliefs, and Philosophy:\n{core_values_str}\n\n"
455
-
456
- "## Instructions:\n"
457
- "Based on the **complete profile context provided above**, your task is to generate content for the section you are asked to create. Follow the specific guidance below for the relevant section.\n\n"
458
-
459
- "**Guidance for 'Lifestyle and Daily Routine':**\n"
460
- "When generating this section, focus on translating the person's values, career, age, and philosophy into **concrete daily actions and habits**. How do their beliefs manifest in their **work schedule, sleep patterns, physical activity, vacation style, and travel preferences**? Ensure the lifestyle is a logical and practical extension of their established character.\n\n"
461
-
462
- "**Guidance for 'Cultural and Social Context':**\n"
463
- "When generating this section, focus on the person's **relationship with society and their environment**. Based on their location, values, and life story, describe their **living environment, preferred social circle, communication style, parenting style (if applicable), and relationship with tradition**. How do their internal beliefs shape their external social world?"
464
  )
465
-
466
  lifestyle_template = selected_paths.get("Lifestyle and Daily Routine")
467
- if isinstance(lifestyle_template, dict):
468
- lifestyle_template = json.dumps(lifestyle_template, ensure_ascii=False)
469
  if lifestyle_template and lifestyle_template != "":
470
  print('Generating Lifestyle and Daily Routine...')
471
- lifestyle_section = generate_section(json.loads(lifestyle_template), lifestyle_input, "Lifestyle and Daily Routine")
472
- profile["Lifestyle and Daily Routine"] = lifestyle_section
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
473
  else:
474
  print('No valid "Lifestyle and Daily Routine" template found in selected_paths, skipping.')
 
 
 
 
 
 
 
 
 
 
 
475
  cultural_template = selected_paths.get("Cultural and Social Context")
476
- if isinstance(cultural_template, dict):
477
- cultural_template = json.dumps(cultural_template, ensure_ascii=False)
478
  if cultural_template and cultural_template != "":
479
  print('Generating Cultural and Social Context...')
480
- cultural_section = generate_section(json.loads(cultural_template), lifestyle_input, "Cultural and Social Context")
481
- profile["Cultural and Social Context"] = cultural_section
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
482
  else:
483
  print('No valid "Cultural and Social Context" template found in selected_paths, skipping.')
484
 
485
- # 步骤5:生成 Hobbies, Interests, and Lifestyle
486
  interests = base_info["interests"]
487
  hobbies_input = (
488
  "Base Information (for reference):\n" + json.dumps(base_info, ensure_ascii=False, indent=2) + "\n\n"
 
489
  "Demographic Information (for reference):\n" + json.dumps(profile.get("Demographic Information", {}), ensure_ascii=False, indent=2) + "\n\n"
490
  "Career Information (for reference):\n" + json.dumps(profile.get("Career and Work Identity", {}), ensure_ascii=False, indent=2) + "\n\n"
491
  "Core Values, Beliefs, and Philosophy (for reference):\n" + json.dumps(profile.get("Core Values, Beliefs, and Philosophy", {}), ensure_ascii=False, indent=2) + "\n\n"
492
  "Lifestyle and Daily Routine (for reference):\n" + json.dumps(profile.get("Lifestyle and Daily Routine", {}), ensure_ascii=False, indent=2) + "\n\n"
493
  "Cultural and Social Context (for reference):\n" + json.dumps(profile.get("Cultural and Social Context", {}), ensure_ascii=False, indent=2) + "\n\n"
494
-
495
- "## Instructions:\n"
496
- "Based on the complete profile context provided above, generate the 'Hobbies, Interests, and Lifestyle' section.\n\n"
497
-
498
- "1. **Use Base Hobbies as a Starting Point:** Begin with the interests listed in `base_info`, but treat them as seeds for deeper exploration, not as rigid boundaries.\n\n"
499
-
500
- "2. **Embrace Imagination and Psychological Depth:** This is the key instruction. You are encouraged to use **creative imagination**. Based on the person's complete profile, the interpretation of their interests can be **positive, deeply negative, or even 'toxic'**. Explore the hidden psychological dimensions of their hobbies. How could a seemingly simple interest become a mechanism for **coping, obsession, self-destruction, control, or escapism**? Be bold in your interpretation.\n\n"
501
-
502
- "3. **Synthesize with Full Context:** Ensure your imaginative elaborations are still **psychologically consistent** with the person's established character. The 'how' and 'why' of their interests should be deeply connected to their career, demographics, and worldview.\n\n"
503
-
504
- "4. **Detail Related Lifestyle Choices:** Describe the lifestyle choices that support these interests. This includes the types of products they might buy, the media they consume, or other related activities, all of which should reflect the **positive or negative nature** of their engagement with the hobby."
505
  )
506
-
507
  hobbies_template = selected_paths.get("Hobbies, Interests, and Lifestyle")
508
- if isinstance(hobbies_template, dict):
509
- hobbies_template = json.dumps(hobbies_template, ensure_ascii=False)
510
  if hobbies_template and hobbies_template != "":
511
  print('Generating Hobbies, Interests, and Lifestyle...')
512
- hobbies_section = generate_section(json.loads(hobbies_template), hobbies_input, "Hobbies, Interests, and Lifestyle")
513
- profile["Hobbies, Interests, and Lifestyle"] = hobbies_section
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
514
  else:
515
  print('No valid "Hobbies, Interests, and Lifestyle" template found in selected_paths, skipping.')
516
 
517
- # 步骤6:生成 Other Attributes
518
  other_attributes_input = (
 
519
  "Complete Profile (for reference):\n" + json.dumps(profile, ensure_ascii=False, indent=2) + "\n\n"
520
- "## Instructions:\n"
521
- "Based on the complete profile provided, your task is to synthesize and generate a set of 'Other Attributes' in English that add final depth and nuance to the character. Instead of random facts, derive these attributes by analyzing the entire profile as a whole. Specifically, generate details for the following categories:\n\n"
522
-
523
- "1. **Communication Style:**\n"
524
- "Describe their typical manner of speaking and writing. Is it direct, quiet, formal, verbose, witty, or something else? How do their core values and social context shape how they communicate with others?\n\n"
525
-
526
- "2. **Decision-Making Style:**\n"
527
- "Analyze how they generally make choices. Are they impulsive, analytical, cautious, risk-averse, or guided by emotion? Connect this style to their career, financial status, and key life events.\n\n"
528
-
529
- "3. **Defining Quirks or Habits:**\n"
530
- "Imagine and describe one or two small, defining habits or personal quirks that make the character feel real and unique. This could be a daily ritual, a nervous gesture, or an unusual habit related to their hobbies. Ensure it is psychologically consistent with their established personality.\n\n"
531
-
532
- "4. **Core Internal Conflict:**\n"
533
- "Identify and articulate the central psychological tension or conflict that defines the character's inner world. What two opposing forces, desires, or beliefs are constantly at odds within them? This should serve as a concise summary of their core psychological drama."
534
-
535
  )
536
  other_template = selected_paths.get("Other Attributes")
537
- if isinstance(other_template, dict):
538
- other_template = json.dumps(other_template, ensure_ascii=False)
539
  if other_template and other_template != "":
540
  print('Generating Other Attributes...')
541
- other_attributes_section = generate_section(json.loads(other_template), other_attributes_input, "Other Attributes")
542
- profile["Other Attributes"] = other_attributes_section
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
543
  else:
544
  print('No valid "Other Attributes" template found in selected_paths, skipping.')
545
 
@@ -548,90 +659,97 @@ def generate_single_profile(template=None, profile_index=None) -> Dict:
548
  for key in ['base_info', 'Base Info', 'personal_story', 'interests', 'Occupations']:
549
  profile_for_summary.pop(key, None)
550
 
551
- # Generate the final summary using the filtered profile
552
- final_summary_text = generate_final_summary(profile_for_summary)
553
  profile["Summary"] = final_summary_text
554
 
555
  # Remove unwanted keys from the final profile
556
  for key in ['base_info', 'Base Info', 'personal_story', 'interests', 'Occupations']:
557
  profile.pop(key, None)
558
 
559
- # 将生成的profile追加到一个新的JSON文件中,支持存储多个user profile
560
- new_profiles_file = os.path.join(os.path.dirname(__file__), 'output', 'new_user_profiles.json')
561
- append_profile_to_json(new_profiles_file, profile)
562
-
563
  return profile
564
 
565
 
566
- def generate_multiple_profiles(num_profiles: int = 50) -> None:
567
- """生成多完整的用户档案,并将它们保存到一个合并的 JSON 文件中。
568
 
569
  参数:
570
- num_profiles: 要生成的档案,默认为50个
571
  """
572
  start_time = time.time()
573
- print(f"开始生成 {num_profiles} 个人资料...")
574
 
575
  # 获取项目根目录
576
  project_root = get_project_root()
577
 
578
  # 创建输出目录
579
- output_dir = os.path.join(project_root, "generate_user_profile", "output")
580
  os.makedirs(output_dir, exist_ok=True)
581
 
582
- # 总配置文件数量
583
- total_profiles = num_profiles
 
584
 
585
  # 初始化存储所有配置文件的字典
586
  all_profiles = {
587
  "metadata": {
588
  "profiles_completed": 0,
589
  "total_profiles": total_profiles,
590
- "description": f"包含{total_profiles}个用户档案的集合"
 
591
  }
592
  }
593
 
594
- # 设置合并文件路径
595
- all_profiles_path = os.path.join(output_dir, f"all_profile_{num_profiles}.json")
 
596
 
597
  # 初始化保存合并文件
598
- save_json_file(all_profiles_path, all_profiles)
599
- print(f"初始化合并文件: {all_profiles_path}")
 
600
 
601
  # 计数器,用于跟踪总共生成的档案数量
602
  profile_count = 0
603
 
604
- # 逐生成配置文件
605
- for profile_index in range(num_profiles):
606
- profile_count += 1
607
-
608
- print(f"\n----- 开始生成第 {profile_index+1}/{num_profiles} 个用户资料 -----\n")
609
 
610
- try:
611
- # 生成单个配置文件
612
- profile = generate_single_profile(None, profile_index)
613
-
614
- if not profile:
615
- print(f"第 {profile_index+1} 个资料生成失败,跳过")
616
- continue
617
 
618
- # 添加到总字典并保存
619
- profile_key = f"Profile_{profile_index+1}"
620
- all_profiles[profile_key] = profile
621
- all_profiles["metadata"]["profiles_completed"] = profile_count
622
 
623
- # 保存更新后的合并文件
624
- save_json_file(all_profiles_path, all_profiles)
625
- print(f"\n总进度更新: {profile_count}/{total_profiles} 个资料已完成")
626
- print(f"已将第 {profile_index+1} 个用户资料添加到合并文件: {all_profiles_path}")
627
- print("\n" + "-"*50 + "\n")
628
- except Exception as e:
629
- print(f"生成第 {profile_index+1} 个个人资料时出错: {e}")
630
- continue
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
631
 
632
  # 添加生成完成状态
633
  all_profiles["metadata"]["status"] = "completed"
634
- save_json_file(all_profiles_path, all_profiles)
635
 
636
  end_time = time.time()
637
  elapsed_time = end_time - start_time
@@ -639,16 +757,4 @@ def generate_multiple_profiles(num_profiles: int = 50) -> None:
639
  print(f"生成完成,耗时 {elapsed_time:.2f} 秒")
640
 
641
  if __name__ == "__main__":
642
- # Generate only one profile
643
- print("Generating a single user profile...")
644
- profile = generate_single_profile(None, 0)
645
-
646
- # Display only the final summary
647
- if profile and "Summary" in profile:
648
- print("\n" + "="*50)
649
- print("FINAL PROFILE SUMMARY:")
650
- print("="*50)
651
- print(profile["Summary"])
652
- print("="*50)
653
- else:
654
- print("Failed to generate profile or summary.")
 
7
  import random
8
  import sys
9
  import time
10
+ import shutil
11
+ from datetime import datetime
12
  from typing import Dict, List, Any, Optional
13
  from config import get_completion
14
  import subprocess
 
26
  def get_project_root() -> str:
27
  """获取项目根目录的路径"""
28
  current_dir = os.path.dirname(os.path.abspath(__file__))
29
+ project_root = os.path.abspath(os.path.join(current_dir, '..'))
30
  return project_root
31
 
32
 
33
+ def copy_files_from_source_to_target():
34
+ """复制文件从源位置到目标位置"""
35
+ # 源路径 - 现在已经不需要复制,因为我们直接保存到正确的目录
36
+ # 但为了兼容性,我们保留这个函数
37
+ correct_output_dir = os.path.join(get_project_root(), "output")
38
+
39
+ # 确保目标目录存在
40
+ os.makedirs(correct_output_dir, exist_ok=True)
41
+
42
+ print(f"输出目录已设置为: {correct_output_dir}")
43
+ return True
44
+
45
+
46
+ def get_timestamped_filename(base_path: str) -> str:
47
+ """为文件路径添加时间戳
48
+
49
+ Args:
50
+ base_path: 基础文件路径
51
+
52
+ Returns:
53
+ str: 带时间戳的文件路径
54
+ """
55
+ directory = os.path.dirname(base_path)
56
+ filename = os.path.basename(base_path)
57
+ name, ext = os.path.splitext(filename)
58
+ timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
59
+ timestamped_filename = f"{name}_{timestamp}{ext}"
60
+ return os.path.join(directory, timestamped_filename)
61
+
62
+
63
+ def save_json_file(file_path: str, data: Dict, use_timestamp: bool = True) -> str:
64
  """保存JSON文件
65
 
66
  Args:
67
  file_path: 目标文件路径
68
  data: 要保存的数据
69
+ use_timestamp: 是否使用时间戳,默认为True
70
+
71
+ Returns:
72
+ str: 实际保存的文件路径
73
  """
74
  try:
75
+ if use_timestamp:
76
+ actual_path = get_timestamped_filename(file_path)
77
+ else:
78
+ actual_path = file_path
79
+
80
+ os.makedirs(os.path.dirname(actual_path), exist_ok=True)
81
+ with open(actual_path, 'w', encoding='utf-8') as f:
82
  json.dump(data, f, ensure_ascii=False, indent=2)
83
+ return actual_path
84
  except Exception as e:
85
  print(f"保存JSON文件时出错: {e}")
86
+ return file_path
87
 
88
 
89
  def extract_paths(obj: Dict, prefix: str = "") -> List[str]:
 
107
  return paths
108
 
109
 
 
 
110
 
111
+ def generate_category_attributes(category_paths: Dict, custom_prompt: str, category_name: str) -> Dict:
112
+ """一次性生成一个一级大类下的所有属性值。
113
 
114
  参数:
115
+ category_paths: 一级大类下的所有属性路径及其结构。
116
+ custom_prompt: 自定义的完整prompt,包含具体的生成指令
117
+ category_name: 一级大类名称。
118
 
119
  返回:
120
  Dict: 生成的所有属性值。
 
131
  else:
132
  collect_leaf_paths(value, path)
133
 
134
+ collect_leaf_paths(category_paths, "")
135
 
136
  # 如果没有叶子节点,直接返回空字典
137
  if not leaf_paths:
138
  return {}
139
 
140
+ # 简化的系统提示,只负责JSON格式
141
+ system_prompt = """Format your response as a JSON object where each key is the attribute path and each value is the generated attribute value (not exceeding 100 characters)."""
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
142
 
143
+ # 使用自定义prompt + 属性路径列表
144
+ user_prompt = f"{custom_prompt}\n\nAttribute Paths to generate values for:\n"
145
+ for path in leaf_paths:
146
+ user_prompt += f"- {path}\n"
147
+ user_prompt += "\nGenerate suitable values for all these attributes in JSON format."
148
 
149
+ messages = [
150
+ {"role": "system", "content": system_prompt},
151
+ {"role": "user", "content": user_prompt}
152
+ ]
153
 
154
+ try:
155
+ print(f" 正在一次性生成 {category_name} 下的 {len(leaf_paths)} 个属性值...")
156
+ response = get_completion(messages)
157
+ if not response:
158
+ print(f" 生成 {category_name} 属性值失败: 空响应")
159
+ return {}
160
+
161
+ # 尝试解析JSON响应
 
 
 
162
  try:
163
+ import json
164
+ # 清理响应,移除可能的markdown代码块标记
165
+ cleaned_response = response.strip()
166
+ if cleaned_response.startswith("```json"):
167
+ cleaned_response = cleaned_response[7:]
168
+ if cleaned_response.endswith("```"):
169
+ cleaned_response = cleaned_response[:-3]
170
+ cleaned_response = cleaned_response.strip()
171
+
172
+ generated_values = json.loads(cleaned_response)
173
+ print(f" 成功生成 {len(generated_values)} 个属性值")
174
+ return generated_values
175
+ except json.JSONDecodeError as e:
176
+ print(f" 解析 {category_name} 属性值JSON失败: {e}")
177
+ print(f" 响应内容: {response[:100]}..." if len(response) > 100 else f"响应内容: {response}")
178
+ return {}
179
+ except Exception as e:
180
+ print(f" 生成 {category_name} 属性值时出错: {e}")
181
+ return {}
 
 
 
 
 
 
 
 
 
 
 
 
182
 
183
 
184
+ def generate_final_summary(profile: Dict, base_info: Dict = None) -> str:
185
+ """为用户档案生成最终摘要。
186
 
187
+ 参数:
188
+ profile: 完整的用户档案数据。
189
+ base_info: 基础信息,包含life_story等内容。
190
+ 返回:
191
+ str: 最终的摘要文本。
192
  """
193
  system_prompt = """
194
+ Your task: Based solely on the provided user attributes and personal story, create an objective and factual personal profile, strictly between 150–400 words.
195
 
196
  Content Requirements:
197
+ • The profile must be written entirely in the first-person perspective.
198
+ • The output should be a coherent, logically structured narrative, not a list of points. The order may vary: it does not need to follow the fixed “background → challenge → conclusion” pattern, and may instead begin with daily life or interests.
199
+ • The opening must explicitly state my country or region, ensuring that geographic location is clearly highlighted at the very start.
200
+ • Must include:
201
+ 1. Basic background (e.g., location, identity)
202
+ 2. Daily life or work routines
203
+ 3. Personal interests and hobbies (explicitly highlighted)
204
+ 4. Behavioral tendencies or values (positive or negative)
205
+ • Interests and hobbies must be integrated naturally, not superficially. Add small, ordinary details (e.g., food preferences, leisure activities, quirks) that make the character feel real.
206
+ • If there are negative traits, imperfections, or contradictions, they must be represented faithfully without softening. Do not reframe them as “growth” or “lessons learned.”
207
+ • No declarative or reflective endings. Avoid abstract statements like “I’ve learned…,” “This shows…,” or “Success means….” The ending should remain grounded in daily routines or interests.
208
+ • Only include information explicitly provided in the attributes and story. No invention, speculation, or interpretation.
209
+ • Prohibit the use of words such as' balance 'and' balance '
210
+ """
211
+ user_prompt = f"Complete Profile (in JSON format):\n{json.dumps(profile, ensure_ascii=False, indent=2)}\n\n"
212
+
213
+ user_prompt +="""Generate a first-person narrative of 100-400 words from the provided profile. Your primary goal is to make the person feel real, believable, and authentic.
214
 
215
+ To achieve this, strictly follow the 'Show, Don't Tell' principle:
216
+ 1. **Illustrate, Don't Declare:** Show values and traits through specific actions, stories, and decisions, rather than stating them directly.
217
+ 2. **Connect Actions to Motivation:** Briefly explain the 'why' behind key life choices and habits to reveal the person's inner logic and create narrative depth.
218
+ 3. **Maintain a Natural Voice:** The tone must be sincere and grounded—thoughtful but not overly abstract or dramatic.
 
 
 
219
 
220
+ Weave all elements into a cohesive story, not a simple list of facts."""
 
 
 
 
 
221
 
222
  messages = [
223
  {"role": "system", "content": system_prompt},
 
227
  try:
228
  response = get_completion(messages)
229
  summary = response.strip() if response else ""
230
+ # Check if word count is within acceptable range (100-400 words)
231
  word_count = len(summary.split())
232
+ if word_count < 100:
233
+ print(f"Warning: Summary is only {word_count} words (minimum 100)")
234
  elif word_count > 400:
235
  summary = enforce_word_limit(summary, 400)
236
+ print(f"Summary was adjusted to 400 words (from {word_count})")
237
+ else:
238
+ print(f"Summary generated with {word_count} words")
239
  return summary
240
  except Exception as e:
241
  print(f"Error generating final summary: {e}")
 
275
 
276
  print(f"{indent_str}正在生成 {section_name} 部分...")
277
 
278
+ # 如果是一级大类,一次性生成所有属性
279
+ if indent == 0: # 一级大类
280
+ # 使用新函数一次性生成所有属性值
281
+ all_attributes = generate_category_attributes(template_section, base_info, section_name)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
282
 
283
+ # 如果成功生成了属性值,将其添加到结果中
284
+ if all_attributes:
285
+ # 构建结果字典
286
+ for path, value in all_attributes.items():
287
+ # 分解路径
288
+ parts = path.split('.')
289
+ # 跳过第一部分(大类名称)
290
+ if len(parts) > 1 and parts[0] == section_name:
291
+ parts = parts[1:]
292
+
293
+ # 递归构建嵌套字典
294
+ current = section_result
295
+ for i, part in enumerate(parts):
296
+ if i == len(parts) - 1: # 最后一个部分,设置值
297
+ current[part] = value
298
+ print(f"{indent_str} - {'.'.join(parts)}: {value}")
299
+ else:
300
+ if part not in current:
301
+ current[part] = {}
302
+ current = current[part]
303
+
304
+ return section_result
305
 
306
+ # 如果不是级大类或者一次性生成失败,则使用原来的递归方式
307
+ for key, value in template_section.items():
308
+ current_path = f"{section_name}.{key}" if section_name else key
309
+
310
+ if isinstance(value, dict):
311
+ if not value: # 叶子节点
312
+ generated_value = generate_attribute_value(current_path, base_info)
313
+ section_result[key] = generated_value
314
+ print(f"{indent_str} - {key}: {generated_value}")
315
+ else: # 嵌套节点
316
+ section_result[key] = generate_section(value, base_info, current_path, indent + 1)
317
 
318
  return section_result
319
 
 
326
  return text
327
 
328
 
329
+ def append_profile_to_json(file_path: str, profile: Dict, use_timestamp: bool = True) -> str:
330
  """追加个人资料到 JSON 文件
331
 
332
  参数:
333
  file_path: 目标文件路径
334
  profile: 要追加的个人资料
335
+ use_timestamp: 是否使用时间戳,默认为True
336
+
337
+ 返回:
338
+ str: 实际保存的文件路径
339
  """
340
  try:
341
+ if use_timestamp:
342
+ actual_path = get_timestamped_filename(file_path)
343
+ profiles = [profile] # 新文件,只包含当前profile
 
 
 
 
 
 
 
 
344
  else:
345
+ actual_path = file_path
346
+ if os.path.exists(file_path):
347
+ with open(file_path, 'r', encoding='utf-8') as f:
348
+ profiles = json.load(f)
349
+ else:
350
+ profiles = []
351
+ profiles.append(profile)
352
 
353
+ os.makedirs(os.path.dirname(actual_path), exist_ok=True)
354
+ with open(actual_path, 'w', encoding='utf-8') as f:
355
  json.dump(profiles, f, ensure_ascii=False, indent=2)
356
+ return actual_path
357
  except Exception as e:
358
  print(f"追加个人资料到 JSON 文件时出错: {e}")
359
+ return file_path
360
 
361
 
362
+ def generate_single_profile(template: Dict = None, profile_index: int = 0, attribute_count: int = 200) -> Dict:
363
+ """根据给定的模板生成完整的用户档案。
364
 
365
  参数:
366
  template: 可选的用于生成的模板。
367
  profile_index: 要生成的档案索引。
368
+ attribute_count: 要包含的属性数量。
369
 
370
  返回:
371
  Dict: 生成的用户档案。
372
  """
373
 
374
+
375
+ # First, run select_attributes.py to update base files (user_profile.json and selected_paths.json)
376
+ print(f'Running select_attributes.py to update base files with {attribute_count} attributes...')
377
  try:
378
+ # 直接导入select_attributes模块的函数,而不是通过subprocess运行
379
+ import sys
380
+ import os
381
+ sys.path.append(os.path.dirname(os.path.abspath(__file__)))
382
+ from select_attributes import generate_user_profile as gen_profile
383
+ from select_attributes import get_selected_attributes, save_results
384
+
385
+ # 用户配置文件
386
+ user_profile = gen_profile()
387
+ # 获取指定数量的属性
388
+ selected_paths = get_selected_attributes(user_profile, attribute_count)
389
+ # 保存结果
390
+ correct_output_dir = os.path.join(get_project_root(), "output")
391
+ save_results(user_profile, selected_paths, correct_output_dir)
392
+
393
+ # 复制文件从源位置到目标位置
394
+ copy_files_from_source_to_target()
395
  except Exception as e:
396
  print(f"Error executing select_attributes functions: {e}")
397
  return {}
398
 
399
  # Load basic profile information and selected paths (base info is only a reference for GPT generation)
400
+ project_root = get_project_root()
401
+ output_dir = os.path.join(project_root, "output")
402
+ base_info_path = os.path.join(output_dir, 'user_profile.json')
403
  with open(base_info_path, 'r', encoding='utf-8') as f:
404
  base_info = json.load(f)
405
  if 'Occupations' not in base_info:
406
  print("Warning: 'Occupations' key is missing in the user profile. Setting it to an empty list.")
407
  base_info['Occupations'] = []
408
 
409
+ selected_paths_path = os.path.join(output_dir, 'selected_paths.json')
 
410
  with open(selected_paths_path, 'r', encoding='utf-8') as f:
411
  selected_paths = json.load(f)
412
 
 
421
  profile = {
422
  "Base Info": base_info,
423
  "Generated At": time.strftime("%Y-%m-%d %H:%M:%S"),
424
+ "Profile Index": profile_index + 1
425
  }
426
 
427
  # 步骤1:生成 Demographic Information
428
+ life_story = base_info.get("personal_story", {}).get("personal_story", "")
429
  demographic_input = (
430
  "Base Information (for reference):\n" + json.dumps(base_info, ensure_ascii=False, indent=2) + "\n\n"
431
+ "Life Story (for reference):\n" + str(life_story) + "\n\n"
432
+ "Instructions: Based on the `base_info` and `life_story` provided, **develop and elaborate on** the 'Demographic Information' section in English. Your task is to **appropriately expand upon and enrich** the existing information from `base_info` and incorporate relevant insights from the `life_story`. Focus on elaborating on the given data points, adding further relevant details, or providing context to make the demographic profile more comprehensive and insightful. While you should avoid simply repeating the `base_info` verbatim, ensure that all generated content is **directly built upon and logically extends** the information available in `base_info` and `life_story`, rather than introducing entirely new, unrelated demographic facts. The goal is a coherent, more descriptive, and enhanced version of the original data that reflects the person's life experiences."
433
  )
434
  demographic_template = selected_paths.get("Demographic Information")
 
 
435
  if demographic_template and demographic_template != "":
436
  print('Generating Demographic Information...')
437
+ demographic_section = generate_category_attributes(demographic_template, demographic_input, "Demographic Information")
438
+ # 构建嵌套字典结构
439
+ nested_result = {}
440
+ for path, value in demographic_section.items():
441
+ parts = path.split('.')
442
+ if len(parts) > 1 and parts[0] == "Demographic Information":
443
+ parts = parts[1:]
444
+
445
+ current = nested_result
446
+ for i, part in enumerate(parts):
447
+ if i == len(parts) - 1:
448
+ current[part] = value
449
+ else:
450
+ if part not in current:
451
+ current[part] = {}
452
+ current = current[part]
453
+ profile["Demographic Information"] = nested_result
454
  else:
455
  print('No valid "Demographic Information" template found in selected_paths, skipping Demographic Information.')
456
+
457
  # 步骤2:生成职业信息
458
  career_template = selected_paths.get("Career and Work Identity")
 
 
459
  if career_template and career_template != "":
460
  print('Generating Career and Work Identity...')
461
  # Construct input for Career and Work Identity, including Demographic Information
462
  career_input = (
463
  "Base Information (for reference):\n" + json.dumps(base_info, ensure_ascii=False, indent=2) + "\n\n"
464
+ "Life Story (for reference):\n" + str(life_story) + "\n\n"
465
  "Demographic Information (for reference):\n" + json.dumps(profile.get("Demographic Information", {}), ensure_ascii=False, indent=2) + "\n\n"
466
+ "Instructions: Based on the `base_info`, `life_story`, and `Demographic Information` provided above, **develop and elaborate on** the 'Career and Work Identity' section in English. "
467
+ "Your aim is to distill and articulate the career identity, professional journey, and work-related aspirations that are **evident or can be reasonably inferred from the combined `base_info`, `life_story`, and `Demographic Information`**. "
468
  "Offer fresh insights by providing a **deeper, more nuanced interpretation or by highlighting connections within the provided data** that illuminate these aspects. "
469
  "Ensure that this elaboration is **logically consistent with and directly stems from** the provided information. "
470
  "**Do not introduce new career details or aspirations that are not grounded in or clearly supported by the source material.** "
471
  "The section should be an insightful and coherent expansion of what can be understood from the source material."
472
  )
473
+ career_info_section = generate_category_attributes(career_template, career_input, "Career and Work Identity")
474
+ # 构建嵌套字典结构
475
+ nested_result = {}
476
+ for path, value in career_info_section.items():
477
+ parts = path.split('.')
478
+ if len(parts) > 1 and parts[0] == "Career and Work Identity":
479
+ parts = parts[1:]
480
+
481
+ current = nested_result
482
+ for i, part in enumerate(parts):
483
+ if i == len(parts) - 1:
484
+ current[part] = value
485
+ else:
486
+ if part not in current:
487
+ current[part] = {}
488
+ current = current[part]
489
+ profile["Career and Work Identity"] = nested_result
490
  else:
491
  print('No valid "Career and Work Identity" template found in selected_paths, skipping.')
 
 
492
 
493
  # 步骤3:生成 Core Values, Beliefs, and Philosophy
494
  pv_orientation = base_info.get("personal_values", {}).get("values_orientation", "")
495
  if not isinstance(pv_orientation, str):
496
  pv_orientation = json.dumps(pv_orientation, ensure_ascii=False)
497
  core_input = (
498
+ "Life Story (for reference):\n" + str(life_story) + "\n\n"
499
  "Demographic Information (for reference):\n" + json.dumps(profile.get("Demographic Information", {}), ensure_ascii=False, indent=2) + "\n\n"
500
  "Career Information (for reference):\n" + json.dumps(profile.get("Career and Work Identity", {}), ensure_ascii=False, indent=2) + "\n\n"
501
  "Personal Values (for reference):\n" + pv_orientation + "\n\n"
502
+ "Instructions: Based on the `life_story` and other information provided above, **develop and elaborate on** the 'Core Values, Beliefs, and Philosophy' section in English. Your aim is to distill and articulate the core values, beliefs, and philosophical outlook that are **evident or can be reasonably inferred from the `life_story` and other provided information**. Offer fresh insights by providing a **deeper, more nuanced interpretation or by highlighting connections within the provided data** that illuminate these guiding principles. Ensure that this elaboration is **logically consistent with and directly stems from** the provided information. **Do not introduce new values, beliefs, or philosophies that are not grounded in or clearly supported by the source material.** The section should be an insightful and coherent expansion of what can be understood from the source material.IMPORTANT: Avoid including anything related to community-building activities.Prohibit the use of words such as' balance 'and' balance '"
503
  )
504
  core_template = selected_paths.get("Core Values, Beliefs, and Philosophy")
 
 
505
  if core_template and core_template != "":
506
  print('Generating Core Values, Beliefs, and Philosophy...')
507
+ core_values_section = generate_category_attributes(core_template, core_input, "Core Values, Beliefs, and Philosophy")
508
+ # 构建嵌套字典结构
509
+ nested_result = {}
510
+ for path, value in core_values_section.items():
511
+ parts = path.split('.')
512
+ if len(parts) > 1 and parts[0] == "Core Values, Beliefs, and Philosophy":
513
+ parts = parts[1:]
514
+
515
+ current = nested_result
516
+ for i, part in enumerate(parts):
517
+ if i == len(parts) - 1:
518
+ current[part] = value
519
+ else:
520
+ if part not in current:
521
+ current[part] = {}
522
+ current = current[part]
523
+ profile["Core Values, Beliefs, and Philosophy"] = nested_result
524
  else:
525
  print('No valid "Core Values, Beliefs, and Philosophy" template found in selected_paths, skipping.')
526
 
527
+ # 步骤4:生成 Lifestyle and Daily Routine
528
  life_attitude = base_info["life_attitude"]
 
 
 
 
 
 
 
529
  lifestyle_input = (
530
+ "Life Story (for reference):\n" + str(life_story) + "\n\n"
531
+ "Life Attitude (for reference):\n" + life_attitude + "\n\n"
532
+ "Demographic Information (for reference):\n" + json.dumps(profile.get("Demographic Information", {}), ensure_ascii=False, indent=2) + "\n\n"
533
+ "Career Information (for reference):\n" + json.dumps(profile.get("Career and Work Identity", {}), ensure_ascii=False, indent=2) + "\n\n"
534
+ "Core Values (for reference):\n" + json.dumps(profile.get("Core Values, Beliefs, and Philosophy", {}), ensure_ascii=False, indent=2) + "\n\n"
535
+ "Instructions: Based on the `life_story`, `life_attitude`, and other information provided above, generate detailed Lifestyle and Daily Routine section in English. Use the life story to inform realistic daily routines that align with the person's experiences and background.Prohibit the use of words such as' balance 'and' balance '"
 
 
 
 
 
 
 
 
536
  )
 
537
  lifestyle_template = selected_paths.get("Lifestyle and Daily Routine")
 
 
538
  if lifestyle_template and lifestyle_template != "":
539
  print('Generating Lifestyle and Daily Routine...')
540
+ lifestyle_section = generate_category_attributes(lifestyle_template, lifestyle_input, "Lifestyle and Daily Routine")
541
+ # 构建嵌套字典结构
542
+ nested_result = {}
543
+ for path, value in lifestyle_section.items():
544
+ parts = path.split('.')
545
+ if len(parts) > 1 and parts[0] == "Lifestyle and Daily Routine":
546
+ parts = parts[1:]
547
+
548
+ current = nested_result
549
+ for i, part in enumerate(parts):
550
+ if i == len(parts) - 1:
551
+ current[part] = value
552
+ else:
553
+ if part not in current:
554
+ current[part] = {}
555
+ current = current[part]
556
+ profile["Lifestyle and Daily Routine"] = nested_result
557
  else:
558
  print('No valid "Lifestyle and Daily Routine" template found in selected_paths, skipping.')
559
+
560
+ # 步骤5:生成 Cultural and Social Context
561
+ cultural_input = (
562
+ "Life Story (for reference):\n" + str(life_story) + "\n\n"
563
+ "Life Attitude (for reference):\n" + life_attitude + "\n\n"
564
+ "Demographic Information (for reference):\n" + json.dumps(profile.get("Demographic Information", {}), ensure_ascii=False, indent=2) + "\n\n"
565
+ "Career Information (for reference):\n" + json.dumps(profile.get("Career and Work Identity", {}), ensure_ascii=False, indent=2) + "\n\n"
566
+ "Core Values (for reference):\n" + json.dumps(profile.get("Core Values, Beliefs, and Philosophy", {}), ensure_ascii=False, indent=2) + "\n\n"
567
+ "Lifestyle (for reference):\n" + json.dumps(profile.get("Lifestyle and Daily Routine", {}), ensure_ascii=False, indent=2) + "\n\n"
568
+ "Instructions: Based on the `life_story`, `life_attitude`, and other information provided above, generate detailed Cultural and Social Context section in English. Use the life story to inform realistic cultural contexts that align with the person's experiences and background.Prohibit the use of words such as' balance 'and' balance '"
569
+ )
570
  cultural_template = selected_paths.get("Cultural and Social Context")
 
 
571
  if cultural_template and cultural_template != "":
572
  print('Generating Cultural and Social Context...')
573
+ cultural_section = generate_category_attributes(cultural_template, cultural_input, "Cultural and Social Context")
574
+ # 构建嵌套字典结构
575
+ nested_result = {}
576
+ for path, value in cultural_section.items():
577
+ parts = path.split('.')
578
+ if len(parts) > 1 and parts[0] == "Cultural and Social Context":
579
+ parts = parts[1:]
580
+
581
+ current = nested_result
582
+ for i, part in enumerate(parts):
583
+ if i == len(parts) - 1:
584
+ current[part] = value
585
+ else:
586
+ if part not in current:
587
+ current[part] = {}
588
+ current = current[part]
589
+ profile["Cultural and Social Context"] = nested_result
590
  else:
591
  print('No valid "Cultural and Social Context" template found in selected_paths, skipping.')
592
 
593
+ # 步骤6:生成 Hobbies, Interests, and Lifestyle
594
  interests = base_info["interests"]
595
  hobbies_input = (
596
  "Base Information (for reference):\n" + json.dumps(base_info, ensure_ascii=False, indent=2) + "\n\n"
597
+ "Life Story (for reference):\n" + str(life_story) + "\n\n"
598
  "Demographic Information (for reference):\n" + json.dumps(profile.get("Demographic Information", {}), ensure_ascii=False, indent=2) + "\n\n"
599
  "Career Information (for reference):\n" + json.dumps(profile.get("Career and Work Identity", {}), ensure_ascii=False, indent=2) + "\n\n"
600
  "Core Values, Beliefs, and Philosophy (for reference):\n" + json.dumps(profile.get("Core Values, Beliefs, and Philosophy", {}), ensure_ascii=False, indent=2) + "\n\n"
601
  "Lifestyle and Daily Routine (for reference):\n" + json.dumps(profile.get("Lifestyle and Daily Routine", {}), ensure_ascii=False, indent=2) + "\n\n"
602
  "Cultural and Social Context (for reference):\n" + json.dumps(profile.get("Cultural and Social Context", {}), ensure_ascii=False, indent=2) + "\n\n"
603
+ "Ensure that all hobbies, interests, and lifestyle choices presented are:1. **Firmly anchored to and primarily derived from the hobbies indicated in `base_info` and experiences from `life_story`.**2. Logically consistent with all provided information.3. Enriched by supplementary information where appropriate, without overshadowing the core hobbies from `base_info`.**Do not introduce new primary hobbies or interests that are not clearly supported by or cannot be reasonably inferred from the `base_info` and `life_story` themselves.** Any lifestyle elements should logically flow from or align with these established hobbies and the overall profile.Prohibit the use of words such as' balance 'and' balance '"
 
 
 
 
 
 
 
 
 
 
604
  )
 
605
  hobbies_template = selected_paths.get("Hobbies, Interests, and Lifestyle")
 
 
606
  if hobbies_template and hobbies_template != "":
607
  print('Generating Hobbies, Interests, and Lifestyle...')
608
+ hobbies_section = generate_category_attributes(hobbies_template, hobbies_input, "Hobbies, Interests, and Lifestyle")
609
+ # 构建嵌套字典结构
610
+ nested_result = {}
611
+ for path, value in hobbies_section.items():
612
+ parts = path.split('.')
613
+ if len(parts) > 1 and parts[0] == "Hobbies, Interests, and Lifestyle":
614
+ parts = parts[1:]
615
+
616
+ current = nested_result
617
+ for i, part in enumerate(parts):
618
+ if i == len(parts) - 1:
619
+ current[part] = value
620
+ else:
621
+ if part not in current:
622
+ current[part] = {}
623
+ current = current[part]
624
+ profile["Hobbies, Interests, and Lifestyle"] = nested_result
625
  else:
626
  print('No valid "Hobbies, Interests, and Lifestyle" template found in selected_paths, skipping.')
627
 
628
+ # 步骤7:生成 Other Attributes
629
  other_attributes_input = (
630
+ "Life Story (for reference):\n" + str(life_story) + "\n\n"
631
  "Complete Profile (for reference):\n" + json.dumps(profile, ensure_ascii=False, indent=2) + "\n\n"
632
+ "Instructions: Based on the `life_story` and complete profile, generate the remaining attributes for the user profile in English with refined details. Ensure that all attributes are consistent with the person's life experiences as described in the life story."
 
 
 
 
 
 
 
 
 
 
 
 
 
 
633
  )
634
  other_template = selected_paths.get("Other Attributes")
 
 
635
  if other_template and other_template != "":
636
  print('Generating Other Attributes...')
637
+ other_attributes_section = generate_category_attributes(other_template, other_attributes_input, "Other Attributes")
638
+ # 构建嵌套字典结构
639
+ nested_result = {}
640
+ for path, value in other_attributes_section.items():
641
+ parts = path.split('.')
642
+ if len(parts) > 1 and parts[0] == "Other Attributes":
643
+ parts = parts[1:]
644
+
645
+ current = nested_result
646
+ for i, part in enumerate(parts):
647
+ if i == len(parts) - 1:
648
+ current[part] = value
649
+ else:
650
+ if part not in current:
651
+ current[part] = {}
652
+ current = current[part]
653
+ profile["Other Attributes"] = nested_result
654
  else:
655
  print('No valid "Other Attributes" template found in selected_paths, skipping.')
656
 
 
659
  for key in ['base_info', 'Base Info', 'personal_story', 'interests', 'Occupations']:
660
  profile_for_summary.pop(key, None)
661
 
662
+ # Generate the final summary using the filtered profile and base_info
663
+ final_summary_text = generate_final_summary(profile_for_summary, base_info)
664
  profile["Summary"] = final_summary_text
665
 
666
  # Remove unwanted keys from the final profile
667
  for key in ['base_info', 'Base Info', 'personal_story', 'interests', 'Occupations']:
668
  profile.pop(key, None)
669
 
 
 
 
 
670
  return profile
671
 
672
 
673
+ def generate_multiple_profiles(num_rounds: int = 8) -> None:
674
+ """生成多完整的用户档案,每轮包含不同数量的属性,并将它们保存到一个合并的 JSON 文件中。
675
 
676
  参数:
677
+ num_rounds: 要生成的数,默认为8轮,每轮会生成8种不同属性数量的档案
678
  """
679
  start_time = time.time()
680
+ print(f"开始生成 {num_rounds} 个人资料,每轮包含8种不同数量的属性...")
681
 
682
  # 获取项目根目录
683
  project_root = get_project_root()
684
 
685
  # 创建输出目录
686
+ output_dir = "/home/zhou/deeppersona/generate_user_profile_final/output"
687
  os.makedirs(output_dir, exist_ok=True)
688
 
689
+ # 定义每个档案的属性数量
690
+ attribute_counts = [100, 150, 200, 250, 300, 350]
691
+ total_profiles = num_rounds * len(attribute_counts)
692
 
693
  # 初始化存储所有配置文件的字典
694
  all_profiles = {
695
  "metadata": {
696
  "profiles_completed": 0,
697
  "total_profiles": total_profiles,
698
+ "total_rounds": num_rounds,
699
+ "description": "包含多轮不同属性数量的用户档案集合"
700
  }
701
  }
702
 
703
+ # 设置合并文件路径(不使用时间戳)
704
+ base_all_profiles_path = os.path.join(output_dir, f"profile_ind.json")
705
+ all_profiles_path = base_all_profiles_path
706
 
707
  # 初始化保存合并文件
708
+ actual_path = save_json_file(all_profiles_path, all_profiles, use_timestamp=False)
709
+ print(f"初始化合并文件: {actual_path}")
710
+ all_profiles_path = actual_path # 使用实际保存的路径
711
 
712
  # 计数器,用于跟踪总共生成的档案数量
713
  profile_count = 0
714
 
715
+ # 逐生成配置文件
716
+ for round_num in range(num_rounds):
717
+ print(f"\n===== 开始生成第 {round_num+1}/{num_rounds} 轮用户资料 =====\n")
 
 
718
 
719
+ # 在每轮中生成所有不同属性数量的档案
720
+ for attr_index, current_attribute_count in enumerate(attribute_counts):
721
+ profile_count += 1
 
 
 
 
722
 
723
+ print(f"\n----- 开始生成第 {round_num+1}.{attr_index+1} 个用户资料 (属性数量: {current_attribute_count}) -----\n")
 
 
 
724
 
725
+ try:
726
+ # 生成单个配置文件,传入属性数量
727
+ profile = generate_single_profile(None, profile_count-1, current_attribute_count)
728
+
729
+ if not profile:
730
+ print(f"第 {round_num+1}.{attr_index+1} 个资料生成失败,跳过")
731
+ continue
732
+
733
+ # 添加到总字典并保存
734
+ profile_key = f"Profile_R{round_num+1}_A{attr_index+1}_Count_{current_attribute_count}"
735
+ all_profiles[profile_key] = profile
736
+ all_profiles["metadata"]["profiles_completed"] = profile_count
737
+
738
+ # 保存更新后的合并文件
739
+ save_json_file(all_profiles_path, all_profiles, use_timestamp=False)
740
+ print(f"\n总进度更新: {profile_count}/{total_profiles} 个资料已完成 (第 {round_num+1}/{num_rounds} 轮)")
741
+ print(f"已将第 {round_num+1}.{attr_index+1} 个用户资料 (属性数量: {current_attribute_count}) 添加到合并文件: {all_profiles_path}")
742
+ print("\n" + "-"*50 + "\n")
743
+ except Exception as e:
744
+ print(f"生成第 {round_num+1}.{attr_index+1} 个个人资料时出错: {e}")
745
+ continue
746
+
747
+ print(f"\n===== 第 {round_num+1}/{num_rounds} 轮用户资料生成完成 =====\n")
748
+ print("\n" + "="*50 + "\n")
749
 
750
  # 添加生成完成状态
751
  all_profiles["metadata"]["status"] = "completed"
752
+ save_json_file(all_profiles_path, all_profiles, use_timestamp=False)
753
 
754
  end_time = time.time()
755
  elapsed_time = end_time - start_time
 
757
  print(f"生成完成,耗时 {elapsed_time:.2f} 秒")
758
 
759
  if __name__ == "__main__":
760
+ generate_multiple_profiles(10)
 
 
 
 
 
 
 
 
 
 
 
 
generate_user_profile_final/code/read_profile_summaries.py ADDED
@@ -0,0 +1,134 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+
4
+ """
5
+ 读取用户档案JSON文件中每个profile的summary项
6
+ """
7
+
8
+ import json
9
+ import os
10
+ from typing import List, Dict, Any
11
+
12
+ def read_profile_summaries(json_file_path: str, max_profiles: int = None) -> List[Dict[str, Any]]:
13
+ """
14
+ 读取JSON文件中每个profile的summary项
15
+
16
+ 参数:
17
+ json_file_path: JSON文件路径
18
+ max_profiles: 最大读取的profile数量,默认None表示读取所有
19
+
20
+ 返回:
21
+ List[Dict]: 包含profile_id和summary的字典列表
22
+ """
23
+ try:
24
+ with open(json_file_path, 'r', encoding='utf-8') as f:
25
+ data = json.load(f)
26
+
27
+ summaries = []
28
+ count = 0
29
+
30
+ # 遍历所有profile,但限制数量
31
+ for key, value in data.items():
32
+ # 跳过metadata项
33
+ if key == "metadata":
34
+ continue
35
+
36
+ # 检查是否达到最大数量
37
+ if max_profiles is not None and count >= max_profiles:
38
+ break
39
+
40
+ # 检查是否是profile项(通常以Profile_开头)
41
+ if isinstance(value, dict) and "Summary" in value:
42
+ profile_info = {
43
+ "profile_id": key,
44
+ "summary": value["Summary"]
45
+ }
46
+ summaries.append(profile_info)
47
+ count += 1
48
+
49
+ if max_profiles is not None:
50
+ print(f"成功读取 {len(summaries)} 个profile的summary (限制: {max_profiles})")
51
+ else:
52
+ print(f"成功读取 {len(summaries)} 个profile的summary (读取所有)")
53
+ return summaries
54
+
55
+ except FileNotFoundError:
56
+ print(f"错误: 文件 {json_file_path} 不存在")
57
+ return []
58
+ except json.JSONDecodeError as e:
59
+ print(f"错误: JSON解析失败 - {e}")
60
+ return []
61
+ except Exception as e:
62
+ print(f"错误: {e}")
63
+ return []
64
+
65
+ def save_summaries_to_file(summaries: List[Dict[str, Any]], output_file: str):
66
+ """
67
+ 将summaries保存到文件
68
+
69
+ 参数:
70
+ summaries: summary数据列表
71
+ output_file: 输出文件路径
72
+ """
73
+ try:
74
+ with open(output_file, 'w', encoding='utf-8') as f:
75
+ json.dump(summaries, f, ensure_ascii=False, indent=2)
76
+ print(f"summaries已保存到: {output_file}")
77
+ except Exception as e:
78
+ print(f"保存文件时出错: {e}")
79
+
80
+ def print_summary_stats(summaries: List[Dict[str, Any]]):
81
+ """
82
+ 打印summary统计信息
83
+
84
+ 参数:
85
+ summaries: summary数据列表
86
+ """
87
+ if not summaries:
88
+ print("没有找到任何summary数据")
89
+ return
90
+
91
+ total_count = len(summaries)
92
+ total_length = sum(len(item["summary"]) for item in summaries)
93
+ avg_length = total_length / total_count if total_count > 0 else 0
94
+
95
+ print(f"\n=== Summary统计信息 ===")
96
+ print(f"总数量: {total_count}")
97
+ print(f"平均长度: {avg_length:.1f} 字符")
98
+ print(f"总长度: {total_length} 字符")
99
+
100
+ # 显示前3个profile的summary示例
101
+ print(f"\n=== 前3个Profile的Summary示例 ===")
102
+ for i, item in enumerate(summaries[:3]):
103
+ print(f"\n{i+1}. Profile ID: {item['profile_id']}")
104
+ summary_preview = item['summary'][:200] + "..." if len(item['summary']) > 200 else item['summary']
105
+ print(f" Summary: {summary_preview}")
106
+
107
+ def main():
108
+ """主函数"""
109
+ # 输入文件路径
110
+ input_file = "/home/zhou/deeppersona/generate_user_profile_test/output/profile_world.json"
111
+
112
+ # 输出文件路径
113
+ output_file = "/home/zhou/deeppersona/generate_user_profile_final/output/summary_world.json"
114
+
115
+ print(f"开始读取文件: {input_file}")
116
+
117
+ # 读取summaries
118
+ summaries = read_profile_summaries(input_file)
119
+
120
+ if summaries:
121
+ # 打印统计信息
122
+ print_summary_stats(summaries)
123
+
124
+ # 保存到文件
125
+ save_summaries_to_file(summaries, output_file)
126
+
127
+ # 返回结果供其他模块使用
128
+ return summaries
129
+ else:
130
+ print("未能读取到任何summary数据")
131
+ return []
132
+
133
+ if __name__ == "__main__":
134
+ summaries = main()
{generation_user_profile → generate_user_profile_final}/code/select_attributes.py RENAMED
@@ -55,19 +55,17 @@ logging.basicConfig(
55
  logger = logging.getLogger(__name__)
56
 
57
  # 属性数据集路径
58
- # 使用相对路径获取属性数据集路径
59
- ATTRIBUTES_PATH = os.path.join(os.path.dirname(__file__), "data", "large_attributes.json") # 属性数据集路径
60
 
61
  # 向量数据库路径
62
- # 使用相对路径获取属性嵌入向量路径
63
- EMBEDDINGS_PATH = os.path.join(os.path.dirname(__file__), "data", "attribute_embeddings.pkl") # 属性嵌入向量路径
64
 
65
  # 默认模型来自配置
66
  DEFAULT_MODEL = GPT_MODEL
67
 
68
  # 向量搜索参数
69
- NEAR_NEIGHBOR_COUNT = 1 # 近邻数量
70
- MID_NEIGHBOR_COUNT = 1 # 中距离邻居数量
71
  FAR_NEIGHBOR_COUNT = 1 # 远距离邻居数量
72
  DIVERSITY_THRESHOLD = 0.7 # 多样性阈值(余弦相似度)
73
 
@@ -95,37 +93,29 @@ class AttributeSelector:
95
  # 设置用户配置文件
96
  self.user_profile = user_profile
97
 
98
- # 初始化路径到嵌入向量的映射
99
- self.path_to_embedding = {}
100
 
101
- # 加载嵌入向量,这样在验证数据时可以使用
102
  self.embeddings_data = self._load_embeddings()
 
 
 
103
  self.paths = []
104
  self.embeddings = []
105
 
106
- # 处理嵌入向量数据
107
  if self.embeddings_data:
108
- # 确定正确的路径键
109
- paths_key = 'attribute_paths' if 'attribute_paths' in self.embeddings_data else 'paths'
110
- embeddings_key = 'embeddings'
111
 
112
- if paths_key in self.embeddings_data:
113
- self.paths = self.embeddings_data[paths_key]
114
- if embeddings_key in self.embeddings_data:
115
- self.embeddings = self.embeddings_data[embeddings_key]
116
-
117
- # 创建路径到嵌入向量的映射
118
  for i, path in enumerate(self.paths):
119
  if i < len(self.embeddings):
120
  self.path_to_embedding[path] = self.embeddings[i]
121
-
122
  logger.info(f"已加载 {len(self.paths)} 条属性路径和对应的向量嵌入")
123
 
124
- # 现在验证和处理属性数据
125
- self._validate_data()
126
-
127
- # 记录顶级类别数量
128
- logger.info(f"已加载属性,包含 {len(self._get_attribute_categories())} 个顶级类别")
129
 
130
  def _load_json(self, file_path: str) -> Dict:
131
  """从文件加载JSON数据"""
@@ -179,75 +169,9 @@ class AttributeSelector:
179
  if "paths" not in self.attributes:
180
  logger.info("正在将属性从嵌套字典格式转换为路径格式")
181
  self.attributes = {"paths": self._flatten_attributes(self.attributes)}
182
-
183
- # 检查是否有匹配的路径
184
- if hasattr(self, 'embeddings_data') and self.embeddings_data:
185
- paths_key = 'attribute_paths' if 'attribute_paths' in self.embeddings_data else 'paths'
186
- if paths_key in self.embeddings_data:
187
- embedding_paths = set(self.embeddings_data[paths_key])
188
- matching_paths = [p for p in self.attributes["paths"] if p in embedding_paths]
189
- logger.info(f"从 {len(self.attributes['paths'])} 条提取路径中找到 {len(matching_paths)} 条与嵌入向量匹配的路径")
190
-
191
- # 如果没有匹配的路径,直接使用嵌入向量中的路径
192
- if not matching_paths:
193
- logger.warning("没有找到匹配的路径,直接使用嵌入向量中的路径")
194
- self.attributes["paths"] = self.embeddings_data[paths_key]
195
  else:
196
  raise ValueError("无效的属性格式:不是字典")
197
 
198
- def _get_attribute_categories(self) -> List[str]:
199
- """获取顶级属性类别"""
200
- # 从路径中提取唯一的顶级类别
201
- return sorted({path.split('.')[0] for path in self.attributes["paths"] if '.' in path})
202
-
203
- def _flatten_attributes(self, attributes: Dict, prefix: str = "") -> List[str]:
204
- """
205
- 将属性字典扁平化为属性路径列表
206
-
207
- 参数:
208
- attributes: 属性字典或子字典
209
- prefix: 当��路径前缀
210
- """
211
- result = []
212
-
213
- # 如果有嵌入向量数据,打印样例路径作为参考
214
- if hasattr(self, 'embeddings_data') and self.embeddings_data:
215
- paths_key = 'attribute_paths' if 'attribute_paths' in self.embeddings_data else 'paths'
216
- if paths_key in self.embeddings_data and len(self.embeddings_data[paths_key]) > 0:
217
- sample_paths = self.embeddings_data[paths_key][:5]
218
- logger.info(f"嵌入向量中的路径样例: {sample_paths}")
219
-
220
- # 打印所有嵌入向量中的顶级类别
221
- top_categories = set()
222
- for path in self.embeddings_data[paths_key]:
223
- if '.' in path:
224
- top_categories.add(path.split('.')[0])
225
- logger.info(f"嵌入向量中的顶级类别: {sorted(list(top_categories))}")
226
-
227
- def _flatten(attr_dict, curr_prefix):
228
- for k, v in attr_dict.items():
229
- path = f"{curr_prefix}.{k}" if curr_prefix else k
230
-
231
- # 检查是否是叶子节点或有描述的节点
232
- if isinstance(v, dict):
233
- # 总是添加路径,无论是否有描述,以匹配嵌入向量中的路径格式
234
- result.append(path)
235
-
236
- # 继续递归处理子节点
237
- if len(v) > 0: # 非空字典,继续递归
238
- _flatten(v, path)
239
- else: # 非字典值,直接添加
240
- result.append(path)
241
-
242
- _flatten(attributes, prefix)
243
- logger.info(f"从属性字典中提取了 {len(result)} 条路径")
244
-
245
- # 打印一些提取的路径样例,用于调试
246
- if result:
247
- logger.info(f"提取的路径样例: {result[:5]}")
248
-
249
- return result
250
-
251
  def _create_profile_embedding(self, profile: Dict) -> np.ndarray:
252
  """
253
  为用户配置文件创建嵌入向量
@@ -432,13 +356,50 @@ class AttributeSelector:
432
  if interests and isinstance(interests, list):
433
  summary_parts.append(f"Interests: {', '.join(interests)}")
434
 
435
- # Add summary if available (but not personal story)
 
 
 
 
 
 
436
  if "summary" in profile:
437
  summary_parts.append(f"Profile Summary: {profile['summary']}")
438
 
439
- # Join all summary parts into a single string and return
 
440
  return "\n".join(summary_parts)
441
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
442
  def _format_attributes_tree(self, attributes_dict: Dict, prefix: str = "", depth: int = 0) -> List[str]:
443
  """
444
  将属性字典格式化为文本格式的树结构
@@ -685,32 +646,37 @@ class AttributeSelector:
685
  selected_paths = []
686
  used_indices = set()
687
 
688
- # 1. 选择近邻(相似度最高的属性)
689
- near_count = min(int(target_count * 0.4), total_paths // 3) # 大约40%的目标数量
 
 
 
690
  near_indices = list(range(near_count))
691
- for i in random.sample(near_indices, near_count):
692
  if i not in used_indices:
693
  selected_paths.append(path_similarities[i][0])
694
  used_indices.add(i)
695
 
696
- # 2. 选择中距离邻居
697
  mid_start = total_paths // 3
698
  mid_end = 2 * total_paths // 3
699
- mid_count = min(int(target_count * 0.4), (mid_end - mid_start)) # 大约40%的目标数量
700
  mid_indices = list(range(mid_start, mid_end))
701
- for i in random.sample(mid_indices, mid_count):
702
- if i not in used_indices:
703
- selected_paths.append(path_similarities[i][0])
704
- used_indices.add(i)
 
705
 
706
- # 3. 选择远距离邻居(相似度最低的属性)
707
  far_start = 2 * total_paths // 3
708
- far_count = min(int(target_count * 0.2), (total_paths - far_start)) # 大约20%的目标数量
709
  far_indices = list(range(far_start, total_paths))
710
- for i in random.sample(far_indices, far_count):
711
- if i not in used_indices:
712
- selected_paths.append(path_similarities[i][0])
713
- used_indices.add(i)
 
714
 
715
  # 如果还需要更多属性来达到目标数量,从未使用的索引中随机选择
716
  remaining_count = target_count - len(selected_paths)
@@ -724,12 +690,13 @@ class AttributeSelector:
724
  logger.info(f"使用向量搜索选择了 {len(selected_paths)} 条属性(近邻: {near_count}, 中距离: {mid_count}, 远距离: {far_count})")
725
  return selected_paths
726
 
727
- def get_top_attributes(self, result: Dict) -> List[str]:
728
  """
729
  获取属性列表
730
 
731
  参数:
732
  result: 来自analyze_profile_for_attributes的结果
 
733
 
734
  返回:
735
  属性路径列表
@@ -763,9 +730,7 @@ class AttributeSelector:
763
  all_paths.extend(paths)
764
  category_paths[category] = paths
765
 
766
- # 随机选择属性数量
767
- attribute_count_options = [250, 300, 350]
768
- target_count = random.choice(attribute_count_options)
769
 
770
  # 如果有向量数据库,使用向量搜索
771
  if self.embeddings_data and self.user_profile:
@@ -778,7 +743,7 @@ class AttributeSelector:
778
  for category, paths in category_paths.items():
779
  # 根据类别大小按比例分配目标数量
780
  category_ratio = len(paths) / len(all_paths)
781
- category_target = max(10, int(target_count * category_ratio))
782
 
783
  # 使用向量搜索选择该类别的属性
784
  category_selected = self._find_interesting_neighbors(
@@ -793,31 +758,9 @@ class AttributeSelector:
793
  logger.info(f"使用向量搜索从 {len(all_paths)} 条属性中选择了 {len(final_paths)} 条属性")
794
  return final_paths
795
 
796
- # 如果没有向量数据库或向量搜索失败,使用简单的属性选择方法
797
- logger.warning(f"没有可用的向量数据库或向量搜索失败,使用简单的属性选择方法")
798
-
799
- # 创建基本属性路径列表
800
- basic_paths = [
801
- "Demographic Information.Age",
802
- "Demographic Information.Gender",
803
- "Demographic Information.Location.Country",
804
- "Demographic Information.Location.City",
805
- "Career and Work Identity.Occupation",
806
- "Career and Work Identity.Work Experience",
807
- "Core Values, Beliefs, and Philosophy.Personal Values",
808
- "Core Values, Beliefs, and Philosophy.Life Philosophy",
809
- "Lifestyle and Daily Routine.Daily Habits",
810
- "Lifestyle and Daily Routine.Lifestyle Choices",
811
- "Cultural and Social Context.Cultural Background",
812
- "Cultural and Social Context.Social Connections",
813
- "Hobbies, Interests, and Lifestyle.Hobbies",
814
- "Hobbies, Interests, and Lifestyle.Interests",
815
- "Other Attributes.Personal Story",
816
- "Other Attributes.Key Life Events"
817
- ]
818
-
819
- logger.info(f"使用简单方法选择了 {len(basic_paths)} 个基本属性路径")
820
- return basic_paths
821
 
822
  except Exception as e:
823
  logger.error(f"Error generating attribute list: {e}")
@@ -881,10 +824,11 @@ def generate_user_profile() -> Dict:
881
 
882
  return user_profile
883
 
884
- def get_selected_attributes(user_profile=None):
885
  global ATTRIBUTE_SELECTION_CACHE
886
- if ATTRIBUTE_SELECTION_CACHE is not None:
887
- return ATTRIBUTE_SELECTION_CACHE
 
888
 
889
  try:
890
  # 如果没有提供用户配置文件,生成一个
@@ -900,8 +844,8 @@ def get_selected_attributes(user_profile=None):
900
  # 获取属性推荐
901
  attribute_recommendations = result.get("attribute_recommendations", {})
902
 
903
- # 获取属性列表
904
- top_paths = selector.get_top_attributes(attribute_recommendations)
905
 
906
  # 返回属性列表
907
  ATTRIBUTE_SELECTION_CACHE = top_paths
@@ -922,22 +866,17 @@ def build_nested_dict(paths: List[str]) -> Dict:
922
  current = current[part]
923
  return result
924
 
925
- def save_results(user_profile: Dict, selected_paths: List[str], output_dir: str = None) -> None:
926
  """
927
  保存用户配置文件和选定的属性路径到文件
928
  参数:
929
  user_profile: 用户配置文件
930
  selected_paths: 选定的属性路径 (列表形式)
931
- output_dir: 输出目录(默认为项目根目录下的output文件夹
932
  """
933
  try:
934
  from pathlib import Path
935
  import json
936
-
937
- # 如果没有提供输出目录,使用默认的相对路径
938
- if output_dir is None:
939
- output_dir = os.path.join(os.path.dirname(os.path.dirname(__file__)), "output")
940
-
941
  output_path = Path(output_dir)
942
  output_path.mkdir(parents=True, exist_ok=True)
943
 
 
55
  logger = logging.getLogger(__name__)
56
 
57
  # 属性数据集路径
58
+ ATTRIBUTES_PATH = "/home/zhou/deeppersona/generate_user_profile_test/data/large_attributes.json" # 属性数据集路径
 
59
 
60
  # 向量数据库路径
61
+ EMBEDDINGS_PATH = "/home/zhou/deeppersona/generate_user_profile_test/data/attribute_embeddings.pkl" # 属性嵌入向量路径
 
62
 
63
  # 默认模型来自配置
64
  DEFAULT_MODEL = GPT_MODEL
65
 
66
  # 向量搜索参数
67
+ NEAR_NEIGHBOR_COUNT = 7 # 近邻数量
68
+ MID_NEIGHBOR_COUNT = 2 # 中距离邻居数量
69
  FAR_NEIGHBOR_COUNT = 1 # 远距离邻居数量
70
  DIVERSITY_THRESHOLD = 0.7 # 多样性阈值(余弦相似度)
71
 
 
93
  # 设置用户配置文件
94
  self.user_profile = user_profile
95
 
96
+ # 验证数据
97
+ self._validate_data()
98
 
99
+ # 加载向量数据
100
  self.embeddings_data = self._load_embeddings()
101
+
102
+ # 初始化属性路径和向量映射
103
+ self.path_to_embedding = {}
104
  self.paths = []
105
  self.embeddings = []
106
 
 
107
  if self.embeddings_data:
108
+ self.paths = self.embeddings_data.get('paths', [])
109
+ self.embeddings = self.embeddings_data.get('embeddings', [])
 
110
 
111
+ # 创建路径到向量的映射
 
 
 
 
 
112
  for i, path in enumerate(self.paths):
113
  if i < len(self.embeddings):
114
  self.path_to_embedding[path] = self.embeddings[i]
115
+
116
  logger.info(f"已加载 {len(self.paths)} 条属性路径和对应的向量嵌入")
117
 
118
+ logger.info(f"已加载属性,包含 {len(self.attributes.keys())} 个顶级类别")
 
 
 
 
119
 
120
  def _load_json(self, file_path: str) -> Dict:
121
  """从文件加载JSON数据"""
 
169
  if "paths" not in self.attributes:
170
  logger.info("正在将属性从嵌套字典格式转换为路径格式")
171
  self.attributes = {"paths": self._flatten_attributes(self.attributes)}
 
 
 
 
 
 
 
 
 
 
 
 
 
172
  else:
173
  raise ValueError("无效的属性格式:不是字典")
174
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
175
  def _create_profile_embedding(self, profile: Dict) -> np.ndarray:
176
  """
177
  为用户配置文件创建嵌入向量
 
356
  if interests and isinstance(interests, list):
357
  summary_parts.append(f"Interests: {', '.join(interests)}")
358
 
359
+ # Add personal story (life_story) - 现在包含这部分内容
360
+ if "personal_story" in profile and "personal_story" in profile["personal_story"]:
361
+ life_story = profile["personal_story"]["personal_story"]
362
+ if life_story:
363
+ summary_parts.append(f"Life Story: {life_story}")
364
+
365
+ # Add summary if available
366
  if "summary" in profile:
367
  summary_parts.append(f"Profile Summary: {profile['summary']}")
368
 
369
+ # 现在包含完整的based_data信息,包括life_story
370
+
371
  return "\n".join(summary_parts)
372
 
373
+ def _flatten_attributes(self, attributes: Dict, prefix: str = "") -> List[str]:
374
+ """
375
+ 将属性字典扁平化为属性路径列表
376
+
377
+ 参数:
378
+ attributes: 属性字典或子字典
379
+ prefix: 当前路径前缀
380
+ """
381
+ result = []
382
+
383
+ def _flatten(attr_dict, curr_prefix):
384
+ for k, v in attr_dict.items():
385
+ path = f"{curr_prefix}.{k}" if curr_prefix else k
386
+ # 只有叶子节点(空字典)才添加到结果中
387
+ if isinstance(v, dict):
388
+ if not v: # 空字典,这是叶子节点
389
+ result.append(path)
390
+ else: # 非空字典,继续递归
391
+ _flatten(v, path)
392
+ else: # 非字典值,直接添加
393
+ result.append(path)
394
+
395
+ _flatten(attributes, prefix)
396
+ return result
397
+
398
+ def _get_attribute_categories(self) -> List[str]:
399
+ """获取顶级属性类别"""
400
+ # 从路径中提取唯一的顶级类别
401
+ return sorted({path.split('.')[0] for path in self.attributes["paths"]})
402
+
403
  def _format_attributes_tree(self, attributes_dict: Dict, prefix: str = "", depth: int = 0) -> List[str]:
404
  """
405
  将属性字典格式化为文本格式的树结构
 
646
  selected_paths = []
647
  used_indices = set()
648
 
649
+ # 按5:3:2比例分配近邻、中距离、远距离邻居
650
+ total_ratio = 5 + 3 + 2 # 总比例 = 10
651
+
652
+ # 1. 选择近邻(相似度最高的属性)- 50% (5/10)
653
+ near_count = min(int(target_count * 5 / total_ratio), total_paths // 3)
654
  near_indices = list(range(near_count))
655
+ for i in random.sample(near_indices, min(near_count, len(near_indices))):
656
  if i not in used_indices:
657
  selected_paths.append(path_similarities[i][0])
658
  used_indices.add(i)
659
 
660
+ # 2. 选择中距离邻居 - 30% (3/10)
661
  mid_start = total_paths // 3
662
  mid_end = 2 * total_paths // 3
663
+ mid_count = min(int(target_count * 3 / total_ratio), (mid_end - mid_start))
664
  mid_indices = list(range(mid_start, mid_end))
665
+ if mid_indices:
666
+ for i in random.sample(mid_indices, min(mid_count, len(mid_indices))):
667
+ if i not in used_indices:
668
+ selected_paths.append(path_similarities[i][0])
669
+ used_indices.add(i)
670
 
671
+ # 3. 选择远距离邻居(相似度最低的属性)- 20% (2/10)
672
  far_start = 2 * total_paths // 3
673
+ far_count = min(int(target_count * 2 / total_ratio), (total_paths - far_start))
674
  far_indices = list(range(far_start, total_paths))
675
+ if far_indices:
676
+ for i in random.sample(far_indices, min(far_count, len(far_indices))):
677
+ if i not in used_indices:
678
+ selected_paths.append(path_similarities[i][0])
679
+ used_indices.add(i)
680
 
681
  # 如果还需要更多属性来达到目标数量,从未使用的索引中随机选择
682
  remaining_count = target_count - len(selected_paths)
 
690
  logger.info(f"使用向量搜索选择了 {len(selected_paths)} 条属性(近邻: {near_count}, 中距离: {mid_count}, 远距离: {far_count})")
691
  return selected_paths
692
 
693
+ def get_top_attributes(self, result: Dict, target_count: int = 200) -> List[str]:
694
  """
695
  获取属性列表
696
 
697
  参数:
698
  result: 来自analyze_profile_for_attributes的结果
699
+ target_count: 目标属性数量
700
 
701
  返回:
702
  属性路径列表
 
730
  all_paths.extend(paths)
731
  category_paths[category] = paths
732
 
733
+ # 使用传入的target_count参数,不再随机选择
 
 
734
 
735
  # 如果有向量数据库,使用向量搜索
736
  if self.embeddings_data and self.user_profile:
 
743
  for category, paths in category_paths.items():
744
  # 根据类别大小按比例分配目标数量
745
  category_ratio = len(paths) / len(all_paths)
746
+ category_target = max(3, int(target_count * category_ratio))
747
 
748
  # 使用向量搜索选择该类别的属性
749
  category_selected = self._find_interesting_neighbors(
 
758
  logger.info(f"使用向量搜索从 {len(all_paths)} 条属性中选择了 {len(final_paths)} 条属性")
759
  return final_paths
760
 
761
+ # 如果没有向量数据库或向量搜索失败,直接返回空列表
762
+ logger.warning(f"没有可用的向量数据库或向量搜索失败,返回空列表")
763
+ return []
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
764
 
765
  except Exception as e:
766
  logger.error(f"Error generating attribute list: {e}")
 
824
 
825
  return user_profile
826
 
827
+ def get_selected_attributes(user_profile=None, attribute_count=200):
828
  global ATTRIBUTE_SELECTION_CACHE
829
+ # 注释掉缓存机制,确保每次都重新选择属性
830
+ # if ATTRIBUTE_SELECTION_CACHE is not None:
831
+ # return ATTRIBUTE_SELECTION_CACHE
832
 
833
  try:
834
  # 如果没有提供用户配置文件,生成一个
 
844
  # 获取属性推荐
845
  attribute_recommendations = result.get("attribute_recommendations", {})
846
 
847
+ # 获取属性列表,使用传入的attribute_count参数
848
+ top_paths = selector.get_top_attributes(attribute_recommendations, target_count=attribute_count)
849
 
850
  # 返回属性列表
851
  ATTRIBUTE_SELECTION_CACHE = top_paths
 
866
  current = current[part]
867
  return result
868
 
869
+ def save_results(user_profile: Dict, selected_paths: List[str], output_dir: str = '/home/zhou/persona/generate_user_profile/output') -> None:
870
  """
871
  保存用户配置文件和选定的属性路径到文件
872
  参数:
873
  user_profile: 用户配置文件
874
  selected_paths: 选定的属性路径 (列表形式)
875
+ output_dir: 输出目录(默认为 '/home/zhou/persona/generate_user_profile/output'
876
  """
877
  try:
878
  from pathlib import Path
879
  import json
 
 
 
 
 
880
  output_path = Path(output_dir)
881
  output_path.mkdir(parents=True, exist_ok=True)
882
 
{generation_user_profile → generate_user_profile_final}/code/web_api_bridge.py RENAMED
@@ -3,14 +3,13 @@
3
 
4
  """
5
  Web API bridge script for handling inputs from the web interface
6
- and generating user personas following the logic in generate_profile.py.
7
  """
8
 
9
  import json
10
  import argparse
11
  import sys
12
  import os
13
- import random
14
  from typing import Dict, Any, List, Optional
15
 
16
  # Import required modules
@@ -25,8 +24,8 @@ from based_data import (
25
  generate_interests_and_hobbies
26
  )
27
 
28
- from generate_profile import generate_final_summary
29
- from select_attributes import get_selected_attributes, save_results
30
 
31
  def parse_input_data(input_file: str) -> Dict[str, Any]:
32
  """
@@ -46,12 +45,14 @@ def parse_input_data(input_file: str) -> Dict[str, Any]:
46
  print(f"Error parsing input file: {e}")
47
  return {}
48
 
49
- def generate_profile_from_input(input_data: Dict[str, Any]) -> Dict[str, Any]:
 
50
  """
51
- Generate a complete user persona from input data
52
 
53
  Args:
54
  input_data: Input data containing basic information and optional custom values
 
55
 
56
  Returns:
57
  Dict: Generated complete user persona
@@ -112,44 +113,60 @@ def generate_profile_from_input(input_data: Dict[str, Any]) -> Dict[str, Any]:
112
  print("Generating interests and hobbies...")
113
  interests_and_hobbies = generate_interests_and_hobbies(personal_story)
114
 
115
- # Build complete user persona
116
- profile = {
117
- "basic_info": {
118
- "age": age,
119
- "gender": gender,
120
- "occupation": {"status": occupation},
121
- "location": location_info
 
 
122
  },
123
- "values_orientation": values_orientation,
124
- "life_attitude": life_attitude,
125
- "personal_story": personal_story,
126
- "interests_and_hobbies": interests_and_hobbies
 
127
  }
128
 
129
- # Select attributes
130
- print("Selecting attributes...")
131
- # Use the get_selected_attributes function from select_attributes.py
132
- selected_paths = get_selected_attributes(profile)
133
- profile["selected_attributes"] = selected_paths
 
 
 
 
134
 
135
- # Save the selected attributes to output files
136
- print("Saving selected attributes...")
137
- save_results(profile, selected_paths)
138
 
139
- # Generate final summary
140
- print("Generating final summary...")
141
- summary = generate_final_summary(profile)
142
- profile["Summary"] = summary
 
 
 
 
 
 
143
 
144
  return profile
 
145
  except Exception as e:
146
  print(f"Error generating user persona: {e}")
 
 
147
  return {}
148
 
 
149
  def main():
150
  """Main function to process command line arguments and execute generation workflow"""
151
  parser = argparse.ArgumentParser(description="Generate user persona from input data")
152
  parser.add_argument('--input', type=str, required=True, help="Path to input JSON file")
 
153
  args = parser.parse_args()
154
 
155
  # Parse input data
@@ -159,7 +176,7 @@ def main():
159
  sys.exit(1)
160
 
161
  # Generate user persona
162
- profile = generate_profile_from_input(input_data)
163
  if not profile:
164
  print("Failed to generate user persona, exiting")
165
  sys.exit(1)
@@ -190,5 +207,6 @@ def main():
190
  # Output the full profile as JSON
191
  print(json.dumps(profile, ensure_ascii=False))
192
 
 
193
  if __name__ == "__main__":
194
  main()
 
3
 
4
  """
5
  Web API bridge script for handling inputs from the web interface
6
+ and generating user personas using the improved methods from generate_profile_ind.py.
7
  """
8
 
9
  import json
10
  import argparse
11
  import sys
12
  import os
 
13
  from typing import Dict, Any, List, Optional
14
 
15
  # Import required modules
 
24
  generate_interests_and_hobbies
25
  )
26
 
27
+ from generate_profile import generate_single_profile
28
+
29
 
30
  def parse_input_data(input_file: str) -> Dict[str, Any]:
31
  """
 
45
  print(f"Error parsing input file: {e}")
46
  return {}
47
 
48
+
49
+ def generate_profile_from_input(input_data: Dict[str, Any], attribute_count: int = 200) -> Dict[str, Any]:
50
  """
51
+ Generate a complete user persona from input data using the improved generation method
52
 
53
  Args:
54
  input_data: Input data containing basic information and optional custom values
55
+ attribute_count: Number of attributes to generate (default: 200)
56
 
57
  Returns:
58
  Dict: Generated complete user persona
 
113
  print("Generating interests and hobbies...")
114
  interests_and_hobbies = generate_interests_and_hobbies(personal_story)
115
 
116
+ # Build base profile structure that will be saved to user_profile.json
117
+ # This needs to be saved before calling generate_single_profile
118
+ base_profile = {
119
+ "age": age,
120
+ "gender": gender,
121
+ "Occupations": [occupation],
122
+ "location": location_info,
123
+ "personal_values": {
124
+ "values_orientation": values_orientation
125
  },
126
+ "life_attitude": life_attitude.get("outlook") if isinstance(life_attitude, dict) else str(life_attitude),
127
+ "personal_story": {
128
+ "personal_story": personal_story
129
+ },
130
+ "interests": interests_and_hobbies
131
  }
132
 
133
+ # Save the base profile to user_profile.json
134
+ # This is required by generate_single_profile
135
+ project_root = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
136
+ output_dir = os.path.join(project_root, "output")
137
+ os.makedirs(output_dir, exist_ok=True)
138
+
139
+ user_profile_path = os.path.join(output_dir, 'user_profile.json')
140
+ with open(user_profile_path, 'w', encoding='utf-8') as f:
141
+ json.dump(base_profile, f, ensure_ascii=False, indent=2)
142
 
143
+ print(f"Base profile saved to: {user_profile_path}")
 
 
144
 
145
+ # Now call generate_single_profile which will:
146
+ # 1. Run select_attributes to choose attributes
147
+ # 2. Generate all sections using the improved prompts
148
+ # 3. Generate the final summary
149
+ print(f"Generating complete profile with {attribute_count} attributes...")
150
+ profile = generate_single_profile(template=None, profile_index=0, attribute_count=attribute_count)
151
+
152
+ if not profile:
153
+ print("Failed to generate profile")
154
+ return {}
155
 
156
  return profile
157
+
158
  except Exception as e:
159
  print(f"Error generating user persona: {e}")
160
+ import traceback
161
+ traceback.print_exc()
162
  return {}
163
 
164
+
165
  def main():
166
  """Main function to process command line arguments and execute generation workflow"""
167
  parser = argparse.ArgumentParser(description="Generate user persona from input data")
168
  parser.add_argument('--input', type=str, required=True, help="Path to input JSON file")
169
+ parser.add_argument('--attributes', type=int, default=200, help="Number of attributes to generate (default: 200)")
170
  args = parser.parse_args()
171
 
172
  # Parse input data
 
176
  sys.exit(1)
177
 
178
  # Generate user persona
179
+ profile = generate_profile_from_input(input_data, attribute_count=args.attributes)
180
  if not profile:
181
  print("Failed to generate user persona, exiting")
182
  sys.exit(1)
 
207
  # Output the full profile as JSON
208
  print(json.dumps(profile, ensure_ascii=False))
209
 
210
+
211
  if __name__ == "__main__":
212
  main()
{generation_user_profile → generate_user_profile_final}/data/occupations_english.json RENAMED
File without changes
generation_user_profile/code/data/100.json DELETED
@@ -1,395 +0,0 @@
1
- {
2
- "Career and Work Identity": {
3
- "Business": {
4
- "Strategies": {}
5
- },
6
- "Client": {
7
- "UserPreferences": {},
8
- "UserProfileAttributes": {}
9
- },
10
- "Company": {
11
- "Industry": {},
12
- "RevenueMetrics": {},
13
- "Type": {}
14
- },
15
- "CompanyCulture": {
16
- "Type": {}
17
- },
18
- "Experience": {
19
- "Attributes": {},
20
- "Salesforce": {}
21
- },
22
- "Goals": {
23
- "FinancialAttributes": {},
24
- "GoalsAndAspirations": {}
25
- },
26
- "Industry": {
27
- "Expertise": {},
28
- "TechProficiency": {}
29
- },
30
- "JobRole": {
31
- "LocationPreferences": {},
32
- "Responsibilities": {}
33
- },
34
- "Occupation": {
35
- "Service": {}
36
- },
37
- "Organization": {
38
- "Category": {},
39
- "Guidelines": {},
40
- "Preferences": {}
41
- },
42
- "PersonalGoals": {
43
- "Goals": {},
44
- "Meetings": {}
45
- },
46
- "PreviousExperience": {
47
- "UserLevel": {}
48
- },
49
- "Profession": {
50
- "PersonalBackgroundAttributes": {},
51
- "ProfessionalAttributes": {},
52
- "UserProfileAttributes": {}
53
- },
54
- "ProfessionalField": {
55
- "Experience": {},
56
- "Industry": {},
57
- "Role": {}
58
- },
59
- "Role": {
60
- "Background": {},
61
- "CommunicationStyle": {},
62
- "Contract": {},
63
- "Industry": {},
64
- "positionTitle": {}
65
- },
66
- "Skills": {
67
- "TechnicalAttributes": {},
68
- "UserProfileAttributes": {}
69
- },
70
- "Team": {
71
- "dynamics": {}
72
- },
73
- "Technology": {
74
- "Type": {}
75
- },
76
- "User": {
77
- "BusinessContext": {},
78
- "CampaignAttributes": {},
79
- "UserAttributes": {}
80
- },
81
- "WorkEnvironment": {
82
- "ContentOrganization": {},
83
- "UserPreferences": {}
84
- }
85
- },
86
- "Core Values, Beliefs, and Philosophy": {
87
- "Personal": {
88
- "ForgivenessLevel": {},
89
- "PersonalAttributes": {}
90
- },
91
- "Philosophical Beliefs": {
92
- "AnimalConsumption": {}
93
- },
94
- "PoliticalIdeology": {
95
- "Views": {}
96
- },
97
- "Spirituality": {
98
- "Personal Development": {}
99
- },
100
- "Sustainability": {
101
- "Attachment": {}
102
- }
103
- },
104
- "Cultural and Social Context": {
105
- "Attitudes": {
106
- "TowardsDrugs": {}
107
- },
108
- "Audience": {
109
- "InvestorType": {}
110
- },
111
- "Communication": {
112
- "Style": {}
113
- },
114
- "Community": {
115
- "UserCharacteristics": {}
116
- },
117
- "CompanyCulture": {
118
- "Culture": {}
119
- },
120
- "Culture": {
121
- "PersonalAttributes": {},
122
- "PersonalInterests": {}
123
- },
124
- "DataProcessing": {
125
- "Nature": {}
126
- },
127
- "Exposure": {
128
- "HistoricalTopics": {}
129
- },
130
- "Family": {
131
- "size": {}
132
- },
133
- "Historical": {
134
- "Background": {}
135
- },
136
- "Knowledge": {
137
- "AboutRefugeeIssues": {}
138
- },
139
- "Leadership": {
140
- "Style": {}
141
- },
142
- "LocalEvents": {
143
- "Attendance": {}
144
- },
145
- "LocalLaws": {
146
- "RhodeIsland": {}
147
- },
148
- "Political": {
149
- "Views": {}
150
- },
151
- "Preferences": {
152
- "ChildrenPreferences": {},
153
- "PersonalPreferences": {}
154
- },
155
- "Priorities": {
156
- "TravelGoals": {}
157
- },
158
- "Region": {
159
- "Residence": {}
160
- },
161
- "School": {
162
- "Environment": {}
163
- },
164
- "SocialActivities": {
165
- "NightlifeExperience": {}
166
- },
167
- "SocialStigma": {
168
- "Menstruation": {}
169
- },
170
- "SubstanceUse": {
171
- "DrugAwareness": {}
172
- },
173
- "SupportSystems": {
174
- "Availability": {}
175
- }
176
- },
177
- "Demographic Information": {
178
- "Demographics": {
179
- "Age": {},
180
- "CurrentLocation": {},
181
- "Education": {},
182
- "General": {},
183
- "Identity": {},
184
- "Origin": {},
185
- "Region": {},
186
- "TargetAudience": {}
187
- },
188
- "Family": {
189
- "FamilyDynamics": {},
190
- "PersonalAttributes": {},
191
- "PersonalDemographics": {}
192
- },
193
- "Lifestyle": {
194
- "budget": {}
195
- },
196
- "Professional": {
197
- "Demographic": {},
198
- "Professional Background": {}
199
- },
200
- "Socioeconomic": {
201
- "UserProfile": {}
202
- }
203
- },
204
- "Education and Learning": {
205
- "AcademicProfile": {
206
- "EducationLevel": {},
207
- "EducationalBackground": {}
208
- },
209
- "EducationalInstitution": {
210
- "Name": {}
211
- },
212
- "KnowledgeFamiliarity": {
213
- "DifficultyLevel": {},
214
- "MedicalTerminology": {}
215
- },
216
- "LearningPlatform": {
217
- "Focus": {}
218
- },
219
- "PersonalAttributes": {
220
- "FitnessPreferences": {},
221
- "UserPreferences": {}
222
- },
223
- "PersonalExperience": {
224
- "WorkingWithRefugees": {}
225
- },
226
- "SubjectExpertise": {
227
- "FocusArea": {}
228
- },
229
- "SubjectInterest": {
230
- "User_Personalization": {}
231
- },
232
- "UnderstandingLevel": {
233
- "Achievement": {},
234
- "Creative_Education": {},
235
- "Science_Education": {},
236
- "Status": {}
237
- }
238
- },
239
- "Emotional and Relational Skills": {
240
- "Emotional Attributes": {
241
- "EmotionalSupportNeeds": {}
242
- },
243
- "Environmental Attributes": {
244
- "emotionalConnection": {}
245
- },
246
- "Personal Attributes": {
247
- "Beliefs": {},
248
- "Preferences": {}
249
- },
250
- "Work Attributes": {
251
- "Drivers": {}
252
- }
253
- },
254
- "Hobbies, Interests, and Lifestyle": {
255
- "Education": {
256
- "Interests": {}
257
- },
258
- "FoodPreferences": {
259
- "Dietary Preference": {},
260
- "Food Preference": {}
261
- },
262
- "Hobbies": {
263
- "design": {},
264
- "types": {}
265
- },
266
- "Interests": {
267
- "ConsumerPreferences": {},
268
- "CulturalInterest": {},
269
- "UserPreferences": {}
270
- },
271
- "LifestylePreferences": {
272
- "UserAttributes": {}
273
- },
274
- "Professional": {
275
- "Interests": {}
276
- },
277
- "WorkRelatedInterests": {
278
- "FinancialManagement": {},
279
- "InvestmentPreferences": {}
280
- },
281
- "contentType": {
282
- "AdCampaigns": {}
283
- }
284
- },
285
- "Lifestyle and Daily Routine": {
286
- "Dietary Preferences": {
287
- "DailyContext": {},
288
- "FamilyContext": {},
289
- "HealthConsiderations": {},
290
- "Preferences": {}
291
- },
292
- "Living Conditions": {
293
- "BuyingIntention": {}
294
- },
295
- "Personal Lifestyle": {
296
- "Preferences": {}
297
- }
298
- },
299
- "Media Consumption and Engagement": {
300
- "PersonalizationAttributes": {
301
- "UserPreferences": {}
302
- }
303
- },
304
- "Physical and Health Characteristics": {
305
- "EnvironmentalFactors": {
306
- "SoilType": {}
307
- },
308
- "GeneticHistory": {
309
- "GeneticDisorders": {}
310
- },
311
- "HealthObjectives": {
312
- "CardiovascularWellness": {}
313
- },
314
- "MedicalHistory": {
315
- "General": {}
316
- },
317
- "PersonalHealthAttributes": {
318
- "DietaryPreferences": {},
319
- "General": {},
320
- "HealthConditions": {}
321
- }
322
- },
323
- "Psychological and Cognitive Aspects": {
324
- "BehavioralAttributes": {
325
- "AlcoholConsumptionHistory": {}
326
- },
327
- "CognitiveAttributes": {
328
- "CognitiveAttributes": {},
329
- "DevelopmentalAttributes": {},
330
- "EmotionalAttributes": {},
331
- "PreferenceAttributes": {}
332
- },
333
- "CopingMechanisms": {
334
- "PersonalHistory": {}
335
- },
336
- "EmotionalAttributes": {
337
- "PersonalAttributes": {},
338
- "PsychologicalFactors": {}
339
- },
340
- "MentalAttributes": {
341
- "CognitiveAttributes": {},
342
- "UserPreferences": {}
343
- },
344
- "Past": {
345
- "IndividualCharacteristics": {}
346
- },
347
- "PersonalityAttributes": {
348
- "Style": {}
349
- },
350
- "User": {
351
- "EmotionalState": {}
352
- }
353
- },
354
- "Relationships and Social Networks": {
355
- "CustomerRelations": {
356
- "UserEngagement": {},
357
- "UserProfile": {}
358
- },
359
- "FamilyRelations": {
360
- "CurrentLocation": {},
361
- "CurrentState": {},
362
- "FamilyDynamics": {},
363
- "FamilyMaritalStatus": {},
364
- "RelationshipDetails": {}
365
- },
366
- "PersonalPreferences": {
367
- "Companions": {}
368
- },
369
- "PersonalRelationships": {
370
- "Availability": {},
371
- "Context": {},
372
- "SocialConnections": {},
373
- "SocialInfluence": {},
374
- "UniversityAffiliation": {}
375
- },
376
- "ProfessionalRelations": {
377
- "PersonalAttributes": {}
378
- },
379
- "ProfessionalRelationships": {
380
- "Colleagues": {},
381
- "Connections": {},
382
- "Duration": {},
383
- "HeadOfSalesRelationship": {},
384
- "Interests": {},
385
- "Preferences": {},
386
- "Relationship": {},
387
- "RelationshipQuality": {},
388
- "Role": {},
389
- "ZichengExperience": {}
390
- },
391
- "UserAttributes": {
392
- "FatherRelationship": {}
393
- }
394
- }
395
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
generation_user_profile/code/data/attribute_embeddings.pkl DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:664f3d1f49a5a3162108da60e4340411f01fdf58a38419387ddb1cdd0ee61481
3
- size 28364886
 
 
 
 
generation_user_profile/code/data/attributes_merged.json DELETED
The diff for this file is too large to render. See raw diff
 
generation_user_profile/code/data/large_attributes copy.json DELETED
The diff for this file is too large to render. See raw diff
 
generation_user_profile/code/data/large_attributes.json DELETED
@@ -1,67 +0,0 @@
1
- {
2
- "Demographic Information": {
3
- "Age": {
4
- "description": "The person's age in years"
5
- },
6
- "Gender": {
7
- "description": "The person's gender identity"
8
- },
9
- "Location": {
10
- "description": "Where the person lives",
11
- "Country": {
12
- "description": "The country where the person lives"
13
- },
14
- "City": {
15
- "description": "The city where the person lives"
16
- }
17
- }
18
- },
19
- "Career and Work Identity": {
20
- "Occupation": {
21
- "description": "The person's current job or profession"
22
- },
23
- "Work Experience": {
24
- "description": "The person's work history and experience"
25
- }
26
- },
27
- "Core Values, Beliefs, and Philosophy": {
28
- "Personal Values": {
29
- "description": "The person's core values and beliefs"
30
- },
31
- "Life Philosophy": {
32
- "description": "The person's approach to life and worldview"
33
- }
34
- },
35
- "Lifestyle and Daily Routine": {
36
- "Daily Habits": {
37
- "description": "Regular activities the person engages in"
38
- },
39
- "Lifestyle Choices": {
40
- "description": "How the person chooses to live their life"
41
- }
42
- },
43
- "Cultural and Social Context": {
44
- "Cultural Background": {
45
- "description": "The person's cultural heritage and influences"
46
- },
47
- "Social Connections": {
48
- "description": "The person's relationships and social network"
49
- }
50
- },
51
- "Hobbies, Interests, and Lifestyle": {
52
- "Hobbies": {
53
- "description": "Activities the person enjoys in their free time"
54
- },
55
- "Interests": {
56
- "description": "Topics or subjects the person is interested in"
57
- }
58
- },
59
- "Other Attributes": {
60
- "Personal Story": {
61
- "description": "Significant events or narratives from the person's life"
62
- },
63
- "Key Life Events": {
64
- "description": "Major events that have shaped the person's life"
65
- }
66
- }
67
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
generation_user_profile/code/data/occupations_english copy.json DELETED
@@ -1,933 +0,0 @@
1
- [
2
- "HR Specialist/Assistant ",
3
- "HR Information System (HRIS) Management ",
4
- "HR Director ",
5
- "HR Manager/Supervisor ",
6
- "Other HR Administration ",
7
- "Human Resources Director ",
8
- "Party, Labor Union, and Youth League Officer ",
9
- "Internal Staff ",
10
- "Front Desk/Switchboard/Receptionist ",
11
- "Logistics ",
12
- "Librarian ",
13
- "Training Specialist/Assistant ",
14
- "Training Manager/Supervisor ",
15
- "Recruitment Specialist/Assistant ",
16
- "Recruitment Manager/Supervisor ",
17
- "Clerk ",
18
- "Document/Data Management ",
19
- "Headhunter Consultant ",
20
- "Computer Operator/Typist/Data Entry Clerk ",
21
- "Manager Assistant/Secretary ",
22
- "Compensation/Performance/Employee Relations ",
23
- "Administrative Specialist/Assistant ",
24
- "Administrative Director ",
25
- "Administrative Manager/Supervisor ",
26
- "Other Health and Massage ",
27
- "Masseur/Masseuse ",
28
- "Bath Attendant ",
29
- "Foot Reflexologist ",
30
- "Acupuncture and Tui Na ",
31
- "Insurance Product Development ",
32
- "Other Insurance Positions ",
33
- "Insurance Internal Staff ",
34
- "Insurance Trainer ",
35
- "Insurance Contract Management ",
36
- "Insurance Client Manager ",
37
- "Insurance Customer Service ",
38
- "Insurance Underwriting/Claims ",
39
- "Insurance Telemarketing ",
40
- "Insurance Actuary ",
41
- "Insurance Broker ",
42
- "Insurance Project Manager ",
43
- "Insurance Consultant ",
44
- "Reserve Manager ",
45
- "Automobile Damage Assessment/Auto Insurance Claims ",
46
- "Renewal Management ",
47
- "Auto Insurance Specialist ",
48
- "Other Positions ",
49
- "Breeding Staff ",
50
- "Breeding Department Supervisor ",
51
- "Other Agriculture, Forestry, Animal Husbandry, and Fishery",
52
- "Agronomist/Floral Designer ",
53
- "Animal Breeding/Farming ",
54
- "Animal Nutrition/Feed Research and Development ",
55
- "Farm Manager ",
56
- "Forestry Technician ",
57
- "Livestock Specialist ",
58
- "Feed Business ",
59
- "Feed Sales ",
60
- "Clinical Promotion Manager ",
61
- "Clinical Data Analyst ",
62
- "Clinical Research/Coordination ",
63
- "Other in Pharmaceutical Biology ",
64
- "Chemical Analysis Tester ",
65
- "Medical Device Promotion ",
66
- "Medical Device Registration ",
67
- "Medical Device Production/Quality Management ",
68
- "Medical Device Research and Development ",
69
- "Medical Device Research and Development/Maintenance ",
70
- "Pharmaceutical Chemical Analysis ",
71
- "Pharmaceutical Academic Promotion ",
72
- "Pharmaceutical Technology Research and Development Personnel ",
73
- "Pharmaceutical Technology Research and Development Management Personnel ",
74
- "Pharmaceutical Investment Promotion ",
75
- "Pharmaceutical Research and Development/Production/Registration ",
76
- "Pharmaceutical Sales Manager/Supervisor ",
77
- "Pharmaceutical Project Bidding Management ",
78
- "Pharmaceutical Project Management ",
79
- "Bioengineering/Biopharmaceuticals ",
80
- "Pharmaceutical Marketing Specialist/Assistant ",
81
- "Pharmaceutical Marketing Manager/Supervisor ",
82
- "Traditional Chinese Medicine Doctor ",
83
- "Obstetrician ",
84
- "Health Doctor ",
85
- "Public Health/Disease Control ",
86
- "Laboratory/Testing Physician ",
87
- "Medical Laboratory/Testing ",
88
- "Medical Imaging/Radiology Physician ",
89
- "Doctor ",
90
- "Medical Management ",
91
- "Pharmaceutical Quality Inspection ",
92
- "Other in Hospital Nursing ",
93
- "Pet Care/Veterinarian ",
94
- "Medical Guide ",
95
- "Psychologist ",
96
- "Nurse/Nursing ",
97
- "Head Nurse/Nursing Director ",
98
- "Dentist ",
99
- "Physiotherapist ",
100
- "General Outpatient/General Practitioner ",
101
- "Cosmetic Surgeon",
102
- "Pharmacist ",
103
- "Nutritionist ",
104
- "Acupuncturist/Masseur ",
105
- "Optometrist ",
106
- "Anesthetist ",
107
- "Chauffeur ",
108
- "Other Transportation Roles ",
109
- "Designated Driver ",
110
- "Bus/Subway Attendant ",
111
- "Taxi Driver ",
112
- "Train Attendant ",
113
- "Train Driver/Operator ",
114
- "Executive Driver ",
115
- "Ground Staff ",
116
- "Security Screener ",
117
- "Passenger Driver ",
118
- "Special Vehicle Driver ",
119
- "Shuttle Bus Driver ",
120
- "Flight Attendant ",
121
- "Crew Member/Sailor ",
122
- "Ship Attendant ",
123
- "Ship Driver/Operator ",
124
- "Freight Driver ",
125
- "Aircraft Pilot/Operator ",
126
- "Driving School Instructor/Coach ",
127
- "VIP Specialist ",
128
- "Pre-sales/Post-sales Technical Support Engineer ",
129
- "Pre-sales/Post-sales Technical Support Management ",
130
- "Pre-sales/Post-sales Service ",
131
- "Customer Relationship Management ",
132
- "Customer Service Hotline/Call Center Staff ",
133
- "Customer Service Specialist/Assistant ",
134
- "Other Customer Service Roles ",
135
- "Customer Service Director ",
136
- "Customer Service Manager/Supervisor ",
137
- "Complaint Specialist ",
138
- "Telephone Customer Service ",
139
- "Online Customer Service ",
140
- "Nanny ",
141
- "Security Guard ",
142
- "Cleaner ",
143
- "Wedding/Celebration Planning Services ",
144
- "Pet Care and Grooming ",
145
- "Other Household Cleaning Services ",
146
- "Home Appliance Repair ",
147
- "Caregiver ",
148
- "Maternity Matron ",
149
- "Laundry Worker ",
150
- "Infant Caregiver/Nursery Teacher ",
151
- "Water Delivery Worker",
152
- "Hourly Worker ",
153
- "Business Development Specialist/Assistant ",
154
- "Planning Manager/Supervisor ",
155
- "Conference and Exhibition Specialist/Manager ",
156
- "Promotion Supervisor/Director/Promoter ",
157
- "Promotion Manager ",
158
- "Public Relations Specialist/Assistant ",
159
- "Public Relations Director ",
160
- "Public Relations Manager/Supervisor ",
161
- "Brand Specialist/Manager ",
162
- "Media Specialist/Assistant ",
163
- "Media Manager/Supervisor ",
164
- "Media Sales ",
165
- "Academic Promotion ",
166
- "Marketing Specialist/Assistant ",
167
- "Marketing Supervisor ",
168
- "Other Marketing and Public Relations ",
169
- "Market Expansion ",
170
- "Market Planning ",
171
- "Marketing Manager/Director ",
172
- "Marketing ",
173
- "Market Research ",
174
- "Market Research and Analysis ",
175
- "Channel Marketing Specialist ",
176
- "Government Affairs Management ",
177
- "Event Execution ",
178
- "Event Planning ",
179
- "Site Selection and Expansion/New Store Development ",
180
- "Professional Consultant ",
181
- "Corporate/Business Development Manager ",
182
- "Corporate Planning ",
183
- "Conference Specialist/Assistant ",
184
- "Conference Manager/Supervisor ",
185
- "Exhibition Planning/Design ",
186
- "Creative Director ",
187
- "Production Execution ",
188
- "Consulting Director ",
189
- "Consulting Manager/Supervisor ",
190
- "Consultant ",
191
- "Wedding Planner ",
192
- "Media Planning/Management ",
193
- "Client Supervisor/Specialist ",
194
- "Advertising/Exhibition Business Development ",
195
- "Advertising/Exhibition Project Management ",
196
- "Advertising Creativity ",
197
- "Other Advertising Consulting ",
198
- "Advertising Account Director/Manager ",
199
- "Advertising Copywriter ",
200
- "Advertising Design ",
201
- "Intelligence and Information Analysis",
202
- "Immigration/Study Abroad Consultant ",
203
- "Landscape/Scenic Designer ",
204
- "Civil Engineering Surveyor ",
205
- "Civil/Structural Engineer ",
206
- "Urban Planning and Design ",
207
- "Safety Management/Safety Officer ",
208
- "Security Engineer ",
209
- "Interior Decoration Designer ",
210
- "Geotechnical Engineer ",
211
- "Engineering Director ",
212
- "Engineering Supervisor ",
213
- "Engineering Equipment Management ",
214
- "Engineering Documentation Management ",
215
- "Engineering Project Management ",
216
- "Municipal Engineer ",
217
- "Curtain Wall Engineer ",
218
- "Other Architecture Roles ",
219
- "Architectural Drafting ",
220
- "Construction Safety Management ",
221
- "Architectural Engineer/Chief Engineer ",
222
- "Construction Acceptance ",
223
- "Construction Site Management ",
224
- "Architectural Designer/Drafter ",
225
- "Development and Reporting ",
226
- "Construction Worker ",
227
- "Construction Team Leader ",
228
- "Line and Pipeline Engineering Technician ",
229
- "Building Automation ",
230
- "Cabinet Designer ",
231
- "Water Conservancy/Port Engineering Technician ",
232
- "Surveying/Mapping ",
233
- "Blasting Engineer ",
234
- "Hard Decoration Designer ",
235
- "Water Supply and Drainage/Refrigeration/HVAC ",
236
- "Structured Cabling/Weak Current ",
237
- "Documentation Specialist ",
238
- "Soft Decoration Designer ",
239
- "Cost Estimator/Budget Analyst ",
240
- "Road and Bridge Technician ",
241
- "Host/Presenter ",
242
- "Other Entertainment Roles ",
243
- "Entertainment Hall Attendant ",
244
- "Entertainment Marketing Planner ",
245
- "Film/Video Post-Production ",
246
- "Film Producer ",
247
- "Executive Producer ",
248
- "Executive Agent ",
249
- "Photographer/Cameraman ",
250
- "Projectionist ",
251
- "Lighting Technician",
252
- "Film Marketing Manager ",
253
- "Short Video Editor ",
254
- "Short Video Planner ",
255
- "Short Video Director ",
256
- "Short Video Operations ",
257
- "Protocol/Reception ",
258
- "Signed Artist ",
259
- "Agent Assistant ",
260
- "Coordinating Producer ",
261
- "Artist Assistant ",
262
- "Artist Agent ",
263
- "Artist Coordinator ",
264
- "Program Director ",
265
- "Program Director and Planner ",
266
- "Video Editing Specialist ",
267
- "Video Editing Assistant ",
268
- "Video Editor ",
269
- "Bartender ",
270
- "Voice Actor ",
271
- "Bar Waitstaff ",
272
- "Sound Engineer ",
273
- "Other Real Estate Positions ",
274
- "Real Estate Internal Staff ",
275
- "Real Estate Customer Service ",
276
- "Real Estate Clerk/Assistant ",
277
- "Real Estate Store Manager ",
278
- "Real Estate Development/Planning ",
279
- "Real Estate Agent ",
280
- "Real Estate Appraiser ",
281
- "Real Estate Brokerage/Transactions ",
282
- "Real Estate Investment Analyst ",
283
- "Real Estate Asset Management ",
284
- "Real Estate Sales Supervisor ",
285
- "Real Estate Sales Manager ",
286
- "Real Estate Project Development and Reporting ",
287
- "Real Estate Project Bidding ",
288
- "Real Estate Project Planning Specialist/Assistant ",
289
- "Real Estate Project Planning Manager/Supervisor ",
290
- "Real Estate Project Management ",
291
- "Real Estate Project Support Engineer ",
292
- "Inspector ",
293
- "Property Consultant ",
294
- "Physical Education Teacher/Coach ",
295
- "Part-time Teacher ",
296
- "Middle School Teacher ",
297
- "Training Assistant ",
298
- "Trainer/Instructor ",
299
- "Training Supervisor ",
300
- "Training Planner ",
301
- "Foreign Teacher",
302
- "Foreign Language Teacher ",
303
- "University Lecturer ",
304
- "Academic Research/Scientific Research ",
305
- "Tutor ",
306
- "Primary School Teacher ",
307
- "Preschool/Early Childhood Educator ",
308
- "Admissions/Course Consultant ",
309
- "Teaching/Academic Administration ",
310
- "Teaching/Academic Administrative Staff ",
311
- "Teacher/Teaching Assistant ",
312
- "Educational Product Development ",
313
- "Other Education and Training ",
314
- "Liberal Arts Teacher ",
315
- "Principal ",
316
- "Science Teacher ",
317
- "Postgraduate Entrance Exam/Civil Service Exam Trainer ",
318
- "Vocational Technical Teacher ",
319
- "Outdoor Adventure Trainer ",
320
- "Music/Art Teacher ",
321
- "High School Teacher ",
322
- "Tour Guide ",
323
- "Tourism Product/Itinerary Planner ",
324
- "Other Tourism ",
325
- "Travel Consultant ",
326
- "Visa Specialist ",
327
- "Tour Coordinator ",
328
- "Ticketing Agent ",
329
- "Handyman ",
330
- "Cutter/Welder ",
331
- "Refrigeration/Plumbing Technician ",
332
- "Packager ",
333
- "Printing Worker ",
334
- "Pressing Worker ",
335
- "Apprentice ",
336
- "Mobile Phone Repair Technician ",
337
- "Pressing Worker ",
338
- "Operator ",
339
- "General Worker ",
340
- "Other General/Technical Worker ",
341
- "Carpenter ",
342
- "Dyer ",
343
- "Sample Garment Worker ",
344
- "Cement Worker ",
345
- "Painter ",
346
- "Tiler ",
347
- "Power Line Worker ",
348
- "Electrician ",
349
- "Elevator Technician ",
350
- "Electroplating Worker ",
351
- "Grinding/Stamping Worker",
352
- "Pipefitter ",
353
- "Textile Worker ",
354
- "Assembler ",
355
- "General Maintenance Worker ",
356
- "Sewing Worker ",
357
- "Lathe/Milling Machine Operator ",
358
- "Rebar Worker ",
359
- "Sheet Metal Worker ",
360
- "Fitter ",
361
- "Forklift Operator ",
362
- "Casting/Injection Molding/Mold Worker ",
363
- "Boiler Operator ",
364
- "Loom Operator ",
365
- "Warping Operator ",
366
- "Apparel/Textile/Leather Technologist ",
367
- "Apparel/Textile/Leather Merchandiser ",
368
- "Other Apparel/Textile ",
369
- "Apparel/Textile/Leather Quality Management ",
370
- "Apparel/Textile Design Director ",
371
- "Apparel Pattern Maker ",
372
- "Fashion Designer ",
373
- "Pattern Room/Pattern Grader ",
374
- "Sample Maker ",
375
- "Sizing Operator ",
376
- "Production Management ",
377
- "Computer Grader ",
378
- "Pattern Maker/Sample Maker ",
379
- "Textile Designer ",
380
- "Spinning Operator ",
381
- "Cutter ",
382
- "Fabric/Accessory Development/Purchasing ",
383
- "Footwear Designer ",
384
- "Food/Beverage R&D/Inspection ",
385
- "Food Production Worker ",
386
- "CNC/Numerical Control Engineer ",
387
- "Instrument/Measurement Engineer ",
388
- "Train Maintenance/Servicing ",
389
- "Train Design and Manufacturing ",
390
- "Other Machinery/Instrument ",
391
- "Mechanical Engineer ",
392
- "Mechanical Maintenance/Servicing ",
393
- "Electromechanical Engineer ",
394
- "Pneumatic Engineer ",
395
- "Test/Reliability Engineer ",
396
- "Layout Design Engineer ",
397
- "R&D Engineer ",
398
- "Ship Maintenance/Servicing ",
399
- "Ship Design and Manufacturing ",
400
- "Assembly Technician ",
401
- "Aircraft Maintenance/Servicing",
402
- "Aircraft Design and Manufacturing ",
403
- "4S Store Management ",
404
- "Used Car Appraiser ",
405
- "Parking Attendant ",
406
- "Gas Station Attendant ",
407
- "Engine/Assembly Engineer ",
408
- "Safety Performance Engineer ",
409
- "Automobile/Motorcycle Repair ",
410
- "Automobile Mechanic ",
411
- "Other Automotive Positions ",
412
- "Automotive Engineering Project Management ",
413
- "Automotive Structural Engineer ",
414
- "Automotive Mechanical Engineer ",
415
- "Automotive Inspection/Testing ",
416
- "Automotive Electronics Engineer ",
417
- "Automotive Electrician ",
418
- "Automobile Detailing ",
419
- "Automotive Design Engineer ",
420
- "Automotive Quality Management/Inspection and Testing ",
421
- "Automotive Parts Designer ",
422
- "Car Wash Attendant ",
423
- "Claims Specialist/Consultant ",
424
- "Assembly Process Engineer ",
425
- "Tire Technician ",
426
- "Parts Sales ",
427
- "Intellectual Property/Patent Consultant ",
428
- "Contract Management ",
429
- "Compliance Management ",
430
- "Lawyer/Legal Consultant ",
431
- "Legal Assistant ",
432
- "Legal Specialist/Supervisor ",
433
- "Other Legal Positions ",
434
- "Store Copywriter ",
435
- "Event Planner ",
436
- "Other Taobao Positions ",
437
- "Taobao Customer Service ",
438
- "Taobao Graphic Designer ",
439
- "Online Store Manager ",
440
- "Online Store Operations ",
441
- "Contract Management ",
442
- "Investment Promotion Manager/Supervisor ",
443
- "Property Investment Promotion Management ",
444
- "Property Leasing/Sales ",
445
- "Property Management/Commercial Center ",
446
- "Other Property Management Positions ",
447
- "Property Manager/Supervisor ",
448
- "Property Maintenance ",
449
- "Surveillance Maintenance ",
450
- "Warehouse Administrator ",
451
- "Warehouse Manager/Supervisor",
452
- "Supply Chain Management ",
453
- "Sorter ",
454
- "Documentation Specialist ",
455
- "International Freight ",
456
- "Courier ",
457
- "Customs Affairs Management ",
458
- "Material Management ",
459
- "Logistics Specialist/Assistant ",
460
- "Other Logistics and Warehousing ",
461
- "Logistics Director ",
462
- "Logistics Manager/Supervisor ",
463
- "Loader/Handler ",
464
- "Dispatcher ",
465
- "Freight Forwarder ",
466
- "Container Business ",
467
- "EHS Management ",
468
- "Solid Wastewater and Exhaust Gas Treatment ",
469
- "Solid Waste Treatment Engineer ",
470
- "Geological Survey ",
471
- "Exhaust Gas Treatment Engineer ",
472
- "Control and Protection R&D Engineer ",
473
- "Nuclear/Coal Power Engineer ",
474
- "Water Conservancy/Hydropower Engineer ",
475
- "Water Treatment Engineer ",
476
- "Water Quality Inspector ",
477
- "Other Environmental Protection/Energy ",
478
- "Environmental Engineer ",
479
- "Environmental Technology ",
480
- "Environmental Testing ",
481
- "Environmental Engineering Technology ",
482
- "Environmental Management/Protection ",
483
- "Environmental Management/Park and Scenic Area Protection ",
484
- "Environmental Greening ",
485
- "Environmental Assessment Engineer ",
486
- "Ecological Management/Planning ",
487
- "Power Electronics R&D Engineer ",
488
- "Power System R&D Engineer ",
489
- "Petroleum and Natural Gas Technician ",
490
- "HVAC/Thermal Energy Engineer ",
491
- "Energy/Mineral Project Management ",
492
- "Product Management ",
493
- "Manufacturing Engineer ",
494
- "Packaging Engineer ",
495
- "Laboratory/Inspection ",
496
- "Plant Manager/Deputy Plant Manager ",
497
- "Industrial Engineer ",
498
- "Process Design ",
499
- "Chief Engineer/Deputy Chief Engineer ",
500
- "Technical Engineer ",
501
- "Technical Documentation Engineer",
502
- "Materials Engineer ",
503
- "Production Supervisor/Leader ",
504
- "Production Director ",
505
- "Production Clerk ",
506
- "Production Material Control (PMC) ",
507
- "Other Production R&D ",
508
- "Production Planning ",
509
- "Production Order Follow-up ",
510
- "Production Operations Management ",
511
- "Production Project Engineer ",
512
- "Production Project Manager/Supervisor ",
513
- "Electronic Technology R&D Engineer ",
514
- "Structural Engineer ",
515
- "Maintenance Engineer ",
516
- "Operations Supervisor ",
517
- "Operations Manager ",
518
- "Equipment Supervisor ",
519
- "Equipment Management and Maintenance ",
520
- "Quality Management ",
521
- "Workshop Director ",
522
- "FAE Field Application Engineer ",
523
- "IC Verification Engineer ",
524
- "Product Process/Planning Engineer ",
525
- "Photovoltaic System Engineer ",
526
- "Light Source/Lighting Engineer ",
527
- "Semiconductor Technology ",
528
- "Transformer and Magnetoelectric Engineer ",
529
- "Security System Engineer ",
530
- "Home Appliance/Digital Product R&D ",
531
- "Embedded Hardware Development ",
532
- "Embedded Software Development ",
533
- "Radio Engineer ",
534
- "Analog Circuit Design/Application Engineer ",
535
- "Test/Reliability Engineer ",
536
- "Laser/Optoelectronics Technology ",
537
- "Lighting/Illumination Design Engineer ",
538
- "Electrical R&D Engineer ",
539
- "Electroacoustic/Audio Engineer/Technician ",
540
- "Electronic/Electrical Process/Manufacturing Engineer ",
541
- "Electronic/Electrical Maintenance ",
542
- "Electronic/Electrical Equipment Engineer ",
543
- "Electronic/Electrical Project Management ",
544
- "Other Electronic/Electrical ",
545
- "Electronic/Electrical Engineer ",
546
- "Electronic Component Engineer ",
547
- "Electronic Software Development ",
548
- "Electrical Circuit Design ",
549
- "Battery/Power Development ",
550
- "Circuit Engineer/Technician ",
551
- "R&D Engineer",
552
- "Air Conditioning Engineer/Designer ",
553
- "Line Structure Designer ",
554
- "Automation Engineer ",
555
- "Integrated Circuit/Application Engineer ",
556
- "Audio/Video Engineer ",
557
- "Host/Emcee ",
558
- "Lead Designer ",
559
- "Writer/Screenwriter/Copywriter ",
560
- "Publishing/Distribution ",
561
- "Paper Cutting Machine Operator ",
562
- "Printing Operator ",
563
- "Printing Machine Operator ",
564
- "Creasing Operator ",
565
- "Distribution Management ",
566
- "Rewinding Operator ",
567
- "Data Entry/Proofreading ",
568
- "Editor-in-Chief/Deputy Editor-in-Chief/Chief Editor ",
569
- "Drafting Machine Operator ",
570
- "Typesetting Design/Production ",
571
- "Projection Management ",
572
- "Digital Direct Printing/Film Output ",
573
- "Copywriting and Planning ",
574
- "Text Editor/Content Compilation ",
575
- "Plate Maker ",
576
- "Actor/Model ",
577
- "Lighting Technician ",
578
- "Hot Stamping Operator ",
579
- "Color Separation Operator ",
580
- "Agent/Talent Scout ",
581
- "Editor/Copywriter ",
582
- "Other Editorial Publishing ",
583
- "Art Director/Stage Design ",
584
- "Binding/Hot Stamping ",
585
- "Binding Worker ",
586
- "Lamination Worker ",
587
- "Video Streamer ",
588
- "Journalist/Reporter ",
589
- "Ink Technician ",
590
- "Colorist ",
591
- "Broadcast Engineer ",
592
- "Makeup Artist ",
593
- "Hairstylist ",
594
- "Pet Grooming/Care ",
595
- "Image Designer ",
596
- "Makeup Trainer ",
597
- "Shampoo Assistant ",
598
- "Body Therapist ",
599
- "Hairdressing Assistant/Apprentice ",
600
- "Beauty/Slimming Consultant ",
601
- "Beauty Assistant/Apprentice",
602
- "Beauty Consultant ",
603
- "Beautician ",
604
- "Beauty Salon Manager ",
605
- "Cosmetic Surgeon ",
606
- "Other Beauty and Hairdressing ",
607
- "Nail Technician ",
608
- "CAD Designer/Drafter ",
609
- "3D Design/Production ",
610
- "Product/Packaging Designer ",
611
- "Concept Artist ",
612
- "Landscape Architect ",
613
- "Multimedia/Animation Designer ",
614
- "Furniture/Homeware Designer ",
615
- "Industrial Designer ",
616
- "Craft/Jewelry Designer ",
617
- "Graphic Designer ",
618
- "Store/Display/Exhibition Designer ",
619
- "Fashion Designer ",
620
- "Game Interface Designer ",
621
- "Special Effects Designer ",
622
- "Toy Designer ",
623
- "Other Art and Creative ",
624
- "Art Director ",
625
- "Art Editor/Designer ",
626
- "Stage Art Designer ",
627
- "Art/Design Director ",
628
- "Interior Design ",
629
- "Visual Designer ",
630
- "Design Manager ",
631
- "Russian Translator ",
632
- "Minor Language Translator ",
633
- "German Translator ",
634
- "Italian Translator ",
635
- "Japanese Translator ",
636
- "French Translator ",
637
- "Other Translators ",
638
- "English Translator ",
639
- "Portuguese Translator ",
640
- "Spanish Translator ",
641
- "Arabic Translator ",
642
- "Korean Translator ",
643
- "Android Developer ",
644
- "C Language Developer ",
645
- "ERP Technical/Development Application ",
646
- "Flash Designer/Developer ",
647
- "iOS Developer ",
648
- "Java Developer ",
649
- "PHP Developer ",
650
- "SEO Specialist ",
651
- "UI/UX Designer",
652
- "Web Frontend Developer ",
653
- "Other Internet Roles ",
654
- "Product Director ",
655
- "Product Manager/Specialist ",
656
- "Simulation Application Engineer ",
657
- "Implementation Engineer ",
658
- "Embedded Hardware Developer ",
659
- "Embedded Software Developer ",
660
- "WeChat Promotion ",
661
- "Mobile Software Development Engineer ",
662
- "Technical Specialist/Assistant ",
663
- "Technical Director/Manager ",
664
- "Technical Support/Maintenance ",
665
- "Database Development Engineer ",
666
- "Database Administrator/DBA ",
667
- "Data Communication Engineer ",
668
- "New Media Operations ",
669
- "Wireless Communication Engineer ",
670
- "Wired Transmission Engineer ",
671
- "Test Engineer ",
672
- "Taobao/WeChat Operations Specialist/Supervisor ",
673
- "Game Concept Artist ",
674
- "Game Interface Designer ",
675
- "Game Planner ",
676
- "Game Design/Development ",
677
- "Special Effects Designer ",
678
- "Telecom Switching Engineer ",
679
- "Telecom Network Engineer ",
680
- "E-commerce ",
681
- "E-commerce Director ",
682
- "Hardware Engineer ",
683
- "Mobile Internet Developer ",
684
- "Mobile Communication Engineer ",
685
- "Programmer ",
686
- "Algorithm Engineer ",
687
- "Systems Analyst ",
688
- "System Architect ",
689
- "System Integration Engineer ",
690
- "Online Store Manager ",
691
- "Online Store Administrator ",
692
- "Website Architecture Designer ",
693
- "Website Planner ",
694
- "Website Editor ",
695
- "Website Operations ",
696
- "Website Operations Director/Manager ",
697
- "Network and Information Security Engineer ",
698
- "Online Promotion ",
699
- "Network Administrator ",
700
- "Network Operations Specialist/Assistant ",
701
- "Network Operations Management",
702
- "Web Designer/Developer ",
703
- "Script Development Engineer ",
704
- "Computer-Aided Designer ",
705
- "Voice/Video/Graphics ",
706
- "Quality Engineer ",
707
- "Software Engineer ",
708
- "Operations Supervisor/Specialist ",
709
- "Operations Director ",
710
- "Telecommunication Technology Engineer ",
711
- "Telecommunication Power Engineer ",
712
- "Requirements Analyst ",
713
- "Project Manager/Supervisor ",
714
- "Senior Hardware Engineer ",
715
- "Accountant ",
716
- "Accounting Manager/Supervisor ",
717
- "Cashier ",
718
- "Audit Specialist/Assistant ",
719
- "Audit Manager/Supervisor ",
720
- "Cost Administrator ",
721
- "Tax Specialist/Assistant ",
722
- "Tax Manager/Supervisor ",
723
- "Statistician ",
724
- "Finance/Accounting Assistant ",
725
- "Other Finance Roles ",
726
- "Financial Analyst ",
727
- "Finance Director ",
728
- "Finance Manager/Supervisor ",
729
- "Financial Consultant ",
730
- "Asset/Fund Management ",
731
- "Chief Financial Officer (CFO) ",
732
- "System Engineer ",
733
- "Safety and Fire Protection ",
734
- "Safety Management ",
735
- "Fault Analysis Engineer ",
736
- "Test Engineer ",
737
- "Certification Engineer/Auditor ",
738
- "Other Quality Inspection/Security Roles ",
739
- "Quality Inspector/Tester ",
740
- "Quality Management/Test Manager ",
741
- "Business Order Manager ",
742
- "Buyer ",
743
- "Supplier Development ",
744
- "Supply Chain Management ",
745
- "Assistant Business Order Coordinator ",
746
- "Business Specialist/Manager ",
747
- "International Trade Supervisor/Specialist ",
748
- "Foreign Trade Specialist/Assistant ",
749
- "Foreign Trade Manager/Supervisor ",
750
- "Customs Declarer ",
751
- "Other Trade Roles",
752
- "Trade Order Specialist ",
753
- "Purchasing Assistant ",
754
- "Purchaser ",
755
- "Purchasing Manager/Director ",
756
- "Senior Sales Order Specialist ",
757
- "Promoter/Sales Guide ",
758
- "Category Management ",
759
- "Luxury Goods Business ",
760
- "Store Clerk/Sales Associate ",
761
- "Store Manager/Retail Manager ",
762
- "Investment Promotion Manager/Supervisor ",
763
- "Cashier ",
764
- "Stock Clerk/Merchandiser ",
765
- "Supervisor ",
766
- "Supermarket/Retail Other ",
767
- "Loss Prevention Officer/Internal Security ",
768
- "Food Processing/Handling ",
769
- "Fitness Coach ",
770
- "Billiards Coach ",
771
- "Swimming Coach ",
772
- "Yoga Instructor ",
773
- "Dance Teacher ",
774
- "Sports and Fitness Other ",
775
- "Golf Assistant ",
776
- "Duty Manager ",
777
- "Public Area Manager ",
778
- "Front Office Staff ",
779
- "Front Office Manager ",
780
- "Receptionist ",
781
- "Front Desk Supervisor ",
782
- "Assistant Lobby Manager ",
783
- "Room Attendant ",
784
- "Housekeeping Manager ",
785
- "Guest Relations Officer ",
786
- "Switchboard Operator ",
787
- "Switchboard Manager ",
788
- "General Manager ",
789
- "Assistant to General Manager ",
790
- "Director of Rooms ",
791
- "Lifeguard ",
792
- "Floor Manager ",
793
- "Laundry Manager ",
794
- "Concierge Manager ",
795
- "Hotel Other ",
796
- "Hotel Store Manager ",
797
- "Reservation Agent ",
798
- "Reservation Manager ",
799
- "Personal Banking ",
800
- "Personal Banking Department Manager/Supervisor ",
801
- "Credit Review",
802
- "Credit Card/Bank Card Business ",
803
- "Credit Card Sales ",
804
- "Credit Management/Credit Assessment ",
805
- "Credit Management/Credit Assessment/Analysis ",
806
- "Corporate Business ",
807
- "Corporate Business Department Manager/Supervisor ",
808
- "Fund Project Manager ",
809
- "Foreign Exchange/Fund/Government Bond Manager ",
810
- "Foreign Exchange Trading ",
811
- "Investment/Financial Management Services ",
812
- "Investment/Financial Advisor ",
813
- "Investment Manager ",
814
- "Investment Banking ",
815
- "Investment Banking Financial Analysis ",
816
- "Guarantee/Auction/Pawn ",
817
- "Auctioneer ",
818
- "Clearing Staff ",
819
- "General Business Specialist/Assistant ",
820
- "Stock/Futures Trader ",
821
- "Stock Trader ",
822
- "Financing Specialist ",
823
- "Director of Financing ",
824
- "Financing Manager/Director ",
825
- "Securities/Investment Client Supervisor ",
826
- "Securities/Investment Client Director ",
827
- "Securities/Investment Client Manager ",
828
- "Securities/Futures/Forex Broker ",
829
- "Securities Analysis/Financial Research ",
830
- "Securities Manager/Director ",
831
- "Asset Valuation ",
832
- "Import/Export/Letter of Credit Settlement ",
833
- "Financial/Economic Researcher ",
834
- "Financial Product Manager ",
835
- "Financial Product Sales ",
836
- "Other Financial Investments ",
837
- "Financial Services Manager ",
838
- "Financial Leasing ",
839
- "Bank Accountant/Teller ",
840
- "Bank Manager/Director ",
841
- "Risk Management/Control ",
842
- "Senior Account Manager/Account Manager ",
843
- "Business Analysis Manager/Supervisor/Specialist ",
844
- "Business Development Manager/Supervisor ",
845
- "Membership Consultant ",
846
- "Regional Sales ",
847
- "Regional Sales Director ",
848
- "Regional Sales Manager/Supervisor ",
849
- "Medical Device Sales ",
850
- "Pharmaceutical Representative ",
851
- "Group Purchase Salesperson/Manager",
852
- "Key Account Manager ",
853
- "Client Representative ",
854
- "Client Director ",
855
- "Client Manager/Supervisor ",
856
- "Automobile Sales ",
857
- "Channel/Distribution Director ",
858
- "Channel/Distribution Manager/Supervisor ",
859
- "Channel Specialist ",
860
- "Channel Manager/Director ",
861
- "Telemarketing ",
862
- "Distributor ",
863
- "Online Sales ",
864
- "Sales Order Follow-up ",
865
- "Sales Representative ",
866
- "Other Sales Positions ",
867
- "Sales Assistant ",
868
- "Sales Trainer/Lecturer ",
869
- "Sales Director ",
870
- "Sales Support ",
871
- "Sales Data Analyst ",
872
- "Sales Manager/Supervisor ",
873
- "Sales Administration Specialist/Assistant ",
874
- "Sales Administration Manager/Supervisor ",
875
- "Sales Operations Manager/Supervisor ",
876
- "Northeast Cuisine Chef ",
877
- "Southeast Asian Cuisine Chef ",
878
- "Yunnan and Guizhou Cuisine Chef ",
879
- "Beijing and Shandong Cuisine Chef ",
880
- "Food Runner ",
881
- "Kitchen Worker ",
882
- "Chef/Head Chef ",
883
- "Chef Assistant/Apprentice ",
884
- "Back Kitchen ",
885
- "Barista ",
886
- "Sommelier ",
887
- "Mexican Cuisine Chef ",
888
- "Lobby Manager/Supervisor ",
889
- "Apprentice ",
890
- "Crayfish Chef ",
891
- "Sichuan and Hunan Cuisine Chef ",
892
- "Italian Cuisine Chef ",
893
- "Japanese Cuisine Chef ",
894
- "Waiter/Waitress ",
895
- "General Helper ",
896
- "Jiangsu and Zhejiang Cuisine Chef ",
897
- "French Cuisine Chef ",
898
- "Dishwasher ",
899
- "Hot Pot Seasoning Cook ",
900
- "Barbecue Chef ",
901
- "Cantonese and Hong Kong Cuisine Chef",
902
- "Tea Specialist ",
903
- "Nutritionist ",
904
- "Executive Chef ",
905
- "Pastry Decorator ",
906
- "Northwest Cuisine Chef ",
907
- "Pastry Chef ",
908
- "Spanish Cuisine Chef ",
909
- "Greeter/Receptionist ",
910
- "Food Delivery Person ",
911
- "Kitchen Assistant ",
912
- "Dim Sum Chef ",
913
- "Reservation Agent ",
914
- "Restaurant Server ",
915
- "Other Food and Beverage Roles ",
916
- "Food and Beverage Management ",
917
- "CEO/President/General Manager ",
918
- "Corporate Secretary/Board Secretary ",
919
- "Branch Manager ",
920
- "Vice President/Deputy General Manager ",
921
- "Chief Representative of Office ",
922
- "Partner ",
923
- "Factory Director/Deputy Factory Director ",
924
- "Director ",
925
- "President's Assistant/General Manager's Assistant ",
926
- "Investor Relations ",
927
- "Principal/Vice Principal ",
928
- "Department/Division Management ",
929
- "Chief Technology Officer (CTO) ",
930
- "Chief Financial Officer (CFO) ",
931
- "Chief Operating Officer (COO) ",
932
- "Other Senior Management Roles"
933
- ]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
generation_user_profile/code/data/occupations_english.json DELETED
@@ -1,42 +0,0 @@
1
- [
2
- "Software Engineer",
3
- "Doctor",
4
- "Teacher",
5
- "Lawyer",
6
- "Accountant",
7
- "Nurse",
8
- "Marketing Manager",
9
- "Chef",
10
- "Electrician",
11
- "Graphic Designer",
12
- "Financial Analyst",
13
- "Architect",
14
- "Journalist",
15
- "Pharmacist",
16
- "Police Officer",
17
- "Mechanical Engineer",
18
- "Dentist",
19
- "Sales Representative",
20
- "Psychologist",
21
- "Plumber",
22
- "Veterinarian",
23
- "Pilot",
24
- "Librarian",
25
- "Firefighter",
26
- "Web Developer",
27
- "Photographer",
28
- "Physical Therapist",
29
- "Carpenter",
30
- "Social Worker",
31
- "Electrician",
32
- "Fitness Trainer",
33
- "Interior Designer",
34
- "Translator",
35
- "Real Estate Agent",
36
- "Scientist",
37
- "Professor",
38
- "Artist",
39
- "Writer",
40
- "Musician",
41
- "Actor"
42
- ]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
generation_user_profile/code/output/new_user_profiles.json DELETED
@@ -1,39 +0,0 @@
1
- [
2
- {
3
- "Generated At": "2025-08-18 01:51:36",
4
- "Profile Index": 1,
5
- "Demographic Information": {
6
- "Age": "28 years old, young adult",
7
- "Gender": "Male",
8
- "Location": {
9
- "Country": "Canada",
10
- "City": "West Humber-Clairville"
11
- }
12
- },
13
- "Career and Work Identity": {
14
- "Occupation": "Pharmacist dedicated to patient-centered care",
15
- "Work Experience": "Internship in West Humber-Clairville pharmacy; focus on medication affordability and empathetic communication"
16
- },
17
- "Core Values, Beliefs, and Philosophy": {
18
- "Personal Values": "Lifelong learning and empathetic patient care",
19
- "Life Philosophy": "Growth through compassion and continuous self-improvement"
20
- },
21
- "Lifestyle and Daily Routine": {
22
- "Daily Habits": "Morning journaling and patient-focused learning",
23
- "Lifestyle Choices": "Balanced work hours with reflective downtime"
24
- },
25
- "Cultural and Social Context": {
26
- "Cultural Background": "Canadian multicultural, values inclusivity and empathy",
27
- "Social Connections": "Close-knit circle of thoughtful, like-minded professionals"
28
- },
29
- "Hobbies, Interests, and Lifestyle": {
30
- "Hobbies": "Reflective journaling, healthcare policy study",
31
- "Interests": "Exploring empathy's limits, analyzing healthcare access"
32
- },
33
- "Other Attributes": {
34
- "Personal Story": "From pharmacy intern to compassionate pharmacist, motivated by patient struggles and continuous learning",
35
- "Key Life Events": "Internship facing medication affordability at 24; patient-centered care course at 27"
36
- },
37
- "Summary": "I’m a 28-year-old pharmacist based in West Humber-Clairville, Canada, deeply committed to patient-centered care. My journey into pharmacy began with an internship in my local community, where I quickly became aware of the challenges many patients face, especially around medication affordability. This experience shaped my approach to healthcare, emphasizing empathy and understanding as much as clinical knowledge. I believe that true growth, both personally and professionally, comes from compassion and a dedication to continuous self-improvement.\n\nEvery day, I start with journaling, a practice that helps me reflect on my experiences and stay grounded in my values. I also dedicate time to learning—whether it’s about new medications, healthcare policies, or ways to better support my patients. Balancing focused work hours with moments of reflective downtime allows me to maintain both my effectiveness as a pharmacist and my own well-being.\n\nGrowing up in a multicultural Canadian environment, I’ve developed a strong appreciation for inclusivity and empathy. These values resonate through my close-knit circle of friends and colleagues, who are thoughtful professionals sharing similar commitments to healthcare and social equity. Outside of work, I’m passionate about exploring the boundaries of empathy and analyzing how healthcare access can be improved for vulnerable populations.\n\nOne of the pivotal moments in my career was completing a patient-centered care course at age 27, which deepened my understanding of how to truly listen and respond to patient needs. Looking back, my internship at 24 was a defining experience that ignited my motivation to advocate for patients and keep learning. Today, I see my role not just as dispensing medications but as a partner in my patients’ health journeys, striving to make a meaningful difference in their lives through compassionate care and informed support."
38
- }
39
- ]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
generation_user_profile/code/temp_input.json DELETED
@@ -1,17 +0,0 @@
1
- {
2
- "basic_info": {
3
- "age": 25,
4
- "gender": "male",
5
- "occupation": {
6
- "status": "Student"
7
- },
8
- "location": {
9
- "city": "Toronto",
10
- "country": "Canada"
11
- }
12
- },
13
- "custom_values": {
14
- "personal_values": "Integrity, responsibility, innovation, and collaboration. I believe in staying true to principles, taking accountability, continuously learning, and striving for excellence while valuing teamwork and shared growth",
15
- "life_attitude": "I am a positive and optimistic person who believes in the power of hard work and perseverance. I approach challenges with a growth mindset, seeing them as opportunities for learning and improvement. I am driven by a desire to make a meaningful impact and contribute to the betterment of society. I believe in the importance of balance and seek to maintain a healthy lifestyle while pursuing my goals."
16
- }
17
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
generation_user_profile/data/100.json DELETED
@@ -1,395 +0,0 @@
1
- {
2
- "Career and Work Identity": {
3
- "Business": {
4
- "Strategies": {}
5
- },
6
- "Client": {
7
- "UserPreferences": {},
8
- "UserProfileAttributes": {}
9
- },
10
- "Company": {
11
- "Industry": {},
12
- "RevenueMetrics": {},
13
- "Type": {}
14
- },
15
- "CompanyCulture": {
16
- "Type": {}
17
- },
18
- "Experience": {
19
- "Attributes": {},
20
- "Salesforce": {}
21
- },
22
- "Goals": {
23
- "FinancialAttributes": {},
24
- "GoalsAndAspirations": {}
25
- },
26
- "Industry": {
27
- "Expertise": {},
28
- "TechProficiency": {}
29
- },
30
- "JobRole": {
31
- "LocationPreferences": {},
32
- "Responsibilities": {}
33
- },
34
- "Occupation": {
35
- "Service": {}
36
- },
37
- "Organization": {
38
- "Category": {},
39
- "Guidelines": {},
40
- "Preferences": {}
41
- },
42
- "PersonalGoals": {
43
- "Goals": {},
44
- "Meetings": {}
45
- },
46
- "PreviousExperience": {
47
- "UserLevel": {}
48
- },
49
- "Profession": {
50
- "PersonalBackgroundAttributes": {},
51
- "ProfessionalAttributes": {},
52
- "UserProfileAttributes": {}
53
- },
54
- "ProfessionalField": {
55
- "Experience": {},
56
- "Industry": {},
57
- "Role": {}
58
- },
59
- "Role": {
60
- "Background": {},
61
- "CommunicationStyle": {},
62
- "Contract": {},
63
- "Industry": {},
64
- "positionTitle": {}
65
- },
66
- "Skills": {
67
- "TechnicalAttributes": {},
68
- "UserProfileAttributes": {}
69
- },
70
- "Team": {
71
- "dynamics": {}
72
- },
73
- "Technology": {
74
- "Type": {}
75
- },
76
- "User": {
77
- "BusinessContext": {},
78
- "CampaignAttributes": {},
79
- "UserAttributes": {}
80
- },
81
- "WorkEnvironment": {
82
- "ContentOrganization": {},
83
- "UserPreferences": {}
84
- }
85
- },
86
- "Core Values, Beliefs, and Philosophy": {
87
- "Personal": {
88
- "ForgivenessLevel": {},
89
- "PersonalAttributes": {}
90
- },
91
- "Philosophical Beliefs": {
92
- "AnimalConsumption": {}
93
- },
94
- "PoliticalIdeology": {
95
- "Views": {}
96
- },
97
- "Spirituality": {
98
- "Personal Development": {}
99
- },
100
- "Sustainability": {
101
- "Attachment": {}
102
- }
103
- },
104
- "Cultural and Social Context": {
105
- "Attitudes": {
106
- "TowardsDrugs": {}
107
- },
108
- "Audience": {
109
- "InvestorType": {}
110
- },
111
- "Communication": {
112
- "Style": {}
113
- },
114
- "Community": {
115
- "UserCharacteristics": {}
116
- },
117
- "CompanyCulture": {
118
- "Culture": {}
119
- },
120
- "Culture": {
121
- "PersonalAttributes": {},
122
- "PersonalInterests": {}
123
- },
124
- "DataProcessing": {
125
- "Nature": {}
126
- },
127
- "Exposure": {
128
- "HistoricalTopics": {}
129
- },
130
- "Family": {
131
- "size": {}
132
- },
133
- "Historical": {
134
- "Background": {}
135
- },
136
- "Knowledge": {
137
- "AboutRefugeeIssues": {}
138
- },
139
- "Leadership": {
140
- "Style": {}
141
- },
142
- "LocalEvents": {
143
- "Attendance": {}
144
- },
145
- "LocalLaws": {
146
- "RhodeIsland": {}
147
- },
148
- "Political": {
149
- "Views": {}
150
- },
151
- "Preferences": {
152
- "ChildrenPreferences": {},
153
- "PersonalPreferences": {}
154
- },
155
- "Priorities": {
156
- "TravelGoals": {}
157
- },
158
- "Region": {
159
- "Residence": {}
160
- },
161
- "School": {
162
- "Environment": {}
163
- },
164
- "SocialActivities": {
165
- "NightlifeExperience": {}
166
- },
167
- "SocialStigma": {
168
- "Menstruation": {}
169
- },
170
- "SubstanceUse": {
171
- "DrugAwareness": {}
172
- },
173
- "SupportSystems": {
174
- "Availability": {}
175
- }
176
- },
177
- "Demographic Information": {
178
- "Demographics": {
179
- "Age": {},
180
- "CurrentLocation": {},
181
- "Education": {},
182
- "General": {},
183
- "Identity": {},
184
- "Origin": {},
185
- "Region": {},
186
- "TargetAudience": {}
187
- },
188
- "Family": {
189
- "FamilyDynamics": {},
190
- "PersonalAttributes": {},
191
- "PersonalDemographics": {}
192
- },
193
- "Lifestyle": {
194
- "budget": {}
195
- },
196
- "Professional": {
197
- "Demographic": {},
198
- "Professional Background": {}
199
- },
200
- "Socioeconomic": {
201
- "UserProfile": {}
202
- }
203
- },
204
- "Education and Learning": {
205
- "AcademicProfile": {
206
- "EducationLevel": {},
207
- "EducationalBackground": {}
208
- },
209
- "EducationalInstitution": {
210
- "Name": {}
211
- },
212
- "KnowledgeFamiliarity": {
213
- "DifficultyLevel": {},
214
- "MedicalTerminology": {}
215
- },
216
- "LearningPlatform": {
217
- "Focus": {}
218
- },
219
- "PersonalAttributes": {
220
- "FitnessPreferences": {},
221
- "UserPreferences": {}
222
- },
223
- "PersonalExperience": {
224
- "WorkingWithRefugees": {}
225
- },
226
- "SubjectExpertise": {
227
- "FocusArea": {}
228
- },
229
- "SubjectInterest": {
230
- "User_Personalization": {}
231
- },
232
- "UnderstandingLevel": {
233
- "Achievement": {},
234
- "Creative_Education": {},
235
- "Science_Education": {},
236
- "Status": {}
237
- }
238
- },
239
- "Emotional and Relational Skills": {
240
- "Emotional Attributes": {
241
- "EmotionalSupportNeeds": {}
242
- },
243
- "Environmental Attributes": {
244
- "emotionalConnection": {}
245
- },
246
- "Personal Attributes": {
247
- "Beliefs": {},
248
- "Preferences": {}
249
- },
250
- "Work Attributes": {
251
- "Drivers": {}
252
- }
253
- },
254
- "Hobbies, Interests, and Lifestyle": {
255
- "Education": {
256
- "Interests": {}
257
- },
258
- "FoodPreferences": {
259
- "Dietary Preference": {},
260
- "Food Preference": {}
261
- },
262
- "Hobbies": {
263
- "design": {},
264
- "types": {}
265
- },
266
- "Interests": {
267
- "ConsumerPreferences": {},
268
- "CulturalInterest": {},
269
- "UserPreferences": {}
270
- },
271
- "LifestylePreferences": {
272
- "UserAttributes": {}
273
- },
274
- "Professional": {
275
- "Interests": {}
276
- },
277
- "WorkRelatedInterests": {
278
- "FinancialManagement": {},
279
- "InvestmentPreferences": {}
280
- },
281
- "contentType": {
282
- "AdCampaigns": {}
283
- }
284
- },
285
- "Lifestyle and Daily Routine": {
286
- "Dietary Preferences": {
287
- "DailyContext": {},
288
- "FamilyContext": {},
289
- "HealthConsiderations": {},
290
- "Preferences": {}
291
- },
292
- "Living Conditions": {
293
- "BuyingIntention": {}
294
- },
295
- "Personal Lifestyle": {
296
- "Preferences": {}
297
- }
298
- },
299
- "Media Consumption and Engagement": {
300
- "PersonalizationAttributes": {
301
- "UserPreferences": {}
302
- }
303
- },
304
- "Physical and Health Characteristics": {
305
- "EnvironmentalFactors": {
306
- "SoilType": {}
307
- },
308
- "GeneticHistory": {
309
- "GeneticDisorders": {}
310
- },
311
- "HealthObjectives": {
312
- "CardiovascularWellness": {}
313
- },
314
- "MedicalHistory": {
315
- "General": {}
316
- },
317
- "PersonalHealthAttributes": {
318
- "DietaryPreferences": {},
319
- "General": {},
320
- "HealthConditions": {}
321
- }
322
- },
323
- "Psychological and Cognitive Aspects": {
324
- "BehavioralAttributes": {
325
- "AlcoholConsumptionHistory": {}
326
- },
327
- "CognitiveAttributes": {
328
- "CognitiveAttributes": {},
329
- "DevelopmentalAttributes": {},
330
- "EmotionalAttributes": {},
331
- "PreferenceAttributes": {}
332
- },
333
- "CopingMechanisms": {
334
- "PersonalHistory": {}
335
- },
336
- "EmotionalAttributes": {
337
- "PersonalAttributes": {},
338
- "PsychologicalFactors": {}
339
- },
340
- "MentalAttributes": {
341
- "CognitiveAttributes": {},
342
- "UserPreferences": {}
343
- },
344
- "Past": {
345
- "IndividualCharacteristics": {}
346
- },
347
- "PersonalityAttributes": {
348
- "Style": {}
349
- },
350
- "User": {
351
- "EmotionalState": {}
352
- }
353
- },
354
- "Relationships and Social Networks": {
355
- "CustomerRelations": {
356
- "UserEngagement": {},
357
- "UserProfile": {}
358
- },
359
- "FamilyRelations": {
360
- "CurrentLocation": {},
361
- "CurrentState": {},
362
- "FamilyDynamics": {},
363
- "FamilyMaritalStatus": {},
364
- "RelationshipDetails": {}
365
- },
366
- "PersonalPreferences": {
367
- "Companions": {}
368
- },
369
- "PersonalRelationships": {
370
- "Availability": {},
371
- "Context": {},
372
- "SocialConnections": {},
373
- "SocialInfluence": {},
374
- "UniversityAffiliation": {}
375
- },
376
- "ProfessionalRelations": {
377
- "PersonalAttributes": {}
378
- },
379
- "ProfessionalRelationships": {
380
- "Colleagues": {},
381
- "Connections": {},
382
- "Duration": {},
383
- "HeadOfSalesRelationship": {},
384
- "Interests": {},
385
- "Preferences": {},
386
- "Relationship": {},
387
- "RelationshipQuality": {},
388
- "Role": {},
389
- "ZichengExperience": {}
390
- },
391
- "UserAttributes": {
392
- "FatherRelationship": {}
393
- }
394
- }
395
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
generation_user_profile/data/attribute_embeddings.pkl DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:664f3d1f49a5a3162108da60e4340411f01fdf58a38419387ddb1cdd0ee61481
3
- size 28364886
 
 
 
 
generation_user_profile/data/attributes_merged.json DELETED
The diff for this file is too large to render. See raw diff
 
generation_user_profile/data/large_attributes.json DELETED
The diff for this file is too large to render. See raw diff
 
generation_user_profile/output/selected_paths.json DELETED
@@ -1,898 +0,0 @@
1
- {
2
- "Demographic Information": {
3
- "Age": {
4
- "General": {},
5
- "Youth": {},
6
- "LifeStage": {},
7
- "SpecificAge": {},
8
- "MiddleAged": {},
9
- "Group": {},
10
- "GroupCategory": {},
11
- "SuitableContent": {}
12
- },
13
- "Background": {
14
- "Cultural Background": {}
15
- },
16
- "Personal": {
17
- "Interests": {}
18
- },
19
- "Travel Preferences": {
20
- "Frequent Traveler": {}
21
- },
22
- "birth_date": {
23
- "specific_date": {}
24
- },
25
- "Life Stage": {
26
- "Maturity Level": {}
27
- },
28
- "Family": {
29
- "Household Composition": {},
30
- "Role Information": {}
31
- },
32
- "Community": {
33
- "Engagement": {}
34
- },
35
- "Information": {
36
- "Age": {}
37
- },
38
- "Education": {
39
- "Proficiency": {}
40
- },
41
- "Race": {
42
- "Ethnicity": {}
43
- },
44
- "income": {
45
- "level": {}
46
- },
47
- "Economic Status": {
48
- "Budget": {}
49
- },
50
- "Gender": {
51
- "Identity": {},
52
- "Preferences": {},
53
- "Demographics": {}
54
- },
55
- "RelocationWillingness": {}
56
- },
57
- "Hobbies, Interests, and Lifestyle": {
58
- "Interests": {
59
- "Movies": {},
60
- "Cooking": {},
61
- "Design": {},
62
- "LanguageLearning": {
63
- "knowledge": {}
64
- },
65
- "Lifestyle": {},
66
- "Sustainability": {},
67
- "PhilosophyTopics": {},
68
- "Scenarios": {},
69
- "Culture": {},
70
- "UniqueExperiences": {},
71
- "Gardening": {},
72
- "Sports": {},
73
- "Wellness": {
74
- "practices": {}
75
- },
76
- "Food": {
77
- "preparation": {}
78
- },
79
- "SelfImprovement": {},
80
- "Groups": {},
81
- "Storytelling": {},
82
- "Seasons": {},
83
- "SocialContributions": {},
84
- "HistoricalThemes": {},
85
- "Nature": {},
86
- "MusicGenres": {
87
- "musical_involvement": {
88
- "bass": {}
89
- }
90
- },
91
- "Innovation": {},
92
- "Advocacy": {},
93
- "PhilosophicalFields": {},
94
- "Science": {},
95
- "GameDevelopment": {},
96
- "Reading": {},
97
- "Literature": {},
98
- "Film": {}
99
- },
100
- "Photography": {
101
- "User Preferences": {}
102
- },
103
- "Communication": {
104
- "UserStyle": {
105
- "preference": {}
106
- }
107
- },
108
- "Events": {
109
- "UserParticipationInterest": {}
110
- },
111
- "Spirituality": {
112
- "personal_interest": {}
113
- },
114
- "Gardening": {
115
- "UserExperience": {}
116
- },
117
- "Travel Interests": {
118
- "Membership Preferences": {},
119
- "Destination Preferences": {}
120
- },
121
- "Creative Interests": {
122
- "ProfessionalArea": {},
123
- "CognitiveTools": {}
124
- },
125
- "Art Interests": {
126
- "UserPreferences": {}
127
- },
128
- "Culinary Preferences": {
129
- "culinaryPreferences": {}
130
- },
131
- "Business Interests": {
132
- "UserInterests": {}
133
- },
134
- "Children": {
135
- "Relevance": {},
136
- "Approaches": {}
137
- },
138
- "Projects": {
139
- "DroneTechnology": {}
140
- },
141
- "Dietary Preferences": {
142
- "User Interests": {}
143
- },
144
- "Outdoor Activities": {
145
- "Camping": {}
146
- },
147
- "Entrepreneurial Interests": {
148
- "Business_Strategy": {}
149
- },
150
- "Gaming": {
151
- "UserInterest": {}
152
- },
153
- "Vehicles": {
154
- "User Preferences": {}
155
- },
156
- "Travel Preferences": {
157
- "Geographic Interests": {}
158
- },
159
- "User Interests": {
160
- "personal_preferences": {}
161
- },
162
- "Hobbies": {
163
- "interests": {}
164
- },
165
- "Writing": {
166
- "experience_level": {}
167
- },
168
- "Entertainment Interests": {
169
- "Industry": {}
170
- },
171
- "Goals": {
172
- "Physical_Activity": {}
173
- },
174
- "Preferences": {
175
- "activities": {}
176
- },
177
- "Financial Interests": {
178
- "investment_goals": {}
179
- },
180
- "Professional Interests": {
181
- "General Interests": {}
182
- },
183
- "Academic Interests": {
184
- "Personal Interests": {}
185
- }
186
- },
187
- "Education and Learning": {
188
- "background": {
189
- "Finance Skills": {},
190
- "Prior Experience": {}
191
- },
192
- "FocusArea": {
193
- "Domain": {},
194
- "Leadership": {}
195
- },
196
- "learningApproach": {
197
- "ContinuousIntegration": {}
198
- },
199
- "programmingSkills": {
200
- "ExpertiseLevel": {}
201
- },
202
- "interests": {
203
- "Preferences": {},
204
- "Hobbies & Interests": {},
205
- "Professional Interests": {}
206
- },
207
- "language_proficiency": {
208
- "LearningAttributes": {}
209
- },
210
- "FieldOfStudy": {
211
- "interests": {}
212
- },
213
- "highestLevel": {
214
- "Higher Education": {}
215
- },
216
- "preferences": {
217
- "Content Presentation": {}
218
- },
219
- "familiarity": {
220
- "ExperienceLevel": {}
221
- },
222
- "competency": {
223
- "Cognitive and Productivity Skills": {}
224
- },
225
- "personalDevelopment": {
226
- "Interests": {}
227
- },
228
- "experience_level": {
229
- "AI": {}
230
- },
231
- "subject_area": {
232
- "interests": {}
233
- },
234
- "specific_interests": {},
235
- "academic_background": {
236
- "CreativeWorks": {}
237
- },
238
- "degree": {
239
- "Specialization": {},
240
- "field_of_study": {}
241
- },
242
- "academicFocus": {
243
- "Interests": {}
244
- },
245
- "motivation": {
246
- "educational_experience": {}
247
- },
248
- "research": {
249
- "Interests": {}
250
- },
251
- "skillLevel": {
252
- "Diversity of Skills": {},
253
- "Analytical Skills": {}
254
- },
255
- "level_of_expertise": {
256
- "technology": {}
257
- },
258
- "subject_matter": {
259
- "Topic": {}
260
- },
261
- "knowledgeArea": {
262
- "Personal Interests": {}
263
- },
264
- "academic_achievements": {
265
- "education": {}
266
- },
267
- "writingSkills": {
268
- "Level": {}
269
- }
270
- },
271
- "Physical and Health Characteristics": {
272
- "Health Profile": {
273
- "Vitamin Levels": {}
274
- },
275
- "weight": {
276
- "personal_targets": {}
277
- },
278
- "Beliefs": {
279
- "Philosophy": {},
280
- "AttitudesTowardsDrugs": {}
281
- },
282
- "Dietary Preferences": {
283
- "ProteinIntakeGoals": {},
284
- "Allergies": {}
285
- },
286
- "Thinking Patterns": {
287
- "Goal-Oriented": {}
288
- },
289
- "Oral Health": {
290
- "SpecificDentalCondition": {}
291
- },
292
- "Personal Health Factors": {
293
- "Alcohol Use History": {}
294
- },
295
- "Dietary": {
296
- "UserPreferences": {}
297
- },
298
- "Cognitive Style": {
299
- "Reflective Development": {}
300
- },
301
- "Health Goals": {
302
- "health_improvement": {}
303
- },
304
- "HealthHistory": {
305
- "Conditions": {}
306
- },
307
- "Neurodiversity": {
308
- "Dyslexia": {}
309
- },
310
- "Metabolism": {
311
- "Basal Metabolic Rate": {}
312
- },
313
- "Health Conditions": {
314
- "Neurodevelopmental Conditions": {}
315
- },
316
- "Medical History": {
317
- "Allergy_Management": {}
318
- },
319
- "General Health": {
320
- "Wellbeing": {}
321
- },
322
- "neurodiversity": {
323
- "add-inattentive": {}
324
- },
325
- "Body": {
326
- "Body Type": {
327
- "Normal": {}
328
- }
329
- },
330
- "Skin": {
331
- "UserPreferences": {},
332
- "SkinType": {}
333
- },
334
- "Fitness Level": {
335
- "Current Status": {}
336
- }
337
- },
338
- "Media Consumption and Engagement": {
339
- "Books": {
340
- "ContentPreferences": {},
341
- "UserPreferences": {}
342
- },
343
- "reddit": {
344
- "user_attributes": {}
345
- },
346
- "Preferences": {
347
- "User Engagement": {},
348
- "User Preferences": {}
349
- },
350
- "Music": {
351
- "AnalysisDepth": {},
352
- "ListeningPreferences": {}
353
- },
354
- "SocialMedia": {
355
- "User Preferences": {
356
- "use": {}
357
- },
358
- "User Engagement": {}
359
- },
360
- "PlatformPreference": {
361
- "User Type": {}
362
- },
363
- "Celebrities": {
364
- "FavoriteCelebrities": {}
365
- },
366
- "digital_tool_usage": {
367
- "familiarity_with_automation_tools": {}
368
- },
369
- "QuestionStyle": {},
370
- "Literature": {
371
- "SciFiGenres": {}
372
- },
373
- "content_engagement": {
374
- "personal_beliefs": {}
375
- },
376
- "preferred_channels": {
377
- "communication_channels": {}
378
- },
379
- "story_prefs": {
380
- "genres": {}
381
- },
382
- "FavoriteAuthors": {
383
- "Historical": {}
384
- },
385
- "Preferred Platforms": {
386
- "Libraries": {}
387
- },
388
- "Artistic": {
389
- "Interests": {}
390
- },
391
- "news": {
392
- "preferred_sources": {}
393
- },
394
- "Genre": {
395
- "Interactive Storytelling": {}
396
- },
397
- "Engagement": {
398
- "User Level": {},
399
- "User Technical Proficiency": {}
400
- },
401
- "Preferred Sources": {
402
- "Financial Information Sources": {}
403
- },
404
- "Gaming": {
405
- "UsagePreferences": {}
406
- },
407
- "SpaceRelatedMedia": {},
408
- "RecipeSources": {
409
- "OnlineBlogs": {}
410
- },
411
- "sciFiThemes": {},
412
- "streaming_service": {
413
- "preferences": {}
414
- },
415
- "ArtisticInspirations": {},
416
- "meme": {
417
- "knowledge": {}
418
- },
419
- "Language": {
420
- "LanguageAttributes": {}
421
- }
422
- },
423
- "Psychological and Cognitive Aspects": {
424
- "Mindset": {
425
- "UserPreferences": {}
426
- },
427
- "Shame": {
428
- "triggers": {}
429
- },
430
- "Innovation": {
431
- "Openness": {}
432
- },
433
- "Openness": {
434
- "Educational Background": {},
435
- "Interest in Technology": {}
436
- },
437
- "Thinking Style": {
438
- "personality_traits": {}
439
- },
440
- "Risk Tolerance": {
441
- "Proficiency": {},
442
- "General": {}
443
- },
444
- "Pattern Recognition": {
445
- "ability": {}
446
- },
447
- "Thinking Patterns": {
448
- "cognitiveProcess": {}
449
- },
450
- "Engagement": {},
451
- "Challenges": {
452
- "CognitiveAbilities": {}
453
- },
454
- "Personality": {
455
- "Perfectionism": {},
456
- "Introversion": {},
457
- "PersonalityResults": {},
458
- "AdventureSeeking": {},
459
- "Empathy": {},
460
- "Preference": {}
461
- },
462
- "Perspective": {
463
- "PersonalAttributes": {}
464
- },
465
- "Personality Traits": {
466
- "Interpersonal Dynamics": {}
467
- },
468
- "Needs": {
469
- "reliability": {}
470
- },
471
- "Response": {
472
- "ToAnger": {}
473
- },
474
- "Tone Preference": {},
475
- "Motivation": {
476
- "Wellness": {},
477
- "Learning": {},
478
- "Goals": {}
479
- },
480
- "Anxiety": {
481
- "Level": {}
482
- },
483
- "Resilience": {
484
- "PersonalExperience": {}
485
- },
486
- "Personal Insight": {
487
- "Level of Self-Awareness": {}
488
- },
489
- "Stress Management": {
490
- "WorkLifeAttributes": {}
491
- },
492
- "Problem Solving": {
493
- "analyticalSkills": {}
494
- },
495
- "Favorite Genres": {
496
- "Gaming": {}
497
- },
498
- "Perfectionism": {
499
- "education_level": {}
500
- },
501
- "Mindfulness": {
502
- "Personal Development": {}
503
- },
504
- "Curiosity": {
505
- "IntellectualEngagement": {}
506
- },
507
- "User Interaction": {
508
- "PreferredEngagementStyle": {}
509
- },
510
- "Math Skills": {
511
- "proficiency_level": {}
512
- },
513
- "Productivity": {
514
- "SkillLevel": {}
515
- },
516
- "Language Complexity": {
517
- "Preference": {}
518
- },
519
- "Behavioral Patterns": {
520
- "Personal Traits": {}
521
- },
522
- "Mental Well-being": {
523
- "Stable": {}
524
- },
525
- "Emotional": {
526
- "EmotionalAttributes": {}
527
- },
528
- "Political Views": {
529
- "orientation": {}
530
- },
531
- "Goals": {
532
- "Long-Term Strategy": {}
533
- },
534
- "Creativity": {
535
- "PersonalStyle": {}
536
- }
537
- },
538
- "Core Values, Beliefs, and Philosophy": {
539
- "PersonalGrowth": {
540
- "Resilience": {},
541
- "PersonalBackground": {},
542
- "Orientation": {}
543
- },
544
- "Beliefs": {
545
- "Philosophy": {},
546
- "Social Values": {}
547
- },
548
- "Wellness": {
549
- "Approach_and_Attitudes": {}
550
- },
551
- "Travel_values": {
552
- "authentic_culture": {}
553
- },
554
- "Lifestyle": {
555
- "PersonalValues": {}
556
- },
557
- "learning_attitude": {
558
- "openness": {}
559
- },
560
- "Philosophy": {
561
- "generalAttributes": {}
562
- },
563
- "Values": {
564
- "Discipline": {},
565
- "Growth_Mindset": {},
566
- "Education": {},
567
- "Work_Ethic": {}
568
- },
569
- "Interests": {
570
- "EthicalViews": {}
571
- },
572
- "Goals": {
573
- "Career Goals": {}
574
- },
575
- "Morality": {
576
- "relationship_preferences": {}
577
- },
578
- "Cultural": {
579
- "Cultural Awareness": {}
580
- },
581
- "Life_perspective": {
582
- "worldview": {}
583
- },
584
- "WorkEthic": {
585
- "Values": {}
586
- },
587
- "EnvironmentalConcerns": {
588
- "Sustainability Advocate": {}
589
- },
590
- "Ethics": {
591
- "Dietary_Preferences": {}
592
- },
593
- "Educational_goals": {
594
- "TemporalPerspective": {}
595
- }
596
- },
597
- "Lifestyle and Daily Routine": {
598
- "Daily Routine": {
599
- "ShoppingHabits": {},
600
- "TravelPreferences": {}
601
- },
602
- "Travel": {
603
- "Experience": {}
604
- },
605
- "Location": {
606
- "Community": {}
607
- },
608
- "Dietary Preferences": {
609
- "dietaryConsiderations": {}
610
- },
611
- "Cooking": {
612
- "SkillLevel": {},
613
- "TimeAvailability": {}
614
- },
615
- "Time Management": {
616
- "QualityOfLife": {}
617
- },
618
- "Stress Management": {
619
- "general": {}
620
- },
621
- "Shopping": {
622
- "OnlineBehavior": {},
623
- "ShoppingBehavior": {}
624
- },
625
- "Activities": {
626
- "Family Structure": {}
627
- },
628
- "Travel Preferences": {
629
- "User Preferences": {}
630
- },
631
- "Sports": {
632
- "endurance_sports": {}
633
- },
634
- "Wellness": {
635
- "Personalized Routine": {}
636
- },
637
- "Leisure Activities": {
638
- "Personal Preferences": {}
639
- },
640
- "Learning": {
641
- "personal_dedication": {}
642
- },
643
- "Work Schedule": {
644
- "attribute": {}
645
- },
646
- "Home Setup": {
647
- "UserPreferences": {}
648
- },
649
- "Retirement": {
650
- "Age": {}
651
- },
652
- "Sleep": {
653
- "environment": {}
654
- },
655
- "Pet Ownership": {
656
- "PersonalizationAttribute": {}
657
- }
658
- },
659
- "Cultural and Social Context": {
660
- "Linguistic": {
661
- "Style": {}
662
- },
663
- "Cultural": {
664
- "Mental Health Advocate": {}
665
- },
666
- "Community": {
667
- "Volunteer Activities": {},
668
- "Involvement": {},
669
- "Impact": {}
670
- },
671
- "Food Preferences": {
672
- "FoodPreferences": {},
673
- "Restrictions": {}
674
- },
675
- "Personal Attitudes": {
676
- "Recovery Orientation": {}
677
- },
678
- "Social": {
679
- "Personal Identity": {}
680
- },
681
- "PersonalContext": {
682
- "GeographicBackground": {}
683
- },
684
- "Personal Customs": {
685
- "Traditional Practices": {}
686
- },
687
- "Communication": {
688
- "CommunicationNorms": {}
689
- },
690
- "Life Stage": {
691
- "Teenager": {}
692
- },
693
- "Company Culture": {
694
- "Adaptability": {}
695
- },
696
- "Theme": {
697
- "Social Context": {}
698
- },
699
- "Personal Culture": {
700
- "Values": {}
701
- },
702
- "Financial Behavior": {
703
- "Risk Tolerance": {}
704
- },
705
- "Life Experiences": {
706
- "Variety": {}
707
- },
708
- "Religion": {
709
- "ReligiousEngagement": {},
710
- "Religion": {},
711
- "ReligiousType": {}
712
- },
713
- "Personal Interests": {
714
- "Academic Interests": {}
715
- },
716
- "cultural": {
717
- "personal_information": {}
718
- },
719
- "Language": {
720
- "Proficiency": {}
721
- },
722
- "Personal Values": {
723
- "Privacy Orientation": {},
724
- "Inclusivity Focus": {}
725
- },
726
- "Group Involvement": {
727
- "Participation Level": {}
728
- },
729
- "Social Habits": {
730
- "Coffee Culture Enthusiast": {}
731
- },
732
- "Personal Life": {
733
- "Interaction Style": {}
734
- },
735
- "affiliation": {
736
- "religious": {}
737
- },
738
- "DietaryPreferences": {
739
- "personal_preferences": {}
740
- },
741
- "Beliefs": {
742
- "Lifestyle_Attitudes": {},
743
- "Personal_Interests": {}
744
- },
745
- "Preference": {
746
- "Language Preferences": {}
747
- },
748
- "Values": {
749
- "EthicalValues": {}
750
- },
751
- "Health Perspectives": {
752
- "Aging Attitudes": {}
753
- },
754
- "Financial Preference": {
755
- "Budget Conscious": {}
756
- },
757
- "Health Practices": {
758
- "Traditional Approaches": {}
759
- }
760
- },
761
- "Core Values and Beliefs": {
762
- "Wellness": {
763
- "Health Prioritization": {}
764
- },
765
- "Goals": {
766
- "Priorities": {}
767
- },
768
- "Identity": {
769
- "CulturalAffiliation": {}
770
- },
771
- "Personal Philosophy": {
772
- "Preferences": {},
773
- "Opinions": {}
774
- }
775
- },
776
- "Relationships and Social Networks": {
777
- "Goals": {
778
- "RelationshipMotivation": {}
779
- },
780
- "Personal Ties": {
781
- "ProfessionalConnections": {}
782
- },
783
- "Networking": {
784
- "Approach": {}
785
- },
786
- "Family": {
787
- "Relationship with Mother": {},
788
- "Family Dynamics": {},
789
- "Relationship Quality": {},
790
- "Support System": {},
791
- "Sibling": {},
792
- "Mother's Personality": {},
793
- "Grandparents": {},
794
- "Family Relationships": {}
795
- },
796
- "Family Role": {
797
- "children": {}
798
- },
799
- "Parental Relationships": {
800
- "dynamics": {}
801
- },
802
- "Social Skills": {
803
- "Social Reach": {}
804
- },
805
- "Professional": {
806
- "Community_Involvement": {},
807
- "Knowledge_Experience": {}
808
- },
809
- "Professional Skills": {
810
- "Networking": {},
811
- "Entrepreneurship": {}
812
- },
813
- "Social Role": {
814
- "Mentorship_Role": {},
815
- "Youth_Engagement": {},
816
- "Impact": {},
817
- "Family_Role": {}
818
- },
819
- "Interactions": {
820
- "User Intent": {}
821
- },
822
- "Connections": {
823
- "Personal Network": {}
824
- },
825
- "Peers": {
826
- "Dynamics": {}
827
- },
828
- "Social": {
829
- "Personalization Level": {}
830
- },
831
- "Relationship": {
832
- "Family_Context": {}
833
- }
834
- },
835
- "Emotional and Relational Skills": {
836
- "Engagement": {
837
- "Motivation": {}
838
- },
839
- "CommunicationSkills": {
840
- "EmotionalAttributes": {},
841
- "CommunicationStyle": {}
842
- },
843
- "SelfAwareness": {
844
- "Personal Growth Techniques": {}
845
- },
846
- "Personality": {
847
- "Empathy": {}
848
- },
849
- "OpenMindedness": {
850
- "ReceptivityToInnovation": {}
851
- },
852
- "Patience": {
853
- "level": {}
854
- },
855
- "Resilience": {
856
- "Journey": {}
857
- },
858
- "WorkLifeBalance": {
859
- "Preferences": {}
860
- },
861
- "Romantic": {
862
- "RelationshipBuilding": {}
863
- },
864
- "EmotionalIntelligence": {
865
- "Emotional_Sensitivity": {}
866
- }
867
- },
868
- "Psychological and Cognitive": {
869
- "User Characteristics": {
870
- "Personal Characteristics": {}
871
- }
872
- },
873
- "Lifestyle and Habits": {
874
- "Daily Routine": {
875
- "Home Usage Frequency": {}
876
- }
877
- },
878
- "Core Values, Beliefs, Philosophy": {
879
- "Worldview": {
880
- "Nationalistic Views": {}
881
- }
882
- },
883
- "Core Values and Philosophy": {
884
- "Beliefs": {
885
- "Outcome-Oriented": {}
886
- }
887
- },
888
- "Lifestyle and Routine": {
889
- "Personal Habits": {
890
- "User Personalization Attributes": {}
891
- }
892
- },
893
- "Cultural and Social Contexts": {
894
- "Community": {
895
- "Engagement Level": {}
896
- }
897
- }
898
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
generation_user_profile/output/user_profile.json DELETED
@@ -1,383 +0,0 @@
1
- {
2
- "basic_info": {
3
- "age": 45,
4
- "gender": "male",
5
- "occupation": {
6
- "status": "engineer"
7
- },
8
- "location": {
9
- "city": "Shanghai",
10
- "country": "China"
11
- }
12
- },
13
- "values_orientation": "Pragmatism over ideals, self-protection, and low expectations. I don’t believe people always act in good faith, so I value caution more than trust.",
14
- "life_attitude": {
15
- "outlook": "Life is mostly about enduring rather than enjoying. I take each day as it comes, without too much hope or illusion, just trying to get through with as little disappointment as possible.",
16
- "coping_mechanism": "Custom life attitude provided by user"
17
- },
18
- "personal_story": {
19
- "personal_story": "Story 1: At 30, while leading a project in a multinational firm in Shanghai, he discovered a colleague manipulating technical reports to secure a contract. Instead of confronting the issue openly, he chose to document everything quietly and protect himself, fearing backlash. This experience reinforced his belief that people do not always act in good faith and shaped his pragmatic approach to work and relationships. Later, at 42, after a significant project failure due to overreliance on idealistic teamwork without safeguards, he adopted a cautious stance, setting low expectations to avoid disappointment. These incidents cultivated his preference for pragmatism over ideals and a cautious, self-protective life attitude.",
20
- "key_life_events": [
21
- "Story 1: Discovered colleague's manipulation of reports at age 30",
22
- "Story 1: Project failure due to idealistic teamwork at age 42"
23
- ]
24
- },
25
- "interests_and_hobbies": {
26
- "interests": [
27
- "analytical report writing",
28
- "strategic risk assessment"
29
- ]
30
- },
31
- "selected_attributes": [
32
- "Demographic Information.Age.General",
33
- "Hobbies, Interests, and Lifestyle.Interests.Movies",
34
- "Hobbies, Interests, and Lifestyle.Interests.Cooking",
35
- "Education and Learning.background.Finance Skills",
36
- "Physical and Health Characteristics.Health Profile.Vitamin Levels",
37
- "Media Consumption and Engagement.Books.ContentPreferences",
38
- "Psychological and Cognitive Aspects.Mindset.UserPreferences",
39
- "Psychological and Cognitive Aspects.Shame.triggers",
40
- "Core Values, Beliefs, and Philosophy.PersonalGrowth.Resilience",
41
- "Lifestyle and Daily Routine.Daily Routine.ShoppingHabits",
42
- "Hobbies, Interests, and Lifestyle.Photography.User Preferences",
43
- "Cultural and Social Context.Linguistic.Style",
44
- "Hobbies, Interests, and Lifestyle.Communication.UserStyle.preference",
45
- "Demographic Information.Background.Cultural Background",
46
- "Psychological and Cognitive Aspects.Innovation.Openness",
47
- "Psychological and Cognitive Aspects.Openness.Educational Background",
48
- "Hobbies, Interests, and Lifestyle.Events.UserParticipationInterest",
49
- "Demographic Information.Age.Youth",
50
- "Core Values and Beliefs.Wellness.Health Prioritization",
51
- "Psychological and Cognitive Aspects.Thinking Style.personality_traits",
52
- "Lifestyle and Daily Routine.Travel.Experience",
53
- "Core Values, Beliefs, and Philosophy.Beliefs.Philosophy",
54
- "Core Values, Beliefs, and Philosophy.Wellness.Approach_and_Attitudes",
55
- "Psychological and Cognitive Aspects.Risk Tolerance.Proficiency",
56
- "Demographic Information.Personal.Interests",
57
- "Hobbies, Interests, and Lifestyle.Spirituality.personal_interest",
58
- "Education and Learning.FocusArea.Domain",
59
- "Lifestyle and Daily Routine.Location.Community",
60
- "Relationships and Social Networks.Goals.RelationshipMotivation",
61
- "Psychological and Cognitive Aspects.Pattern Recognition.ability",
62
- "Cultural and Social Context.Cultural.Mental Health Advocate",
63
- "Hobbies, Interests, and Lifestyle.Interests.Design",
64
- "Education and Learning.learningApproach.ContinuousIntegration",
65
- "Media Consumption and Engagement.reddit.user_attributes",
66
- "Hobbies, Interests, and Lifestyle.Interests.LanguageLearning.knowledge",
67
- "Hobbies, Interests, and Lifestyle.Gardening.UserExperience",
68
- "Emotional and Relational Skills.Engagement.Motivation",
69
- "Media Consumption and Engagement.Preferences.User Engagement",
70
- "Hobbies, Interests, and Lifestyle.Interests.Lifestyle",
71
- "Hobbies, Interests, and Lifestyle.Travel Interests.Membership Preferences",
72
- "Lifestyle and Daily Routine.Dietary Preferences.dietaryConsiderations",
73
- "Hobbies, Interests, and Lifestyle.Interests.Sustainability",
74
- "Psychological and Cognitive Aspects.Thinking Patterns.cognitiveProcess",
75
- "Media Consumption and Engagement.Music.AnalysisDepth",
76
- "Hobbies, Interests, and Lifestyle.Interests.PhilosophyTopics",
77
- "Lifestyle and Daily Routine.Cooking.SkillLevel",
78
- "Media Consumption and Engagement.SocialMedia.User Preferences.use",
79
- "Relationships and Social Networks.Personal Ties.ProfessionalConnections",
80
- "Hobbies, Interests, and Lifestyle.Interests.Scenarios",
81
- "Education and Learning.programmingSkills.ExpertiseLevel",
82
- "Hobbies, Interests, and Lifestyle.Creative Interests.ProfessionalArea",
83
- "Psychological and Cognitive Aspects.Engagement",
84
- "Psychological and Cognitive Aspects.Challenges.CognitiveAbilities",
85
- "Cultural and Social Context.Community.Volunteer Activities",
86
- "Hobbies, Interests, and Lifestyle.Interests.Culture",
87
- "Cultural and Social Context.Food Preferences.FoodPreferences",
88
- "Physical and Health Characteristics.weight.personal_targets",
89
- "Hobbies, Interests, and Lifestyle.Art Interests.UserPreferences",
90
- "Demographic Information.Travel Preferences.Frequent Traveler",
91
- "Cultural and Social Context.Personal Attitudes.Recovery Orientation",
92
- "Education and Learning.interests.Preferences",
93
- "Education and Learning.background.Prior Experience",
94
- "Psychological and Cognitive Aspects.Personality.Perfectionism",
95
- "Physical and Health Characteristics.Beliefs.Philosophy",
96
- "Cultural and Social Context.Social.Personal Identity",
97
- "Demographic Information.birth_date.specific_date",
98
- "Media Consumption and Engagement.PlatformPreference.User Type",
99
- "Cultural and Social Context.Food Preferences.Restrictions",
100
- "Media Consumption and Engagement.Books.UserPreferences",
101
- "Hobbies, Interests, and Lifestyle.Interests.UniqueExperiences",
102
- "Psychological and Cognitive Aspects.Perspective.PersonalAttributes",
103
- "Physical and Health Characteristics.Dietary Preferences.ProteinIntakeGoals",
104
- "Education and Learning.language_proficiency.LearningAttributes",
105
- "Lifestyle and Daily Routine.Daily Routine.TravelPreferences",
106
- "Cultural and Social Context.PersonalContext.GeographicBackground",
107
- "Physical and Health Characteristics.Thinking Patterns.Goal-Oriented",
108
- "Psychological and Cognitive Aspects.Personality Traits.Interpersonal Dynamics",
109
- "Physical and Health Characteristics.Oral Health.SpecificDentalCondition",
110
- "Relationships and Social Networks.Networking.Approach",
111
- "Physical and Health Characteristics.Personal Health Factors.Alcohol Use History",
112
- "Media Consumption and Engagement.Celebrities.FavoriteCelebrities",
113
- "Relationships and Social Networks.Family.Relationship with Mother",
114
- "Education and Learning.interests.Hobbies & Interests",
115
- "Cultural and Social Context.Personal Customs.Traditional Practices",
116
- "Cultural and Social Context.Communication.CommunicationNorms",
117
- "Psychological and Cognitive Aspects.Needs.reliability",
118
- "Education and Learning.FieldOfStudy.interests",
119
- "Demographic Information.Life Stage.Maturity Level",
120
- "Core Values and Beliefs.Goals.Priorities",
121
- "Hobbies, Interests, and Lifestyle.Interests.Gardening",
122
- "Lifestyle and Daily Routine.Time Management.QualityOfLife",
123
- "Cultural and Social Context.Life Stage.Teenager",
124
- "Education and Learning.interests.Professional Interests",
125
- "Cultural and Social Context.Company Culture.Adaptability",
126
- "Cultural and Social Context.Theme.Social Context",
127
- "Demographic Information.Family.Household Composition",
128
- "Relationships and Social Networks.Family Role.children",
129
- "Hobbies, Interests, and Lifestyle.Culinary Preferences.culinaryPreferences",
130
- "Physical and Health Characteristics.Dietary.UserPreferences",
131
- "Relationships and Social Networks.Parental Relationships.dynamics",
132
- "Hobbies, Interests, and Lifestyle.Interests.Sports",
133
- "Core Values, Beliefs, and Philosophy.Travel_values.authentic_culture",
134
- "Education and Learning.highestLevel.Higher Education",
135
- "Media Consumption and Engagement.digital_tool_usage.familiarity_with_automation_tools",
136
- "Media Consumption and Engagement.QuestionStyle",
137
- "Media Consumption and Engagement.Literature.SciFiGenres",
138
- "Cultural and Social Context.Personal Culture.Values",
139
- "Emotional and Relational Skills.CommunicationSkills.EmotionalAttributes",
140
- "Psychological and Cognitive Aspects.Response.ToAnger",
141
- "Psychological and Cognitive Aspects.Tone Preference",
142
- "Core Values, Beliefs, and Philosophy.PersonalGrowth.PersonalBackground",
143
- "Hobbies, Interests, and Lifestyle.Business Interests.UserInterests",
144
- "Hobbies, Interests, and Lifestyle.Interests.Wellness.practices",
145
- "Hobbies, Interests, and Lifestyle.Interests.Food.preparation",
146
- "Education and Learning.preferences.Content Presentation",
147
- "Education and Learning.familiarity.ExperienceLevel",
148
- "Hobbies, Interests, and Lifestyle.Interests.SelfImprovement",
149
- "Lifestyle and Daily Routine.Stress Management.general",
150
- "Relationships and Social Networks.Social Skills.Social Reach",
151
- "Relationships and Social Networks.Family.Family Dynamics",
152
- "Education and Learning.competency.Cognitive and Productivity Skills",
153
- "Relationships and Social Networks.Professional.Community_Involvement",
154
- "Lifestyle and Daily Routine.Shopping.OnlineBehavior",
155
- "Core Values, Beliefs, and Philosophy.Lifestyle.PersonalValues",
156
- "Education and Learning.personalDevelopment.Interests",
157
- "Demographic Information.Age.LifeStage",
158
- "Relationships and Social Networks.Family.Relationship Quality",
159
- "Hobbies, Interests, and Lifestyle.Children.Relevance",
160
- "Demographic Information.Community.Engagement",
161
- "Cultural and Social Context.Financial Behavior.Risk Tolerance",
162
- "Psychological and Cognitive.User Characteristics.Personal Characteristics",
163
- "Core Values, Beliefs, and Philosophy.learning_attitude.openness",
164
- "Physical and Health Characteristics.Cognitive Style.Reflective Development",
165
- "Media Consumption and Engagement.Preferences.User Preferences",
166
- "Education and Learning.experience_level.AI",
167
- "Psychological and Cognitive Aspects.Openness.Interest in Technology",
168
- "Lifestyle and Habits.Daily Routine.Home Usage Frequency",
169
- "Hobbies, Interests, and Lifestyle.Projects.DroneTechnology",
170
- "Hobbies, Interests, and Lifestyle.Dietary Preferences.User Interests",
171
- "Cultural and Social Context.Life Experiences.Variety",
172
- "Psychological and Cognitive Aspects.Motivation.Wellness",
173
- "Relationships and Social Networks.Professional Skills.Networking",
174
- "Media Consumption and Engagement.content_engagement.personal_beliefs",
175
- "Hobbies, Interests, and Lifestyle.Interests.Groups",
176
- "Media Consumption and Engagement.preferred_channels.communication_channels",
177
- "Relationships and Social Networks.Family.Support System",
178
- "Lifestyle and Daily Routine.Activities.Family Structure",
179
- "Relationships and Social Networks.Social Role.Mentorship_Role",
180
- "Education and Learning.subject_area.interests",
181
- "Core Values, Beliefs, Philosophy.Worldview.Nationalistic Views",
182
- "Demographic Information.Information.Age",
183
- "Relationships and Social Networks.Interactions.User Intent",
184
- "Hobbies, Interests, and Lifestyle.Interests.Storytelling",
185
- "Demographic Information.Education.Proficiency",
186
- "Hobbies, Interests, and Lifestyle.Interests.Seasons",
187
- "Cultural and Social Context.Religion.ReligiousEngagement",
188
- "Physical and Health Characteristics.Health Goals.health_improvement",
189
- "Hobbies, Interests, and Lifestyle.Interests.SocialContributions",
190
- "Education and Learning.specific_interests",
191
- "Lifestyle and Daily Routine.Travel Preferences.User Preferences",
192
- "Hobbies, Interests, and Lifestyle.Outdoor Activities.Camping",
193
- "Media Consumption and Engagement.story_prefs.genres",
194
- "Media Consumption and Engagement.FavoriteAuthors.Historical",
195
- "Cultural and Social Context.Religion.Religion",
196
- "Emotional and Relational Skills.SelfAwareness.Personal Growth Techniques",
197
- "Lifestyle and Daily Routine.Cooking.TimeAvailability",
198
- "Media Consumption and Engagement.Preferred Platforms.Libraries",
199
- "Education and Learning.academic_background.CreativeWorks",
200
- "Hobbies, Interests, and Lifestyle.Entrepreneurial Interests.Business_Strategy",
201
- "Core Values, Beliefs, and Philosophy.Philosophy.generalAttributes",
202
- "Core Values and Beliefs.Identity.CulturalAffiliation",
203
- "Psychological and Cognitive Aspects.Motivation.Learning",
204
- "Lifestyle and Daily Routine.Sports.endurance_sports",
205
- "Relationships and Social Networks.Connections.Personal Network",
206
- "Psychological and Cognitive Aspects.Anxiety.Level",
207
- "Hobbies, Interests, and Lifestyle.Creative Interests.CognitiveTools",
208
- "Core Values and Philosophy.Beliefs.Outcome-Oriented",
209
- "Psychological and Cognitive Aspects.Personality.Introversion",
210
- "Psychological and Cognitive Aspects.Resilience.PersonalExperience",
211
- "Psychological and Cognitive Aspects.Personal Insight.Level of Self-Awareness",
212
- "Cultural and Social Context.Personal Interests.Academic Interests",
213
- "Hobbies, Interests, and Lifestyle.Gaming.UserInterest",
214
- "Education and Learning.degree.Specialization",
215
- "Lifestyle and Daily Routine.Wellness.Personalized Routine",
216
- "Education and Learning.academicFocus.Interests",
217
- "Psychological and Cognitive Aspects.Motivation.Goals",
218
- "Psychological and Cognitive Aspects.Stress Management.WorkLifeAttributes",
219
- "Psychological and Cognitive Aspects.Problem Solving.analyticalSkills",
220
- "Cultural and Social Context.Community.Involvement",
221
- "Media Consumption and Engagement.Artistic.Interests",
222
- "Relationships and Social Networks.Family.Sibling",
223
- "Cultural and Social Context.cultural.personal_information",
224
- "Cultural and Social Context.Language.Proficiency",
225
- "Emotional and Relational Skills.Personality.Empathy",
226
- "Core Values, Beliefs, and Philosophy.Values.Discipline",
227
- "Hobbies, Interests, and Lifestyle.Interests.HistoricalThemes",
228
- "Hobbies, Interests, and Lifestyle.Interests.Nature",
229
- "Hobbies, Interests, and Lifestyle.Interests.MusicGenres.musical_involvement.bass",
230
- "Core Values and Beliefs.Personal Philosophy.Preferences",
231
- "Education and Learning.FocusArea.Leadership",
232
- "Core Values, Beliefs, and Philosophy.Values.Growth_Mindset",
233
- "Relationships and Social Networks.Peers.Dynamics",
234
- "Physical and Health Characteristics.HealthHistory.Conditions",
235
- "Psychological and Cognitive Aspects.Personality.PersonalityResults",
236
- "Media Consumption and Engagement.news.preferred_sources",
237
- "Hobbies, Interests, and Lifestyle.Interests.Innovation",
238
- "Core Values, Beliefs, and Philosophy.Interests.EthicalViews",
239
- "Cultural and Social Context.Personal Values.Privacy Orientation",
240
- "Psychological and Cognitive Aspects.Favorite Genres.Gaming",
241
- "Cultural and Social Context.Group Involvement.Participation Level",
242
- "Media Consumption and Engagement.Genre.Interactive Storytelling",
243
- "Hobbies, Interests, and Lifestyle.Children.Approaches",
244
- "Lifestyle and Routine.Personal Habits.User Personalization Attributes",
245
- "Demographic Information.Race.Ethnicity",
246
- "Hobbies, Interests, and Lifestyle.Vehicles.User Preferences",
247
- "Lifestyle and Daily Routine.Shopping.ShoppingBehavior",
248
- "Cultural and Social Contexts.Community.Engagement Level",
249
- "Media Consumption and Engagement.SocialMedia.User Engagement",
250
- "Psychological and Cognitive Aspects.Perfectionism.education_level",
251
- "Lifestyle and Daily Routine.Leisure Activities.Personal Preferences",
252
- "Cultural and Social Context.Social Habits.Coffee Culture Enthusiast",
253
- "Hobbies, Interests, and Lifestyle.Interests.Advocacy",
254
- "Media Consumption and Engagement.Engagement.User Level",
255
- "Cultural and Social Context.Personal Life.Interaction Style",
256
- "Hobbies, Interests, and Lifestyle.Travel Preferences.Geographic Interests",
257
- "Education and Learning.motivation.educational_experience",
258
- "Hobbies, Interests, and Lifestyle.User Interests.personal_preferences",
259
- "Core Values, Beliefs, and Philosophy.Goals.Career Goals",
260
- "Relationships and Social Networks.Social.Personalization Level",
261
- "Media Consumption and Engagement.Music.ListeningPreferences",
262
- "Demographic Information.Family.Role Information",
263
- "Media Consumption and Engagement.Preferred Sources.Financial Information Sources",
264
- "Physical and Health Characteristics.Neurodiversity.Dyslexia",
265
- "Relationships and Social Networks.Social Role.Youth_Engagement",
266
- "Core Values, Beliefs, and Philosophy.Values.Education",
267
- "Physical and Health Characteristics.Metabolism.Basal Metabolic Rate",
268
- "Lifestyle and Daily Routine.Learning.personal_dedication",
269
- "Physical and Health Characteristics.Dietary Preferences.Allergies",
270
- "Relationships and Social Networks.Relationship.Family_Context",
271
- "Cultural and Social Context.affiliation.religious",
272
- "Hobbies, Interests, and Lifestyle.Interests.PhilosophicalFields",
273
- "Education and Learning.research.Interests",
274
- "Demographic Information.income.level",
275
- "Hobbies, Interests, and Lifestyle.Hobbies.interests",
276
- "Demographic Information.Economic Status.Budget",
277
- "Hobbies, Interests, and Lifestyle.Interests.Science",
278
- "Physical and Health Characteristics.Beliefs.AttitudesTowardsDrugs",
279
- "Media Consumption and Engagement.Gaming.UsagePreferences",
280
- "Demographic Information.Gender.Identity",
281
- "Lifestyle and Daily Routine.Work Schedule.attribute",
282
- "Core Values, Beliefs, and Philosophy.Morality.relationship_preferences",
283
- "Education and Learning.skillLevel.Diversity of Skills",
284
- "Education and Learning.level_of_expertise.technology",
285
- "Hobbies, Interests, and Lifestyle.Writing.experience_level",
286
- "Hobbies, Interests, and Lifestyle.Entertainment Interests.Industry",
287
- "Cultural and Social Context.Religion.ReligiousType",
288
- "Relationships and Social Networks.Family.Mother's Personality",
289
- "Psychological and Cognitive Aspects.Personality.AdventureSeeking",
290
- "Demographic Information.Gender.Preferences",
291
- "Psychological and Cognitive Aspects.Mindfulness.Personal Development",
292
- "Hobbies, Interests, and Lifestyle.Travel Interests.Destination Preferences",
293
- "Physical and Health Characteristics.Health Conditions.Neurodevelopmental Conditions",
294
- "Media Consumption and Engagement.SpaceRelatedMedia",
295
- "Media Consumption and Engagement.RecipeSources.OnlineBlogs",
296
- "Demographic Information.Age.SpecificAge",
297
- "Media Consumption and Engagement.sciFiThemes",
298
- "Core Values, Beliefs, and Philosophy.Cultural.Cultural Awareness",
299
- "Cultural and Social Context.Community.Impact",
300
- "Cultural and Social Context.DietaryPreferences.personal_preferences",
301
- "Physical and Health Characteristics.Medical History.Allergy_Management",
302
- "Education and Learning.subject_matter.Topic",
303
- "Physical and Health Characteristics.General Health.Wellbeing",
304
- "Psychological and Cognitive Aspects.Curiosity.IntellectualEngagement",
305
- "Emotional and Relational Skills.OpenMindedness.ReceptivityToInnovation",
306
- "Hobbies, Interests, and Lifestyle.Interests.GameDevelopment",
307
- "Demographic Information.Age.MiddleAged",
308
- "Core Values, Beliefs, and Philosophy.Beliefs.Social Values",
309
- "Emotional and Relational Skills.Patience.level",
310
- "Demographic Information.Age.Group",
311
- "Hobbies, Interests, and Lifestyle.Goals.Physical_Activity",
312
- "Psychological and Cognitive Aspects.User Interaction.PreferredEngagementStyle",
313
- "Psychological and Cognitive Aspects.Math Skills.proficiency_level",
314
- "Hobbies, Interests, and Lifestyle.Interests.Reading",
315
- "Emotional and Relational Skills.CommunicationSkills.CommunicationStyle",
316
- "Core Values, Beliefs, and Philosophy.Life_perspective.worldview",
317
- "Education and Learning.knowledgeArea.Personal Interests",
318
- "Emotional and Relational Skills.Resilience.Journey",
319
- "Physical and Health Characteristics.neurodiversity.add-inattentive",
320
- "Hobbies, Interests, and Lifestyle.Interests.Literature",
321
- "Core Values, Beliefs, and Philosophy.Values.Work_Ethic",
322
- "Lifestyle and Daily Routine.Home Setup.UserPreferences",
323
- "Hobbies, Interests, and Lifestyle.Interests.Film",
324
- "Cultural and Social Context.Personal Values.Inclusivity Focus",
325
- "Core Values, Beliefs, and Philosophy.PersonalGrowth.Orientation",
326
- "Cultural and Social Context.Beliefs.Lifestyle_Attitudes",
327
- "Media Consumption and Engagement.streaming_service.preferences",
328
- "Education and Learning.degree.field_of_study",
329
- "Physical and Health Characteristics.Body.Body Type.Normal",
330
- "Emotional and Relational Skills.WorkLifeBalance.Preferences",
331
- "Psychological and Cognitive Aspects.Personality.Empathy",
332
- "Relationships and Social Networks.Professional.Knowledge_Experience",
333
- "Media Consumption and Engagement.ArtisticInspirations",
334
- "Education and Learning.academic_achievements.education",
335
- "Core Values and Beliefs.Personal Philosophy.Opinions",
336
- "Psychological and Cognitive Aspects.Personality.Preference",
337
- "Relationships and Social Networks.Family.Grandparents",
338
- "Relationships and Social Networks.Social Role.Impact",
339
- "Hobbies, Interests, and Lifestyle.Preferences.activities",
340
- "Lifestyle and Daily Routine.Retirement.Age",
341
- "Demographic Information.Gender.Demographics",
342
- "Demographic Information.RelocationWillingness",
343
- "Core Values, Beliefs, and Philosophy.WorkEthic.Values",
344
- "Psychological and Cognitive Aspects.Productivity.SkillLevel",
345
- "Education and Learning.skillLevel.Analytical Skills",
346
- "Cultural and Social Context.Preference.Language Preferences",
347
- "Core Values, Beliefs, and Philosophy.EnvironmentalConcerns.Sustainability Advocate",
348
- "Psychological and Cognitive Aspects.Language Complexity.Preference",
349
- "Physical and Health Characteristics.Skin.UserPreferences",
350
- "Lifestyle and Daily Routine.Sleep.environment",
351
- "Psychological and Cognitive Aspects.Behavioral Patterns.Personal Traits",
352
- "Relationships and Social Networks.Social Role.Family_Role",
353
- "Psychological and Cognitive Aspects.Mental Well-being.Stable",
354
- "Demographic Information.Age.GroupCategory",
355
- "Psychological and Cognitive Aspects.Emotional.EmotionalAttributes",
356
- "Relationships and Social Networks.Professional Skills.Entrepreneurship",
357
- "Psychological and Cognitive Aspects.Political Views.orientation",
358
- "Emotional and Relational Skills.Romantic.RelationshipBuilding",
359
- "Cultural and Social Context.Values.EthicalValues",
360
- "Education and Learning.writingSkills.Level",
361
- "Psychological and Cognitive Aspects.Goals.Long-Term Strategy",
362
- "Demographic Information.Age.SuitableContent",
363
- "Physical and Health Characteristics.Skin.SkinType",
364
- "Emotional and Relational Skills.EmotionalIntelligence.Emotional_Sensitivity",
365
- "Cultural and Social Context.Beliefs.Personal_Interests",
366
- "Cultural and Social Context.Health Perspectives.Aging Attitudes",
367
- "Media Consumption and Engagement.Engagement.User Technical Proficiency",
368
- "Lifestyle and Daily Routine.Pet Ownership.PersonalizationAttribute",
369
- "Hobbies, Interests, and Lifestyle.Financial Interests.investment_goals",
370
- "Relationships and Social Networks.Family.Family Relationships",
371
- "Cultural and Social Context.Financial Preference.Budget Conscious",
372
- "Physical and Health Characteristics.Fitness Level.Current Status",
373
- "Core Values, Beliefs, and Philosophy.Ethics.Dietary_Preferences",
374
- "Media Consumption and Engagement.meme.knowledge",
375
- "Media Consumption and Engagement.Language.LanguageAttributes",
376
- "Hobbies, Interests, and Lifestyle.Professional Interests.General Interests",
377
- "Psychological and Cognitive Aspects.Risk Tolerance.General",
378
- "Hobbies, Interests, and Lifestyle.Academic Interests.Personal Interests",
379
- "Cultural and Social Context.Health Practices.Traditional Approaches",
380
- "Core Values, Beliefs, and Philosophy.Educational_goals.TemporalPerspective",
381
- "Psychological and Cognitive Aspects.Creativity.PersonalStyle"
382
- ]
383
- }