|
拜读了守柔版主大作“拼音居士”,高山仰止。就想做一些模仿。这篇帖子主要就是从一般的词语库中筛选Word可以识别的词语的。简单的说就是有的词语在Word中被认为是一个词语,如 阿波罗 ,有的词语被识别为多个词语,如 一字之差 我们做的就是从成万个词语中筛选出符合前一种情况的词语。
当然要在Word中处理了。(可能也有别的办法,请高手指教。)当然少不了循环,本贴主要解决的就是速度问题。
非常任务,利用Word整理词库。
今天的主要工作就是整理词库,从近30万词语中(包括重复的)筛选出Word可以识别近10万个词语。这项工作昨天就开始了。主要方法,就是没个词语一段,然后用vba判断每段的词语数即words.count ,如果等于2就是word可以识别的词语。发现在word中处理太多的就会导致速度非常慢。一次处理越少就越快。成千上万的词语对于耐心是一种考验。所以就需要多次的复制和粘贴。后来发现Word处理的一个小规律:
使用Word.ActiveDocument.Paragraphs (i)来读取和处理段落时,
for i=5000 to 4000 很慢而使用 for i=1000 to 1 两种相同数量的处理,速度却有天壤之别!改进了处理机制之后,速度提升很快,处理10000个词语平均用时200秒左右。详细代码:
'要求词语每个一行(一段)除了回车符,没有其他字符(一行只能有待处理的一个词语)
'词语中不能包含任何特殊格式(如拼音等)
'处理过的词语将保存在通目录的pinyin.txt中
'通过这个小程序,我们可以发现Word在循环处理方面的一个小窍门,处理的数字越小,速度越快
'所以如果允许,我们可以把处理过的东西删除掉,这样就保持了小数字的循环。
'处理过程中请必要切换程序,如果需要停止请按Ctrl+Break,然后还可以继续。
'请在Word主界面通过按钮运行该过程以便显示进度
'本机测试:
'windows XP office 2003 ,CPU 1.1G 内存 256M
'处理词语(段落):10000个
'其中包含Word可以识别的词语:3495个
'用时:t=50 214.406秒,t=100 201.937秒,t=200 262.656秒
Dim myP As Paragraph
Dim LL, I, T, S, C, Tt As Long
Dim myDic, myDDD As String
Dim myW, myPy As String
Word.Application.ScreenUpdating = False
LL = Word.ActiveDocument.Paragraphs.Count '用于计数
myDic = ThisDocument.Path & "\pinyin.txt" '保存文件
T = 100 ' 这是一个关键值,以100个为一组,可以自己修改数字越大,速度越慢。太小也不好,循环太频繁也影响速度。
Tt = VBA.Timer
StartC:
On Error GoTo Er '处理200以内的情况
For I = T To 1 Step -1
S = S + 1 '用于计数
Set myP = Word.ActiveDocument.Paragraphs(I)
myW = myP.Range.Text
myW = Left(myW, Len(myW) - 1)
Word.StatusBar = "正在处理: " & LL - S & Space(3) & myW '处理进度
If myP.Range.Words.Count = 2 Then
C = C + 1
WritePrivateProfileStringByKeyName "拼音", myW, "1", myDic '使用api函数写入文本,可以保证无重复的情况
End If
myP.Range.Delete
Next
Word.ActiveDocument.UndoClear
If Word.ActiveDocument.Paragraphs(1).Range.Words.Count > 1 Then GoTo StartC '如果没有处理结束,继续下一组
Word.Application.ScreenUpdating = True
Word.ActiveDocument.Content.InsertAfter "处理词语(段落):" & LL & "个" & vbCrLf & _
"其中包含Word可以识别的词语:" & C & "个" & vbCrLf & _
"用时:" & VBA.Timer - Tt & "秒"
Exit Sub
'设置T为实际段落数,继续处理
Er:
T = Word.ActiveDocument.Paragraphs.Count
GoTo StartC
End Sub |
|