1. 程式人生 > >Java分散式中文分片語件 - word分詞(轉自 https //github com/ysc/word)

Java分散式中文分片語件 - word分詞(轉自 https //github com/ysc/word)

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!

               

###Java分散式中文分片語件 - word分詞

####word分詞是一個Java實現的分散式的中文分片語件,提供了多種基於詞典的分詞演算法,並利用ngram模型來消除歧義。能準確識別英文、數字,以及日期、時間等數量詞,能識別人名、地名、組織機構名等未登入詞。能通過自定義配置檔案來改變元件行為,能自定義使用者詞庫、自動檢測詞庫變化、支援大規模分散式環境,能靈活指定多種分詞演算法,能使用refine功能靈活控制分詞結果,還能使用詞頻統計、詞性標註、同義標註、反義標註、拼音標註等功能。提供了10種分詞演算法,還提供了10種文字相似度演算法,同時還無縫和Lucene、Solr、ElasticSearch、Luke整合。注意:word1.3需要JDK1.8

###捐贈致謝

###API線上文件:

word 1.0 API

word 1.1 API

word 1.2 API

word 1.3 API

###編譯好的jar包下載

###Maven依賴:

在pom.xml中指定dependency,可用版本有1.0、1.1、1.2、1.3、1.3.1:

<dependencies> <dependency>  <groupId>org.apdplat</groupId>  <artifactId>word</artifactId
>
  <version>1.3</version> </dependency></dependencies>

word 1.3.1這個版本是從程式碼分支ForElasticsearch1.7.2中編譯出來的,主要目的是支援 與lucene4.10.4、solr4.10.4和elasticsearch1.7.2相容的版本。

###分詞使用方法:

####1、快速體驗

執行專案根目錄下的指令碼demo-word.bat可以快速體驗分詞效果用法: command [text] [input] [output]命令command的可選值為:demo、text
、filedemotext 楊尚川是APDPlat應用級產品開發平臺的作者file d:/text.txt d:/word.txtexit

####2、對文字進行分詞

移除停用詞:List<Word> words = WordSegmenter.seg("楊尚川是APDPlat應用級產品開發平臺的作者");保留停用詞:List<Word> words = WordSegmenter.segWithStopWords("楊尚川是APDPlat應用級產品開發平臺的作者");   System.out.println(words);輸出:移除停用詞:[楊尚川, apdplat, 應用級, 產品, 開發平臺, 作者]保留停用詞:[楊尚川, 是, apdplat, 應用級, 產品, 開發平臺, 的, 作者]

####3、對檔案進行分詞

String input = "d:/text.txt";String output = "d:/word.txt";移除停用詞:WordSegmenter.seg(new File(input), new File(output));保留停用詞:WordSegmenter.segWithStopWords(new File(input), new File(output));

####4、自定義配置檔案

預設配置檔案為類路徑下的word.conf,打包在word-x.x.jar中自定義配置檔案為類路徑下的word.local.conf,需要使用者自己提供如果自定義配置和預設配置相同,自定義配置會覆蓋預設配置配置檔案編碼為UTF-8

####5、自定義使用者詞庫

自定義使用者詞庫為一個或多個資料夾或檔案,可以使用絕對路徑或相對路徑使用者詞庫由多個詞典檔案組成,檔案編碼為UTF-8詞典檔案的格式為文字檔案,一行代表一個詞可以通過系統屬性或配置檔案的方式來指定路徑,多個路徑之間用逗號分隔開類路徑下的詞典檔案,需要在相對路徑前加入字首classpath: 指定方式有三種: 指定方式一,程式設計指定(高優先順序):  WordConfTools.set("dic.path", "classpath:dic.txt,d:/custom_dic");  DictionaryFactory.reload();//更改詞典路徑之後,重新載入詞典 指定方式二,Java虛擬機器啟動引數(中優先順序):  java -Ddic.path=classpath:dic.txt,d:/custom_dic 指定方式三,配置檔案指定(低優先順序):  使用類路徑下的檔案word.local.conf來指定配置資訊  dic.path=classpath:dic.txt,d:/custom_dic如未指定,則預設使用類路徑下的dic.txt詞典檔案

####6、自定義停用詞詞庫

使用方式和自定義使用者詞庫類似,配置項為:stopwords.path=classpath:stopwords.txt,d:/custom_stopwords_dic

####7、自動檢測詞庫變化

可以自動檢測自定義使用者詞庫和自定義停用詞詞庫的變化包含類路徑下的檔案和資料夾、非類路徑下的絕對路徑和相對路徑如:classpath:dic.txt,classpath:custom_dic_dir,d:/dic_more.txt,d:/DIC_DIR,D:/DIC2_DIR,my_dic_dir,my_dic_file.txtclasspath:stopwords.txt,classpath:custom_stopwords_dic_dir,d:/stopwords_more.txt,d:/STOPWORDS_DIR,d:/STOPWORDS2_DIR,stopwords_dir,remove.txt

####8、顯式指定分詞演算法

對文字進行分詞時,可顯式指定特定的分詞演算法,如:WordSegmenter.seg("APDPlat應用級產品開發平臺", SegmentationAlgorithm.BidirectionalMaximumMatching);SegmentationAlgorithm的可選型別為:  正向最大匹配演算法:MaximumMatching逆向最大匹配演算法:ReverseMaximumMatching正向最小匹配演算法:MinimumMatching逆向最小匹配演算法:ReverseMinimumMatching雙向最大匹配演算法:BidirectionalMaximumMatching雙向最小匹配演算法:BidirectionalMinimumMatching雙向最大最小匹配演算法:BidirectionalMaximumMinimumMatching全切分演算法:FullSegmentation最少詞數演算法:MinimalWordCount最大Ngram分值演算法:MaxNgramScore

####9、分詞效果評估

執行專案根目錄下的指令碼evaluation.bat可以對分詞效果進行評估評估採用的測試文字有253 3709行,共2837 4490個字元評估結果位於target/evaluation目錄下:corpus-text.txt為分好詞的人工標註文字,詞之間以空格分隔test-text.txt為測試文字,是把corpus-text.txt以標點符號分隔為多行的結果standard-text.txt為測試文字對應的人工標註文字,作為分詞是否正確的標準result-text-***.txt,***為各種分詞演算法名稱,這是word分詞結果perfect-result-***.txt,***為各種分詞演算法名稱,這是分詞結果和人工標註標準完全一致的文字wrong-result-***.txt,***為各種分詞演算法名稱,這是分詞結果和人工標註標準不一致的文字

####10、分散式中文分詞器

1、在自定義配置檔案word.conf或word.local.conf中指定所有的配置項*.path使用HTTP資源,同時指定配置項redis.*2、配置並啟動提供HTTP資源的web伺服器,將專案:https://github.com/ysc/word_web部署到tomcat3、配置並啟動redis伺服器

####11、詞性標註

將分詞結果作為輸入引數,呼叫PartOfSpeechTagging類的process方法,詞性儲存在Word類的partOfSpeech欄位中如下所示:List<Word> words = WordSegmenter.segWithStopWords("我愛中國");System.out.println("未標註詞性:"+words);//詞性標註PartOfSpeechTagging.process(words);System.out.println("標註詞性:"+words);輸出內容:未標註詞性:[我, 愛, 中國]標註詞性:[我/r, 愛/v, 中國/ns]

####12、refine

我們看一個切分例子:List<Word> words = WordSegmenter.segWithStopWords("我國工人階級和廣大勞動群眾要更加緊密地團結在黨中央周圍");System.out.println(words);結果如下:[我國, 工人階級, 和, 廣大, 勞動群眾, 要, 更加, 緊密, 地, 團結, 在, 黨中央, 周圍]假如我們想要的切分結果是:[我國, 工人, 階級, 和, 廣大, 勞動, 群眾, 要, 更加, 緊密, 地, 團結, 在, 黨中央, 周圍]也就是要把“工人階級”細分為“工人 階級”,把“勞動群眾”細分為“勞動 群眾”,那麼我們該怎麼辦呢?我們可以通過在word.refine.path配置項指定的檔案classpath:word_refine.txt中增加以下內容:工人階級=工人 階級勞動群眾=勞動 群眾然後,我們對分詞結果進行refine:words = WordRefiner.refine(words);System.out.println(words);這樣,就能達到我們想要的效果:[我國, 工人, 階級, 和, 廣大, 勞動, 群眾, 要, 更加, 緊密, 地, 團結, 在, 黨中央, 周圍]我們再看一個切分例子:List<Word> words = WordSegmenter.segWithStopWords("在實現“兩個一百年”奮鬥目標的偉大征程上再創新的業績");System.out.println(words);結果如下:[在, 實現, 兩個, 一百年, 奮鬥目標, 的, 偉大, 征程, 上, 再創, 新的, 業績]假如我們想要的切分結果是:[在, 實現, 兩個一百年, 奮鬥目標, 的, 偉大征程, 上, 再創, 新的, 業績]也就是要把“兩個 一百年”合併為“兩個一百年”,把“偉大, 征程”合併為“偉大征程”,那麼我們該怎麼辦呢?我們可以通過在word.refine.path配置項指定的檔案classpath:word_refine.txt中增加以下內容:兩個 一百年=兩個一百年偉大 征程=偉大征程然後,我們對分詞結果進行refine:words = WordRefiner.refine(words);System.out.println(words);這樣,就能達到我們想要的效果:[在, 實現, 兩個一百年, 奮鬥目標, 的, 偉大征程, 上, 再創, 新的, 業績]

####13、同義標註

List<Word> words = WordSegmenter.segWithStopWords("楚離陌千方百計為無情找回記憶");System.out.println(words);結果如下:[楚離陌, 千方百計, 為, 無情, 找回, 記憶]做同義標註:SynonymTagging.process(words);System.out.println(words);結果如下:[楚離陌, 千方百計[久有存心, 化盡心血, 想方設法, 費盡心機], 為, 無情, 找回, 記憶[影象]]如果啟用間接同義詞:SynonymTagging.process(words, false);System.out.println(words);結果如下:[楚離陌, 千方百計[久有存心, 化盡心血, 想方設法, 費盡心機], 為, 無情, 找回, 記憶[影像, 影象]]List<Word> words = WordSegmenter.segWithStopWords("手勁大的老人往往更長壽");System.out.println(words);結果如下:[手勁, 大, 的, 老人, 往往, 更, 長壽]做同義標註:SynonymTagging.process(words);System.out.println(words);結果如下:[手勁, 大, 的, 老人[白叟], 往往[常常, 每每, 經常], 更, 長壽[長命, 龜齡]]如果啟用間接同義詞:SynonymTagging.process(words, false);System.out.println(words);結果如下:[手勁, 大, 的, 老人[白叟], 往往[一樣平常, 一般, 凡是, 尋常, 常常, 常日, 平凡, 平居, 平常, 平日, 平時, 往常, 日常, 日常平凡, 時常, 普通, 每每, 泛泛, 素日, 經常, 通俗, 通常], 更, 長壽[長命, 龜齡]]以詞“千方百計”為例:可以通過Word的getSynonym()方法獲取同義詞如:System.out.println(word.getSynonym());結果如下:[久有存心, 化盡心血, 想方設法, 費盡心機]注意:如果沒有同義詞,則getSynonym()返回空集合:Collections.emptyList()間接同義詞和直接同義詞的區別如下:假設:A和B是同義詞,A和C是同義詞,B和D是同義詞,C和E是同義詞則:對於A來說,A B C是直接同義詞對於B來說,A B D是直接同義詞對於C來說,A C E是直接同義詞對於A B C來說,A B C D E是間接同義詞

####14、反義標註

List<Word> words = WordSegmenter.segWithStopWords("5月初有哪些電影值得觀看");System.out.println(words);結果如下:[5, 月初, 有, 哪些, 電影, 值得, 觀看]做反義標註:AntonymTagging.process(words);System.out.println(words);結果如下:[5, 月初[月底, 月末, 月終], 有, 哪些, 電影, 值得, 觀看]List<Word> words = WordSegmenter.segWithStopWords("由於工作不到位、服務不完善導致顧客在用餐時發生不愉快的事情,餐廳方面應該向顧客作出真誠的道歉,而不是敷衍了事。");System.out.println(words);結果如下:[由於, 工作, 不到位, 服務, 不完善, 導致, 顧客, 在, 用餐, 時, 發生, 不愉快, 的, 事情, 餐廳, 方面, 應該, 向, 顧客, 作出, 真誠, 的, 道歉, 而不是, 敷衍了事]做反義標註:AntonymTagging.process(words);System.out.println(words);結果如下:[由於, 工作, 不到位, 服務, 不完善, 導致, 顧客, 在, 用餐, 時, 發生, 不愉快, 的, 事情, 餐廳, 方面, 應該, 向, 顧客, 作出, 真誠[糊弄, 虛偽, 虛假, 險詐], 的, 道歉, 而不是, 敷衍了事[一絲不苟, 兢兢業業, 盡心竭力, 竭盡全力, 精益求精, 誠心誠意]]以詞“月初”為例:可以通過Word的getAntonym()方法獲取反義詞如:System.out.println(word.getAntonym());結果如下:[月底, 月末, 月終]注意:如果沒有反義詞,getAntonym()返回空集合:Collections.emptyList()

####15、拼音標註

List<Word> words = WordSegmenter.segWithStopWords("《速度與激情7》的中國內地票房自4月12日上映以來,在短短兩週內突破20億人民幣");System.out.println(words);結果如下:[速度, 與, 激情, 7, 的, 中國, 內地, 票房, 自, 4月, 12日, 上映, 以來, 在, 短短, 兩週, 內, 突破, 20億, 人民幣]執行拼音標註:PinyinTagging.process(words);System.out.println(words);結果如下:[速度 sd sudu, 與 y yu, 激情 jq jiqing, 7, 的 d de, 中國 zg zhongguo, 內地 nd neidi, 票房 pf piaofang, 自 z zi, 4月, 12日, 上映 sy shangying, 以來 yl yilai, 在 z zai, 短短 dd duanduan, 兩週 lz liangzhou, 內 n nei, 突破 tp tupo, 20億, 人民幣 rmb renminbi]以詞“速度”為例:可以通過Word的getFullPinYin()方法獲取完整拼音如:sudu可以通過Word的getAcronymPinYin()方法獲取首字母縮略拼音如:sd

####16、Lucene外掛:

1、構造一個word分析器ChineseWordAnalyzerAnalyzer analyzer = new ChineseWordAnalyzer();如果需要使用特定的分詞演算法,可通過建構函式來指定:Analyzer analyzer = new ChineseWordAnalyzer(SegmentationAlgorithm.FullSegmentation);如不指定,預設使用雙向最大匹配演算法:SegmentationAlgorithm.BidirectionalMaximumMatching可用的分詞演算法參見列舉類:SegmentationAlgorithm2、利用word分析器切分文字TokenStream tokenStream = analyzer.tokenStream("text", "楊尚川是APDPlat應用級產品開發平臺的作者");//準備消費tokenStream.reset();//開始消費while(tokenStream.incrementToken()){ //詞 CharTermAttribute charTermAttribute = tokenStream.getAttribute(CharTermAttribute.class); //詞在文字中的起始位置 OffsetAttribute offsetAttribute = tokenStream.getAttribute(OffsetAttribute.class); //第幾個詞 PositionIncrementAttribute positionIncrementAttribute = tokenStream.getAttribute(PositionIncrementAttribute.class);  LOGGER.info(charTermAttribute.toString()+" ("+offsetAttribute.startOffset()+" - "+offsetAttribute.endOffset()+") "+positionIncrementAttribute.getPositionIncrement());}//消費完畢tokenStream.close();3、利用word分析器建立Lucene索引Directory directory = new RAMDirectory();IndexWriterConfig config = new IndexWriterConfig(analyzer);IndexWriter indexWriter = new IndexWriter(directory, config);4、利用word分析器查詢Lucene索引QueryParser queryParser = new QueryParser("text", analyzer);Query query = queryParser.parse("text:楊尚川");TopDocs docs = indexSearcher.search(query, Integer.MAX_VALUE);

####17、Solr外掛:

1、下載word-1.3.jar下載地址:http://search.maven.org/remotecontent?filepath=org/apdplat/word/1.3/word-1.3.jar2、建立目錄solr-5.2.0/example/solr/lib,將word-1.3.jar複製到lib目錄3、配置schema指定分詞器將solr-5.2.0/example/solr/collection1/conf/schema.xml檔案中所有的<tokenizer class="solr.WhitespaceTokenizerFactory"/>和<tokenizer class="solr.StandardTokenizerFactory"/>全部替換為<tokenizer class="org.apdplat.word.solr.ChineseWordTokenizerFactory"/>並移除所有的filter標籤4、如果需要使用特定的分詞演算法:<tokenizer class="org.apdplat.word.solr.ChineseWordTokenizerFactory" segAlgorithm="ReverseMinimumMatching"/>segAlgorithm可選值有:  正向最大匹配演算法:MaximumMatching逆向最大匹配演算法:ReverseMaximumMatching正向最小匹配演算法:MinimumMatching逆向最小匹配演算法:ReverseMinimumMatching雙向最大匹配演算法:BidirectionalMaximumMatching雙向最小匹配演算法:BidirectionalMinimumMatching雙向最大最小匹配演算法:BidirectionalMaximumMinimumMatching全切分演算法:FullSegmentation最少詞數演算法:MinimalWordCount最大Ngram分值演算法:MaxNgramScore如不指定,預設使用雙向最大匹配演算法:BidirectionalMaximumMatching5、如果需要指定特定的配置檔案:<tokenizer class="org.apdplat.word.solr.ChineseWordTokenizerFactory" segAlgorithm="ReverseMinimumMatching"  conf="solr-5.2.0/example/solr/nutch/conf/word.local.conf"/>word.local.conf檔案中可配置的內容見 word-1.3.jar 中的word.conf檔案如不指定,使用預設配置檔案,位於 word-1.3.jar 中的word.conf檔案

####18、ElasticSearch外掛:

1、開啟命令列並切換到elasticsearch的bin目錄cd elasticsearch-2.1.1/bin2、執行plugin指令碼安裝word分詞外掛:./plugin install http://apdplat.org/word/archive/v1.4.zip安裝的時候注意: 如果提示:  ERROR: failed to download  或者   Failed to install word, reason: failed to download 或者   ERROR: incorrect hash (SHA1) 則重新再次執行命令,如果還是不行,多試兩次 如果是elasticsearch1.x系列版本,則使用如下命令:./plugin -u http://apdplat.org/word/archive/v1.3.1.zip -i word 3、修改檔案elasticsearch-2.1.1/config/elasticsearch.yml,新增如下配置: index.analysis.analyzer.default.type : "word"index.analysis.tokenizer.default.type : "word"4、啟動ElasticSearch測試效果,在Chrome瀏覽器中訪問: http://localhost:9200/_analyze?analyzer=word&text=楊尚川是APDPlat應用級產品開發平臺的作者 5、自定義配置修改配置檔案elasticsearch-2.1.1/plugins/word/word.local.conf 6、指定分詞演算法修改檔案elasticsearch-2.1.1/config/elasticsearch.yml,新增如下配置:index.analysis.analyzer.default.segAlgorithm : "ReverseMinimumMatching"index.analysis.tokenizer.default.segAlgorithm : "ReverseMinimumMatching"這裡segAlgorithm可指定的值有:正向最大匹配演算法:MaximumMatching逆向最大匹配演算法:ReverseMaximumMatching正向最小匹配演算法:MinimumMatching逆向最小匹配演算法:ReverseMinimumMatching雙向最大匹配演算法:BidirectionalMaximumMatching雙向最小匹配演算法:BidirectionalMinimumMatching雙向最大最小匹配演算法:BidirectionalMaximumMinimumMatching全切分演算法:FullSegmentation最少詞數演算法:MinimalWordCount最大Ngram分值演算法:MaxNgramScore如不指定,預設使用雙向最大匹配演算法:BidirectionalMaximumMatching

####19、Luke外掛:

1、下載http://luke.googlecode.com/files/lukeall-4.0.0-ALPHA.jar(國內不能訪問)2、下載並解壓Java中文分片語件word-1.0-bin.zip:http://pan.baidu.com/s/1dDziDFz3、將解壓後的 Java中文分片語件word-1.0-bin/word-1.0 資料夾裡面的4個jar包解壓到當前資料夾用壓縮解壓工具如winrar開啟lukeall-4.0.0-ALPHA.jar,將當前資料夾裡面除了META-INF資料夾、.jar、.bat、.html、word.local.conf檔案外的其他所有檔案拖到lukeall-4.0.0-ALPHA.jar裡面4、執行命令 java -jar lukeall-4.0.0-ALPHA.jar 啟動luke,在Search選項卡的Analysis裡面就可以選擇 org.apdplat.word.lucene.ChineseWordAnalyzer 分詞器了5、在Plugins選項卡的Available analyzers found on the current classpath裡面也可以選擇 org.apdplat.word.lucene.ChineseWordAnalyzer 分詞器注意:如果你要自己整合word分詞器的其他版本,在專案根目錄下執行mvn install編譯專案,然後執行命令mvn dependency:copy-dependencies複製依賴的jar包,接著在target/dependency/目錄下就會有所有的依賴jar包。其中target/dependency/slf4j-api-1.6.4.jar是word分詞器使用的日誌框架,target/dependency/logback-classic-0.9.28.jar和target/dependency/logback-core-0.9.28.jar是word分詞器推薦使用的日誌實現,日誌實現的配置檔案路徑位於target/classes/logback.xml,target/word-1.3.jar是word分詞器的主jar包,如果需要自定義詞典,則需要修改分詞器配置檔案target/classes/word.conf

已經整合好的Luke外掛下載(適用於lucene4.0.0) :lukeall-4.0.0-ALPHA-with-word-1.0.jar

已經整合好的Luke外掛下載(適用於lucene4.10.3):lukeall-4.10.3-with-word-1.2.jar

####20、通過計算詞的語境來獲得相關詞:

我們如何通過計算詞的語境來獲得相關詞呢?

語境的定義是:在一段文字中,任意一個詞的語境由它的前N個詞和後N個片語成。相關詞的定義是:如果兩個詞的語境越相似,那麼這兩個詞就越相似,也就越相關。

演算法由兩個步驟組成:

1、從大規模語料庫中計算每一個詞的語境,並使用詞向量來表示語境。2、把求兩個詞的相似度的問題轉換為求這兩個詞的語境的相似度的問題。通過計算語境的相似度,就可得到詞的相似度,越相似的詞就越相關。

使用方法如下:

1、使用word分詞內建語料庫:執行word分詞專案根目錄下的指令碼 demo-word-vector-corpus.bat 或 demo-word-vector-corpus.sh2、使用自己的文字內容:執行word分詞專案根目錄下的指令碼 demo-word-vector-file.bat 或 demo-word-vector-file.sh由於語料庫很大,所以啟動的時間會很長,請耐心等待,下面以例子來說明:比如我們想分析 蘭州 這個詞的相關詞有哪些,我們執行指令碼 demo-word-vector-corpus.sh ,啟動成功之後命令列提示:開始初始化模型模型初始化完成可通過輸入命令sa=cos來指定相似度演算法,可用的演算法有:   1、sa=cos,餘弦相似度   2、sa=edi,編輯距離   3、sa=euc,歐幾里得距離   4、sa=sim,簡單共有詞   5、sa=jac,Jaccard相似性係數   6、sa=man,曼哈頓距離   7、sa=shh,SimHash + 漢明距離   8、sa=ja,Jaro距離   9、sa=jaw,Jaro–Winkler距離   10、sa=sd,Sørensen–Dice係數可通過輸入命令limit=15來指定顯示結果條數可通過輸入命令exit退出程式輸入要查詢的詞或命令:我們輸入 蘭州 後回車,結果顯示:蘭州 的相關詞(EditDistanceTextSimilarity):---------------------------------------------------------- 1、蘭州 1.0 2、北京 0.21 3、福州 0.2 4、太原 0.19 5、成都 0.17 6、西安 0.17 7、哈爾濱 0.17 8、南寧 0.17 9、貴陽 0.16 10、慶陽 0.15 11、瀋陽 0.14 12、合肥 0.14 13、大同 0.14 14、拉薩 0.13 15、西寧 0.13----------------------------------------------------------這裡顯示的結果就是 蘭州 這個詞的相關詞,詞後面跟的是相關度分值,蘭州 和 蘭州 是同一個詞,相關度百分之百,自然是1分。從這個結果我們來分析,這些詞憑什麼相關呢?線索在哪裡?首先這些詞的詞性都是名詞;其次這些詞都是地名而且是大城市名;從這裡我們也可以看到一個有意思的現象,同一詞性比如地名的用法往往保持一致。相關詞是從語境推導得到的,語境中詞後面跟的數字是權重,權重是1/N的累加值下面我們看看這些詞的語境:蘭州 : [軍區 1.0, 甘肅 0.78205127, 新區 0.7692308, 大學 0.42307693, 甘肅蘭州 0.41025642, 貨車 0.3846154, 西安 0.32051283, 本報 0.2948718, 新華社 0.2820513, 蘭州新區 0.26923078, 召開 0.23076923, 發往 0.21794872, 中國 0.20512821, 蘭州 0.20512821, 火車站 0.20512821, 鐵路 0.17948718, 參加 0.15384616, 西寧 0.15384616, 方向 0.15384616, 成都 0.14102565, 警察 0.14102565, 建設 0.12820514, 市委 0.12820514, 來到 0.12820514, 一家 0.12820514, 中心 0.115384616, 煉油廠 0.102564104, 進入 0.102564104, 來自 0.102564104, 舉行 0.102564104] 北京 : [新華社 1.0, 本報 0.7119143, 舉行 0.19384204, 上海 0.17831326, 時間 0.16385542, 鐵路局 0.1394913, 西站 0.13226238, 青年報 0.12717536, 晨報 0.11700134, 市委 0.1145917, 地區 0.11218206, 召開 0.10200803, 城市 0.08299866, 目前 0.07951807, 來到 0.06961178, 軍區 0.06827309, 國際 0.066398926, 中心 0.063453816, 北京時間 0.06184739, 人民 0.059973225, 工作 0.05863454, 地鐵 0.057563588, 北京鐵路局 0.056492638, 醫院 0.055421688, 飛往 0.05381526, 首都 0.053547524, 中國 0.053547524, 其中 0.05274431, 今天 0.052208837, 衛視 0.05167336]福州 : [火車站 1.0, 新區 0.46666667, 福州火車站 0.45555556, 晚報 0.2962963, 記者 0.2777778, 打工 0.27407408, 來到 0.24814814, 市民 0.23333333, 本報 0.22222222, 大學 0.21851853, 市區 0.2074074, 市委 0.19259259, 舉行 0.19259259, 鼓樓區 0.18518518, 網友 0.18148148, 到達 0.17037037, 開往 0.16296296, 目前 0.14074074, 分行 0.14074074, 一家 0.12962963, 全市 0.12962963, 東街口 0.12222222, 福州晚報 0.12222222, 新華社 0.11851852, 鐵路 0.11851852, 召開 0.11481482, 前往 0.11481482, 發展 0.11481482, 推進 0.11111111, 福州 0.11111111]  太原 : [山西 1.0, 山西太原 0.6136364, 本報 0.39772728, 新華社 0.3409091, 火車站 0.26136363, 濟南 0.25, 鐵路 0.23863636, 北京 0.22727273, 推出 0.1590909, 國際 0.1590909, 返回 0.14772727, 剛玉 0.13636364, 來自 0.13636364, 釋出 0.13636364, 打工 0.125, 中心 0.125, 市委 0.11363637, 銀行 0.11363637, 鐵路局 0.10227273, 西安 0.09090909, 集團 0.09090909, 公安 0.09090909, 開往 0.09090909, 比如 0.07954545, 金融 0.07954545, 火車票 0.07954545, 大同 0.06818182, 山西省 0.06818182, 軍分割槽 0.06818182, 離開 0.06818182]成都 : [商報 1.0, 成都商報 0.4117647, 軍區 0.1875, 鐵路局 0.17830883, 北京 0.17463236, 本報 0.17095588, 重慶 0.15441176, 告訴 0.15441176, 交警 0.14338236, 方向 0.1360294, 記者 0.13419117, 平原 0.121323526, 四川 0.1194853, 長沙 0.11764706, 理工大學 0.0992647, 來自 0.09375, 新華社 0.09191176, 開往 0.090073526, 成都鐵路局 0.08455882, 鐵路 0.080882356, 召開 0.07904412, 市民 0.075367644, 市委 0.073529415, 公司 0.07169118, 廣州 0.07169118, 西安 0.0680147, 郫縣 0.060661763, 打工 0.060661763, 市區 0.05882353, 晚報 0.05882353]西安 : [火車站 1.0, 事變 0.75, 交通 0.7058824, 建設 0.5882353, 地鐵 0.5882353, >咸陽 0.5588235, 來到 0.5294118, 市民 0.50735295, 大學 0.5, 鐵路 0.5, 代表團 0.5, 鐵路局 0.49264705, 公司 0.4852941, 武漢 0.4632353, 曲江 0.44117647, 供電 0.42647058, 新華社 0.4117647, 西安火車站 0.4117647, 北京 0.3602941, 交大 0.3602941, 本報 0.34558824, 西安事變 0.3382353, 城市 0.31617647, 城區 0.31617647, 落戶 0.30882353, 市委 0.29411766, 國際 0.2867647, 城東 0.2867647, 成都 0.2720588, 舉行 0.25] 哈爾濱 : [理工大學 1.0, 火車站 0.41584158, 哈爾濱理工大學 0.36138615, 工業 0.25742576, 方向 0.23762377, 新華社 0.20792079, 開往 0.18811882, 哈爾濱火車站 0.18316832, 位於 0.17821783, 大學 0.17326732, 鐵路局 0.15841584, 來自 0.15346535, 最低 0.14356436, 北京 0.12871288, 本報 0.12376238, 黑龍江省 0.12376238, 釋出 0.11386139, 中國 0.10891089, 飛往 0.0990099, 黑龍>江 0.08415841, 瀋陽 0.07920792, 工程 0.07920792, 附近 0.074257426, 市委 0.06930693, 飛機 0.06930693, 上海 0.06930693, 考生 0.06930693, 進入 0.06930693, 停止 0.06930693, 經濟 0.06435644]南寧 : [廣西 1.0, 鐵路局 0.8, 廣西南寧 0.62222224, 本報 0.54444444, 新華社 0.36666667, 南寧鐵路局 0.31111112, 市委 0.26666668, 柳州 0.18888889, 桂林 0.17777778, 鐵路 0.15555556, 興>寧區 0.14444445, 來到 0.11111111, 開往 0.11111111, 前往 0.11111111, 公安 0.11111111, 工作 0.11111111, 運往 0.11111111, 城市 0.08888889, 美麗 0.08888889, 召開 0.08888889, 從事 0.08888889, 官塘 0.08888889, 樓市 0.08888889, 分局 0.07777778, 南寧市委 0.07777778, 動車 0.07777778, 發生 0.07777778, 舉行 0.07777778, 西鄉 0.06666667, 市長 0.06666667]貴陽 : [本報 1.0, 重慶 0.73333335, 新華社 0.46666667, 方向 0.43333334, 前往 0.4, 哥倆 0.4, 城區 0.4, 老家 0.33333334, 西安 0.26666668, 成都 0.26666668, 街頭 0.26666668, 晚報 0.26666668, 無關 0.26666668, 杭州 0.23333333, 涉及 0.2, 以及 0.2, 市內 0.2, 網友 0.2, 鄭州 0.16666667, 南寧 0.16666667, 長沙 0.16666667, 武漢 0.16666667, 擺攤 0.16666667, 市委 0.13333334, 昆明 0.13333334, 安順 0.13333334, 來到 0.13333334, 爭霸 0.13333334, 四強 0.13333334, 鐵路 0.13333334]慶陽 : [甘肅 1.0, 甘肅慶陽 0.8, 甘肅省 0.4, 地區 0.4, 老區 0.3, 森林 0.2, 平涼 0.2, 鎮遠縣 0.1, 革命 0.1, 韓鳳廷 0.1, 交通處 0.1, 蘭州森林大隊 0.1, 大隊 0.1, 蘭州 0.1, 西峰 0.1, 發>送 0.1, 一輛 0.1, 牌照 0.1, 來自 0.1]瀋陽 : [軍區 1.0, 晚報 0.5123967, 方向 0.3181818, 本報 0.27272728, 瀋陽晚報 0.23553719, 新華社 0.20661157, 瀋陽軍區 0.18595041, 軍區隊 0.15289256, 海獅隊 0.14876033, 自動化所 0.14049587, 此次 0.14049587, 經濟區 0.1322314, 中國 0.12809917, >大連 0.12809917, 大爺 0.12809917, 市委 0.12396694, 一家 0.11570248, 高速 0.11570248, 國際 0.11157025, 火車票 0.11157025, 法庫 0.10743801, 大學 0.10330579, 長春 0.10330579, 直達 0.09917355, 深圳 0.09090909, 上海 0.08677686, 記者 0.08677686, 海獅 0.08264463, 大媽 0.08264463, 兩位 0.08264463] 合肥 : [火車站 1.0, 市民 0.8181818, 市區 0.53333336, 樓市 0.4848485, 合肥火車站 0.4121212, 鐵路 0.38787878, 安徽 0.36969697, 到達 0.36363637, 市場 0.34545454, 上週 0.3030303, 蕪湖 0.2969697, 召開 0.28484848, 記者 0.27272728, 成為 0.27272728, 來到 0.26666668, 安徽合肥 0.24242425, 城市 0.24242425, 經濟圈 0.24242425, 公交 0.24242425, 目前 0.23636363, 本報 0.21818182, 今年 0.21818182, 起飛 0.21818182, 汽車 0.21212122, 物質 0.2060606, 合肥樓市 0.2060606, 空港 0.2060606, 工業 0.19393939, 標題 0.18181819, 野生 0.16969697]大同 : [大學 1.0, 鐵路 0.52380955, 山西 0.5, 證券 0.33333334, 大同大學 0.33333334, 山西省 0.23809524, 此次 0.23809524, 山西大同 0.1904762, 世界 0.1904762, 世界大同 0.1904762, 街道 0.16666667, 太原 0.14285715, 市委 0.14285715, 上海 0.14285715, 派出所 0.14285715, 公安處 0.14285715, 日方 0.14285715, 轉發 0.14285715, 運城 0.11904762, 軍分割槽 0.0952381, 礦務局 0.0952381, 小學 0.0952381, 參加 0.0952381, 專案 0.0952381, 中學 0.0952381, 水廠 0.0952381, 車輛段 0.0952381, 開往 0.0952381, 大同證券 0.0952381, 戰役 0.071428575]拉薩 : [火車站 1.0, 新華社 0.91935486, 西藏 0.7580645, 市區 0.61290324, 本報 0.58064514, 召開 0.5645161, 海關 0.5483871, 城市 0.48387095, 拉薩火車站 0.4032258, 市委 0.38709676, 成都 0.37096775, 貢嘎 0.3548387, 開幕 0.32258064, 釋出 0.30645162, 西藏拉薩 0.2580645, 會議 0.2580645, 機場 0.22580644, 閉幕 0.22580644, 隆重 0.22580644, 林芝 0.20967741, 舉行 0.19354838, 開通 0.19354838, 營業部 0.19354838, 市民 0.17741935, 市場 0.17741935, 經濟 0.17741935, 中心 0.17741935, 空氣 0.17741935, 成為 0.17741935, 人民 0.16129032]西寧 : [新華社 1.0, 上海 0.8235294, 蘭州 0.3529412, 輾轉 0.3529412, 本報 0.29411766, 青海 0.29411766, 考察 0.23529412, 當街 0.23529412, 特鋼 0.1764706, 方向 0.1764706, 分行 0.1764706, 索賄 0.1764706, 北京 0.14705883, 但是 0.14705883, 拉薩 0.11764706, 我們 0.11764706, 標題 0.11764706, 交警 0.11764706, 代表團 0.11764706, 處理 0.0882353, 銀川 0.0882353, 車票 0.0882353, 籌建 0.0882353, 中轉 0.0882353, 參加 0.0882353, 一月 0.05882353, 試驗局 0.05882353, 二月 0.05882353, 地區 0.05882353, 嚴肅 0.05882353] 最後我們看一下分別使用7種相似度演算法算出來的 蘭州 的相關詞:----------------------------------------------------------蘭州 的相關詞(CosineTextSimilarity): 1、蘭州 1.0 2、瀋陽 0.5 3、北京軍區 0.47 4、後勤部 0.46 5、瀋陽軍區 0.46 6、總醫院 0.46 7、新疆軍區 0.46 8、司令員 0.42 9、甘肅蘭州 0.42 10、蘭州新區 0.42 11、某師 0.39 12、鄭蒲港 0.38 13、西鹹 0.38 14、天水 0.37 15、鄭東 0.37耗時:25秒,572毫秒----------------------------------------------------------蘭州 的相關詞(EditDistanceTextSimilarity): 1、蘭州 1.0 2、北京 0.21 3、福州 0.2 4、太原 0.19 5、成都 0.17 6、南寧 0.17 7、西安 0.17 8、哈爾濱 0.17 9、貴陽 0.16 10、慶陽 0.15 11、合肥 0.14 12、大同 0.14 13、瀋陽 0.14 14、珀斯 0.13 15、拉薩 0.13耗時:44秒,253毫秒----------------------------------------------------------蘭州 的相關詞(EuclideanDistanceTextSimilarity): 1、蘭州 1.0 2、後勤部 0.37 3、北京軍區 0.37 4、新疆軍區 0.37 5、瀋陽 0.37 6、瀋陽軍區 0.37 7、總醫院 0.37 8、上海浦東新區 0.36 9、鄭蒲港 0.36 10、浦東新區 0.36 11、甘肅蘭州 0.36 12、西鹹 0.36 13、西鹹新區 0.36 14、正定新區 0.36 15、司令員 0.36耗時:24秒,710毫秒----------------------------------------------------------蘭州 的相關詞(SimpleTextSimilarity): 1、蘭州 1.0 2、福州 0.36 3、西安 0.33 4、李紅旗 0.33 5、中國金融資訊中心 0.33 6、南特 0.32 7、卡塔赫納 0.32 8、哈爾濱 0.3 9、武漢 0.3 10、戴克瑞 0.3 11、楚雄州 0.29 12、朱夢魁 0.29 13、嶽菲菲 0.29 14、長沙 0.28 15、呂國慶 0.28耗時:21秒,918毫秒----------------------------------------------------------蘭州 的相關詞(JaccardTextSimilarity): 1、蘭州 1.0 2、福州 0.22 3、西安 0.2 4、哈爾濱 0.18 5、北京 0.18 6、武漢 0.18 7、成都 0.18 8、長沙 0.15 9、太原 0.15 10、貴陽 0.15 11、瀋陽 0.15 12、廣州 0.15 13、拉薩 0.15 14、南昌 0.15 15、長春 0.13耗時:19秒,717毫秒----------------------------------------------------------蘭州 的相關詞(ManhattanDistanceTextSimilarity): 1、蘭州 1.0 2、上海浦東新區 0.11 3、陝西西鹹新區 0.11 4、甘肅蘭州 0.11 5、北京軍區 0.11 6、新疆軍區 0.11 7、西鹹 0.11 8、正定新區 0.11 9、天府新區 0.11 10、瀋陽軍區 0.11 11、國家級新區 0.11 12、蘭州新區 0.11 13、俠客 0.1 14、威脅論 0.1 15、一兩個月 0.1耗時:23秒,857毫秒----------------------------------------------------------蘭州 的相關詞(SimHashPlusHammingDistanceTextSimilarity): 1、蘭州 1.0 2、魚水 0.96 3、馮導 0.95 4、新聞稿 0.95 5、科學 0.95 6、物業公司 0.95 7、現役軍人 0.95 8、何人 0.95 9、張軫 0.94 10、公告 0.94 11、資訊釋出 0.94 12、倡議 0.94 13、藥液 0.94 14、考古發掘 0.94 15、公開發布 0.94耗時:5分鐘,57秒,339毫秒----------------------------------------------------------蘭州 的相關詞(JaroDistanceTextSimilarity): 1、蘭州 1.0 2、長沙 0.49 3、哈爾濱 0.49 4、福州 0.48 5、太原 0.47 6、慶陽 0.46 7、濟南 0.46 8、北京 0.45 9、成都 0.45 10、張家明 0.45 11、西安 0.45 12、孫勇 0.45 13、楚雄州 0.44 14、福州站 0.44 15、南寧 0.44耗時:12秒,718毫秒----------------------------------------------------------蘭州 的相關詞(JaroWinklerDistanceTextSimilarity): 1、蘭州 1.0 2、拉薩 0.56 3、南寧 0.55 4、朝廷 0.55 5、公判 0.54 6、薩蒙德 0.53 7、世界級 0.53 8、濱湖 0.53 9、大大小小 0.52 10、大選 0.52 11、七屆 0.52 12、烘焙 0.51 13、武平縣 0.51 14、莫斯科 0.51 15、複訓 0.51耗時:16秒,723毫秒----------------------------------------------------------蘭州 的相關詞(SørensenDiceCoefficientTextSimilarity): 1、蘭州 1.0 2、福州 0.37 3、西安 0.33 4、哈爾濱 0.3 5、北京 0.3 6、武漢 0.3 7、成都 0.3 8、長沙 0.27 9、太原 0.27 10、貴陽 0.27 11、瀋陽 0.27 12、廣州 0.27 13、拉薩 0.27 14、南昌 0.27 15、長春 0.23耗時:19秒,852毫秒----------------------------------------------------------

####21、詞頻統計:

org.apdplat.word.WordFrequencyStatistics 提供了詞頻統計的功能

命令列指令碼的呼叫方法如下:

將需要統計詞頻的文字寫入檔案:text.txtchmod +x wfs.sh & wfs.sh -textFile=text.txt -statisticsResultFile=statistics-result.txt程式執行結束後開啟檔案statistics-result.txt檢視詞頻統計結果

在程式中的呼叫方法如下:

//詞頻統計設定WordFrequencyStatistics wordFrequencyStatistics = new WordFrequencyStatistics();wordFrequencyStatistics.setRemoveStopWord(false);wordFrequencyStatistics.setResultPath("word-frequency-statistics.txt");wordFrequencyStatistics.setSegmentationAlgorithm(SegmentationAlgorithm.MaxNgramScore);//開始分詞wordFrequencyStatistics.seg("明天下雨,結合成分子,明天有關於分子和原子的課程,下雨了也要去聽課");//輸出詞頻統計結果wordFrequencyStatistics.dump();//準備檔案Files.write(Paths.get("text-to-seg.txt"), Arrays.asList("word分詞是一個Java實現的分散式中文分片語件,提供了多種基於詞典的分詞演算法,並利用ngram模型來消除歧義。"));//清除之前的統計結果wordFrequencyStatistics.reset();//對檔案進行分詞wordFrequencyStatistics.seg(new File("text-to-seg.txt"), new File("text-seg-result.txt"));//輸出詞頻統計結果wordFrequencyStatistics.dump("file-seg-statistics-result.txt");

第一句話的詞頻統計結果:

1、下雨 22、明天 23、分子 24、課程 15、聽課 16、結合 17、原子 18、去 19、成 110、關於 111、和 112、也要 113、有 114、的 115、了 1

第二句話的詞頻統計結果:

1、分詞 22、的 23、基於 14、word 15、元件 16、詞典 17、ngram 18、多種 19、實現 110、並 111、利用 112、消除歧義 113、中文分詞 114、演算法 115、是 116、分散式 117、了 118、提供 119、模型 120、來 121、一個 122、Java 1 

####22、文字相似度:

word分詞提供了多種文字相似度計算方式:

方式一:餘弦相似度,通過計算兩個向量的夾角餘弦值來評估他們的相似度

實現類:org.apdplat.word.analysis.CosineTextSimilarity

用法如下:

String text1 = "我愛購物";String text2 = "我愛讀書";String text3 = "他是黑客";TextSimilarity textSimilarity = new CosineTextSimilarity();double score1pk1 = textSimilarity.similarScore(text1, text1);double score1pk2 = textSimilarity.similarScore(text1, text2);double score1pk3 = textSimilarity.similarScore(text1, text3);double score2pk2 = textSimilarity.similarScore(text2, text2);double score2pk3 = textSimilarity.similarScore(text2, text3);double score3pk3 = textSimilarity.similarScore(text3, text3);System.out.println(text1+" 和 "+text1+" 的相似度分值:"+score1pk1);System.out.println(text1+" 和 "+text2+" 的相似度分值:"+score1pk2);System.out.println(text1+" 和 "+text3+" 的相似度分值:"+score1pk3);System.out.println(text2+" 和 "+text2+" 的相似度分值:"+score2pk2);System.out.println(text2+" 和 "+text3+" 的相似度分值:"+score2pk3);System.out.println(text3+" 和 "+text3+" 的相似度分值:"+score3pk3);

執行結果如下:

我愛購物 和 我愛購物 的相似度分值:1.0我愛購物 和 我愛讀書 的相似度分值:0.67我愛購物 和 他是黑客 的相似度分值:0.0我愛讀書 和 我愛讀書 的相似度分值:1.0我愛讀書 和 他是黑客 的相似度分值:0.0他是黑客 和 他是黑客 的相似度分值:1.0

方式二:簡單共有詞,通過計算兩篇文件共有的詞的總字元數除以最長文件字元數來評估他們的相似度

實現類:org.apdplat.word.analysis.SimpleTextSimilarity

用法如下:

String text1 = "我愛購物";String text2 = "我愛讀書";String text3 = "他是黑客";TextSimilarity textSimilarity = new SimpleTextSimilarity();double score1pk1 = textSimilarity.similarScore(text1, text1);double score1pk2 = textSimilarity.similarScore(text1, text2);double score1pk3 = textSimilarity.similarScore(text1, text3);double score2pk2 = textSimilarity.similarScore(text2, text2);double score2pk3 = textSimilarity.similarScore(text2, text3);double score3pk3 = textSimilarity.similarScore(text3, text3);System.out.println(text1+" 和 "+text1+" 的相似度分值:"+score1pk1);System.out.println(text1+" 和 "+text2+" 的相似度分值:"+score1pk2);System.out.println(text1+" 和 "+text3+" 的相似度分值:"+score1pk3);System.out.println(text2+" 和 "+text2+" 的相似度分值:"+score2pk2);System.out.println(text2+" 和 "+text3+" 的相似度分值:"+score2pk3);System.out.println(text3+" 和 "+text3+" 的相似度分值:"+score3pk3);

執行結果如下:

我愛購物 和 我愛購物 的相似度分值:1.0我愛購物 和 我愛讀書 的相似度分值:0.5我愛購物 和 他是黑客 的相似度分值:0.0我愛讀書 和 我愛讀書 的相似度分值:1.0我愛讀書 和 他是黑客 的相似度分值:0.0他是黑客 和 他是黑客 的相似度分值:1.0

方式三:編輯距離,通過計算兩個字串之間由一個轉成另一個所需的最少編輯操作次數來評估他們的相似度

實現類:org.apdplat.word.analysis.EditDistanceTextSimilarity

用法如下:

String text1 = "我愛購物";String text2 = "我愛讀書";String text3 = "他是黑客";TextSimilarity textSimilarity = new EditDistanceTextSimilarity();double score1pk1 = textSimilarity.similarScore(text1, text1);double score1pk2 = textSimilarity.similarScore(text1, text2);double score1pk3 = textSimilarity.similarScore(text1, text3);double score2pk2 = textSimilarity.similarScore(text2, text2);double score2pk3 = textSimilarity.similarScore(text2, text3);double score3pk3 = textSimilarity.similarScore(text3, text3);System.out.println(text1+" 和 "+text1+" 的相似度分值:"+score1pk1);System.out.println(text1+" 和 "+text2+" 的相似度分值:"+score1pk2);System.out.println(text1+" 和 "+text3+" 的相似度分值:"+score1pk3);System.out.println(text2+" 和 "+text2+" 的相似度分值:"+score2pk2);System.out.println(text2+" 和 "+text3+" 的相似度分值:"+score2pk3);System.out.println(text3+" 和 "+text3+" 的相似度分值:"+score3pk3);

執行結果如下:

我愛購物 和 我愛購物 的相似度分值:1.0我愛購物 和 我愛讀書 的相似度分值:0.5我愛購物 和 他是黑客 的相似度分值:0.0我愛讀書 和 我愛讀書 的相似度分值:1.0我愛讀書 和 他是黑客 的相似度分值:0.0他是黑客 和 他是黑客 的相似度分值:1.0

方式四:SimHash + 漢明距離,先使用SimHash把不同長度的文字對映為等長文字,然後再計算等長文字的漢明距離

實現類:org.apdplat.word.analysis.SimHashPlusHammingDistanceTextSimilarity

用法如下:

String text1 = "我愛購物";String text2 = "我愛讀書";String text3 = "他是黑客";TextSimilarity textSimilarity = new SimHashPlusHammingDistanceTextSimilarity();double score1pk1 = textSimilarity.similarScore(text1, text1);double score1pk2 = textSimilarity.similarScore(text1, text2);double score1pk3 = textSimilarity.similarScore(text1, text3);double score2pk2 = textSimilarity.similarScore(text2, text2);double score2pk3 = textSimilarity.similarScore(text2, text3);double score3pk3 = textSimilarity.similarScore(text3, text3);System.out.println(text1+" 和 "+text1+" 的相似度分值:"+score1pk1);System.out.println(text1+" 和 "+text2+" 的相似度分值:"+score1pk2);System.out.println(text1+" 和 "+text3+" 的相似度分值:"+score1pk3);System.out.println(text2+" 和 "+text2+" 的相似度分值:"+score2pk2);System.out.println(text2+" 和 "+text3+" 的相似度分值:"+score2pk3);System.out.println(text3+" 和 "+text3+" 的相似度分值:"+score3pk3);

執行結果如下:

我愛購物 和 我愛購物 的相似度分值:1.0我愛購物 和 我愛讀書 的相似度分值:0.95我愛購物 和 他是黑客 的相似度分值:0.83我愛讀書 和 我愛讀書 的相似度分值:1.0我愛讀書 和 他是黑客 的相似度分值:0.86他是黑客 和 他是黑客 的相似度分值:1.0

方式五:Jaccard相似性係數(Jaccard similarity coefficient),通過計算兩個集合交集的大小除以並集的大小來評估他們的相似度

實現類:org.apdplat.word.analysis.JaccardTextSimilarity

用法如下:

String text1 = "我愛購物";String text2 = "我愛讀書";String text3 = "他是黑客";TextSimilarity textSimilarity = new JaccardTextSimilarity();double score1pk1 = textSimilarity.similarScore(text1, text1);double score1pk2 = textSimilarity.similarScore(text1, text2);double score1pk3 = textSimilarity.similarScore(text1, text3);double score2pk2 = textSimilarity.similarScore(text2, text2);double score2pk3 = textSimilarity.similarScore(text2, text3);double score3pk3 = textSimilarity.similarScore(text3, text3);System.out.println(text1+" 和 "+text1+" 的相似度分值:"+score1pk1);System.out.println(text1+" 和 "+text2+" 的相似度分值:"+score1pk2);System.out.println(text1+" 和 "+text3+" 的相似度分值:"+score1pk3);System.out.println(text2+" 和 "+text2+" 的相似度分值:"+score2pk2);System.out.println(text2+" 和 "+text3+" 的相似度分值:"+score2pk3);System.out.println(text3+" 和 "+text3+" 的相似度分值:"+score3pk3);

執行結果如下:

我愛購物 和 我愛購物 的相似度分值:1.0我愛購物 和 我愛讀書 的相似度分值:0.5我愛購物 和 他是黑客 的相似度分值:0.0我愛讀書 和 我愛讀書 的相似度分值:1.0我愛讀書 和 他是黑客 的相似度分值:0.0他是黑客