从C#调用Numpy和scikit-learn

5 投票
2 回答
5953 浏览
提问于 2025-04-18 09:09

我正在构建一个分类器,想把它放在一个C#的Windows服务里,这样我就可以通过一个远程接口来调用它,给它一些我想分类的文本。目前我已经有一个可以工作的版本,使用的是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)。我特别需要线性支持向量机(Linear SVM)和TfidfVectorizer?

  4. 我对运行Python脚本的其他解决方案持开放态度。不过,我需要缓存训练好的分类器,不能重复训练。

我对所有的想法都持开放态度,任何帮助都非常感谢。谢谢。

2 个回答

0

我知道,IronPython 从 C# 调用 Sklearn/Numpy 似乎不太好使。

最好的办法是用像 Flask 这样的框架,为 Python 的 Sklearn/Numpy 代码创建一个 REST API 网络服务,然后在 C# 代码中使用 HttpClient 类来调用这个 API。

这样就完全不需要 IronPython,并且可以独立于 Python 代码的具体情况来工作。

2

根据上面的评论,我把这个问题标记为已解决。我无法在 IronPython 中使用 scikit-learn,所以我改为用 CPython 写了一个服务。

撰写回答