关闭

用Office玩中文分词

标签: officedelphiintegervbvbaforms
2955人阅读 评论(6) 收藏 举报
分类:

      Word软件对中文分词的支持还是相当不错的,最直观的感觉就是当用户在编辑一篇Doc文档时,Word会不断检测其拼写错误(包括英文单词和中文单词);不仅如此,您可能还留意到当用鼠标双击文档中的某一个字时,包含这个字的词会被自动选中。比如,我是中国人这句话,当您双击时,中国人这个词会被选中(双击也会有同样的效果)。这些迹象表Word是支持中文分词的,而且根据笔者使用office2003的经验,它的分词效果还挺不错。

  如果能在应用程序中调用Word的分词功能,岂不是很便利。于是,笔者就想做一个简单的实验,编个小程序试试。很自然就想到Word中的,以及"VBA"。首先点击录制宏,然后按Ctrl+A。我发现在Word的宏编辑器里生成一些VB代码,其中有个Selection对象,应该是代表选中区域,进步进一步摸索,发现Selection.Words就是我要的东西,它是将选中区域分词后得到的单词数组。除此之外,Selection还有很多属性及方法,比如Selection.Sentences是所有句子的数组。
       接下来把Word中零零散散的VBA代码移植到VB6.0中去。这个小程序的基本功能:在A框输入段文章,用户点击按钮后,在B框中输出分词后的效果,所有的词之间用空格隔开。
       VB代码如下:
 
Option Explicit
Dim wdapp As Word.Application
Dim doc As Word.Document

Private Sub Command1_Click()
    'On Error Resume Next
 
    Dim segwords As String
    Me.Command1.Caption = "正在执行..."
    Me.Command1.Enabled = False
       
   
    segwords = ""
    wdapp.Selection.HomeKey Unit:=wdStory
    wdapp.Selection.TypeText Me.Text1.Text
    wdapp.Selection.WholeStory
    Dim i As Integer
    For i = 1 To wdapp.Selection.Words.Count
        segwords = segwords + wdapp.Selection.Words(i) + " "
        DoEvents
    Next i
   
    wdapp.Selection.Delete Unit:=wdCharacter, Count:=1
    Me.Command1.Caption = "开始测试"
    Me.Command1.Enabled = True
    Me.Text2.Text = segwords
End Sub

Private Sub Form_Load()
    Set wdapp = New Word.Application
    Set doc = wdapp.Documents.Add
    wdapp.ActiveDocument.SaveAs "c://~ftemp.doc"
End Sub
Private Sub Form_Terminate()
    doc.Close
    Set doc = Nothing
    wdapp.Quit savechanges:=False
    Set wdapp = Nothing
End Sub

程序运行的效果如下图:

分词效果似乎还不差,但当笔者用较长的文章进行测试时,速度非常慢,和ICTCLAS分词不在一个量级上。开始我以为是VB的解释执行造成的,用Delphi改写后速度有所提升,但速度还是不理想。
Delphi代码如下:
 
unit Unit1;
 
interface
 
uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, ComCtrls, StdCtrls, Buttons,comobj;
 
type
 TForm1 = class(TForm)
    StatusBar1: TStatusBar;
    GroupBox1: TGroupBox;
    GroupBox2: TGroupBox;
    BitBtn1: TBitBtn;
    Memo1: TMemo;
    Memo2: TMemo;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure BitBtn1Click(Sender: TObject);
 private
    { Private declarations }
 public
    { Public declarations }
 end;
 
var
 Form1: TForm1;
 wdapp: Variant;
 doc:Variant;
implementation
 
{$R *.dfm}
 
procedure TForm1.FormCreate(Sender: TObject);
begin
    wdapp:=createoleobject('Word.Application');
    wdapp.visible:=false;
    doc:=wdapp.Documents.Add();
    wdapp.ActiveDocument.SaveAs('c://~ftemp.doc');
end;
 
procedure TForm1.FormDestroy(Sender: TObject);
begin
    doc.Close;
    wdapp.Quit(savechanges:=False);
end;
 
procedure TForm1.BitBtn1Click(Sender: TObject);
var
segwords : TStringList;
wdStory,wdCharacter : OleVariant;
i: Integer;
begin
    wdStory:=6;
    wdCharacter:=1;
    segwords:=TStringList.Create;
    self.BitBtn1.Caption:='正在执行';
    self.BitBtn1.Enabled:=false;
    wdapp.Selection.HomeKey(wdStory) ;
    wdapp.Selection.TypeText(self.Memo1.Lines.Text);
    wdapp.Selection.WholeStory ;
    for i:=1 to wdapp.Selection.Words.Count do
    begin
      segwords.Append(wdapp.Selection.Words.Item(i));
    end;
    wdapp.Selection.Delete(wdCharacter,1);
    self.BitBtn1.Caption:='开始测试';
    self.BitBtn1.Enabled:=true;
 
    self.Memo2.Text:=segwords.Text;
end;
 
end.
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:235778次
    • 积分:3773
    • 等级:
    • 排名:第8791名
    • 原创:118篇
    • 转载:15篇
    • 译文:0篇
    • 评论:232条
    文章分类
    最新评论