李亮1975重庆
语料库快乐军政委
孟庭苇《网上有些词做的云》:VBA之小试牛刀
她唱道……
风中有朵雨做的云,网上有些词做的云,
云的心里全都是词,滴滴全都是编程,
词在眼前变换了形,不知又将吹向哪儿去。
“词云”的初相识:http://media.people.com.cn/GB/22100/61748/61749/4281906.html
多个美国总统就职演讲的“词云”对比:
http://www.readwriteweb.com/archives/tag_clouds_of_obamas_inaugural_speech_compared_to_bushs.php
美国政府网站“usa.gov”所涌现出来的73个关键词的“词云”效果:
http://www.usa.gov/About/Americans_Minds/word_cloud.shtml
体验网址1号:http://tagcrowd.com/
体验网址2号:http://www.wordle.net/
体验网址3号:http://www.tocloud.com/
体验网址4号:http://www.tagxedo.com/
云,有大小不同,有色彩斑斓,有奇形怪状;
词云,是对一个语篇或一系列语料甚至一个语料库的整体上的某种词汇趋势或某种语言模式的可视化呈现,往往体现为颜色差异性,字体差异性,聚汇模块性,形状多变性;
词云,是词的聚合,通常过滤了虚词而呈现了实词,甚至实词按照词形变化或语义相似而成团成堆;
词云,在国内尚无在线服务,在国外已有较多在线生成的网站,皆免费;
词云不是IT界正在热炒的“云计算”,而是“语料蕴藏的信息规律的云状计算或云状呈现”。
以下是VBA(Visual Basic for Application)编程语言所实现的最肤浅最便捷的“类似词云的效果”的源代码……
Sub 词长型词云()
For counter = 1 To ActiveDocument.Words.Count - 1
ActiveDocument.Words(counter).Font.Size = 10 + ActiveDocument.Words(counter).Characters.Count * 4
Next
End Sub
Sub 随机字号型词云()
For counter = 1 To ActiveDocument.Words.Count - 1
ActiveDocument.Words(counter).Font.Size = 10 + Int(50 * Rnd())
Next
End Sub
Sub 随机色彩型词云()
For counter = 1 To ActiveDocument.Words.Count - 1
ActiveDocument.Words(counter).Font.ColorIndex = Int(16 * Rnd())
Next
End Sub
Sub 随机字号与色彩型词云()
For counter = 1 To ActiveDocument.Words.Count - 1
ActiveDocument.Words(counter).Font.Size = 10 + Int(50 * Rnd())
Next
For counter = 1 To ActiveDocument.Words.Count - 1
ActiveDocument.Words(counter).Font.ColorIndex = Int(16 * Rnd())
Next
End Sub
Sub 清除所有格式()
Selection.WholeStory
Selection.ClearFormatting
End Sub
国外的在线的词云网站一般是根据词频来进行字体大小与字体颜色的自动生成的,上面的VBA源代码为了最简单地演示词云的计算过程,采用了随机数值来代替词频高低。“词长型词云”就是单词的字体大小是单词的字母多少决定的,字母越多的单词的字号就越大,字母越少的单词就字号就越小。“随机字号型词云”就是每个单词的字号是随机数值确定的,而本例中为了保障基本字号,就设定了10为基础值,然后加上一个0到50之间的随机整数。“随机色彩型词云”就是以VBA语言的内置的16种颜色为随机变化的取值范围而随机赋予每个单词一个颜色,当然也包括了白色,所以,当字体颜色为白色的时候就跟背景白色重合了,所以就看不到这个单词了,这个效果也可以视为本演示代码的一个小小遗憾了。
附件中提供的“网上有些词做的云.doc”,就是已经内置了上面的VBA源代码了,你下载打开这个Word文件之后,就看到“I fell in love with corpus linguistics some years ago.”,是五颜六色和每个单词的字号都忽大忽小的,这个Word文件的菜单顶部有5个按钮:词长型词云,随机字号型词云,随机色彩型词云,随机字号与色彩型词云,清除所有格式。你需要什么效果,你点这五个按钮之一就行了。
如果你点击上面的五个按钮的时候,弹出一个对话框,提示你“由于宏安全设置,无法找到宏或宏被禁止”,就说明你当前的Word的“宏安全”的级别处于“高”或“非常高”,你就需要降低“宏安全级别”到“低”,然后关闭当前的Word文件之后,重新打开这个Word文件,就能毫无障碍地运行上面的五个按钮了。见下图:
---------- 点击“安全性”,就会看到如下 ---------------
如果你的Word 2003的“宏安全级别”当前是“中”,那么你就会在启动整个Word文件的时候,看到如下提示:
那么,你要选择“启动宏”,才能继续运行那“五个云按钮”哟。
至于“宏病毒”,那只是1997年前后的事了,不必担心,现在的杀毒软件都能轻松地发现歼灭的,我们一般人利用VBA写出的“小工具”都是“reliable”而不是“malicious”了。
如果你希望再阅读一份类似的VBA的牛刀小试的实例,可点击以下链接,是我在本站的另一个主题下的回帖《VBA开发的小型语料标注标签清除工具(Word文件形式)》
http://www.corpus4u.org/forum/showpost.php?p=44538&postcount=8
如果你一下子变得有点激动,决定走上“语料库之VBA编程”之路,可以阅读我在本站的另一个主题下的回帖《学好VBA的门径与利弊》
http://www.corpus4u.org/forum/showpost.php?p=44546&postcount=12
在你掌握了简洁而高效的VBA对语料的各种字符串操纵之后,其实你只是牢牢地站在了我李亮个人认为的“语料库编程能力的第一层:字符串编程”,这一层功夫的内容是:字符串的各种识别(包括乱码识别)与转换与批量处理(包括颜色呀字体呀的自动排版),也包括txt文件的读写,也包括对unicode与ansi与utf-8这样的最常见的文字编码的概念知识与VBA操纵。
在此之上,你提升能力的话,就是我李亮个人认为的“语料库编程能力的第二层:数据库编程”,这一层功夫的内容是:用VBA调用各种你自己建立或别人建立的标准的语言信息数据库,例如词频数据库,近义词数据库,词性数据库,GRE词表数据库,语法变形数据库,词汇派生数据库,释义数据库,句法特征数据库,专业术语数据库等等。可见,第二层功力就能用VBA做词性自动分析器呀,句法分析器呀,术语识别与提取器呀,词汇难度分析器呀,反剽窃器呀,这样丰富的产品线的东西了哟。
在此之上,就是“语料库编程能力的第三层:互联网编程”,这一层的内容是:用VBA所内置的对HTML和XML的操纵能力,进行语料网页的批量抓取和页面局部信息的针对性提取,也算是“Web as Corpus”的一种基本的编程实践了。可见,VBA竟然摇身一变成了“语料批量收集的瑞士军刀”了。我在优酷网有一个这方面的视频教程《比迅雷更强大的Word下载语料与转换语料之宏动作》,持续51分钟,讲解缓慢易懂,看了就觉得不遥远了……
http://v.youku.com/v_playlist/f5427313o1p4.html
VBA对网页HTML的操控主要是通过“WebBrowser”这个控件而执行的,可以浏览微软官方的在线指南而有所了解……
http://msdn.microsoft.com/en-us/library/aa752043(v=VS.85).aspx
VBA对网页HTML的页面内的元素操控则主要通过“IHTMLDocument2”这个接口而进行,可以浏览微软官方的在线指南而有所了解……
http://msdn.microsoft.com/en-us/library/aa752574(v=VS.85).aspx
VBA对XML文件的元素操控则主要通过“XMLNode”这个接口而进行,可以浏览微软官方的在线指南而有所了解……
http://msdn.microsoft.com/en-us/library/microsoft.office.tools.word.xmlnode.aspx
在Office Word的VBA编程的编辑器中,也具备了各种常用的可视化编程控件呢,什么按钮呀,什么文本框呀,多选框呀,图片框呀,多标签页呀,都有的。你可以在一个Word文件内部制作出多个窗体userform哟,每个窗体上都可以添加出多种控件哟,然后你仅仅写一行代码“userform1.show“就能将userform1这个名称的窗体进行运行,然后你仅仅写一行代码“userform1.hide”就能将userform1这个名称的窗体进行隐藏,很方便!
VBA对磁盘文件系统的操控也是看一眼就懂的。例如:
kill("d:\1.doc") 这是删除d盘根目录的1.doc这个文件;
kill("d:\*.doc") 这是删除d盘根目录的所有的doc文件;
filecopy("d:\1.jpg","e:\2.jpg") 这是把d盘根目录的1.jpg拷贝一份到e盘根目录且命名为2.jpg;
filelen("d:\tools\good.rar") 这是查询d盘的tools文件夹的good.rar这个文件的体积为多少字节;
mkdir("e:\books") 这是在e盘新建一个books文件夹;
rmdir("f:\corpus") 这是删除f盘的corpus文件夹;
VBA对单个txt文件的“写操作”也是简洁。例如(在d盘新建一个1.txt,然后写入一句话“I love corpus linguistics.”):
Sub 输送一句话到txt文件()
Open "d:\1.txt" For Output As #1
Print #1, "I love corpus linguistics."
Close #1
End Sub
VBA对单个txt文件的“读操作”也是简洁。例如(从d盘的1.txt读取第一个自然段到string1这个变量,然后弹出一个对话框把第一个自然段的内容呈现出来):Open "d:\1.txt" For Output As #1
Print #1, "I love corpus linguistics."
Close #1
End Sub
Sub 从txt文件读取第一自然段()
Open "d:\1.txt" For Input As #1
Line Input #1, string1
Close #1
MsgBox string1
End Sub
VBA对字符串的任意摆布也较为强大,具有较丰富的字符串函数,例如:长度计算,子串查找,大小写变换,左侧截取,右侧截取,中段截取,两侧空格剔除,子串替换,字符串逆序排列,ASC值计算,Unicode值计算,自动拆分字符串,自动合并字符串,等等。如果我们想要把当前打开的一个Word文件的所有自然段之中含有against这个单词的自然段都提取出来,发送到d盘的1.txt文件,那么,VBA源代码也就是:Open "d:\1.txt" For Input As #1
Line Input #1, string1
Close #1
MsgBox string1
End Sub
Sub KWIC提取的基本效果()
Open "d:\1.txt" For Output As #1
For counter = 1 To Paragraphs.Count
If InStr(1, Paragraphs(counter).Range.Text, "against") > 0 Then
Print #1, Paragraphs(counter).Range.Text
End If
Next
Close #1
End Sub
VBA的数据库编程是调用DAO技术或ADO技术(它比DAO要新一些),它俩都能访问Access的MDB数据库文件或者通过ODBC而访问微软公司的其他类型的数据库。例如,我们有一个“lexicon.mdb”与我们的一个Word文件放在同一个文件夹,这个mdb数据库含有“表1”,而“表1”中有“单词词形”和“单词释义”这两个数据字段,已经存入了足够多的数据记录内容了。那么,我们希望在这个Word中写入一些VBA代码来实现对当前我们用鼠标选中的英语单词的弹出消息对话框方式的自动查询,如果查不到单词释义则弹出“没有查到该单词!”的消息框。那么,我们可以在Word文件中写入以下的VBA源代码:Open "d:\1.txt" For Output As #1
For counter = 1 To Paragraphs.Count
If InStr(1, Paragraphs(counter).Range.Text, "against") > 0 Then
Print #1, Paragraphs(counter).Range.Text
End If
Next
Close #1
End Sub
Sub 数据库_查询被选单词的释义()
Dim db1 As DAO.Database
Dim set1 As DAO.Recordset
Set db1 = OpenDatabase(ActiveDocument.Path & "\lexicon.mdb")
Set set1 = db1.OpenRecordset("select * from 表1 where 单词词形='" & Trim(Selection.Text) & "';")
If set1.RecordCount <> 0 Then define$ = set1.Fields("单词释义").Value
If set1.RecordCount <> 0 Then MsgBox define$ Else MsgBox "没有查到该单词!"
set1.Close
db1.Close
Set set1 = Nothing
Set db1 = Nothing
End Sub
可见,数据库VBA编程也并非需要什么数学知识或需要什么理工科的思维能力,只不过是按部就班地掌握了“相关功能的调用指令的套路化写作”而已。Dim db1 As DAO.Database
Dim set1 As DAO.Recordset
Set db1 = OpenDatabase(ActiveDocument.Path & "\lexicon.mdb")
Set set1 = db1.OpenRecordset("select * from 表1 where 单词词形='" & Trim(Selection.Text) & "';")
If set1.RecordCount <> 0 Then define$ = set1.Fields("单词释义").Value
If set1.RecordCount <> 0 Then MsgBox define$ Else MsgBox "没有查到该单词!"
set1.Close
db1.Close
Set set1 = Nothing
Set db1 = Nothing
End Sub
附件
Last edited: