山梦 发表于 2026-5-24 21:43:02

AI封装结巴分词

AI封装结巴分词
分个句子要3分钟多,搞成DLL也得16秒左右,不懂修改
望大佬指导优化。

<火山程序 类型 = "通常" 版本 = 1 />

包 结巴分词.程序

类 类_结巴分词 <公开 注释 = "结巴中文分词封装类 (基于https://github.com/yanyiwu/cppjieba)" @视窗.外部头文件 = "jieba_wrapper.h"
      @视窗.外部源文件 = "src\jieba_wrapper.cpp" @视窗.头文件搜寻目录 = "src\r\ninclude\cppjieba-master\src"
      @视窗.附属文件 = "dict" @全局类 = 真>
{
    变量 m_pJieba <公开 静态 类型 = 长整数>
    变量 m_sLastError <公开 静态 类型 = 文本型>

    方法 类_清理 <公开 静态>
    {
      清理 ()
    }

    方法 初始化 <公开 静态 类型 = 逻辑型 @禁止流程检查 = 真>
    参数 词典路径 <类型 = 文本型>
    {
      变量 结果 <类型 = 逻辑型 值 = 假>
      @ if (@<m_pJieba> != 0) { @<结果> = TRUE; }
      @ else {
      @   JiebaWrapper* pw = new JiebaWrapper();
      @   std::string path = JiebaWrapper::WideToAnsi(@<词典路径>.GetText());
      @   if (pw->Init(path)) { @<m_pJieba> = (INT64)pw; @<结果> = TRUE; }
      @   else {
      @         @<m_sLastError> = CVolString(pw->GetLastError().c_str());
      @         delete pw;
      @   }
      @ }
      返回 (结果)
    }

    方法 初始化默认 <公开 静态 类型 = 逻辑型 @禁止流程检查 = 真>
    {
      变量 结果 <类型 = 逻辑型 值 = 假>
      @ if (@<m_pJieba> != 0) { @<结果> = TRUE; }
      @ else {
      @   JiebaWrapper* pw = new JiebaWrapper();
      @   if (pw->InitAuto()) { @<m_pJieba> = (INT64)pw; @<结果> = TRUE; }
      @   else {
      @         @<m_sLastError> = CVolString(pw->GetLastError().c_str());
      @         delete pw;
      @   }
      @ }
      返回 (结果)
    }

    方法 清理 <公开 静态 @禁止流程检查 = 真>
    {
      @ if (@<m_pJieba> != 0) {
      @   delete (JiebaWrapper*)@<m_pJieba>;
      @   @<m_pJieba> = 0;
      @ }
    }

    方法 是否已初始化 <公开 静态 类型 = 逻辑型 @禁止流程检查 = 真>
    {
      @ @<m_pJieba> != 0
    }

    方法 取最后错误 <公开 静态 类型 = 文本型 @禁止流程检查 = 真>
    {
      返回 (m_sLastError)
    }

    方法 取默认词典路径 <公开 静态 类型 = 文本型 @禁止流程检查 = 真>
    {
      变量 结果 <类型 = 文本型>
      @ std::wstring wPath = JiebaWrapper::GetDefaultDictPathW();
      @ std::string u8Path = JiebaWrapper::WideToUtf8(wPath);
      @ @<结果> = CVolString(u8Path.c_str());
      返回 (结果)
    }

    方法 取内部结果 <公开 静态 类型 = 文本型 @禁止流程检查 = 真>
    参数 文本 <类型 = 文本型>
    参数 模式 <类型 = 整数>
    {
      变量 结果 <类型 = 文本型>
      @ JiebaWrapper* pw = (JiebaWrapper*)@<m_pJieba>;
      @ if (pw) {
      @   std::string utf8 = JiebaWrapper::WideToUtf8(@<文本>.GetText());
      @   std::string res;
      @   if (@<模式> == 0) res = pw->CutToString(utf8);
      @   else if (@<模式> == 1) res = pw->CutAllToString(utf8);
      @   else if (@<模式> == 2) res = pw->CutForSearchToString(utf8);
      @   else if (@<模式> == 3) res = pw->TagToString(utf8);
      @   @<结果> = CVolString(res.c_str());
      @ }
      返回 (结果)
    }

    方法 取关键词结果 <公开 静态 类型 = 文本型 @禁止流程检查 = 真>
    参数 文本 <类型 = 文本型>
    参数 数量 <类型 = 整数>
    {
      变量 结果 <类型 = 文本型>
      @ JiebaWrapper* pw = (JiebaWrapper*)@<m_pJieba>;
      @ if (pw) {
      @   std::string utf8 = JiebaWrapper::WideToUtf8(@<文本>.GetText());
      @   std::string res = pw->ExtractToString(utf8, (size_t)@<数量>);
      @   @<结果> = CVolString(res.c_str());
      @ }
      返回 (结果)
    }

    方法 精确分词 <公开 静态 类型 = 文本数组类>
    参数 文本 <类型 = 文本型>
    {
      变量 结果文本 <类型 = 文本型>
      结果文本 = 取内部结果 (文本, 0)
      变量 结果 <类型 = 文本数组类>
      分割子文本 (结果文本, "\n", 结果, 真, 真)
      返回 (结果)
    }

    方法 全模式分词 <公开 静态 类型 = 文本数组类>
    参数 文本 <类型 = 文本型>
    {
      变量 结果文本 <类型 = 文本型>
      结果文本 = 取内部结果 (文本, 1)
      变量 结果 <类型 = 文本数组类>
      分割子文本 (结果文本, "\n", 结果, 真, 真)
      返回 (结果)
    }

    方法 搜索引擎分词 <公开 静态 类型 = 文本数组类>
    参数 文本 <类型 = 文本型>
    {
      变量 结果文本 <类型 = 文本型>
      结果文本 = 取内部结果 (文本, 2)
      变量 结果 <类型 = 文本数组类>
      分割子文本 (结果文本, "\n", 结果, 真, 真)
      返回 (结果)
    }

    方法 词性标注 <公开 静态 类型 = 文本数组类>
    参数 文本 <类型 = 文本型>
    {
      变量 结果文本 <类型 = 文本型>
      结果文本 = 取内部结果 (文本, 3)
      变量 结果 <类型 = 文本数组类>
      分割子文本 (结果文本, "\n", 结果, 真, 真)
      返回 (结果)
    }

    方法 提取关键词 <公开 静态 类型 = 文本数组类>
    参数 文本 <类型 = 文本型>
    参数 数量 <类型 = 整数>
    {
      变量 结果文本 <类型 = 文本型>
      结果文本 = 取关键词结果 (文本, 数量)
      变量 结果 <类型 = 文本数组类>
      分割子文本 (结果文本, "\n", 结果, 真, 真)
      返回 (结果)
    }
}




