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:45 编辑
<火山程序 类型 = "通常" 版本 = 1 />
方法 按钮_被单击 <接收事件 类型 = 整数 注释 = "当按钮被单击后发送此事件">
参数 来源对象 <类型 = 按钮 注释 = "提供事件产生的具体来源对象">
参数 标记值 <类型 = 整数 注释 = "用户调用\"挂接事件\"命令时所提供的\"标记值\"参数值,非此方式挂接事件则本参数值固定为0.">
{
如果 (来源对象 == 按钮1)
{
变量 词典路径 <类型 = 文本型>
变量 初始化结果 <类型 = 文本型>
变量 结果 <类型 = 文本数组类>
初始化默认 ()
// 如果 (初始化结果 == 假)
{
// 调试输出 ("错误: " + 取最后错误 ())
}
// 否则
{
结果 = 精确分词 ("我来到北京清华大学参加了教育,考了158分,结果得了个C级。哈哈哈,nice")
调试输出 (结果)
}
}
返回 (0)
}
我来到北京清华大学参加了教育,考了158分,结果得了个C级。哈哈哈,nice。分这句话就用了3分钟? weilai 发表于 2026-5-25 09:11
我来到北京清华大学参加了教育,考了158分,结果得了个C级。哈哈哈,nice。分这句话就用了3分钟? ...
是的,大佬。如果用DLL与LIP18秒左右
那也是很慢的,应该0秒才对
页:
[1]