之前学习python,研究了一下使用C#调用python,现在把过程发出来给大家参考。
参考:https://www.cnblogs.com/monkeyfx/p/6522000.html
我的开发环境是vs2017+python 2.7.15+IronPython-2.7.7(使用python3以上的版本貌似不行)
python实现协同过滤就不详细介绍了,主要说一下调试中碰到的问题
1、IronPython.Runtime.Exceptions.ImportException:“No module named requests”
sys.path.append(r'C:\Python27') sys.path.append(r'C:\Python27\Lib\DLLs') sys.path.append(r'C:\Python27\Lib') sys.path.append(r"C:\Python27\Lib\site-packages") sys.path.append(r'C:\\Python27\\lib\\site-packages\\requests-2.7.0-py2.7.egg')
2、IronPython.Runtime.Exceptions.ImportException:“Cannot import name _remove_dead_weakref”
#将上面的sys.path.append(r'C:\Python27\Lib')替换为sys.path.append(r"C:\Program Files (x86)\IronPython 2.7\Lib")
sys.path.append(r"C:\Program Files (x86)\IronPython 2.7\Lib")
3、System.MissingMemberException:“'module' object has no attribute '_getframe'”
参考上面的链接。
下面奉上源码:
python
#!/usr/bin/python2 # -*- coding: utf-8 -*- #已实现python结合C#实现协同过滤推荐算法 import sys sys.path.append(r'C:\Python27') sys.path.append(r'C:\Python27\Lib\DLLs') sys.path.append(r"C:\Program Files (x86)\IronPython 2.7\Lib")#安装的IronPython 2.7的路径 sys.path.append(r"C:\Python27\Lib\site-packages") sys.path.append(r'C:\\Python27\\lib\\site-packages\\requests-2.7.0-py2.7.egg') import requests import json #self.diffs 矩阵存储评分矩阵, #self.freqs 存储一对 items 被相同用户评分的数量。 diffs = {} freqs = {} # 根据提供的数据,构建self.diffs / self.freqs字典 def update(data): # 遍历每个用户的每个评分数据 for user, prefs in data.items(): # 确保子字典存在 for item, rating in prefs.items(): freqs.setdefault(item, {}) diffs.setdefault(item, {}) # setdefault 作用: #如果对于给定的键值/setdefault的第一个参数, #字典中为对应value为空, #则将setdefault的第二个参数赋值给它。 # 下面再次循环遍历user对应的prefs中的每一组评分 for item2, rating2 in prefs.items(): freqs[item].setdefault(item2, 0) diffs[item].setdefault(item2, 0.0) # 使用整数0初始化次数,浮点型零初始化评分。 # 利用两个item是否同时被一个用户评分, #对self.freqs进行更新 freqs[item][item2] += 1 # 利用两个item的评分之差,对self.diffs矩阵进行更新 diffs[item][item2] += rating - rating2 # 将两个item在diffs 矩阵与 freqs矩阵对应位置相除, #结果保存到freqs中,即为两个item的平均差距 for item, ratings in diffs.items(): for item2, rating in ratings.items(): ratings[item2] /= freqs[item][item2] return "准备完成" # 对新的用户偏好,根据 self.diffs / self.freqs 对新用户进行评分预测 def predict(userprefs): # 定义两个空字典,preds存储预测数据,freqs存储计数 preds, freqss = {}, {} # 迭代每一个物品(被用户评分过的) # 使用try/except跳过没有被评分的物品对 for item, rating in userprefs.items(): for diffitem, diffratings in diffs.items(): try: freq = freqs[diffitem][item] except KeyError: continue # 设置preds初始值为0.0, freqs初始值为0 preds.setdefault(diffitem, 0.0) freqss.setdefault(diffitem, 0) # 累加 preds[diffitem] += freq * (diffratings[item] + rating) freqss[diffitem] += freq # 在返回结果之前,进行过滤 # 返回一个 带权重预测值 的新字典 # 结果中除去了 用户已经评分过的内容 和 物品计数为零的内容 return dict([(item, value / freqss[item]) for item, value in preds.items() if item not in userprefs and freqss[item] > 0]) #return dict(alice=dict(a=5.0, b=4.0,c=3.0),bob=dict(a=4.0 ,b = 5.0,c=3.0,d=5),lili=dict(a=4,b=4,d=5)) #return dict([(item, value / freqss[item]) for item, value in preds.items() if item not in userprefs ]) def collaboratIve_filtering(): try: print '调用接口获取json数据' url="http://localhost:55708/api/sp/api.ashx?action=f2971452-cae6-4587-94ec-fbcaeeb3763f" para={ } header ={} uid=7 r = requests.post(url,data=para,headers= header) ''' print('get请求获取的响应结果json类型',r.text) print('get请求获取的响应结果json类型',r.text) print("get请求获取响应头",r.headers['Content-Type']) ''' #响应的json数据转换为可被python识别的数据类型 predict_dic={} input_dict={} json_r = r.json() if(json_r["result"]==0 and len(json_r["data"])>0): list=json.loads(json_r["data"]) predict_dic=list[str(uid)] list.pop(str(uid)) update(list) prediction=predict(predict_dic) for item,rating in prediction.items(): print item+":\t"+str(rating) print '完成' return prediction #print(json_r) except Exception as e: print str(e) return dict(msg=str(e))
C#
var options = new Dictionary<string, object>();
options["Frames"] = true;
options["FullFrames"] = true;
ScriptEngine pyEngine = Python.CreateEngine(options);//创建Python解释器对象
dynamic py = pyEngine.ExecuteFile(@"D:\\python\\call.py");//读取脚本文件
IronPython.Runtime.PythonDictionary prediction = py.collaboratIve_filtering();
具体的环境配置参考上文的链接。