我写了一个英语方面的软件,其中有一个功能是要查找相似的单词(包括词形或词义)。并且要把两个单词的相似程度表示出来(用于排序或者自定义需要的相似程度等等)。
就这个相似程度的规定,我想在很茫然,不知道如何规定是好。我想这个相似应该不只是简单的一段的匹配。比如说,单从词形上讲,aaab和aada词形很像,而aaab和aaba应该更像。我能预想到的类似的不好判断的地方很多。我实在想不出一个很好地衡量尺度。而且,即使确定了衡量尺度,如何很高效的实现代码我也没想通。不知道会不会有相关这方面的书籍,如果有是最好了。
希望高手们多多指教!不管你的想法是什么,请你告诉我,多谢!

解决方案 »

  1.   

    随便说说: 是不是可以用某个字符在单词中的出现频率来作为规则之一..
    比如 aaab 和 aaba  
    找出两个字符串中的相同字符..
    两个字符窜 有字母 a b 组成..a在字符串1 中出现的频率为3次 b为1次 在字符窜2中 a为3次 b为1次.
    那么相似度 S我们规定他为 a的相似度+b的相似度 4/4 + 1/1 =2
    aaab 和 aada 
    a相似度  3/3  b: 0/1  d: 0/1  整体相似度     3/3+0/1+0/1 =1
    我们还可以找出单词的一些基本组成作为对比的基数 "ch" "sh" ...等等就用拆开.
      

  2.   

    还要用ASCII码了!
    "要在webbrowser控件内形成文件夹视图,怎么办?急死了!"
      

  3.   

    有SQL SERVER吗?
    SOUNDEX:返回由四个字符组成的代码 (SOUNDEX) 以评估两个字符串的相似性。
    DIFFERENCE:以整数返回两个字符表达式的 SOUNDEX 值之差。SOUNDEX 将 alpha 字符串转换成由四个字符组成的代码,以查找相似的词或名称。代码的第一个字符是 character_expression 的第一个字符,代码的第二个字符到第四个字符是数字。将忽略 character_expression 中的元音,除非它们是字符串的第一个字母。可以嵌套字符串函数。
      

  4.   

    to bu_wen:
    多谢,这个方法应该可以作为评判标准之一。to windindance:
    这么好的东西?!可惜俺没有:(
    能不能帮贴几个实例见识一下?比如说:
    like 和 alike 加了一个首字母
    some 和 same 只改变了一个字母
    back 和 black 多了一个字母
    abroad 和 aboard 调整了一个字母r的位置
    我想知道类似的情况的SOUNDEX代码是如何定义的。to 所有楼上的:
    非常感谢各位朋友的意见及关注!
      

  5.   

    想了下~
    觉得单词A和单词B相似程度大致可以分这几个方面:1、AB长度相同、只有n个单字不同
    和整字长度相比,n足够大时也就不相似了
    sex、six
    teeth、tooth2、A为B字串的子串
    前缀、后缀、合成词之类
    able、disable
    some、somewhat3、A内嵌入若干字符得到B
    place、palace
    pow、pillow4、其它
    基本应该就是以上情况的合成了……
      

  6.   

    查了下……soundex是判断音近不是形近啊~http://www.tuqiu.com/study/php4/php4gb/function.php-soundex.htm
      

  7.   

    Option ExplicitFunction CompareTXT(String1 As String, String2 As String) As Single
        Dim i, y, x As Integer
        Dim a, b As String
        String1 = UCase(String1) 'take this out If you
        String2 = UCase(String2) 'want it To be case
        'sensitive
        If String1 = String2 Then CompareTXT = 1: Exit Function
        'if the strings are
        'the same, don't
        'bother to waste time
        'and space on working
        'them out :).
        If Len(String1) > Len(String2) Then x = Len(String1)
        If Len(String2) > Len(String1) Then x = Len(String2)
        If Len(String1) = Len(String2) Then x = Len(String1)
        'find out the length
        'of the longest string
       For i = 1 To x
            a = Mid(String1, i, 1) 'get 1 character from
            b = Mid(String2, i, 1) 'each string and compare
            If a = b Then y = y + 1 'the characters
        Next
        CompareTXT = y / x
    End FunctionPrivate Sub Command1_Click()
    MsgBox CompareTXT(Text1, Text2) * 100 \ 1 & "%"
    End Sub
      

  8.   

    如果用SQL Server的话,我还是建议用SELECT DIFFERENCE('aaab', 'aaaaa')来判断,基本上能看出来字符串的相似程度,自行编一个函数很难保证高效。
      

  9.   

    可惜VB没有Delphi中的集合,可以用集合的求交集运算~
      

  10.   

    to AprilSong:
    很不错的方法哦!只是写起来有点困难,我会把它记着,以后再琢磨:)to all:
    非常感谢各位的指点,现在我已经写成了一个初步的相似度判断程序。
    后面可能还会碰到很多问题,我会继续向大家请教的:)先结贴了!