2009-09-29 79 views
5

我有一個軟件項目的需求清單,由其前身的遺骸組裝而成。每個需求應映射到一個或多個類別。每個類別都由一組關鍵字組成。我想要做的是找到一個算法,它會給我一個分數排名哪些類別每個要求可能會落入。結果將作爲進一步分類要求的起點。根據關鍵字組分類文本?

舉個例子,假設我有要求:

該系統適用於存款客戶的指定帳戶。

和類別/關鍵字:

  1. 客戶交易:存款,存款,客戶信息,賬戶,賬戶
  2. 餘額賬戶:賬戶,賬戶,借記,貸記
  3. 其他類別:FOO,吧

我想算法得分最高的要求在類別1,較低的類別2,並沒有在貓egory 3.得分機制與我無關,但需要傳達比類別2更可能出現類別1的可能性。

我是NLP的新手,所以我有點不知所措。我一直在閱讀Python中的自然語言處理,並希望應用一些概念,但沒有看到任何相當合適的東西。我並不認爲簡單的頻率分佈是可行的,因爲我正在處理的文本非常小(單句)。

回答

4

您可能想要查看「相似性度量」或「距離度量」的類別(這是不同的,在數據​​挖掘中的行話,比「分級」)

基本上,一個相似的措施是在數學,你可以一個方法:

  1. 取兩組數據(在你的情況,字)
  2. 做一些計算/方程/算法
  3. 結果是你有一些數字,告訴你數據是多麼「相似」。

有了相似的措施,這個數字是0和1,其中「0」是指之間的數字。「什麼都沒有匹配」和「1」是指「相同的」

所以,實際上你可以想到的你句子作爲一個向量 - 你的句子中的每個單詞表示該向量的一個元素。同樣也適用於每個類別的關鍵字列表。

然後你就可以做一些很簡單:把「cosine similarity」或「Jaccard index」(取決於你如何組織你的數據)

這兩個指標做什麼是他們把兩個向量(你的輸入句子和你的「關鍵字」列表)並給你一個數字。如果您在所有類別中都這樣做,則可以對這些數字進行排名,以便查看哪個匹配具有最大的相似係數。

舉個例子:

從你的問題:

客戶交易:存款, 存款,客戶信息,賬戶,賬戶

所以,你可以構建一個載體具有5種元素:(1,1,1,1,1)。這意味着,對於「客戶交易」關鍵字,您有5個詞,並且(這聽起來很明顯,但是)每個詞都出現在搜索字符串中。和我一起。

所以,現在你把你的一句:

該系統適用存款一 客戶指定賬戶。

這有從「客戶交易」設置2個字:{存款,賬戶,客戶}

(實際上,這說明了另一個細微差別:你確實有「客戶」這是等同於「客戶?」)

爲你的句子的載體可能是(1,0,1,1,0)

的1,在這個載體是在同樣的位置1的第一途徑 - 因爲那些話是相同的。

所以我們可以說:這些向量有多少次不同?讓我們比較:

(1,1,1,1,1) (1,0,1,1,0)

嗯。他們有三次相同的「位」 - 在第一,第三和第四位。它們僅相差2位。所以我們可以說,當我們比較這兩個向量時,我們有一個「距離」爲2.恭喜,我們只計算了Hamming distance!海明距離越小,數據越「相似」。

(「相似性」度量和「距離」度量之間的區別在於前者是標準化的 - 它給出的值介於0和1之間。距離只是任何數字,所以它只給你一個相對值)。

無論如何,這可能不是自然語言處理的最佳方式,但出於您的目的,它是最簡單的,可能對您的應用程序非常適用,或者至少作爲起點。 (PS:「分類」 - 正如你在標題中所描述的那樣)將會回答「如果你拿我的句子,它最有可能落入哪一類?」這與說「如何分類」有點不同更類似於我對類別1的判斷,而不是類別2?「,這似乎是你在追求的目標。)

祝你好運!

+0

請注意:這裏描述的技術更適用於羣集類型的任務。在這裏,與每個類別相關的預先定義的單詞列表根本不是原型項目,並且它們與實際項目之間的傳統距離函數不代表項目對相應類別的歸屬。例如,一個特定的類別可能有幾十個關鍵字(儘管我們只希望在一個項目的特定實例中找到一些關鍵字),但由於漢明距離評分很差,因此此類別可能不會被表示。 – mjv 2009-09-29 04:38:37

+0

嗯,你說得對,漢明是一個不好的措施 - 正如你在答案中所說的那樣,結果是正常化的,以獲得「命中率」與「錯過」的比率來看看套是相關的。也許使用這種方法作爲例子是次優選擇! – poundifdef 2009-09-29 06:00:41

