2012-03-06 88 views
8

我最近開始使用本體,我使用Protege構建一個本體,我也想用它來自動分類字符串。下面說明了一個非常基本的類層次結構:基於本體的字符串分類

String 
|_ AlphabeticString 
    |_ CountryName 
    |_ CityName 
|_ AlphaNumericString 
    |_ PrefixedNumericString 
|_ NumericString 

最終像Spain字符串應該被歸類爲CountryNameUE4564將是一個PrefixedNumericString

但是我不確定如何建模這些知識。我必須首先定義一個字符是否是字母,數字等,然後從現有字符構造一個字或者是否有使用正則表達式的方法?到目前爲止,我只能根據像String and hasString value "UE4565"這樣的確切短語對字符串進行分類。

或者在本體中爲每個類安全使用正則表達式然後使用這些正則表達式對Java中的字符串進行分類會更好?

回答

2

我對Protege沒有任何瞭解,但是您可以使用正則表達式來匹配大多數這種情況。唯一的問題是區分國家和城市名稱,我不知道如果沒有一個完整的名單你怎麼能做到這一點。

這裏有一些表情,你可以使用:

  • AlphabeticString:

    ^[A-Za-z]+\z(ASCII)或^\p{Alpha}+\z(Unicode)的

  • AlphaNumericString:

    ^[A-Za-z0-9]+\z(ASCII)或者^\p{Alnum}+\z(Unicode)

  • PrefixedNumericString:

    ^[A-Za-z]+[0-9]+\z(ASCII)或者^\p{Alpha}+\p{N}+\z(Unicode)的

  • NumericString:

    ^[0-9]+\z(ASCII)或者^\p{N}+\z(Unicode)的

+0

一個字符串既可以是城市名稱也可以是國家名稱(在概念上,基於迄今給出的事實)。本體不需要單一繼承。 – 2012-03-12 15:51:38

2

一個特定的字符串是一個實例,所以你需要一些代碼來做出關於特定的基本斷言姿態。該代碼本身可能包含正則表達式的使用。一旦你有了這些斷言,你就可以使用你的本體來推理它們。

困難的部分是,你必須決定你要建模的級別。例如,你會談論個人角色嗎?你可以,但不一定明智。你也遇到了這樣的挑戰:消極的信息是尷尬的(因爲這種模型的基本模型是直覺主義的,IIRC),這意味着(例如)你會知道一個字符串包含一個數字字符但並不是說它完全是數字。是的,你會知道你沒有斷言實例包含字母字符,但是你不知道這是因爲字符串沒有一個還是僅僅因爲沒有人這麼說。這東西很難!

如果你確切地知道你打算用它來解決什麼問題,那麼寫一個本體論就容易多了,因爲這可以讓你至少有一個辦法來確定你需要首先建立什麼樣的事實和關係。畢竟,整個世界可能會被說成是真實的,但卻無關緊要(「如果太陽戴上帽子,他會出來玩」)。

6

這裏可能適合的方法,特別是如果本體大/複雜或未來可能會改變,並且假設某些錯誤是可接受的,則是機器學習

利用這種方法的過程的概要可能是:

  1. 定義設置,你可以從每個字符串中提取,有關你的本體特徵(下面的一些例子)。
  2. 收集字符串的「訓練集」及其真正的匹配類別。
  3. 從每個字符串中提取特徵,並在這些數據上訓練一些機器學習算法。
  4. 使用訓練好的模型對新字符串進行分類。
  5. 根據需要重新調整或更新模型(例如,添加新類別時)。

爲了更具體地說明,以下是基於您的本體示例的一些建議。

可能適用的一些布爾特徵:字符串是否匹配正則表達式(例如Qtax建議的);該字符串是否存在於預建的已知城市名稱列表中;它是否存在於已知的國名名單中?大寫字母的存在;字符串長度(非布爾)等。

所以,如果,例如,你總共有8個功能:匹配上面提到的4個正則表達式;和另外4個在這裏建議,那麼「西班牙」將被表示爲(1,1,0,0,1,0,1,5)(與前兩個正則表達式匹配但不是最後兩個,是城市名稱,但是不是國名,有大寫字母,長度是5)。

這組功能將代表任何給定的字符串。

要訓練和測試機器學習算法,您可以使用WEKA。我將從基於規則或樹的算法開始,例如PART,RIDOR,JRIP或J48。

然後,可以通過Weka使用經過訓練的模型,無論是從Java內部還是作爲外部命令行。

顯然,我建議的功能幾乎與您的本體1:1匹配,但假設您的分類規模更大,更復雜,這種方法可能是成本效益最好的方法之一。

+0

這是我讀過的最好的答案!事實上,這很好,我現在想爲自己嘗試一下。謝謝,etov – 2012-03-16 16:24:16

1

直接回答你的問題,你首先檢查給定的標記是數字,字母數字還是字母(你可以在這裏使用正則表達式),然後你將它歸類。一般來說,你正在尋找的方法稱爲令牌的泛化層次結構或分層特徵選擇(Google it)。基本的想法是,你可以把每個標記作爲一個單獨的元素,但這不是最好的方法,因爲你無法全部覆蓋它們[*]。相反,您使用令牌之間的共同特徵(例如,20001981是不同的令牌,但它們具有4位數字和可能年份的共同特徵)。然後你有四個數字的類,另一個是字母數字的,等等。這種泛化過程可幫助您簡化分類方法。

通常,如果您從一串標記開始,則需要對它們進行預處理(例如,刪除標點或特殊符號,刪除不相關的詞,詞幹等)。但是也許你可以使用一些符號(比如城市和國家之間的標點符號 - 例如Melbourne, Australia),因此你可以將這組有用的標點符號分配給其他符號(#)並將其用作上下文(所以下次你找到一個未知的在知名國家旁邊的逗號旁邊,你可以使用這些知識來假設這個未知單詞是一個城市。

無論如何,這是使用本體(基於術語分類)的分類背後的總體思路。您可能還需要閱讀有關part-of-speech tagging

順便說一句,如果你只是想有3類(數字,字母,字母),一個可行的辦法是使用edit distance(更重要的是有可能的,這UA4E30屬於s轉換爲字母數字或數字類別,因爲它不符合傳統格式的前綴數字字符串?)。因此,您假設每個操作(插入,刪除,替換)的成本將未知令牌轉換爲已知的令牌。

最後,雖然你說你使用Protege(我沒有用過)來構建你的本體,但你可能想看看WordNet

[*]有些概率方法可以幫助您確定未知令牌的概率,因此此類事件的概率不爲零。通常,這是在隱馬爾可夫模型的背景下完成的。實際上,這可能對改進etov給出的建議有用。