【问题标题】:Calling Numpy and scikit-learn from C#从 C# 调用 Numpy 和 scikit-learn
【发布时间】: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?)

谁能为此建议最好的方法?我愿意接受建议,但我需要将经过训练的分类器保存在内存中,因为在每次调用时都对其进行训练会让人望而却步。

我的研究得出以下结论。

  1. IronPython 2.7 可以支持 numpy 和 scipy (https://www.enthought.com/repo/.iron/)。虽然当我尝试运行它时,我遇到了一个找不到 NumpyDotNet.dll 的问题。我放弃了,因为 scikit-learn 可能无论如何都无法使用 IronPython。

  2. 我查看了“python for .net”(http://pythonnet.github.io/),但无法从 c# 调用它。我引用了 Python.Runtime.dll,但与这个人有相同的引用问题 (https://stackoverflow.com/questions/22844519/missing-py-gil-from-c-pythonnet-example)

  3. 有人用过sharpkit.learn吗? (https://github.com/foreverzet/Sharpkit.Learn)。我特别需要线性 SVM 和 TfidfVectorizer?

  4. 我对运行 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 网络服务来用文本调用它,我就完成了。谢谢你的帮助。愚蠢的问题 - 我该如何结束这个问题并感谢您/增加您的代表分数?
  • 天哪,不知道,我是这个游戏的新手。它似乎有点惩罚这样的讨论。必须以某种方式解决这个问题。不过,您的意图对我来说已经足够了:)

标签: c# python numpy


【解决方案1】:

根据上面的 cmets 将此问题标记为已回答。我无法在 Iron python 中托管 scikit-learn,而是使用 cpython 编写了一个服务。

【讨论】:

    【解决方案2】:

    我知道从 C# 到 Sklearn/Numpy 的 IronPython 似乎不起作用。

    最好的方法是使用 Flask 等框架为 Python Sklearn/Numpy 代码创建一个 REST API Web 服务,并使用 HttpClient 类从 C# 代码调用 API。

    这将完全消除 IronPython 并独立于 Python 代码的性质工作。

    【讨论】:

      猜你喜欢
      • 2015-07-25
      • 2016-08-18
      • 2015-12-13
      • 2020-08-02
      • 2012-09-26
      • 2012-11-24
      • 2012-11-02
      • 2020-06-22
      • 1970-01-01
      相关资源
      最近更新 更多