+0

你是對的,我最想做的是在關鍵字和句子中標準化時態和複數。這樣,我只列出「客戶」而不是「客戶」,「存款」而不是「存款」或「存入」。我認爲漢明仍然有代表性不足的風險,但我認爲這是一個很好的第一次刺殺我想要做的事情。 – technomalogical 2009-09-29 14:14:08

2

問題的主要特點是:

  • 外部定義分類標準(關鍵字列表)
  • 物品要被分類(從需求文檔線)由相對少量的屬性值中的,有效的單一維度:「關鍵字」。
  • 根據定義,沒有反饋/ calibrarion(雖然它可能是適當的建議有些是)

這些特性,使得有好有壞消息:實施應該是比較簡單的,但一致的水平分類過程的準確性可能難以實現。此外,如果需要的話,少量的各種數量(可能類別的數量,最大/平均單詞數量等)應該給我們空間以選擇可能是CPU和/或空間意圖的解決方案。

然而,即使有這種許可證得到了「去幻想」,我建議先從(和貼近),以一個簡單的算法花費在此基礎上了一些補充和注意事項,同時保持警惕過時的危險,稱爲過度安裝。

基本算法(概念,即不注重性能的把戲在這個時候)

 
    Parameters = 
    CatKWs = an array/hash of lists of strings. The list contains the possible 
       keywords, for a given category. 
     usage: CatKWs[CustTx] = ('deposits', 'deposit', 'customer' ...) 
    NbCats = integer number of pre-defined categories 
    Variables: 
     CatAccu = an array/hash of numeric values with one entry per each of the 
       possible categories. usage: CatAccu[3] = 4 (if array) or 
       CatAccu['CustTx'] += 1 (hash) 
     TotalKwOccurences = counts the total number of keywords matches (counts 
     multiple when a word is found in several pre-defined categories) 

    Pseudo code: (for categorizing one input item) 
     1. for x in 1 to NbCats 
      CatAccu[x] = 0 // reset the accumulators 
     2. for each word W in Item 
      for each x in 1 to NbCats 
       if W found in CatKWs[x] 
         TotalKwOccurences++ 
         CatAccu[x]++ 
     3. for each x in 1 to NbCats 
      CatAccu[x] = CatAccu[x]/TotalKwOccurences // calculate rating 
     4. Sort CatAccu by value 
     5. Return the ordered list of (CategoryID, rating) 
       for all corresponding CatAccu[x] values about a given threshold. 

簡單而合理的:我們看好擁有最匹配的類別,但我們通過的總數除以匹配,以此作爲在找到許多單詞時降低置信度的一種方式。請注意,此劃分不會影響給定項目的類別選擇的相對排名,但在比較不同項目的評分時可能會很重要。現在,我想到了幾個簡單的改進:(我會認真考慮前兩個,並且對其他方面進行思考;決定每個方面都與項目範圍密切相關,統計概況要分類的數據和其他因素......)

  • 我們應該規範化從輸入項目中讀取的關鍵字和/或匹配他們的方式,容忍拼寫錯誤。由於我們沒有足夠的詞彙來處理,所以我們需要確保我們不會因爲一個愚蠢的錯字而失去重要的意義。
  • 我們應該更重視在CatKW中發現頻率較低的單詞。例如,「賬戶」這個詞應該比'foo'或'信用'這個詞還要低。我們可以(但也許這樣做不會有用,甚至不會有幫助)給予更少的[無噪音]的話。
  • 我們還可以包括考慮基於二元對立(連續兩個單詞),對於自然語言(和需求文檔不太自然:-)),單詞鄰近通常是單詞本身的更強的指標。
  • 我們可以爲分配給前面的類別(甚至在後續邏輯中)添加一點重要性。項目可能會出現在相關係列中,我們可以從這個規律中受益。

此外,除了每本身評級的計算中,我們也應該考慮:

  • 有些指標將被用來對算法的結果本身(TBD)
  • 一些邏輯收集與指定類別相關的單詞列表並最終對這些單詞進行統計。這可能允許識別代表某個類別但最初未在CatKW中列出的單詞。

度量的問題應儘早考慮,但這也需要參考輸入項集:排序的「訓練集」,即使我們正在處理預定義的詞典類別關鍵字(通常使用訓練集來確定該類別關鍵字的列表以及權重因子)。當然,這樣的參考/訓練集應該是統計學上顯着的並且是統計學上代表性的[全套]。

總結:堅持簡單的方法,反正上下文不離開房間很花哨。考慮引入一種測量特定算法(或給定算法中的特定參數)的效率的方法,但要注意,這些度量可能存在缺陷,並提示您專門針對給定集合的解決方案而損害其他項目(過度配合)。