• c# 调用 CRFs应用程序


    今天想用C#调用crfs,但是老出问题。原因有几点。第一,我对crf不理解,虽然我用cmd跑了一遍,但是根本不理解为什么,而且只是草草看了下参数该输入什么,只是了解了形式,没有了解实质。所以在调用的时候,我不知道怎样转移输入输出的参数。另外,crf_learn在cmd运行的时候,用到了一个自带的dll文件我也不知道怎么处理。而且我在网上找类似调用的例子也找不到。第二,对找到的实例代码不熟悉,没有理解每一行代码的含义和作用。第三,不知道怎么输出结果,不会适当的断点。

    经过一位同学的帮助,他帮我解决了以问题。最终运行成功。

    Console.WriteLine("aaaaa"); //用于测试输出
    System.Diagnostics.Process p = new System.Diagnostics.Process();  //开始系统进程
    p.StartInfo = new System.Diagnostics.ProcessStartInfo(@"C:UsersAMYDesktop estcrf_learn.exe");  //应用程序路径
    p.StartInfo.Arguments = @" C:UsersAMYDesktop est emplate C:UsersAMYDesktop est rain.data C:UsersAMYDesktop estmodel"; //参数输入
    p.StartInfo.RedirectStandardOutput = true; //结果输出
    p.StartInfo.UseShellExecute = false; //是否在shell中显示
    p.Start();
    //p.WaitForExit();
    Console.WriteLine("nnnn");

    p.Close() //要记得释放资源,不然程序会很慢很慢的。
    Console.ReadKey();

    dll文件在CRFs运行的时候是可以自己找到的,只要你把它和learn.exe文件放在一个文件夹里面。另外test的结果不能通过参数来重定向,所以,只能将输出流保存到字符串,再保存到txt文件。现阶段(2015.11.8)完整的代码为:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    using System.Diagnostics;
    using System.IO;

    private void start_CRFs_Click_1(object sender, EventArgs e)
    {
    Stopwatch sw = new Stopwatch();
    sw.Start();

    string TrainDirectory = Train_directoryT.Text;
    string ArgumentsStr = tb_Arguments.Text;
    string output = "";
    System.Diagnostics.Process p = new System.Diagnostics.Process();
    p.StartInfo = new System.Diagnostics.ProcessStartInfo(TrainDirectory + "crf_learn.exe");
    p.StartInfo.Arguments = ArgumentsStr + " " + TrainDirectory + "template " + TrainDirectory + "train.data " + TrainDirectory + "model";
    string argStr = p.StartInfo.Arguments;
    p.StartInfo.RedirectStandardOutput = true;
    p.StartInfo.UseShellExecute = false;
    p.Start();
    tbtrain_result.Text = p.StandardOutput.ReadToEnd();
    p.WaitForExit();
    p.Close();

    // System.Threading.Thread.Sleep(50000); 最好能用多线程来处理
    System.Diagnostics.Process p2 = new System.Diagnostics.Process();
    p2.StartInfo = new System.Diagnostics.ProcessStartInfo(TrainDirectory + "crf_test.exe");//需要启动的程序名
    p2.StartInfo.Arguments = " -m " + TrainDirectory + "model " + TrainDirectory + "test.data";
    p2.StartInfo.RedirectStandardOutput = true;
    p2.StartInfo.UseShellExecute = false;
    p2.Start();
    output = p2.StandardOutput.ReadToEnd();
    TbTest_outputT.Text = output;
    byte[] buffer = Encoding.Default.GetBytes(output);
    File.WriteAllBytes(TrainDirectory + "output.txt", buffer);
    p2.Close();
    sw.Stop();
    TimeSpan ts = sw.Elapsed;
    string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}", ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds / 10);
    TimeSpanL.Text = "用时:" + elapsedTime;
    }

    一些输入输出定义的变量用的时候记得先定义好。

    其实很多不会的知识点,或是一些知识点的细节都是百度到的,记得好的笔记真心让人受益匪浅。最后程序也算是成功的跑起来了,所以,我把学会的东西记下来,一来是可以日后自己复习,二来也可以跟大家一起分享

  • 相关阅读:
    win7一关机电脑就蓝屏
    win10系统怎么查自己电脑的IP地址[系统天地]
    Win7如何设置任务管理器的快捷键?[系统天地]
    Win10系统下安全登录密码忘记了怎么办【系统天地】
    Win7系统很卡应该如何解决?[系统天地]
    Win7系统运行慢如何解决?——系统天地
    Win7如何解决开机应用程序无法正常启动
    win10系统怎么切换独立显卡
    程序员的自我修养
    SQL学习笔记
  • 原文地址:https://www.cnblogs.com/MiWang/p/4943555.html
Copyright © 2020-2023  润新知