Java分布式中文分词组件 - word分词(转自:https://github.com/ysc/word)
###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、file demo text 楊尚川是APDPlat應用級產品開發平臺的作者 file d:/text.txt d:/word.txt exit####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部署到tomcat 3、配置并啟動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分析器ChineseWordAnalyzer Analyzer 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 word3、修改文件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.conf6、指定分詞算法 修改文件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.sh 2、使用自己的文本內容:運行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.02、北京 0.213、福州 0.24、太原 0.195、成都 0.176、西安 0.177、哈爾濱 0.178、南寧 0.179、貴陽 0.1610、慶陽 0.1511、沈陽 0.1412、合肥 0.1413、大同 0.1414、拉薩 0.1315、西寧 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.02、沈陽 0.53、北京軍區 0.474、后勤部 0.465、沈陽軍區 0.466、總醫院 0.467、新疆軍區 0.468、司令員 0.429、甘肅蘭州 0.4210、蘭州新區 0.4211、某師 0.3912、鄭蒲港 0.3813、西咸 0.3814、天水 0.3715、鄭東 0.37 耗時:25秒,572毫秒 ---------------------------------------------------------- 蘭州 的相關詞(EditDistanceTextSimilarity):1、蘭州 1.02、北京 0.213、福州 0.24、太原 0.195、成都 0.176、南寧 0.177、西安 0.178、哈爾濱 0.179、貴陽 0.1610、慶陽 0.1511、合肥 0.1412、大同 0.1413、沈陽 0.1414、珀斯 0.1315、拉薩 0.13 耗時:44秒,253毫秒 ---------------------------------------------------------- 蘭州 的相關詞(EuclideanDistanceTextSimilarity):1、蘭州 1.02、后勤部 0.373、北京軍區 0.374、新疆軍區 0.375、沈陽 0.376、沈陽軍區 0.377、總醫院 0.378、上海浦東新區 0.369、鄭蒲港 0.3610、浦東新區 0.3611、甘肅蘭州 0.3612、西咸 0.3613、西咸新區 0.3614、正定新區 0.3615、司令員 0.36 耗時:24秒,710毫秒 ---------------------------------------------------------- 蘭州 的相關詞(SimpleTextSimilarity):1、蘭州 1.02、福州 0.363、西安 0.334、李紅旗 0.335、中國金融信息中心 0.336、南特 0.327、卡塔赫納 0.328、哈爾濱 0.39、武漢 0.310、戴克瑞 0.311、楚雄州 0.2912、朱夢魁 0.2913、岳菲菲 0.2914、長沙 0.2815、呂國慶 0.28 耗時:21秒,918毫秒 ---------------------------------------------------------- 蘭州 的相關詞(JaccardTextSimilarity):1、蘭州 1.02、福州 0.223、西安 0.24、哈爾濱 0.185、北京 0.186、武漢 0.187、成都 0.188、長沙 0.159、太原 0.1510、貴陽 0.1511、沈陽 0.1512、廣州 0.1513、拉薩 0.1514、南昌 0.1515、長春 0.13 耗時:19秒,717毫秒 ---------------------------------------------------------- 蘭州 的相關詞(ManhattanDistanceTextSimilarity):1、蘭州 1.02、上海浦東新區 0.113、陜西西咸新區 0.114、甘肅蘭州 0.115、北京軍區 0.116、新疆軍區 0.117、西咸 0.118、正定新區 0.119、天府新區 0.1110、沈陽軍區 0.1111、國家級新區 0.1112、蘭州新區 0.1113、俠客 0.114、威脅論 0.115、一兩個月 0.1 耗時:23秒,857毫秒 ---------------------------------------------------------- 蘭州 的相關詞(SimHashPlusHammingDistanceTextSimilarity):1、蘭州 1.02、魚水 0.963、馮導 0.954、新聞稿 0.955、科學 0.956、物業公司 0.957、現役軍人 0.958、何人 0.959、張軫 0.9410、公告 0.9411、信息發布 0.9412、倡議 0.9413、藥液 0.9414、考古發掘 0.9415、公開發布 0.94 耗時:5分鐘,57秒,339毫秒 ---------------------------------------------------------- 蘭州 的相關詞(JaroDistanceTextSimilarity):1、蘭州 1.02、長沙 0.493、哈爾濱 0.494、福州 0.485、太原 0.476、慶陽 0.467、濟南 0.468、北京 0.459、成都 0.4510、張家明 0.4511、西安 0.4512、孫勇 0.4513、楚雄州 0.4414、福州站 0.4415、南寧 0.44 耗時:12秒,718毫秒 ---------------------------------------------------------- 蘭州 的相關詞(JaroWinklerDistanceTextSimilarity):1、蘭州 1.02、拉薩 0.563、南寧 0.554、朝廷 0.555、公判 0.546、薩蒙德 0.537、世界級 0.538、濱湖 0.539、大大小小 0.5210、大選 0.5211、七屆 0.5212、烘焙 0.5113、武平縣 0.5114、莫斯科 0.5115、復訓 0.51 耗時:16秒,723毫秒 ---------------------------------------------------------- 蘭州 的相關詞(S?rensenDiceCoefficientTextSimilarity):1、蘭州 1.02、福州 0.373、西安 0.334、哈爾濱 0.35、北京 0.36、武漢 0.37、成都 0.38、長沙 0.279、太原 0.2710、貴陽 0.2711、沈陽 0.2712、廣州 0.2713、拉薩 0.2714、南昌 0.2715、長春 0.23 耗時:19秒,852毫秒 ----------------------------------------------------------####21、詞頻統計:
org.apdplat.word.WordFrequencyStatistics 提供了詞頻統計的功能
命令行腳本的調用方法如下:
將需要統計詞頻的文本寫入文件:text.txt chmod +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、下雨 2 2、明天 2 3、分子 2 4、課程 1 5、聽課 1 6、結合 1 7、原子 1 8、去 1 9、成 1 10、關于 1 11、和 1 12、也要 1 13、有 1 14、的 1 15、了 1第二句話的詞頻統計結果:
1、分詞 2 2、的 2 3、基于 1 4、word 1 5、組件 1 6、詞典 1 7、ngram 1 8、多種 1 9、實現 1 10、并 1 11、利用 1 12、消除歧義 1 13、中文分詞 1 14、算法 1 15、是 1 16、分布式 1 17、了 1 18、提供 1 19、模型 1 20、來 1 21、一個 1 22、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 他是黑客 和 他是黑客 的相似度分值:1.0方式六:歐幾里得距離(Euclidean Distance),通過計算兩點間的距離來評估他們的相似度
實現類:org.apdplat.word.analysis.EuclideanDistanceTextSimilarity
用法如下:
String text1 = "我愛購物"; String text2 = "我愛讀書"; String text3 = "他是黑客"; TextSimilarity textSimilarity = new EuclideanDistanceTextSimilarity(); 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.41 我愛購物 和 他是黑客 的相似度分值:0.29 我愛讀書 和 我愛讀書 的相似度分值:1.0 我愛讀書 和 他是黑客 的相似度分值:0.29 他是黑客 和 他是黑客 的相似度分值:1.0方式七:曼哈頓距離(Manhattan Distance),通過計算兩個點在標準坐標系上的絕對軸距總和來評估他們的相似度
實現類:org.apdplat.word.analysis.ManhattanDistanceTextSimilarity
用法如下:
String text1 = "我愛購物"; String text2 = "我愛讀書"; String text3 = "他是黑客"; TextSimilarity textSimilarity = new ManhattanDistanceTextSimilarity(); 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.33 我愛購物 和 他是黑客 的相似度分值:0.14 我愛讀書 和 我愛讀書 的相似度分值:1.0 我愛讀書 和 他是黑客 的相似度分值:0.14 他是黑客 和 他是黑客 的相似度分值:1.0方式八:Jaro距離(Jaro Distance),編輯距離的一種類型
實現類:org.apdplat.word.analysis.JaroDistanceTextSimilarity
用法如下:
String text1 = "我愛購物"; String text2 = "我愛讀書"; String text3 = "他是黑客"; TextSimilarity textSimilarity = new JaroDistanceTextSimilarity(); 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方式九:Jaro–Winkler距離(Jaro–Winkler Distance),Jaro的擴展
實現類:org.apdplat.word.analysis.JaroWinklerDistanceTextSimilarity
用法如下:
String text1 = "我愛購物"; String text2 = "我愛讀書"; String text3 = "他是黑客"; TextSimilarity textSimilarity = new JaroWinklerDistanceTextSimilarity(); 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.73 我愛購物 和 他是黑客 的相似度分值:0.0 我愛讀書 和 我愛讀書 的相似度分值:1.0 我愛讀書 和 他是黑客 的相似度分值:0.0 他是黑客 和 他是黑客 的相似度分值:1.0方式十:S?rensen–Dice系數(S?rensen–Dice coefficient),通過計算兩個集合交集的大小的2倍除以兩個集合的大小之和來評估他們的相似度
實現類:org.apdplat.word.analysis.S?rensenDiceCoefficientTextSimilarity
用法如下:
String text1 = "我愛購物"; String text2 = "我愛讀書"; String text3 = "他是黑客"; TextSimilarity textSimilarity = new S?rensenDiceCoefficientTextSimilarity(); 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####23、判定句子是有意義的人話的可能性:
通過如下命令: unix-like:chmod +x sentence-identify.sh & ./sentence-identify.sh windows:./sentence-identify.bat 運行 org.apdplat.word.analysis.SentenceIdentify 類的結果如下所示:1. 句子: 我是一個男人你是一個女人, 概率: 0.71428573 2. 句子: 我是一個人, 概率: 0.6666667 3. 句子: 我愛讀書, 概率: 0.5 4. 句子: 我愛學習, 概率: 0.5 5. 句子: 法蒂小室汝輩武學大師改個入門處, 概率: 0.2857143 6. 句子: 顯氣孔率高壓線塔總監督室波洛奈茲王毅陳劉玉榮, 概率: 0.2857143 7. 句子: 王捷俊匯報演出干草加韋拉一杠地壟墻未嘗不可, 概率: 0.25 8. 句子: 八九點鐘山光水色飽經世變普留申科淮河鎮樂不極盤模擬飛行, 概率: 0.22222222 9. 句子: 物位任務區亡靈書巴納爾沒腦子揪人心肺復習功課林友力避風塘, 概率: 0.2 10. 句子: 參與方植物學報白善燁暗影狂奔騎白馬痦子山城堡猶豫不定岳陽機場, 概率: 0.2接著可根據命令行提示輸入句子并回車來獲得句子的評分例如輸入句子并回車:為中國崛起而努力奮斗 程序返回結果如下: 隨機單詞: [為, 中國, 崛起, 而, 努力, 奮斗] 生成句子: 為中國崛起而努力奮斗 句子概率: 1.0例如輸入句子并回車:人腦的記憶是保存在生物電上還是在細胞里? 程序返回結果如下: 隨機單詞: [人腦, 的, 記憶, 是, 保存, 在, 生物, 電, 上, 還是, 在, 細胞, 里] 生成句子: 人腦的記憶是保存在生物電上還是在細胞里? 句子概率: 0.8333333###分詞算法效果評估:
1、word分詞 最大Ngram分值算法: 分詞速度:370.9714 字符/毫秒 行數完美率:66.55% 行數錯誤率:33.44% 總的行數:2533709 完美行數:1686210 錯誤行數:847499 字數完美率:60.94% 字數錯誤率:39.05% 總的字數:28374490 完美字數:17293964 錯誤字數:110805262、word分詞 最少詞數算法: 分詞速度:330.1586 字符/毫秒 行數完美率:65.67% 行數錯誤率:34.32% 總的行數:2533709 完美行數:1663958 錯誤行數:869751 字數完美率:60.12% 字數錯誤率:39.87% 總的字數:28374490 完美字數:17059641 錯誤字數:113148493、word分詞 全切分算法: 分詞速度:62.960262 字符/毫秒 行數完美率:57.2% 行數錯誤率:42.79% 總的行數:2533709 完美行數:1449288 錯誤行數:1084421 字數完美率:47.95% 字數錯誤率:52.04% 總的字數:28374490 完美字數:13605742 錯誤字數:147687484、word分詞 雙向最大最小匹配算法: 分詞速度:462.87158 字符/毫秒 行數完美率:53.06% 行數錯誤率:46.93% 總的行數:2533709 完美行數:1344624 錯誤行數:1189085 字數完美率:43.07% 字數錯誤率:56.92% 總的字數:28374490 完美字數:12221610 錯誤字數:161528805、word分詞 雙向最小匹配算法: 分詞速度:967.68604 字符/毫秒 行數完美率:46.34% 行數錯誤率:53.65% 總的行數:2533709 完美行數:1174276 錯誤行數:1359433 字數完美率:36.07% 字數錯誤率:63.92% 總的字數:28374490 完美字數:10236574 錯誤字數:181379166、word分詞 雙向最大匹配算法: 分詞速度:661.148 字符/毫秒 行數完美率:46.18% 行數錯誤率:53.81% 總的行數:2533709 完美行數:1170075 錯誤行數:1363634 字數完美率:35.65% 字數錯誤率:64.34% 總的字數:28374490 完美字數:10117122 錯誤字數:182573687、word分詞 正向最大匹配算法: 分詞速度:1567.1318 字符/毫秒 行數完美率:41.88% 行數錯誤率:58.11% 總的行數:2533709 完美行數:1061189 錯誤行數:1472520 字數完美率:31.35% 字數錯誤率:68.64% 總的字數:28374490 完美字數:8896173 錯誤字數:194783178、word分詞 逆向最大匹配算法: 分詞速度:1232.6017 字符/毫秒 行數完美率:41.69% 行數錯誤率:58.3% 總的行數:2533709 完美行數:1056515 錯誤行數:1477194 字數完美率:30.98% 字數錯誤率:69.01% 總的字數:28374490 完美字數:8792532 錯誤字數:195819589、word分詞 逆向最小匹配算法: 分詞速度:1936.9575 字符/毫秒 行數完美率:41.42% 行數錯誤率:58.57% 總的行數:2533709 完美行數:1049673 錯誤行數:1484036 字數完美率:31.34% 字數錯誤率:68.65% 總的字數:28374490 完美字數:8893622 錯誤字數:1948086810、word分詞 正向最小匹配算法: 分詞速度:2228.9465 字符/毫秒 行數完美率:36.7% 行數錯誤率:63.29% 總的行數:2533709 完美行數:930069 錯誤行數:1603640 字數完美率:26.72% 字數錯誤率:73.27% 總的字數:28374490 完美字數:7583741 錯誤字數:20790749###相關文章:
1、中文分詞算法 之 基于詞典的正向最大匹配算法
2、中文分詞算法 之 基于詞典的逆向最大匹配算法
3、中文分詞算法 之 詞典機制性能優化與測試
4、中文分詞算法 之 基于詞典的正向最小匹配算法
5、中文分詞算法 之 基于詞典的逆向最小匹配算法
6、一種利用ngram模型來消除歧義的中文分詞方法
7、一種基于詞性序列的人名識別方法
8、中文分詞算法 之 基于詞典的全切分算法
9、9大Java開源中文分詞器的使用方法和分詞效果對比
10、中文分詞之11946組同義詞
11、中文分詞之9271組反義詞
12、如何利用多核提升分詞速度
13、利用word分詞來計算文本相似度
14、利用word分詞來對文本進行詞頻統計
15、利用word分詞通過計算詞的語境來獲得相關詞
###相關項目:
Java開源項目cws_evaluation:中文分詞器分詞效果評估對比
Java開源項目QuestionAnsweringSystem:人機問答系統
Java開源項目word_web:通過web服務器對word分詞的資源進行集中統一管理
###相關文獻:
An Implementation of Double-Array Trie
MMSEG: A Word Identification System for Mandarin Chinese Text Based on Two Variants of the Maximum Matching Algorithm
With Google’s new tool Ngram Viewer, you can visualise the rise and fall of concepts across 5 million books and 500 years!
word2vec
魅力漢語
https://travis-ci.org/ysc/word
總結
以上是生活随笔為你收集整理的Java分布式中文分词组件 - word分词(转自:https://github.com/ysc/word)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 细数与计算机有关的诺贝尔物理学奖
- 下一篇: Python爬取网上车市[http://