在今天的數字化世界中,數據交換是互聯網和軟件應用程序中不可或缺的一部分。為了在不同系統(tǒng)之間傳輸數據,我們通常會使用各種數據交換格式。在本文中,我們將重點介紹兩種常見的數據交換格式:JSON 和 Hessian。
JSON(JavaScript Object Notation) 是一種輕量級的數據交換格式,它易于人類閱讀和編寫,同時也易于機器解析和生成。JSON采用鍵/值對的形式組織數據,數據之間使用逗號分隔,而鍵和值之間使用冒號分隔。這種簡潔的結構使得JSON非常適用于前端與后端之間的數據交換,也被廣泛應用于Web開發(fā)和API設計中。
與JSON不同,Hessian 是一種二進制數據交換格式,它旨在提高數據傳輸的效率和性能。Hessian采用緊湊的二進制表示形式,相比于文本格式如JSON,它在網絡傳輸時占用的帶寬更少。這使得Hessian特別適用于對網絡帶寬和速度要求較高的場景,比如移動應用程序開發(fā)和分布式系統(tǒng)通信中。
雖然JSON和Hessian都是數據交換格式,但它們在很多方面有著顯著的區(qū)別。下面我們將比較這兩種格式的特點,以便更好地理解它們各自的優(yōu)勢和適用場景。
隨著互聯網和移動應用的快速發(fā)展,JSON和Hessian已經在許多領域找到了廣泛的應用。以下是它們常見的應用場景:
JSON和Hessian作為不同類型的數據交換格式,各有其優(yōu)勢和適用范圍。在實際開發(fā)中,我們應根據具體的應用場景和需求選擇合適的數據交換格式,以確保數據傳輸的高效性和可靠性。希望通過本文的介紹,您能更好地了解JSON和Hessian,并在相關項目中做出明智的選擇。
在當今數字化時代,不同的數據傳輸格式扮演著至關重要的角色。其中,hessian 和 json 是兩種常用的數據傳輸協議,它們分別具有各自的特點和優(yōu)勢。
Hessian 是一種基于二進制協議的數據傳輸格式,旨在實現快速且高效的數據交換。它使用了基于二進制的數據編碼方式,在數據傳輸時能夠更加節(jié)省帶寬和提高傳輸效率。因此,hessian 在一些對性能要求較高的應用場景中備受青睞。
相比于一些文本協議,hessian 具有更快的傳輸速度和更小的數據包大小。這意味著在網絡傳輸過程中,hessian 可以減少延遲,并縮短數據傳輸的時間。另外,hessian 對于不同編程語言的兼容性也相對較好,使得不同系統(tǒng)間的數據交換更加便捷。
JSON(JavaScript Object Notation)是一種輕量級的數據交換格式,具有易讀性和便于理解的特點。它基于文本,采用鍵值對的方式組織數據,在前后端數據交互中被廣泛應用。
由于其簡潔明了的結構和跨語言的特性,json 在 Web 開發(fā)中被廣泛采用。無論是用于前端頁面與后端服務器之間的數據傳輸,還是作為配置文件的存儲格式,json 都展現出了其強大的應用價值。
雖然 hessian 和 json 都是用于數據傳輸的格式,但它們在一些方面存在明顯的差異。 hessian 更加注重于性能和效率,適合于對速度有較高要求的系統(tǒng)。而 json 則更注重于易讀性和通用性,適合于需要跨語言交互的場景。
在實際應用中,開發(fā)者需要根據項目需求和具體場景來選擇合適的數據傳輸格式。如果注重性能和效率,可以考慮使用 hessian;而如果更看重易用性和通用性,json 可能更為適合。
在當前信息交互日益頻繁的環(huán)境下,選擇合適的數據傳輸格式顯得尤為重要。Hessian 和 JSON 作為兩種常用的數據傳輸協議,在不同的場景下各具優(yōu)勢,開發(fā)者可以根據項目的具體需求來靈活選擇,以實現最佳的數據交換效果。
hessian和dubbo的二者主要區(qū)別是協議不同
dubbo協議 Dubbo缺省協議采用單一長連接和NIO異步通訊,適合于小數據量大并發(fā)的服務調用,以及服務消費者機器數遠大于服務提供者機器數的情況。 缺省協議,使用基于mina1.1.7+hessian3.2.1的tbremoting交互。 連接個數:單連接連接方式:長連接傳輸協議:TCP 傳輸方式:NIO異步傳輸序列化:Hessian二進制序列化適用范圍:傳入傳出參數數據包較小(建議小于100K),消費者比提供者個數多,單一消費者無法壓滿提供者,盡量不要用dubbo協議傳輸大文件或超大字符串。適用場景:常規(guī)遠程服務方法調用 為什么要消費者比提供者個數多: 因dubbo協議采用單一長連接, 假設網絡為千兆網卡(1024Mbit=128MByte), 根據測試經驗數據每條連接最多只能壓滿7MByte(不同的環(huán)境可能不一樣,供參考), 理論上1個服務提供者需要20個服務消費者才能壓滿網卡。 為什么不能傳大包: 因dubbo協議采用單一長連接, 如果每次請求的數據包大小為500KByte,假設網絡為千兆網卡(1024Mbit=128MByte),每條連接最大7MByte(不同的環(huán)境可能不一樣,供參考), 單個服務提供者的TPS(每秒處理事務數)最大為:128MByte/ 500KByte = 262。單個消費者調用單個服務提供者的TPS(每秒處理事務數)最大為:7MByte/ 500KByte = 14。如果能接受,可以考慮使用,否則網絡將成為瓶頸。 為什么采用異步單一長連接: 因為服務的現狀大都是服務提供者少,通常只有幾臺機器, 而服務的消費者多,可能整個網站都在訪問該服務, 比如Morgan的提供者只有6臺提供者,卻有上百臺消費者,每天有1.5億次調用, 如果采用常規(guī)的hessian服務,服務提供者很容易就被壓跨, 通過單一連接,保證單一消費者不會壓死提供者, 長連接,減少連接握手驗證等, 并使用異步IO,復用線程池,防止C10K問題。
2.
RMI RMI協議采用JDK標準的java.rmi.*實現,采用阻塞式短連接和JDK標準序列化方式 Java標準的遠程調用協議。 連接個數:多連接連接方式:短連接傳輸協議:TCP 傳輸方式:同步傳輸序列化:Java標準二進制序列化適用范圍:傳入傳出參數數據包大小混合,消費者與提供者個數差不多,可傳文件。適用場景:常規(guī)遠程服務方法調用,與原生RMI服務互操作
3.
hessian Hessian協議用于集成Hessian的服務,Hessian底層采用Http通訊,采用Servlet暴露服務,Dubbo缺省內嵌Jetty作為服務器實現 基于Hessian的遠程調用協議。 連接個數:多連接連接方式:短連接傳輸協議:HTTP 傳輸方式:同步傳輸序列化:Hessian二進制序列化適用范圍:傳入傳出參數數據包較大,提供者比消費者個數多,提供者壓力較大,可傳文件。適用場景:頁面?zhèn)鬏?文件傳輸,或與原生hessian服務互操作
4.
http 采用Spring的HttpInvoker實現 基于http表單的遠程調用協議
設 A 是n階方陣,如果存在數m和非零n維列向量 x,使得 Ax=mx 成立,則稱 m 是A的一個特征值(characteristic value)或本征值(eigenvalue)。非零n維列向量x稱為矩陣A的屬于(對應于)特征值m的特征向量或本征向量,簡稱A的特征向量或A的本征向量。
Hessian矩陣的特征值就是形容其在該點附近特征向量方向的凹凸性,特征值越大,凸性越強。你可以把函數想想成一個小山坡,陡的那面是特征值大的方向,平緩的是特征值小的方向。而凸性和優(yōu)化方法的收斂速度有關,比如梯度下降。如果正定Hessian矩陣的特征值都差不多,那么梯度下降的收斂速度越快,反之如果其特征值相差很大,那么收斂速度越慢
Hessian和Dubbo都是用于分布式系統(tǒng)中的遠程調用框架,但它們的實現方式有所不同。Hessian是一種基于HTTP協議的輕量級RPC框架,使用Java語言開發(fā),支持多種編程語言間的遠程調用。Hessian的特點包括:
1. 簡單易用:Hessian可以直接將Java對象序列化成二進制數據傳輸到服務器端,從而實現遠程方法調用。這使得開發(fā)者無需手動編寫序列化和反序列化代碼,從而大大簡化了分布式系統(tǒng)的開發(fā)難度。
2. 高效性:Hessian采用二進制數據傳輸格式,并對傳輸數據進行了壓縮處理,因此可以提供較高的網絡傳輸性能。
3. 跨語言支持:Hessian不僅支持Java語言開發(fā),還可以與其他編程語言進行交互,例如C++, C#, Python等。
Dubbo是一個面向服務治理的RPC框架,同時也支持通信協議的擴展。Dubbo在Hessian的基礎上做了許多擴展和優(yōu)化,并引入了插件機制、服務治理、負載均衡、集群容錯等關鍵功能。Dubbo針對企業(yè)級應用場景設計而成,并且已經有著廣泛的應用基礎。
Dubbo的特點包括:
1. 高性能:Dubbo采用Netty作為通信模塊,使用NIO異步處理網絡請求,因此可以提供高并發(fā)、低延遲的服務。
2. 配置靈活:Dubbo允許開發(fā)者通過XML或注解配置服務提供者和消費者的相關參數,同時還可以基于ZooKeeper等中間件進行集群管理和服務治理。
3. 豐富功能:Dubbo提供了豐富的功能支持,包括負載均衡、集群容錯、服務路由等,可以應對不同場景下的應用需求。
總之,Hessian和Dubbo都是優(yōu)秀的遠程調用框架,具有各自獨特的特點和優(yōu)勢,在實際項目中需要根據具體業(yè)務需求進行選擇。
區(qū)別:
dubbo 默認協議:
單一 TCP 長連接,Hessian 二進制序列化和 NIO 異步通訊
適合于小數據包大并發(fā)的服務調用和服務消費者數遠大于服務提供者數的情況
不適合傳送大數據包的服務
hessian 協議:
底層 Http 通訊,Servlet 暴露服務,Dubbo 缺省內嵌 Jetty 作為服務器實現
可與原生 Hessian 服務互操作
通訊效率高于 WebService 和 Java 自帶的序列化
參數及返回值需實現 Serializable 接口,自定義實現 List、Map、Number、Date、Calendar 等接口
適用于傳輸數據包較大,提供者比消費者個數多,提供者壓力較大。
dubbo 默認協議:
單一 TCP 長連接,Hessian 二進制序列化和 NIO 異步通訊
適合于小數據包大并發(fā)的服務調用和服務消費者數遠大于服務提供者數的情況
不適合傳送大數據包的服務
hessian 協議:
底層 Http 通訊,Servlet 暴露服務,Dubbo 缺省內嵌 Jetty 作為服務器實現
可與原生 Hessian 服務互操作
通訊效率高于 WebService 和 Java 自帶的序列化
參數及返回值需實現 Serializable 接口,自定義實現 List、Map、Number、Date、Calendar 等接口
適用于傳輸數據包較大,提供者比消費者個數多,提供者壓力較大。
設 A 是n階方陣,如果存在數m和非零n維列向量 x,使得 Ax=mx 成立,則稱 m 是A的一個特征值(characteristic value)或本征值(eigenvalue)。
非零n維列向量x稱為矩陣A的屬于(對應于)特征值m的特征向量或本征向量,簡稱A的特征向量或A的本征向量。 Hessian矩陣的特征值就是形容其在該點附近特征向量方向的凹凸性,特征值越大,凸性越強。
你可以把函數想想成一個小山坡,陡的那面是特征值大的方向,平緩的是特征值小的方向。
而凸性和優(yōu)化方法的收斂速度有關,比如梯度下降。
如果正定Hessian矩陣的特征值都差不多,那么梯度下降的收斂速度越快,反之如果其特征值相差很大,那么收斂速度越慢。
關于這個問題,Hessian協議和HTTP協議的主要區(qū)別在于它們的用途和性能。
Hessian協議是一種二進制協議,旨在為Java對象提供高效的遠程調用服務。它使用了Java序列化技術,可以快速地序列化和反序列化Java對象,因此在處理大量對象時效率很高。Hessian協議不需要HTTP協議的額外的請求頭和響應頭,因此可以減少網絡傳輸的開銷。
HTTP協議則是一種基于文本的協議,它主要用于Web應用程序之間的通信。HTTP協議的優(yōu)勢在于它的通用性和可擴展性。它可以通過添加自定義的請求頭和響應頭來擴展功能,而且可以使用各種不同的傳輸協議(如TCP/IP、SSL等)來保證數據傳輸的安全性和可靠性。
總的來說,Hessian協議適用于需要高效的遠程調用服務的場景,而HTTP協議則適用于Web應用程序之間的通信和擴展。
之前看了Mahout官方示例 20news 的調用實現;于是想根據示例的流程實現其他例子。網上看到了一個關于天氣適不適合打羽毛球的例子。
訓練數據:
Day Outlook Temperature Humidity Wind PlayTennis
D1 Sunny Hot High Weak No
D2 Sunny Hot High Strong No
D3 Overcast Hot High Weak Yes
D4 Rain Mild High Weak Yes
D5 Rain Cool Normal Weak Yes
D6 Rain Cool Normal Strong No
D7 Overcast Cool Normal Strong Yes
D8 Sunny Mild High Weak No
D9 Sunny Cool Normal Weak Yes
D10 Rain Mild Normal Weak Yes
D11 Sunny Mild Normal Strong Yes
D12 Overcast Mild High Strong Yes
D13 Overcast Hot Normal Weak Yes
D14 Rain Mild High Strong No
檢測數據:
sunny,hot,high,weak
結果:
Yes=》 0.007039
No=》 0.027418
于是使用Java代碼調用Mahout的工具類實現分類。
基本思想:
1. 構造分類數據。
2. 使用Mahout工具類進行訓練,得到訓練模型。
3。將要檢測數據轉換成vector數據。
4. 分類器對vector數據進行分類。
接下來貼下我的代碼實現=》
1. 構造分類數據:
在hdfs主要創(chuàng)建一個文件夾路徑 /zhoujainfeng/playtennis/input 并將分類文件夾 no 和 yes 的數據傳到hdfs上面。
數據文件格式,如D1文件內容: Sunny Hot High Weak
2. 使用Mahout工具類進行訓練,得到訓練模型。
3。將要檢測數據轉換成vector數據。
4. 分類器對vector數據進行分類。
這三步,代碼我就一次全貼出來;主要是兩個類 PlayTennis1 和 BayesCheckData = =》
package myTesting.bayes;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.util.ToolRunner;
import org.apache.mahout.classifier.naivebayes.training.TrainNaiveBayesJob;
import org.apache.mahout.text.SequenceFilesFromDirectory;
import org.apache.mahout.vectorizer.SparseVectorsFromSequenceFiles;
public class PlayTennis1 {
private static final String WORK_DIR = "hdfs://192.168.9.72:9000/zhoujianfeng/playtennis";
/*
* 測試代碼
*/
public static void main(String[] args) {
//將訓練數據轉換成 vector數據
makeTrainVector();
//產生訓練模型
makeModel(false);
//測試檢測數據
BayesCheckData.printResult();
}
public static void makeCheckVector(){
//將測試數據轉換成序列化文件
try {
Configuration conf = new Configuration();
conf.addResource(new Path("/usr/local/hadoop/conf/core-site.xml"));
String input = WORK_DIR+Path.SEPARATOR+"testinput";
String output = WORK_DIR+Path.SEPARATOR+"tennis-test-seq";
Path in = new Path(input);
Path out = new Path(output);
FileSystem fs = FileSystem.get(conf);
if(fs.exists(in)){
if(fs.exists(out)){
//boolean參數是,是否遞歸刪除的意思
fs.delete(out, true);
}
SequenceFilesFromDirectory sffd = new SequenceFilesFromDirectory();
String[] params = new String[]{"-i",input,"-o",output,"-ow"};
ToolRunner.run(sffd, params);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("文件序列化失??!");
System.exit(1);
}
//將序列化文件轉換成向量文件
try {
Configuration conf = new Configuration();
conf.addResource(new Path("/usr/local/hadoop/conf/core-site.xml"));
String input = WORK_DIR+Path.SEPARATOR+"tennis-test-seq";
String output = WORK_DIR+Path.SEPARATOR+"tennis-test-vectors";
Path in = new Path(input);
Path out = new Path(output);
FileSystem fs = FileSystem.get(conf);
if(fs.exists(in)){
if(fs.exists(out)){
//boolean參數是,是否遞歸刪除的意思
fs.delete(out, true);
}
SparseVectorsFromSequenceFiles svfsf = new SparseVectorsFromSequenceFiles();
String[] params = new String[]{"-i",input,"-o",output,"-lnorm","-nv","-wt","tfidf"};
ToolRunner.run(svfsf, params);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("序列化文件轉換成向量失?。?#34;);
System.out.println(2);
}
}
public static void makeTrainVector(){
//將測試數據轉換成序列化文件
try {
Configuration conf = new Configuration();
conf.addResource(new Path("/usr/local/hadoop/conf/core-site.xml"));
String input = WORK_DIR+Path.SEPARATOR+"input";
String output = WORK_DIR+Path.SEPARATOR+"tennis-seq";
Path in = new Path(input);
Path out = new Path(output);
FileSystem fs = FileSystem.get(conf);
if(fs.exists(in)){
if(fs.exists(out)){
//boolean參數是,是否遞歸刪除的意思
fs.delete(out, true);
}
SequenceFilesFromDirectory sffd = new SequenceFilesFromDirectory();
String[] params = new String[]{"-i",input,"-o",output,"-ow"};
ToolRunner.run(sffd, params);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("文件序列化失敗!");
System.exit(1);
}
//將序列化文件轉換成向量文件
try {
Configuration conf = new Configuration();
conf.addResource(new Path("/usr/local/hadoop/conf/core-site.xml"));
String input = WORK_DIR+Path.SEPARATOR+"tennis-seq";
String output = WORK_DIR+Path.SEPARATOR+"tennis-vectors";
Path in = new Path(input);
Path out = new Path(output);
FileSystem fs = FileSystem.get(conf);
if(fs.exists(in)){
if(fs.exists(out)){
//boolean參數是,是否遞歸刪除的意思
fs.delete(out, true);
}
SparseVectorsFromSequenceFiles svfsf = new SparseVectorsFromSequenceFiles();
String[] params = new String[]{"-i",input,"-o",output,"-lnorm","-nv","-wt","tfidf"};
ToolRunner.run(svfsf, params);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("序列化文件轉換成向量失??!");
System.out.println(2);
}
}
public static void makeModel(boolean completelyNB){
try {
Configuration conf = new Configuration();
conf.addResource(new Path("/usr/local/hadoop/conf/core-site.xml"));
String input = WORK_DIR+Path.SEPARATOR+"tennis-vectors"+Path.SEPARATOR+"tfidf-vectors";
String model = WORK_DIR+Path.SEPARATOR+"model";
String labelindex = WORK_DIR+Path.SEPARATOR+"labelindex";
Path in = new Path(input);
Path out = new Path(model);
Path label = new Path(labelindex);
FileSystem fs = FileSystem.get(conf);
if(fs.exists(in)){
if(fs.exists(out)){
//boolean參數是,是否遞歸刪除的意思
fs.delete(out, true);
}
if(fs.exists(label)){
//boolean參數是,是否遞歸刪除的意思
fs.delete(label, true);
}
TrainNaiveBayesJob tnbj = new TrainNaiveBayesJob();
String[] params =null;
if(completelyNB){
params = new String[]{"-i",input,"-el","-o",model,"-li",labelindex,"-ow","-c"};
}else{
params = new String[]{"-i",input,"-el","-o",model,"-li",labelindex,"-ow"};
}
ToolRunner.run(tnbj, params);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("生成訓練模型失??!");
System.exit(3);
}
}
}
package myTesting.bayes;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.lang.StringUtils;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.fs.PathFilter;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.mahout.classifier.naivebayes.BayesUtils;
import org.apache.mahout.classifier.naivebayes.NaiveBayesModel;
import org.apache.mahout.classifier.naivebayes.StandardNaiveBayesClassifier;
import org.apache.mahout.common.Pair;
import org.apache.mahout.common.iterator.sequencefile.PathType;
import org.apache.mahout.common.iterator.sequencefile.SequenceFileDirIterable;
import org.apache.mahout.math.RandomAccessSparseVector;
import org.apache.mahout.math.Vector;
import org.apache.mahout.math.Vector.Element;
import org.apache.mahout.vectorizer.TFIDF;
import com.google.common.collect.ConcurrentHashMultiset;
import com.google.common.collect.Multiset;
public class BayesCheckData {
private static StandardNaiveBayesClassifier classifier;
private static Map<String, Integer> dictionary;
private static Map<Integer, Long> documentFrequency;
private static Map<Integer, String> labelIndex;
public void init(Configuration conf){
try {
String modelPath = "/zhoujianfeng/playtennis/model";
String dictionaryPath = "/zhoujianfeng/playtennis/tennis-vectors/dictionary.file-0";
String documentFrequencyPath = "/zhoujianfeng/playtennis/tennis-vectors/df-count";
String labelIndexPath = "/zhoujianfeng/playtennis/labelindex";
dictionary = readDictionnary(conf, new Path(dictionaryPath));
documentFrequency = readDocumentFrequency(conf, new Path(documentFrequencyPath));
labelIndex = BayesUtils.readLabelIndex(conf, new Path(labelIndexPath));
NaiveBayesModel model = NaiveBayesModel.materialize(new Path(modelPath), conf);
classifier = new StandardNaiveBayesClassifier(model);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("檢測數據構造成vectors初始化時報錯。。。。");
System.exit(4);
}
}
/**
* 加載字典文件,Key: TermValue; Value:TermID
* @param conf
* @param dictionnaryDir
* @return
*/
private static Map<String, Integer> readDictionnary(Configuration conf, Path dictionnaryDir) {
Map<String, Integer> dictionnary = new HashMap<String, Integer>();
PathFilter filter = new PathFilter() {
@Override
public boolean accept(Path path) {
String name = path.getName();
return name.startsWith("dictionary.file");
}
};
for (Pair<Text, IntWritable> pair : new SequenceFileDirIterable<Text, IntWritable>(dictionnaryDir, PathType.LIST, filter, conf)) {
dictionnary.put(pair.getFirst().toString(), pair.getSecond().get());
}
return dictionnary;
}
/**
* 加載df-count目錄下TermDoc頻率文件,Key: TermID; Value:DocFreq
* @param conf
* @param dictionnaryDir
* @return
*/
private static Map<Integer, Long> readDocumentFrequency(Configuration conf, Path documentFrequencyDir) {
Map<Integer, Long> documentFrequency = new HashMap<Integer, Long>();
PathFilter filter = new PathFilter() {
@Override
public boolean accept(Path path) {
return path.getName().startsWith("part-r");
}
};
for (Pair<IntWritable, LongWritable> pair : new SequenceFileDirIterable<IntWritable, LongWritable>(documentFrequencyDir, PathType.LIST, filter, conf)) {
documentFrequency.put(pair.getFirst().get(), pair.getSecond().get());
}
return documentFrequency;
}
public static String getCheckResult(){
Configuration conf = new Configuration();
conf.addResource(new Path("/usr/local/hadoop/conf/core-site.xml"));
String classify = "NaN";
BayesCheckData cdv = new BayesCheckData();
cdv.init(conf);
System.out.println("init done...............");
Vector vector = new RandomAccessSparseVector(10000);
TFIDF tfidf = new TFIDF();
//sunny,hot,high,weak
Multiset<String> words = ConcurrentHashMultiset.create();
words.add("sunny",1);
words.add("hot",1);
words.add("high",1);
words.add("weak",1);
int documentCount = documentFrequency.get(-1).intValue(); // key=-1時表示總文檔數
for (Multiset.Entry<String> entry : words.entrySet()) {
String word = entry.getElement();
int count = entry.getCount();
Integer wordId = dictionary.get(word); // 需要從dictionary.file-0文件(tf-vector)下得到wordID,
if (StringUtils.isEmpty(wordId.toString())){
continue;
}
if (documentFrequency.get(wordId) == null){
continue;
}
Long freq = documentFrequency.get(wordId);
double tfIdfValue = tfidf.calculate(count, freq.intValue(), 1, documentCount);
vector.setQuick(wordId, tfIdfValue);
}
// 利用貝葉斯算法開始分類,并提取得分最好的分類label
Vector resultVector = classifier.classifyFull(vector);
double bestScore = -Double.MAX_VALUE;
int bestCategoryId = -1;
for(Element element: resultVector.all()) {
int categoryId = element.index();
double score = element.get();
System.out.println("categoryId:"+categoryId+" score:"+score);
if (score > bestScore) {
bestScore = score;
bestCategoryId = categoryId;
}
}
classify = labelIndex.get(bestCategoryId)+"(categoryId="+bestCategoryId+")";
return classify;
}
public static void printResult(){
System.out.println("檢測所屬類別是:"+getCheckResult());
}
}