機率軟邏輯(PSL,Probabilistic soft logic)通用(可處理中文)版本

來源:互聯網
上載者:User
一、簡介

機率軟邏輯(PSL,Probabilistic soft logic)是用於開發機率模型的機器學習架構,由加州大學聖克魯茲分校和馬里蘭大學的統計關係學習小組LINQS開發。目前其複雜的環境構建方式和Groovy語言表達給像作者一樣的初學者帶來了不小的困難,而且諸多的依賴項經常使原本已經構建好的模型小錯誤頻繁。

經過努力,作者將其構建成單個jar包,並且加入編碼機制使其可以支援各種語言的資料。主要貢獻有三:

1.將PSL原本複雜的依賴打包為單個jar包,加入依賴即可開始使用。

2. 將不夠熟悉的Groovy語言模型構建方式全部轉化為.java支援,只需一個.java檔案便可進行模型構建。

3.加入編碼機制,使PSL可以輕鬆處理除英文以外語言的資料。

連結:pan.baidu.com/s/1PybpNoPpvk4jmSMw7Rm_7A 密碼:g1cx
連結檔案夾裡有三個檔案:
PSL_swust1.0.jar 修改過的PSL模型
SimpleAcquaintances.zip PSL官方例子的改編版本(不包含權重學習和函數)
Entity_resolution.zip PSL官方例子的改編版本(包含權重學習和函數)

使用時請將PSL_swust1.0.jar加入java項目依賴即可,匯入樣本項目也需要將項目lib檔案夾下PSL_swust.jar加入依賴。

二、舉例說明

以SimpleAcquaintances內SimpleAcquaintances.java為例進行闡述。

1.配置項
 1 /* 2          * ======【配置項】====== 3          */ 4         Tool tool = new Tool(); 5         DataStore datastore; 6         HashMap<String, Partition> partitions = new HashMap<String, Partition>(); 7         String path = tool.getPath(new SimpleAcquaintances().getClass()) 8                 + "/../data/";// SimpleAcquaintances改為當前類名 9         String[] paths = tool.getFiles(path);10         PSLMODEL psl = new PSLMODEL(paths, "H2");// 在安裝了postgresql資料庫時可H2改為postgresql11         datastore = psl.getDatastore();12         psl.transcoding = false;//是否給資料編碼(此值只決定資料是否編碼,謂詞預設都要編碼)

 

• 使用時SimpleAcquaintances需要改為當前類名(目的是為了通過Tool類 getPath() 函數擷取擷取當前專案檔夾)。
• 當安裝配置了postgreSQL時可將 “H2” 改為 “postgresql” 來使用postgreSQL資料庫(H2為模型內建資料庫,運行於記憶體)。
• transcoding 項設定為 true 時候模型會給資料編碼,此時模型可以支援處理各種語言的資料(另外,設定true編碼後設定謂詞屬性為UniqueIntID,可提升模型計算效率)。
• 此修改後的版本依然保留了PSL內建的相似性計算函數和自訂函數功能,但是編碼後的資料無法通過PSL內建相似性計算Function Compute相似性 (因為,編碼後的資料不再是原來的字串)。

2.定義分區
 1        // 權重學習分區 2         // partitions.put("learn_obs", datastore.getPartition("learn_obs")); 3         // partitions.put("learn_target", 4         // datastore.getPartition("learn_target")); 5         // partitions.put("learn_truth", datastore.getPartition("learn_truth")); 6         // 實驗分區 7         datastore = psl.getDatastore(); 8         partitions.put("obs", datastore.getPartition("obs")); 9         partitions.put("target", datastore.getPartition("target"));10         partitions.put("truth", datastore.getPartition("truth"));11         psl.setPartitions(partitions);

 

• 當需要權重學習時(有訓練資料時),需要定義權重學習分區。
• “obs” 代表已知資料分區;
• “target” 代表要推理的目標資料儲存分區(當要使用LazyInference推理時可以不往裡面載入資料),
• “truth” 為真實資料分區。

3.謂詞(函數)定義
 1 HashMap<String, ConstantType[]> p = new HashMap<String, ConstantType[]>(); 2         HashMap<String, ExternalFunction> f = new HashMap<String, ExternalFunction>(); 3         // 添加謂詞 4         p.put("Lived", new ConstantType[] { ConstantType.UniqueStringID,ConstantType.UniqueStringID }); 5         p.put("Likes", new ConstantType[] { ConstantType.UniqueStringID,ConstantType.UniqueStringID }); 6         p.put("Knows", new ConstantType[] { ConstantType.UniqueStringID,ConstantType.UniqueStringID }); 7         // 添加函數 8 //      f.put("SameInitials", new SameInitials()); 9 //      f.put("SameNumTokens", new SameNumTokens());10         psl.definePredicates(p, f);// 謂詞、函數輸入模型

 

• 謂詞定義只需替換修改即可,可隨意增減。
• 謂詞常用屬性有UniqueStringID、UniqueIntID、String等。
• 函數可以定義PSL內建相似性函數(transcoding 為false時),也可定義繼承自ExternalFunction的自訂函數。

