word 1.0 APIhtml
word 1.1 APIjava
word 1.2 APIgit
word 1.0github
word 1.1web
word 1.2redis
在pom.xml中指定dependency,可用版本有1.0、1.一、1.2:算法
<dependencies> <dependency> <groupId>org.apdplat</groupId> <artifactId>word</artifactId> <version>1.2</version> </dependency> </dependencies>
運行項目根目錄下的腳本demo-word.bat能夠快速體驗分詞效果 用法: command [text] [input] [output] 命令command的可選值爲:demo、text、file demo text 楊尚川是APDPlat應用級產品開發平臺的做者 file d:/text.txt d:/word.txt exit
移除停用詞:List<Word> words = WordSegmenter.seg("楊尚川是APDPlat應用級產品開發平臺的做者"); 保留停用詞:List<Word> words = WordSegmenter.segWithStopWords("楊尚川是APDPlat應用級產品開發平臺的做者"); System.out.println(words); 輸出: 移除停用詞:[楊尚川, apdplat, 應用級, 產品, 開發平臺, 做者] 保留停用詞:[楊尚川, 是, apdplat, 應用級, 產品, 開發平臺, 的, 做者]
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));
默認配置文件爲類路徑下的word.conf,打包在word-x.x.jar中 自定義配置文件爲類路徑下的word.local.conf,須要用戶本身提供 若是自定義配置和默認配置相同,自定義配置會覆蓋默認配置 配置文件編碼爲UTF-8
自定義用戶詞庫爲一個或多個文件夾或文件,可使用絕對路徑或相對路徑 用戶詞庫由多個詞典文件組成,文件編碼爲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詞典文件
使用方式和自定義用戶詞庫相似,配置項爲: stopwords.path=classpath:stopwords.txt,d:/custom_stopwords_dic
能夠自動檢測自定義用戶詞庫和自定義停用詞詞庫的變化 包含類路徑下的文件和文件夾、非類路徑下的絕對路徑和相對路徑 如: classpath:dic.txt,classpath:custom_dic_dir, d:/dic_more.txt,d:/DIC_DIR,D:/DIC2_DIR,my_dic_dir,my_dic_file.txt classpath:stopwords.txt,classpath:custom_stopwords_dic_dir, d:/stopwords_more.txt,d:/STOPWORDS_DIR,d:/STOPWORDS2_DIR,stopwords_dir,remove.txt
對文本進行分詞時,可顯式指定特定的分詞算法,如: WordSegmenter.seg("APDPlat應用級產品開發平臺", SegmentationAlgorithm.BidirectionalMaximumMatching); SegmentationAlgorithm的可選類型爲: 正向最大匹配算法:MaximumMatching 逆向最大匹配算法:ReverseMaximumMatching 正向最小匹配算法:MinimumMatching 逆向最小匹配算法:ReverseMinimumMatching 雙向最大匹配算法:BidirectionalMaximumMatching 雙向最小匹配算法:BidirectionalMinimumMatching 雙向最大最小匹配算法:BidirectionalMaximumMinimumMatching 全切分算法:FullSegmentation 最少分詞算法:MinimalWordCount 最大Ngram分值算法:MaxNgramScore
運行項目根目錄下的腳本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,***爲各類分詞算法名稱,這是分詞結果和人工標註標準不一致的文本
一、在自定義配置文件word.conf或word.local.conf中指定全部的配置項*.path使用HTTP資源,同時指定配置項redis.* 二、配置並啓動提供HTTP資源的web服務器,將項目:https://github.com/ysc/word_web部署到tomcat 三、配置並啓動redis服務器
將分詞結果做爲輸入參數,調用PartOfSpeechTagging類的process方法,詞性保存在Word類的partOfSpeech字段中 以下所示: List<Word> words = WordSegmenter.segWithStopWords("我愛中國"); System.out.println("未標註詞性:"+words); //詞性標註 PartOfSpeechTagging.process(words); System.out.println("標註詞性:"+words); 輸出內容: 未標註詞性:[我, 愛, 中國] 標註詞性:[我/r, 愛/v, 中國/ns]
咱們看一個切分例子: 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); 這樣,就能達到咱們想要的效果: [在, 實現, 兩個一百年, 奮鬥目標, 的, 偉大征程, 上, 再創, 新的, 業績]
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是間接同義詞
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()
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
一、構造一個word分析器ChineseWordAnalyzer Analyzer analyzer = new ChineseWordAnalyzer(); 若是須要使用特定的分詞算法,可經過構造函數來指定: Analyzer analyzer = new ChineseWordAnalyzer(SegmentationAlgorithm.FullSegmentation); 如不指定,默認使用雙向最大匹配算法:SegmentationAlgorithm.BidirectionalMaximumMatching 可用的分詞算法參見枚舉類:SegmentationAlgorithm 二、利用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); //詞性 PartOfSpeechAttribute partOfSpeechAttribute = tokenStream.getAttribute(PartOfSpeechAttribute.class); //首字母縮略拼音 AcronymPinyinAttribute acronymPinyinAttribute = tokenStream.getAttribute(AcronymPinyinAttribute.class); //完整拼音 FullPinyinAttribute fullPinyinAttribute = tokenStream.getAttribute(FullPinyinAttribute.class); //同義詞 SynonymAttribute synonymAttribute = tokenStream.getAttribute(SynonymAttribute.class); //反義詞 AntonymAttribute antonymAttribute = tokenStream.getAttribute(AntonymAttribute.class); LOGGER.info(charTermAttribute.toString()+" ("+offsetAttribute.startOffset()+" - "+offsetAttribute.endOffset()+") "+positionIncrementAttribute.getPositionIncrement()); LOGGER.info("PartOfSpeech:"+partOfSpeechAttribute.toString()); LOGGER.info("AcronymPinyin:"+acronymPinyinAttribute.toString()); LOGGER.info("FullPinyin:"+fullPinyinAttribute.toString()); LOGGER.info("Synonym:"+synonymAttribute.toString()); LOGGER.info("Antonym:"+antonymAttribute.toString()); } //消費完畢 tokenStream.close(); 三、利用word分析器創建Lucene索引 Directory directory = new RAMDirectory(); IndexWriterConfig config = new IndexWriterConfig(analyzer); IndexWriter indexWriter = new IndexWriter(directory, config); 四、利用word分析器查詢Lucene索引 QueryParser queryParser = new QueryParser("text", analyzer); Query query = queryParser.parse("text:楊尚川"); TopDocs docs = indexSearcher.search(query, Integer.MAX_VALUE);
一、下載word-1.3.jar 下載地址:http://search.maven.org/remotecontent?filepath=org/apdplat/word/1.3/word-1.3.jar 二、建立目錄solr-5.1.0/example/solr/lib,將word-1.3.jar複製到lib目錄 三、配置schema指定分詞器 將solr-5.1.0/example/solr/collection1/conf/schema.xml文件中全部的 <tokenizer class="solr.WhitespaceTokenizerFactory"/>和 <tokenizer class="solr.StandardTokenizerFactory"/>所有替換爲 <tokenizer class="org.apdplat.word.solr.ChineseWordTokenizerFactory"/> 並移除全部的filter標籤 四、若是須要使用特定的分詞算法: <tokenizer class="org.apdplat.word.solr.ChineseWordTokenizerFactory" segAlgorithm="ReverseMinimumMatching"/> segAlgorithm可選值有: 正向最大匹配算法:MaximumMatching 逆向最大匹配算法:ReverseMaximumMatching 正向最小匹配算法:MinimumMatching 逆向最小匹配算法:ReverseMinimumMatching 雙向最大匹配算法:BidirectionalMaximumMatching 雙向最小匹配算法:BidirectionalMinimumMatching 雙向最大最小匹配算法:BidirectionalMaximumMinimumMatching 全切分算法:FullSegmentation 最少分詞算法:MinimalWordCount 最大Ngram分值算法:MaxNgramScore 如不指定,默認使用雙向最大匹配算法:BidirectionalMaximumMatching 五、若是須要指定特定的配置文件: <tokenizer class="org.apdplat.word.solr.ChineseWordTokenizerFactory" segAlgorithm="ReverseMinimumMatching" conf="solr-5.1.0/example/solr/nutch/conf/word.local.conf"/> word.local.conf文件中可配置的內容見 word-1.3.jar 中的word.conf文件 如不指定,使用默認配置文件,位於 word-1.3.jar 中的word.conf文件
一、打開命令行並切換到elasticsearch的bin目錄 cd elasticsearch-1.5.1/bin 二、運行plugin腳本安裝word分詞插件: ./plugin -u http://apdplat.org/word/archive/v1.2.zip -i word 三、修改文件elasticsearch-1.5.1/config/elasticsearch.yml,新增以下配置: index.analysis.analyzer.default.type : "word" index.analysis.tokenizer.default.type : "word" 四、啓動ElasticSearch測試效果,在Chrome瀏覽器中訪問: http://localhost:9200/_analyze?analyzer=word&text=楊尚川是APDPlat應用級產品開發平臺的做者 五、自定義配置 修改配置文件elasticsearch-1.5.1/plugins/word/word.local.conf 六、指定分詞算法 修改文件elasticsearch-1.5.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
一、下載http://luke.googlecode.com/files/lukeall-4.0.0-ALPHA.jar(國內不能訪問) 二、下載並解壓Java中文分詞組件word-1.0-bin.zip:http://pan.baidu.com/s/1dDziDFz 三、將解壓後的 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裏面 四、執行命令 java -jar lukeall-4.0.0-ALPHA.jar 啓動luke,在Search選項卡的Analysis裏面 就能夠選擇 org.apdplat.word.lucene.ChineseWordAnalyzer 分詞器了 五、在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.jarapi
從大規模語料中統計一個詞的上下文相關詞,並用這些上下文相關詞組成的向量來表達這個詞。 經過計算詞向量的類似性,便可獲得詞的類似性。 類似性的假設是創建在若是兩個詞的上下文相關詞越類似,那麼這兩個詞就越類似這個前提下的。 經過運行項目根目錄下的腳本demo-word-vector-corpus.bat來體驗word項目自帶語料庫的效果 若是有本身的文本內容,可使用腳本demo-word-vector-file.bat來對文本分詞、創建詞向量、計算類似性
一、word分詞 最大Ngram分值算法: 分詞速度:397.73047 字符/毫秒 行數完美率:59.93% 行數錯誤率:40.06% 總的行數:2533709 完美行數:1518525 錯誤行數:1015184 字數完美率:51.56% 字數錯誤率:48.43% 總的字數:28374490 完美字數:14632098 錯誤字數:13742392 二、word分詞 全切分算法: 分詞速度:67.032585 字符/毫秒 行數完美率:57.2% 行數錯誤率:42.79% 總的行數:2533709 完美行數:1449288 錯誤行數:1084421 字數完美率:47.95% 字數錯誤率:52.04% 總的字數:28374490 完美字數:13605742 錯誤字數:14768748 三、word分詞 雙向最大最小匹配算法: 分詞速度:367.99805 字符/毫秒 行數完美率:53.06% 行數錯誤率:46.93% 總的行數:2533709 完美行數:1344624 錯誤行數:1189085 字數完美率:43.07% 字數錯誤率:56.92% 總的字數:28374490 完美字數:12221610 錯誤字數:16152880 四、word分詞 最少分詞算法: 分詞速度:364.40622 字符/毫秒 行數完美率:47.75% 行數錯誤率:52.24% 總的行數:2533709 完美行數:1209976 錯誤行數:1323733 字數完美率:37.59% 字數錯誤率:62.4% 總的字數:28374490 完美字數:10666443 錯誤字數:17708047 五、word分詞 雙向最小匹配算法: 分詞速度:657.13635 字符/毫秒 行數完美率:46.34% 行數錯誤率:53.65% 總的行數:2533709 完美行數:1174276 錯誤行數:1359433 字數完美率:36.07% 字數錯誤率:63.92% 總的字數:28374490 完美字數:10236574 錯誤字數:18137916 六、word分詞 雙向最大匹配算法: 分詞速度:539.0905 字符/毫秒 行數完美率:46.18% 行數錯誤率:53.81% 總的行數:2533709 完美行數:1170075 錯誤行數:1363634 字數完美率:35.65% 字數錯誤率:64.34% 總的字數:28374490 完美字數:10117122 錯誤字數:18257368 七、word分詞 正向最大匹配算法: 分詞速度:662.2127 字符/毫秒 行數完美率:41.88% 行數錯誤率:58.11% 總的行數:2533709 完美行數:1061189 錯誤行數:1472520 字數完美率:31.35% 字數錯誤率:68.64% 總的字數:28374490 完美字數:8896173 錯誤字數:19478317 八、word分詞 逆向最大匹配算法: 分詞速度:1082.0459 字符/毫秒 行數完美率:41.69% 行數錯誤率:58.3% 總的行數:2533709 完美行數:1056515 錯誤行數:1477194 字數完美率:30.98% 字數錯誤率:69.01% 總的字數:28374490 完美字數:8792532 錯誤字數:19581958 九、word分詞 逆向最小匹配算法: 分詞速度:1906.6315 字符/毫秒 行數完美率:41.42% 行數錯誤率:58.57% 總的行數:2533709 完美行數:1049673 錯誤行數:1484036 字數完美率:31.34% 字數錯誤率:68.65% 總的字數:28374490 完美字數:8893622 錯誤字數:19480868 十、word分詞 正向最小匹配算法: 分詞速度:1839.1554 字符/毫秒 行數完美率:36.7% 行數錯誤率:63.29% 總的行數:2533709 完美行數:930069 錯誤行數:1603640 字數完美率:26.72% 字數錯誤率:73.27% 總的字數:28374490 完美字數:7583741 錯誤字數:20790749