山梦 发表于 2026-5-24 21:44:12

本帖最后由 山梦 于 2026-5-24 21:45 编辑

<火山程序 类型 = "通常" 版本 = 1 />

方法 按钮_被单击 <接收事件 类型 = 整数 注释 = "当按钮被单击后发送此事件">
参数 来源对象 <类型 = 按钮 注释 = "提供事件产生的具体来源对象">
参数 标记值 <类型 = 整数 注释 = "用户调用\"挂接事件\"命令时所提供的\"标记值\"参数值,非此方式挂接事件则本参数值固定为0.">
{
    如果 (来源对象 == 按钮1)
    {
      变量 词典路径 <类型 = 文本型>
      变量 初始化结果 <类型 = 文本型>
      变量 结果 <类型 = 文本数组类>
      初始化默认 ()
      // 如果 (初始化结果 == 假)
      {
            // 调试输出 ("错误: " + 取最后错误 ())
      }
      // 否则
      {
            结果 = 精确分词 ("我来到北京清华大学参加了教育,考了158分,结果得了个C级。哈哈哈,nice")
            调试输出 (结果)


      }



    }
    返回 (0)



}

weilai 发表于 2026-5-25 09:11:50

我来到北京清华大学参加了教育,考了158分,结果得了个C级。哈哈哈,nice。分这句话就用了3分钟?

山梦 发表于 2026-5-25 09:34:26

weilai 发表于 2026-5-25 09:11
我来到北京清华大学参加了教育,考了158分,结果得了个C级。哈哈哈,nice。分这句话就用了3分钟? ...

是的,大佬。如果用DLL与LIP18秒左右

weilai 发表于 2026-5-25 10:06:43

那也是很慢的,应该0秒才对
页: [1]
查看完整版本: AI封装结巴分词