Access开发培训
网站公告
·Access专家课堂QQ群号:151711184    ·Access快速开发平台下载地址及教程    ·欢迎加入Access专家课堂微信群!    ·如何快速搜索本站文章|示例|资料    
您的位置: 首页 > 技术文章 > 源码示例

下一步, 真正模访百度的云计算

时 间:2011-10-10 06:40:38
作 者:dbaseIIIer   ID:22003  城市:深圳
摘 要:谢谢各界支持! 谢谢各界指名道姓的反击! 我很高兴!

我也喜欢以造作标题来吸引眼球的! 
这是市场原则, 做生意的人都必需懂的!

我参考了wyh99999 与 煮茶 的代码了, 谢谢好代码, 
我没用过这样的方法处理查询, 我学习了!

正 文:

我承诺过 hope678 要做这下一步的, 我要遵守承诺的!

怎么把我们的几个字变成有意义的查询?
(根据我在95年设中文网站时都研究过的课题)
这位网友问我时, 我是很老实的回答了:

搜寻器需要一个字典, 把我们输入的几个字作比较,  看哪几个字组合起来是一个词.
wyh99999 http://www.accessoft.com/article-show.asp?id=5919 代码中也没处理词组这部份,
煮茶作品中http://www.accessoft.com/article-show.asp?id=5918 代码中就有了!

wyh99999 作品中
 A = Split(Me.tm.Value, " ")

 For i = 0 To UBound(A, 1)
      If A(i) <> "" Then
         If AOA = "与" Then
           strWhere = strWhere & "([题名]&[责任者]&[档号] Like '*" & A(i) & "*') and "
         End If
         If AOA = "或" Then
            strWhere = strWhere & "([题名]&[责任者]&[档号] Like '*" & A(i) & "*')  or "
         End If
      End If
   Next
是以 Split( ... , " ") 把 空格分开的字作查询的, 基本上不符合我们的要求! 不过这段代码写得非常简洁, 在这种要求下, 是执行得非常快速的, 好代码!

而在 煮茶 的代码中
m = -1
i = 0: j = 0
Do While i <= Len(str)
    i = i + 1
    For j = Len(str) - (i - 1) To 1 Step -1
        s = Mid(str, i, j)
        Debug.Print s
        If DCount("*", tbname, Fieldname & " Like '*" & s & "*'") > 0 Then
            m = m + 1
            ReDim Preserve AA(m)
            AA(m) = s
            i = i + (j - 1)
            Exit For
        End If
    Next
Loop
使用了递归遍历字符串作查询的, 这正是所有搜索引擎第一代的查找词组的方式!
先不论找不到词语时的出错, 我输入了 "可以给我智慧加分" , 便在数据库查询了
1.
可以给我智慧加分
可以给我智慧加
可以给我智慧
可以给我智
可以给我
可以给
可以
2.
给我智慧加分
给我智慧加
给我智慧
3
加分

我发现当找到了"给我智慧"后, i = i + (j - 1) 便没有再找 给我 或 智慧了!
同样我输入 "怎样辩别"  找到后, 其他有 "怎样" 的标题便没有出来了!

里面是没有判断什么时候用 And 或用Or 的,但And/Or 后就就牵涉排序问题的了!

不过当然这也要说到, 本身需求是否需要的! hope678 原始需求只是分开搜寻文字就可以了,没要求任何效果或排序的,也没讲究多少人操作多大的数据量的,这版本确实是满足项目要求,可以收钱的了!

我原来跟  hope678 说要编这个部份, 这个智慧本来就是很困难的事,

  1. 字典在哪? 以数据本身来做字典是好的, 因为用户本来就是想查询这些数据, 但若我们的数据量庞大, 要比对的字段较多时, 如法律案例数据库, 合同数据库等, 这个查询语句的分析便耗上了很大的资源. 
  2. 智能在哪?
    a) 以上的断字检查要快就可能忽略了些可能性, 要做足所有可能性, 执行便可能慢下来了!一切都有代价的. 
    b) 可能性多时, 是否把 "他杀我挡"  变为 "*他杀*" + '*杀我*" + "*我挡*" 都要搜出来呢?
    c) 那些意义比较低的字 如 "的", "呀", "啊" 要不要忽略呢? 忽略掉, 想要的结果的排序便会更高! 
    d) 名词与动词的组合运用呢? 
    e) 专有名词如 "微软件计工资" 要不要查 "软件" 出来呢?  
    f) 排序的顺序呢? 拆分后整句搜出来的当然排头了, 但拆了三个出来, 有两个符合条件的肯定要跟在后面, 但哪两个优先?
    等等... 一系列的智慧.

聊天记录中我只是表达, 要考虑那么多条件, 想几句表达式, 或一段代码能造出来, 简直是天荒夜潭!

我没有批判过任何人, 不过也喜欢任何人的批判!  集体智慧才能出来的!

