当前位置:编程学习 > VB >>

100分请教海量分词VBCOM组件的使用方法

海量智能分词FORVB COM组件,本网资源有下载(http://down.csdn.net/source/1198209)
以下是我据官居方的VC代码改写的VB代码:
    Set tt = New HLSSLib.HLsplit
    Dim inibool As Boolean
    inibool = True
    destfile = App.Path & "\HLSSplit.dat"
    t = tt.comHLSplitInit(inibook, destfile)
    If Not t Then
    MsgBox "fail"
    Exit Sub
    End If
    hhandle = tt.comHLOpenSplit()
    Dim lptext As String
    lptext = "这是一个测试"
    n1 = tt.comHLSplitWord(hhandle, lptext, 0)
    If Not n1 Then
    MsgBox "splitword failed"
    Exit Sub
    End If
    Dim nresultcnt As Integer
     nresultcnt = comHLGetWordCnt(hhandle) '取得分词个数
    For i = 0 To nresultcnt '取得分词结果
      Dim pword As String '存放分词结果中的一个词
      pword = tt.comHLGetWordAt(hhandle, i) '取得一个分词结果
      Dim newword As String
      newword = newword & " " & pword '以空格分割分词结果中的每个词
    Next i
    tt.comHLCloseSplit (hhandle)
    MsgBox newword
运行时,在t = tt.comHLSplitInit(inibook, destfile) 这一行就提示有错误,显示传址参数有误,无法继续,请高手帮助。
从对象浏览器看,comhlsplitinit有参数,但VC版无参数。不知这两个参数该如何传递?
以下是官方接口手册中的VC代码:
//初始化分词词典
bool bInitDict = HLSplitInit ();
if(!bInitDict)
{
AfxMessageBox(_T(“初始化分词字典失败!”)) ;
return ;
}
CString strText ; // 存放要进行分词的字符串
…………
………..
HANDLE hHandle = HLOpenSplit (); //创建分词句柄
if(hHandle == INVALID_HANDLE_VALUE)
{//创建分词句柄失败
AfxMessageBox(_T("创建分词句柄失败!"));
HLFreeSplit () ;//卸载分词字典
return ;
}
int iExtraCalcFlag = 0; //附加计算标志,不进行附加计算
LPCSTR lpText = (LPCSTR)strText ;
bool bSuccess = HLSplitWord (hHandle, lpText, iExtraCalcFlag);

CString strResult ;
strResult = _T(“”) ;
if(bSuccess)
{//分词成功
int nResultCnt = HLGetWordCnt (hHandle);//取得分词个数
for(int i = 0 ; i < nResultCnt ; i++)
{//取得分词结果
SHLSegWord* pWord ;//存放分词结果中的一个词
pWord = HLGetWordAt (hHandle , i) ;//取得一个分词结果
strResult += pWord->m_szWord;
strResult += _T(“ ”) ; //以空格分割分词结果中的每个词
}
HLCloseSplit (hHandle) ;//关闭分词句柄
}
else
{//分词失败
AfxMessageBox(_T(“分词失败!”)) ;
HLCloseSplit (hHandle) ;//关闭分词句柄
HLFreeSplit () ;//卸载分词字典
return ;
}
HLFreeSplit () ; //卸载分词词典
………..
…………
其中的省略号为其原来如此,不告诉,并非本人上传时所省。 destfile在哪定义了?按地址传递的时候必须先定义才能用,要不就出错。
按地址传递时,定义方法如下:

   dim destfile as string    '正确
   dim strName,destfile as string     '错误,必须单独定义。更不用说你没定义了吧。
谢谢老兄。错误提示是前面这个参数出问题,不是后面这个。前面这个是逻辑型,后面是字符型。在VB中,字符串类型始终是传值的,不定义直接赋值相当于隐式定义类型,也当没有问题。当然按您说的,显式声明肯定没有错。 改成:

   Dim inibool As integer
    inibool = 0
    destfile = App.Path & "\HLSSplit.dat" 
    t = tt.comHLSplitInit(inibook, destfile) 
 
试试 还是通不过。抄录几个该组件的几个方法如下:
Sub comHLSplitInit(ret As Boolean, lpszDataFilePath As String)
Sub comHLFreeSplit()
Sub comHLOpenSplit(__MIDL_0011 As Long)
Sub comHLSplitWord(__MIDL_0013 As Boolean, __MIDL_0014 As Long, __MIDL_0015 As String, __MIDL_0016 As Long)
Sub comHLGetWordCnt(__MIDL_0017 As Long, __MIDL_0018 As Long)
Sub comHLGetWordAt(__MIDL_0019 As String, __MIDL_0020 As Long, __MIDL_0021 As Single, __MIDL_0022 As Long, __MIDL_0023 As Long)
Sub comHLCloseSplit(__MIDL_0012 As Long)

请高手帮助看下,其中的参数传递到底有何问题。谢谢! 请高手费心指正,要觉得分不够,再添。谢谢了!

    Dim hhandle As Long
    Dim tt As HLSSLib.HLsplit
    Set tt = New HLSSLib.HLsplit
    Dim t As Boolean                               '申明变量t
    'Dim inibool As Boolean                         '该变量没有用途
    'inibool = True                                 '去掉该句 原因同上
    destfile = App.Path & "\HLSSplit.dat"
    't = tt.comHLSplitInit(inibook, destfile)        '去掉赋值的前面部分,正确语句如下:
    tt.comHLSplitInit t, destfile                    'comHLSplitInit函数不带返回值,t是返回变量
    If Not t Then
    MsgBox "fail"
    Exit Sub
    End If
    'hhandle = tt.comHLOpenSplit()                   'comHLOpenSplit函数带一个参数,并且没有返回值。
    tt.comHLOpenSplit hhandle                       '上一句改成这
    Dim lptext As String
    lptext = "这是一个测试"
    tt.comHLSplitWord True, hhandle, 0, 0     '该函数有4个参数,并且没有返回值。自己修改
    If Not n1 Then
    MsgBox "splitword failed"
    Exit Sub
    End If
    Dim nresultcnt As Long                            '函数需要的是Long型变量 不是Integer
    tt.comHLGetWordCnt nresultcnt, hhandle           '可能的形式:tt.comHlgetwordcnt(nresultcnt,hhandle)
    
    For i = 0 To nresultcnt '取得分词结果
      Dim pword As String '存放分词结果中的一个词
      'pword = tt.comHLGetWordAt(hhandle, i)           '没返回值。该函数有5个参数。
      tt.comHLGetWordAt "Test", hhandle, 0, 0, 0
      Dim newword As String
      newword = newword & " " & pword '以空格分割分词结果中的每个词
    Next i
    tt.comHLCloseSplit (hhandle)
    MsgBox newword
坏上帝真耐心。 谢谢:BestBadGod。按您的提示修改了代码,但参数类型作了传递,但仍显示无法取得结果。仍不知参数传递上有什么诀窍。 看看下面这个定义:
comHLSplitInit(ret As Boolean, lpszDataFilePath As String)

第二个参数是带lp的,是一个指针,不能直接传字符串。
引用 10 楼 chenjl1031 的回复:
看看下面这个定义:
comHLSplitInit(ret As Boolean, lpszDataFilePath As String)

第二个参数是带lp的,是一个指针,不能直接传字符串。

那请问,应该怎么做呢?另外几个方法如下,它们的参数应该怎么传呢?请不吝赐教,谢谢!
—————— 
Sub comHLSplitInit(ret As Boolean, lpszDataFilePath As String) 
Sub comHLFreeSplit() 
Sub comHLOpenSplit(__MIDL_0011 As Long) 
Sub comHLSplitWord(__MIDL_0013 As Boolean, __MIDL_0014 As Long, __MIDL_0015 As String, __MIDL_0016 As Long) 
Sub comHLGetWordCnt(__MIDL_0017 As Long, __MIDL_0018 As Long) 
Sub comHLGetWordAt(__MIDL_0019 As String, __MIDL_0020 As Long, __MIDL_0021 As Single, __MIDL_0022 As Long, __MIDL_0023 As Long) 
Sub comHLCloseSplit(__MIDL_0012 As Long) 

我也有同样的问题哎!希望谁能早点解决,我也在研究中………… 研究中………… 本人很久没上过CSDN,今日偶遇此贴,鉴于大家对海量分词VB com组件的疑惑,现贴出用法示例片段:

    .......
    Public Structure SHLSegWord
        Public sWord As String '字符串
        Public dwPOS As Long '词性标志
        Public fWeight As Short '关键词权重,如果不是关键词,权重为0
        Public colr As System.Drawing.Color
    End Structure  '海量分词结果数据结构



    Public HLS As New HLSSLib.HLsplit, HWND As Integer, Init As Boolean
    Public HLCAL As New Dictionary(Of Long, String)
    Public Const HL_CAL_OPT_KEYWORD As Integer = 1 '计算关键词附加标识
    Public Const HL_CAL_OPT_FINGER As Integer = 2 '计算文章语义指纹标识
    Public Const HL_CAL_OPT_POS As Integer = 4 '计算词性标识
    Public Const HL_CAL_OPT_SEARCH As Integer = 8 '输出面向检索的分词结果
    Public Const HL_CAL_OPT_DEFAULT As Integer = 0 '默认属性,只进行分词
    ' 词性定义部分 '   
    Public SHLKeyW() As Long = New Long() {&H800000, &H100000, &H8000, &H4000, &H80, &H40, &H20, &H10, &H8}
    Public tex0 As String
    Public HLSP As SHLSegWord()

    Protected Sub Main()
        tex0 = "这是一个测试,看看是否可行。"
        HLS.comHLSplitInit(Init, "")
        HLS.comHLOpenSplit(HWND)
        HLS.comHLSplitWord(Init, HWND, tex0, HL_CAL_OPT_POS)
        HLS.comHLGetWordCnt(Num, HWND)
        ReDim HLSP(Num - 1)
        For k = 0 To Num - 1
            Dim shl As New SHLSegWord, sword As String = "", dwPos As Integer, fweight As Single
            HLS.comHLGetWordAt(sword, dwPos, fweight, HWND, k)
            shl.dwPOS = dwPos
            shl.fWeight = fweight
            shl.sWord = sword
            Pass(q).HLSP(k) = shl
            shl = Nothing
        Next
        HLS.comHLCloseSplit(HWND)
        HLS.comHLFreeSplit()
    End Sub
    ...... 一直没来得及完善该组件,也没有写技术文档,而且后来我把源码弄丢了,重写很困难,有能力的朋友可以再写一个。 这段时间没上来,迟复为歉啊。谢谢各位兄弟。
引用 10 楼 chenjl1031 的回复:
看看下面这个定义:
comHLSplitInit(ret As Boolean, lpszDataFilePath As String)

第二个参数是带lp的,是一个指针,不能直接传字符串。


VB有个取字符串字址的函数。你搜索一下,我忘了。
引用 17 楼 lidaixiang 的回复:
这段时间没上来,迟复为歉啊。谢谢各位兄弟。
 LZ 我最近在用。VB6调用。出现了个问题是,要分词的内容。前面几个字显示不出来,但如果需要处理的字符串前面加一串空格,就可以正常分出。。。
引用 14 楼 jiayidian2 的回复:
本人很久没上过CSDN,今日偶遇此贴,鉴于大家对海量分词VB com组件的疑惑,现贴出用法示例片段:

  .......
  Public Structure SHLSegWord
  Public sWord As String '字符串
  Public dwPOS As Long '词性标志
  Public fWeight As Short '关键词权重,如果不是关键词,权重……

可否提供 自定义字典 导入的功能呀
补充:VB ,  COM/DCOM/COM+
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,