【发布时间】:2014-06-09 16:28:03
【问题描述】:
我正在构建一个分类器,我希望将它作为 c# win 服务托管,公开一个我可以远程调用的端点,以及我希望分类的文本。我目前有一个使用 Ironpython 和自然语言工具包的工作,使用 c#4.0 动态。代码如下:
var py = Python.CreateEngine();
dynamic script = py.ImportModule("MyPythonScript");
classifier = script.GetClassifier();
//build features etc, then train
trainedClassifier = classifier.TrainClassifier(featureSet);
分类器在启动时自我训练(如上),我用我希望分类的文本实时调用分类器。
我的问题是我想在 scikit-learn 中使用分类器和矢量化器。
根据此链接,Ironpython 不支持 scikit-learn。 (Can scikit be used from IronPython?)
谁能为此建议最好的方法?我愿意接受建议,但我需要将经过训练的分类器保存在内存中,因为在每次调用时都对其进行训练会让人望而却步。
我的研究得出以下结论。
IronPython 2.7 可以支持 numpy 和 scipy (https://www.enthought.com/repo/.iron/)。虽然当我尝试运行它时,我遇到了一个找不到 NumpyDotNet.dll 的问题。我放弃了,因为 scikit-learn 可能无论如何都无法使用 IronPython。
我查看了“python for .net”(http://pythonnet.github.io/),但无法从 c# 调用它。我引用了 Python.Runtime.dll,但与这个人有相同的引用问题 (https://stackoverflow.com/questions/22844519/missing-py-gil-from-c-pythonnet-example)
有人用过sharpkit.learn吗? (https://github.com/foreverzet/Sharpkit.Learn)。我特别需要线性 SVM 和 TfidfVectorizer?
我对运行 python 脚本的其他解决方案持开放态度。但是,我需要缓存经过训练的分类器,并且不能重复训练它。
我对所有想法和任何帮助都持开放态度。 谢谢。
【问题讨论】:
-
如果您无法在 IronPython 中运行(正如您似乎已经确定的那样),我的解决方案是使用“纯”CPython(例如 anaconda 发行版),并使用各种接口与其连接您可以使用 IPC 机制。最简单的是本地运行的 SimpleHTTPServer,当然也可以使用更复杂的选项。
-
您好,感谢您的回复。我很高兴编写一个完整的 cpython 2.7 应用程序。我以前没有做过 - 我的 python 仅限于使用脚本进行原型设计。我已经看到如何将 python 托管为 Windows 服务 (chrisumbel.com/article/windows_services_in_python),我可以使用 pyodbc 进行数据访问、添加体面的日志记录、OOP 等。我不确定如何托管一个安静的 JSON Web 服务。提到了 Flask / CherryPy / web.py,但不确定这是否适用于 Windows。这会很有趣!
-
不要害怕 :) 我建议使用瓶子(这是一个文件,你可以拥有的最小的东西),pyodbc 对我来说似乎不是必需的。只需首先将您的分类事物放入一个包中,添加瓶子并尝试通过网络方法将调用连接到您的分类器。只需从浏览器中调用它(或者更好的是,编写单元测试)。一旦您对此设置感到满意,请连接 C#,然后最终将整个东西转换为服务。
-
无所畏惧!我现在运行了一个 python windows 服务,它正在训练一个 scikit 学习分类器。我只需要弄清楚如何托管一个 json 网络服务来用文本调用它,我就完成了。谢谢你的帮助。愚蠢的问题 - 我该如何结束这个问题并感谢您/增加您的代表分数?
-
天哪,不知道,我是这个游戏的新手。它似乎有点惩罚这样的讨论。必须以某种方式解决这个问题。不过,您的意图对我来说已经足够了:)