4.規則定義
 1 String[] rules = { 2  3                 "20.0: ( LIVED(P1, L) & (P1 != P2) & LIVED(P2, L) ) >> KNOWS(P1, P2) ^2", 4                 "5.0: ( (L1 != L2) & (P1 != P2) & LIVED(P2, L2) & LIVED(P1, L1) ) >> ~( KNOWS(P1, P2) ) ^2", 5                 "10.0: ( LIKES(P2, L) & (P1 != P2) & LIKES(P1, L) ) >> KNOWS(P1, P2) ^2", 6                 "5.0: ( KNOWS(P1, P2) & KNOWS(P2, P3) & (P1 != P3) ) >> KNOWS(P1, P3) ^2", 7                 "1.0 * KNOWS(P1, P2) + -1.0 * KNOWS(P2, P1) = 0.0 .", 8                 "5.0: ~( KNOWS(P1, P2) ) ^2" 9 10         };11         psl.defineRules(rules);// 規則輸入模型

 

• 規則格式: 權重: 規則體 >> 規則頭
• ^2代表平方最佳化,
• 定義自己項目的規則只需按照例子裡的規則格式增減規則即可。
• 提示:算術規則的定義只能寫成 "apredicateX(A,B)+bpredicte(A,B)= 0.0 ." 的形式,如PSL可接受的規則:“Knows(P1, P2) = Knows(P2, P1) .” 在作者修改版本中請寫成 "1.0 * KNOWS(P1, P2) + -1.0 * KNOWS(P2, P1) = 0.0 ." ,否則會報錯,後期會進行最佳化。

5.匯入資料
 1 /* 2          * ======【匯入資料】====== 3          * 其中"1-2"表示對資料的一二列進行轉碼 4          * 只有在transcoding = true時作用,表示只對1,2兩列進行轉碼 5          */ 6         psl.loadData("Lived", path + "Lived_obs.txt", "obs", "1-2"); 7         psl.loadDataTruth("Likes", path + "likes_obs.txt", "obs", "1-2"); 8         psl.loadData("Knows", path + "knows_obs.txt", "obs", "1-2"); 9         psl.loadData("Knows", path + "knows_targets.txt", "target","1-2");10         psl.loadDataTruth("Knows", path + "knows_truth.txt", "truth","1-2");11 //      ArrayList<String[]> likepe = tool.fileToArrayList(path + "likes_obs.txt", "1-2-3");12 //      psl.insertDataTruth("Likes", likepe, "obs");13 //      psl.insertData("Likes", likepe, "obs");

 

• 此版本提供了loadData,loadDataTruth,insertData,insertDataTruth四種方法載入資料,格式為:loadData("謂詞",謂詞對應資料檔案路徑, "要匯入的分區", "要取的列(不包含機率值那一列)")
• loadData,loadDataTruth中的"1-2"表示對資料的一二列進行轉碼, 只有在transcoding = true時作用,表示對資料檔案裡的1,2兩列進行轉碼,多列增加即可,以“-”分開。
• loadData,loadDataTruth區別在於:用loadDataTruth載入資料,預設最後一列為機率值;
• insertData,insertDataTruth適用於一個資料檔案儲存了多個謂詞對應資料的情況,使用前需要先將檔案轉化為List資料,此文版本裡包含的工具類Tool提供了 fileToArrayList("檔案路徑","要提取的列數")函數輔助完成轉化工作。
• ""1-2-3""表示要取出1、2、3作為謂詞的資料,insertDataTruth取出的每個資料 "1-2-...-n"的第n項預設是機率值。

6.權重學習
//  psl.learnWeights("learn_target", "Lived-Likes", "learn_obs", "learn_truth","MaxLikelihoodMPE");

 

• 格式:learnWeights("訓練資料目標資料分割", "封閉謂詞,即:作為已知資料,推理過程不會再新產生的原子", "訓練資料已知資料分區", "真實資料存放分區","權重學習方法")
• 當有訓練資料時候可進行權重學習最佳化規則權重。
• 此版本保留了五種PSL權重最佳化方法:
"LazyMaxLikelihoodMPE",
"MaxLikelihoodMPE",
"MaxPiecewisePseudoLikelihood",
"MaxPseudoLikelihood",
"SimplexSampler"
替換即可使用。

7.列印輸出模型
psl.printModel();

 

• 可用於查看已經定義的模型及編碼後的模型(規則)。

8.運行推理
1 //      psl.runLazyInference("已知資料分區", "目標資料分割(存放結果)");2 //      psl.runLazyInference("obs", "target");3 //      psl.runInference(""已知資料分區"","封閉謂詞1-封閉謂詞2" , "目標資料分割(包含定義的目標原子)");4         psl.runInference("obs","Lived-Likes" , "target");

 

• 此版本有兩種推理方式:LazyMPEInference,MPEInference。
• LazympeInference格式:runLazyInference("已知資料分區", "目標資料分割 用於存放結果")
• MPEInference格式:runInference(""已知資料分區"","封閉謂詞1-封閉謂詞2" , "目標資料分割 包含了輸入的目標原子")

9.資料輸出
psl.writeOutput("target", "Knows", path + "/result/knows_inffer.txt");

 

• 輸出函數使用格式:writeOutput("目標資料分割", "要輸出的資料對應謂詞1-要輸出的資料對應謂詞2", 輸出路徑)

10.評估實驗結果
psl.evalResults("target", "truth", "Knows", path                + "/result/evalResults.txt");

 

• 評估函數使用格式:evalResults("目標資料分割", "真實資料分區", "目標謂詞1-目標謂詞2", 評估結果輸出路徑)
• 值得一提的是,"目標謂詞1-目標謂詞2" 項需要填寫所有真實資料分區所包含資料對應的謂詞。

11.關閉模型
psl.closeModel();

 

• 推理完成,請關閉模型。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.