Fuzzy Logic Dot Net Fuzzy Word Experiment






3.33/5 (13投票s)
2003年8月20日
8分钟阅读

85637

1879
用模糊逻辑处理单词的尝试
引言
Fuzzy Word Experiment 项目顾名思义,是一个旨在以模糊的方式处理单词的实验。鉴于单词本身在某种程度上就是一个模糊的领域,我认为它们可能非常适合进行模糊化处理。
详细说明
第一个想法是为单词赋予一个值,然后像处理模糊数字一样使用这个值(请参阅之前关于模糊数字解释的文章)。值将是单词的数量,并设置最小值和最大值,以便能够判断单词是否匹配。
double dValue = 0;
for( int i=0; i<strWord.Length; i++ )
{
dValue += strWord[ i ];
}
上面的代码是为单词赋值的代码部分,这只是字母 ASCII 值之和。曾一度还会乘以它们在单词中的位置,但这并不能解决不同单词得到相同数字的问题,它只略有帮助,但没有解决根本问题。
例如,“glass”(玻璃)这个词读数为
Fuzzy Word = glass
Maximum = 548
Minimum = 528
Membership = 1
Compared membership = 0
Number = 538
ID = 0
Name =
读数中最重要的部分是 Number 变量,其读数为 538。当我们将其与单词“sheep”(绵羊)进行比较时,我们会遇到一个问题。
Fuzzy Word = sheep
Maximum = 543
Minimum = 523
Membership = 1
Compared membership = 0
Number = 533
ID = 0
Name =
正如您所见,“sheep”(绵羊)这个词的数字是 533,这意味着无论如何比较这两个单词,它们的值总是落在对方单词的最小值和最大值范围内,从而使它们具有很高的可能性,即如果仅涉及数字,则代码运行的比较会将这两个单词视为几乎相同。
第二个想法基于单词中的实际字母,其原理大致如下:如果单词中有一定数量的字母在正确的位置,那么输入这些单词的人很可能想输入同一个单词,但可能犯了拼写错误。因此,计算单词中匹配的字母数量,使用,
int nCount = 0;
for( int i=0; i<Word.Length; i++ )
{
if( i < Word.Length && i < comparison.Length )
{
if( Word[ i ] == comparison[ i ] )
{
nCount++;
}
}
}
这给出了正确位置的字母数量。但这又会导致单词长度的问题。假设有两个单词,一个是短单词,比如四五个字母长,另一个是长单词,但长单词包含短单词。如果短单词是 Fuzzy Word 对象,那么上面的代码会放行长单词。为了帮助解决这个问题,代码会处理最大错误字母数和最小匹配字母数。不幸的是,拥有最少匹配字母数的概念本身并不能完全奏效。问题在于有些单词就是很短,如果这个值设置得太高,短单词就会被自动拒绝。因此,出于这个原因,这个值必须保持得相当低,在代码中默认为 3。
拥有最大错误字母数的概念确实有所帮助,因为只要单词中有一定数量的字母是正确的,那么就有一定数量的字母可以出错。超过这个数量,单词就会被自动拒绝。但同样,最大错误字母数不能设置得太高,否则会完全屏蔽掉短单词。
这就是我们回过头来处理每个单词的数字值的地方。此时,我们有一个单词,它最多只有几个错误的字母,但有足够的正确字母可以通过。那么我们该如何处理它们呢?因为我们仍然需要给它一个会员资格值,以表示单词与我们正在测试的单词的比较。这是通过代码实现的,
FuzzyWord temp = new FuzzyWord( comparison );
/// set the membership value
if( dValue >= this.Number - nValueDifference &&
dValue <= this.Number + nValueDifference )
temp.ComparedMembership = 1.12;
else if( dValue >= this.Number - ( nValueDifference * 2 ) &&
dValue <= this.Number + ( nValueDifference * 2 ) )
temp.ComparedMembership = 1.25;
else if( dValue >= this.Number - ( nValueDifference * 3 ) &&
dValue <= this.Number + ( nValueDifference * 3 ) )
temp.ComparedMembership = 1.37;
else if( dValue >= this.Number - ( nValueDifference * 4 ) &&
dValue <= this.Number + ( nValueDifference * 4 ) )
temp.ComparedMembership = 1.50;
else if( dValue >= this.Number - ( nValueDifference * 5 ) &&
dValue <= this.Number + ( nValueDifference * 5 ) )
temp.ComparedMembership = 1.63;
else if( dValue >= this.Number - ( nValueDifference * 6 ) &&
dValue <= this.Number + ( nValueDifference * 6 ) )
temp.ComparedMembership = 1.75;
else
temp.ComparedMembership = 1.87;
它将要比较的单词的值与数字加上或减去预设值(默认为 10 的 nValueDifference
)进行比较。这使我们能够根据比较得出结论,该结论由代码返回给调用程序,保存在 ComparedMemerbership
成员中。
当然,这并不能阻止“duck”(鸭子)和“suck”(吸吮)这两个词被视为几乎相同,这很好,因为它们确实非常相似。但它确实能区分它们,所以当与“duck”(鸭子)比较时,“suck”(吸吮)不会返回 1.0 的比较会员资格,这表示直接匹配。
测试类
示例代码提供了两个应用程序。第一个用于直接比较单词以查看是否有匹配项,第二个将处理一个文本文件,搜索预先指定的单词。
Fuzzy Word Test Program (FuzzyWordExperiment 项目) 比较输入的两个单词。在本例中,比较的是“sheep”(绵羊)和“Sheeps”(我知道它应该拼写为 Sheep's),并给出这两个单词的比较会员资格值。请记住,在比较单词时,比较的应该是 Compared membership 值,因为单词的会员资格值始终为 1.0。
“Show Word”(显示单词)按钮将显示左侧编辑框中单词的值,“Compare”(比较)按钮将调用 Fuzzy Word Compare 函数,使用提供的两个单词进行比较。
第二个 Fuzzy Word Test 应用程序采用一个 txt 文件,逐行解析文本,查找“Words to find”(要查找的单词)下拉列表框中指定的单词。可以通过输入单词并单击“add”(添加)按钮将其添加到框中,通过选择单词并单击“remove”(移除)按钮将其移除。用于容差级别的两个下拉列表框设置了上限和下限容差级别,范围从 0.12 - 0.87 和 1.12 - 1.87。
“Find The Words”(查找单词)按钮会打开文本文件,逐行读取,将行中的每个单词与“words to find”(要查找的单词)列表中的单词进行比较。如果行中找到的单词在列表中,则程序会将找到的结果输出到编辑框,然后继续处理下一行文本。应注意,我们目前只处理单独的文本行,而不是完整的句子。
正如您从上图所见,我们在“Origin Of The Species”(物种起源)文本文件中进行搜索(该文件包含在程序的调试目录中,以便您可以随意尝试示例代码)。在上图中,只有一个项目未能通过容差级别,那就是单词“dusky”(昏暗的)。它有三个字母包含在单词“duck”(鸭子)中,但它失败了,因为它的容差级别是 1.87,这超出了本次程序运行设定的容差级别。
代码中还有更多特定于单词的方面,用于处理遇到单词时的一些问题。例如,类包含一个存储标点符号的数组,因此如果您有一个单词“duck”后面跟着一个逗号,那么读取代码会将其识别为单个单词,但比较代码会移除逗号。请参见代码,了解包含的其他标点符号。
此外,还添加了代码以允许处理您要查找的单词的复数形式,但这有一个可选参数,因此如果您希望“ducks”(鸭子,复数)被视为与“duck”(鸭子)完全不同的单词,那么它也可以。
最后
对我而言,这至少是一次有趣的实验,让我思考在什么程度上可以处理单词,而无需进入语境的情况,我的意思是,在必须开始理解单词本身含义之前。我对如何进一步发展这一点有很多想法,但这些想法可能太愚蠢而无法实现,或者太难实现。我想我只能继续尝试,看看会发生什么。
历史
-
2003 年 8 月 20 日:初始发布。
注意
系列中的最后一篇文章包含库的最新代码。不会进行向后兼容的尝试,我将按我自己的意愿更改库。
下一篇文章链接
这是当前最新的文章。
参考文献
- Tom Archer ( 2001 ) C# 内幕,Microsoft Press
- Jeffery Richter ( 2002 ) Applied Microsoft .NET Framework Programming, Microsoft Press
- Charles Peltzold ( 2002 ) 使用 C# 编程 Microsoft Windows,Microsoft Press
- Robinson 等 ( 2001 ) 专业 C#,Wrox
- Bart Kosko ( 1994 ) 模糊思维,Flamingo
- Buckley & Eslami ( 2002 ) 模糊逻辑与模糊集导论,Physica-Verlag
-
Earl Cox ( 1999 ) 模糊系统手册,AP Professional