用ASP和Word实现对字符串的拼写检查zt

......

流氓党 - 流氓点孛尔帖赤那
注册
2002-02-26
消息
22,918
荣誉分数
0
声望点数
0
用ASP和Word实现对字符串的拼写检查

刘彦青 编译
2002-7-10 13:43:08

--------------------------------------------------------------------------------


简介
在我的网站上,由于单词拼写错误,50%的搜索查询不能返回相应的结果。然而,在Google这样的搜索引擎网站上,即使搜索字符串中有拼写错误,它也会给出一个有用的提示。也许读者会对在自己的网站上实现这样的功能有兴趣,在本篇文章中,我们将介绍一种服务器端解决方案,使用微软的Word提供拼写检查和为搜索引擎提供一个建议。
从本质上说,完成这样的功能的代码需要在服务器上打开一个Word对象,并将用户的搜索字符串提交给它,然后使用Word的校验功能返回提示的拼写纠正(如果有的话)。由于希望在服务器端完成这样的操作,因此我们不能使用Word的SpellCheck功能,因为它会打开一个消息框,等待用户确认该拼写纠正。在这里,我们需要使用SpellingErrors方法,该方法返回一系列的拼写错误及其提示。
在服务器端使用微软的Word在性能和安全方面会有一定的影响,在后面我们还将讨论这一问题。要使本篇稿子所介绍的代码能够有效地工作,我们必须将Word安装在Web服务器上,以便匿名的Web用户(IUSR_machinename)能够完成Word的自动化操作(这也将在后面进行讨论)。这一操作的性能将非常慢,对于较大的搜索字符串而言,可能会需要几秒钟的时间,因此我们应当考虑只在负载较小的Web服务器上使用这种方法。
使用Word进行拼写检查
要对用户的搜索引擎查询进行拼写检查,我们需要首先创建一个Word对象实例,代码如下所示:
Set objWord = CreateObject("Word.Application")
其次,我们必须在Word对象中创建一个文档,其内容为我们要进行拼写检查的用户的查询字符串。通过创建一个新的Word文档,并在文档中添加用户的查询字符串,我们就能完成上面的任务:
Set objDocument = objWord.Documents.Add
objDocument.Content = QueryText
(这里的QueryText是一个保存有用户查询内容的字符串型变量)
现在,我们要检查一下文档中是否有拼写错误。为了完成这一任务,我们需要调用SepllingErrors方法,该方法返回有拼写错误的词汇。Count属性表示有多少单词拼写有错误,因此,只要Count属性的值大于0,我们就知道查询输入中有拼写错误。
'束文档中单词的数量
NumberOfWords = objDocument.Words.count

'在文档中出现了几个有拼写错误的单词
NumberOfErrors = ObjDocument.SpellingErrors.Count

If NumberOfErrors = 0 Then
'There are no spelling errors...
Else
'There is at least one spelling error...
End If
如果有拼写错误的单词,我们要循环检查文档中的所有单词,以确定单词是否拼写正确。如果单词拼写正确,我们就显示一条它拼写正确的信息;否则,我们希望得到正确拼写(如果存在)的联想。要完成这样的任务,我们?简单地循环处理文档中所有的单词,看是否有拼写错误的单词,如果有拼写错误的单词,我们就调用GetSpellingSuggestions方法,返回有拼写错误的单词“联想的”拼写的一个集合。在这里,我们选择出现的第一个词条,提供给用户,作为重新输入搜索内容的“联想”。
If NumberOfErrors = 0 Then
'没有拼写错误
Else
'至少存在一个拼写错误
'循环处理文档中的每个单词
i=1
while i < NumberOfWords

'检查该单词是否存在拼写错误
if ObjDocument.Words(i).SpellingErrors.Count > 0 then
'存在拼写错误,检查是否存在“联想”条目
if objDocument.Words(i).GetSpellingSuggestions.count > 0 then
'如果存在一个或多个“联想”条目,则通过下面的语句选取第一个条目,提供给用户
'objDocument.Words(i).GetSpellingSuggestions.Item(1).Name
else
'该拼写错误的单词没有“联想”条目
end if
else
'该单词拼写正确
end if

i = i + 1
wend
End If

上面是所需要的代码。当然,如果要使上面的代码能够正常地运行,我们还需要正确地设置Word的安全设置。
要运行上面的代码,我们需要将Word安装在Web服务器上,并正确地设置其安全设置,这样的安全设置将允许匿名的互联网用户使用该服务器上安装的Word。关于如何设置Word的安全设置,在http://support.microsoft.com/defaul...一定阅读这篇文章。如果不能正确地设置其安全设置,上面的代码就不能正确地运行,并会出现一个“(0x800A175D) Could not open macro storage”(不能打开宏存储)的出错信息。通过实验发现,最好的方法是创建一个MSWordUser组帐户,并使IUSR_machinename成为其中的一个成员。另外,我们也可以对Word进行设置,使它能够和用户进行交互(设置比较快,但不大安全。)相关的资料可以参阅下面的文章:
http://support.microsoft.com/default.aspx?scid=kb;en-us;Q288366
性能分析
每请求一次ASP网页,Word都会打开和关闭,这种方法的代价很高。因此这种解决方案只适用于负载比较小的网站。在我们进行的非正式测试中,一旦对象创建完毕后(需要0.5-1秒),一般情况下,对由三个单词组成的输入字符串执行查找操作,其执行时间是0.5秒。
由于许多用户会使用相同的输入字符串进行查询,因此一个可能的优化方法是,如果一个输入字符串已经经过拼写检查并没有错误,则应当将它存储在一个数据库中。当用户进行查询时,可以快速地对该数据库表进行查找,以决定是否需要调用Word的拼写检查器。
结论
尽管在服务器端使用Word并不适合所有场合,但在一些情况下,在服务器端使用Office自动化操作还是非常有用的。只是有一点需要注意,在部署基于Office自动化操作的网站时,需要进行充分的测试。另外,还需要正确地设置相关的安全设置,使我们能够通过ASP网页中执行Office自动化操作。
 
后退
顶部