accountServer.py 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. """
  2. @author: luojunhui
  3. """
  4. import json
  5. import aiohttp
  6. from applications.articleTools import ArticleDBTools
  7. from applications.config import port
  8. class AccountServer(object):
  9. """
  10. 获取标题和公众号文章的相关性
  11. """
  12. def __init__(self, mysql_client, params):
  13. self.account_name_list = None
  14. self.sim_type = None
  15. self.interest_type = None
  16. self.min_time = None
  17. self.max_time = None
  18. self.rate = None
  19. self.title_list = None
  20. self.view_count_filter = None
  21. self.params = params
  22. self.AT = ArticleDBTools(mysql_client)
  23. async def request_for_nlp(self, title_list, account_interest, interest_weight):
  24. """
  25. nlp process
  26. """
  27. headers = {"Content-Type": "application/json"}
  28. url = "http://localhost:{}/nlp".format(port)
  29. body = {
  30. "data": {
  31. "text_list_a": [i.replace("'", "") for i in title_list],
  32. "text_list_b": [i.replace("'", "") for i in account_interest],
  33. "score_list_b": interest_weight,
  34. "symbol": 1,
  35. },
  36. "function": "similarities_cross_mean" if self.sim_type == "mean" else "similarities_cross_avg"
  37. }
  38. async with aiohttp.ClientSession() as session:
  39. async with session.post(url, headers=headers, json=body) as response:
  40. response_text = await response.text()
  41. print("结果:\t", response_text)
  42. if response_text:
  43. return await response.json()
  44. else:
  45. print("Received empty response")
  46. return {}
  47. def check_params(self):
  48. """
  49. 校验传参
  50. :return:
  51. """
  52. try:
  53. self.title_list = self.params["text_list"]
  54. self.account_name_list = self.params.get("account_nickname_list", [])
  55. self.rate = self.params.get("rate", 0.1)
  56. self.max_time = self.params.get("max_time")
  57. self.min_time = self.params.get("min_time")
  58. self.interest_type = self.params.get("interest_type", "top")
  59. self.sim_type = self.params.get("sim_type", "mean")
  60. self.view_count_filter = self.params.get("view_count_filter", None)
  61. return None
  62. except Exception as e:
  63. response = {"error": "Params error", "detail": str(e)}
  64. return response
  65. async def get_account_interest(
  66. self,
  67. account_name,
  68. interest_type,
  69. view_count_filter,
  70. rate=None,
  71. msg_type=None,
  72. index_list=None,
  73. min_time=None,
  74. max_time=None,
  75. ):
  76. """
  77. 获取账号的兴趣类型
  78. :param account_name:
  79. :param max_time:
  80. :param min_time:
  81. :param index_list:
  82. :param msg_type:
  83. :param rate:
  84. :param interest_type:
  85. :param view_count_filter:
  86. :return:
  87. """
  88. good_df, bad_df = await self.AT.get_good_bad_articles(
  89. account_name=account_name,
  90. interest_type=interest_type,
  91. msg_type=msg_type,
  92. index_list=index_list,
  93. min_time=min_time,
  94. max_time=max_time,
  95. rate=rate,
  96. view_count_filter=view_count_filter,
  97. )
  98. extend_dicts = {
  99. 'view_count': good_df["show_view_count"].values.tolist(),
  100. 'view_count_rate': (good_df["show_view_count"] / good_df["view_count_avg"]).values.tolist()
  101. }
  102. account_interest = good_df["title"].values.tolist()
  103. print(account_interest)
  104. print(extend_dicts)
  105. return account_interest, extend_dicts
  106. async def get_each_account_score_list(self, account_name):
  107. """
  108. 获取和单个账号的相关性分数
  109. :return:
  110. """
  111. try:
  112. account_interest, extend_dicts = await self.get_account_interest(
  113. account_name=account_name,
  114. interest_type=self.interest_type,
  115. rate=self.rate,
  116. view_count_filter=self.view_count_filter,
  117. min_time=self.min_time,
  118. max_time=self.max_time,
  119. )
  120. interest_weight = extend_dicts['view_count']
  121. if self.sim_type == "weighted_by_view_count_rate":
  122. interest_weight = extend_dicts['view_count_rate']
  123. response = await self.request_for_nlp(
  124. title_list=self.title_list,
  125. account_interest=account_interest,
  126. interest_weight=interest_weight
  127. )
  128. score_list_key = "score_list_mean" if self.sim_type == "mean" else "score_list_avg"
  129. return {
  130. "score_list": response[score_list_key],
  131. "text_list_max": response["text_list_max"],
  132. }
  133. except Exception as e:
  134. print(e)
  135. return {
  136. "score_list": [0] * len(self.title_list),
  137. "text_list_max": self.title_list,
  138. }
  139. async def get_account_list_score_list(self):
  140. """
  141. 获取AccountList中每一个账号的相关性分数
  142. :return:
  143. """
  144. response = {}
  145. for accountName in self.account_name_list:
  146. if response.get(accountName):
  147. continue
  148. else:
  149. response[accountName] = await self.get_each_account_score_list(account_name=accountName)
  150. return response
  151. async def deal(self):
  152. """
  153. Deal Function
  154. :return:
  155. """
  156. return (
  157. self.check_params() if self.check_params() else await self.get_account_list_score_list()
  158. )