所以, 我们要了解每一个搜寻器其实都有一个运算核心, 为我们服务的! 我们感觉不到的, 我们只知道搜寻结果在不到一秒钟内就出来了! 为何?  因为他们的工作, 他们的价值就在这里!  Yahoo 十几年来都在更新他们的智慧, 包括 言辞辨别功能, 常用词汇比对, 专用词汇比对, 还有另一组人把用户的搜寻字作是否常用字的评分, 镜像服务器? 比对负荷分配机制? 还有一大堆我都说不出的智慧呢!   各个搜寻器都在纷纷赶往云计算了, 不就是因为快, 存量大!


我从不妄想我会编一个比他们更利害的搜寻器, 我们能创造的, 不就只是几句到几百句的搜寻字分析器出来! 所有项目都是按要求做事的, 真的要做哪一个要求, 就做那一个层次的事, 有要求也能给得起钱, 我也能研发一个世上最好的搜寻器出来的!  现在我老实说, 我不敢!

 

世界电脑发展就是朝着一个方向发展的, SaaS , Software as a Service.  人家研发了的智慧, 我们只能享用, 已经不伦到我们去开发的了!  1986年 我还在编写我自只打印图表的代码,  用ESC语言, 直驱EPSON LX80 打印机打印图案! 今时今日哪有人用得着? 查询语句, 早晚会变成一个网上的 Service,  ERP Service已经有, 下一步, 人面辨识, 语音辨识, 地图, 亦会成为Service, 再下一步, 15-20年间, 道得标准亦会上线, 法律标准.

 

今天, 当我们有这样输入一串字就要我们智能分拆的需求时,
我们怎么调用Baidu, Google, Yahoo, 微软 等的云计算, 去估计用户想搜寻的东西是什么?
(其实, 我们目的是省掉 关键字的分析器 所耗用的资源)
很简单, 就是直接使用他们的结果! 

 

上传的动画, 是在我本机生成的, 但肯定在一台 200Mhz 主频 64M内存的电脑运行下能达到同样速度,
因为是从百度拿下来的词汇拆分数据, 还有建议相关的搜寻关键字.

 

代码如下:


Private Sub ParseSearchText(SrchTxt As String, sKeywords(), sOtherwords(), pages As Long)
Dim d As IHTMLDocument
Dim PageURL() As String

'Pages --------------- 设置读入多少搜索页

If Not GoNavigate("http://www.baidu.com/s?wd=" & LTrim(RTrim(SrchTxt))) Then
    MsgBox "...网络错误!", vbExclamation
    Exit Sub
End If

Set d = Me!WB.Document

If Not d Is Nothing Then
   
    Set ele = d.all("rs") '----------- 取得相关搜索字
    Set anchorlist = ele.all.tags("A")
    ReDim sOtherwords(anchorlist.length - 1)
    n = 0
    For Each ele In anchorlist
        sOtherwords(n) = ele.innerText
        n = n + 1
    Next
   
                                      '-----------取得分页连接
    On Error Resume Next
    Set pg = d.all("page")

    tagName = "": tagName = pg.tagName
   
    If tagName = "P" Then
        Set anchorlist = pg.Children.tags("A")
        X = 0
        ReDim PageURL(anchorlist.length - 1)
        For Each anchor In anchorlist
            PageURL(X) = anchor.href
            X = X + 1
        Next
    End If
    If UBound(PageURL) + 1 < pages Then pages = UBound(PageURL) + 1
   
    currpage = 1
    keyfound = 0
    ReDim sKeywords(300)
    Do While currpage <= pages             '循环每一页
        For Each ele In d.all.tags("em")
            NeedAdd = True
            For X = 1 To keyfound
                If sKeywords(X - 1) = ele.innerText Then NeedAdd = False: Exit For
            Next
            If NeedAdd Then
                sKeywords(keyfound) = ele.innerText
                keyfound = keyfound + 1
            End If
        Next
       
        'ReDim PageURL(anchorlist.length - 1)

        If currpage < pages Then
            If Not GoNavigate(PageURL(currpage - 1)) Then
                MsgBox currpage & " 网络错误! ", vbExclamation
                Exit Do
            End If
        End If
        currpage = currpage + 1
    Loop
   
End If
End Sub


Private Function GoNavigate(url As String)   '---------- 取页面函数, 最多等待5秒
GoNavigate = True

Me!WB.Navigate (url)
st = Now()
Do While DateDiff("s", st, Now()) <= 5
    SendKeys "{BS}", True   '-------- VBA 没有 Wait 指命, 用SendKeys 来代替
    If WB.ReadyState = READYSTATE_COMPLETE Then Exit Do
Loop
If WB.ReadyState <> READYSTATE_COMPLETE Then
    GoNavigate = False
End If
End Function


Private Sub cmdQry_Click()  ' 窗体的查询按钮
Dim a(), b() 

ParseSearchText LTrim(RTrim(Me!Txt)), a(), b(), 2  ' 2 为搜寻至Baidu 的第2个页面, 越多越慢

Me!Text5 = Join(a, vbCrLf)
Me!Text7 = Join(b, vbCrLf)

End Sub



Access软件网QQ交流群 (群号:483923997)       Access源码网店

常见问答:

技术分类:

相关资源:

专栏作家

关于我们 | 服务条款 | 在线投稿 | 友情链接 | 网站统计 | 网站帮助