2007年6月9日 星期六

用C#及Interop取出Office同義字資訊

感謝Interop,讓我們能再利用ms office中的超炫功能,在開發研究專案時需要能取得同義字,以往都是使用Wordnet,但我發現Wordnet中的同義字分的太細了,例如good及nice在wordnet就不算同義字。而手邊也沒有現成可供程式讀取的字典,所以就開始打MS office 中同義字功能的腦筋。在搜尋網路上相關的文章後,發現也很少人在研究這個問題,以下是一篇不錯的討論,
Unable to cast object of type 'System.String[*]' to type 'System.String[]'.
我也以這篇為基礎用C#寫了以下測試程式,列出hard這個字的同義字:


using System;
using System.Collections;
using System.Text;

//記得先在Visual Studio的方案總管中加入參考,
//這個參考位於COM標籤中
//的Microsoft Word 11.0 Object Library (Office 2003的狀況)
using Microsoft.Office.Interop.Word;

namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
try
{
ApplicationClass AC = new ApplicationClass();

object LangID = WdLanguageID.wdEnglishUS;
// 沒試過其他語言,將來有機會再試試

SynonymInfo SI = AC.get_SynonymInfo("hard",ref LangID);

IEnumerable PartOfSpeechList = (IEnumerable)SI.PartOfSpeechList;
// 不可以直接轉換為int[],原因請參考上述的討論連結
// 取出hard這個字的詞性代號,如形容詞是0,副詞是2
// 因為hard的形容詞同義字有四種意思,副詞有一種
// 所以列出來是 0 0 0 0 2

foreach (int p in PartOfSpeechList)
Console.Out.WriteLine(p);

// 試了幾個字,大部分都沒有相關字
IEnumerable RelatedWordList = (IEnumerable)SI.RelatedWordList;
foreach (string r in RelatedWordList)
Console.Out.WriteLine(r);

// 如前述,有五個意義
IEnumerable MeaningList = (IEnumerable)SI.MeaningList;
foreach (string m in MeaningList)
{
// 在MeaningList裡的是同義字的第一個字
Console.Out.WriteLine("-----" + m + "-----");
// 要利用這個字去取出所有同義字
object m1 = m;
IEnumerable SynonymList = (IEnumerable)SI.get_SynonymList(ref m1);
foreach (string s in SynonymList)
Console.Out.WriteLine(s);
}
}
catch (Exception ex)
{
Console.Out.WriteLine(ex.Message);
}
Console.Out.WriteLine("Done");
}
}
}


利用以上程式,在配合上詞性判斷程式,應該就可以取出較為一般人所接受的同義字了。

沒有留言: