├── .gitignore ├── .travis.yml ├── LICENSE ├── README.md ├── pom.xml └── src ├── main ├── assemblies │ └── plugin.xml ├── java │ └── org │ │ └── codelibs │ │ └── elasticsearch │ │ └── langfield │ │ ├── LangFieldPlugin.java │ │ ├── detect │ │ ├── LangDetector.java │ │ ├── LangDetectorFactory.java │ │ ├── Language.java │ │ └── util │ │ │ ├── LangProfile.java │ │ │ ├── Messages.java │ │ │ └── NGram.java │ │ └── index │ │ └── mapper │ │ └── LangStringFieldMapper.java ├── plugin-metadata │ ├── plugin-descriptor.properties │ └── plugin-security.policy └── resources │ ├── org │ └── codelibs │ │ └── elasticsearch │ │ └── langfield │ │ └── detect │ │ └── util │ │ └── messages.properties │ └── profiles │ ├── ar │ ├── bg │ ├── bn │ ├── ca │ ├── cs │ ├── da │ ├── de │ ├── el │ ├── en │ ├── es │ ├── et │ ├── fa │ ├── fi │ ├── fr │ ├── gu │ ├── he │ ├── hi │ ├── hr │ ├── hu │ ├── id │ ├── it │ ├── ja │ ├── ko │ ├── lt │ ├── lv │ ├── mk │ ├── ml │ ├── nl │ ├── no │ ├── pa │ ├── pl │ ├── pt │ ├── ro │ ├── ru │ ├── si │ ├── sq │ ├── sv │ ├── ta │ ├── te │ ├── th │ ├── tl │ ├── tr │ ├── uk │ ├── ur │ ├── vi │ ├── zh-cn │ └── zh-tw └── test └── java └── org └── codelibs └── elasticsearch └── langfield ├── LangFieldPluginTest.java └── detect ├── LangDetectorTest.java ├── LanguageTest.java └── util ├── LangProfileTest.java └── NGramTest.java /.gitignore: -------------------------------------------------------------------------------- 1 | .settings 2 | .classpath 3 | .project 4 | .idea 5 | /target 6 | dependency-reduced-pom.xml 7 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | sudo: false 2 | 3 | language: java 4 | 5 | jdk: 6 | - openjdk8 7 | 8 | cache: 9 | directories: 10 | - $HOME/.m2/repository 11 | 12 | before_script: 13 | - java -version 14 | 15 | script: 16 | - mvn test 17 | 18 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "{}" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright {yyyy} {name of copyright owner} 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | 203 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Elasticsearch LangField Plugin 2 | ======================= 3 | 4 | ## Overview 5 | 6 | LangField Plugin provides a useful feature for multi-language enrivonment. 7 | 8 | ## Version 9 | 10 | [Versions in Maven Repository](http://central.maven.org/maven2/org/codelibs/elasticsearch-langfield/) 11 | 12 | ### Issues/Questions 13 | 14 | Please file an [issue](https://github.com/codelibs/elasticsearch-langfield/issues "issue"). 15 | (Japanese forum is [here](https://github.com/codelibs/codelibs-ja-forum "here").) 16 | 17 | ## Installation 18 | 19 | ### For 5.x 20 | 21 | $ $ES_HOME/bin/elasticsearch-plugin install org.codelibs:elasticsearch-langfield:5.3.0 22 | 23 | ### For 2.x 24 | 25 | $ $ES_HOME/bin/plugin install org.codelibs/elasticsearch-langfield/2.4.1 26 | 27 | ## Getting Started 28 | 29 | ### Create Index for Multi-Languages 30 | 31 | First, you need to create index which has fields for multi-languages: 32 | 33 | $ curl -XPUT 'localhost:9200/my_index' -d ' 34 | { 35 | "mappings" : { 36 | "my_type" : { 37 | "properties" : { 38 | "message" : { 39 | "type" : "langstring" 40 | }, 41 | "message_en" : { 42 | "type" : "string" 43 | }, 44 | "message_ja" : { 45 | "type" : "string" 46 | } 47 | } 48 | } 49 | }, 50 | "settings" : { 51 | "index" : { 52 | "number_of_shards" : "5", 53 | "number_of_replicas" : "0" 54 | } 55 | } 56 | }' 57 | 58 | where message\_\* field is for multi-language. 59 | Using message field with "langstring" type, message\_\* fields are stored automaticaly. 60 | The above index-setting JSON is just an example. 61 | It's better to specify a proper analyzer for message\_\* field. 62 | 63 | ### Insert Documents 64 | 65 | Insert 2 documents for English and Japanese: 66 | 67 | $ curl -XPOST "localhost:9200/my_index/my_type/1" -d '{ 68 | "message":"This is a pen." 69 | }' 70 | $ curl -XPOST "localhost:9200/my_index/my_type/2" -d '{ 71 | "message":"これはペンです。" 72 | }' 73 | 74 | message field detects language and then copy the content of message field to a proper message\_\* field. 75 | Check the result with exists filter query: 76 | 77 | $ curl -XPOST "http://localhost:9200/my_index/my_type/_search" -d' 78 | { 79 | "query": { 80 | "filtered": { 81 | "query": { 82 | "match_all": {} 83 | }, 84 | "filter": { 85 | "exists": { 86 | "field": "message_en" 87 | } 88 | } 89 | } 90 | } 91 | }' 92 | { 93 | "took": 3, 94 | "timed_out": false, 95 | "_shards": { 96 | "total": 5, 97 | "successful": 5, 98 | "failed": 0 99 | }, 100 | "hits": { 101 | "total": 1, 102 | "max_score": 1, 103 | "hits": [ 104 | { 105 | "_index": "my_index", 106 | "_type": "my_type", 107 | "_id": "1", 108 | "_score": 1, 109 | "_source": { 110 | "message": "This is a pen." 111 | } 112 | } 113 | ] 114 | } 115 | } 116 | 117 | Next, check if message_ja field exists: 118 | 119 | $ curl -XPOST "http://localhost:9200/my_index/my_type/_search" -d' 120 | { 121 | "query": { 122 | "filtered": { 123 | "query": { 124 | "match_all": {} 125 | }, 126 | "filter": { 127 | "exists": { 128 | "field": "message_ja" 129 | } 130 | } 131 | } 132 | } 133 | }' 134 | { 135 | "took": 2, 136 | "timed_out": false, 137 | "_shards": { 138 | "total": 5, 139 | "successful": 5, 140 | "failed": 0 141 | }, 142 | "hits": { 143 | "total": 1, 144 | "max_score": 1, 145 | "hits": [ 146 | { 147 | "_index": "my_index", 148 | "_type": "my_type", 149 | "_id": "2", 150 | "_score": 1, 151 | "_source": { 152 | "message": "これはペンです。" 153 | } 154 | } 155 | ] 156 | } 157 | } 158 | -------------------------------------------------------------------------------- /pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | elasticsearch-langfield 4 | 4.0.0 5 | org.codelibs 6 | elasticsearch-langfield 7 | 6.8.1-SNAPSHOT 8 | jar 9 | This plugin provides b-bit langfield algorism. 10 | 2011 11 | https://github.com/codelibs/elasticsearch-langfield 12 | 13 | 14 | The Apache Software License, Version 2.0 15 | http://www.apache.org/licenses/LICENSE-2.0.txt 16 | repo 17 | 18 | 19 | 20 | scm:git:git@github.com:codelibs/elasticsearch-langfield.git 21 | scm:git:git@github.com:codelibs/elasticsearch-langfield.git 22 | git@github.com:codelibs/elasticsearch-langfield.git 23 | 24 | 25 | org.sonatype.oss 26 | oss-parent 27 | 9 28 | 29 | 30 | 6.8.1 31 | org.codelibs.elasticsearch.langfield.LangFieldPlugin 32 | 1.8 33 | 1.8 34 | 7.7.0 35 | 2.11.1 36 | 2.8.11.3 37 | 38 | 39 | 40 | 41 | maven-compiler-plugin 42 | 3.8.1 43 | 44 | ${maven.compiler.source} 45 | ${maven.compiler.target} 46 | UTF-8 47 | 48 | 49 | 50 | maven-surefire-plugin 51 | 2.22.2 52 | 53 | 54 | **/*Test.java 55 | 56 | false 57 | 58 | 59 | 60 | maven-source-plugin 61 | 3.1.0 62 | 63 | 64 | attach-sources 65 | 66 | jar 67 | 68 | 69 | 70 | 71 | 72 | maven-assembly-plugin 73 | 3.1.1 74 | 75 | false 76 | ${project.build.directory}/releases/ 77 | 78 | ${basedir}/src/main/assemblies/plugin.xml 79 | 80 | 81 | 82 | 83 | package 84 | 85 | single 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | org.elasticsearch 95 | elasticsearch 96 | ${elasticsearch.version} 97 | provided 98 | 99 | 100 | org.apache.logging.log4j 101 | log4j-api 102 | ${log4j.version} 103 | provided 104 | 105 | 106 | com.fasterxml.jackson.core 107 | jackson-databind 108 | ${jackson.version} 109 | 110 | 111 | junit 112 | junit 113 | 4.12 114 | test 115 | 116 | 117 | org.codelibs 118 | elasticsearch-cluster-runner 119 | ${elasticsearch.version}.0 120 | test 121 | 122 | 123 | 124 | -------------------------------------------------------------------------------- /src/main/assemblies/plugin.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | plugin 4 | 5 | zip 6 | 7 | false 8 | 9 | 10 | ${basedir}/src/main/plugin-metadata/plugin-descriptor.properties 11 | true 12 | 13 | 14 | ${basedir}/src/main/plugin-metadata/plugin-security.policy 15 | true 16 | 17 | 18 | 19 | 20 | true 21 | true 22 | 23 | org.elasticsearch:elasticsearch 24 | com.fasterxml.jackson.core:jackson-core 25 | 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /src/main/java/org/codelibs/elasticsearch/langfield/LangFieldPlugin.java: -------------------------------------------------------------------------------- 1 | package org.codelibs.elasticsearch.langfield; 2 | 3 | import java.util.Collections; 4 | import java.util.Map; 5 | 6 | import org.codelibs.elasticsearch.langfield.index.mapper.LangStringFieldMapper; 7 | import org.elasticsearch.index.mapper.Mapper; 8 | import org.elasticsearch.plugins.MapperPlugin; 9 | import org.elasticsearch.plugins.Plugin; 10 | 11 | public class LangFieldPlugin extends Plugin implements MapperPlugin { 12 | 13 | @Override 14 | public Map getMappers() { 15 | return Collections. singletonMap(LangStringFieldMapper.CONTENT_TYPE, 16 | new LangStringFieldMapper.TypeParser()); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/org/codelibs/elasticsearch/langfield/detect/LangDetector.java: -------------------------------------------------------------------------------- 1 | package org.codelibs.elasticsearch.langfield.detect; 2 | 3 | import java.io.IOException; 4 | import java.io.Reader; 5 | import java.lang.Character.UnicodeBlock; 6 | import java.util.ArrayList; 7 | import java.util.Formatter; 8 | import java.util.List; 9 | import java.util.Map; 10 | import java.util.Random; 11 | import java.util.regex.Pattern; 12 | 13 | import org.codelibs.elasticsearch.langfield.detect.util.NGram; 14 | import org.elasticsearch.ElasticsearchException; 15 | 16 | /** 17 | * {@link LangDetector} class is to detect language from specified text. 18 | * Its instance is able to be constructed via the factory class {@link LangDetectorFactory}. 19 | *

20 | * After appending a target text to the {@link LangDetector} instance with {@link #append(Reader)} or {@link #append(String)}, 21 | * the detector provides the language detection results for target text via {@link #detect()} or {@link #getProbabilities()}. 22 | * {@link #detect()} method returns a single language name which has the highest probability. 23 | * {@link #getProbabilities()} methods returns a list of multiple languages and their probabilities. 24 | *

25 | * The detector has some parameters for language detection. 26 | * See {@link #setAlpha(double)}, {@link #setMaxTextLength(int)} and {@link #setPriorMap(Map)}. 27 | * 28 | *

 29 |  * import java.util.ArrayList;
 30 |  * import org.codelibs.elasticsearch.langfield.detect.LangDetector;
 31 |  * import org.codelibs.elasticsearch.langfield.detect.LangDetectorFactory;
 32 |  * import org.codelibs.elasticsearch.langfield.detect.Language;
 33 |  *
 34 |  * class LangDetectSample {
 35 |  *     public void init(String profileDirectory)  {
 36 |  *         LangDetectorFactory.loadProfile(profileDirectory);
 37 |  *     }
 38 |  *     public String detect(String text)  {
 39 |  *         LangDetector detector = LangDetectorFactory.create();
 40 |  *         detector.append(text);
 41 |  *         return detector.detect();
 42 |  *     }
 43 |  *     public List<Language> detectLangs(String text)  {
 44 |  *         LangDetector detector = LangDetectorFactory.create();
 45 |  *         detector.append(text);
 46 |  *         return detector.getProbabilities();
 47 |  *     }
 48 |  * }
 49 |  * 
50 | * 51 | * 54 | * 55 | * @author Nakatani Shuyo 56 | * @author shinsuke 57 | * @see LangDetectorFactory 58 | */ 59 | public class LangDetector { 60 | private static final double ALPHA_DEFAULT = 0.5; 61 | 62 | private static final double ALPHA_WIDTH = 0.05; 63 | 64 | private static final int ITERATION_LIMIT = 1000; 65 | 66 | private static final double PROB_THRESHOLD = 0.1; 67 | 68 | private static final double CONV_THRESHOLD = 0.99999; 69 | 70 | private static final int BASE_FREQ = 10000; 71 | 72 | public static final String UNKNOWN_LANG = "unknown"; 73 | 74 | private static final Pattern URL_REGEX = Pattern 75 | .compile("https?://[-_.?&~;+=/#0-9A-Za-z]{1,2076}"); 76 | 77 | private static final Pattern MAIL_REGEX = Pattern.compile( 78 | "[-_.0-9A-Za-z]{1,64}@[-_0-9A-Za-z]{1,255}[-_.0-9A-Za-z]{1,255}"); 79 | 80 | private final Map wordLangProbMap; 81 | 82 | private final List langlist; 83 | 84 | private StringBuilder text; 85 | 86 | private double[] langprob = null; 87 | 88 | private double alpha = ALPHA_DEFAULT; 89 | 90 | private final int nTrial = 7; 91 | 92 | private int maxTextLength = 10000; 93 | 94 | private double[] priorMap = null; 95 | 96 | private boolean verbose = false; 97 | 98 | private Long seed = null; 99 | 100 | /** 101 | * Constructor. 102 | * LangDetector instance can be constructed via {@link LangDetectorFactory#getLangDetector()}. 103 | * @param factory {@link LangDetectorFactory} instance (only LangDetectorFactory inside) 104 | */ 105 | public LangDetector(final LangDetectorFactory factory) { 106 | this.wordLangProbMap = factory.wordLangProbMap; 107 | this.langlist = factory.langlist; 108 | this.text = new StringBuilder(); 109 | this.seed = factory.seed; 110 | } 111 | 112 | /** 113 | * Set Verbose Mode(use for debug). 114 | */ 115 | public void setVerbose() { 116 | this.verbose = true; 117 | } 118 | 119 | /** 120 | * Set smoothing parameter. 121 | * The default value is 0.5(i.e. Expected Likelihood Estimate). 122 | * @param alpha the smoothing parameter 123 | */ 124 | public void setAlpha(final double alpha) { 125 | this.alpha = alpha; 126 | } 127 | 128 | /** 129 | * Set prior information about language probabilities. 130 | * @param priorMap the priorMap to set 131 | */ 132 | public void setPriorMap(final Map priorMap) { 133 | this.priorMap = new double[langlist.size()]; 134 | double sump = 0; 135 | for (int i = 0; i < this.priorMap.length; ++i) { 136 | final String lang = langlist.get(i); 137 | if (priorMap.containsKey(lang)) { 138 | final double p = priorMap.get(lang); 139 | if (p < 0) { 140 | throw new ElasticsearchException("Prior probability must be non-negative."); 141 | } 142 | this.priorMap[i] = p; 143 | sump += p; 144 | } 145 | } 146 | if (sump <= 0) { 147 | throw new ElasticsearchException("More one of prior probability must be non-zero."); 148 | } 149 | for (int i = 0; i < this.priorMap.length; ++i) { 150 | this.priorMap[i] /= sump; 151 | } 152 | } 153 | 154 | /** 155 | * Specify max size of target text to use for language detection. 156 | * The default value is 10000(10KB). 157 | * @param maxTextLength the maxTextLength to set 158 | */ 159 | public void setMaxTextLength(final int maxTextLength) { 160 | this.maxTextLength = maxTextLength; 161 | } 162 | 163 | /** 164 | * Append the target text for language detection. 165 | * This method read the text from specified input reader. 166 | * If the total size of target text exceeds the limit size specified by {@link LangDetector#setMaxTextLength(int)}, 167 | * the rest is cut down. 168 | * 169 | * @param reader the input reader (BufferedReader as usual) 170 | * @throws IOException Can't read the reader. 171 | */ 172 | public void append(final Reader reader) throws IOException { 173 | final char[] buf = new char[maxTextLength / 2]; 174 | while (text.length() < maxTextLength && reader.ready()) { 175 | final int length = reader.read(buf); 176 | append(new String(buf, 0, length)); 177 | } 178 | } 179 | 180 | /** 181 | * Append the target text for language detection. 182 | * If the total size of target text exceeds the limit size specified by {@link LangDetector#setMaxTextLength(int)}, 183 | * the rest is cut down. 184 | * 185 | * @param text the target text to append 186 | */ 187 | public void append(String text) { 188 | text = URL_REGEX.matcher(text).replaceAll(" "); 189 | text = MAIL_REGEX.matcher(text).replaceAll(" "); 190 | text = NGram.normalize_vi(text); 191 | char pre = 0; 192 | for (int i = 0; i < text.length() && i < maxTextLength; ++i) { 193 | final char c = text.charAt(i); 194 | if (c != ' ' || pre != ' ') { 195 | this.text.append(c); 196 | } 197 | pre = c; 198 | } 199 | } 200 | 201 | /** 202 | * Cleaning text to detect 203 | * (eliminate URL, e-mail address and Latin sentence if it is not written in Latin alphabet) 204 | */ 205 | private void cleaningText() { 206 | int latinCount = 0, nonLatinCount = 0; 207 | for (int i = 0; i < text.length(); ++i) { 208 | final char c = text.charAt(i); 209 | if (c <= 'z' && c >= 'A') { 210 | ++latinCount; 211 | } else if (c >= '\u0300' && UnicodeBlock 212 | .of(c) != UnicodeBlock.LATIN_EXTENDED_ADDITIONAL) { 213 | ++nonLatinCount; 214 | } 215 | } 216 | if (latinCount * 2 < nonLatinCount) { 217 | final StringBuilder textWithoutLatin = new StringBuilder(); 218 | for (int i = 0; i < text.length(); ++i) { 219 | final char c = text.charAt(i); 220 | if (c > 'z' || c < 'A') { 221 | textWithoutLatin.append(c); 222 | } 223 | } 224 | text = textWithoutLatin; 225 | } 226 | 227 | } 228 | 229 | /** 230 | * Detect language of the target text and return the language name which has the highest probability. 231 | * @return detected language name which has most probability. 232 | * code = ErrorCode.CantDetectError : Can't detect because of no valid features in text 233 | */ 234 | public String detect() { 235 | final List probabilities = getProbabilities(); 236 | if (probabilities.size() > 0) { 237 | return probabilities.get(0).lang; 238 | } 239 | return UNKNOWN_LANG; 240 | } 241 | 242 | /** 243 | * Get language candidates which have high probabilities 244 | * @return possible languages list (whose probabilities are over PROB_THRESHOLD, ordered by probabilities descendently 245 | * code = ErrorCode.CantDetectError : Can't detect because of no valid features in text 246 | */ 247 | public List getProbabilities() { 248 | if (langprob == null) { 249 | detectBlock(); 250 | } 251 | 252 | final List list = sortProbability(langprob); 253 | return list; 254 | } 255 | 256 | private void detectBlock() { 257 | cleaningText(); 258 | final List ngrams = extractNGrams(); 259 | if (ngrams.size() == 0) { 260 | throw new ElasticsearchException("no features in text"); 261 | } 262 | 263 | langprob = new double[langlist.size()]; 264 | 265 | final Random rand = new Random(); 266 | if (seed != null) { 267 | rand.setSeed(seed); 268 | } 269 | for (int t = 0; t < nTrial; ++t) { 270 | final double[] prob = initProbability(); 271 | final double alpha = this.alpha + rand.nextGaussian() * ALPHA_WIDTH; 272 | 273 | for (int i = 0;; ++i) { 274 | final int r = rand.nextInt(ngrams.size()); 275 | updateLangProb(prob, ngrams.get(r), alpha); 276 | if (i % 5 == 0) { 277 | if (normalizeProb(prob) > CONV_THRESHOLD 278 | || i >= ITERATION_LIMIT) { 279 | break; 280 | } 281 | if (verbose) { 282 | System.out.println("> " + sortProbability(prob)); 283 | } 284 | } 285 | } 286 | for (int j = 0; j < langprob.length; ++j) { 287 | langprob[j] += prob[j] / nTrial; 288 | } 289 | if (verbose) { 290 | System.out.println("==> " + sortProbability(prob)); 291 | } 292 | } 293 | } 294 | 295 | /** 296 | * Initialize the map of language probabilities. 297 | * If there is the specified prior map, use it as initial map. 298 | * @return initialized map of language probabilities 299 | */ 300 | private double[] initProbability() { 301 | final double[] prob = new double[langlist.size()]; 302 | if (priorMap != null) { 303 | for (int i = 0; i < prob.length; ++i) { 304 | prob[i] = priorMap[i]; 305 | } 306 | } else { 307 | for (int i = 0; i < prob.length; ++i) { 308 | prob[i] = 1.0 / langlist.size(); 309 | } 310 | } 311 | return prob; 312 | } 313 | 314 | /** 315 | * Extract n-grams from target text 316 | * @return n-grams list 317 | */ 318 | private List extractNGrams() { 319 | final List list = new ArrayList<>(); 320 | final NGram ngram = new NGram(); 321 | for (int i = 0; i < text.length(); ++i) { 322 | ngram.addChar(text.charAt(i)); 323 | for (int n = 1; n <= NGram.N_GRAM; ++n) { 324 | final String w = ngram.get(n); 325 | if (w != null && wordLangProbMap.containsKey(w)) { 326 | list.add(w); 327 | } 328 | } 329 | } 330 | return list; 331 | } 332 | 333 | /** 334 | * update language probabilities with N-gram string(N=1,2,3) 335 | * @param word N-gram string 336 | */ 337 | private boolean updateLangProb(final double[] prob, final String word, 338 | final double alpha) { 339 | if (word == null || !wordLangProbMap.containsKey(word)) { 340 | return false; 341 | } 342 | 343 | final double[] langProbMap = wordLangProbMap.get(word); 344 | if (verbose) { 345 | System.out.println(word + "(" + unicodeEncode(word) + "):" 346 | + wordProbToString(langProbMap)); 347 | } 348 | 349 | final double weight = alpha / BASE_FREQ; 350 | for (int i = 0; i < prob.length; ++i) { 351 | prob[i] *= weight + langProbMap[i]; 352 | } 353 | return true; 354 | } 355 | 356 | private String wordProbToString(final double[] prob) { 357 | final Formatter formatter = new Formatter(); 358 | for (int j = 0; j < prob.length; ++j) { 359 | final double p = prob[j]; 360 | if (p >= 0.00001) { 361 | formatter.format(" %s:%.5f", langlist.get(j), p); 362 | } 363 | } 364 | final String string = formatter.toString(); 365 | formatter.close(); 366 | return string; 367 | } 368 | 369 | /** 370 | * normalize probabilities and check convergence by the maximun probability 371 | * @return maximum of probabilities 372 | */ 373 | static private double normalizeProb(final double[] prob) { 374 | double maxp = 0, sump = 0; 375 | for (final double element : prob) { 376 | sump += element; 377 | } 378 | 379 | if(sump == 0) { 380 | return 0; 381 | } 382 | 383 | for (int i = 0; i < prob.length; ++i) { 384 | final double p = prob[i] / sump; 385 | if (maxp < p) { 386 | maxp = p; 387 | } 388 | prob[i] = p; 389 | } 390 | return maxp; 391 | } 392 | 393 | /** 394 | * @param probabilities HashMap 395 | * @return lanugage candidates order by probabilities descendently 396 | */ 397 | private List sortProbability(final double[] prob) { 398 | final List list = new ArrayList<>(); 399 | for (int j = 0; j < prob.length; ++j) { 400 | final double p = prob[j]; 401 | if (p > PROB_THRESHOLD) { 402 | for (int i = 0; i <= list.size(); ++i) { 403 | if (i == list.size() || list.get(i).prob < p) { 404 | list.add(i, new Language(langlist.get(j), p)); 405 | break; 406 | } 407 | } 408 | } 409 | } 410 | return list; 411 | } 412 | 413 | /** 414 | * unicode encoding (for verbose mode) 415 | * @param word 416 | * @return encoded word 417 | */ 418 | static private String unicodeEncode(final String word) { 419 | final StringBuffer buf = new StringBuffer(); 420 | for (int i = 0; i < word.length(); ++i) { 421 | final char ch = word.charAt(i); 422 | if (ch >= '\u0080') { 423 | String st = Integer.toHexString(0x10000 + ch); 424 | while (st.length() < 4) { 425 | st = "0" + st; 426 | } 427 | buf.append("\\u").append(st.subSequence(1, 5)); 428 | } else { 429 | buf.append(ch); 430 | } 431 | } 432 | return buf.toString(); 433 | } 434 | 435 | } 436 | -------------------------------------------------------------------------------- /src/main/java/org/codelibs/elasticsearch/langfield/detect/LangDetectorFactory.java: -------------------------------------------------------------------------------- 1 | package org.codelibs.elasticsearch.langfield.detect; 2 | 3 | import java.io.File; 4 | import java.io.FileInputStream; 5 | import java.io.IOException; 6 | import java.io.InputStream; 7 | import java.security.AccessController; 8 | import java.security.PrivilegedAction; 9 | import java.util.ArrayList; 10 | import java.util.Collections; 11 | import java.util.HashMap; 12 | import java.util.List; 13 | import java.util.Map; 14 | 15 | import org.codelibs.elasticsearch.langfield.detect.util.LangProfile; 16 | import org.elasticsearch.ElasticsearchException; 17 | 18 | import com.fasterxml.jackson.databind.ObjectMapper; 19 | 20 | /** 21 | * Language LangDetector Factory Class 22 | * 23 | * This class manages an initialization and constructions of {@link LangDetector}. 24 | * 25 | * Before using language detection library, 26 | * load profiles with {@link LangDetectorFactory#create(String[])} method 27 | * and set initialization parameters. 28 | * 29 | * When the language detection, 30 | * construct LangDetector instance via {@link LangDetectorFactory#getLangDetector()}. 31 | * See also {@link LangDetector}'s sample code. 32 | * 33 | *
    34 | *
  • 4x faster improvement based on Elmer Garduno's code. Thanks!
  • 35 | *
36 | * 37 | * @see LangDetector 38 | * @author Nakatani Shuyo 39 | * @author shinsuke 40 | */ 41 | public class LangDetectorFactory { 42 | public Map wordLangProbMap; 43 | 44 | public List langlist; 45 | 46 | public Long seed = null; 47 | 48 | LangDetectorFactory() { 49 | wordLangProbMap = new HashMap<>(); 50 | langlist = new ArrayList<>(); 51 | } 52 | 53 | /** 54 | * Load profiles from specified directory. 55 | * This method must be called once before language detection. 56 | * 57 | * @param profileDirectory profile directory path 58 | * @return LangDetectorFactory 59 | */ 60 | public static LangDetectorFactory create(final File profileDirectory) { 61 | final LangDetectorFactory factory = new LangDetectorFactory(); 62 | final File[] listFiles = profileDirectory.listFiles(); 63 | if (listFiles == null) { 64 | throw new ElasticsearchException("Not found profile: " + profileDirectory); 65 | } 66 | final ObjectMapper mapper = new ObjectMapper(); 67 | final int langsize = listFiles.length; 68 | int index = 0; 69 | for (final File file : listFiles) { 70 | if (file.getName().startsWith(".") || !file.isFile()) { 71 | continue; 72 | } 73 | final LangProfile profile = AccessController.doPrivileged((PrivilegedAction) () -> { 74 | try (InputStream is = new FileInputStream(file);) { 75 | return mapper.readValue(is, LangProfile.class); 76 | } catch (final IOException e1) { 77 | throw new ElasticsearchException("can't open '" + file.getName() + "'", e1); 78 | } catch (final Exception e2) { 79 | throw new ElasticsearchException("profile format error in '" + file.getName() + "'", e2); 80 | } 81 | }); 82 | factory.addProfile(profile, index, langsize); 83 | index++; 84 | } 85 | return factory; 86 | } 87 | 88 | public static LangDetectorFactory create(final String... langs) { 89 | final LangDetectorFactory factory = new LangDetectorFactory(); 90 | final ObjectMapper mapper = new ObjectMapper(); 91 | final int langsize = langs.length; 92 | int index = 0; 93 | for (final String lang : langs) { 94 | final LangProfile profile = AccessController.doPrivileged((PrivilegedAction) () -> { 95 | try (InputStream is = LangDetectorFactory.class.getResourceAsStream("/profiles/" + lang)) { 96 | if (is == null) { 97 | throw new IOException("'/profiles/" + lang + "' does not exist."); 98 | } 99 | return mapper.readValue(is, LangProfile.class); 100 | } catch (final IOException e1) { 101 | throw new ElasticsearchException("can't open 'profiles/" + lang + "'", e1); 102 | } catch (final Exception e2) { 103 | throw new ElasticsearchException("profile format error in 'profiles/" + lang + "'", e2); 104 | } 105 | }); 106 | factory.addProfile(profile, index, langsize); 107 | index++; 108 | } 109 | return factory; 110 | } 111 | 112 | /** 113 | * @param profile 114 | * @param langsize 115 | * @param index 116 | */ 117 | void addProfile(final LangProfile profile, final int index, 118 | final int langsize) { 119 | final String lang = profile.name; 120 | if (langlist.contains(lang)) { 121 | throw new ElasticsearchException("duplicate the same language profile"); 122 | } 123 | langlist.add(lang); 124 | for (final String word : profile.freq.keySet()) { 125 | if (!wordLangProbMap.containsKey(word)) { 126 | wordLangProbMap.put(word, new double[langsize]); 127 | } 128 | final int length = word.length(); 129 | if (length >= 1 && length <= 3) { 130 | final double prob = profile.freq.get(word).doubleValue() 131 | / profile.nWords[length - 1]; 132 | wordLangProbMap.get(word)[index] = prob; 133 | } 134 | } 135 | } 136 | 137 | /** 138 | * Construct LangDetector instance 139 | * 140 | * @return LangDetector instance 141 | */ 142 | public LangDetector getLangDetector() { 143 | if (langlist.size() == 0) { 144 | throw new ElasticsearchException("need to load profiles"); 145 | } 146 | final LangDetector langDetector = new LangDetector(this); 147 | return langDetector; 148 | } 149 | 150 | public void setSeed(final long seed) { 151 | this.seed = seed; 152 | } 153 | 154 | public final List getLangList() { 155 | return Collections.unmodifiableList(this.langlist); 156 | } 157 | } 158 | -------------------------------------------------------------------------------- /src/main/java/org/codelibs/elasticsearch/langfield/detect/Language.java: -------------------------------------------------------------------------------- 1 | package org.codelibs.elasticsearch.langfield.detect; 2 | 3 | import java.util.ArrayList; 4 | 5 | /** 6 | * {@link Language} is to store the detected language. 7 | * {@link LangDetector#getProbabilities()} returns an {@link ArrayList} of {@link Language}s. 8 | * 9 | * @see LangDetector#getProbabilities() 10 | * @author Nakatani Shuyo 11 | * 12 | */ 13 | public class Language { 14 | public String lang; 15 | 16 | public double prob; 17 | 18 | public Language(final String lang, final double prob) { 19 | this.lang = lang; 20 | this.prob = prob; 21 | } 22 | 23 | @Override 24 | public String toString() { 25 | if (lang == null) { 26 | return ""; 27 | } 28 | return lang + ":" + prob; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/main/java/org/codelibs/elasticsearch/langfield/detect/util/LangProfile.java: -------------------------------------------------------------------------------- 1 | package org.codelibs.elasticsearch.langfield.detect.util; 2 | 3 | import java.util.HashMap; 4 | import java.util.Iterator; 5 | import java.util.Map; 6 | import java.util.Set; 7 | 8 | import com.fasterxml.jackson.annotation.JsonProperty; 9 | 10 | /** 11 | * {@link LangProfile} is a Language Profile Class. 12 | * Users don't use this class directly. 13 | * 14 | * @author Nakatani Shuyo 15 | * @author shinsuke 16 | */ 17 | public class LangProfile { 18 | private static final int MINIMUM_FREQ = 2; 19 | 20 | private static final int LESS_FREQ_RATIO = 100000; 21 | 22 | @JsonProperty("name") 23 | public String name = null; 24 | 25 | @JsonProperty("freq") 26 | public Map freq = new HashMap<>(); 27 | 28 | @JsonProperty("n_words") 29 | public int[] nWords = new int[NGram.N_GRAM]; 30 | 31 | public LangProfile() { 32 | } 33 | 34 | /** 35 | * Normal Constructor 36 | * @param name language name 37 | */ 38 | public LangProfile(final String name) { 39 | this.name = name; 40 | } 41 | 42 | /** 43 | * Add n-gram to profile 44 | * @param gram n-gram string 45 | */ 46 | public void add(final String gram) { 47 | if (name == null || gram == null) { 48 | return; // Illegal 49 | } 50 | final int len = gram.length(); 51 | if (len < 1 || len > NGram.N_GRAM) { 52 | return; // Illegal 53 | } 54 | ++nWords[len - 1]; 55 | if (freq.containsKey(gram)) { 56 | freq.put(gram, freq.get(gram) + 1); 57 | } else { 58 | freq.put(gram, 1); 59 | } 60 | } 61 | 62 | /** 63 | * Eliminate below less frequency n-grams and noise Latin alphabets 64 | */ 65 | public void omitLessFreq() { 66 | if (name == null) { 67 | return; // Illegal 68 | } 69 | int threshold = nWords[0] / LESS_FREQ_RATIO; 70 | if (threshold < MINIMUM_FREQ) { 71 | threshold = MINIMUM_FREQ; 72 | } 73 | 74 | final Set keys = freq.keySet(); 75 | int roman = 0; 76 | for (final Iterator i = keys.iterator(); i.hasNext();) { 77 | final String key = i.next(); 78 | final int count = freq.get(key); 79 | if (count <= threshold) { 80 | nWords[key.length() - 1] -= count; 81 | i.remove(); 82 | } else if (key.matches("^[A-Za-z]$")) { 83 | roman += count; 84 | } 85 | } 86 | 87 | // roman check 88 | if (roman < nWords[0] / 3) { 89 | final Set keys2 = freq.keySet(); 90 | for (final Iterator i = keys2.iterator(); i.hasNext();) { 91 | final String key = i.next(); 92 | if (key.matches(".*[A-Za-z].*")) { 93 | nWords[key.length() - 1] -= freq.get(key); 94 | i.remove(); 95 | } 96 | } 97 | 98 | } 99 | } 100 | 101 | /** 102 | * Update the language profile with (fragmented) text. 103 | * Extract n-grams from text and add their frequency into the profile. 104 | * @param text (fragmented) text to extract n-grams 105 | */ 106 | public void update(String text) { 107 | if (text == null) { 108 | return; 109 | } 110 | text = NGram.normalize_vi(text); 111 | final NGram gram = new NGram(); 112 | for (int i = 0; i < text.length(); ++i) { 113 | gram.addChar(text.charAt(i)); 114 | for (int n = 1; n <= NGram.N_GRAM; ++n) { 115 | add(gram.get(n)); 116 | } 117 | } 118 | } 119 | } 120 | -------------------------------------------------------------------------------- /src/main/java/org/codelibs/elasticsearch/langfield/detect/util/Messages.java: -------------------------------------------------------------------------------- 1 | package org.codelibs.elasticsearch.langfield.detect.util; 2 | 3 | import java.util.MissingResourceException; 4 | import java.util.ResourceBundle; 5 | 6 | /** 7 | * This is {@link Messages} class generated by Eclipse automatically. 8 | * Users don't use this class directly. 9 | * @author Nakatani Shuyo 10 | */ 11 | public class Messages { 12 | private static final String BUNDLE_NAME = "org.codelibs.elasticsearch.langfield.detect.util.messages"; //$NON-NLS-1$ 13 | 14 | private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle 15 | .getBundle(BUNDLE_NAME); 16 | 17 | private Messages() { 18 | } 19 | 20 | public static String getString(final String key) { 21 | try { 22 | return RESOURCE_BUNDLE.getString(key); 23 | } catch (final MissingResourceException e) { 24 | return '!' + key + '!'; 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/org/codelibs/elasticsearch/langfield/detect/util/NGram.java: -------------------------------------------------------------------------------- 1 | package org.codelibs.elasticsearch.langfield.detect.util; 2 | 3 | import java.lang.Character.UnicodeBlock; 4 | import java.util.HashMap; 5 | import java.util.Map; 6 | import java.util.regex.Matcher; 7 | import java.util.regex.Pattern; 8 | 9 | /** 10 | * Cut out N-gram from text. 11 | * Users don't use this class directly. 12 | * @author Nakatani Shuyo 13 | * @author shinsuke 14 | */ 15 | public class NGram { 16 | private static final String LATIN1_EXCLUDED = Messages 17 | .getString("NGram.LATIN1_EXCLUDE"); 18 | 19 | public final static int N_GRAM = 3; 20 | 21 | public static final Map cjkMap; 22 | 23 | private StringBuilder grams; 24 | 25 | private boolean capitalword; 26 | 27 | /** 28 | * Constructor. 29 | */ 30 | public NGram() { 31 | grams = new StringBuilder(" "); 32 | capitalword = false; 33 | } 34 | 35 | /** 36 | * Append a character into ngram buffer. 37 | * @param ch character 38 | */ 39 | public void addChar(char ch) { 40 | ch = normalize(ch); 41 | final char lastchar = grams.charAt(grams.length() - 1); 42 | if (lastchar == ' ') { 43 | grams = new StringBuilder(" "); 44 | capitalword = false; 45 | if (ch == ' ') { 46 | return; 47 | } 48 | } else if (grams.length() >= N_GRAM) { 49 | grams.deleteCharAt(0); 50 | } 51 | grams.append(ch); 52 | 53 | if (Character.isUpperCase(ch)) { 54 | if (Character.isUpperCase(lastchar)) { 55 | capitalword = true; 56 | } 57 | } else { 58 | capitalword = false; 59 | } 60 | } 61 | 62 | /** 63 | * Get n-Gram 64 | * @param n length of n-gram 65 | * @return n-Gram String (null if it is invalid) 66 | */ 67 | public String get(final int n) { 68 | if (capitalword) { 69 | return null; 70 | } 71 | final int len = grams.length(); 72 | if (n < 1 || n > 3 || len < n) { 73 | return null; 74 | } 75 | if (n == 1) { 76 | final char ch = grams.charAt(len - 1); 77 | if (ch == ' ') { 78 | return null; 79 | } 80 | return Character.toString(ch); 81 | } else { 82 | return grams.substring(len - n, len); 83 | } 84 | } 85 | 86 | /** 87 | * Character Normalization 88 | * @param ch character 89 | * @return Normalized character 90 | */ 91 | public static char normalize(char ch) { 92 | final Character.UnicodeBlock block = Character.UnicodeBlock.of(ch); 93 | if (block == UnicodeBlock.BASIC_LATIN) { 94 | if (ch < 'A' || (ch < 'a' && ch > 'Z') || ch > 'z') { 95 | ch = ' '; 96 | } 97 | } else if (block == UnicodeBlock.LATIN_1_SUPPLEMENT) { 98 | if (LATIN1_EXCLUDED.indexOf(ch) >= 0) { 99 | ch = ' '; 100 | } 101 | } else if (block == UnicodeBlock.LATIN_EXTENDED_B) { 102 | // normalization for Romanian 103 | if (ch == '\u0219') { 104 | ch = '\u015f'; // Small S with comma below => with cedilla 105 | } 106 | if (ch == '\u021b') { 107 | ch = '\u0163'; // Small T with comma below => with cedilla 108 | } 109 | } else if (block == UnicodeBlock.GENERAL_PUNCTUATION) { 110 | ch = ' '; 111 | } else if (block == UnicodeBlock.ARABIC) { 112 | if (ch == '\u06cc') { 113 | ch = '\u064a'; // Farsi yeh => Arabic yeh 114 | } 115 | } else if (block == UnicodeBlock.LATIN_EXTENDED_ADDITIONAL) { 116 | if (ch >= '\u1ea0') { 117 | ch = '\u1ec3'; 118 | } 119 | } else if (block == UnicodeBlock.HIRAGANA) { 120 | ch = '\u3042'; 121 | } else if (block == UnicodeBlock.KATAKANA) { 122 | ch = '\u30a2'; 123 | } else if (block == UnicodeBlock.BOPOMOFO 124 | || block == UnicodeBlock.BOPOMOFO_EXTENDED) { 125 | ch = '\u3105'; 126 | } else if (block == UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS) { 127 | if (cjkMap.containsKey(ch)) { 128 | ch = cjkMap.get(ch); 129 | } 130 | } else if (block == UnicodeBlock.HANGUL_SYLLABLES) { 131 | ch = '\uac00'; 132 | } 133 | return ch; 134 | } 135 | 136 | /** 137 | * Normalizer for Vietnamese. 138 | * Normalize Alphabet + Diacritical Mark(U+03xx) into U+1Exx . 139 | * @param text text 140 | * @return normalized text 141 | */ 142 | public static String normalize_vi(final String text) { 143 | final Matcher m = ALPHABET_WITH_DMARK.matcher(text); 144 | final StringBuffer buf = new StringBuffer(); 145 | while (m.find()) { 146 | final int alphabet = TO_NORMALIZE_VI_CHARS.indexOf(m.group(1)); 147 | final int dmark = DMARK_CLASS.indexOf(m.group(2)); // Diacritical Mark 148 | m.appendReplacement(buf, NORMALIZED_VI_CHARS[dmark] 149 | .substring(alphabet, alphabet + 1)); 150 | } 151 | if (buf.length() == 0) { 152 | return text; 153 | } 154 | m.appendTail(buf); 155 | return buf.toString(); 156 | } 157 | 158 | private static final String[] NORMALIZED_VI_CHARS = { 159 | Messages.getString("NORMALIZED_VI_CHARS_0300"), 160 | Messages.getString("NORMALIZED_VI_CHARS_0301"), 161 | Messages.getString("NORMALIZED_VI_CHARS_0303"), 162 | Messages.getString("NORMALIZED_VI_CHARS_0309"), 163 | Messages.getString("NORMALIZED_VI_CHARS_0323") }; 164 | 165 | private static final String TO_NORMALIZE_VI_CHARS = Messages 166 | .getString("TO_NORMALIZE_VI_CHARS"); 167 | 168 | private static final String DMARK_CLASS = Messages.getString("DMARK_CLASS"); 169 | 170 | private static final Pattern ALPHABET_WITH_DMARK = Pattern.compile( 171 | "([" + TO_NORMALIZE_VI_CHARS + "])([" + DMARK_CLASS + "])"); 172 | 173 | /** 174 | * CJK Kanji Normalization Mapping 175 | */ 176 | static final String[] CJK_CLASS = { Messages.getString("NGram.KANJI_1_0"), 177 | Messages.getString("NGram.KANJI_1_2"), 178 | Messages.getString("NGram.KANJI_1_4"), 179 | Messages.getString("NGram.KANJI_1_8"), 180 | Messages.getString("NGram.KANJI_1_11"), 181 | Messages.getString("NGram.KANJI_1_12"), 182 | Messages.getString("NGram.KANJI_1_13"), 183 | Messages.getString("NGram.KANJI_1_14"), 184 | Messages.getString("NGram.KANJI_1_16"), 185 | Messages.getString("NGram.KANJI_1_18"), 186 | Messages.getString("NGram.KANJI_1_22"), 187 | Messages.getString("NGram.KANJI_1_27"), 188 | Messages.getString("NGram.KANJI_1_29"), 189 | Messages.getString("NGram.KANJI_1_31"), 190 | Messages.getString("NGram.KANJI_1_35"), 191 | Messages.getString("NGram.KANJI_2_0"), 192 | Messages.getString("NGram.KANJI_2_1"), 193 | Messages.getString("NGram.KANJI_2_4"), 194 | Messages.getString("NGram.KANJI_2_9"), 195 | Messages.getString("NGram.KANJI_2_10"), 196 | Messages.getString("NGram.KANJI_2_11"), 197 | Messages.getString("NGram.KANJI_2_12"), 198 | Messages.getString("NGram.KANJI_2_13"), 199 | Messages.getString("NGram.KANJI_2_15"), 200 | Messages.getString("NGram.KANJI_2_16"), 201 | Messages.getString("NGram.KANJI_2_18"), 202 | Messages.getString("NGram.KANJI_2_21"), 203 | Messages.getString("NGram.KANJI_2_22"), 204 | Messages.getString("NGram.KANJI_2_23"), 205 | Messages.getString("NGram.KANJI_2_28"), 206 | Messages.getString("NGram.KANJI_2_29"), 207 | Messages.getString("NGram.KANJI_2_30"), 208 | Messages.getString("NGram.KANJI_2_31"), 209 | Messages.getString("NGram.KANJI_2_32"), 210 | Messages.getString("NGram.KANJI_2_35"), 211 | Messages.getString("NGram.KANJI_2_36"), 212 | Messages.getString("NGram.KANJI_2_37"), 213 | Messages.getString("NGram.KANJI_2_38"), 214 | Messages.getString("NGram.KANJI_3_1"), 215 | Messages.getString("NGram.KANJI_3_2"), 216 | Messages.getString("NGram.KANJI_3_3"), 217 | Messages.getString("NGram.KANJI_3_4"), 218 | Messages.getString("NGram.KANJI_3_5"), 219 | Messages.getString("NGram.KANJI_3_8"), 220 | Messages.getString("NGram.KANJI_3_9"), 221 | Messages.getString("NGram.KANJI_3_11"), 222 | Messages.getString("NGram.KANJI_3_12"), 223 | Messages.getString("NGram.KANJI_3_13"), 224 | Messages.getString("NGram.KANJI_3_15"), 225 | Messages.getString("NGram.KANJI_3_16"), 226 | Messages.getString("NGram.KANJI_3_18"), 227 | Messages.getString("NGram.KANJI_3_19"), 228 | Messages.getString("NGram.KANJI_3_22"), 229 | Messages.getString("NGram.KANJI_3_23"), 230 | Messages.getString("NGram.KANJI_3_27"), 231 | Messages.getString("NGram.KANJI_3_29"), 232 | Messages.getString("NGram.KANJI_3_30"), 233 | Messages.getString("NGram.KANJI_3_31"), 234 | Messages.getString("NGram.KANJI_3_32"), 235 | Messages.getString("NGram.KANJI_3_35"), 236 | Messages.getString("NGram.KANJI_3_36"), 237 | Messages.getString("NGram.KANJI_3_37"), 238 | Messages.getString("NGram.KANJI_3_38"), 239 | Messages.getString("NGram.KANJI_4_0"), 240 | Messages.getString("NGram.KANJI_4_9"), 241 | Messages.getString("NGram.KANJI_4_10"), 242 | Messages.getString("NGram.KANJI_4_16"), 243 | Messages.getString("NGram.KANJI_4_17"), 244 | Messages.getString("NGram.KANJI_4_18"), 245 | Messages.getString("NGram.KANJI_4_22"), 246 | Messages.getString("NGram.KANJI_4_24"), 247 | Messages.getString("NGram.KANJI_4_28"), 248 | Messages.getString("NGram.KANJI_4_34"), 249 | Messages.getString("NGram.KANJI_4_39"), 250 | Messages.getString("NGram.KANJI_5_10"), 251 | Messages.getString("NGram.KANJI_5_11"), 252 | Messages.getString("NGram.KANJI_5_12"), 253 | Messages.getString("NGram.KANJI_5_13"), 254 | Messages.getString("NGram.KANJI_5_14"), 255 | Messages.getString("NGram.KANJI_5_18"), 256 | Messages.getString("NGram.KANJI_5_26"), 257 | Messages.getString("NGram.KANJI_5_29"), 258 | Messages.getString("NGram.KANJI_5_34"), 259 | Messages.getString("NGram.KANJI_5_39"), 260 | Messages.getString("NGram.KANJI_6_0"), 261 | Messages.getString("NGram.KANJI_6_3"), 262 | Messages.getString("NGram.KANJI_6_9"), 263 | Messages.getString("NGram.KANJI_6_10"), 264 | Messages.getString("NGram.KANJI_6_11"), 265 | Messages.getString("NGram.KANJI_6_12"), 266 | Messages.getString("NGram.KANJI_6_16"), 267 | Messages.getString("NGram.KANJI_6_18"), 268 | Messages.getString("NGram.KANJI_6_20"), 269 | Messages.getString("NGram.KANJI_6_21"), 270 | Messages.getString("NGram.KANJI_6_22"), 271 | Messages.getString("NGram.KANJI_6_23"), 272 | Messages.getString("NGram.KANJI_6_25"), 273 | Messages.getString("NGram.KANJI_6_28"), 274 | Messages.getString("NGram.KANJI_6_29"), 275 | Messages.getString("NGram.KANJI_6_30"), 276 | Messages.getString("NGram.KANJI_6_32"), 277 | Messages.getString("NGram.KANJI_6_34"), 278 | Messages.getString("NGram.KANJI_6_35"), 279 | Messages.getString("NGram.KANJI_6_37"), 280 | Messages.getString("NGram.KANJI_6_39"), 281 | Messages.getString("NGram.KANJI_7_0"), 282 | Messages.getString("NGram.KANJI_7_3"), 283 | Messages.getString("NGram.KANJI_7_6"), 284 | Messages.getString("NGram.KANJI_7_7"), 285 | Messages.getString("NGram.KANJI_7_9"), 286 | Messages.getString("NGram.KANJI_7_11"), 287 | Messages.getString("NGram.KANJI_7_12"), 288 | Messages.getString("NGram.KANJI_7_13"), 289 | Messages.getString("NGram.KANJI_7_16"), 290 | Messages.getString("NGram.KANJI_7_18"), 291 | Messages.getString("NGram.KANJI_7_19"), 292 | Messages.getString("NGram.KANJI_7_20"), 293 | Messages.getString("NGram.KANJI_7_21"), 294 | Messages.getString("NGram.KANJI_7_23"), 295 | Messages.getString("NGram.KANJI_7_25"), 296 | Messages.getString("NGram.KANJI_7_28"), 297 | Messages.getString("NGram.KANJI_7_29"), 298 | Messages.getString("NGram.KANJI_7_32"), 299 | Messages.getString("NGram.KANJI_7_33"), 300 | Messages.getString("NGram.KANJI_7_35"), 301 | Messages.getString("NGram.KANJI_7_37"), }; 302 | 303 | static { 304 | cjkMap = new HashMap<>(); 305 | for (final String cjk_list : CJK_CLASS) { 306 | final char representative = cjk_list.charAt(0); 307 | for (int i = 0; i < cjk_list.length(); ++i) { 308 | cjkMap.put(cjk_list.charAt(i), representative); 309 | } 310 | } 311 | } 312 | 313 | } 314 | -------------------------------------------------------------------------------- /src/main/java/org/codelibs/elasticsearch/langfield/index/mapper/LangStringFieldMapper.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed to Elasticsearch under one or more contributor 3 | * license agreements. See the NOTICE file distributed with 4 | * this work for additional information regarding copyright 5 | * ownership. Elasticsearch licenses this file to you under 6 | * the Apache License, Version 2.0 (the "License"); you may 7 | * not use this file except in compliance with the License. 8 | * You may obtain a copy of the License at 9 | * 10 | * http://www.apache.org/licenses/LICENSE-2.0 11 | * 12 | * Unless required by applicable law or agreed to in writing, 13 | * software distributed under the License is distributed on an 14 | * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 15 | * KIND, either express or implied. See the License for the 16 | * specific language governing permissions and limitations 17 | * under the License. 18 | */ 19 | 20 | package org.codelibs.elasticsearch.langfield.index.mapper; 21 | 22 | import static org.elasticsearch.index.mapper.TypeParsers.parseTextField; 23 | 24 | import java.io.IOException; 25 | import java.lang.reflect.Method; 26 | import java.security.AccessController; 27 | import java.security.PrivilegedAction; 28 | import java.util.Iterator; 29 | import java.util.List; 30 | import java.util.Map; 31 | import java.util.Objects; 32 | 33 | import org.apache.lucene.document.Field; 34 | import org.apache.lucene.index.IndexOptions; 35 | import org.apache.lucene.index.IndexableField; 36 | import org.apache.lucene.index.Term; 37 | import org.apache.lucene.search.NormsFieldExistsQuery; 38 | import org.apache.lucene.search.Query; 39 | import org.apache.lucene.search.TermQuery; 40 | import org.apache.lucene.util.BytesRef; 41 | import org.codelibs.elasticsearch.langfield.detect.LangDetector; 42 | import org.codelibs.elasticsearch.langfield.detect.LangDetectorFactory; 43 | import org.elasticsearch.common.Strings; 44 | import org.elasticsearch.common.settings.Settings; 45 | import org.elasticsearch.common.xcontent.XContentBuilder; 46 | import org.elasticsearch.common.xcontent.support.XContentMapValues; 47 | import org.elasticsearch.index.analysis.NamedAnalyzer; 48 | import org.elasticsearch.index.fielddata.IndexFieldData; 49 | import org.elasticsearch.index.fielddata.plain.PagedBytesIndexFieldData; 50 | import org.elasticsearch.index.mapper.DocumentMapperParser; 51 | import org.elasticsearch.index.mapper.FieldMapper; 52 | import org.elasticsearch.index.mapper.FieldNamesFieldMapper; 53 | import org.elasticsearch.index.mapper.MappedFieldType; 54 | import org.elasticsearch.index.mapper.Mapper; 55 | import org.elasticsearch.index.mapper.MapperParsingException; 56 | import org.elasticsearch.index.mapper.ParseContext; 57 | import org.elasticsearch.index.mapper.StringFieldType; 58 | import org.elasticsearch.index.query.QueryShardContext; 59 | 60 | /** A {@link FieldMapper} for full-text fields. */ 61 | public class LangStringFieldMapper extends FieldMapper { 62 | 63 | public static final String CONTENT_TYPE = "langstring"; 64 | private static final int POSITION_INCREMENT_GAP_USE_ANALYZER = -1; 65 | 66 | private static final String SEPARATOR_SETTING_KEY = "separator"; 67 | 68 | private static final String LANG_SETTING_KEY = "lang"; 69 | 70 | private static final String LANG_FIELD_SETTING_KEY = "lang_field"; 71 | 72 | private static final String LANG_BASE_NAME_SETTING_KEY = "lang_base_name"; 73 | 74 | private static final String[] SUPPORTED_LANGUAGES = new String[] { "ar", 75 | "bg", "bn", "ca", "cs", "da", "de", "el", "en", "es", "et", "fa", 76 | "fi", "fr", "gu", "he", "hi", "hr", "hu", "id", "it", "ja", "ko", 77 | "lt", "lv", "mk", "ml", "nl", "no", "pa", "pl", "pt", "ro", "ru", 78 | "si", "sq", "sv", "ta", "te", "th", "tl", "tr", "uk", "ur", "vi", 79 | "zh-cn", "zh-tw" }; 80 | 81 | private static final String LANG_FIELD = ""; 82 | 83 | private static final String FIELD_SEPARATOR = "_"; 84 | 85 | private static final String LANG_BASE_NAME = ""; 86 | 87 | public static class Defaults { 88 | public static double FIELDDATA_MIN_FREQUENCY = 0; 89 | public static double FIELDDATA_MAX_FREQUENCY = Integer.MAX_VALUE; 90 | public static int FIELDDATA_MIN_SEGMENT_SIZE = 0; 91 | 92 | public static final MappedFieldType FIELD_TYPE = new LangStringFieldType(); 93 | 94 | static { 95 | FIELD_TYPE.freeze(); 96 | } 97 | 98 | /** 99 | * The default position_increment_gap is set to 100 so that phrase 100 | * queries of reasonably high slop will not match across field values. 101 | */ 102 | public static final int POSITION_INCREMENT_GAP = 100; 103 | } 104 | 105 | public static class Builder extends FieldMapper.Builder { 106 | 107 | private int positionIncrementGap = POSITION_INCREMENT_GAP_USE_ANALYZER; 108 | 109 | protected String fieldSeparator = FIELD_SEPARATOR; 110 | 111 | protected String[] supportedLanguages = SUPPORTED_LANGUAGES; 112 | 113 | protected String langField = LANG_FIELD; 114 | 115 | protected String langBaseName = LANG_BASE_NAME; 116 | 117 | public Builder(final String name) { 118 | super(name, Defaults.FIELD_TYPE, Defaults.FIELD_TYPE); 119 | builder = this; 120 | } 121 | 122 | @Override 123 | public LangStringFieldType fieldType() { 124 | return (LangStringFieldType) super.fieldType(); 125 | } 126 | 127 | public Builder positionIncrementGap(final int positionIncrementGap) { 128 | if (positionIncrementGap < 0) { 129 | throw new MapperParsingException("[positions_increment_gap] must be positive, got " + positionIncrementGap); 130 | } 131 | this.positionIncrementGap = positionIncrementGap; 132 | return this; 133 | } 134 | 135 | public Builder fielddata(final boolean fielddata) { 136 | fieldType().setFielddata(fielddata); 137 | return builder; 138 | } 139 | 140 | @Override 141 | public Builder docValues(final boolean docValues) { 142 | if (docValues) { 143 | throw new IllegalArgumentException("[text] fields do not support doc values"); 144 | } 145 | return super.docValues(docValues); 146 | } 147 | 148 | public Builder eagerGlobalOrdinals(final boolean eagerGlobalOrdinals) { 149 | fieldType().setEagerGlobalOrdinals(eagerGlobalOrdinals); 150 | return builder; 151 | } 152 | 153 | public Builder fieldSeparator(final String fieldSeparator) { 154 | this.fieldSeparator = fieldSeparator; 155 | return this; 156 | } 157 | 158 | public Builder supportedLanguages(final String[] supportedLanguages) { 159 | this.supportedLanguages = supportedLanguages; 160 | return this; 161 | } 162 | 163 | public Builder langField(final String langField) { 164 | this.langField = langField; 165 | return this; 166 | } 167 | 168 | public Builder langBaseName(final String langBaseName) { 169 | this.langBaseName = langBaseName; 170 | return this; 171 | } 172 | 173 | public Builder fielddataFrequencyFilter(final double minFreq, final double maxFreq, final int minSegmentSize) { 174 | fieldType().setFielddataMinFrequency(minFreq); 175 | fieldType().setFielddataMaxFrequency(maxFreq); 176 | fieldType().setFielddataMinSegmentSize(minSegmentSize); 177 | return builder; 178 | } 179 | 180 | @Override 181 | public LangStringFieldMapper build(final BuilderContext context) { 182 | if (positionIncrementGap != POSITION_INCREMENT_GAP_USE_ANALYZER) { 183 | if (fieldType.indexOptions().compareTo(IndexOptions.DOCS_AND_FREQS_AND_POSITIONS) < 0) { 184 | throw new IllegalArgumentException("Cannot set position_increment_gap on field [" 185 | + name + "] without positions enabled"); 186 | } 187 | fieldType.setIndexAnalyzer(new NamedAnalyzer(fieldType.indexAnalyzer(), positionIncrementGap)); 188 | fieldType.setSearchAnalyzer(new NamedAnalyzer(fieldType.searchAnalyzer(), positionIncrementGap)); 189 | fieldType.setSearchQuoteAnalyzer(new NamedAnalyzer(fieldType.searchQuoteAnalyzer(), positionIncrementGap)); 190 | } 191 | setupFieldType(context); 192 | return new LangStringFieldMapper( 193 | name, fieldType, defaultFieldType, positionIncrementGap, includeInAll, 194 | fieldSeparator, supportedLanguages, langField, langBaseName, 195 | context.indexSettings(), multiFieldsBuilder.build(this, context), copyTo); 196 | } 197 | } 198 | 199 | public static class TypeParser implements Mapper.TypeParser { 200 | @Override 201 | public Mapper.Builder parse(final String fieldName, final Map node, final ParserContext parserContext) throws MapperParsingException { 202 | final LangStringFieldMapper.Builder builder = new LangStringFieldMapper.Builder(fieldName); 203 | builder.fieldType().setIndexAnalyzer(parserContext.getIndexAnalyzers().getDefaultIndexAnalyzer()); 204 | builder.fieldType().setSearchAnalyzer(parserContext.getIndexAnalyzers().getDefaultSearchAnalyzer()); 205 | builder.fieldType().setSearchQuoteAnalyzer(parserContext.getIndexAnalyzers().getDefaultSearchQuoteAnalyzer()); 206 | parseTextField(builder, fieldName, node, parserContext); 207 | for (final Iterator> iterator = node.entrySet().iterator(); iterator.hasNext();) { 208 | final Map.Entry entry = iterator.next(); 209 | final String propName = entry.getKey(); 210 | final Object propNode = entry.getValue(); 211 | if (propName.equals("position_increment_gap")) { 212 | final int newPositionIncrementGap = XContentMapValues.nodeIntegerValue(propNode, -1); 213 | builder.positionIncrementGap(newPositionIncrementGap); 214 | iterator.remove(); 215 | } else if (propName.equals("fielddata")) { 216 | builder.fielddata(XContentMapValues.nodeBooleanValue(propNode, "fielddata")); 217 | iterator.remove(); 218 | } else if (propName.equals("eager_global_ordinals")) { 219 | builder.eagerGlobalOrdinals(XContentMapValues.nodeBooleanValue(propNode, "eager_global_ordinals")); 220 | iterator.remove(); 221 | } else if (propName.equals("fielddata_frequency_filter")) { 222 | final Map frequencyFilter = (Map) propNode; 223 | final double minFrequency = XContentMapValues.nodeDoubleValue(frequencyFilter.remove("min"), 0); 224 | final double maxFrequency = XContentMapValues.nodeDoubleValue(frequencyFilter.remove("max"), Integer.MAX_VALUE); 225 | final int minSegmentSize = XContentMapValues.nodeIntegerValue(frequencyFilter.remove("min_segment_size"), 0); 226 | builder.fielddataFrequencyFilter(minFrequency, maxFrequency, minSegmentSize); 227 | DocumentMapperParser.checkNoRemainingFields(propName, frequencyFilter, parserContext.indexVersionCreated()); 228 | iterator.remove(); 229 | } else if (propName.equals(SEPARATOR_SETTING_KEY)) { 230 | builder.fieldSeparator(propNode.toString()); 231 | iterator.remove(); 232 | } else if (propName.equals(LANG_SETTING_KEY)) { 233 | builder.supportedLanguages( 234 | XContentMapValues.nodeStringArrayValue(propNode)); 235 | iterator.remove(); 236 | } else if (propName.equals(LANG_FIELD_SETTING_KEY)) { 237 | builder.langField(propNode.toString()); 238 | iterator.remove(); 239 | } else if (propName.equals(LANG_BASE_NAME_SETTING_KEY)) { 240 | builder.langBaseName(propNode.toString()); 241 | iterator.remove(); 242 | } 243 | } 244 | return builder; 245 | } 246 | } 247 | 248 | public static final class LangStringFieldType extends StringFieldType { 249 | 250 | private boolean fielddata; 251 | private double fielddataMinFrequency; 252 | private double fielddataMaxFrequency; 253 | private int fielddataMinSegmentSize; 254 | 255 | public LangStringFieldType() { 256 | setTokenized(true); 257 | fielddata = false; 258 | fielddataMinFrequency = Defaults.FIELDDATA_MIN_FREQUENCY; 259 | fielddataMaxFrequency = Defaults.FIELDDATA_MAX_FREQUENCY; 260 | fielddataMinSegmentSize = Defaults.FIELDDATA_MIN_SEGMENT_SIZE; 261 | } 262 | 263 | protected LangStringFieldType(final LangStringFieldType ref) { 264 | super(ref); 265 | this.fielddata = ref.fielddata; 266 | this.fielddataMinFrequency = ref.fielddataMinFrequency; 267 | this.fielddataMaxFrequency = ref.fielddataMaxFrequency; 268 | this.fielddataMinSegmentSize = ref.fielddataMinSegmentSize; 269 | } 270 | 271 | @Override 272 | public LangStringFieldType clone() { 273 | return new LangStringFieldType(this); 274 | } 275 | 276 | @Override 277 | public boolean equals(final Object o) { 278 | if (super.equals(o) == false) { 279 | return false; 280 | } 281 | final LangStringFieldType that = (LangStringFieldType) o; 282 | return fielddata == that.fielddata 283 | && fielddataMinFrequency == that.fielddataMinFrequency 284 | && fielddataMaxFrequency == that.fielddataMaxFrequency 285 | && fielddataMinSegmentSize == that.fielddataMinSegmentSize; 286 | } 287 | 288 | @Override 289 | public int hashCode() { 290 | return Objects.hash(super.hashCode(), fielddata, 291 | fielddataMinFrequency, fielddataMaxFrequency, fielddataMinSegmentSize); 292 | } 293 | 294 | @Override 295 | public void checkCompatibility(final MappedFieldType other, 296 | final List conflicts, final boolean strict) { 297 | super.checkCompatibility(other, conflicts, strict); 298 | final LangStringFieldType otherType = (LangStringFieldType) other; 299 | if (strict) { 300 | if (fielddata() != otherType.fielddata()) { 301 | conflicts.add("mapper [" + name() + "] is used by multiple types. Set update_all_types to true to update [fielddata] " 302 | + "across all types."); 303 | } 304 | if (fielddataMinFrequency() != otherType.fielddataMinFrequency()) { 305 | conflicts.add("mapper [" + name() + "] is used by multiple types. Set update_all_types to true to update " 306 | + "[fielddata_frequency_filter.min] across all types."); 307 | } 308 | if (fielddataMaxFrequency() != otherType.fielddataMaxFrequency()) { 309 | conflicts.add("mapper [" + name() + "] is used by multiple types. Set update_all_types to true to update " 310 | + "[fielddata_frequency_filter.max] across all types."); 311 | } 312 | if (fielddataMinSegmentSize() != otherType.fielddataMinSegmentSize()) { 313 | conflicts.add("mapper [" + name() + "] is used by multiple types. Set update_all_types to true to update " 314 | + "[fielddata_frequency_filter.min_segment_size] across all types."); 315 | } 316 | } 317 | } 318 | 319 | public boolean fielddata() { 320 | return fielddata; 321 | } 322 | 323 | public void setFielddata(final boolean fielddata) { 324 | checkIfFrozen(); 325 | this.fielddata = fielddata; 326 | } 327 | 328 | public double fielddataMinFrequency() { 329 | return fielddataMinFrequency; 330 | } 331 | 332 | public void setFielddataMinFrequency(final double fielddataMinFrequency) { 333 | checkIfFrozen(); 334 | this.fielddataMinFrequency = fielddataMinFrequency; 335 | } 336 | 337 | public double fielddataMaxFrequency() { 338 | return fielddataMaxFrequency; 339 | } 340 | 341 | public void setFielddataMaxFrequency(final double fielddataMaxFrequency) { 342 | checkIfFrozen(); 343 | this.fielddataMaxFrequency = fielddataMaxFrequency; 344 | } 345 | 346 | public int fielddataMinSegmentSize() { 347 | return fielddataMinSegmentSize; 348 | } 349 | 350 | public void setFielddataMinSegmentSize(final int fielddataMinSegmentSize) { 351 | checkIfFrozen(); 352 | this.fielddataMinSegmentSize = fielddataMinSegmentSize; 353 | } 354 | 355 | @Override 356 | public String typeName() { 357 | return CONTENT_TYPE; 358 | } 359 | 360 | @Override 361 | public Query existsQuery(QueryShardContext context) { 362 | if (omitNorms()) { 363 | return new TermQuery(new Term(FieldNamesFieldMapper.NAME, name())); 364 | } else { 365 | return new NormsFieldExistsQuery(name()); 366 | } 367 | } 368 | 369 | @Override 370 | public Query nullValueQuery() { 371 | if (nullValue() == null) { 372 | return null; 373 | } 374 | return termQuery(nullValue(), null); 375 | } 376 | 377 | @Override 378 | public IndexFieldData.Builder fielddataBuilder(String fullyQualifiedIndexName) { 379 | if (fielddata == false) { 380 | throw new IllegalArgumentException("Fielddata is disabled on text fields by default. Set fielddata=true on [" + name() 381 | + "] in order to load fielddata in memory by uninverting the inverted index. Note that this can however " 382 | + "use significant memory. Alternatively use a keyword field instead."); 383 | } 384 | return new PagedBytesIndexFieldData.Builder(fielddataMinFrequency, fielddataMaxFrequency, fielddataMinSegmentSize); 385 | } 386 | } 387 | 388 | private Boolean includeInAll; 389 | private int positionIncrementGap; 390 | private final LangDetectorFactory langDetectorFactory; 391 | private String fieldSeparator; 392 | private String[] supportedLanguages; 393 | private String langField; 394 | private String langBaseName; 395 | private Method parseCopyMethod; 396 | 397 | protected LangStringFieldMapper(final String simpleName, final MappedFieldType fieldType, final MappedFieldType defaultFieldType, 398 | final int positionIncrementGap, final Boolean includeInAll, 399 | final String fieldSeparator, final String[] supportedLanguages, final String langField, final String langBaseName, 400 | final Settings indexSettings, final MultiFields multiFields, final CopyTo copyTo) { 401 | super(simpleName, fieldType, defaultFieldType, indexSettings, multiFields, copyTo); 402 | assert fieldType.tokenized(); 403 | assert fieldType.hasDocValues() == false; 404 | if (fieldType().indexOptions() == IndexOptions.NONE && fieldType().fielddata()) { 405 | throw new IllegalArgumentException("Cannot enable fielddata on a [text] field that is not indexed: [" + name() + "]"); 406 | } 407 | this.positionIncrementGap = positionIncrementGap; 408 | this.includeInAll = includeInAll; 409 | this.fieldSeparator = fieldSeparator; 410 | this.supportedLanguages = supportedLanguages; 411 | this.langField = langField; 412 | this.langBaseName = langBaseName; 413 | 414 | langDetectorFactory = LangDetectorFactory.create(supportedLanguages); 415 | 416 | parseCopyMethod = AccessController.doPrivileged((PrivilegedAction) () -> { 417 | try { 418 | final Class docParserClazz = FieldMapper.class.getClassLoader().loadClass("org.elasticsearch.index.mapper.DocumentParser"); 419 | final Method method = docParserClazz.getDeclaredMethod("parseCopy", new Class[] { String.class, ParseContext.class }); 420 | method.setAccessible(true); 421 | return method; 422 | } catch (final Exception e) { 423 | throw new IllegalStateException("Failed to access DocumentParser#parseCopy(String, ParseContext).", e); 424 | } 425 | }); 426 | } 427 | 428 | @Override 429 | protected LangStringFieldMapper clone() { 430 | return (LangStringFieldMapper) super.clone(); 431 | } 432 | 433 | // pkg-private for testing 434 | Boolean includeInAll() { 435 | return includeInAll; 436 | } 437 | 438 | public int getPositionIncrementGap() { 439 | return this.positionIncrementGap; 440 | } 441 | 442 | @Override 443 | protected void parseCreateField(final ParseContext context, final List fields) throws IOException { 444 | final String value; 445 | if (context.externalValueSet()) { 446 | value = context.externalValue().toString(); 447 | } else { 448 | value = context.parser().textOrNull(); 449 | } 450 | 451 | if (value == null) { 452 | return; 453 | } 454 | 455 | if (context.includeInAll(includeInAll, this)) { 456 | context.allEntries().addText(fieldType().name(), value, fieldType().boost()); 457 | } 458 | 459 | if (fieldType().indexOptions() != IndexOptions.NONE || fieldType().stored()) { 460 | final Field field = new Field(fieldType().name(), value, fieldType()); 461 | fields.add(field); 462 | } 463 | 464 | if (value != null && value.trim().length() > 0) { 465 | final String lang = detectLanguage(context, value); 466 | if (!LangDetector.UNKNOWN_LANG.equals(lang)) { 467 | final StringBuilder langFieldBuf = new StringBuilder(); 468 | if (langBaseName.length() == 0) { 469 | langFieldBuf.append(fieldType().name()); 470 | } else { 471 | langFieldBuf.append(langBaseName); 472 | } 473 | langFieldBuf.append(fieldSeparator).append(lang); 474 | try { 475 | parseCopyMethod.invoke(null, new Object[] { langFieldBuf.toString(), context }); 476 | } catch (final Exception e) { 477 | throw new IllegalStateException( 478 | "Failed to invoke parseCopy method.", e); 479 | } 480 | } 481 | } 482 | } 483 | 484 | private String detectLanguage(final ParseContext context, 485 | final String text) { 486 | if (langField != null && langField.length() > 0) { 487 | final IndexableField[] langFields = context.doc() 488 | .getFields(langField); 489 | if (langFields != null) { 490 | for (final IndexableField langField : langFields) { 491 | if (langField instanceof Field) { 492 | final BytesRef bytes = langField.binaryValue(); 493 | if (bytes != null) { 494 | final String lang = bytes.utf8ToString(); 495 | if (lang.length() > 0) { 496 | for (final String supportedLang : supportedLanguages) { 497 | if (supportedLang.equals(lang)) { 498 | return lang; 499 | } 500 | } 501 | } 502 | } 503 | } 504 | } 505 | } 506 | } 507 | try { 508 | final LangDetector langDetector = langDetectorFactory.getLangDetector(); 509 | langDetector.append(text); 510 | return langDetector.detect(); 511 | } catch (final Exception e) { 512 | // TODO logger 513 | return LangDetector.UNKNOWN_LANG; 514 | } 515 | } 516 | 517 | @Override 518 | protected String contentType() { 519 | return CONTENT_TYPE; 520 | } 521 | 522 | @Override 523 | protected void doMerge(final Mapper mergeWith, final boolean updateAllTypes) { 524 | super.doMerge(mergeWith, updateAllTypes); 525 | this.includeInAll = ((LangStringFieldMapper) mergeWith).includeInAll; 526 | this.fieldSeparator = ((LangStringFieldMapper) mergeWith).fieldSeparator; 527 | this.supportedLanguages = ((LangStringFieldMapper) mergeWith).supportedLanguages; 528 | this.langField = ((LangStringFieldMapper) mergeWith).langField; 529 | this.langBaseName = ((LangStringFieldMapper) mergeWith).langBaseName; 530 | } 531 | 532 | @Override 533 | public LangStringFieldType fieldType() { 534 | return (LangStringFieldType) super.fieldType(); 535 | } 536 | 537 | @Override 538 | protected void doXContentBody(final XContentBuilder builder, final boolean includeDefaults, final Params params) throws IOException { 539 | super.doXContentBody(builder, includeDefaults, params); 540 | doXContentAnalyzers(builder, includeDefaults); 541 | 542 | if (includeInAll != null) { 543 | builder.field("include_in_all", includeInAll); 544 | } else if (includeDefaults) { 545 | builder.field("include_in_all", true); 546 | } 547 | 548 | if (includeDefaults || positionIncrementGap != POSITION_INCREMENT_GAP_USE_ANALYZER) { 549 | builder.field("position_increment_gap", positionIncrementGap); 550 | } 551 | 552 | if (includeDefaults || fieldType().fielddata() != ((LangStringFieldType) defaultFieldType).fielddata()) { 553 | builder.field("fielddata", fieldType().fielddata()); 554 | } 555 | if (fieldType().fielddata()) { 556 | if (includeDefaults 557 | || fieldType().fielddataMinFrequency() != Defaults.FIELDDATA_MIN_FREQUENCY 558 | || fieldType().fielddataMaxFrequency() != Defaults.FIELDDATA_MAX_FREQUENCY 559 | || fieldType().fielddataMinSegmentSize() != Defaults.FIELDDATA_MIN_SEGMENT_SIZE) { 560 | builder.startObject("fielddata_frequency_filter"); 561 | if (includeDefaults || fieldType().fielddataMinFrequency() != Defaults.FIELDDATA_MIN_FREQUENCY) { 562 | builder.field("min", fieldType().fielddataMinFrequency()); 563 | } 564 | if (includeDefaults || fieldType().fielddataMaxFrequency() != Defaults.FIELDDATA_MAX_FREQUENCY) { 565 | builder.field("max", fieldType().fielddataMaxFrequency()); 566 | } 567 | if (includeDefaults || fieldType().fielddataMinSegmentSize() != Defaults.FIELDDATA_MIN_SEGMENT_SIZE) { 568 | builder.field("min_segment_size", fieldType().fielddataMinSegmentSize()); 569 | } 570 | builder.endObject(); 571 | } 572 | } 573 | if (includeDefaults || !fieldSeparator.equals(FIELD_SEPARATOR)) { 574 | builder.field(SEPARATOR_SETTING_KEY, fieldSeparator); 575 | } 576 | final String langs = Strings.arrayToDelimitedString(supportedLanguages, ","); 577 | if (includeDefaults 578 | || !langs.equals(Strings.arrayToDelimitedString(SUPPORTED_LANGUAGES, ","))) { 579 | builder.field(LANG_SETTING_KEY, langs); 580 | } 581 | if (includeDefaults || !langField.equals(LANG_FIELD)) { 582 | builder.field(LANG_FIELD_SETTING_KEY, langField); 583 | } 584 | if (includeDefaults || !langField.equals(LANG_BASE_NAME)) { 585 | builder.field(LANG_BASE_NAME_SETTING_KEY, langBaseName); 586 | } 587 | } 588 | } 589 | -------------------------------------------------------------------------------- /src/main/plugin-metadata/plugin-descriptor.properties: -------------------------------------------------------------------------------- 1 | description=This plugin provides langfield type. 2 | version=${project.version} 3 | name=langfield 4 | classname=${elasticsearch.plugin.classname} 5 | elasticsearch.version= 6 | java.version=${maven.compiler.target} 7 | -------------------------------------------------------------------------------- /src/main/plugin-metadata/plugin-security.policy: -------------------------------------------------------------------------------- 1 | grant { 2 | permission java.lang.reflect.ReflectPermission "suppressAccessChecks"; 3 | permission java.lang.RuntimePermission "getClassLoader"; 4 | permission java.lang.RuntimePermission "accessDeclaredMembers"; 5 | }; 6 | -------------------------------------------------------------------------------- /src/main/resources/org/codelibs/elasticsearch/langfield/detect/util/messages.properties: -------------------------------------------------------------------------------- 1 | NGram.CJK_KANJI_EXCLUDE=\u0020\uFF08\uFF09 2 | NGram.LATIN1_EXCLUDE=\u00A0\u00AB\u00B0\u00BB 3 | NGram.KANJI_1_0=\u4F7C\u6934 4 | NGram.KANJI_1_2=\u88CF\u95B2 5 | NGram.KANJI_1_4=\u7027\u7DCB 6 | NGram.KANJI_1_8=\u4E80\u4E9C\u4EEE\u5263\u5264\u5270\u52C5\u52E7\u52F2\u53B3\u5449\u58CA\u58CC\u5968\u59C9\u59EB\u5D8B\u5DE3\u5E30\u6075\u622F\u623B\u6255\u629C\u629E\u62DD\u62E1\u633F\u635C\u63FA\u6442\u6589\u658E\u6669\u66A6\u66FD\u6804\u685C\u6B69\u6B6F\u6BBB\u6C37\u6C5A\u6D44\u6E09\u6E0B\u6E13\u6EDD\u713C\u72A0\u731F\u7363\u7A32\u7A42\u7A93\u7ADC\u7C8B\u7C9B\u7DD1\u7E01\u7E04\u7E26\u7E4A\u7E4B\u7E70\u8074\u8107\u8133\u81D3\u820E\u8217\u8358\u83D3\u85AC\u8987\u899A\u8B21\u8B72\u8B83\u8CDB\u9045\u90F7\u91C8\u9271\u9283\u92AD\u9665\u967A\u96A0\u96A3\u96B7\u970A\u983C\u9854\u9855\u99C6\u9A12\u9ED9\u9F62 7 | NGram.KANJI_1_11=\u67D8\u831C 8 | NGram.KANJI_1_12=\u5742\u57FC\u5800 9 | NGram.KANJI_1_13=\u4E3C\u4E98\u4FE3\u4FF5\u5072\u51A8\u53A9\u5451\u546A\u5504\u5516\u55A9\u55B0\u5618\u5642\u565B\u567A\u56A2\u57F4\u5840\u5841\u58F1\u59F6\u5A2F\u5B22\u5B8D\u5DCC\u5EFB\u5F10\u60A9\u60E3\u61D0\u62F6\u63B4\u63BB\u63C3\u6681\u685F\u6955\u6962\u696F\u698A\u698E\u69FB\u6A2B\u6A7F\u6B53\u6BD8\u6D99\u6E07\u7460\u7473\u7560\u7573\u758E\u7690\u7815\u783A\u7962\u7A4F\u7A63\u7AEA\u7BED\u7CA7\u7D18\u7D3A\u7E4D\u8061\u8218\u8276\u82C5\u8597\u85AB\u86CD\u874B\u88FE\u8ACF\u8B90\u8D0B\u8FBF\u9013\u9061\u914E\u9154\u918D\u9190\u91A4\u91B8\u9262\u929A\u92ED\u92F3\u932C\u96EB\u96F0\u976D\u97EE\u981A\u99C4\u9A28\u9AC4\u9B8E\u9C10\u9D0E\u9D5C\u9D8F\u9E78\u9EB9\u9EBA\u9EBF 10 | NGram.KANJI_1_14=\u5F66\u7984\u7985 11 | NGram.KANJI_1_16=\u5861\u7B25\u844E\u9419\u9D07 12 | NGram.KANJI_1_18=\u5039\u514E\u51E7\u51EA\u5301\u5302\u5859\u58F7\u59AC\u5C2D\u5CA8\u5EFC\u6357\u64B9\u67CA\u6802\u6834\u68BC\u6900\u6919\u691B\u69D9\u6AE8\u6D9C\u6E8C\u6F09\u6F45\u701E\u7026\u7114\u72DB\u7577\u75E9\u783F\u7895\u7A50\u7AC3\u7B48\u7B86\u7BAA\u7C7E\u7C82\u7C8D\u7CCE\u7D2C\u7F6B\u7FEB\u8557\u85AE\u86CE\u877F\u8997\u8ACC\u8CB0\u8CCE\u8FE9\u9197\u920E\u9266\u927E\u92F2\u9306\u9453\u9784\u982C\u9834\u99C8\u9BF5\u9C2F\u9D2C 13 | NGram.KANJI_1_22=\u6762\u6A17\u887F 14 | NGram.KANJI_1_27=\u4E21\u4E57\u4ECF\u4F1D\u4FA1\u4FF3\u5024\u50CD\u5150\u5186\u51E6\u52B4\u52B9\u5358\u53CE\u55B6\u56E3\u56F2\u56F3\u570F\u5727\u5869\u5897\u58F2\u5909\u5B9F\u5BDB\u5BFE\u5C02\u5DFB\u5E2F\u5E81\u5E83\u5EC3\u5F3E\u5F93\u5FB3\u5FB4\u5FDC\u60AA\u6226\u6238\u6271\u62E0\u6319\u63B2\u6483\u64AE\u67A0\u67FB\u691C\u697D\u69D8\u6A29\u6B73\u6B74\u6BCE\u6C17\u6CA2\u6D5C\u6E08\u6E80\u702C\u7523\u767A\u770C\u7D4C\u7D75\u7D76\u7D99\u7D9A\u7DCF\u8535\u8846\u89A7\u89B3\u8A33\u8AAC\u8AAD\u8C4A\u8EE2\u8EFD\u8FBA\u8FBC\u9244\u9332\u95A2\u95D8\u96D1\u99C5\u9A13\u9ED2 15 | NGram.KANJI_1_29=\u4F0E\u4FFA\u5036\u53E1\u54B2\u5506\u583A\u5C3B\u5CAC\u5CE0\u5CEF\u6803\u68B6\u6A0B\u6A8E\u73C2\u7551\u7826\u7881\u79B0\u7B39\u8429\u8599\u8FBB\u9162\u95C7\u9688\u96BC\u9AEA\u9DF2 16 | NGram.KANJI_1_31=\u5553\u938C 17 | NGram.KANJI_1_35=\u51B4\u564C\u57DC\u5B2C\u6822\u685D\u690B\u6973\u6C93\u7511\u7887\u7A17\u83D6\u847A\u8494\u8526\u854E\u85C1\u86F8\u88B4\u93A7\u9B92\u9C39\u9C48\u9C52 18 | NGram.KANJI_2_0=\u4E2B\u4EC3\u4F09\u4F57\u4F6F\u4F70\u4FD1\u4FDA\u500C\u5043\u516E\u5189\u5241\u530D\u5310\u5412\u54AB\u54AF\u5514\u5556\u55B1\u561F\u573B\u586D\u587D\u58C5\u58D1\u5914\u5A62\u5A6A\u5AE6\u5B40\u5B5B\u5B70\u5BB8\u5CD2\u5D01\u5D34\u5E11\u5EA0\u5F0B\u5F2D\u5F87\u607F\u621B\u6221\u6289\u63A3\u6452\u646D\u64D8\u652B\u6600\u6631\u6641\u66F7\u6773\u67B8\u67DD\u67DE\u6829\u68FB\u69AD\u6A47\u6C10\u6C68\u6C74\u6C85\u6CD3\u6D31\u6D93\u6D94\u6DB8\u6DBF\u6DC5\u6E6E\u6EA7\u6EB4\u6EC2\u6F2A\u6F2F\u6FB9\u6FC2\u6FDB\u6FEE\u70AF\u70FD\u7166\u726F\u729B\u739F\u73DE\u740A\u746D\u749C\u749F\u74E0\u759D\u75A3\u75CD\u75DE\u7600\u7620\u7688\u7738\u7762\u776B\u777D\u77E3\u781D\u7837\u78A3\u7946\u7B60\u7F44\u7F54\u7F5F\u7FAF\u8026\u807F\u80C4\u80DB\u80ED\u81E7\u824B\u82B7\u82E3\u8392\u846D\u84D3\u8548\u85B9\u86DE\u873F\u8753\u8782\u87AB\u87B3\u87D1\u87E0\u87FE\u8821\u88D8\u88E8\u8913\u891A\u892B\u8983\u8C3F\u8C49\u8C82\u8D6D\u8DE4\u8E1D\u8E1E\u8E7C\u8FE5\u8FE8\u9005\u9035\u9050\u9082\u9083\u9095\u90E2\u911E\u91AE\u91B4\u93D6\u9621\u968D\u96B9\u96D2\u9711\u9713\u973E\u9AB0\u9AB7\u9AE6\u9B03\u9B23\u9EDC\u9EEF 19 | NGram.KANJI_2_1=\u4E82\u4F48\u4F54\u50F9\u5167\u528D\u52DE\u532F\u537B\u53C3\u5433\u555F\u55AE\u56B4\u570D\u5716\u58D3\u58DE\u5920\u5967\u5A1B\u5BEB\u5BEC\u5C08\u5C0D\u5C46\u5C6C\u5CFD\u5E36\u5E6B\u5EC8\u5EF3\u5F48\u5F91\u5F9E\u5FB5\u6046\u60E1\u61F7\u6232\u6236\u64C7\u64CA\u64D4\u64DA\u64F4\u651D\u6578\u65B7\u6649\u6A13\u6A23\u6A6B\u6A94\u6AA2\u6B0A\u6B50\u6B61\u6B72\u6B77\u6B78\u6C92\u6EAB\u6EFF\u6FD5\u6FDF\u71DF\u722D\u72C0\u734E\u737B\u746A\u7522\u773E\u78BC\u7A69\u7C3D\u7CB5\u7D55\u7D72\u7DA0\u7DAB\u7DE3\u7E5E\u7E6A\u7E7C\u7E8C\u8072\u807D\u8085\u812B\u8166\u8173\u81D8\u8209\u820A\u8332\u838A\u840A\u85E5\u860B\u8655\u865B\u88DD\u89BA\u89BD\u89C0\u8AAA\u8B6F\u8B7D\u8B8A\u8B93\u8C50\u8CF4\u8E64\u8F15\u8F49\u8FA6\u8FAD\u9109\u9130\u91AB\u91CB\u92B7\u9304\u9322\u95CA\u96A8\u96AA\u96B1\u96B8\u96D6\u96D9\u96DC\u9748\u975C\u986F\u9918\u99DB\u9A57\u9B25\u9EA5\u9EC3\u9EDE\u9F52 20 | NGram.KANJI_2_4=\u514C\u51AA\u5614\u56AE\u56C2\u582F\u58FA\u5B0C\u5D11\u5DD2\u5DD6\u5E40\u5E5F\u5EEC\u6137\u6417\u6488\u64F2\u652A\u6582\u6689\u689F\u68D7\u69D3\u6A97\u6AB8\u6ABB\u6AC3\u6ADA\u6B7F\u6BB2\u6EA5\u6EC4\u6EF2\u7009\u701D\u7028\u703E\u7165\u71BE\u721B\u7463\u7464\u7469\u7515\u7526\u75FA\u7621\u779E\u79B1\u7A1F\u7AC4\u7AC7\u7B8F\u7BE9\u7D2E\u7D68\u7D8F\u7DB8\u7DBA\u7E46\u7E79\u7F4C\u7F88\u8070\u8073\u8076\u81BE\u82BB\u83A2\u858A\u8591\u861A\u8778\u87EC\u8805\u880D\u893B\u8A1B\u8A25\u8A36\u8A85\u8AA6\u8B17\u8B28\u8CB6\u8CE4\u8D16\u8D1B\u8ECB\u9112\u9214\u9249\u93AC\u9594\u9598\u95BB\u95D5\u965E\u96B4\u97DC\u9821\u9824\u9921\u9952\u9A55\u9A5B\u9B1A\u9C13\u9D09\u9DAF\u9E1A\u9E75\u9F67 21 | NGram.KANJI_2_9=\u4E9F\u4F6C\u4FDE\u4FFE\u5029\u5140\u51A2\u5345\u539D\u53FB\u54C7\u5599\u560E\u561B\u563B\u566C\u5676\u5729\u574D\u57E4\u595A\u598D\u5A1F\u5A25\u5A77\u5AB2\u5AD6\u5BF0\u5C2C\u5CEA\u5E37\u5F08\u6059\u606A\u6096\u609A\u62A8\u6555\u6556\u66E6\u675E\u68E3\u69BB\u6BCB\u6BD3\u6C1F\u6C26\u6C81\u6DC4\u6DDE\u6E32\u6E44\u6E4D\u6F33\u6F7C\u6FA7\u701A\u701B\u715C\u741B\u7428\u7480\u74A8\u7504\u752C\u768B\u76CE\u78CA\u78FA\u79BA\u7C27\u8046\u81FB\u8331\u8393\u83C1\u8403\u8438\u843C\u8446\u85B0\u87D2\u8862\u8DC6\u9074\u9131\u9672\u96EF\u9704\u9706\u977C\u9ABC\u9E92\u9ECF 22 | NGram.KANJI_2_10=\u51BD\u5704\u7350\u73A5 23 | NGram.KANJI_2_11=\u4E15\u4EA2\u4F5A\u50D6\u5349\u53DF\u5484\u5958\u5B34\u5B5A\u5C91\u5E1B\u5F77\u61CB\u61FF\u620C\u620D\u622E\u6248\u6538\u660A\u664F\u678B\u67E9\u69B7\u69C3\u6CB1\u6CD7\u6D5A\u6DAA\u6DC7\u7099\u71EE\u7325\u7425\u7455\u747E\u749E\u75B5\u7678\u7693\u76C2\u77B0\u77BF\u78CB\u7957\u795A\u797A\u7A79\u7B08\u7B75\u7BB4\u7F9A\u7FB2\u7FDF\u80E5\u81BA\u8340\u837C\u8398\u8559\u85A8\u86DF\u8734\u8882\u88F4\u8936\u900D\u907D\u9642\u96C9\u9AFB\u9E9D\u9EBE 24 | NGram.KANJI_2_12=\u5F57\u7940 25 | NGram.KANJI_2_13=\u5191\u7791\u792C\u7D46 26 | NGram.KANJI_2_15=\u5713\u58FD\u5D17\u5D19\u5DBC\u5F4C\u6191\u64A5\u687F\u69AE\u6AFB\u6EEC\u6F3F\u6FE4\u6FF1\u6FFE\u700B\u74CA\u76E1\u76E7\u7926\u792B\u79AE\u7AA9\u7C43\u7C4C\u7C64\u7DBD\u81A0\u856D\u8594\u8606\u8A62\u8AF7\u8CC8\u8CE3\u8D99\u8F1B\u8F3B\u9059\u9127\u9264\u947D\u95A9\u97CB\u980C\u9838\u9846\u99AE\u9A19\u9B06\u9B91\u9F4A\u9F4B 27 | NGram.KANJI_2_16=\u4E69\u4EC4\u4EDF\u4EF3\u4F0B\u4F5E\u5000\u5028\u50E5\u513B\u5157\u51DC\u52D7\u530F\u5379\u53F5\u5471\u5477\u5555\u555C\u557B\u5594\u55B2\u55C9\u560D\u5616\u562E\u5630\u5653\u5657\u566F\u56A8\u56B6\u5820\u5880\u58CE\u58D9\u5950\u5969\u596D\u599E\u59B3\u59CD\u59D2\u5A40\u5AA7\u5ABC\u5AD7\u5AD8\u5B0B\u5B24\u5B38\u5B53\u5C5C\u5D06\u5D47\u5D94\u5D9D\u5E57\u5EC4\u5F46\u5FAC\u60BD\u60D8\u6123\u615D\u615F\u6175\u618A\u61AB\u61E3\u623E\u6308\u636B\u645F\u6519\u6595\u6698\u66B8\u67D9\u6840\u695D\u696E\u6979\u69C1\u69E8\u6AEC\u6AFA\u6B5F\u6CAC\u6CE0\u6CEF\u6D0C\u6D36\u6DD2\u6DD9\u6DE6\u6DEC\u6E5F\u6FA0\u6FEC\u7156\u71C4\u71DC\u71EC\u71FC\u720D\u7230\u7292\u7296\u72A2\u72CE\u7357\u737A\u7380\u7386\u73A8\u73EE\u743F\u74A6\u74CF\u74D4\u74DA\u755A\u75A5\u75B3\u75C2\u75E0\u75F1\u75FF\u7601\u7609\u7646\u7658\u769A\u76B0\u774F\u775C\u778B\u77BD\u77C7\u7843\u787F\u78F4\u79C8\u7A88\u7A95\u7AFD\u7B1E\u7B67\u7B9D\u7BCC\u7C0D\u7C11\u7C37\u7C40\u7C6E\u7CB3\u7CBD\u7D09\u7D31\u7D40\u7D5B\u7D70\u7D91\u7D9E\u7DB0\u7DD9\u7DF9\u7E08\u7E11\u7E1D\u7E35\u7E52\u7FB6\u7FBF\u7FEE\u8012\u801C\u8028\u8052\u8123\u8188\u81C3\u81DA\u81FE\u8210\u82BE\u83A0\u83D4\u8407\u8435\u8477\u849E\u84C6\u84CA\u85F9\u867A\u86B5\u86B6\u86C4\u8706\u8707\u870A\u8768\u87BB\u8831\u8839\u8879\u8921\u8938\u8964\u89A6\u89AC\u8A10\u8A3E\u8AC2\u8ADB\u8AF3\u8B2B\u8B41\u8B4E\u8B5F\u8B6B\u8B92\u8C55\u8C62\u8C73\u8C8A\u8C8D\u8CB2\u8CB3\u8CD2\u8CE1\u8CFB\u8D0D\u8E34\u8E7A\u8E8A\u8ED4\u8EFE\u8F0A\u8F1C\u8F1E\u8F26\u8FAE\u9088\u90C3\u90FE\u9134\u9148\u91D9\u91E9\u9238\u9239\u923D\u924D\u925A\u9296\u92AC\u92BB\u9315\u9319\u931A\u9321\u9370\u9394\u93A2\u93D8\u93E4\u943A\u9477\u9582\u958E\u95A1\u95C8\u95CC\u95D4\u9658\u966C\u970F\u973D\u9744\u975B\u9766\u97A3\u97A6\u97C1\u97C6\u980A\u9837\u9853\u9870\u98AF\u98B3\u98BA\u98E9\u98ED\u9912\u991B\u991E\u993D\u993F\u99D1\u99DF\u9A01\u9A3E\u9A43\u9A4D\u9ACF\u9AE1\u9B22\u9B58\u9C25\u9C3E\u9C54\u9C56\u9D15\u9D23\u9D89\u9DC2\u9DD3\u9E82\u9E8B\u9EA9\u9EE0\u9EF7\u9F07\u9F2F\u9F34\u9F3E\u9F5F\u9F6C 28 | NGram.KANJI_2_18=\u5155\u520E\u55DF\u56C0\u56C1\u5793\u5FD6\u5FF8\u6029\u60FA\u613E\u6147\u615A\u62C8\u6384\u6883\u6894\u68F9\u6AA3\u6AAE\u6AC2\u6E63\u7032\u70A4\u7146\u71FB\u7228\u72F7\u7370\u7441\u74BF\u75B8\u75E3\u7622\u76CD\u7768\u79E3\u7A60\u7B6E\u7BC1\u7C5F\u7D06\u7E2F\u7E39\u8146\u81CF\u8703\u8729\u8737\u87EF\u88D2\u8A22\u8AC4\u8AF6\u8E59\u8F33\u8F42\u9169\u91B1\u9278\u93C3\u93DD\u9460\u946A\u9785\u9AD1\u9B4D\u9B4E\u9C31\u9D12\u9ECC 29 | NGram.KANJI_2_21=\u502A\u544E\u59AE\u59EC\u5D1B\u66A8\u6BD7\u6C76\u6E1D\u70EF\u742A\u7459\u7FE1\u82EF\u8343\u85C9\u8A79\u90DD 30 | NGram.KANJI_2_22=\u4EDE\u4F7B\u504C\u50EE\u52E3\u52F0\u536E\u54A9\u54BB\u54BF\u54C2\u54E6\u550F\u556A\u55E8\u564E\u5664\u5671\u568F\u56DD\u572F\u57A0\u5809\u5924\u59A3\u59A4\u59E3\u5A13\u5A23\u5B51\u5B73\u5C50\u5C8C\u6035\u60C6\u6106\u6215\u62CE\u62FD\u64ED\u6549\u6554\u655D\u659B\u65CE\u65D6\u6615\u6624\u665E\u6677\u669D\u66E9\u6772\u677C\u696B\u6A84\u6AA0\u6BFD\u6C16\u6C86\u6C94\u6CD6\u6D2E\u6D39\u6F78\u6FB6\u705E\u70CA\u7168\u723B\u7256\u7284\u73B3\u740D\u742F\u7498\u74A9\u752D\u75F3\u7634\u768E\u76B4\u76E5\u77A0\u77DC\u781F\u782D\u7AA0\u7BFE\u7FF1\u80AB\u8174\u81EC\u8202\u8222\u8228\u82DC\u8306\u83FD\u8469\u84FF\u859C\u8617\u86B1\u8722\u8C89\u8D67\u8DCE\u8E49\u8E76\u8E87\u8FE2\u8FE4\u8FF8\u9016\u905B\u9174\u982B\u98E7\u9955\u9B32 31 | NGram.KANJI_2_23=\u4F8F\u5055\u524C\u548E\u5583\u594E\u5CB7\u5ED6\u5F5D\u6021\u66B9\u66F0\u6C55\u6C7E\u6C82\u6E2D\u6EC7\u6ED5\u70B3\u71B9\u72C4\u73C0\u7426\u745C\u748B\u7696\u777F\u79A7\u79B9\u7F8C\u8153\u8339\u8386\u8725\u90B5\u9102\u962E\u9716\u97F6 32 | NGram.KANJI_2_28=\u5733\u57D4\u838E\u8FEA 33 | NGram.KANJI_2_29=\u50ED\u5F29\u62EE\u6A9C\u7BC6\u80F1\u8129\u8171\u822B\u8AEB 34 | NGram.KANJI_2_30=\u4EB3\u4F15\u4FB7\u5006\u509A\u50A2\u5102\u5109\u5115\u5137\u5138\u513C\u524B\u524E\u5277\u528A\u52E6\u52FB\u5331\u5436\u5443\u54FD\u5538\u555E\u55C6\u55C7\u5679\u5690\u5695\u56C9\u56D1\u56EA\u588A\u58E2\u5AFB\u5B2A\u5B43\u5B7F\u5BE2\u5C37\u5D27\u5D84\u5D87\u5DD4\u5EC1\u5EDD\u5F12\u5FA0\u60F1\u616B\u61F5\u61F6\u61FE\u62DA\u6371\u6399\u63C0\u6451\u647B\u6493\u64BB\u64BF\u64C4\u64F1\u64F7\u650F\u652C\u665D\u6684\u6688\u66EC\u672E\u68E7\u69A6\u69ED\u69F3\u6A01\u6AAF\u6AE5\u6BA4\u6BAE\u6BAF\u6BC6\u6C08\u6C2C\u6C59\u6D87\u6EBC\u6ECC\u6EF7\u6F6F\u6F80\u6F86\u6FD8\u6FF0\u6FFA\u7006\u7018\u7030\u7051\u7192\u71C9\u71D9\u71F4\u71FE\u7274\u7377\u74A3\u750C\u7613\u7627\u7661\u7662\u7665\u766E\u7671\u7672\u76BA\u775E\u776A\u778C\u78E7\u7955\u7A08\u7AC5\u7B4D\u7C2B\u7C6C\u7CF0\u7D02\u7D1C\u7D73\u7DA2\u7DB5\u7DDE\u7E09\u7E0A\u7E37\u7E43\u7E61\u7E7D\u7E93\u7F3D\u7FF9\u81A9\u8271\u83F8\u84C0\u8514\u85BA\u86A9\u86FB\u879E\u8814\u8836\u889E\u8932\u896A\u896F\u8993\u89B2\u8A15\u8A16\u8A1D\u8A5B\u8A6C\u8A6D\u8A7C\u8AA1\u8AA3\u8AA5\u8B0A\u8B4F\u8B59\u8B96\u8C48\u8C54\u8CBD\u8CFA\u8D13\u8E89\u8E8B\u8EAA\u8EC0\u8EDB\u8EFC\u8F12\u8F1F\u8F3E\u8F45\u8FFA\u9015\u9183\u919E\u91A3\u91D7\u91F5\u9209\u9215\u923E\u9240\u9251\u9257\u927B\u9293\u92A8\u92C5\u92C7\u92F0\u9333\u935A\u9382\u938A\u9398\u93B3\u93D7\u93DF\u93E2\u93FD\u942B\u942E\u9433\u9463\u9470\u9472\u947E\u95D0\u96CB\u97C3\u97CC\u981C\u9839\u986B\u98B6\u98EA\u9909\u991A\u9935\u993E\u9951\u99A5\u99B1\u99D9\u99DD\u99F1\u9A2B\u9A62\u9A65\u9AAF\u9AD2\u9AEF\u9B0D\u9B28\u9B77\u9BFD\u9C49\u9C5F\u9C78\u9D3F\u9D72\u9DD7\u9E1B\u9EB4\u9EF4\u9F66\u9F94 35 | NGram.KANJI_2_31=\u5DBD\u63C6\u6E3E\u7587\u8AF1\u8B5A\u9695 36 | NGram.KANJI_2_32=\u53A5\u589F\u5CD9\u7109\u7F79\u8006\u8654\u8944\u968B\u96CD 37 | NGram.KANJI_2_35=\u4F47\u4F91\u4FCE\u4FDF\u527D\u535E\u55DA\u56A5\u5879\u5A11\u5B7A\u5CAB\u5CF4\u5EBE\u5F7F\u5FA8\u601B\u606B\u60B8\u610D\u6134\u619A\u61FA\u6369\u6523\u65CC\u66C4\u6727\u6968\u6A05\u6A48\u6B59\u6BEC\u6D35\u6D38\u6E19\u701F\u7064\u711C\u716C\u71A8\u71E7\u7258\u743A\u746F\u75BD\u75D9\u75F2\u7669\u766C\u76DE\u7729\u77BC\u78EC\u792A\u7A37\u7A62\u7BE6\u7C2A\u7C50\u7D07\u7DD8\u7E5A\u7F8B\u7FD5\u7FF3\u8151\u81CD\u8317\u83F4\u85EA\u85FA\u8823\u895E\u89F4\u8A0C\u8A41\u8AA8\u8ACD\u8B10\u8CC1\u8D05\u8D73\u8E4A\u8E85\u8E91\u8EFB\u8F13\u9087\u914A\u91C9\u923F\u93B0\u9403\u95A8\u95AD\u9730\u9865\u9903\u9945\u9949\u99AD\u99E2\u9A6A\u9D26\u9E1E\u9EDD\u9F2C\u9F72 38 | NGram.KANJI_2_36=\u4E9E\u4F86\u5011\u50B3\u5152\u5169\u5340\u5718\u5B78\u5BE6\u5BF6\u5C07\u5EE3\u61C9\u6230\u6703\u689D\u6A02\u6C23\u7063\u7368\u756B\u7576\u767C\u7A31\u7D93\u7E23\u7E3D\u81FA\u8207\u842C\u85DD\u865F\u8B49\u8B80\u8CFD\u908A\u9435\u95DC\u965D\u9AD4\u9EE8 39 | NGram.KANJI_2_37=\u5480\u5580\u5C39\u67EF\u68B5\u6D85\u8521\u90B1 40 | NGram.KANJI_2_38=\u4E1F\u4F96\u4FE0\u50F1\u5118\u522A\u5291\u52C1\u52DB\u52F3\u52F5\u52F8\u53B2\u55CE\u562F\u580A\u5862\u58AE\u58D8\u58DF\u58E9\u58EF\u5925\u593E\u599D\u5ABD\u5C62\u5EC2\u5EDA\u5EE2\u5F4E\u5F65\u6085\u6158\u61FC\u6200\u62CB\u633E\u6416\u6436\u6490\u64CB\u64E0\u64FA\u6514\u651C\u6524\u6558\u6583\u66B1\u66C6\u66C9\u66E0\u6A11\u6A1E\u6A38\u6A62\u6AB3\u6B16\u6B98\u6BBC\u6C2B\u6DDA\u6DE8\u6DEA\u6DFA\u6EEF\u6EFE\u6F32\u6F51\u6F5B\u700F\u71D2\u7210\u7246\u7260\u72A7\u72F9\u7375\u7378\u758A\u760B\u76DC\u76EA\u77DA\u77FD\u78DA\u7919\u797F\u79AA\u7A05\u7A4C\u7ACA\u7C72\u7D81\u7DDD\u7E31\u7E69\u7E6B\u7E73\u7E96\u7E9C\u81BD\u81C9\u81DF\u8259\u8277\u8396\u83A7\u8523\u8525\u860A\u863F\u8667\u87A2\u87F2\u881F\u883B\u89F8\u8B20\u8B74\u8B9A\u8C4E\u8C6C\u8C93\u8CEC\u8D0A\u8D0F\u8D95\u8E10\u8F4E\u8FAF\u8FF4\u905E\u9072\u9081\u908F\u91AC\u91C0\u91C1\u91D0\u921E\u9223\u9245\u929C\u92B3\u92C1\u9336\u934A\u93C8\u9444\u9452\u947C\u947F\u9592\u95B1\u95C6\u95D6\u95E1\u95E2\u96DE\u9742\u978F\u984F\u9871\u98B1\u98C4\u99ED\u9A37\u9A45\u9A5F\u9AEE\u9B27\u9BCA\u9C77\u9D51\u9D5D\u9E79\u9E7C\u9E7D\u9EB5\u9EBC\u9F61\u9F63\u9F90\u9F9C 41 | NGram.KANJI_3_1=\u5283\u7562\u7DEC\u88E1\u8F2F 42 | NGram.KANJI_3_2=\u5009\u502B\u5049\u5075\u507D\u5091\u5098\u50B5\u50B7\u50BE\u5100\u5104\u511F\u518A\u525B\u5289\u5442\u5805\u589C\u58C7\u5922\u596A\u5A66\u5B6B\u5BE7\u5BE9\u5DBA\u5E63\u5E7E\u5FB9\u6163\u616E\u6176\u61B2\u61B6\u61F8\u639B\u63DA\u63EE\u640D\u64B2\u64C1\u64EC\u6557\u6575\u6607\u66AB\u68C4\u6A39\u6C96\u6CC1\u6E1B\u6E6F\u6E9D\u6EC5\u6F01\u6F64\u6FC3\u7058\u707D\u7344\u7642\u76E4\u7832\u790E\u7B46\u7D05\u7D0B\u7D14\u7D19\u7D1B\u7D39\u7D61\u7DB1\u7DCA\u7DD2\u7DE0\u7DE9\u7DEF\u7DF4\u7E2E\u7E3E\u8105\u8108\u81E8\u8266\u84CB\u84EE\u85A9\u885D\u88DC\u8972\u8A02\u8A0E\u8A13\u8A17\u8A2A\u8A34\u8A3A\u8A3C\u8A69\u8A73\u8A95\u8AA0\u8AA4\u8AB2\u8AC7\u8ACB\u8B00\u8B1B\u8B1D\u8B5C\u8C9D\u8C9E\u8CA2\u8CA8\u8CA9\u8CAB\u8CAC\u8CB7\u8CBF\u8CC0\u8CDE\u8CE2\u8CFC\u8D08\u8DE1\u8E8D\u8ECC\u8EDF\u8EF8\u8F14\u8F1D\u8F2A\u8F44\u9055\u9069\u9077\u907C\u90F5\u91DD\u9285\u92FC\u9326\u932F\u9375\u9396\u93AE\u93E1\u9451\u9589\u95A3\u9663\u9670\u9673\u96BB\u9801\u9802\u9803\u9806\u9808\u9810\u983B\u984D\u9858\u9867\u98EF\u98F2\u98FE\u990A\u99D0\u9A0E\u9A5A\u9B5A\u9CE5\u9DB4\u9E97\u9F8D 43 | NGram.KANJI_3_3=\u543E\u5BEE\u5F18\u6590\u725F\u83C5\u85E9\u9E93 44 | NGram.KANJI_3_4=\u5016\u53AD\u5606\u5629\u58BE\u5F14\u6065\u6144\u646F\u647A\u67F5\u6953\u6C3E\u6F2C\u6F97\u6FB1\u7169\u71E6\u71ED\u74BD\u79BF\u7A1C\u7A4E\u7AAF\u7CDE\u7D17\u7D43\u7E55\u7FA8\u807E\u8139\u8490\u8569\u856A\u87FB\u8A23\u8AB9\u8AE6\u8AFA\u8B2C\u8CD1\u91D8\u92F8\u9318\u96DB\u99B4\u9BC9\u9C2D\u9CF6\u9D61\u9DFA 45 | NGram.KANJI_3_5=\u4E26\u4F75\u4FC2\u500B\u5074\u5099\u512A\u5225\u5247\u5275\u5287\u52D5\u52D9\u52DD\u52E2\u5354\u54E1\u554F\u5712\u57F7\u5831\u5834\u5BAE\u5C0E\u5C64\u5CA1\u5CF6\u5E2B\u5E79\u5EAB\u5F35\u5F37\u5F8C\u5FA9\u611B\u614B\u63A1\u63DB\u6642\u66F8\u6771\u696D\u6975\u69CB\u6A19\u6A4B\u6A5F\u6BBA\u6C7A\u6E2C\u6E96\u6F22\u70BA\u7121\u71B1\u7372\u73FE\u74B0\u7570\u76E3\u78BA\u7A2E\u7A4D\u7AF6\u7BC0\u7BC4\u7BC9\u7C21\u7D00\u7D04\u7D0D\u7D1A\u7D30\u7D42\u7D44\u7D50\u7D66\u7D71\u7DAD\u7DDA\u7DE8\u7E54\u7F85\u7FA9\u7FD2\u8056\u805E\u8077\u8208\u83EF\u8449\u8853\u885B\u88FD\u8907\u898B\u898F\u8996\u89AA\u8A08\u8A18\u8A2D\u8A31\u8A55\u8A5E\u8A66\u8A71\u8A72\u8A8C\u8A8D\u8A9E\u8ABF\u8AD6\u8AF8\u8B58\u8B70\u8B77\u8CA0\u8CA1\u8CB4\u8CBB\u8CC7\u8CEA\u8ECA\u8ECD\u8F03\u8F09\u8F38\u8FB2\u9023\u9031\u9032\u904A\u904B\u904E\u9054\u9060\u9078\u907A\u9084\u9280\u9577\u9580\u958B\u9593\u9678\u967D\u968A\u968E\u969B\u96E2\u96E3\u96F2\u96FB\u97D3\u97FF\u9805\u9818\u982D\u984C\u985E\u98A8\u98DB\u9928\u99AC\u9BAE 46 | NGram.KANJI_3_8=\u5F6B\u6C4E\u7B87\u8A70 47 | NGram.KANJI_3_9=\u540B\u5B5C\u826E 48 | NGram.KANJI_3_11=\u4F83\u4FF8\u51CB\u52BE\u53F1\u548B\u558B\u5CB1\u5D69\u5F3C\u620E\u621F\u64E2\u67DA\u6854\u69CC\u6A35\u6C8C\u6E1A\u6F15\u6FE0\u717D\u7252\u7AFA\u82D3\u83DF\u8431\u9041\u9149\u9798 49 | NGram.KANJI_3_12=\u4ED5\u55E3\u572D\u57A3\u587E\u5983\u5A9B\u5C90\u5E61\u672D\u6960\u6F5F\u72D9\u72E9\u757F\u7949\u7950\u7E82\u7FCC\u82B8\u90B8\u91DC\u961C\u9B45 50 | NGram.KANJI_3_13=\u55AB\u6249\u643E\u6841\u68B1\u725D\u7B8B\u7C95\u7E1E\u7F36\u8A03\u8A6B\u8E74\u95A4 51 | NGram.KANJI_3_15=\u50AD\u50D1\u5132\u51F1\u55AC\u5617\u5687\u584A\u59EA\u5B30\u5BF5\u5C0B\u5C4D\u5EDF\u6182\u61A4\u64AB\u64FE\u66A2\u6897\u694A\u69CD\u6B3D\u6BC0\u6D29\u6F38\u7015\u7149\u71C8\u723A\u7336\u7345\u755D\u76C3\u78A9\u798D\u7AAE\u7DFB\u7E2B\u7F75\u7F77\u81E5\u834A\u852D\u85CD\u8755\u8A3B\u8A54\u8AE7\u8B02\u8B39\u8CAA\u8CE6\u8DA8\u8E5F\u8F5F\u905C\u912D\u919C\u92D2\u932B\u937E\u9418\u9583\u9812\u985B\u9905\u99B3\u99C1\u99D5\u9A30\u9CF3\u9D3B\u9D6C 52 | NGram.KANJI_3_16=\u6D6C\u72FD\u77A5\u8956\u9C0D 53 | NGram.KANJI_3_18=\u5919\u5F4A\u6063\u63AC\u649A\u6715\u6AD3\u71D0\u758B\u834F\u85F7\u88DF\u8F61\u93D1\u98F4\u9D60 54 | NGram.KANJI_3_19=\u4F50\u7DB2\u962A 55 | NGram.KANJI_3_22=\u5E96\u75D4\u91C6 56 | NGram.KANJI_3_23=\u5E9A\u6C40\u821C\u839E\u8FED\u9EDB 57 | NGram.KANJI_3_27=\u5F01\u66DC 58 | NGram.KANJI_3_29=\u5023\u5208\u531D\u536F\u53E9\u54C9\u598A\u59BE\u5A20\u5D6F\u5DF3\u66C7\u66D6\u66F3\u6775\u6A3D\u6ADB\u6B86\u6C72\u6E25\u73EA\u7435\u760D\u7656\u7825\u78D0\u7A14\u7A6B\u7B20\u7BE0\u7CF8\u7DAC\u7DBB\u7DBE\u80E4\u80F4\u837B\u8466\u8568\u867B\u8A63\u91E7\u9320\u935B\u9591\u965B\u98E2\u990C\u9913\u9BAB 59 | NGram.KANJI_3_30=\u60B6\u8AD2\u8CC2\u9237\u9328\u934D\u9397\u9830 60 | NGram.KANJI_3_31=\u4FB6\u50D5\u51CD\u559A\u55AA\u5674\u5857\u585A\u5875\u58B3\u596E\u59E6\u5A41\u5D50\u5E25\u5E33\u5F59\u61C7\u61F2\u6368\u6383\u65AC\u68DF\u68F2\u6A3A\u6B04\u6DBC\u6DF5\u6E26\u6E4A\u6E67\u6F54\u6F70\u6FC1\u6FEB\u7159\u727D\u7652\u77EF\u78EF\u798E\u7A40\u7AAA\u7BE4\u7C60\u7CE7\u7CFE\u7D21\u7D33\u7D5E\u7D79\u7DB4\u7DBF\u7E1B\u7E8F\u7F70\u814E\u816B\u8178\u819A\u84BC\u85A6\u865C\u8766\u8A1F\u8A50\u8A60\u8A6E\u8A87\u8A98\u8AB0\u8ADC\u8AED\u8AEE\u8B0E\u8B19\u8CA7\u8CAF\u8CB8\u8CBC\u8CC3\u8CC4\u8CCA\u8CDC\u8CE0\u8CED\u8ED2\u8F29\u8F3F\u91E3\u920D\u9234\u925B\u9298\u9310\u934B\u958F\u95A5\u9727\u97FB\u9811\u984E\u98FC\u98FD\u99D2\u99FF\u9B31\u9BE8\u9C57\u9CE9\u9CF4\u9D28\u9DF9 61 | NGram.KANJI_3_32=\u4E1E\u502D\u51A5\u5321\u58EC\u5A3C\u5BC5\u5CE8\u61A9\u620A\u65A1\u6714\u6853\u6893\u6C50\u6C5D\u7436\u745A\u745B\u773A\u7941\u7947\u8543\u865E\u8C5A\u914B\u99A8\u9AB8 62 | NGram.KANJI_3_35=\u4E99\u5BA5\u5DFD\u608C\u60C7\u60DA\u6190\u61A7\u6753\u6777\u6787\u6B4E\u6F23\u6FE1\u6FEF\u7337\u7827\u786F\u7893\u7ABA\u7B94\u7BB8\u7C3E\u7D62\u7E6D\u80B1\u81BF\u81C6\u821B\u82E7\u83F0\u84D1\u86ED\u8888\u8B01\u8B04\u8F4D\u9291\u92E4\u932E\u9354\u936C\u939A\u9957\u9AED\u9BAA\u9BAD\u9BD6\u9BDB\u9C3B\u9D1B 63 | NGram.KANJI_3_36=\u50C5\u53E2\u5EE0\u65BC\u70CF\u723E\u7D10\u7D9C\u806F\u8607\u862D\u8A0A\u8AFE\u8CD3\u9019\u9813\u9B6F 64 | NGram.KANJI_3_37=\u4EA8\u4F3D\u5384\u5EFF\u60DF\u66DD\u6E5B\u8087\u82D1\u8FE6\u9640\u9E9F 65 | NGram.KANJI_3_38=\u5147\u525D\u5678\u617E\u6372\u79A6\u8ABC\u92EA\u9438\u9817 66 | NGram.KANJI_4_0=\u6D3C\u718F\u74EE\u8712 67 | NGram.KANJI_4_9=\u4F84\u54C6\u5565\u68F1\u6D82\u83C7 68 | NGram.KANJI_4_10=\u4FE9\u4FED\u51FF\u523D\u5300\u5364\u538C\u5450\u5455\u545C\u54D1\u54D7\u5578\u56A3\u58F6\u592F\u5CE6\u5D2D\u5E90\u6073\u607C\u60EB\u61D2\u62E2\u62E3\u631A\u6320\u6323\u6361\u63B7\u63B8\u63BA\u6405\u65A9\u65F7\u6619\u6655\u67A3\u67E0\u6805\u6808\u6866\u6868\u6869\u6A71\u6BE1\u6C79\u6CA5\u6CDE\u6DA4\u6DA7\u6DA9\u6E85\u70DB\u70E6\u70EB\u7115\u724D\u7410\u759F\u75AE\u75EA\u75F9\u762B\u763E\u76B1\u77EB\u783E\u79C3\u7A8D\u7A9C\u7B5D\u7BF1\u7EC5\u7ED2\u7EDE\u7EE3\u7EF7\u7EF8\u7EFD\u7F00\u7F0E\u7F15\u7F1A\u7F20\u7F24\u7F28\u7FA1\u7FD8\u8038\u803B\u804B\u80AE\u817B\u82C7\u8327\u835E\u8367\u83BA\u8424\u864F\u8681\u8682\u8715\u8717\u8721\u8747\u874E\u8845\u886C\u889C\u88E4\u89C5\u8BB6\u8BB9\u8BC0\u8BC5\u8BE1\u8BEB\u8BEC\u8BF5\u8C0E\u8C1A\u8D2E\u8D31\u8D43\u8D4E\u8D58\u8F67\u8F7F\u9489\u9499\u949D\u94A0\u94A5\u94AE\u94BE\u94D0\u94DB\u94F2\u9508\u950C\u951A\u9525\u952D\u952F\u9530\u953B\u9540\u9550\u9570\u9576\u95F0\u960E\u9668\u96CF\u97E7\u9885\u988A\u98A4\u9965\u9975\u997A\u997F\u9985\u998D\u998F\u9A6E\u9A6F\u9A74\u9A79\u9A7C\u9A82\u9A87\u9CA4\u9CC4\u9CCD\u9CD6\u9E20\u9E25\u9E35\u9E3D\u9E45\u9E49\u9E4A\u9E66 69 | NGram.KANJI_4_16=\u576F\u579B\u6345\u78B4\u79EB\u79F8 70 | NGram.KANJI_4_17=\u4E13\u4E1A\u4E1C\u4E24\u4E25\u4E2A\u4E3E\u4E49\u4E50\u4E66\u4E9A\u4EA7\u4EBF\u4ECE\u4EEC\u4EF7\u4F17\u4F20\u5170\u5173\u519B\u51B3\u51E4\u51FB\u5219\u521B\u522B\u529E\u52A1\u52A8\u52BF\u534F\u5355\u536B\u5386\u53BF\u53D1\u53D8\u542F\u5458\u54CD\u56E2\u56ED\u56F4\u56FE\u573A\u5904\u590D\u5934\u5B81\u5B9E\u5BF9\u5BFC\u5C14\u5C9B\u5E26\u5E7F\u5E94\u5F00\u5F20\u5F3A\u603B\u6218\u65E0\u65F6\u663E\u672F\u6743\u6784\u6807\u6C14\u6C49\u707E\u70ED\u73AF\u73B0\u7535\u76D1\u786E\u79CD\u79EF\u7B80\u7C7B\u7EA2\u7EA6\u7EA7\u7EAA\u7EBF\u7EC4\u7EC7\u7ED3\u7EDF\u7EE7\u7EED\u7EF4\u7F16\u7F57\u804C\u8054\u817E\u8282\u82CF\u83B7\u8425\u89C1\u89C2\u89C4\u89C6\u8BA1\u8BA4\u8BAE\u8BAF\u8BB0\u8BB8\u8BBA\u8BBE\u8BC1\u8BC4\u8BD1\u8BDD\u8BE5\u8BED\u8BF4\u8C03\u8D22\u8D23\u8D28\u8D39\u8D44\u8D5B\u8F66\u8F6C\u8F83\u8FBE\u8FC7\u8FD0\u8FD8\u8FD9\u8FDB\u8FDE\u9009\u94C1\u957F\u95E8\u95EE\u95F4\u95FB\u961F\u9633\u9645\u9646\u96BE\u9879\u9884\u9886\u9898\u98CE\u9A6C\u9F99 71 | NGram.KANJI_4_18=\u51DB\u67B7 72 | NGram.KANJI_4_22=\u4FA5\u545B\u5499\u5520\u5570\u56F1\u5A76\u5C96\u60AF\u60ED\u618B\u61A8\u62A0\u62A1\u62E7\u6363\u6390\u63B0\u6400\u6402\u6512\u6748\u70C1\u732C\u765E\u7663\u76CF\u7741\u781A\u7980\u79C6\u79FD\u7AA5\u7B0B\u7B8D\u7BA9\u7BAB\u7BD3\u7CAA\u7EAB\u7ECA\u7EE2\u7F2D\u7F30\u8110\u8113\u81CA\u835A\u8360\u84D6\u852B\u87E5\u8869\u8A8A\u8BA5\u8BF2\u8C05\u8C12\u8D30\u8D4A\u8D61\u8DF7\u8E6D\u8E8F\u8F95\u8F99\u8FAB\u94B3\u94C6\u94E3\u9504\u954A\u9563\u95FA\u9893\u9981\u9992\u9AA1\u9CAB\u9E2F\u9E33\u9EB8 73 | NGram.KANJI_4_24=\u4E22\u4E8F\u4F1E\u4FA3\u5151\u517D\u51BB\u51D1\u5220\u529D\u52CB\u5367\u5389\u5395\u53E0\u53F9\u5413\u548F\u5524\u575E\u575F\u5784\u5792\u57A6\u57AB\u58F3\u5986\u5988\u5A04\u5A07\u5BA0\u5C18\u5C82\u5DE9\u5E10\u5E1C\u5F2F\u60E9\u6124\u629B\u6321\u6324\u635E\u63FD\u6401\u644A\u6491\u655B\u658B\u6635\u67AB\u67DC\u680B\u692D\u6984\u6A31\u6B7C\u6BD9\u6C22\u6CA6\u6CA7\u6CEA\u6CFB\u6CFC\u6D46\u6D47\u6D4A\u6D51\u6DA1\u6E0A\u6E83\u6EE4\u6EE5\u6F9C\u6FD2\u70C2\u7237\u727A\u730E\u7574\u75AF\u7792\u7816\u7845\u78B1\u7A77\u7A91\u7A9D\u7AD6\u7B3C\u7B5B\u7CAE\u7EA4\u7EB1\u7EBA\u7ECE\u7ED1\u7EF0\u7EF3\u7F14\u7F1D\u7F34\u7F62\u8042\u806A\u80A0\u80A4\u80BE\u80BF\u80C0\u810F\u8138\u8231\u8270\u829C\u82CD\u8350\u83B9\u841D\u8574\u8680\u8BB3\u8BBC\u8BBD\u8BC8\u8BF1\u8BFD\u8C0A\u8C0D\u8C1C\u8C24\u8C26\u8C2C\u8C2D\u8C34\u8D1E\u8D2C\u8D3C\u8D41\u8D42\u8D4C\u8D50\u8D5A\u8F69\u8F88\u8F90\u8FA9\u915D\u9171\u9493\u949E\u94A7\u94A9\u94BB\u94C3\u94C5\u94DD\u94F8\u9505\u9510\u9523\u9524\u95EF\u95F7\u95F9\u9600\u9610\u96F3\u97F5\u987D\u9882\u9888\u9896\u98D8\u9971\u9972\u9976\u997C\u9A84\u9A86\u9A8F\u9A97\u9A9A\u9AA4\u9CB8\u9CDE\u9E26\u9E43\u9E64\u9E70\u9F7F\u9F9F 74 | NGram.KANJI_4_28=\u534E\u62A5\u7ECF\u7F51 75 | NGram.KANJI_4_34=\u4E34\u4E3D\u4E4C\u4E54\u4E60\u4E61\u4E70\u4EB2\u4EC5\u4EEA\u4F18\u4F1F\u4F24\u4F26\u4FA7\u50A8\u513F\u5174\u517B\u518C\u519C\u51B5\u51CF\u5218\u521A\u5267\u52B3\u5356\u5382\u5385\u538B\u53A6\u5434\u5706\u5723\u5757\u575A\u575B\u575D\u5907\u591F\u593A\u5956\u5B59\u5BA1\u5BAB\u5BBD\u5BBE\u5BFB\u5C42\u5C81\u5E01\u5E08\u5E86\u5E93\u5F02\u5F39\u5F52\u5F55\u5F7B\u6000\u6001\u6076\u620F\u6237\u6267\u6269\u626C\u62A2\u62A4\u62DF\u62E5\u62E9\u6325\u635F\u6362\u6444\u6653\u6682\u6740\u6742\u6768\u6781\u6811\u6837\u6865\u68C0\u6B22\u6BC1\u6BD5\u6C47\u6C9F\u6CAA\u6CFD\u6D4B\u6DA8\u6E10\u6EE1\u6EE8\u706D\u7075\u70DF\u7231\u739B\u7597\u76D6\u76D8\u77FF\u7801\u7840\u79BB\u7A33\u7ADE\u7B14\u7B7E\u7CA4\u7D27\u7EB3\u7EBD\u7EC3\u7EC6\u7EC8\u7ECD\u7ED5\u7ED9\u7EDC\u7EDD\u7EE9\u7EFC\u7EFF\u7F13\u7F29\u8083\u80DC\u8111\u814A\u8230\u827A\u8363\u836F\u8428\u84DD\u867D\u8865\u88AD\u89C8\u8BA2\u8BA8\u8BA9\u8BAD\u8BB2\u8BBF\u8BC6\u8BCD\u8BD5\u8BEF\u8BF7\u8BF8\u8BFA\u8BFB\u8C08\u8D1D\u8D1F\u8D21\u8D25\u8D27\u8D2D\u8D2F\u8D35\u8D38\u8DC3\u8F6E\u8F6F\u8F7B\u8F7D\u8F86\u8F91\u8F93\u8F96\u8FB9\u8FBD\u8FC1\u8FDC\u8FDD\u9002\u9057\u90BB\u90D1\u91CA\u9488\u949F\u94A2\u94B1\u94F6\u9500\u9526\u9547\u9614\u9634\u9635\u9636\u9648\u9655\u9669\u9690\u97E9\u9875\u9876\u987A\u987B\u987E\u987F\u9891\u989D\u98DE\u9986\u9A7B\u9A8C\u9C81\u9C9C\u9F50 76 | NGram.KANJI_4_39=\u4E1B\u4E1D\u4E27\u4EA9\u4ED1\u4ED3\u4F2A\u4FA6\u4FA8\u503A\u503E\u507F\u5188\u51AF\u51C0\u51C9\u51ED\u51EF\u5242\u5251\u52B2\u5362\u53A2\u5415\u5417\u5428\u55B7\u5760\u5899\u5939\u594B\u5987\u5A31\u5A74\u5BAA\u5C1D\u5C7F\u5C97\u5CAD\u5E05\u5E2E\u5E99\u5E9E\u5E9F\u5F03\u5FC6\u5FE7\u60AC\u60CA\u60EF\u626B\u6270\u629A\u62E6\u62E8\u6446\u6447\u654C\u67AA\u680F\u6863\u68A6\u6C64\u6D01\u6D53\u6D9D\u6DA6\u6E14\u6E17\u6EDA\u6EE9\u707F\u70BC\u70E7\u7275\u72B9\u72EE\u72F1\u743C\u7545\u76D0\u7855\u7978\u7B79\u7BEE\u7EA0\u7EAC\u7EAF\u7EB2\u7EB5\u7EB7\u7EB8\u7EB9\u7ED8\u7EEA\u7EF5\u7F05\u7F06\u7F18\u7F5A\u80C1\u80F6\u8109\u8206\u8273\u82F9\u8346\u8361\u83B2\u8427\u8651\u867E\u8854\u89C9\u8BC9\u8BCA\u8BD7\u8BDA\u8BDE\u8BE2\u8BE6\u8BFE\u8C01\u8C0B\u8C10\u8C13\u8C22\u8C23\u8C28\u8C31\u8D24\u8D26\u8D29\u8D2A\u8D2B\u8D34\u8D37\u8D3A\u8D3E\u8D3F\u8D4B\u8D4F\u8D54\u8D56\u8D5E\u8D60\u8D62\u8D75\u8D76\u8D8B\u8F68\u8F70\u8F74\u8F85\u8F89\u8FC8\u8FDF\u900A\u9012\u903B\u9093\u90AE\u917F\u9274\u94A6\u94DC\u94ED\u94FA\u94FE\u9501\u950B\u9519\u9521\u952E\u955C\u95EA\u95ED\u95F2\u95F8\u95FD\u9601\u9605\u9647\u96B6\u96FE\u9877\u9881\u9887\u9897\u989C\u98A0\u996D\u996E\u9970\u9A70\u9A71\u9A73\u9A76\u9A7E\u9A91\u9C7C\u9E1F\u9E21\u9E23\u9E2D\u9E3F\u9E4F\u9F84 77 | NGram.KANJI_5_10=\u5239\u8EAF 78 | NGram.KANJI_5_11=\u51C4\u8471 79 | NGram.KANJI_5_12=\u6DC0\u7C98 80 | NGram.KANJI_5_13=\u5631\u5815\u8695 81 | NGram.KANJI_5_14=\u4E71\u4FA0\u5265\u52B1\u5374\u53A8\u53D9\u58EE\u5BDD\u5BFF\u5C3D\u5C4A\u5CE1\u5F25\u5F84\u604B\u60A6\u60E7\u60E8\u631F\u636E\u643A\u663C\u664B\u67A2\u6816\u697C\u6B8B\u6BB4\u6D45\u6E7F\u6EDE\u6F5C\u706F\u7089\u72ED\u732A\u732B\u76D7\u793C\u7977\u7A0E\u7A83\u80C6\u811A\u8131\u82A6\u830E\u848B\u865A\u866B\u86EE\u89E6\u8A89\u8DF5\u8E0A\u8E2A\u8F9E\u9065\u968F\u9759\u9EA6 82 | NGram.KANJI_5_18=\u601C\u75D2 83 | NGram.KANJI_5_26=\u4E07\u4E0E\u4E89\u4F1A\u4F53\u515A\u5185\u5199\u533A\u533B\u53C2\u53CC\u53F7\u58F0\u5965\u5B66\u5B9D\u5C06\u5C5E\u5F53\u62C5\u6570\u65AD\u65E7\u6761\u6765\u6A2A\u6B27\u6CA1\u6E29\u6E7E\u70B9\u72B6\u72EC\u732E\u753B\u79F0\u88C5\u9EC4 84 | NGram.KANJI_5_29=\u693F\u82EB 85 | NGram.KANJI_5_34=\u53F6\u6D9B\u83B1 86 | NGram.KANJI_5_39=\u5C61\u788D 87 | NGram.KANJI_6_0=\u4E10\u4E52\u4EC6\u4F88\u4FD0\u51F3\u533E\u53ED\u53EE\u5406\u541D\u5429\u5435\u5440\u5490\u5495\u54B1\u54C4\u54FC\u557C\u55D3\u5669\u56E4\u5777\u5992\u59E8\u5B7D\u5BDE\u5BE5\u5C79\u5C94\u5DCD\u5E18\u5E1A\u5E54\u5FF1\u604D\u6064\u60F6\u6127\u6177\u6233\u6252\u625B\u6273\u6296\u62C2\u62C7\u62F4\u638F\u6396\u63E3\u63EA\u6413\u6479\u64A9\u64C2\u659F\u667E\u6760\u6845\u6963\u6A90\u6B83\u6C13\u6C5E\u6D8E\u6D95\u6DCC\u6ED4\u6F13\u6F3E\u6FA1\u7076\u70D8\u710A\u71CE\u7239\u72E1\u73B7\u7599\u759A\u75A4\u75CA\u7629\u7682\u76C5\u76EF\u778E\u77AA\u787C\u7889\u788C\u78BE\u79E7\u7A96\u7A98\u7B77\u7C7D\u7CB1\u7D0A\u7D6E\u7F94\u7FCE\u8116\u814B\u814C\u819B\u828D\u82DF\u8301\u83E0\u85D5\u8611\u86A3\u8708\u8822\u8C4C\u8DB4\u8DEA\u8E42\u8E66\u8E72\u8EBA\u901B\u9157\u970E\u97ED 88 | NGram.KANJI_6_3=\u62FC\u88D4\u9B4F 89 | NGram.KANJI_6_9=\u4ED7\u4F63\u4FCF\u5018\u50BB\u50F5\u5154\u5201\u522E\u5254\u527F\u5306\u5462\u5492\u5496\u54A8\u54AA\u554A\u5561\u5564\u5566\u5885\u5938\u5AC2\u5AE9\u5CED\u5F64\u6084\u608D\u60A8\u60D5\u61C2\u61C8\u6254\u626F\u62AC\u6346\u634D\u640F\u6454\u6487\u6495\u64D2\u6746\u6789\u68B3\u68F5\u695E\u6986\u6995\u69A8\u6A44\u6AAC\u6B79\u6C28\u6C2E\u6CF5\u6DE4\u6E34\u6E3A\u6E89\u6F29\u70AB\u70AC\u7130\u715E\u7184\u71AC\u7238\u7281\u72E0\u74E3\u74F7\u7529\u7578\u761F\u7626\u76D4\u775B\u7779\u7784\u77BB\u780C\u780D\u7838\u7898\u78C5\u78F7\u7AED\u7B28\u7BE1\u7C07\u7CD5\u7CD9\u7CEF\u7F38\u800D\u8084\u809A\u8165\u816E\u832B\u8334\u840D\u8774\u886B\u888D\u88D9\u88F9\u8C41\u8D81\u8D9F\u8E22\u8E29\u8EB2\u8F9C\u9165\u918B\u9631\u964B\u964C\u9661\u9709\u9739\u9776\u9AD3\u9ED4 90 | NGram.KANJI_6_10=\u4E53\u5582\u5600\u6342\u7B06 91 | NGram.KANJI_6_11=\u5288\u543C\u5475\u5486\u54EE\u5598\u56BC\u5962\u5A36\u5A9A\u5B75\u5BA6\u5C38\u5C4E\u5F8A\u5F98\u627C\u62CC\u62D7\u63C9\u6930\u6954\u69D0\u6BEF\u6C90\u6CBD\u6CBE\u6F31\u6F88\u70D9\u7329\u75BC\u75F0\u7737\u77D7\u7B19\u7FB9\u803F\u80D6\u813E\u81C0\u8205\u8309\u83BD\u846B\u8517\u868C\u8759\u8815\u8859\u8B6C\u8E81\u8EAC\u90A2\u9698\u9B44 92 | NGram.KANJI_6_12=\u722C\u7FD4 93 | NGram.KANJI_6_16=\u5228\u5315\u542E\u54CE\u5509\u5527\u5543\u55B3\u55E1\u5636\u568E\u5FFF\u61E6\u6376\u642A\u6726\u74E4\u76F9\u7736\u7BD9\u8019\u80F0\u80F3\u812F\u818A\u8200\u8214\u8638\u869C\u86C0\u86C6\u86D4\u87C6\u88B1\u8902\u8C7A\u8E4B\u9119 94 | NGram.KANJI_6_18=\u67D2\u6ED3\u87C0\u87CB\u8DDB\u901E\u9163 95 | NGram.KANJI_6_20=\u4F5B\u52D2\u54C8\u62FF\u66FC\u6D59\u704C\u7586\u9ECE 96 | NGram.KANJI_6_21=\u4E48\u4EFF\u4F19\u4FF1\u5021\u5077\u5195\u5212\u5269\u5401\u541E\u5427\u54EA\u5587\u558A\u55BB\u566A\u573E\u574E\u5783\u57AE\u584C\u58E4\u5960\u5976\u59CA\u5A1C\u5DE2\u5F99\u600E\u6015\u6263\u626D\u6293\u62C6\u62D6\u62EF\u62F1\u6316\u632A\u6380\u6389\u63D2\u641E\u64C5\u64CE\u65F1\u6664\u6735\u6770\u67EC\u6846\u684C\u68AD\u6B47\u6B49\u6B67\u6C1B\u6C27\u6C2F\u6C5B\u6C89\u6DF9\u6EAF\u70AE\u70E4\u731C\u7334\u73BB\u7470\u76FC\u788E\u789F\u78B0\u78B3\u7A0D\u7A3B\u7A57\u7CB9\u7F69\u8335\u8354\u84BF\u8DCC\u8DD1\u904F\u90A8\u9189\u9677\u9738\u978B 97 | NGram.KANJI_6_22=\u5162\u53E8\u542D\u5501\u552C\u5639\u563F\u56B7\u6043\u60B4\u6194\u61CA\u634E\u63CD\u6414\u64AC\u6DAE\u6E43\u6F66\u7095\u7316\u733E\u7728\u7830\u78D5\u7ABF\u7FE9\u8018\u80EF\u8198\u8693\u86AA\u86AF\u874C\u8783\u879F\u8892\u8E6C 98 | NGram.KANJI_6_23=\u4FD8\u4FEF\u501A\u5085\u5180\u526A\u5323\u54ED\u5634\u56CA\u58A9\u58F9\u5955\u5978\u59DA\u5A49\u5B55\u5BC7\u5BE8\u5D4C\u5E62\u6467\u64BC\u6500\u655E\u6572\u658C\u6670\u68CD\u68D5\u68E0\u6912\u6A0A\u6BB7\u6C9B\u6D3D\u6DC6\u6E23\u6F8E\u7011\u7092\u714C\u73AB\u7405\u7624\u76D2\u7960\u79C9\u7A20\u7BF7\u7F50\u804A\u8086\u81C2\u8292\u82DE\u852C\u857E\u859B\u8760\u8C6B\u8DBE\u8E48\u8F9F\u96A7 99 | NGram.KANJI_6_25=\u4E8E\u5DF2\u5FB7\u7AD9 100 | NGram.KANJI_6_28=\u4E58\u4ECD\u4EFD\u4F30\u4F60\u4F69\u503C\u5047\u51B0\u51F0\u5361\u5377\u53E6\u54E5\u552E\u5708\u5740\u5761\u57C3\u5821\u589E\u5979\u59C6\u5B69\u5B83\u5E15\u5E76\u5F17\u5F88\u6208\u622A\u624E\u627E\u62D4\u62DC\u63ED\u641C\u6536\u6548\u65C1\u665A\u6668\u67E5\u6B65\u6BCF\u6C61\u6CDB\u6D4E\u6D89\u6DB5\u6E38\u6EAA\u6FB3\u70B8\u745F\u7538\u7A97\u7F3A\u7F55\u805A\u8258\u827E\u82AC\u8303\u83F2\u8482\u85CF\u8DDF\u903E\u9080\u970D\u9760\u9ED1\u9ED8 101 | NGram.KANJI_6_29=\u634F\u6518\u7B50\u809B 102 | NGram.KANJI_6_30=\u54A7\u57C2\u5AB3\u60CB\u6886\u8378\u85D0\u8671 103 | NGram.KANJI_6_32=\u5080\u5121\u51A4\u54AC\u55DC\u592D\u5DEB\u6292\u68D8\u69B4\u6A59\u6E24\u7FC5\u80DA\u8180\u86DB\u8700\u8DCB\u9761 104 | NGram.KANJI_6_34=\u4E30\u51E0\u542C\u613F 105 | NGram.KANJI_6_35=\u4E56\u547B\u55FD\u5C41\u606C\u6115\u6CAE\u7119\u795F\u7CDC\u86C9\u86F9\u8713\u873B\u8757\u8925\u892A\u96F9 106 | NGram.KANJI_6_37=\u51B2\u5308\u5398\u54B8\u59DC\u5C4F\u5D14\u5F6D\u60E0\u6241\u6350\u699C\u6BEB\u6C6A\u6CC4\u6DEE\u6F58\u6F6D\u7199\u77EE\u7ADF\u8058\u820D\u8212\u8389\u8587\u884D\u8881\u8FA8\u8FF9\u96D5 107 | NGram.KANJI_6_39=\u574F\u6251\u6302 108 | NGram.KANJI_7_0=\u52FA\u5544\u60F0\u6994\u86A4\u86E4 109 | NGram.KANJI_7_3=\u4E59\u4E7E\u4EAD\u4EF0\u4EF2\u4F0F\u4F10\u4FAF\u4FCA\u500D\u501F\u5076\u508D\u50E7\u5112\u5146\u5192\u51AC\u51DD\u51FD\u5200\u5237\u524A\u52A3\u52C3\u52C7\u52DF\u5351\u5352\u5353\u5378\u537F\u53E5\u5439\u54FA\u574A\u5782\u57CB\u5893\u58C1\u5915\u5937\u5949\u5951\u5974\u59B9\u5A18\u5A5A\u5ACC\u5B54\u5B5D\u5B64\u5B8F\u5BBF\u5BD2\u5C3A\u5C6F\u5CB3\u5D07\u5DE7\u5E84\u5E8A\u5F26\u5F69\u5F70\u5F90\u5FAA\u5FCD\u6012\u6016\u602A\u60A0\u60B2\u60BC\u6148\u6162\u6170\u6291\u6298\u62AB\u62BC\u62BD\u62D2\u62D3\u62D8\u62F3\u6311\u638C\u6398\u63E1\u642C\u6458\u64A4\u654F\u656C\u659C\u65E2\u65E8\u65EC\u6606\u6614\u6676\u6691\u6696\u66F9\u6749\u676F\u679A\u679D\u67CF\u67D4\u67F1\u67F3\u67F4\u6817\u6842\u6843\u6851\u68A8\u68CB\u68D2\u6B20\u6B32\u6BBF\u6C57\u6C88\u6CCA\u6D17\u6D1E\u6D69\u6D6E\u6D78\u6DE1\u6DFB\u6E58\u6EB6\u6F0F\u6F20\u7070\u708E\u70AD\u7126\u718A\u71C3\u7267\u72C2\u731B\u7384\u73A9\u73CD\u7434\u75AB\u75DB\u76C6\u76FE\u773C\u7891\u78C1\u795D\u7965\u79D2\u79DF\u79E6\u7A00\u7B11\u7B51\u7B54\u7C89\u7C92\u7CD6\u7D2B\u7F8A\u7FBD\u7FFC\u8010\u80A5\u80CE\u8150\u8179\u819C\u8247\u829D\u82B3\u82D7\u82E6\u8302\u8336\u8352\u83CA\u83CC\u83DC\u845B\u846C\u84B2\u84B8\u84C4\u8584\u864E\u86C7\u8861\u8863\u8870\u888B\u8896\u88D5\u8986\u8C46\u8DA3\u8E0F\u8F9B\u8FC5\u8FEB\u8FF7\u9003\u9006\u902E\u9042\u9063\u90ED\u963B\u9676\u96EA\u9756\u9B3C\u9B42\u9F3B 110 | NGram.KANJI_7_6=\u4E01\u4E03\u4E45\u4E5D\u4E88\u4E92\u4EA1\u4ECB\u4EE4\u4F01\u4F0A\u4F2F\u4F3C\u4F4E\u4F4F\u4F55\u4F8B\u4F9D\u4FBF\u4FEE\u505C\u50CF\u516B\u516D\u5175\u5177\u5178\u5207\u520A\u5224\u526F\u529F\u52A9\u5343\u5348\u535A\u5370\u53BB\u53CB\u53F3\u5409\u542B\u544A\u547C\u5584\u5747\u5802\u590F\u592B\u5931\u5947\u597D\u5A01\u5A92\u5B63\u5B8C\u5B97\u5BA2\u5BA3\u5BA4\u5BB3\u5BB9\u5BC6\u5BCC\u5BDF\u5C04\u5C1A\u5C45\u5C4B\u5CB8\u5DE6\u5E0C\u5E1D\u5E2D\u5E55\u5E8F\u5E95\u5E97\u5EA7\u5EB7\u5EF6\u5F8B\u5FAE\u5FC5\u5FD7\u5FF5\u601D\u6025\u606F\u60F3\u611F\u623F\u6253\u6279\u627F\u6295\u6297\u62EC\u6388\u6392\u63F4\u6545\u6551\u6574\u6599\u65C5\u65E9\u6613\u6620\u6625\u666E\u666F\u66B4\u66F4\u670D\u671B\u6728\u672B\u6751\u677E\u67B6\u6838\u6839\u6848\u68EE\u690D\u6982\u6A21\u6B4C\u6B62\u6B66\u6BB5\u6BCD\u6C0F\u6C38\u6C42\u6CBF\u6CE2\u6CE8\u6D0B\u6D3E\u6D88\u6DF1\u6E05\u6E56\u706B\u7167\u7206\u7236\u7247\u7387\u7530\u7537\u7559\u7565\u7591\u75C5\u767B\u767D\u767E\u7687\u76DB\u76DF\u771F\u7763\u77ED\u7834\u79FB\u7A81\u7AE0\u7AEF\u7B56\u7B97\u7C4D\u7CBE\u7D20\u7D22\u7F72\u7FA4\u8001\u8003\u81F4\u822A\u826F\u82B1\u8349\u843D\u878D\u8857\u89D2\u8B66\u8C37\u8D70\u8D85\u8D8A\u8DB3\u8FF0\u8FFD\u9001\u901F\u90A3\u90A6\u914D\u91CE\u9632\u963F\u9644\u964D\u9664\u96C4\u96E8\u9752\u9769\u98DF 111 | NGram.KANJI_7_7=\u4E09\u4E0A\u4E0B\u4E0D\u4E16\u4E3B\u4E8B\u4E8C\u4EE3\u4EE5\u4F4D\u4F5C\u4F7F\u5165\u5168\u516C\u5171\u51FA\u5206\u5229\u5236\u524D\u529B\u52A0\u5316\u5317\u5357\u539F\u53CA\u53F0\u5408\u540C\u540D\u548C\u5730\u57FA\u5916\u591A\u5929\u5B50\u5B9A\u5BB6\u5C0F\u5C71\u5DDE\u5DE5\u5E02\u5E73\u5EA6\u5EFA\u5F0F\u6027\u6210\u6240\u6307\u653F\u6587\u65B0\u65B9\u660E\u6700\u6709\u671F\u672C\u6B21\u6B63\u6C11\u6CBB\u6CD5\u6D77\u7269\u7279\u7406\u751F\u7528\u7531\u754C\u76EE\u76F8\u793E\u79D1\u7ACB\u7B2C\u7B49\u7CFB\u8005\u80FD\u81EA\u82F1\u884C\u8868\u897F\u8981\u901A\u9053\u90E8\u90FD\u91CD\u9AD8 112 | NGram.KANJI_7_9=\u4E4D\u4F36\u5319\u6A61\u6DCB\u7194 113 | NGram.KANJI_7_11=\u4E5E\u4F43\u5026\u50FB\u515C\u5243\u5420\u5446\u54B3\u54BD\u553E\u55A7\u5703\u5984\u5AC9\u5B09\u5C51\u5DFE\u5ED3\u5F1B\u6055\u618E\u62D9\u65A7\u6652\u6977\u6EBA\u707C\u75D8\u79E4\u7AFF\u7B4F\u7CA5\u808B\u8098\u80B4\u8235\u82DB\u849C\u8549\u868A\u86FE\u8718\u914C 114 | NGram.KANJI_7_12=\u4E08\u4E38\u4F8D\u50DA\u5203\u5256\u52C9\u52D8\u52FE\u5320\u533F\u5375\u53D4\u540F\u54E8\u56DA\u5806\u5996\u5999\u59A5\u59A8\u59FF\u5AE1\u5BB0\u5BF8\u5C09\u5C3F\u5C48\u5C65\u5D29\u5E06\u5E4C\u5EB5\u5EB6\u5EB8\u5F13\u5FCC\u5FD8\u6052\u606D\u609F\u60D1\u614E\u6247\u62B1\u6349\u64E6\u6577\u65ED\u6674\u6734\u67C4\u6850\u690E\u6A58\u6B3A\u6B89\u6C41\u6CBC\u6CCC\u6CF3\u6D74\u6DAF\u6DF3\u6ECB\u6F02\u6F84\u71E5\u7261\u7272\u72AC\u72FC\u733F\u7409\u755C\u76F2\u7720\u77AC\u77E2\u7802\u786B\u78E8\u7901\u7948\u79E9\u7A1A\u7A74\u7AE3\u7B4B\u7B52\u7BB1\u7C3F\u8015\u8096\u809D\u80A2\u80A9\u80AA\u80BA\u80F8\u8102\u810A\u8154\u8155\u8170\u817A\u81A8\u81ED\u820C\u8236\u82BD\u8305\u83E9\u83F1\u840C\u85FB\u8650\u8702\u8A93\u8E44\u8FB0\u9038\u9091\u90AA\u916C\u9175\u9177\u9685\u96C0\u96C7\u96CC\u97AD 115 | NGram.KANJI_7_13=\u63D6\u803D 116 | NGram.KANJI_7_16=\u602F\u7566 117 | NGram.KANJI_7_18=\u634C\u7C38 118 | NGram.KANJI_7_19=\u4E18\u4E73\u4E95\u4EAB\u4EC1\u4ED8\u4ED9\u4F11\u4F34\u4F38\u4F59\u4FB5\u4FC3\u4FD7\u5012\u5019\u5065\u50AC\u5144\u5145\u514D\u517C\u51A0\u51B7\u5211\u5238\u523A\u523B\u5272\u52E4\u5360\u5371\u539A\u541B\u5426\u5438\u5473\u54F2\u5510\u552F\u5531\u559C\u5609\u56F0\u56FA\u591C\u5948\u594F\u59BB\u59D3\u5B85\u5B87\u5B88\u5B99\u5B9C\u5BC4\u5BFA\u5C0A\u5C3E\u5CA9\u5D0E\u5DE1\u5DE8\u5DEE\u5DF1\u5E45\u5E78\u5E7B\u5E7C\u5EAD\u5EF7\u5F1F\u5F31\u5F79\u5F7C\u5F85\u5F92\u5FA1\u5FE0\u6050\u60A3\u6212\u62DB\u632F\u6355\u63A2\u63AA\u63CF\u642D\u6469\u64CD\u653B\u6563\u660C\u662D\u667A\u6697\u66FF\u6750\u675F\u677F\u6790\u67D3\u682A\u6885\u68B0\u6B8A\u6B96\u6BDB\u6C60\u6CB9\u6CC9\u6D25\u6D66\u6DB2\u6DF7\u6E21\u6ED1\u6F2B\u6F6E\u6FC0\u7235\u725B\u72AF\u7389\u7532\u7533\u756A\u75BE\u75C7\u76AE\u76CA\u7740\u786C\u7956\u7968\u796D\u7981\u79C0\u79C1\u79CB\u79D8\u7A3F\u7AE5\u7AF9\u7E41\u7F6A\u7FFB\u8089\u80CC\u80DE\u81E3\u821E\u8239\u82E5\u8328\u8377\u85E4\u8840\u88C1\u88C2\u8C6A\u8D64\u8DDD\u8FCE\u8FD4\u9000\u9014\u907F\u90CA\u90CE\u90E1\u9152\u9178\u9686\u9694\u969C\u9707\u9732\u9AA8\u9B54\u9E7F\u9EBB 119 | NGram.KANJI_7_20=\u4E39\u4E43\u4EAE\u4F73\u504F\u505A\u51C6\u51CC\u52AA\u5339\u5347\u53EB\u53EC\u5448\u5766\u57F9\u5854\u585E\u58A8\u5B8B\u5C01\u5CF0\u5E72\u5EC9\u5F80\u5F81\u5FBD\u5FEB\u6069\u6211\u624D\u628A\u62B5\u62CD\u6309\u63A7\u64AD\u6566\u6597\u65CB\u65D7\u6628\u6717\u6731\u674E\u675C\u683D\u6881\u6B3E\u6BD2\u6C7D\u6C99\u6CE5\u6CF0\u6D1B\u6D2A\u70C8\u719F\u724C\u7259\u73E0\u73ED\u745E\u74E6\u7518\u751A\u7686\u770B\u7B26\u8033\u80A1\u80E1\u821F\u83AB\u8499\u8D74\u8DE8\u900F\u9010\u9047\u904D\u906D\u9675\u96C5\u96F6\u96F7\u9700\u9F13 120 | NGram.KANJI_7_21=\u5764\u59D0\u5A03\u6062\u6108\u68C9\u7164\u79BE\u7BAD\u903C 121 | NGram.KANJI_7_23=\u4EA5\u50B2\u532A\u5366\u543B\u54E9\u5632\u59D1\u5BB5\u5DF7\u5F6A\u5F6C\u5FFD\u6070\u6168\u61BE\u63A0\u63A9\u6478\u65A4\u68A7\u6A1F\u6CAB\u70F9\u711A\u723D\u7262\u72F8\u751C\u754F\u75B9\u76C8\u7709\u7897\u7CCA\u7F9E\u8299\u82AD\u82B9\u82D4\u8304\u84C9\u84EC\u854A\u85AF\u86D9\u8FA3\u9187\u97A0 122 | NGram.KANJI_7_25=\u4E14\u4E5F\u4F46\u514B\u5176\u5230\u5373\u53EA\u540E\u5982\u5C3C\u5DF4\u6216\u62C9\u65AF\u66FE\u6B64\u6D32\u6D6A\u7BC7\u800C 123 | NGram.KANJI_7_28=\u4E4E\u4E9B\u4EA6\u4EC0\u4FC4\u5403\u5957\u5C24\u6089\u6258\u67D0\u758F\u7FF0\u8D6B 124 | NGram.KANJI_7_29=\u4FAE\u5944\u5A29\u6101\u62ED\u6328\u637B\u6666\u6687\u66AE\u673D\u6756\u67FF\u6813\u68A2\u699B\u7078\u708A\u7396\u7422\u7525\u75E2\u76BF\u7766\u77B3\u7A3C\u7A92\u819D\u81FC\u8237\u8338\u8511\u88F3\u8FC2 125 | NGram.KANJI_7_32=\u4E11\u4F3A\u4F51\u5197\u51B6\u51F9\u52FF\u541F\u5507\u5589\u5993\u5A7F\u5AC1\u5B9B\u5BC2\u5BE1\u5F04\u5F0A\u5F27\u6020\u6028\u6068\u6094\u6109\u611A\u614C\u621A\u62B9\u62D0\u62F7\u62FE\u632B\u633D\u6367\u660F\u6627\u6643\u66D9\u674F\u6795\u67AF\u67D1\u6876\u68DA\u68FA\u6905\u69FD\u6A80\u6B6A\u6CB8\u6CE3\u6DD1\u6DEB\u6E9C\u6EA2\u6EF4\u6F06\u714E\u716E\u722A\u7280\u74A7\u752B\u75B2\u75D5\u75F4\u77AD\u77E9\u785D\u79BD\u7A3D\u7A9F\u7B1B\u7B95\u7C9F\u7CDF\u80C3\u8106\u817F\u818F\u81B3\u828B\u82A5\u82AF\u840E\u851A\u853D\u8776\u87F9\u8877\u8910\u8912\u8C79\u8D66\u8FB1\u9017\u90C1\u916A\u9699\u96C1\u971C\u9774\u978D 126 | NGram.KANJI_7_33=\u4E4B\u4E86\u4E94\u4EA4\u4EAC\u4ECA\u4ED6\u4EF6\u4EFB\u4F9B\u4FDD\u4FE1\u5143\u5148\u5149\u518D\u5217\u521D\u5305\u5341\u534A\u53C8\u53CD\u53D6\u53D7\u53E3\u53E4\u53EF\u53F2\u53F8\u5404\u5411\u5468\u547D\u54C1\u5546\u5668\u56DB\u56DE\u56E0\u571F\u578B\u57CE\u57DF\u5883\u58EB\u592A\u592E\u5973\u59CB\u59D4\u5B57\u5B58\u5B89\u5B98\u5C11\u5C31\u5C40\u5C55\u5DDD\u5E03\u5E38\u5E9C\u5F15\u5F62\u5F71\u5F97\u5FC3\u60C5\u610F\u624B\u6280\u6301\u63A5\u63A8\u63D0\u652F\u6539\u653E\u6559\u65BD\u65CF\u661F\u66F2\u671D\u672A\u6797\u679C\u6821\u683C\u6B7B\u6BD4\u6C34\u6C5F\u6CB3\u6D3B\u6D41\u6E2F\u6E90\u6F14\u7136\u7248\u738B\u7403\u76F4\u7701\u77E5\u77F3\u7814\u793A\u795E\u798F\u7A0B\u7A76\u7A7A\u7BA1\u7C73\u7F6E\u7F8E\u80B2\u81F3\u822C\u8272\u8457\u88AB\u89E3\u8A00\u8C61\u8D77\u8DEF\u8EAB\u8FD1\u9020\u91CC\u91CF\u91D1\u9650\u9662\u96C6\u975E\u9762\u97F3\u9996\u9999 127 | NGram.KANJI_7_35=\u55C5\u57A2\u58D5\u59E5\u637A\u74E2\u7CE0\u895F 128 | NGram.KANJI_7_37=\u4E19\u4E32\u4E4F\u4E91\u4EC7\u4ED4\u4F0D\u5141\u51E1\u51F6\u51F8\u52AB\u535C\u53C9\u53DB\u540A\u5410\u54C0\u559D\u5750\u5751\u576A\u57E0\u5824\u582A\u5830\u5835\u5851\u5858\u586B\u5954\u59FB\u5A46\u5B5F\u5BB4\u5BD3\u5C16\u5C60\u5CFB\u5D16\u5E16\u5E3D\u5E7D\u5E87\u5ECA\u5FD9\u60DC\u60F9\u6155\u6167\u6234\u626E\u6276\u6284\u633A\u6377\u6492\u649E\u64B0\u6562\u6591\u65A5\u65E6\u65FA\u6602\u670B\u676D\u68AF\u695A\u6B23\u6BC5\u6C70\u6C83\u6CE1\u6D8C\u6DD8\u6E20\u71D5\u72D0\u72D7\u73B2\u73CA\u7433\u7483\u74DC\u74F6\u7554\u764C\u7761\u77DB\u78A7\u7A46\u7A7F\u7A84\u7C97\u7D2F\u7FC1\u7FE0\u8000\u8017\u808C\u80AF\u8404\u8461\u8463\u8475\u8513\u85AA\u8679\u86CB\u871C\u87BA\u88F8\u8C8C\u8DF3\u8FC4\u901D\u9022\u906E\u9075\u9192\u91C7\u966A\u971E\u9910\u9B41\u9F0E\u9F20 129 | TO_NORMALIZE_VI_CHARS=AEIOUYaeiouy\u00c2\u00ca\u00d4\u00e2\u00ea\u00f4\u0102\u0103\u01a0\u01a1\u01af\u01b0 130 | DMARK_CLASS=\u0300\u0301\u0303\u0309\u0323 131 | NORMALIZED_VI_CHARS_0300=\u00C0\u00C8\u00CC\u00D2\u00D9\u1EF2\u00E0\u00E8\u00EC\u00F2\u00F9\u1EF3\u1EA6\u1EC0\u1ED2\u1EA7\u1EC1\u1ED3\u1EB0\u1EB1\u1EDC\u1EDD\u1EEA\u1EEB 132 | NORMALIZED_VI_CHARS_0301=\u00C1\u00C9\u00CD\u00D3\u00DA\u00DD\u00E1\u00E9\u00ED\u00F3\u00FA\u00FD\u1EA4\u1EBE\u1ED0\u1EA5\u1EBF\u1ED1\u1EAE\u1EAF\u1EDA\u1EDB\u1EE8\u1EE9 133 | NORMALIZED_VI_CHARS_0303=\u00C3\u1EBC\u0128\u00D5\u0168\u1EF8\u00E3\u1EBD\u0129\u00F5\u0169\u1EF9\u1EAA\u1EC4\u1ED6\u1EAB\u1EC5\u1ED7\u1EB4\u1EB5\u1EE0\u1EE1\u1EEE\u1EEF 134 | NORMALIZED_VI_CHARS_0309=\u1EA2\u1EBA\u1EC8\u1ECE\u1EE6\u1EF6\u1EA3\u1EBB\u1EC9\u1ECF\u1EE7\u1EF7\u1EA8\u1EC2\u1ED4\u1EA9\u1EC3\u1ED5\u1EB2\u1EB3\u1EDE\u1EDF\u1EEC\u1EED 135 | NORMALIZED_VI_CHARS_0323=\u1EA0\u1EB8\u1ECA\u1ECC\u1EE4\u1EF4\u1EA1\u1EB9\u1ECB\u1ECD\u1EE5\u1EF5\u1EAC\u1EC6\u1ED8\u1EAD\u1EC7\u1ED9\u1EB6\u1EB7\u1EE2\u1EE3\u1EF0\u1EF1 136 | -------------------------------------------------------------------------------- /src/main/resources/profiles/ko: -------------------------------------------------------------------------------- 1 | {"freq":{"¤":8,"¸":6,"·":50,"´":30," 가ㅏ":15," 가ㅎ":12," 가ㅈ":7," 가ㅋ":98," 가ㅅ":7," 가ㅇ":26," 가ㅁ":13," 가ㅜ":11," 가ㅐ":7," 가ㅓ":10," 가ㄹ":31," 가ㄴ":29," 가ㄱ":20,"ㄱㄱ ":11," 가ㅣ":10," 가ㅠ":20," 가ㅡ":9,"ˇ":6,"˝":6,"ㅅ가가":25,"ω":19,"가가ㄹ":54,"가가ㄱ":37,"가가ㄴ":92,"가가ㄷ":32,"가가ㅡ":50,"가가ㅠ":600,"가가ㅣ":46,"가가ㅜ":179,"가가ㅗ":8,"가가ㅔ":17,"가가ㅓ":33,"가가ㅐ":12,"가가ㅑ":7,"가가ㅏ":68,"가가ㅎ":104,"가가ㅌ":12,"가가ㅋ":1102,"가가ㅈ":10,"가가ㅇ":106," ㄹ ":6,"가가ㅆ":10,"가가ㅅ":29,"가가ㅂ":6,"가가ㅁ":20," ´":22," ·":8,"가가」":32,"가가「":31,"가가』":11,"가가】":7," ㅁ ":63," ㅂ ":19," ㅇ ":81,"ㅡㅡㅡ":10," ㅅ ":66," ㄱ ":11," ㄷ ":9," ω":10," ㄴ ":6,"ㅈ가가":16,"ㅠㅜㅠ":47,"ㅠㅜㅜ":54,"ㅠㅠㅋ":9,"ㅠㅠㅜ":47,"ㅠㅠㅠ":2506,"ㅠㅡㅠ":12,"가/가":6,"ㅇ가가":82,"๑":12,"ㅠㅋㅋ":8,"า":6,"ᆢ":11,"ᆞ":18," "":8," ノ":19," 。":6,"  ̄":6,"가가▶":13,"ㅇㅇ가":12," ๑":9,"ㅁ가가":17,"´ ":8,"】가":7,"가가→":10,"www":10,"「가":83,"【가":7,"」가":33,"『가":17,"· ":6," ㅠ ":124," ㅡ ":19," ㅜ ":20," ㅍ ":10," ㅎ ":47," ㅋ ":92,"ㅂ가가":11,"ㅋㅋ가":741,"∇":9,"∀":10,"가ㅣ ":7,"ㄹㄹ ":7,"⊙":14,"가ㅜ ":14,"⌒":10,"가ㅠ ":57," 」 ":29," 「 ":8,"가ㅓ ":12,"ノ ":9,"가ㅋ ":48,"가ㅐ ":6,"↑":19,"→":21,"↗":6,"가ㅎ ":19,"가ㅏ ":16," ⊙":7,"가ㅇ ":18," ⌒":8,"가ㄹ ":19,"ㅋㄱ가":10,"가ㅁ ":11,"가ㄱ ":12,"가ㄴ ":20,"가가ᆢ":6,"가가ᆞ":11,"┌":6,"─":14," →":8,"▶":46,"▷":7,"▽":21,"□":11,"◐":11,"◑":9,"◇":9,"●":18,"○":9,"ㄷㄷ ":24,"ww":11," ▽":10," ▶":25," ▷":7," ●":13,"ㅠ가ㅠ":9," 丈가":9,"가·가":38,"▶▶ ":6,"ああ ":6," ̄ ":6," 【":11," 『":14," 「":59," 」":64,"  ":6,"ㅣ":106,"ㅡ":253,"ㅠ":5116,"ㅔ":42,"ㅕ":20,"ㅗ":65,"ㅐ":36,"ㄹ가가":56,"ㅑ":14,"ㅓ":75,"ㅜ":1064,"ㅛ":9,"ㅅ":213,"ㅇ":635,"ㅆ":17,"ㅁ":191,"ㅃ":11,"ㅂ":77,"ㅍ":30,"ㅌ":55,"ㅏ":203,"ㅎ":887,"ㅉ":19,"ㅈ":58,"ㅋ":18985,"ㅊ":18,"ㄲ":26,"ㄱ":238,"ㄷ":173,"ㄴ":225,"ㄸ":15,"ㄹ":159," ア ":15,"あ":51,"? ":6," 가 ":12034," ":15,"』":15,"『":17,"」":105,"「":104,"【":14,"】":14,"" ":8,"〜":7,"ア":38,"─ ":6,"ㄴㄴ ":8,"ㅎㅎ가":30," ㅜ":143," ㅗ":7," ㅋ":1426," ㅉ":6," ㅈ":23," ㅏ":9," ㅎ":263," ㅍ":18," ㅌ":10," ㅂ":30," ㅁ":82," ㅇ":266," ㅅ":95," ㄸ":11," ㄹ":15," ㄱ":36," ㄲ":7," ㄴ":38," ㄷ":40,"가가 ":101467," ㅡ":74," ㅠ":709," ㅣ":10,"가가·":32," あ":16," ア":23,"」가 ":10," あ ":11,"人人人":6,"` ":9,"「가 ":16,"ㄱ가 ":13," ̄ ̄":8,"。 ":6,"ㅣㅣ":7,"ㅣㅇ":6,"ㅡㅡ":84,"ㅡㅠ":13,"ㅡㅜ":11,"ㅠㅠ":3579,"ㅠㅡ":17,"/가가":6,"ㅕㅕ":7,"ㅗㅗ":38,"ㅓㅓ":14,"ㅜㅜ":559,"ㅜㅡ":11,"ㅜㅠ":119,"ㅠㅋ":9,"ㅠㅜ":132,"ㅅㅎ":10,"ㅅㅇ":34,"ㅅㅂ":18,"ㅇㅠ":6,"ㅈㄹ":6,"ㅇㅏ":8,"ㅇㅇ":75,"ㅇㅎ":8,"ㅇㅋ":9,"ㅇㅁ":52,"ㅇㅂ":10,"ㅇㅅ":42,"ㅁㅇ":49,"ㅁㅁ":7,"ㅂㅇ":10,"ㅎㅇ":13,"ㅎㅅ":10,"ㄴ가가":75," "가":7,"ㅌㅌ":9,"ㅏㅏ":52,"ㅎㅎ":468,"ㅉㅉ":8,"ㅁㅇ ":40,"ㅋㅋ":16188,"ㅋㅌ":14,"ㅋㅠ":7,"ㅌㅋ":25,"ㅋㄱ":75,"ㅋㄲ":6,"ㄱㄱ":49,"ㄱㅋ":55,"ㄷㄷ":78,"ㄴㄴ":29,"/가":6,"ㄸㄹ":12,"ㄹㄹ":17,"ㄱㅋㅋ":32,"ㄱㅋㄱ":12,"之":27,"中":11,"並":16,"丘":15,"丈":12,"三":53,"丁":17,"人":10,"亞":8,"亂":8,"ㅣ가 ":13,""가":7,"ㄷ가가":6,"三三":7," ▽ ":10,"가ㄷㄷ":10,"가ㄱㄱ":8," ▶ ":12," 丘":7,"가ㅇㅇ":15," 丈":12," 三":20," 丁":7,"가ㅇㅁ":8,"가ㅇㅅ":10,"ㄱㄱㅋ":9,"ㄱㄱㄱ":15,"가ㅏㅏ":19,"가ㅎㅎ":69,"가ㅌㅋ":6,"가ㅋㅋ":1130," ● ":9,"가ㅓㅓ":6,"가ㅜㅜ":118,"가ㅜㅠ":23,"가ㅠㅜ":32," 中":10," 之":13,"가ㅡㅡ":32,"가ㅠㅡ":6,"가ㅠㅠ":506,"人人":7,"→ ":9,"↑ ":6,"ㄱ가가":41,"ㅠ가 ":26," ㅠ가":9," ㅡ가":7," ㅎ가":8," ㅋ가":10," ㅈ가":7," ㅇ가":23," ㅅ가":7,"ああ":27,"▶가":7," ㅁ가":6," ㄴ가":8,"ㅋㄱ ":6," ㄱ가":6,"ㅇㅇ ":37,"▶가가":7,"」「":6,"ㅏ가ㅏ":9,"ㅜ가 ":7,"ㅔ가 ":8,""가가":6,"ᆞ가가":11,"ㄸㄹㄹ":9,"ω ":11,"ㅅㅂ ":9,"ㅅㅇ ":21,"⌒ ":8,"ㅠㅜ가":9,"ㅂㅇ ":7,"↑↑":8,"ㅜㅜ가":53,"가ㄹ":87,"가ㄷ":36,"가ㄴ":124,"가ㄲ":6,"가ㄱ":59,"가ㅛ":6,"가ㅜ":196,"가ㅑ":9,"가ㅐ":19,"가ㅓ":48,"가ㅕ":6,"가ㅔ":24,"가ㅗ":10,"가ㅈ":18,"가ㅋ":1235,"가ㅌ":14,"가ㅍ":6,"가ㅎ":120,"가ㅏ":101,"가ㅁ":34,"가ㅂ":8,"가ㅅ":40,"가ㅆ":11,"가ㅇ":137,"가ㅣ":62,"가ㅠ":655,"가ㅡ":61,"ㄷㄷㄷ":37,"가』":14,"가「":35,"가」":34,"ㅋ가ㅋ":25," 之 ":8,"가】":7,"ㅋ가ㅠ":14,"ㅅ가 ":16,"가ᆞ":12,"가ᆢ":8,"가가가":150443,"ㅇ가 ":33,"】 ":6,"』 ":10,"」 ":44,"「 ":14,"ㅋㅋ ":955,"ㅎㅎ ":124,"👍":18,"ㅠㅠ가":224," 가가":104979,"あ ":18,"ㅡㅡ가":9,"가→":11,"→가가":7,"ㅋ가 ":92,"ㅏㅏ ":10," 『가":14," 「가":48," 」가":15,"ㅈ가 ":7,"ㅣ가가":37,"·가가":33,"가─":7,"가▶":13," ノ ":9,"ㄷ ":39,"ㅡ가가":28,"ㄴ ":40,"ㄲ ":8,"ㄱ ":44,"ㅁ ":79,"ㄹ ":42,"ㅈ ":12,"ㅇㅇㅇ":10,"๑ ":8,"ㅇㅅㅇ":32,"ㅇ ":221,"ㅅ ":79,"ㅂ ":31,"가" ":8," 가":117510,"ㅇㅁㅇ":47,"ㅏ가 ":14,"가/":6,"가"":8,"ㅇㅂㅇ":10,"가ㅡ가":11,"가ㅠ가":26,"가ㅣ가":40,"ㅠ가가":227,"가ㅜ가":14,"가ㅓ가":15,"가ㅔ가":10,"가ㅏ가":51,"가ㅐ가":9,"가ㅋ가":23,"가":378431,"가ㅎ가":16,"三가":7,"丈가":9,"ㅋ ":1110,"ㅍ ":13,"ㅏ ":40,"ㅎ ":201,"丈가가":8,"ㅐ ":10,"ㅓ ":17,"ㅔ ":10,"ㅗ ":8,"ㅜ ":141,"ㅠ ":694,"ㅡ ":73,"ㅣ ":13,"ㅋㅠㅠ":6,"가·":39,"가 ":114163,"ㅌㅋㅋ":19,"ㅋㅌㅋ":11,"ㅋㅋㅠ":6,"ㅓ가 ":8,"ㅋㅋㄲ":6,"ㅋㅋㄱ":50,"ㅋㅋㅋ":13704,"ㅋㅋㅌ":9,"ア ":21,"ㅋㄱㄱ":18,"ㅋㄱㅋ":36,"ㅜ가가":72,"👍 ":6,"ㅎㅇㅎ":6,"가ㅁ가":17,"ㅎㅅㅎ":9,"가ㅂ가":7,"가ㅅ가":32,"ㅎㅎㅎ":232,"가ㅇ가":65,"가ㅈ가":13,"가ㄱ가":30,"가ㄴ가":90,"가ㄹ가":63,"가ㄷ가":13,"ㅜ가":86,"ㅣ가":59,"ㅠ가":267,"ㅡ가":33,"ㅔ가":19,"ㅓ가":21,"ㅏㅏㅏ":32,"ㅎ가":57," ㅡㅡ":39,"ㅍ가":7," ㅠㅠ":504," ㅠㅡ":8,"ㅌ가":11,"ㅋ가":782," ㅠㅜ":15,"ㅑ가":6,"ㅐ가":14,"ㅏ가":79,"ㅅ가":49,"ㅆ가":8,"ㅇ가":122,"ㅜㅠ ":18,"ㅈ가":24," ㅜㅜ":90," ㅜㅠ":12,"ㅜㅜ ":88,"ㅁ가":27,"ㅂ가":15," ㅇㅏ":6," ㅇㅇ":48," ㅋㄱ":6,"ㄴ가":131,"ㄷ가":20," ㅋㅋ":1269," ㅎㅎ":164,"ㄹ가":82," ㅎㅅ":8," ㅎㅇ":7,"가ᆞ가":8," ㅅㅂ":13,"ㄴ가 ":46,"ㄱ가":57," ㅇㅁ":43," ㅇㅂ":9," ㅇㅅ":30," → ":7,"·가":40,"?":18," ?":17,"▶ ":18,"ㅓㅓㅓ":8,"▽ ":12,"◇ ":6,"ㅠㅜ ":11,"ㅓ가가":9,"?":8,"?":38,"● ":13,"ㅠㅠ ":476,"ㄴㄴ가":14,"가가/":6,"가가"":8,"가👍":12,"ㄹ가 ":17,"ㅡㅠ ":9,"ㅔ가가":8,"ㅡㅡ ":47,"가」가":18,"가「가":27,"?가":9,"가?":15,"ㄷ가 ":12,"👍가":9,"「가가":66,"ㅏ가가":50,"」가가":19,"ㅗㅗㅗ":29," ω ":9," ▶가":7,"『가가":16,"ㅐ가가":6,"ᆞ가":12,"?가가":9,"【가가":7,"ㅎ가가":45,"】가가":6,"丘 ":9,"가가?":15,"가→가":7,""":16,")":8,"(":8,"/":13,"^":10,"_":8,"`":11,"w":13,"・":8,"。":8,"ノ":19,"゚":8," ̄":20,"가가":257747,"ㅋ가가":638,"ㅜㅠㅠ":44,"ㅜㅠㅜ":34,"▶▶":6,"ㅜㅡㅜ":6," ⌒ ":8,"ㅁ가 ":9,"□□":7,"三 ":15,"가』 ":10,"가」 ":11,"ㅜㅜㅡ":6,"ㅜㅜㅠ":32,"ㅜㅜㅜ":289,"丁 ":7,"ㅌ가가":8," ㄴㄴ":18," ㄱㄱ":7," ㄸㄹ":10," ㄷㄷ":27,"→가":7,"あああ":17,"之 ":11},"n_words":[408659,524156,400873],"name":"ko"} -------------------------------------------------------------------------------- /src/main/resources/profiles/pa: -------------------------------------------------------------------------------- 1 | {"freq":{"ਾਜਵ":6,"ਾਜ਼":11,"ਠਾ ":34,"ਾਜਪ":8,"ਾਜਾ":5,"ਾਜੀ":3,"ਾਜੇ":3,"ਾਜੋ":5,"ੀਲ ":3,"ੀਰ ":62," कु":3,"ੁਖ ":9,"ਾਡਾ":33,"ਾਡੀ":38,"­":3,"¡":5,"¤":3,"ਿਂਦ":3,"·":7,"ਝੂਲ":3,"ß":4,"ਾਝੋ":3,"ੁਕ ":10,"ਾਣੇ":21,"ੀਹ ":5,"ਾਤਰ":10,"ਝੁਕ":4,"ਾਤਿ":4,"ਾਤਾ":24,"ਾਤੀ":12,"ਿਆਣ":15,"ਿਆਦ":13,"ਿਆਪ":6,"ਾਤੇ":4,"ਿਆਨ":13,"ਾਤੋ":3,"ਿਆਲ":10,"ਿਆਰ":148,"ਿਆਵ":4,"ਿਆਹ":6,"ਿਆਸ":6,"ਾਥੀ":3,"ਝੂਠ":13,"ਾਦਤ":6,"ਾਡੇ":63,"ਝਿਆ":3,"ਾਣਕ":4,"ਾਣਗ":7,"ਾਣਦ":6,"ਿਅਕ":5,"ਾਤਕ":10,"ੀਸ ":7,"ਿਆਂ":97,"ਾਣੀ":49,"ਾਣਾ":29,"ਾਨਸ":3,"ਿਊਣ":3,"ਾਨੂ":75,"ਾਨੇ":12,"ਿਊਟ":3,"ਾਨਾ":26,"ਾਨਿ":6,"ਾਨੀ":47,"ਾਨੁ":5,"ਝਾਂ":4,"ਾਨੋ":3,"ਾਪਤ":3,"ਾਦਰ":4,"ਾਦਲ":23," । ":24,"ਾਥੋ":7,"ਾਦੇ":10,"ਿਉਂ":28,"ਾਦੀ":11,"ਾਦਾ":26,"ਾਦਸ":5," ॥ ":82,"ਾਨਕ":20,"ਿਉਕ":4,"ੁਝ ":52,"ਾਨਦ":6,"ਾਨਤ":3,"ਿਉਣ":5,"ਾਨਣ":4,"ਾਧਾ":3,"਼ੋਕ":3,"ੀਡ ":4,"ੀਟ ":3,"ਟੋ ":11,"ਾੜ ":9,"਼ੇਲ":3,"਼ੇਰ":7,"ੀਦ ":12,"ੁਆ ":5,"ੀਤ ":27,"਼੍ਰ":12,"ਛੱਪ":3,"ਛੱਡ":40,"ਾਏਗ":5,"ਟੇ ":21,"਼ੋਰ":3,"਼ੌਕ":6,"ੀਨ ":16,"ਜੋੜ":8,"ι":4,"ਜੋਸ਼":3,"ਜੋਰ":3,"ੀਮ ":9,"ਾਗੇ":9,"ਾਗੂ":4,"ਾਗੁ":4,"ਜੋਗ":7,"ਾਗਾ":6,"ਾਗੀ":8,"ਾਗਿ":3,"ਜੋਤ":5,"ਾਖੀ":3,"ਾਗਜ":4,"ਾਗਲ":3,"ਟੀ ":54,"ਾਗਰ":3,"ਜੋਆ":4,"ੀਬ ":8,"ਾਗਮ":5,"ਾਕੀ":3,"ਾਕਿ":17,"ਜੈਸ":3,"ਟਾ ":24,"ਾਕਾ":13,"ਾਖਲ":3,"ਾਕੇ":18,"ς":6,"ੀਫ ":6,"ं ":4,"є":4,"੨੨ ":4,"ੀਏ ":75,"ੀਐ ":5,"ਜੇਠ":3,"ਜੇਕ":6,"ਜੇਹ":6,"ਿਰ ":54,"ਜੇਲ":12,"ਜੀਹ":3,"ਜੀਵ":4,"ਜੁਗ":4,"ਜੀਨ":7,"ਜੀਤ":13,"ਜੁਦ":3,"ੀਓ ":40,"ਜਿੱ":20,"ਿਲ ":154,"ਜਿੰ":66,"ਜੁਰ":3,"ਝਣਾ":3," ­":3," ·":3,"਼ਿਕ":9,"਼ਾਹ":6,"਼ਿਆ":3," ­ ":3,"਼ਾਨ":11,"ੀਕ ":18,"ਜੁੱ":4,"਼ਾਰ":8,"ਜ਼ਮ":6,"਼ਿਲ":4,"ਜ਼ਬ":4,"ਾਂਈ":4,"ਜ਼ਾ":19,"ਾਂਡ":5,"ਜ਼ਿ":21,"ਾਂਝ":7,"ਾਂਜ":3,"ਾਂਟ":3,"ਾਂਗ":59,"ਜ਼ਰ":13,"ਜਾਏ":9,"ਜ਼ੋ":3,"ਿਸ਼ ":7,"ਾਂਭ":3,"ਜਾਇ":7,"ਜਾਉ":8,"ਛੜਨ":3,"ਜਾਈ":12,"ਾਂਦ":93,"ਾਂਧ":5,"ਜ਼ੀ":5,"ਜਾਂ":111,"ਾਂਤ":4,"ਜਾਗ":7,"ਾਂਹ":4,"ਾਂਸ":8,"ਾਂਵ":10,"ਜਾਕ":3,"ਜਾਬ":60,"਼ੁਰ":4,"ਜਾਪ":3,"ਜਾਰ":12,"਼ਿੰ":18,"ਜਾਮ":5,"ਜਿਆ":16,"ਜਾਤ":4,"ਜਾਣ":73,"ਜਿਊ":7,"ਜਾਨ":46,"ਜਿਉ":7,"ਜਾਦ":18,"ਜਿਕ":4,"ਜਾਵ":65,"ਜਾਲ":4,"ਜਿਲ":10,"ਜਿਦ":7,"ਜਿਥ":8,"ਜੀਆ":4,"ਜਿਨ":19,"ਿਸ ":39,"ਜੀਜ":3,"ਾਅਦ":21,"ਜੀਠ":5,"ਜਿਵ":11,"ਜਿਸ":30,"ਜਿਹ":73,"ਿਹ ":4,"ਜਸਟ":3,"ਾਇਆ":45," है":3,"ਾਇਕ":13,"ਾਇਨ":4,"ਾਈਆ":9,"ਾਇਦ":6,"ਾਇਤ":6,"ਜੀ।":3,"ਜਹਾ":7,"ਾਇਮ":4,"ਾਈਏ":7,"ੀਜ ":5,"ਾਇਰ":4,"ਾਇਲ":3,"ਾਈਕ":8,"ਟਰ ":22,"ਾਈਟ":4,"ਾਉਂ":18,"ਜਹੜ":3,"ਾਈਨ":4,"ਾਜ਼ ":7,"ਜ਼ਖ":4,"ਾਉਦ":17,"ਾਉਣ":87," सु":3,"٠":5,"਼ਦਾ":3,"ਿਜ ":3,"਼ਨੀ":4,"ਜਵਾ":41,"ਜਰੇ":5,"ਜਰਾ":4,"ਜਰੂ":17,"ਜਰੀ":4,"ੀਂ ":218,"ਚੱਪ":3,"ਚੱਲ":15,"ਿਤ ":14,"ਜਲੀ":6,"ਟਨ ":4,"ਚੰਦ":13,"ਜਲਦ":4,"ਚੰਨ":7,"ਿਣ ":20,"ਚੱਕ":6,"ਚੰਗ":26,"਼ਬਰ":3,"ਚੰਡ":5,"ਜਬਾ":5,"ਟਣ ":8,"਼ਰਤ":3,"਼ਰਪ":3,"ਛੋਟ":5,"਼ਮਾ":3,"ੀਆ ":160,"ਜਮਾ":7,"ਜਮੀ":4,"ਿਨ ":52,"਼ਰੂ":6,"ਛੋੜ":5,"਼ਰਾ":4,"਼ਰੇ":3,"ਜਨਮ":12,"ਜਨਾ":6,"ਜਦੌ":3,"ਜਦੋ":52,"ਜਨਤ":5,"ਿਬ ":27,"ਜਪਾ":10," ς":6,"ਛੋਂ":3,"ਛੇੜ":5,"ੀਤਮ":3,"ੂਹ ":13,"ੀਤਾ":45,"ੀਤਿ":4,"ਛੁਡ":5,"ੀਤੀ":24,"ੁਆਰ":10,"ਛਿੱ":4,"ੀਤੇ":14,"ਛੁਪ":3,"ੁਆਫ":3,"ੁਆਵ":6,"ਚੜ੍":5,"ਛਾਪ":3,"ਛਾਣ":4,"ਛਿਆ":6,"ੂਸ ":5,"ਜਥੇ":3,"ੀਠੀ":5,"ੁਂਦ":6,"ਜਦਾ":4,"ੀਡੀ":38,"ਜਣਾ":14,"ਾੜਾ":14,"ਾੜੀ":7,"त ":5,"ਾੜੇ":8,"ਜਤਾ":3,"ੀਟਰ":3,"ੀਬਾ":9,"ੀਬੀ":4,"ੀਮਤ":5,"ਜਗਮ":6,"ਝੋ ":8,"ਜਗਾ":6,"ं":7,"आ":6,"ੀਨਾ":10,"अ":3,"ੀਨੀ":5,"उ":3,"ਛਾਂ":5,"ੀਨੇ":13,"ग":5,"ੁੜ ":8,"क":12,"ज":5,"ण":3,"त":14,"द":10,"न":7,"प":7,"ਚੜਾ":5,"ब":3,"भ":6,"म":7,"य":3,"र":14,"ਚੜਦ":4,"ह":8,"स":15,"ि":13,"ा":13,"े":6,"ी":11,"ु":17,"्":7,"ो":5,"ੀਦਾ":18,"ै":6,"ੀਦੀ":12,"ੀਦਵ":3,"।":70,"॥":115,"ੂਪ ":8,"ਿਲੀ":14,"ਿਲਿ":8,"ਿਲਾ":68,"ਿਲ੍":3,"ਿਲੋ":10,"ਿਲੇ":17,"ਿਲਕ":4,"ੂਨ ":7,"ਿਲਮ":9,"ਿਲਣ":8,"ਿਲਦ":26,"ਿਰੀ":3,"ਿਰਾ":19,"ਿਰਲ":5,"ਿਰੋ":6,"ਿਰੁ":3,"ਿਰੇ":7,"ਸ਼":284,"ਵ":1966,"ਲ਼":7,"ਲ":2942,"ਰ":4850,"ਿ":3528,"ਾ":8410,"ਿਯਾ":5,"਼":396,"ਹ":3348,"ਸ":3015,"ਿਰਦ":21,"ਦ":4259,"ਧ":268,"ਿਰਨ":3,"ਤ":2961,"ਜਖਮ":5,"ਥ":236,"ਢ":48,"ਣ":1141,"ਠ":172,"ਡ":611,"ਮ":2287,"ਯ":205,"ਬ":1546,"ਭ":401,"ਪ":1632,"ਿਰਪ":8,"ਫ":397,"ਨ":3567,"ਿਯੋ":3,"ਿਰਫ":5,"ਕ":3733,"ਔ":30,"ਗ":1538,"ਖ":895,"ਐ":89,"ਓ":193,"ਿਮਰ":3,"ਝ":229,"ਿਮਾ":10,"ਜ":2015,"ਟ":565,"ਘ":176,"ਛ":177,"ਚ":1066,"ਅ":626,"ਆ":1951,"ਇ":625,"ਂ":2559,"ਏ":438,"ਈ":629,"ਉ":670,"ਊ":32,"ੳ":19,"ੲ":12,"ੱ":2186,"ੰ":2127,"ੴ":10,"ਿਭਾ":12,"੧":20,"੪":14,"੫":20,"੨":19,"੩":7,"੭":6,"ੂਤ ":4,"ਖ਼":18,"ਜ਼":119,"ਗ਼":7,"ੜ":663,"ਫ਼":23,"ੀ":5175," ٠":4,"ੁ":1840,"ਿਬਾ":6,"ੂ":1336,"ਝੇ ":9,"ੇ":5210,"ੈ":964,"ੋ":2016,"ੌ":186,"੍":257,"ਝਾ ":6,"ਾੜਕ":4,"ੂਲ ":11,"ਾਜ਼ਮ":3,"ਚੈਕ":3,"ਜੜ ":4,"ੀਜਾ":4,"ੀਜ਼":4,"ਚੇਤ":11,"ਿਹੰ":9,"ਿਹੜ":42,"ੂਰ ":46,"ਛਦਾ":4,"ਿਹੋ":3,"ਛਦੀ":3,"ਿਹੇ":4,"ਿਹੀ":9,"ਿਹਾ":88,"ੀਚਾ":3,"ਿਹਲ":4,"ਿਹਰ":11,"ਿਹਤ":3,"ਿਹਦ":8,"ਿਸੇ":101,"ਿਹਨ":17,"ਿਸ਼":20,"ਿਸਾ":16,"ਿਸਮ":19,"ੂਮ ":3,"ਝੂ ":5,"ਿਸਟ":6,"ੀਗੜ":5,"ਿਸਨ":4,"ਿਸਦ":4,"ਿਸਤ":14,"ਚੋਣ":11,"ਚੋਰ":12,"ਿਸ਼ਾ":3,"ਚੋਂ":33,"ਿਸ਼ਨ":4,"ਿਵੇ":22,"ਿਵਾ":22,"ਿਸ਼ਤ":8,"ੀਕੇ":6,"ੀਕਾ":11,"ै ":3,"ਿੳ ":3,"ਿਠੀ":3,"ਿਠਾ":5,"ਚਾਈ":6," क":10,"ਚਾਉ":8,"ਚਾਇ":4,"ਚਾਅ":3," ज":3,"ੁਸ਼ ":6," आ":4," अ":3,"ੀਂਹ":4,"ਿਡਾ":4,"ਚਿਆ":11,"ਚਾਨ":5,"ਚਾਰ":30,"ਚਾਹ":47,"ਚਿਤ":3,"ਿਣਤ":3,"ਚੀਆ":7,"ੁਸ ":3,"ਚਿਰ":6,"ਚੀਜ":9,"ਚਿਹ":4,"ਿਣਾ":12,"ੀਆਂ":257,"ੀਅਤ":6,"ਿਛੋ":3,"ਚੁਕ":5,"ਚੀਮ":3,"ਿਜਹ":3,"ਿਜਲ":6,"ਿੰ ":3,"ੁਲ ":11,"ਚਿੱ":10,"ਚਿੰ":4,"ਿਛੜ":5,"ਚੁੱ":15,"ਚੁੰ":6,"ੂਕ ":7,"ਿਟਾ":3,"ि ":5,"ਿਨਾ":41,"ਿਨਿ":4,"ਿਨੀ":3,"ਿਨੇ":3,"ੈ। ":4," ਅ":543," ਇ":440," ਆ":648,"ी ":10," ਏ":207," ਉ":376," ਈ":29," ਊ":3," ਔ":30," ਕ":2429," ਖ":271,"ਿਨ੍":11," ਗ":573," ਐ":82," ਓ":102," ਜ":1371," ਝ":60," ਟ":103," ਘ":118,"ु ":7," ਚ":632," ਛ":99,"ਜੋ ":82,"ਿਫਤ":7,"੪੫ ":7,"ੂਠ ":6,"ा ":6,"ਿਤਾ":25,"ੀਅਹ":3," ।":36," ॥":99,"ਿਤਸ":6,"ੀਅਰ":4,"ਿਤਰ":7,"ੀਅਨ":3,"ਿਤੇ":15," प":3,"ਿਦਿ":5," म":5," द":3," त":3,"ਿਦਾ":13," ह":6,"ਿਦਲ":3," स":9,"ਚਹੁ":4,"ਿਥੇ":12,"ਿਥੋ":4,"ਿਧਾ":10,"ਿਦੇ":5,"ੀਜ਼ ":3,"ਾਰਕ":12,"ਾਰਚ":3,"ਾਰਜ":3,"ਾਰਟ":4,"ਾਰਣ":4,"ਾਰਤ":16,"ਾਰਦ":15,"ਾਰਨ":23,"ਜੂ ":6,"ਝਣ ":4,"ੁਦ ":7,"ਾਰਮ":3,"ਾਮਲ":15,"ਾਮਿ":3,"ਾਮਾ":12,"▓▓▓":16,"ਾਮੀ":10,"ਾਮੁ":6,"ਾਮੇ":4,"ਾਮੋ":4,"ਾਲਕ":6,"ਾਲਗ":5,"ਾਲਜ":5,"ਾਲਤ":9,"ਾਲਦ":4,"ਾਰੁ":3,"ਾਰੀ":113,"ਿਓਂ":4,"ਾਰਿ":27,"ਾਰਾ":101,"ਾਰੇ":60,"ਾਰੂ":8,"ਾਰੋ":9,"ਾਫ਼":6,"ੁਡ ":3,"ੂਂ ":6,"ਾਬਣ":3,"ਾਪਸ":5,"दरत":3," ੳ":9," ੲ":5,"ਚਰਚ":3," ੴ":10,"ਾਪੇ":3," ੨":13," ੩":4," ੫":12,"๋":3,"ਾਪਿ":4,"ਾਪਾ":8,"ਚਰਨ":7,"ਾਪੂ":18,"ਾਪੁ":3," ੧":10," ਫ਼":9,"ਾਭਾ":4," ਜ਼":39," ਗ਼":5," ਖ਼":8,"ਚਲੀ":3,"ਚਲਾ":12,"ਘੱਟ":16,"ੁਤ ":57,"ਾਮਦ":4,"ਚਲੋ":4," ਿ":24,"ਚਲਦ":12," ਹ":1388," ਸ":1778," ਵ":1231," ਸ਼":82," ਰ":668," ਲ":786," ਬ":966," ਭ":265,"ੁਣ ":63," ਮ":1462," ਯ":171," ਨ":1945," ਪ":1175,"ਾਬੇ":4,"→ㅤ":3," ਫ":257," ਤ":1659,"ਜੇ ":122," ਥ":56," ਦ":2061," ਧ":108,"ਾਬੂ":6," ਠ":35,"ਾਬੀ":28," ਡ":72," ਢ":16,"ਾਬਾ":14,"ਾਸਟ":5,"ਾਸਤ":4,"є ":3,"ਿਗਾ":5,"ਾਸ਼ਾ":4,"ਿਗੁ":58,"ਚਦੀ":3,"ਿਚੋ":7,"ੁਰ ":27,"ਚਦਾ":4,"ਚਦੇ":3,"ਾਹੁ":15,"ਾਹੀ":38,"ਾਹਿ":84,"ਿਚਾ":12,"ਾਹਾ":22,"ਾਹੇ":10,"ਾਹਰ":8,"ਾਹਲ":3,"ਾਹਮ":7,"ਾਹਵ":3,"ਾਸਿ":9,"ਾਸਾ":4,"ਾਸੀ":14,"ਾਸ਼":17,"ਾਹਨ":4,"ਾਸੇ":8,"ਾਹਤ":6,"ਾਸੂ":3,"ਾਹਣ":3,"ਾਹਦ":5,"ਿਕਰ":18,"ਜਾ ":51,"ਿਕਲ":17,"ਚਨਾ":4,"ਿਕਦ":10,"ਾਲੇ":84,"ਾਲੋ":14,"ਾਲਾ":64,"ਾਲਿ":30,"ਾਲੀ":63,"ਜ਼ ":25,"ਾਲਸ":9,"ਜੀ ":97,"ਿਗਰ":4,"ਚਪੇ":4,"ਾਵੈ":6,"ਾਵੇ":72,"ਿਖੇ":8,"ਿਖਿ":9,"ਾਵੀ":10,"ਿਖੀ":6,"ਾਸ਼ਟ":6,"ਿਖਾ":19,"ਾਵਾ":57,"ਚਪਨ":3,"ਾਵਲ":4,"ਾਵਨ":3,"ਿਖਣ":5,"ਾਵਣ":7,"ਿਖਦ":3,"ਿਕਾ":27,"ਸੜਕ":7,"ਸਜ਼ਾ":5,"ਹਾਂ":97,"਼ਰ ":6,"ਹੀਰ":9,"ਹੁਕ":8,"ਹੀਨ":4,"ਹੁਣ":57,"ਹੁਤ":66,"ਹਿਮ":5,"ਹੀਏ":5,"ਹਿਯ":3,"ਹਿਰ":17,"ਹਿਲ":39,"ਹਿਦ":9,"ਹਿਬ":31,"ਹੁਂ":6,"ਹੀਦ":23,"ਹਿਸ":12,"ਹਾੜ":7,"ਹਿਕ":8,"ਹਾਲ":34,"ਹਾਰ":27,"ਗੱਡ":10,"ਹਾਨ":21,"ਹਿਆ":7,"ਹਾਦ":8,"ਹੀਆ":3,"ਹਿਤ":8,"ਹਿਣ":36,"ਗੱਲ":65,"ਹੀਂ":121,"ਹਾਹ":3,"ਹਾਸ":10,"ਹਿਗ":52,"ਗੱਬ":3,"ਗੱਭ":3,"ਗੰਦ":6,"ਹਾਏ":8,"ਹਾਉ":4,"ਸੜਦ":4,"ਹਾਈ":9,"ਹਾਡ":14,"ਹਾਤ":3,"ਹਾਣ":8,"ਜਨ ":10,"ਛੇ ":17,"ਹਾਜ":3,"ਹਾਗ":3,"ਹਲੀ":3,"ਹਲਾ":15,"ਹਲੇ":4,"਼ਨ ":12,"ਹਰੇ":14,"ਹਰਾ":4,"ਹਰਿ":11,"ਹਸਾ":5,"਼ਮ ":3,"ਜਲ ":4,"ღ":7,"ਹਵਾ":9,"ਜਰ ":5,"ਸੋਂ":3,"ਘੈਂ":3,"ਚੜ ":3,"ਸੋਚ":25,"ਘੇਰ":3,"ਸੌਂ":7,"ਸੋਧ":3,"ਸੋਨ":5,"ਸੇਵ":8,"॥੧॥":9,"ਹਨਾ":28,"ਹਨੀ":3,"ਹਨੂ":28,"ਹਨੇ":14,"¡ ":5,"ਹਮੇ":13,"ਘੁੰ":4,"ਹਰਬ":5,"ਸੋਹ":39,"ਹਮਣ":7,"ਸ੍ਰ":9,"਼ਤ ":5,"ਹਮਲ":10,"ਹਮਦ":3,"ਜਦ ":29,"ਸੁਹ":4,"ਸੁਰ":13,"ਸੁਪ":11,"ਸਿੱ":34,"ਸਿੰ":40,"ਹਣਾ":3,"ਹਣੀ":25,"ਹਣੇ":11,"ਸੂਰ":20,"ਸੂਹ":6,"ਸੂਲ":4,"ਸਿਹ":4,"ਜਤ ":5,"ਸੁਆ":5,"ਸਿਧ":3,"ਸਿਮ":3,"ਸਿਲ":5,"ਸਿਰ":29,"ਸਿਵ":6,"ਸੀਸ":3,"ਸੁਣ":24,"ਸੁਧ":3,"ਸੁਨ":4,"ਸੀਨ":7,"ਸੀਬ":6,"ਸੁਖ":23,"ਘੋਲ":3,"ਹਦੇ":27,"ਸੇਆ":3,"ਹਦੀ":26,"ਹਦਾ":12,"ਜਣ ":10,"ਸੁੱ":14,"ਸਹੇ":14,"ਚੋ ":24,"­ ":3,"ਸਹਾ":4,"ਸਹਿ":19,"ਸਹੀ":5,"ਸ਼ਨ":16,"ਘਰਾ":6,"ਸ਼ਤ":13,"ਸ਼ਰ":11,"ਘਰੇ":3,"ਘਰੁ":3,"ਸ਼ਹ":5,"ਸ਼ਵ":3,"ਘਰੋ":5,"ਸ਼ੀ":16,"ਸਾਂ":19,"ਸ਼ਿ":10,"ਸ਼ਾ":28,"ਘਰਦ":4,"ਸ਼ਕ":18,"ਘਰਵ":4,"ਹਜ਼":4,"ਸ਼ਟ":3,"ਸਾਨ":79,"ਖੱਜ":3,"ਸਾਧ":6,"ਸਾਬ":14,"਼ਕ ":8,"ਸਾਰ":75,"ਸਾਮ":6,"ਸਿਕ":4,"ਸਾਵ":4,"ਸਿਖ":18,"ਸਾਲ":53,"ਸਾਹ":52,"ਸਾਸ":7,"ਖੱਬ":4,"ਸੀਂ":54,"ਸੀਆ":3,"ਸਾਇ":3,"ਸਾਈ":9,"ਸਾਉ":5,"ਸ਼ੇ":15,"ਖੰਡ":3,"ਖੰਟ":3,"ਸ਼ੋ":3,"ਸ਼ੌ":6,"ਸ਼੍":12,"ਸਾਗ":5,"ਚੇ ":23,"ਸਾਖ":4,"ਸਾਡ":120,"ਸਿਆ":21,"ਸਾਥ":23,"ਸਰਵ":3,"ਗੜੀ":3,"ਗੜਾ":6,"ਸਰਬ":5,"ਸਰਦ":21,"ਸਰਕ":32,"ਸਮੇ":11,"ਸਮੂ":5,"ਸਮੁ":5,"ਸਮਾ":27,"ਸ਼ੱਕ":3,"ਘਿਰ":3,"ਗੜ੍":3,"ਸਰੀ":4,"ਸਰੇ":6,"ैं ":3," ღ":3,"ਸਲੋ":4,"ਸਲੀ":3,"ਸਲਾ":19,"ਸਲੇ":7,"ਸਵਾ":24,"ਸਵੀ":10,"ਸਵੇ":8,"ਸਵਰ":3,"ਸਦੇ":11,"ਸਦਾ":31,"ਸਦੀ":18,"ਗੁੱ":8,"ਹੜ ":3,"ਗੂੰ":9,"ਸਨੇ":7,"ਸਨੂ":9,"ਗਾਨ":16,"ਘਟਨ":3,"ਗਾਮ":3,"ਗਾਲ":3,"ਗਾਰ":7,"ਸਪੀ":4,"ਗਾਹ":5,"ਘਟਾ":3,"ਗਿਣ":7,"ਗੀਂ":3,"ਸਫਰ":3,"ਗੀਆ":14,"ਗਿਰ":5,"ਸਫਾ":3,"ਗਿਲ":3,"ਗੀਤ":4,"ਗੁਆ":4,"ਗੀਰ":3,"ਸਬੁ":9,"ਗੁਡ":3,"ਗੁਜ":4,"ਗੁਨ":3,"ਗੁਣ":5,"ਸਮਝ":39,"ਗੁਰ":106,"ਸਮਤ":8,"ਸਭੁ":3,"ਗਿੱ":4,"ਗੁਲ":8,"ਸਭਾ":7,"ਸਬੰ":3,"ਸਮਰ":4,"ਗੋਰ":4,"ਗੋਲ":4,"ਸਟਿ":4,"ਸਟਾ":4,"ਸਟਰ":10,"ਗ੍ਰ":22,"ਸਟੇ":6,"ਗੈਂ":4,"ਸਣਾ":5,"ਸਣੇ":7,"ਗੈਰ":13,"ਚਾ ":34,"ਸਤੀ":9,"ਸਤਿ":25,"ਸਤਾ":25,"ਸਤੋ":7,"ਸਤੇ":9,"ਗੇੜ":7,"ਸਥਾ":4,"ਚੀ ":20,"ਛਡ ":6,"ਗਰੂ":4,"ਗਰੇ":8,"ਗਰਾ":7,"ਗਰੀ":13,"ਗਰਸ":16,"਼ਤੇ":4,"਼ਤਿ":3,"਼ਤਾ":6,"ਗਰਮ":10,"ਿਚ ":61,"ਾਹ ":60,"ਗਮੋ":6,"ਾਸ ":40,"ਾਸ਼ ":14,"ਿਖ ":6,"ਕੱਲ":26,"ਕੱਠ":3,"ਗਲੀ":8,"ਕੱਡ":8,"ਕੱਢ":8,"ਗਲਾ":10,"ਗਲੇ":5,"਼ਟਰ":3,"ਕੱਪ":6,"ਿਕ ":17,"ਕੰਮ":21,"ਕੰਬ":3,"ਕੱਛ":3,"ਕੱਚ":10,"ਕੱਖ":3,"ਗਲਵ":4,"ਕੰਡ":6,"ਕੰਜ":4,"ਗਲਤ":8,"ਾਲ ":273,"ਿਓ ":14,"ਗਹਿ":4,"ਾਰ ":327,"ਗਵਾ":4,"ਗਾਉ":9,"ਖੜਦ":3,"ਗਾਇ":9,"ਗਾਈ":4,"ਾਮ ":73,"ਖੜਾ":10,"ਗਿਆ":90,"ਗਾਣ":3,"ਗਾਂ":18,"ਾਬ ":69,"ㅤㅤㅤ":69,"਼ਕ਼":4,"਼ਕੇ":3,"ਚਰ ":5,"਼ਖਮ":3,"ਾਫ ":12,"ਖੀਆ":16,"ਖਿਡ":3,"ਹੱਲ":4,"ਹੱਬ":10,"ਖਾਸ":5,"ਖਾਹ":3,"ुदर":3,"ਖਿਚ":5,"ਹੱਤ":6,"ਹੱਥ":22,"ਹੱਦ":8,"ਖਾਵ":4,"ਖਾਲ":8,"ਖਾਮ":3,"ਖਾਨ":4,"ਖੁਆ":4,"ਖਾੜ":5,"ਾਪ ":8,"ਖਿਲ":13,"ਹੱਸ":16,"ਖਾਂ":36,"ਖ਼ਾ":3,"ਖ਼ਿ":4,"ਾਧ ":4,"ਖ਼ਬ":3,"ਖਾਣ":4,"ਖਾਤ":5,"ਖਿਆ":32,"ਹੱਕ":8,"ਿਉ ":20,"ਾਨ ":148,"ਖਾਕ":3,"ਹੰਦ":15,"ਖਾਉ":3,"ਖਾਈ":7,"ਹੰਝ":6,"ਹੰਜ":3,"ਗਣਾ":4,"ਿਆ ":314,"ਾਥ ":13,"ਖੂਬ":7,"ਗਤੀ":3,"ਾਦ ":57,"ਖੁੱ":7,"ਖੁਦ":11,"ਾਣ ":37,"ਾਤ ":39,"ਖੂਨ":5,"ਖੁਰ":3,"ਖਿੱ":3,"ਗਣਗ":4,"ਖੁਸ਼":8,"ਖੁਸ":14,"ਖੇਡ":14,"ਖੇਤ":9,"ਾਟ ":4,"ਗਦਾ":29,"ਗਦੇ":10,"ਗਦੀ":15,"ਾਜ ":20,"ਖੋਣ":4,"ਖੋਲ":10,"ਖੋਹ":5,"ਚਣ ":5,"ਕੌਮ":6,"ਕੌਰ":6,"ਾਗ ":14,"ਕੋਸ਼":6,"ਕੌਣ":8,"ਖਬੀ":12,"ਕੋਲ":23,"ਕੋਰ":9,"ਖਬਰ":6,"ਕੋਣ":4,"ਕੋਠ":7,"ਕੌੜ":4,"ਖਮੀ":4,"ਕ੍ਰ":8,"ਖਰੇ":7,"ਾਓ ":7,"ਖਰਾ":7,"ਖਰੀ":15,"ति ":3,"ਾਕ ":33,"ਹੜੇ":13,"ਹੜਾ":25,"ਹੜੀ":12,"ਾਏ ":30,"ਖਵਾ":14,"ਸੱਤ":5,"ਸੱਜ":24,"ਸੱਚ":34,"ਸੰਸ":6,"ਸੱਸ":4,"ਖਸ਼":3,"ਸੱਭ":9,"ਸੱਪ":3,"ਗਜ਼":4,"ਘਰ ":28,"ਾਇ ":11,"ਾਈ ":126,"ਕਾਇ":6,"ਸੰਗ":17,"ਕਾਂ":62,"ਸੰਮ":12,"ਾਉ ":20,"਼ੇ ":7,"ਕਿਆ":14,"ਸੰਵ":3,"ਕਿਉ":40,"ਕਾਨ":16,"ਕਾਤ":13,"ਸੰਦ":10,"ਕਾਕ":4,"ਸੰਤ":8,"ਕਾਗ":8,"ਕਿਥ":6,"ਕੀਆ":3,"ਕਿਤ":18,"ਾਂ ":954,"਼ੀ ":27,"ਕਿਨ":5,"ਹੋਏ":17,"ਕਿਦ":3,"ਹੋਂ":3,"ਕਾਹ":7,"ਹੋਇ":39,"ਹੋਈ":22,"ਕਿਓ":5,"ਕਾਲ":35,"ਕਾਸ":12,"ਕਾਸ਼":6,"ਕਾਫ":3,"ਕਾਬ":8,"ਕਾਰ":105,"ਕਾਮ":8,"ਕੀਤ":73,"ਕੁਆ":3,"ਕੀਨ":10,"ਹੋਰ":52,"ਹੋਣ":47,"ਕਿਲ":7,"ਕਿਵ":9,"ਕਿਸ":131,"ਕਿਹ":52,"ਹੋਕ":4,"ਕਿਫ":3,"ਕਿਰ":12,"ਹੋਗ":9,"ਹੌਲ":5,"ਕੁਦ":4,"ਕੁਟ":5,"ਕੁਝ":50,"ਕੀਹ":5,"ਕੀਰ":3,"ਹੋਲ":5,"ਕੀਮ":6,"ਹੋਵ":54,"ਾਅ ":10,"ਕੀੜ":4,"ਕੁਸ਼":3,"ਕੁਰ":6,"ਹੌਸ":4,"ਕੁਲ":5,"ਕਿੰ":28,"ਕਿੱ":21,"ਕੁਮ":7,"ਕੂਲ":13,"ਕੁੜ":108,"ਖਣਾ":11,"ਖਣੇ":3,"ਖਤਮ":4,"ਕੁੱ":34,"ਕੁੰ":3,"ਹੇਗ":7,"ਕੂੜ":3,"ਹੈਂ":7,"ਖਤਾ":3,"ਗਇਆ":3,"ਹੇਲ":16,"ਹੈਗ":4,"ਗਈਆ":5,"਼ਾ ":22,"ਹੈਨ":6,"ਹੈਲ":3,"ਖਦਾ":10,"ਖਦੇ":6,"ਕੇਂ":6,"ਖਦੀ":3,"ਹਿੱ":8,"ਹਿੰ":104,"ਹੁਲ":5,"ਕੈਂ":4,"ਗੜ ":3,"ਹੁਸ":4,"ਹੈ।":5,"ਕੇਸ":10,"ਕੇਹ":9,"ਕੈਮ":3,"ਘਾ ":3,"ਕੈਲ":3,"ਕੈਦ":7,"ਕੈਪ":3,"ਕੈਨ":4,"ਹੁੱ":8,"ਹੁੰ":168,"ਕੋਕ":3,"ਕੋਈ":136," ਅਪ":17," ਆਊ":4," ਅਫ":5,"ੱਖਵ":11," ਆਇ":22," ਅਦ":8," ਆਉ":57,"ਕਦੇ":70," ਅਨ":11," ਆਈ":27," ਅਧ":11,"ਕਦੈ":3," ਆਓ":5,"ੱਖੀ":26," ਅਲ":6,"ੱਖਿ":18,"ਕਦੋ":8," ਆਕ":10,"ੱਖਾ":25,"ੱਕੜ":3," ਆਏ":9," ਅਮ":32," ਅਰ":13,"ੱਗਣ":14," ਅਹ":8,"ੱਕੇ":8," ਆਜ":4,"ੱਖਦ":9," ਆਖ":19," ਅਵ":5," ਆਗ":7," ਅਸ਼":3," ਅਸ":90,"ੱਖਰ":10," ਆਤ":4,"ਕਦਾ":27," ਆਟ":3,"ਕਦੀ":39,"ੱਖੜ":6,"ੱਗਿ":7,"ੱਗਾ":10,"ੱਗੀ":7,"ਕਦਰ":7,"ਕਦਮ":3,"ੱਗਦ":24," ਅਜ":16,"ੰਵੇ":3,"ੱਖੇ":10," ਅਚ":3," ਅਗ":7," ਅਕ":29,"ੱਖੋ":3," ਅਖ":11," ਅਣ":14," ਅਤ":34," ਆਂ":24,"ੰਸਦ":4,"ਗਾ ":92,"ਘਟ ":5,"ੱਗੇ":8,"ੰਸਾ":3,"ਖੜ ":4,"ੱਚੇ":11,"ੱਛਦ":6,"ੱਚਿ":8,"ੱਚੀ":19,"ੱਚਾ":22,"ਵਜੋ":5,"ਕਣਕ":3,"ੱਜਣ":21,"ੱਜਤ":4,"ੱਛੇ":16,"ੱਛਿ":3,"ੱਚੋ":7,"ੱਜੇ":5,"ਵਟਾ":4,"ਕਤੀ":8,"ੱਜਲ":3,"ੱਛੋ":3,"ਕਤਲ":5,"ੱਝੀ":3,"ਕਣੀ":4,"ਕਣਾ":4,"ੰਬਾ":3,"ੰਬੀ":3," ਏਂ":3,"ੳਣ ":4,"ੰਮਤ":13,"ਗਲ ":24,"ੰਮਾ":3,"ੰਮੀ":13,"ੰਮ੍":8,"ੰਮੇ":4,"ਕਠੇ":4," ਉੱ":55,"ਕਟਰ":8," ਉਹ":148," ਉਸ":45," ਇੱ":104," ਉਲ":6," ਇੰ":28," ਉਮ":25," ਉਦ":18,"ੲੇ ":5,"ਗਮ ":10," ਉਨ":14," ਉਡ":14," ਉਤ":14," ਉਝ":5," ਉਠ":5," ਉਜ":4," ਉਏ":3,"ਵਧਾ":11," ਉਂ":10,"ਵਧੀ":4," ਇਹ":91," ਇਸ":70," ਆਜ਼":4,"ੱਕਠ":3," ਇਲ":9," ਅੰ":59,"ੱਕਣ":9," ਇਸ਼":6,"ਾ। ":3," ਅੱ":147," ਇਨ":20," ਇਮ":9," ਇਬ":3,"ੱਕਲ":4,"ੱਕਰ":14," ਇਤ":9," ਇਥ":8," ਆਸ਼":5," ਆਹ":15," ਆਸ":17,"ਗਰ ":10," ਇਜ":4,"ੱਕਦ":7," ਅੜ":6," ਆਮ":4,"ੱਖਣ":9,"ੱਕੀ":11," ਆਰ":7,"ੱਕਾ":6," ਆਲ":6," ਇਕ":75," ਆਵ":20," ਆਦ":13," ਆਨ":3," ਆਪ":150," ਕਟ":4,"ਕਸ਼ਾ":7,"ਸਟ ":4," ਕਤ":6," ਕਣ":4," ਕਢ":3," ਕਦ":85," ਕਫ":5," ਕਬ":11," ਕਪ":4,"ੱਧੂ":7,"ਵਨੀ":3," ਕਰ":451," ੨ ":7,"ਗੋ ":5," ਕਮ":48," ਕਲ":22," ਕਸ":8," ਕਹ":127,"ੱਧਵ":3," ਕਾ":144," ਖਟ":5," ਕੀ":203," ਕਿ":379," ਕੂ":4,"ੱਧਰ":4," ਕੁ":236," ਖਤ":4," ਗਇ":3," ਗਈ":54," ਕੇ":258," ਕੈ":30," ਖਬ":6," ਕੋ":200," ਕੌ":26," ੩ ":4," ਗਏ":44," ਕ੍":6," ਖਰ":10,"ੱਦਾ":6," ਐੱ":11,"ੱਪਲ":3,"ਕਸਾ":3,"ਕਸੂ":5," ਓਪ":3," ਓਨ":6," ਓਥ":3,"ਵਪਾ":8," ਓਸ":10," ਓਹ":52," ਔਕ":4," ਔਖ":15,"ਕਹਾ":9,"ਕਹਿ":108," ਕਉ":7,"ਵਫ਼":3," ਕਈ":16," ਔਰ":7,"ਵਫਾ":13," ੧ ":6," ਐਸ":9,"ਸਣ ":3,"ੱਬਰ":3,"ਕਲਮ":5," ਐਵ":10,"ਗੇ ":106,"ੱਬਤ":11,"ਕਲਦ":3,"ੱਪੜ":6,"ਸਤ ":17," ਓਏ":4,"ੱਪੂ":3,"ਕਲੇ":3,"ਕਲਾ":11,"ਕਲਿ":5,"ਕਲੀ":11,"ਵਰਕ":6,"ਵਰਗ":47," ਏਕ":3," ਏਨ":14," ਏਥ":3," ਐਂ":7," ਏਸ":7," ਏਹ":5,"ਸਦ ":3," ਐਕ":4,"ੱਭਰ":4,"ੱਭਦ":7," ਐਮ":3," ਐਨ":11,"ੱਬੇ":8,"ੱਬਾ":21,"ੱਭਣ":10,"ੱਬੂ":9,"ੱਬੀ":4," ਛੰ":3," ਛੱ":45,"ਕਮਨ":5," ਜ਼":41," ਜਿ":267,"ਕਮਰ":3," ਜਾ":373," ਜੁ":17,"ੱਟੀ":15," ਜੀ":107,"ੱਟਿ":7,"ੱਟਾ":13," ਜੂ":6," ਜੇ":132,"ਕਮਲ":20," ਜੈ":8,"ੱਟੇ":11," ਜੋ":101,"ਕਬੱ":3,"ਕਮੀ":6,"ਕਮਿ":5,"ਕਮਾ":7," ਟਕ":3," ਜੰ":18," ਜੱ":52,"ਕਮੇ":7," ਝੜ":4,"ੱਟਗ":3,"ੱਟਣ":10," ਝਾ":3," ਜੜ":5,"ਸਨ ":12," ਝੂ":19," ਝੁ":7,"ਕਰਕ":36,"ੱਟਦ":11," ਝੋ":5,"ਕਰਜ":5," ਚੋ":64," ਚੌ":5,"ਕਰਤ":13,"ਕਰਦ":109,"ਕਰਨ":63,"ਵਲੋ":9,"ੱਡਾ":9,"ੱਡਿ":6," ਜਖ":6," ਜਗ":14," ਚਿ":29," ਚਾ":84," ਚੁ":29," ਚੀ":20," ਛਡ":8,"ੱਡੀ":25,"ਕਰਮ":13,"ੱਡੇ":12,"ਕਰਲ":5," ਚੇ":16,"ਕਰਵ":14," ਚੈ":10," ਚੂ":4,"ਕਰਹ":3,"ਕਰਾ":22," ਚੰ":52," ਜਲ":8," ਚੱ":27," ਜਰ":23," ਜਮ":9,"ਕਰੀ":42," ਛੋ":7," ਜਬ":5,"ਕਰਿ":8," ਜਸ":5," ਜਹ":11,"ਕਰੇ":23," ਜਵ":27,"ੱਠਾ":8,"ੱਠੀ":9," ਛੁ":9,"ਕਰੋ":36,"ਸ਼ਕਲ":3," ਛਿ":5," ਛਾ":12," ਚੜ":21," ਜਜ":3,"ੱਡਦ":4,"ਕਲਗ":3,"ੱਠੇ":5," ਜਪ":9," ਜਨ":25," ਛੇ":6," ਜਦ":84," ਜਥ":3," ਜਤ":6," ਗੰ":10," ਚਕ":3," ਗੱ":82," ਘੈ":3," ਘੋ":6,"ਸ਼ਕਿ":4,"ੱਤਲ":3," ਘੁ":7,"ੱਤਰ":27,"ਗਿ ":3," ਘੇ":3," ਘਾ":3," ਘਿ":3,"ਸਬ ":9," ਘੱ":18,"ਕਪੂ":3," ਚਲ":35," ਚਹ":5," ਚਪ":4," ਚਰ":13," ਚਮ":3,"ਗੀ ":173,"ਕਫਨ":3," ਘੜ":3,"ਸਭ ":26," ਕੱ":72,"ੱਦਤ":3," ਗਰ":25," ਗਲ":33," ਕੰ":44," ਖੋ":24," ਗਮ":4,"→":5,"↓":40," ਖੇ":26," ਖੂ":12,"ਕਬਰ":3," ਖਾ":54," ਖਿ":25,"ੱਦਲ":3," ਖੁ":49,"ੱਥੇ":25," ਗਜ":4," ਖ਼":9," ਕੜ":5,"ੱਥੋ":3,"ਗੁ ":7,"ੱਤਾ":29,"ਸਮ ":9," ਖੱ":10,"ੱਤੀ":18,"ੱਤਿ":7," ਖੰ":8," ਘਰ":54," ਗ੍":17," ੫ ":3,"๋ ":3," ਗੋ":17," ਗੈ":17," ਗੇ":14,"ੱਥਰ":5," ਗੁ":89," ਗੂ":3," ਗਿ":88," ਗੀ":7," ਖੜ":17," ਗਾ":36," ਘਟ":10," ਗ਼":5,"ੱਤੇ":39," ਗਹ":5,"ਗੂ ":8,"ੰਗਦ":4," ਤਬ":6,"ੰਗਤ":9," ਤਮ":3,"ੰਗਣ":5," ਤਰ":33," ਢੱ":3," ਤਲ":4," ਤਨ":4," ਤਾ":332," ਤਿ":35," ਤੀ":12," ਤੁ":70," ਤੂ":143," ਤਸ":8,"ੰਘਦ":4,"ੰਗੀ":18,"ੰਗਿ":6,"ੰਗਾ":30,"ੰਗਰ":10,"ੰਗਲ":15," ਡੱ":4," ਤਕ":21," ਤੱ":27," ਤੰ":7," ਦਲ":6," ਦਵ":7," ਦਮ":4," ਦਰ":40," ਦਫ":6," ਥੌ":3," ਥੋ":18," ਦੂ":29,"ਵੋ ":14," ਦਾ":413," ਦਿ":316," ਦੀ":456," ਦੁ":107," ਦਸ":16," ਦਹ":5,"ੰਕਾ":3," ਤ੍":5," ਤੌ":8," ਤੋ":204," ਤੈ":48," ਤੇ":673," ਤੜ":5," ਥਾ":19," ਟੀ":11,"ੰਚਾ":7," ਟੁ":22," ਟੇ":6," ਟੈ":7,"ੰਚੇ":4," ਟੋ":11," ਠਰ":5,"ਲੜਕ":7," ਝੰ":10," ਟਰ":9," ਝੱ":5," ਟਾ":11," ਡੇ":6," ਡੈ":3,"ੰਘਾ":3," ਡੂ":3,"ੰਗੜ":4," ਡੋ":3,"ੰਗੇ":11," ਠੱ":5," ਠੰ":9," ਢਿ":3," ਢਾ":4," ਠੇ":3," ਠੀ":7," ਡਰ":18," ੴ ":7," ਠੋ":4," ਟੱ":11," ਡਿ":12," ਡਾ":14," ਬੇ":70," ਬੋ":44," ਬੈ":41," ਬਾ":152," ਬਿ":77," ਫੜ":15," ਬੂ":10," ਬੀ":19," ਬੁ":61," ਭਗ":5," ਬਹ":84," ਬਸ":22," ਫੋ":23," ਪੱ":50," ਬਲ":23," ਪੰ":81," ਬਰ":12," ਬਥ":12," ਬਦ":36," ਫੇ":35," ਬਨ":8," ਫੈ":15," ਬਜ":4,"ਖਲ ":3," ਫ਼":15," ਪੜ":33," ਫਾ":16," ਫਿ":65," ਫੁ":25," ਬਣ":91," ਬਖ":6," ਫਸ":10," ਬਚ":17," ਪੋ":13," ਪ੍":66," ਫਰ":17," ਮੌ":37," ਮੋ":46," ਮੈ":262," ਮੇ":214," ਮੂ":22," ਮੀ":17," ਮੁ":188," ਮਾ":202," ਮਿ":157," ਭੜ":4," ਮਹ":40," ਮਸ":10," ਮਸ਼":3," ਯਕ":3," ਬੱ":61," ਬੰ":54," ਮਲ":5," ਮਰ":61," ਭੋ":8," ਮਦ":5," ਮਨ":48," ਭੇ":22," ਭੈ":6," ਭੁ":64," ਭੂ":4," ਮਤ":7," ਬੜ":38," ਭਾ":74," ਭਿ":6,"ਖਰ ":5," ਭੀ":4," ਮਜ":14," ਮਗ":4," ਭਲ":6," ਫੱ":6," ਬ੍":4," ਬੌ":3," ਭਰ":44,"ਲੜਾ":6," ਨਹ":235," ਨਸ":10," ਨਿ":85,"ਓਹਨ":6," ਨਾ":548," ਧੜ":10,"ਓਹਦ":8," ਨੂ":411," ਨੁ":8," ਨੀ":182," ਨੇ":299," ਪਈ":13," ਨਫ":9," ਧੋ":17," ਦੰ":4," ਦੱ":43," ਨਰ":7," ਨਸ਼":7,"ਓਹੀ":5," ਨਵ":27," ਨਚ":3," ਨਜ":6,"ਓਸਨ":3," ਧੀ":7," ਧਿ":11," ਧੂ":3," ਧੁ":5,"ਗਏ ":43,"ਖਮ ":6," ਨਈ":17," ਧਨ":12," ਦੇ":530," ਦੋ":61," ਦੌ":10," ਦ੍":3," ਧਰ":23," ਥੱ":9," ਨਕ":7," ਨਖ":4," ਨਗ":6," ਪੁ":86," ਪੀ":27," ਪਿ":190," ਪਾ":158," ਪੈ":80," ਪੇ":35," ਬਈ":4," ਫਤ":5," ਪੂ":24," ਪਰ":147," ਪਸ":11," ਪਹ":53," ਪਵ":8," ਪਲ":28," ਨੰ":14," ਨੱ":9," ਪਟ":13," ਪਛ":5,"ਕੋ ":15," ਪਥ":4," ਪਤ":33," ਨੌ":11," ਪਏ":6," ਨੈ":9," ਨੋ":6," ਧੰ":11,"ਸ਼ਾ ":11,"ੰਨਵ":4," ਲੜ":18,"ਖੋ ":21," ਲੰ":29,"ੰਧੀ":3," ਲੱ":136,"ਈ ":537,"ੰਧਾ":3," ਵਡ":5," ਵਟ":4," ਵਜ":9,"ੰਦੇ":113," ਵਕ":10,"ੰਦੀ":120," ਵਲ":11,"ੰਦਾ":131," ਸ਼ਕ":4,"ੰਦਿ":6,"ੰਦੂ":6," ਵਰ":57,"ਉ ":56," ਵਪ":8," ਵਫ":3," ਵਧ":21," ਵੀ":320," ਵਿ":282," ਵਾ":285,"ੰਦਰ":44," ਵਸ":8," ਵਹ":6," ਸ਼ਰ":21," ਵੇ":77," ਵੈ":18," ਵੋ":7,"ੰਦਗ":64,"ਊ ":6," ਸ਼ਿ":4," ਸ਼ਾ":12," ਸ਼ੁ":9," ਸ਼ਹ":7," ਵੜ":5," ਵੰ":4," ਵੱ":87," ਸਕ":66," ਸਖ":6," ਸਗ":3," ਸ਼ੇ":5," ਸ਼ੋ":3," ਸ਼ੌ":4," ਸ਼੍":4," ਰਖ":12," ਰਗ":3," ਭੱ":7,"ੰਬਰ":15," ਭੰ":3," ਯਾ":158," ਰਜ":4," ਮਜ਼":4," ਯੂ":4,"ਖੇ ":41," ਮੰ":88," ਰਲ":3," ਮੱ":16," ਰਾ":121," ਰਿ":60," ਰਸ":7," ਰਹ":116," ਰੇ":10," ਲਈ":109," ਰੁ":33," ਰੀ":6," ਰੂ":23," ਲਏ":7," ਰੌ":7," ਰੋ":88," ਲਕ":3,"ਸ਼ੀ ":11," ਲਓ":4," ਲਖ":8," ਲਗ":44," ਰੜ":3," ਲਫ":3,"ਔਰਤ":6," ਰੰ":23," ਰੱ":136," ਲਵ":16," ਲਹ":5," ਲਾ":103," ਲਿ":61," ਲੀ":5," ਲੁ":16,"ੰਨਿ":11,"ੰਨਾ":34,"ਏ ":361," ਲੇ":18," ਲੈ":94,"ੰਨੇ":16," ਲੋ":90,"ੰਨੂ":3,"ੰਨੁ":4,"ੰਨੀ":21,"ਲੰਘ":12,"ਲੰਗ":8,"ਗਤ ":10,"ਲੰਬ":3,"ਲੰਡ":4,"ਲੱਗ":71,"ਲੰਮ":4,"ਲੱਖ":30,"ਲੱਕ":4,"ਂ ":2092," ਿਜ":5,"ਖੁ ":6,"ੰਝੂ":6,"ੰਜਰ":6," ↓":33," →":5," ਿਪ":3,"ਗਣ ":13,"ੰਜੂ":3," ਿਦ":5,"ੰਜਿ":6,"ੰਜਾ":64," ਸਭ":40," ਸਬ":17," ਸਮ":88,"▓":24," ਸਨ":9," ਸਫ":10," ਸਪ":11," ਸਵ":35,"ੰਤਜ":3," ਸਰ":80," ਸਲ":14," ਸਜ":7," ਸਟ":13,"ੰਤਨ":4," ਸਚ":10," ਸਤ":30," ਸਦ":25,"ੰਤਰ":21," ਸਣ":7," ਹਰ":72," ਸ੍":9," ਹਮ":31," ਸੌ":14," ਸੋ":95," ਸੈ":8," ਹਸ":6," ਹਵ":7," ਹਲ":7,"ਅ ":14," ਸਾ":415," ਹਟ":3," ਸਿ":155," ਸ਼":66,"ਖੀ ":41," ਹਜ":8," ਸਹ":45," ਹਨ":30," ਸੇ":15," ਹਥ":8," ਹਦ":3," ਸੂ":25," ਸੀ":183," ਸੁ":108," ਹੌ":14," ਹੋ":335,"ੰਡੀ":26,"ਆ ":812," ਸੱ":84,"ਲੱਭ":23," ਸੰ":57,"ੰਡਿ":8,"ੰਡਾ":33,"ੰਡੇ":23," ਸਜ਼":5," ਸੜ":18," ਹਾ":127," ਹਿ":22," ਹੀ":169," ਹੁ":225,"●":7,"ਕੜ ":10," ਹੇ":9," ਹੈ":219,"ਵਕਤ":9," ਹੰ":14,"ਇ ":14," ਹੱ":63," ਹੜ":4,"ੰਡਨ":3,"ੰਡਰ":3,"ਖਾ ":42,"ਟ ":156,"ਸ਼ਿਸ਼":5,"ਕਲ ":22,"ਸ਼ੀਨ":3," ਐ ":16,"ਝ ":112,"ਸ਼ੁਰ":5," ਏ ":147,"ਜ ":183,"ਹਲ ":3,"ਵੜਗ":3,"ਛ ":7,"ਸ਼ਾਂ":4,"ਕਸ ":7,"ਚ ":438," ਕ ":5,"ਸ਼ਾਮ":4,"ਸ਼ਾਨ":7,"ਸ਼ਿਕ":5,"ਸ਼ਾਹ":8,"ਸ਼ੀਆ":7,"ਘ ":40,"ਸ਼ਿਆ":4," ਓ ":15,"ਹਿ ":52,"ਗ ":151," ਚ ":202,"ਹਾ ":106,"ਖ ":193,"ਕ ":463,"ਹੁ ":14,"ਸ਼ੋਕ":3,"ਹੀ ":353,"ਓ ":90,"ਸ਼ੁੱ":3,"ਕਮ ":5,"ੀ। ":5,"ਸ਼ੇਰ":5,"ਕਰ ":110,"ਐ ":23,"ਖਤ ":6,"ਵੰਤ":3,"ਵੰਡ":4,"ਰ ":1353,"ਵੱਖ":13,"ਹੇ ":52,"ਵੱਧ":13,"ਵੱਜ":4,"ਵੱਟ":7,"ਵੱਡ":20,"ਵੱਢ":3,"ਭ ":48,"ਵੱਸ":7,"ਹੈ ":187,"ਵੱਲ":19,"ਸਕਦ":33,"ਗਈ ":50,"ਮ ":247,"ਸਕਣ":3,"ਫ ":32,"ਕੇ ":354,"ਖਨ ":3,"ਹੂ ":5,"ਬ ":214,"ਕੈ ":4,"ਸ਼੍ਰ":4," ਤ ":3,"ਔਕਾ":4,"ਪ ":68,"ਔਖਾ":13,"▓▓ ":4,"ਸਚਾ":3,"ਓਥੇ":3,"ਧ ":41,"ਕ਼ ":6,"ਨ ":545,"ਸਜ਼":3,"ਥ ":42," ਨ ":16," ●":7,"ਓਨੇ":3,"ਕਾ ":64,"ਦ ":229,"ਕਿ ":66,"ਓਪਨ":3,"ਸਖਤ":4," ਮ ":3,"ਸਕੂ":13,"ਸਕਿ":5,"ਸਕੀ":6,"ਸਕਾ":6,"ਸਕੇ":4,"ਣ ":437,"ਕੀ ":164," ▓":4,"ਹੋ ":101,"ਤ ":437,"ਕੁ ":13,"ਠ ":32,"ਡ ":110,"ਕੂ ":3,"ਖਣ ":12,"ਢ ":9,"ਵੀਰ":20,"ਾ ":3094,"ਵਿਰ":12,"ਵਿਹ":6,"ਵੀਚ":3,"ਵਿਸ":7,"ਵਿਵ":4,"ਵੀਟ":5,"ਵੀਡ":36,"ਵਾਬ":8,"ਵਾਪ":6,"ਸ਼ਟਰ":6,"ਵਾਰ":93,"ਵਿਕ":16,"ੁ ":118,"ਵਾਲ":158,"ਵਾਸ":9,"ਵਿਗ":4,"ਵਿਖ":5,"ਵਾਹ":64,"ਵਿਚ":75,"ਵਿਛ":8,"ਵੀਂ":17,"ੀ ":3702,"ਵੀਆ":4,"ਵਿਦ":6,"ਵਿਧ":9,"ਵਾਉ":4,"ਵਾਏ":5,"ਵਾਕ":20,"ਵਾਗ":11,"ਵਾਜ":9,"ਿ ":203,"ੰਜ਼ਿ":5,"ਵਿਅ":5,"ਵਿਆ":10,"ਵਾਦ":18,"ਵਾਧ":7,"ਵਾਨ":25,"ਸਲ ":6,"ੱਸੋ":7,"ੱਸੇ":4,"ਵਾਈ":17,"ਵਾਇ":5,"ਵਾਂ":78,"ਹ ":355,"ਸਰ ":13,"ੱਸਦ":13,"ੱਸਣ":5,"਼ ":67,"ੱਸੀ":10,"ੱਸਿ":6,"ਵਹਿ":6,"ਵਹੁ":3,"ੱਸਾ":11,"ਸ਼ ":44,"ਸਿ ":4,"ਵ ":15,"ਵੈਲ":5,"ਵੈਰ":8,"ਸਾ ":32,"ਵੇਹ":3,"ਵੇਲ":13,"ਸ ":333,"ਵੇਰ":8,"ਵੇਗ":27,"ਵੇਖ":39,"ੱਲੇ":39,"ਵੇਚ":6,"ੱਲੋ":21,"ਵੇਟ":3,"ਵੇਂ":50,"ਸ਼ ":22,"ਕਉ ":7,"ਲ ":803,"ੱਲੀ":26,"ੱਲਿ":10,"ੱਲਾ":39,"ਸ਼ਤੇ":6,"ੱਲਰ":5,"ਵੁੱ":3,"ੱਲਦ":11,"ੱਲਣ":4,"ਵਿੰ":4,"ਵਿੱ":116,"ਸ਼ਰਾ":9,"ਸ਼ਰੀ":5,"ਕਤ ":12,"ਸੇ ":139,"ਹਨ ":31,"ਹਥ ":4,"ਸ਼ਰਧ":3,"ਕਣ ":14,"ਐੱਚ":3,"ਹਣ ":6,"ਸ਼ਮਣ":3,"ੋ ":527,"ਹਤ ":8,"ਐੱਸ":6,"ਕਦ ":3,"ੌ ":21,"ਸੀ ":245,"ਵੋਟ":3,"੍ ":4,"ਸੁ ":7,"ਸ਼ਹਿ":3,"ㅤ ":12,"ਹਰ ":59,"ੇ ":3758,"ੈ ":351,"ਸੌ ":3,"ღ ":3,"ਹਮ ":5,"ੂ ":265,"ਹਬ ":4,"ਸੋ ":18,"ਸੈ ":4,"ਕਟ ":5," ٠·":4,"ਰਸਤ":12,"ਰਸ਼":7,"ਰਸਾ":4,"ਰਸਿ":4,"ਰਸੀ":5,"ਐਵੇ":10,"ਰਹਿ":51,"ਰਹੀ":20,"ਰਹਾ":10,"ਰਹੇ":19,"ਰਹੁ":3,"ਰਹੂ":3,"ो ":4,"ਰਹੋ":6,"ਰਾਇ":3,"ਰਾਉ":3,"ਰਾਈ":7,"ਰਾਂ":157,"ਰਾਜ":20,"ਰਾਖ":4,"ਰਾਗ":7,"ਰਾਕ":3,"ਰਾਬ":14,"ਰਾਨ":6,"ਰਿਆ":34,"ਰਾਤ":25,"ਰਾਣ":6,"ਰਾਸ਼":10,"ਰਾਸ":6,"ਰਾਹ":32,"ਰਾਲ":3,"ਰਿਕ":3,"ਰਾਵ":11,"ਰਾਮ":21,"ਰਾਰ":4,"ਰਿਫ":7,"ਰਿਮ":4,"ਰੀਏ":19,"ਰਿਭ":4,"ਰੀਅ":5,"ਰਿਤ":13,"ਰੀਆ":47,"ਰੀਂ":11,"ਰਮਾ":12,"ਰਮੀ":10,"ਰਮੈ":3,"ਮੰਗ":27,"ਮੰਡ":8,"ਮੰਜ":6,"ਮੱਕ":3,"ਮੱਖ":4,"ਰਲਾ":5,"ਮੱਝ":6,"ਮੰਨ":11,"ਮੰਦ":12,"ਮੰਤ":17,"ਮੰਮ":8,"ਲੇ ":213,"ਮੰਜ਼":5,"ਰਲੋ":3,"ਲੈ ":42,"ਰਲੇ":3,"ਰਵਾ":35,"ਲੋ ":45,"ਰਸ਼ਨ":5,"ਰੇਜ਼":3,"ㅤ":108,"ਰੋਜ":14,"ਰੋਟ":8,"ਰੋਣ":6,"ਰੋਧ":6,"ਰੋਮ":4,"ਰੋਲ":5,"ਰੋਸ":5,"ਰੋਹ":7,"ਰੋਂ":14,"ਰੋਈ":3,"ਰੋਇ":7,"ਰੋਕ":8,"ਰੋਗ":8,"ਰੋਜ਼":4,"ਰੋੜ":10,"ਓਸ ":5,"कु":3,"ਓਹ ":33,"ਰੁਪ":4,"ਰੁਕ":4,"ਰੀਰ":3,"ਰਿਫ਼":4,"ਰੀਤ":14,"ਰੀਦ":7,"ਰੀਬ":9,"ਰੀਮ":9,"ਰੀਫ":5,"ਰੀਕ":16,"ਰਿਸ਼":10,"ਰਿਵ":13,"ਰਾਜ਼":4,"॥ ":96,"ਰਿਸ":16,"ਰਿਹ":35,"ੰਗ ":53,"ਰੂਹ":14,"। ":51,"ਕਈ ":15,"ਰੂਤ":4,"ਰੂਪ":9,"ੰਘ ":39,"ਰੂਰ":30,"ਰਿੰ":6,"ਰੁਲ":3,"ਰੁਸ":5,"ਰੀਜ਼":3,"ਲਈਏ":3,"ੰਚ ":6,"ਰੁੱ":15,"ਰੇਲ":6,"ਰੇਸ਼":5,"ਰੈਕ":4,"ਰੇਪ":4,"ਰੇਮ":6,"ਲੜ ":3,"ਰੇਗ":10,"ਰੇਜ":6,"ਰੇਖ":4,"ਰੇਕ":6,"ੰਜ ":10,"ਰੇਂ":4,"ਰੇਆ":3,"ਰਗੇ":13,"ਲਮ ":14,"ਰਕੇ":38,"ਰਖੀ":4,"ਐਕਟ":3,"ਰਗੀ":25,"ਰਗਾ":11,"ति":4,"ਰਜੀ":11,"ਰਜਾ":16,"ਰਜ਼":7,"ਮਜ਼ਦ":3,"↓↓ ":7,"दर":3,"ਰਚੇ":3,"ਲਰ ":6,"ς੭ ":3,"ਮੌਸ":3,"ਮੋੜ":13,"ਲਣ ":14,"ਮੌਤ":21,"ਮ੍ਰ":8,"ਲਤ ":11,"ਓਏ ":4,"ਰਕਸ":3,"ਰਕੀ":3,"ਰਕਾ":45,"ਭੰਗ":3,"ਭੱਜ":4,"रत":4,"ਰਪਤ":8,"ਰਨੀ":8,"ਰਨਾ":28,"ਲਾ ":192,"ਰਨਜ":4,"ਰਧਾ":12,"ਰਦੁ":3,"ਰਦੀ":54,"ਰਦਿ":5,"ਰਦਾ":107," ㅤ":16,"ਰਦੋ":3,"ਰਦੇ":54," ਈ ":23,"ਰਬਾ":20,"ਲੂ ":3,"ਰਬਜ":3,"ਰਪੰ":5,"ਲੁ ":3,"ਰਪਾ":8,"ਲੀ ":186,"ਯੋਗ":6,"है":3,"सु":5,"ਰਟੀ":6," ਆ ":188,"ਯਾਰ":100,"ਯਾਤ":4,"ਯਾਦ":51,"ਰਦਰ":5,"ਰਥੀ":7,"ਰਤੇ":3,"ਰਤਾ":22,"ਰਤਿ":7,"ਰਤੀ":20,"ਰਤੂ":3,"ਐਨੀ":5,"ਲਸ ":11,"िस":3,"ਲੀਡ":3,"ਲਿਸ":4,"ਲਾਜ਼":3,"ੱਤ ":47,"ਲੀਏ":12,"ਲੁਟ":4,"ੱਣ ":5,"ੰੂ ":4,"ੱਦ ":13,"ਲਿੱ":10,"ਲਿੰ":3,"ੱਥ ":18,"ैं":3,"ੱਠ ":11,"ੱਟ ":63,"ਲਾਂ":81,"ਲਾਇ":9,"ਲਾਈ":24,"ਲਾਉ":23,"ਵਲ ":6,"ਲਾਡ":3,"ਲਾਟ":3,"ुद":3,"ਲਾਜ":3,"ਲਾਫ":12,"ਲਾਨ":3,"ਲਾਤ":15,"ਲਿਆ":79,"ਲਾਓ":3,"ੱਢ ":7,"ਲਾਗ":4,"ਲਾਕ":13,"ੱਡ ":40,"ਲੀਆ":27,"ਲਾਰ":7,"ਲਾਲ":9,"ਲਿਓ":3,"ਸ਼ਕ ":5,"ਲਾਬ":5,"ਲਾਮ":9,"ਲਾਹ":8,"ਲਾਸ":10,"ਲਿਖ":29,"ਲਾਵ":11,"ਲਿਕ":3,"ਲਾਸ਼":6,"ੱਬ ":68,"ਲਸਾ":8,"ਲਹਿ":3,"ਲਹੂ":3,"ਏਗੀ":4,"्र":3,"ੱਭ ":12,"ਵਰ ":7,"ਰੱਬ":83,"ੱਧ ":20,"ੱਪ ":16,"ਲਵਾ":16,"ਲਵੇ":7,"ਲਵੋ":5,"ਵੇ ":137,"ਸ਼ਨ ":19,"ਵੈ ":13,"ਲ੍ਲ":3,"ਸ਼ਤ ":3,"ਲ੍ਹ":12,"ਲੋੜ":18,"ਐਂਵ":4,"ਲੋਹ":4,"ੱਲ ":116,"ਲੈਣ":25,"ਲੇਵ":4,"ਵਾ ":58,"ਲੈਦ":5,"ਲੋਨ":5,"ਏਨਾ":6,"ਏਨੀ":8,"ਲੋਂ":36,"ਲੋਕ":62,"ਵੀ ":274,"ਓਂ ":5,"ੱਸ ":47,"ਲੁੱ":8,"ਲੇਖ":7,"ਲੇਟ":4,"ਲੇਣ":3,"ਲੈਂ":18,"ਲੇਦ":3,"ਲੈਕ":3,"ਲੇਲ":5,"ਲੇਆ":5,"।।":6,"ੰਤ ":11,"੫੪੫":7,"ੰਡ ":27,"ਲਜ਼":4,"ੰਟ ":16," ॥੧":9,"ੰਝ ":4,"ੰਬ ":4,"॥੧":9,"ਲਕੇ":3,"ਲਗਦ":23,"ਲਗੀ":7,"ਲਗਾ":12,"ੰਨ ":25,"ੰਧ ":3,"ਲਕਾ":9," ।।":5,"ੰਦ ":39,"ੰਥ ":4,"ਲਲਲ":6,"ਰੱਖ":53,"ਰੱਕ":4,"ੱਕ ":150,"ਰੰਥ":5,"ਰੰਭ":3,"ਵਨ ":5,"ਰੰਗ":21,"ੱਖ ":104,"ਰੰਟ":3,"ਵਧ ":6,"हैं":3,"ਲਮਾ":5,"ਐਸ ":3,"ਵਣ ":10,"ੰਭ ":4,"ੰਮ ":22,"ੱਝ ":23,"ੱਛ ":4,"ਲਦੀ":24,"ਲਦਾ":39,"ੱਜ ":86,"ਲਦੇ":19,"ਲਤਾ":3,"ਲਤੀ":6,"ੰਹ ":11,"ੱਚ ":127,"ਲਣਾ":5,"ੱਗ ":43,"ਰਸ ":22,"ਅਦਾ":7,"ਆਉਂ":24,"ਭੂਤ":3,"ੌੜੀ":5,"ਮਣੇ":7,"ਰਹ ":3,"ਅਧਿ":8,"ਭੁੱ":43,"ਮਤਲ":3,"ਮਣੀ":3,"ਆਊਗ":3,"ਆਉਣ":16,"ਆਉਦ":14,"ਮਤਾ":3,"ਮਤਿ":6,"ਮਤੀ":4,"ਅਪਣ":8,"ਮਦਰ":3,"ਮਦਦ":3,"ਈਟ ":4,"੍ਹਦ":3,"ਅਣਖ":6,"ਮਦਾ":4,"੍ਹੇ":10,"੍ਹਿ":3,"ਮਨਪ":4,"੍ਹਾ":29,"੍ਹੀ":6,"ਅਣਮ":3,"ਇਸ ":43,"ਭੇਦ":3,"ਮਨਜ":3,"ਭੇਜ":12,"ਰਾ ":216,"ਮਨੇ":3,"ਭੈਣ":5,"ਇਹ ":69,"ਮਨਾ":15,"ਮਨੁ":7,"ਰਿ ":23,"ਅਤੇ":32,"ਆਇਆ":23,"ਈਕ ":4,"ਮਜ਼":3,"ਮਝਦ":3,"ਮਝਣ":5,"ਮਜੀ":5,"ਮਜਾ":3,"ਰਲ ":3,"ਆਂਗ":4,"ਮਝਾ":4,"ਆਂਦ":3,"ਭਾਅ":3,"ਭਾਈ":12,"ਮਝੋ":5,"ਭਾਉ":10,"ਭਾਜ":8,"ਬੜਾ":16,"ਭਾਗ":4,"ਭਾਰ":22,"ਭਾਣ":3,"ਬੜੀ":17,"ਬੜੇ":6,"ਭਾਲ":6,"ਭਾਵ":18," ●๋":3,"ਅਜੀ":3,"ਭਿੰ":3,"ਭੁਲ":19,"ਅਜੇ":5,"ਇਲ ":3,"ਅਸਤ":3,"ਉਏ ":3,"ਅਸਲ":6,"ਭਲਾ":4,"ਫੱਟ":5,"ਰਨ ":73,"ਆਗੂ":4,"ਭਰੇ":4,"੍ਰਕ":5,"ਮਕੀ":3,"ਅਹਿ":9,"ㅤㅤ":88,"ਅਸੀ":69,"ਅਸੂ":3,"ਅਸਾ":7,"ਮਗਰ":3,"ਰਬ ":5,"ਰਫ ":7,"ਅਵਾ":4,"ਆਕੜ":7,"ਰਮ ":21,"ਆਖਰ":9,"ਆਖਦ":4,"ਬੇੜ":3,"ਅਰਜ":4,"ਬੈਠ":33,"ਅਮਰ":12,"ਅਮਲ":13,"ਅਮੀ":5,"ਰਟ ":8,"ਯਾ ":14,"ਬੋਤ":6,"ਬੋਰ":4,"ਬੋਲ":28,"ਬੋਹ":3,"ਅਰਮ":3,"ਰਡ ":4,"ਰਤ ":33,"ਬ੍ਰ":3,"੍ਰੋ":9,"੍ਰੇ":16,"ਉਂ ":23,"ਰਣ ":5,"੍ਰਭ":5,"੍ਰਧ":9,"ਅਪਨ":4,"੍ਰਦ":7,"੍ਰੀ":38,"੍ਰਿ":29,"੍ਰਾ":3,"੍ਰਸ":9,"ਰਦ ":14,"ਭਰਦ":9," ㅤㅤ":15,"ਭਰਾ":5,"ਭਰਿ":4,"ਭਰੀ":5,"ਭਰੂ":7,"੍ਰੰ":4,"ਆਪਾ":21,"ਆਪਿ":3,"ਰਜ਼ ":4,"ਮੇਂ":14,"ਆਪਨ":3,"ਮੇਸ":6,"ਆਫੀ":3,"ਮੇਸ਼":6,"ਮੇਵ":3,"ਮੈਕ":3,"ਮੇਲ":12,"ਮੇਰ":190,"ਮੈਂ":125,"ਮੇਟ":6,"ਆਪੇ":3,"ਆਪੋ":4,"ਆਨੀ":3,"ਮੂੰ":13,"ਆਪਣ":100,"ਲਜ ":3,"ਆਪਕ":5,"ਆਦਾ":15,"ਆਦਤ":8,"ਮੌਕ":6,"ਮੋਹ":13,"ਮੋਸ":3,"ਮੋਤ":4,"ਮੋਢ":5,"ਮੋਟ":5,"ਮੋਦ":4,"ਉਝ ":4,"ਲਟ ":3,"ਆਤਮ":4,"ਮੇਹ":8,"ਆਣਾ":9,"ਆਣਿ":3,"ਮੈਡ":8,"ਇਆਂ":3,"ਆਣੀ":4,"ਆਣੇ":5,"ਮੈਨ":70,"ਰਫ਼ ":3,"●๋ ":3,"ਮਾਗ":9,"ਮਾਮ":16,"ਲਕ ":9,"ਮਾਪ":5,"ਮਾਨ":43,"ਮਿਆ":3,"ਮਾਤ":3,"ਮਾਣ":18,"ਮਿਟ":4,"ਮਿਠ":6,"ਮਾਸ":11,"ਮਾਹ":4,"ਮਿਕ":5,"ਮਾਵ":9,"ਮਾਸ਼":3,"ਮਾਰ":67,"ਮਾਲ":15,"ਲਖ ":8,"ਮੀਆ":5,"ਮੀਂ":3,"ਮਿਤ":7,"ਮਹੱ":3,"ਲਓ ":4,"ਭੜਕ":4,"ਮਾਈ":3,"ਮਾਂ":58,"ਮਾਇ":4,"ਮੁਹ":13,"ਮੁਸ":6,"ਮੁਸ਼":4,"ਮਿੱ":34,"ਮੂਲ":3,"ਮੂਹ":9,"ਮੁੜ":8,"ਮੁੰ":43,"ਮੁੱ":61,"ਮਿਲ":87,"ਮਿਸ":6,"ਮਿਸ਼":4,"ਮਿਹ":6,"ਮਾੜ":19,"ਮੁਆ":4,"ਮੀਨ":7,"ਮੀਦ":4,"ਲਗ ":7,"ਮੀਰ":9,"ਮੁਖ":3,"ਮੁਕ":11,"ਮੀਹ":4,"ਮੁਟ":8,"ਮੁਬ":5,"ਮੁਰ":5,"ਮੁਲ":17,"ਮਿੰ":11,"ਰੋ ":54,"ਯਕੀ":3,"ਬੱਸ":16,"ਬੱਲ":6,"ਆਸ਼":4,"ਰੈ ":3,"ਆਸਾ":4,"ਬੱਬ":9,"ਬੱਦ":3,"ਮਲੇ":19,"ਮਹਿ":18,"ਮਹੀ":4,"ਮਹੁ":3,"ਮਹਲ":9,"ਆਵੈ":3,"ਆਵੇ":9,"ਲਏ ":6,"ਆਸ਼ਕ":3,"ਆਵਾ":11,"ਇਕਾ":4,"ਇਕੀ":3,"ਇਕੋ":3,"ਮਸਤ":4,"ਇਕਠ":3,"ਰੂ ":98,"ਆਲੇ":4,"ਆਲਾ":7,"ਰੁ ":13,"ਭੋਰ":3,"ਭੋਜ":3,"ਆਰੇ":13,"ਆਰੀ":9,"ਆਰਾ":12,"ਰੀ ":386,"ਆਰਿ":3,"ਬੰਧ":5,"ਬੰਦ":50,"ਬੰਨ":4,"ਰੇ ":343,"ਬੱਚ":19,"ਮਲਾ":13,"ਮਲਿ":6,"ਮਲੀ":22,"ਬੱਡ":3,"ਆਰਥ":5,"ਮਰੂ":3,"ਮਰੇ":6,"ਲਈ ":104,"ਮਰਦ":12,"ਮਰਨ":9,"ਉਣ ":71,"ਮਰਤ":3,"ਮਰਾ":6,"ਮਰਿ":5,"ਮਰੀ":10,"ਲਆ ":4,"ਆਬਾ":3,"ਮਰਜ":19,"ਇਥੇ":7,"ਬਣਦ":7,"ਇਦਾ":4,"ਬਣਨ":4,"ਬਣੀ":5,"ਬਣਾ":42,"ਫੁੱ":16,"कुद":3,"ਇਨਾ":5,"ਇਨਸ":15,"ਜ਼ਮ ":5,"ਬਥੇ":12,"ਬਦਨ":8,"ਬਦਲ":25,"ਪੜਿ":10,"ਪੜੇ":8,"ਪੜ੍":7,"ਫਿਕ":11,"ਫਿਲ":11,"ਫਿਰ":44," ↓ ":26,"ਫੀਕ":3,"ਇਬਾ":3,"ਜ਼ਲ ":3,"ਬਣਕ":4,"ਫੁਲ":4,"ਇਮਤ":4,"ਮਰ ":27,"ਬਚਾ":8,"ਫ਼ਰ":4,"ਫ਼ਤ":5,"ਬਜੀ":4,"ਫਾਇ":7,"ਪੜਦ":4,"ਫਾਈ":5,"ਫ਼ੇ":3,"ਫ਼ਾ":7,"ਫਾਂ":5,"ਫ਼ੀ":3,"ਫ਼ਿ":3,"ਉਸ ":27,"ਉਹ ":82,"ਫਸਦ":3,"ਈਆਂ":16,"ਫਸਾ":5,"ਬਚਪ":3,"ਇਤਿ":5,"ਭੇ ":3,"ਮਨ ":16,"ਫਰੈ":3,"ਇਹੀ":3,"ਇਹੋ":3,"ਬਕਾ":3,"ਇਸ਼":15,"ਇਹਦ":3,"ਇਸੇ":4,"ਇਹਨ":9,"ਪ੍ਰ":74,"ਮਤ ":28,"ਮਣ ":4,"ਮਦ ":3,"ਫਰਾ":5,"ਫਰਕ":4,"ਫਰਤ":6,"ਪੇੜ":4,"ਪੈਸ":9,"ਇਮਾ":5,"ਪੈਰ":16,"ਭਾ ":14,"ਪੈਨ":3,"ਪੈਦ":7,"ਪੈਣ":12,"ਅੰਨ":3,"ਅੰਤ":4,"ਅੰਦ":15,"ਪੋਲ":4,"ਅੰਗ":14,"ਭੁ ":4,"ਅੱਲ":3,"ਇਲਾ":4,"ਅੱਜ":80,"ਅੱਡ":3,"ਅੱਤ":15,"ਅੰਮ":10,"ਅੰਬ":8,"٠·":4,"ਫਤਾ":8,"ਫਤਹ":3,"ਅੱਗ":11,"ਅੱਖ":28,"ਪੇਟ":4,"ਇਸ਼ਕ":4,"ਪੈਂ":13,"ਪੇਪ":3,"ਮਝ ":18,"ਪੇਜ":17,"ਪੇਚ":3,"ਭਦਾ":3,"ਭਦੀ":3,"ਭਦੇ":4,"ਬੇਗ":9,"ਬੇਕ":3,"ਬੈਂ":5,"ਬੇਠ":3,"ਬੇਟ":4,"ਬੇਨ":4,"ਬੇਲ":5,"ਬੇਬ":10,"ਬੇਹ":3,"ਬੇਵ":17,"ਬੇਸ਼":4,"ਰਜ ":9,"ਬੂਤ":3,"ਬੁਹ":3,"ਬੂਰ":4,"ਭਣਾ":3,"ਬੁੜ":4,"ਬੂਹ":5,"ਬੁੱ":35,"ਰਚ ":6,"ਬਾਜ਼":3,"ਬਿਸ":6,"ਰਗ ":4,"ਬੀਬ":7,"ਬੀਰ":15,"ਬੀਤ":4,"ਬੀਨ":4,"ਬੁਝ":4,"ਬੁਰ":17,"ਬਿੱ":10,"ਬਿੰ":5,"ਬੁਲ":6,"ਬਾਨ":15,"ਬਾਦ":31,"ਬਾਤ":7,"ਬਿਆ":3,"ਬਾਣ":9,"ਬਾਰ":34,"ਬਾਬ":12,"ਰਕ ":9,"ਬਾਪ":22,"ਬਾਗ":4,"ਬਾਕ":4,"ਫੜਿ":3,"ਬਾਝ":3,"ਬਾਜ":10,"ਬਿਨ":28,"ੜਨ ":12,"ਬਿਤ":3,"ਬੀਆ":12,"ਬਿਲ":4,"ਰਖ ":5,"ਬਾਹ":15,"ਬਾਲ":11,"ਬਾਵ":3,"ਬਿਜ":6,"ਉਂਗ":5,"ਉਂਕ":3,"ਬਾਂ":6,"ਬਾਅ":21,"ਬਾਈ":6,"ਉਂਝ":5,"▓ ":4,"ਉਂਦ":44,"ਬਹੁ":69,"ਬਹਿ":11,"ਬਹਾ":3,"ਬਸਾ":3,"ਬਸੂ":3,"ਮੋ ":3,"ਜ਼ੀ ":6,"ਭਗਤ":4,"ਮੈ ":55,"ਪੱਪ":3,"ਪੱਲ":11,"ਜ਼ਾ ":8,"ਪੱਖ":6,"ਬਲਦ":3,"ਮੇ ":12,"ਬਲਾ":12,"ਪੱਟ":10,"ਪੱਥ":4,"ਪੱਤ":6,"ਪੱਗ":5,"ਪੰਚ":8,"ਪੰਜ":69,"ਬਰਦ":4,"ਬਰੀ":4,"ਬਰਾ":9,"ੜਕ ":4,"ਮੁ ":8,"ਫੋਨ":11,"ਫੋਟ":10,"ਮੀ ":45,"ਫੈਸ":9,"ਮਾ ":37,"ਫੈਨ":3,"ਬਨੇ":4,"ਬਨਾ":5,"ਫੇਸ":13,"ਫੇਰ":20,"ਉਕਿ":3,"ਬਦੀ":6,"ਸਮ":115,"ਸਭ":40,"ਸਬ":27,"ਸਫ":10,"ਉਦਾ":18,"ਸਪ":15,"ਸਨ":33,"ਉਦੀ":19,"ਸਵ":47,"ਉਦੋ":6,"ਹਕ":3,"ਸ਼ੱ":3,"ਸਲ":42,"ਉਦੇ":5,"ਸਰ":101,"ਾ।":3,"ਸਟ":33,"ਸਜ":9,"ਸਚ":10,"ਸਦ":67,"ਸਤ":102,"ਸਥ":5,"ਸਣ":15,"ਸ਼ੋ":3,"ਸ਼੍":4,"ਸ਼ੌ":4,"ਸ਼ੇ":9,"ਸਕ":75,"ਵੱ":88,"ਸਗ":4,"ਸਖ":6,"ਵੰ":7,"ਵੜ":5,"ਸ਼ਹ":8,"ਸ਼ੂ":3,"ਸ਼ਾ":46,"ਸ਼ਿ":21,"ਧੰਨ":11,"ਸ਼ੀ":26,"ਸ਼ੁ":9,"ਵੈ":31,"ਵੇ":298,"ਸ਼ਨ":25,"ਸ਼ਬ":3,"ਵੋ":22,"ਸ਼ਰ":24,"ੋਂਦ":4,"ਸ਼ਮ":4,"ਸ਼ਵ":4,"ਉਨ੍":5,"ਸ਼ਲ":3,"ਵਸ":10,"ਵਹ":12,"ਵਿ":292,"ਵੀ":368,"ਸ਼ਟ":6,"ਵਾ":605,"ਸ਼ਤ":10,"ਵੁ":3,"ਵਦ":3,"ਵਨ":11,"ਵਧ":21,"ਵਪ":10,"ਵਫ":16,"ਵਰ":69,"ਵਲ":18,"ਸ਼ਕ":17,"ਵਕ":15,"ਵਜ":14,"ਵਟ":5,"ਵਡ":5,"ਉਨਾ":6,"ਵਣ":13,"ਵਤ":4,"ਲੰ":33,"ਲੱ":138,"ਲੜ":21,"ੌਰ ":11,"ਲੋ":178,"ਲ੍":20,"ਉਡੀ":8,"ਲੇ":263,"ਉਡਾ":4,"ਲੈ":101,"ਲੂ":6,"ਲਿ":143,"ਲਾ":471,"ਲੁ":19,"ਲੀ":240,"ਉਣਗ":5,"ਲ਼":4,"ਲਹ":10,"ਲਸ":20,"ਰੱ":146,"ਲਲ":7,"ਰੰ":36,"ਲਵ":33,"ਲਬ":5,"ਲਪ":3,"ਲਫ":6,"ਲਰ":10,"ਉਤੇ":6,"ਲਮ":21,"ਲਤ":23,"ਲਣ":22,"ਲਦ":84,"ਲਝ":3,"ਰਜ਼":4,"ਲਜ":9,"ਲਚ":3,"ੌਲ ":3,"ਰਫ਼":3,"ਲਟ":7,"ਰੜ":3,"ਲਕ":28,"ਲਓ":4,"ਲਗ":56,"ਲਖ":10,"ਰੈ":13,"ਰੋ":175,"ਰੌ":9,"ਲਏ":7,"ਉਣੇ":5,"ਰੀ":548,"ਰੁ":56,"ਰੂ":167,"ਲਆ":4,"ਉਣੀ":9,"ਲਈ":109,"ਉਣਾ":23,"ਰੇ":410,"ਰਹ":121,"ਰਸ":61,"ਰਿ":184,"ਰਾ":570,"ਮੱ":17,"ਰਲ":18,"ਮੰ":95,"ਰਵ":40,"ਰਸ਼":8,"ੀਤ":120,"ੁਆ":34,"ੀਦ":49,"ੀਠ":7,"ੀਡ":43,"ੁਂ":7,"ੀਬ":25,"ੀਮ":22,"ੀਨ":52,"ੀਪ":5,"ੀਫ":10,"ੁਖ":43,"ੀਵ":23,"ਾੳ":4,"ੁਕ":46,"ੀਸ਼":3,"ੁਗ":8,"ੀਰ":89,"ੀਲ":18,"ੁਝ":60,"ਿਫ਼":5,"ੁਟ":24,"ੀਹ":17,"ੁਚ":3,"ੀਸ":18,"ਪਛਾ":4,"ੁਜ":9,"ੁਛ":9,"ਿਥ":17,"ੀਆ":426,"ਿਦ":34,"ਿਣ":44,"ੀਅ":20,"ਿਤ":77,"ਿਡ":6,"ੀਂ":236,"ਿਟ":7,"ਿਠ":8,"ਿਭ":18,"ਿਮ":26,"ੀਏ":78,"ਿਫ":14,"ਿਬ":34,"ਬਰ ":30,"ਿਪ":8,"ਉਮੀ":4,"ਿਧ":15,"ਿਨ":127,"ਿਸ਼":25,"ੀਗ":5,"ਿਵ":53,"ੀਕ":48,"ੀਓ":40,"ਿਲ":331,"ਿਰ":145,"ਿਯ":9,"ੀਐ":5,"ੀਟ":11,"ਾੜ":48,"ਾਜ਼":14,"ੀਜ":17,"ਿਹ":204,"ੀਚ":7,"ਿਸ":234,"ਉਮਰ":20,"ਾਟ":9,"ਿਂ":5,"ਾਡ":139,"ਾਣ":161,"ਾਤ":108,"ਿਅ":11,"ਉਲਝ":3,"ਾਥ":29,"ਿਆ":653,"ਇੰਝ":4,"ਾਦ":150,"ਇੰਤ":4,"ਾਧ":15,"ਾਨ":368,"ਿਉ":59,"ੌਮ ":4,"ਿਊ":12,"ਾਪ":59,"ਇੰਨ":12,"ਾਫ":20,"ਾਬ":137,"ਾਭ":6,"ਾਯ":6,"ਾਮ":142,"ਾਰ":746,"ਾਲ਼":4,"ਾਲ":578,"ਿਓ":21,"ਿਖ":61,"ਾਵ":166,"ਿਕ":104,"ਾਸ਼":30,"ਿਗ":78,"ਾਹ":277,"ਿਚ":83,"ਾਸ":107,"ਿਜ":16,"ਿਛ":13,"਼ਾ":59,"਼ਿ":38,"਼ੂ":3,"ਾਅ":34,"ਾਂ":1175,"਼ੀ":30,"਼ੁ":7,"ਾਈ":175,"ਾਉ":146,"਼ੇ":21,"ਾਇ":101,"਼ੋ":6,"ਾਊ":7,"ਬਲ ":3,"ਾਏ":37,"਼੍":12,"਼ੌ":7,"ਾਕ":89,"ਾਓ":12,"ਾਗ":74,"ਾਖ":14,"ਾਝ":6,"ਾਜ":72,"ਾਚ":4,"਼ਨ":18,"਼ਤ":22,"਼ਦ":3,"਼ਟ":3,"ਪਟਿ":6,"਼ਹ":8,"ਪਟਾ":3,"਼ਵ":4,"਼ਰ":31,"਼ਲ":3,"਼ਬ":9,"਼ਮ":8,"ਹੜ":57,"਼ਖ":6,"ਹੱ":78,"਼ਕ":19,"ਹੰ":29,"ਹੂ":11,"ਹੁ":345,"ਹੈ":221,"ਹੇ":80,"ਸਜ਼":5,"ਹਾ":378,"ਸੜ":18,"ੀ।":5,"ਹੀ":527,"ਹਿ":403,"ਸੰ":67,"ਸੱ":86,"ਹੋ":360,"ਹੌ":15,"ਹ੍":3,"ਹਤ":15,"ਸੂ":43,"ਹਣ":47,"ਸੁ":114,"ਸੀ":335,"ਹਨ":115,"ਸੇ":158,"ਹਦ":66,"ਹਥ":9,"ਹਜ":9,"ਸਹ":46,"ਸਿ":183,"ਸਾ":528,"ਹਟ":5,"ਸ਼":190,"ਹਲ":30,"ਹਸ":10,"ਹਵ":12,"ਹਫ":3,"ਹਬ":7,"ਸੋ":108,"ਸੈ":13,"ਹਰ":104,"ਸੌ":15,"ਸ੍":11,"ਹਮ":41,"ਦਹ":5,"ਦਸ":21,"ਨਿਸ":4,"ਦਿ":341,"ਦਾ":1053,"ਦੁ":113,"ਦੀ":917,"ਨੀਤ":6,"ਨਅ":3,"ਦੂ":40,"ਦਦ":4,"ਦਨ":13,"ਥੇ":66,"ਦਫ":6,"ਥੋ":38,"ਦਭ":3,"ਥੌ":5,"ਦਮ":9,"ਦਰ":121,"ਨੁਕ":3,"ਨੀਵ":8,"ਨੀਲ":3,"ਦਲ":61,"ਤੰ":11,"ਤੱ":27,"ਨੀਰ":3,"ਦਵ":11,"ਨਚ":4,"ਧਾ":52,"ਨਜ":14,"ਨਣ":7,"ਧੂ":15,"ਧੁ":6,"ਧੀ":25,"ਧਿ":24,"ਨਦ":10,"ਨੂਂ":5,"ਨਤ":17,"ੌਣ ":9,"ਦੈ":12,"ਨਈ":18,"ਧਨ":12,"ਦੇ":986,"ਦੌ":16,"ਦ੍":3,"ਉਸਦ":9,"ਦੋ":136,"ਉਸਨ":7,"ਧਰ":32,"ਧਵ":3,"ਨਖ":5,"ਨਿੰ":3,"ਨਗ":13,"ਥੱ":9,"ਨਿੱ":16,"ਨਕ":31,"ਤਹ":7,"ਤਸ":16,"ਤਵ":5,"ਤੁ":75,"ੌਤ ":19,"ਤੀ":155,"ਤੂ":149,"ਤਿ":109,"ਤਾ":607,"ਤਨ":13,"ਣੇ":129,"ਉਹਦ":25,"ਤਪ":4,"ਤਰ":114,"ਤਲ":27,"ਢੱ":3,"ਤਬ":9,"ਣੋ":5,"ਤਮ":17,"ਉਹਨ":28,"ਦਗ":71,"ਦਤ":17,"ਥੀ":15,"ਥਿ":7,"ਥਾ":30,"ਤੜ":5,"ਤੋ":224,"ਤੈ":50,"ਤੇ":826,"ਉਹੀ":12,"ਨੁੰ":7,"ਦਕ":6,"ਥਰ":11,"ਤੌ":10,"ਤ੍":8,"ਇੱਕ":89,"ਣਜ":3,"ਢਾ":7,"ਢਿ":6,"ਢੀ":8,"ਠੰ":9,"ਠੱ":5,"ਣਕ":21,"ਣਖ":6,"ਣਗ":31,"ਇੱਥ":7,"ਡੋ":3,"ਇੱਜ":4,"ਡੂ":3,"ਨੂੰ":591,"ਡੈ":3,"ਡੇ":110,"ਇੱਟ":3,"ਣਾ":269,"ਤਜ":5,"ਤਣ":3,"ਣਿ":19,"ਣੀ":171,"ਣਵ":3,"ਡੱ":4,"ਤਕ":38,"ਣਮ":3,"ਣਬ":3,"ਣਦ":18,"ਣਤ":3,"ਢੇ":7,"ਣਨ":6,"ਠਾ":39,"ਠਿ":7,"ਫ਼ ":6,"ਡਕ":5,"ਨੇਂ":5,"ਠਰ":5,"ਟੌ":4,"ੳ ":4,"ਟੋ":27,"ਟ੍":4,"ਟੈ":8,"ਟੇ":35,"ਟੀ":74,"ਟਿ":34,"ਟੂ":3,"ਟੁ":22,"ਡਿ":27,"ਡੀ":162,"ਡਾ":121,"ਪੜ ":13,"ਡਵ":3,"ਨੇਡ":6,"ਟੱ":11,"ਨੇਤ":3,"ਡਰ":24,"ਡਮ":6,"ੴ ":7,"ਠੋ":4,"ਨੇਰ":7,"ਡਨ":5,"ਠੇ":27,"ਡਦ":7,"ਡਣ":4,"ਠੀ":34,"ਮਰ":107,"ਮਮ":3,"ਯਕ":3,"ੋਹ ":7,"ਮਲ":65,"ਬੰ":63,"ਬੱ":64,"ਮਸ":12,"ਮਹ":43,"ਮਸ਼":3,"ਭੜ":4,"ਮੁ":204,"ਮੀ":88,"ਮਿ":175,"ਮਾ":333,"ਨੈਣ":4,"ਮੂ":30,"ਫਾ ":10,"ਮੈ":269,"ਮੇ":261,"ਮ੍":10,"ਮੌ":37,"ਮੋ":59,"ਭੰ":3,"ਭੱ":8,"ਰਕ":107,"ਰਖ":22,"ਰਗ":59,"ਨੋਂ":3,"ਰਚ":14,"ਰਜ":53,"ਮਜ਼":6,"ਰਟ":17,"ਯਾ":171,"ਰਡ":5,"ਰਣ":10,"ਯੂ":4,"ਯੁ":3,"ਰਥ":14,"ਰਤ":91,"ਰਧ":12,"ਰਦ":247,"ਰਨ":123,"ਰਫ":9,"ਰਪ":29,"ਰਭ":7,"ਯੋ":10,"ਰਬ":33,"ਰਮ":56,"ਬਲ":26,"ਪੰ":87,"ਪੱ":52,"ਬਰ":56,"ਫੋ":24,"ਬਸ":28,"ਬਹ":84,"ਭਗ":7,"ਨੋਟ":3,"ਭਣ":10,"ਬੂ":38,"ਬੁ":73,"ਬੀ":82,"ਬਿ":81,"ਬਾ":266,"ਫੜ":16,"ਬੋ":46,"ਫੀ ":7,"ਬੈ":41,"ਬੇ":97,"ਭਦ":10,"ਭਲ":6,"ਫੰ":3,"ਫੱ":6,"ਮਕ":5,"ਬੌ":3,"ਬ੍":4,"ਭਰ":52,"ਨੌਜ":8,"ਮਜ":15,"ਮਝ":40,"ਭਵ":3,"ਮਗ":7,"ਭੂ":7,"ਮਣ":17,"ਭੁ":69,"ਮਤ":46,"ਭਾ":106,"ਬੜ":39,"ਭੀ":4,"ਭਿ":9,"ਭੋ":11,"ਮਦ":19,"ਭੈ":6,"ਭੇ":26,"ਮਨ":59,"ਪਵ":9,"ਨੱ":11,"ਪਲ":37,"ਨੰ":21,"ਪਹ":53,"ਪਸ":19,"ਪਰ":160,"ਪੂ":50,"ਫਤ":17,"ਪੈ":83,"ਬਣ ":27,"ਬਈ":4,"ਪੇ":49,"ਫਨ":5,"ਪੀ":41,"ਪੁ":97,"ਪਾ":228,"ਫਟ":4,"ਪਿ":202,"ਬਕ":4,"ਬਖ":6,"ਫਸ":12,"ਬਚ":17,"ਪੋ":21,"ੋਸ਼ ":4,"ਪ੍":74,"ਨ੍ਹ":22,"ਫਰ":28,"ਫਲ":5,"ਬਤ":18,"ਬਥ":12,"ਬਦ":44,"ਫੇ":35,"ਬਨ":14,"ਫੈ":15,"ਬਤ ":17,"ਬਜ":10,"ਫ਼":39,"ਪੜ":46,"ਫਾ":40,"ਫਿ":70,"ਫੀ":13,"ਫੁ":26,"ਬਣ":95,"ਨਸ਼":12,"ਨਵ":36,"ਦੱ":44,"ਨਲ":7,"ਦੰ":6,"ਨਰ":13,"ਨਮ":18,"ਧੋ":17,"ਨਫ":9,"ਨਪ":7,"ਧੇ":7,"ਪਈ":15,"ਨੇ":403,"ਨੂ":654,"ਨੀ":363,"ਨੁ":38,"ਨਾ":814,"ਨਿ":127,"ਧੜ":10,"ਨਸ":35,"ਨਹ":244,"ਧੰ":11,"ਪਕ":6,"ਪਏ":9,"ਨ੍":23,"ਨੌ":11,"ੋਸ ":5,"ਨੈ":12,"ਨੋ":17,"ਪਦ":8,"ਪਨ":21,"ਪਣ":108,"ਪਤ":48,"ਪਥ":4,"ਪਟ":17,"ਪਛ":5,"ਨਜ਼":3,"ਕਰ":510,"ਕਮ":58,"?":6,"੨ ":11,"ਕਲ":68,"ਕਨ":5,"ਕਦ":161,"ਕਬ":12,"ਕਫ":5,"ਕਪ":5,"ਕਟ":17,"ਕਠ":8,"ਕਣ":27,"ਕਤ":30,"● ":4,"ਕਢ":3,"੍ਸ ":3,"ੋਢੇ":3,"੧ ":6,"ਔਰ":7,"ੋਡੀ":6,"ਕਈ":16,"ਕਇ":3,"ਕਉ":8,"ੌਂਹ":3,"ੋਣਕ":3,"ੋਣਗ":5,"ਪਵੇ":5,"ਓੁ":3,"ਔਕ":4,"ਔਖ":15,"ਪਵਿ":3,"ਓਸ":10,"ਓਹ":53,"ਗਵ":4,"ੋਠੀ":3,"ਕੱ":74,"ਗਲ":63,"ਕੰ":46,"ਗਰ":77,"ਗਮ":20,"੪ ":3,"ਖੌ":3,"ਗਭ":4,"ਖੋ":45,"ਖੈ":3,"ਗਨ":4,"ਖੇ":71,"ਗਦ":54,"ਗਣ":22,"ਖੂ":13,"ਗਤ":18,"ਖੀ":65,"ਖੁ":55,"ਖਾ":146,"ਖਿ":63,"ਖ਼":22,"ਕੜ":16,"ਗਜ":10,"ੌਂਦ":3,"ਖਸ":5,"ਖਹ":3,"ਖਲ":5,"ਖਵ":15,"ੋਟਾ":6,"ੋਟੀ":16,"ਗਏ":44,"ਕ੍":10,"ਖਮ":12,"ਖਰ":37,"ਕੌ":26,"੩ ":7,"ਖਬ":19,"ਕੋ":212,"ਗਈ":55,"ਖਦ":19,"ਗਇ":3,"ਕੈ":31,"ਕੇ":392,"ਖਨ":3,"ਕੁ":249,"ਖਣ":26,"ਕੂ":23,"ਖਤ":13,"ਕਾ":370,"ਖਟ":5,"ੌਂਕ":3,"ਕਿ":425,"ਕੀ":273,"ਕਹ":127,"ਕ਼":10,"ਕਵ":4,"ਕਸ਼":12,"ੋਟੋ":10,"ਕਸ":23,"ਪਸੰ":8,"ਐਵ":10,"ੋਟਰ":3,"ਐਸ":9,"ਪਹਲ":3,"ਐਨ":11,"ਐਮ":3,"ਐਕ":4,"ਪਹੁ":11,"ਪਹਿ":36,"ਏਸ":7,"ਭਰ ":11,"ਏਹ":5,"ਓਪ":3,"ਓਨ":7,"ਓਥ":3,"ੋਜ਼":3,"ੋਜਾ":3,"ਐੱ":11,"ਊਣਾ":3,"ਓਏ":4,"ੋਜਨ":5,"ਓਂ":6,"ੋਚੋ":3,"ਝਦ":3,"ਜੇ":159,"ਜੈ":9,"ਜੋ":118,"ਜ਼":112,"ਛੜ":5,"ਜਾ":508,"ਜਿ":286,"ਜੀ":154,"ਜੁ":21,"ਜੂ":12,"ਝਣ":7,"ਪਿਤ":5,"ਪੀਂ":3,"ੰ ":730,"ਪਿਛ":3,"ਪਾਸ":12,"ਛੰ":3,"ਛੱ":48,"ਜਦ":92,"ਪਾਰ":18,"ਪਿਓ":5,"ਜਤ":10,"ਪਾਲ":5,"ਜਥ":3,"ਜਪ":17,"ਜਨ":38,"ਛੇ":23,"ਪਾਨ":5,"ਚੜ":22,"ੋਚਦ":5,"ਛਾ":21,"ਜਜ":3,"ਪਾਪ":5,"ੋਚਣ":3,"ਪਾਤ":7,"ਛੁ":11,"ਪਿਆ":135,"ਜਣ":27,"ਛਿ":12,"ਛੀ":4,"ਪਾਣ":19,"ਜਵ":42,"ਜਹ":17,"ਜਸ":8,"ਜਮ":12,"ਛੋ":14,"ਜਬ":11,"ਪਾਕ":20,"ਚੱ":27,"ਚੰ":52,"ਜਲ":19,"ਪਾਗ":3,"ਜਰ":40,"ਪਾਏ":3,"ਟਮ":5,"ਟਨ":9,"ਟਣ":15,"ਪਾਇ":11,"ਟਦ":13,"ਪਾਈ":5,"ਪਾਉ":29,"ਟਾ":68,"ਪਾਂ":12,"ਠਕ":3,"ਝੱ":5,"ਟਵ":4,"ਟਰ":49,"ਟਲ":3,"ਝੰ":11,"ਝੋ":13,"ੋਗੇ":7,"ਝੇ":9,"ੋਗਾ":3,"ਝੁ":7,"ਝੂ":25,"ਝਿ":3,"ਝੀ":3,"ਜੜ":8,"ੋਗੀ":11,"ਝਾ":17,"ਝੜ":4,"ਟਗ":3,"ਟਕ":8,"ਜੱ":52,"ਜੰ":22,"ਗੜ":15,"ਘਿ":4,"ੋਖਾ":7,"ਘਾ":10,"ੋਖੇ":10,"ਘੁ":7,"ਪੁੱ":37,"ਪੁੰ":7,"ਘੇ":4,"ਘੈ":3,"ਘੋ":6,"ਗੰ":11,"ਗੱ":82,"ਚਕ":6,"ੋਕੀ":8,"ਗਹ":5,"ੋਕਾ":19,"ਗਾ":181,"ਘਟ":11,"ਖੜ":24,"ਗ਼":7,"ਗੂ":20,"ਗੁ":159,"ਗੀ":207,"ੋਕੇ":8,"ਗਿ":116,"ਘਦ":4,"ਪੂਰ":24,"ਪੂਜ":3,"ੋਕਰ":3,"ਪੀੜ":5,"ਗੇ":124,"ਗੈ":21,"ਗ੍":23,"ਗੋ":24,"ਗੌ":3,"੫ ":11,"ਖੰ":10,"ਖੱ":11,"ਘਰ":55,"ਚਿ":40,"ਚਾ":154,"ਚੁ":33,"ਚੀ":48,"ਛਡ":8,"ਚੇ":39,"ਪਿੰ":24,"ਪੁਲ":14,"ਪੁਰ":14,"ਚੈ":11,"ੋਕਦ":3,"ਚੂ":4,"ਛਣ":4,"ਛਦ":8,"ਪਿੱ":17,"ਚੋ":83,"ਪੁਛ":8,"ਚੌ":5,"ਚ੍":3,"ਜਖ":6,"ਪੁਣ":3,"ਜਗ":18,"ਘੜ":3,"ਚਨ":5,"ਚਦ":10,"ਚਣ":6,"ਚਰ":20,"ਚਮ":3,"ਪਿਸ":3,"੭ ":3,"ਚਪ":7,"ਚਹ":6,"ਚਵ":3,"ਚਲ":36,"ਘੱ":18,"ਪਤੀ":10,"ਪਤਾ":28,"ਪਥਰ":4,"ਅਤ":44,"ਅਣ":15,"ਆਂ":405,"ਅਜ":17,"ਅਚ":3,"ਅਗ":7,"ਅਖ":11,"ਅਕ":35,"ਆਟ":3,"ਆਣ":22,"ਇਆ":121,"ਆਤ":5,"ਆਗ":7,"ਅਸ਼":3,"ਆਖ":20,"ਅਵ":6,"ਅਸ":91,"ਅਹ":11,"ਆਜ":4,"ਆਏ":9,"ਅਮ":33,"ਅਰ":24,"ਆਓ":5,"ਅਲ":9,"ਆਕ":11,"ਆਇ":23,"ਅਦ":29,"ਆਈ":32,"ਅਧ":12,"ਬਸ ":22,"ਆਉ":59,"ਅਨ":14,"ਆਊ":4,"ਅਪ":17,"ਅਫ":5,"ਈਂ":6,"ਪਣੇ":47,"ਇਦ":7,"ਈਆ":23,"ਇਥ":8,"ਇਤ":15,"ਪਣਾ":26,"ਆਹ":22,"ਆਸ":23,"ਪਣੀ":31,"ਪਣਿ":4,"ਆਸ਼":5,"ਅੜ":6,"ਇਜ":4,"ਆਰ":167,"ਆਮ":6,"ਪਤਲ":3,"ਇਕ":89,"ਆਵ":30,"ਆਲ":20,"ਆਨ":16,"ਆਦ":32,"ਆਬ":5,"ਖ਼ ":4,"ਆਪ":156,"ਆਫ":5,"ਪਨਾ":3,"ਪਨੇ":8,"ਬਾ ":45,"ਂਕ":14,"ਂਗ":88,"ਂਚ":5,"ਂਜ":6,"ਂਝ":12,"ਂਟ":12,"ਪਦੇ":4,"ਂਡ":11,"ਂਆ":4,"ਂਉ":3,"ਂਈ":4," ● ":4,"ਂਵ":15,"ਂਸ":14,"ਂਹ":13,"ਫੜ ":6,"ਂਤ":4,"ਂਣ":3,"ਂਨ":9,"ਂਧ":5,"ਂਦ":203,"ਂਭ":3,"ਂਬ":3,"ਂਪ":7,"ਂਮ":3,"ਉੱ":55,"ਫ਼ ":5,"ਬੂ ":17,"ਭਣ ":3,"ੋੜ ":45,"ਬੀ ":35,"ੋਈਆ":6,"ਏਂ":5,"ਏਗ":5,"ੋਜ਼ ":4,"ਏਕ":3,"ਏਨ":14,"ਐਂ":7,"ਏਡ":3,"ਏਥ":3,"ਇਮ":13,"ਈਏ":16,"ਇਬ":5,"ਇਨ":26,"ਇਸ਼":6,"ਈਕ":8,"ਅੱ":148,"ਇਲ":13,"ਅੰ":61,"ਇਰ":5,"ਨੰਦ":5,"ਆੜ":3,"ਈਟ":6,"ਆਜ਼":6,"ਇਹ":92,"ਪਰੋ":3,"ਇਸ":70,"ਈਦ":6,"ਉਂ":82,"ਜ਼ ":28,"ਉਏ":3,"ਈਨ":4,"ਪਲਾ":9,"ਈਵ":3,"ਉਖ":3,"ਉਕ":4,"ਈਰ":4,"ਈਲ":3,"ਉਝ":5,"ਇਜ਼":3,"ਉਠ":5,"ਨੰਬ":9,"ਉਜ":4,"ਬੇ ":26,"ੋਆਣ":4,"ਉਦ":53,"ਉਨ":16,"ੋਇਆ":45,"ਊਂ":4,"ਉਡ":14,"ਉਣ":115,"ਨੱਕ":5,"ਉਤ":14,"ਨੱਖ":4,"ਉਪ":3,"ਪਰਖ":3,"ਉਮ":26,"ੜ ":132,"ਇੱ":104,"ਉਲ":6,"ਇੰ":28,"ਪਰਤ":4,"ਉਸ":45,"ਊਗ":4,"ਉਹ":149,"ਊਟ":4,"ਊਣ":5,"ਊਦ":3,"ਪਰੀ":7,"ਪਰਿ":18,"ਪਰਾ":6,"ਪਰਦ":3,"ਪਰਵ":7,"ਥੱਕ":3,"ਪਨ ":7,"ੳੁ":3,"ਨਕਾ":4,"ੳਹ":3,"ਨਕਸ਼":6,"ਨਕਲ":3,"ੱੜ":5,"ੳਣ":5,"ਥੱਲ":5,"ੲੇ":5,"ਏਂ ":3,"ਦੌਰ":5,"ਧਰੀ":6,"ੌਤਾ":3,"ਧਰਮ":6,"ਧਰਤ":8,"ੋਵੇ":49,"ੋਵੈ":3,"ੋਵਾ":4,"ਪਰ ":99,"ੌਕੇ":3,"ੌਕੀ":4,"ੌਕਾ":5,"ਧਾਂ":3,"ੋਸਤ":19,"ਧਾਈ":10,"ਧਾਇ":4,"ਨਜੀ":5,"ਨਜ਼":5,"ਨਜਾ":3,"ਨੰ ":4,"ਪਲ ":23,"ੋਸ਼ਿ":6,"ੋਸ਼ੀ":10,"ਨਗਰ":4,"ਉੱਪ":4,"↓ ":33,"ੋਹਿ":5,"ੋਹਾ":5,"ੋਹੇ":4,"ਨਗੇ":4,"ਨਖਰ":4,"ੋਸ਼":7,"ਧਵਾ":3," ੳਹ":3,"ੋਹਣ":38,"ਉੱਚ":8,"ਉੱਤ":22,"ੋਹਨ":10,"ਉੱਡ":6,"ਉੱਠ":5,"ੌਜਵ":8," ੲੇ":3,"ਦੁਖ":12,"ਦੀਵ":5,"ਦੁਕ":4,"ਦੀਰ":10,"ਦੀਪ":3,"ਦੀਦ":9,"ਦੁਆ":11,"ਦਿੱ":51,"ਦੁਸ਼":6,"ਦਿੰ":33,"ਦੁਨ":49,"ਦੂਸ":4,"ਦੂਰ":15,"ਦੂਜ":12,"ੋਰਟ":10,"ਦੁੱ":21,"ੋਰੂ":3,"ੋਰਾ":8,"ੋਰੀ":14,"ੋਰਨ":3,"ਦਾਈ":3,"ੋਲਦ":11,"ਦਾਖ":3,"ਦਾਅ":3,"ਦਾਂ":24," ੫੪":9,"ਦਾਨ":4,"ਦਿਉ":4,"ੋਲਾ":5,"ਪਕ ":5,"ੋਲੀ":14,"ਦਾਲ":8,"ੋਲਿ":6,"ਦਾਰ":58,"ਦਿਖ":8,"ਦਾਜ":4,"ਦਾਣ":5,"ਦਾਦ":4,"ਦਿਆ":33,"ਦਾਤ":14,"ਦਿਮ":4,"ਦੀਏ":3," ੨੨":4,"ਦਿਲ":129,"ਦਿਵ":3,"ਦਿਸ":4,"ਦਾਸ":17,"ੋਲੇ":9,"ੋਲੋ":12,"ਦਿਤ":11,"ਦੀਆ":101,"ਦਿਨ":51,"ੋਣੇ":3,"੫੪":9,"ੋਣੀ":14,"ੋਣਾ":17,"ਧਨੁ":4,"ਦੇਖ਼":3,"ੋਤਲ":6,"੍ਹ ":16,"੪੫":7,"ਦੋਂ":42,"੨੨":4,"ੋਦੀ":3,"ਦੋਸ":19,"ਦੋਸ਼":8,"ੱਤ":177,"ੱਣ":6,"ੰੂ":4,"ੱਢ":12,"ੱਡ":101,"ੱਧ":38,"ੱਦ":34,"ੱਥ":55,"ੱਬ":127,"ੱਫ":7,"ੱਪ":33,"ੱਰ":3,"ੱਭ":36,"ੱਗ":118,"ੱਘ":3,"ੱਕ":223,"ੰਵ":5,"ੱਖ":235,"ੌੜ ":5,"ੱਛ":38,"ੱਜ":130,"ੰਸ":9,"ੰਹ":16,"ੱਚ":200,"ੱਟ":139,"ੱਠ":36,"ੱਝ":28,"ੋਨੀ":5,"ੋਨੇ":5,"ੱਲ":284,"ੱਸ":107,"ੱਹ":3,"ੰਜ਼":5,"ਦੇਂ":4,"ਦੇਆ":3,"ਦੇਈ":4,"ਨਜ਼ ":3,"ਦੇਖ":70,"ੰਥ":5,"ਦੇਣ":32,"ੰਤ":43,"ੰਧ":16,"ੰਦ":530,"ੰਡ":127,"ੰਢ":3,"ੰਭ":8,"ੰਬ":31,"ੰਮ":71,"ਦੇਰ":6,"ੰਨ":128,"ੰਕ":7,"ੰਗ":177,"ਦੇਸ":19,"ਦੇਵ":22,"ਦੇਸ਼":6,"ੰਜ":98,"ੰਝ":10,"ੰਟ":21,"ੰਘ":49,"ੰਚ":21,"ਨਸ਼ਿ":3,"ਨਵੀ":10,"ਨਵਾ":15,"ਪੋ ":5,"ਨਵੇ":3,"ਨਸ਼ਨ":4,"ਨਵਜ":4," ਫ਼ਿ":5,"ਪੈ ":16,"ਦੱਬ":6,"ਦੱਸ":37," ਖ਼ੁ":3," ਜ਼ਖ":3,"ਫਨ ":3,"ਪੇ ":6,"ਦੰਦ":4,"ਬਈ ":4," ਜ਼ਿ":18," ਗ਼ਜ਼":3," ਜ਼ਾ":3,"ਨਰਮ":3," ਜ਼ਰ":4," ਜ਼ਮ":4,"ਜ਼ਬ":3,"ਜ਼ਮ":11,"ਨਾਸ":3,"ਜ਼ਰ":6,"ਨਾਹ":7,"ਨਿਗ":5,"ਜ਼ਲ":4,"ਨੀਆ":56,"ੜਕ":39,"ਨੀਅ":3,"ੜਗ":3,"ਨੀਂ":14,"ਜ਼ਹ":3,"ਨਿਮ":5,"ਨੀਏ":5,"ਨਿਭ":13,"ਨਿਸ਼":3,"ਜ਼ਦ":3,"ਨਿਰ":5,"ੌਸਲ":4,"ਨਾਜ":3,"ੌਸਮ":3,"ਜ਼ਖ":3,"ਨਾਤ":4,"ਨਿਆ":32,"ਨਾਪ":3,"ਨਾਭ":4,"ਨਾਬ":7,"ਨਾਨ":22,"ਨਾਲ":203,"ਨਾਵ":8,"ਨਿਕ":19,"ਖ਼ੁ":3,"ਨਾਮ":57,"ਨਾਰ":11,"ਧੜਕ":9,"ੜ੍":34,"ਨਾਂ":84,"ਨਾਉ":8,"ੜੀ":177,"ਨਾਈ":8,"ਨਾਇ":4,"ੜਿ":19,"ੜਾ":114,"ੜੇ":74,"ੜਵ":3,"ਜ਼ੀ":6,"ਜ਼ਿ":23,"ਜ਼ਾ":23,"ਗ਼ਜ਼":3,"ੜਪ":3,"ੜਨ":15,"ੜਦ":27,"ੜਤ":8,"ੋੜਾ":13,"ੋੜੀ":8,"ਫ਼ਿ":6,"ੋੜੇ":10,"ਨਹਾ":6,"ਨਹੀ":235,"ਫਰ ":3,"ਫ਼ਤ":4,"ਨਸਾ":19,"ਨਸ਼":7,"ਨਸਲ":3,"੧॥":10,"ੁਦ":23,"ੂਆ":4,"ੁਨ":62,"ੁਧ":5,"ੁਡ":10,"ੂਂ":7,"ੁਤ":71,"ੁਣ":90,"ੁਮ":14,"ੁਭ":3,"ੁਰ":196,"ੌਰਾ":3,"ੁਪ":19,"ੁਬ":11,"ੁਫ":3,"ਨਤਾ":6,"ਿੳ":5,"ੁਵ":3,"ੁਸ਼":25,"ੂਗ":5,"ੁਸ":57,"ਿੰ":379,"ੁਲ":89,"ਨਤੀ":6,"ਿੱ":375,"ੂਕ":9,"ਿੲ":3,"ੀੜ":11,"ੈ।":5,"ੂਟ":6,"ੂਠ":13,"ੂਚ":3,"ੁਹ":50,"ੂਜ":16,"ੀਜ਼":7,"ੂਨ":7,"ੂਦ":3,"ੂਥ":4,"ੂਤ":17,"ੂਣ":4,"ੂਰ":106,"ੂਮ":5,"ੂਬ":11,"ੂਫ":3,"ੂਪ":11,"ੂਸ":10,"ੂਹ":40,"ੂਲ":27,"ੁਜ਼":3,"ੁੜ":125,"ਪਸ ":6,"ੁੰ":251,"ੁੱ":365,"ੂੜ":4,"ਧੁੱ":3,"ੂੰ":746,"ਨਣਾ":3,"रति":3,"ੇਆ":18,"ੇਅ":8,"ੇਂ":94,"ੇਕ":24,"ੇਖ":123,"ੇਓ":4,"ੇਈ":4,"ੇਦ":12,"ੇਤ":31,"ੇਣ":37,"ੈਂ":191,"ੇਡ":29,"ੇਠ":7,"ੇਟ":27,"ੇਜ":43,"ੇਚ":13,"ੇਗ":60,"ੇਯ":4,"ੇਰ":498,"ੇਲ":82,"ਧਿਕ":3,"ੈਕ":19,"ੇਵ":57,"ੈਗ":8,"ਧਾਰ":7,"ੇਸ਼":31,"ੌਲੀ":4,"ੇਨ":28,"ੇਪ":10,"ੇਬ":23,"ਧਾਨ":15,"ੇਮ":11,"ੈਡ":12,"ਧਿਆ":13,"ੈਠ":33,"ੈਣ":48,"ੈਥ":4,"ੈਦ":20,"ੇਸ":54,"ੇਹ":35,"ੈਟ":7,"ੈਲ":16,"ੈਰ":49,"ੈਸ਼":5,"ਧਿਰ":5,"ੈਪ":8,"ੈਨ":134,"ੈਮ":3,"ੈਬ":4,"ਧੀਆ":6,"ੇਖ਼":4,"ੈਸ":26,"ੇੜ":26,"ੇਜ਼":7,"ੋਂ":307,"ਪੂ ":21,"ੋਇ":50,"ੋਈ":163,"ੋਆ":7,"ੋਟ":42,"ੋਠ":7,"ੌਂ":13,"ੋਡ":12,"ੋਢ":8,"ਫਤ ":3,"ੋਜ":25,"ੋਧ":12,"ੋਨ":27,"ੌਊ":3,"ੋਪ":3,"ੋਣ":76,"ੋਤ":21,"ੋਦ":10,"ੋਏ":19,"ੋਗ":34,"ੋਚ":30,"ਨਮਾ":4,"ੈੱ":3,"ੈੰ":4,"ੋਖ":19,"ੋਕ":94,"ੌਜ":13,"ੌਣ":12,"ਨਫਰ":6,"ੌਤ":24,"ਪੀ ":19,"ਨਪ੍":4,"ੋਮ":8,"ੋਭ":3,"ੋਬ":4,"ੋਲ":96,"ੋਰ":109,"ਧੋਖ":14,"ੋਸ਼":21,"ੋਵ":58,"ੌਕ":17,"ਨਫ਼":3,"ੋਹ":79,"ੋਸ":35,"ੋਜ਼":4,"ੋੜ":87,"ਪੁ ":3,"ੌਮ":6,"ੌਰ":17,"ਏਸ ":4,"ੌਲ":10,"੍ਕ":3,"ੌਸ":10,"ਪਾ ":54,"ੌੜ":14,"੍ਹ":73,"੍ਸ":6,"੍ਵ":3,"ੋੰ":4,"੍ਲ":4,"੍ਯ":3,"੍ਰ":152," ਿੲ":3,"ਨਦਾ":6,"ਤੁੰ":3,"ㅤㅤ ":11,"ਤਿੰ":8,"ੇਲ ":24,"ਤਿੱ":4,"ਤੁਰ":14,"ਤੁਹ":27,"ਤੁਸ":19,"ਤੀਰ":4,"ੇਰ ":37,"ਤੇਰ":228,"ਤੇਲ":3,"ਤੇਨ":14,"ਤੇਜ":3,"ੇਮ ":3,"ਤੂੰ":124,"ਤਹਿ":4,"ਧਰ ":8,"ਤਸਵ":7,"ੇਹ ":3,"●๋":3,"ਤਸਰ":6,"ਤੀਆ":14,"ਤਿਨ":11,"ੇਸ ":10,"ਤਿਹ":13,"ਤਿਸ":3,"ਤਿਲ":3,"ਤਿਆ":27,"ਤਾਨ":16,"ਤਾਜ":5,"ਤਾਲ":7,"ਤਿਕ":6,"ਤਾਵ":5,"ਤਿਗ":7,"ਤਾਹ":3,"ਨਕ ":13,"ਤਾਰ":37,"ਤਾਉ":5,"ਤਾਂ":243,"੧॥ ":10,"ੇਸ਼ ":10,"ੇਵ ":4,"ਧੇ ":5,"ੈਣ ":22,"ਨਮ ":9,"ੈਠ ":5,"ੈਟ ":3,"ਦਗਾ":3,"ਦਗੀ":66,"ਧੀ ":16,"ਤੋਤ":3,"ਤੋਰ":3,"ਤੋਹ":3,"ਤੈਥ":4,"ਤੈਨ":38,"ਧਾ ":9,"ਫ਼ਿਲ":3,"ਤੇਜ਼":3,"ਤੋਂ":141,"ੈਨ ":7,"ਥਰਾ":4,"ੈਦ ":3,"ਧੂ ":9,"ਤੋੜ":14,"ਤ੍ਰ":4,"ਨਤ ":4,"ੇਂਦ":12,"ੇਂਗ":7,"ਦਨਾ":9,"ੈਰ ":21,"ਥੇਰ":12,"ਥੋਂ":17,"ਨਿ ":9,"ਨਾ ":365,"ੇਜ਼ ":4,"ੇਈਏ":3,"ਨਰ ":5,"ਥਾਂ":13,"ੇੜ ":4,"ਨਲ ":3,"ਥਿਆ":4,"ਥਾਨ":4,"ੇਆਂ":3,"ੇਅਰ":4,"ਨੋ ":5,"ਦਵਾ":7,"ਦਸਤ":4,"ਪਏ ":8,"ਦਸੋ":5,"ਨੀ ":255,"ੇਗਾ":32,"ਥੋਡ":4,"ੇਗੀ":25,"ਦਫ਼":3,"ਨੁ ":23,"ਨੂ ":55,"ਥੋੜ":14,"ਦਮੀ":3,"ਦਰਜ":5,"ਦਰਤ":4,"ਦਰਦ":14,"ਦਰਬ":6,"ਦਰਸ":5,"ਦਰਸ਼":4,"ਦਰੀ":4,"ਦਰਾ":9,"ੇਕਰ":6,"ਦਰੋ":4,"ਪਈ ":14,"ਤੰਗ":6,"ੇਖਣ":9,"ੇਕਾ":3,"ੇਕੇ":4,"ਨੇ ":368,"ੇਖਾ":11,"ਤੱਕ":24,"ਦਲਾ":5,"ੇਖੀ":10,"ੇਖਿ":7,"ੇਖੋ":15,"ੇਖੇ":10,"ਦਲੇ":6,"ਂਟ ":7,"ਣਤੀ":3,"ੇਜਿ":4,"ੇਜੀ":4,"ੇਜ਼":4,"ਂਝ ":7,"ਢਿੱ":3,"ੇਜਦ":3,"ੇਡਾ":9,"ੇਡੀ":5,"ਢਿਆ":3,"ੈਂਡ":3,"ਂਡ ":9,"ੈਂਟ":6,"ੈਂਚ":3,"ੈਂਨ":6,"ੇਠੇ":3,"ੈਂਦ":26,"ੈਂਬ":3,"ੈਂਪ":7,"ੈਂਸ":4,"ੇਟੀ":8,"ੈਂਗ":4,"ੈਂਕ":5,"ਂਗ ":9,"ੇਦਾ":6,"ਥਰ ":6," ↓↓":7,"ੇਤੇ":8,"ਂਕ ":4,"ੇਤਾ":7,"ੇਤਰ":3,"ੇਣੇ":3,"ੇਣੀ":6,"ੇਣਾ":15,"ਣਗੇ":27,"ਤੌ ":3,"ੋਂ ":293,"ਣਗੀ":3,"ਤੋ ":50,"ਂਚ ":4,"ੇਪਰ":3,"ਣਕੇ":7,"ੇਨੂ":11,"ੇਨੁ":3,"ਣਕਾ":7,"ੇਨਤ":3,"ੇਮਿ":4,"ਤਕਦ":10,"ਤਕਾ":12,"ੇਬਾ":3,"ੇਬੀ":3,"ਥੇ ":51,"ਦਨ ":4,"ੇਬੇ":10,"ਡੱਬ":3,"ੇਲੀ":23,"ੇਲਾ":8,"ੇਲੇ":17,"ਦਦ ":4,"ੇਲ੍":4,"ੈਕਟ":6,"ੇਰਾ":95,"ੇਰੀ":155,"ੇਰੇ":203,"ੋਈ ":154,"ਦਤ ":13,"ਂਆ ":3,"ੈਗਾ":4,"ੇਸ਼ਾ":10,"ਥੀ ":12,"ੋਏ ":17,"ੇਸਬ":10,"ੈਕੇ":4,"ੇਵਫ":13,"ੈਕਸ":3,"ੇਵਕ":4,"ਥਾ ":4,"ੇਸ਼ਨ":4,"ੇਵੇ":12,"ੇਵੋ":6,"ੇਵਾ":12,"ੇਹੰ":3,"ਣਦੇ":3,"ੇਹੜ":3,"ੇਹਰ":6,"ਂਈ ":3,"ੇਸ਼":15,"ੇਸੀ":8,"ੇਸਾ":3,"ਣਦਾ":8,"ਣਦੀ":6,"ੇਹਾ":5,"ੋਕ ":45,"ੈਠਕ":3,"ਦਸ ":4,"ੈਠਾ":13,"ੈਠੇ":7,"ੈਡਮ":6,"ੋਗ ":9,"ਣੀਆ":17,"ਣੀਏ":6,"ਣਿਆ":18,"ੈਡੀ":4,"ੈਣਾ":16,"ੈਣੀ":6,"ੋਚ ":12,"ੈਦਾ":9,"ੈਦੀ":6,"ਦਰ ":58,"ੈਥੋ":4,"ੋਜ ":13,"ਣਾਕ":3,"ੈਨੀ":6,"ੈਨੂ":102,"ਣਾਂ":19,"ੈਨੇ":5,"ਂਸ ":5,"ਣਾਉ":7,"ਣਾਈ":6,"ਣਾਇ":4,"ਦਲ ":40,"ੈਨਸ਼":4,"ੌਂ ":4,"ਥੋ ":3,"ਂਹ ":9,"ਣਵਾ":3,"ੋਣ ":34,"ਦਮ ":5,"ੈਬਸ":3,"ੋਤ ":8,"ਤਵੀ":3,"ੈਰਾ":12,"ੈਰੀ":10,"ਦੋ ":56,"ੋਧ ":8,"ਦੌ ":7,"ੋਨ ":14,"ੈਲੀ":6,"ਤਰਸ":7,"ੈਲੋ":3,"ਤਰੋ":3,"ਤਰਾ":29,"ਤਰੀ":31,"ਨਈ ":15,"ਦੇ ":799,"ਧਨ ":4,"ਤਲਵ":3,"ਦੈ ":10,"ੈਸ਼ਨ":3,"ਤਲਾ":4,"ਤਲੀ":5,"ਦੀ ":767,"ਤਬਾ":6,"।। ":5,"ੈਸੇ":9,"ਦੂ ":5,"ੈਸਲ":7,"ੈਸਿ":3,"ਤਮਾ":4,"ੋਰ ":64,"ੋਲ ":32,"ਂਪ ":4,"ਦਾ ":870,"ੌਕ ":3,"ੇੜਾ":6,"ੇੜੀ":8,"ੁਝਾ":3,"ੁਝੇ":4,"ਢੇ ":7,"ਣਨ ":4,"ੜਾ ":93,"ਠਰਕ":3,"ੁਛਿ":3,"ੁਜ਼":3,"ੁਜਾ":3,"▓▓":20,"ੁੰ ":10,"ਂਉਦ":3,"ੀਹਦ":6,"ੀਸ਼":3,"ੀਹਾ":3,"ਖ਼ੁਸ਼":3,"ੁਗੀ":3,"ੀਵਨ":3,"ੁਖਬ":12,"ੁਕਾ":9,"ੁਕਿ":4,"ਾੳਣ":3,"ੀਵੇ":3,"ੀਵੀ":4,"ੁਖੀ":10,"ੁਖਾ":3,"ੀਵਾ":7,"ੁਖੁ":4,"ੀਲੇ":3,"ੀਲਾ":7,"ੁਕਰ":3,"ੁਕਮ":8,"ੁਕਣ":5,"ੀਰੀ":4,"ਤਕ ":12,"ੀਰਾ":13,"ਠੀਕ":7,"ਠੀਏ":3,"ਠੀਆ":13,"ੜੀ ":124,"ੀਮਾ":6,"ੜਿ ":9,"ੁਰਖ":3,"ੁਰਗ":4,"ੁਰਦ":9,"ੁਰਬ":10,"ੁਰਮ":3," ▓▓":4,"ੁਮਾ":7,"→ㅤㅤ":3,"ੁਬਾ":10,"ਠੇਕ":3,"ੁਪਰ":6,"ਡਦੇ":4,"ੁਪਾ":3,"ਜ਼ਖਮ":3,"ਡਦੀ":3,"ੁਪਨ":5,"ੜੇ ":68,"ੁਨਿ":6,"ੁਨੀ":46,"ੁਨਾ":4,"ੁਦਾ":5,"ਣੀ ":144,"ਠੋਕ":3,"ੁਦਰ":4,"ੁਤੇ":3,"ੁਤਾ":4,"ੁਤੀ":4,"ੁਣੇ":4,"ਣਾ ":220,"ੁਣੀ":8,"ੁਣਿ":4,"ਡਰਦ":8,"ੁਡਾ":5,"ੁਟਿ":9,"ੁਟਾ":3,"ੁਟੀ":3,"ਿਫ਼ਤ":4,"ੀਜ਼ਾ":3,"ਤਨ ":6,"ਣੇ ":125,"ਂਨੂ":8,"ਟੱਕ":7,"ੀੜ੍":3,"ੂਠੀ":4,"ਆਂ ":386,"ੁਸ਼":13,"ੁਸੀ":23,"ਣੋ ":3,"ੁਹਾ":31,"ੁਹੀ":3,"ਂਦਰ":10,"ਅਜ ":3,"ਤਮ ":9,"ਂਦੀ":57,"ੁਹੱ":10,"ਂਦਾ":60,"ਂਦੇ":69,"ੂਜਾ":8,"ੂਜੀ":3,"ੂਜੇ":4,"ੂੰ ":706,"ਂਧੀ":5,"ਆਈ ":27,"ਤਰ ":31,"ਜ਼ਰੂ":3,"ਆਉ ":3,"ੁਸ਼ਮ":3,"ੁਵਾ":3,"ੁਸ਼ਕ":5,"ਤਲ ":10,"ੂਗਾ":3,"ੁਸ਼ਿ":4,"ੁਸ਼ੀ":6,"ੁਸਨ":4,"ਡਾਈ":3,"ਡਾਇ":3,"ਡਾਉ":6,"ੁਸਤ":4,"ਡਾਂ":6,"ਡਾਰ":6,"ੁਰੀ":5,"ੁਰੁ":5,"ੁਰੂ":83,"ੁਰੇ":4,"ਡਿਗ":3,"ਂਬਰ":3,"ੁਰਾ":20,"ੁਰਸ":6,"ਡਿਆ":14,"ਡੀਓ":36,"ਿੰਨ":49,"ਿੰਦ":222,"ਡੀਕ":10,"ਿੰਤ":4,"ਡੀਏ":3,"ਿੰਡ":25,"ਿੰਮ":4,"ਡੀਗ":5,"ਿੰਘ":35,"ਿੰਗ":18,"ਡੀਅ":3,"ੁਲਕ":5,"ਡੀਆ":10,"ਿੰਟ":9,"ਿੰਜ":4,"ਿੱਤ":79,"ਿੱਥ":17,"ਿੱਦ":4,"ਿੱਧ":9,"ੁਲੇ":10,"ਿੱਕ":14,"ੁਰੱ":6,"ਿੱਗ":6,"ਿੱਖ":33,"ਅਤ ":7,"ੁਲਸ":8,"ਿੱਘ":3,"ਿੱਛ":14,"ਿੱਚ":116,"ਜ਼ਮਾ":4,"ੁਲਾ":29,"ਿੱਟ":13,"ੁਲੀ":4,"ਿੱਡ":3,"ਿੱਠ":21,"ੁਲਿ":6,"ਡਿੱ":6,"ਅਦ ":21,"ਿੱਲ":35,"ਿੱਸ":4,"ੂਰਨ":3,"ੂਰਤ":12,"ਂਗੂ":8,"ਂਗਾ":11,"ਂਗੀ":11,"ਂਗੇ":21,"ੂਲਦ":3,"ੂਰੇ":4,"ੂਰੀ":23,"ੂਰਾ":6,"ੜਕਦ":4,"ੜਕੀ":8,"ੜਕਾ":7,"ੜਕੂ":3,"ੜਕੇ":8,"ਤਿ ":19,"ਂਗਰ":20,"ਂਗਲ":4,"ਤਾ ":272,"ੜਗੀ":3,"ੂਬਸ":3,"ਂਕੀ":3,"ਂਕਿ":4,"ੂਬੀ":3,"ਤੁ ":5,"ਜ਼ਿੰ":13,"ਂਟੀ":3,"ਤੀ ":123,"ੜਤਾ":4,"ਤੂ ":15,"ਗ਼ਜ਼ਲ":3,"ਜ਼ਾਂ":3,"ਤੈ ":4,"ਠੱਗ":4,"ਜ਼ਾਰ":4,"ਠੰਡ":9,"ੂਤੀ":4,"ਤੇ ":562,"ਂਝਾ":3,"ੂਤਰ":4,"ਜ਼ਿਲ":8,"ਠੇ ":23,"ਡਨ ":3,"ਜੰਮ":8,"ਜੰਗ":11,"ੁੜ੍":4,"ਜੱਟ":33,"ੁੜੇ":13,"ਜੱਗ":11,"ੁੜੀ":95,"ੜਦੇ":13,"ੜਦੀ":8,"ੜਦਾ":6," →ㅤ":3,"ਠੀ ":11,"ਝੋਲ":3,"ਆਦ ":3,"ਡਰ ":12,"ਆਨ ":11,"ੂਲੀ":4,"ਡਮ ":6,"↓↓":7,"ਇਆ ":116," ς੭":6,"ੂਹਾ":9,"ੂਹਿ":3,"ੂਹੀ":4,"ੂਹੇ":5,"ੂਸਰ":4,"ਆਪ ":12,"ς੭":6,"ਆਏ ":8,"ੇਆ ":9,"ਟਣਾ":4,"ਂਵੇ":6,"ਂਵੀ":3,"ਂਵਾ":5,"ੜਵਾ":3,"ਆਓ ":3,"ੁੱਲ":80,"ੁੱਸ":12,"ੁੱਧ":11,"ੁੱਦ":10,"ੁੱਤ":35,"ੁੱਡ":7,"ੁੱਠ":3,"ੁੱਬ":5,"ੁੱਪ":8,"ੁੱਖ":59,"ੜਾਈ":9,"ੁੱਗ":4,"ੁੱਕ":40,"ੜਾਂ":7,"ੁੱਟ":42,"ੁੱਝ":21,"ੁੱਛ":18,"ਅਰ ":5,"ੁੰਡ":40,"ੁੰਦ":164,"ੁੰਨ":10,"ੁੰਮ":3,"ੁੰਗ":3,"ੁੰਚ":9,"ੁੰਜ":3,"ਂਸੀ":3,"ਡੀ ":87,"ੜਿਆ":8,"ੜੀਏ":13,"ਡਾ ":87,"ੜੀਆ":39,"ੇਂ ":71,"ਟਨਾ":5,"ਟਦੇ":3,"ਟਦਾ":9,"ਡੇ ":105,"ਝੰਡ":10,"ੇਕ ":7,"ਝੱਲ":4,"ੇਖ ":50,"ਈਂ ":6,"ਟਰਪ":8,"ੜ੍ਹ":31,"ੇਚ ":9,"ਇਤ ":3,"ਟਰੀ":3,"ਟਰਾ":6,"ਈਆ ":6,"ਇਦ ":3,"ਇਨ ":3,"ਟਾਂ":12,"ਟਾਇ":3,"ਟਾਈ":4,"ਟਾਉ":4,"ਅਕਤ":6,"ਟਾਕ":5,"ਅਕਾ":17,"ਅਕਲ":9,"ਅਖਾ":3,"ਅਖੀ":3,"ਇਮ ":4,"ਈਏ ":15,"ੇਓ ":3,"ਆਮ ":4,"ਟੁੱ":21,"ੇਤ ":11,"ਆਰ ":120,"ੂੰਨ":7,"ੂੰਗ":4,"ਟਿਸ":3,"ੇਪ ":5,"ਆਲ ":4,"ਣਖ ":4,"ਟੀਆ":10,"ਟਾਲ":3,"ਟਾਵ":3,"ੂੰਹ":12,"ਣਕ ":6,"ਟਿਆ":25,"ੇਬ ":5,"ਇਕ ":70,"ਟੋਰ":5,"ਟੋਲ":4,"ਢੀ ":5,"ੇਜ ":23,"ਟ੍ਰ":4,"ਆਸ ":7,"ੇਟ ":11,"ਫ਼ਤਾ":4,"ੈਂ ":122,"ੇਡ ":10,"ਟੈਨ":3,"ਆਹ ":21,"ੇਠ ":3,"ਟੇਡ":3,"ੇਣ ":12},"n_words":[89609,113266,83000],"name":"pa"} -------------------------------------------------------------------------------- /src/test/java/org/codelibs/elasticsearch/langfield/LangFieldPluginTest.java: -------------------------------------------------------------------------------- 1 | package org.codelibs.elasticsearch.langfield; 2 | 3 | import static org.codelibs.elasticsearch.runner.ElasticsearchClusterRunner.newConfigs; 4 | 5 | import org.codelibs.elasticsearch.runner.ElasticsearchClusterRunner; 6 | import org.elasticsearch.action.DocWriteResponse.Result; 7 | import org.elasticsearch.action.index.IndexResponse; 8 | import org.elasticsearch.action.search.SearchResponse; 9 | import org.elasticsearch.client.Client; 10 | import org.elasticsearch.common.settings.Settings; 11 | import org.elasticsearch.common.settings.Settings.Builder; 12 | import org.elasticsearch.common.xcontent.XContentBuilder; 13 | import org.elasticsearch.common.xcontent.XContentFactory; 14 | import org.elasticsearch.index.query.QueryBuilders; 15 | import org.elasticsearch.search.SearchHits; 16 | 17 | import junit.framework.TestCase; 18 | 19 | public class LangFieldPluginTest extends TestCase { 20 | 21 | private ElasticsearchClusterRunner runner; 22 | 23 | private String clusterName; 24 | 25 | @Override 26 | protected void setUp() throws Exception { 27 | clusterName = "es-langfield-" + System.currentTimeMillis(); 28 | // create runner instance 29 | runner = new ElasticsearchClusterRunner(); 30 | // create ES nodes 31 | runner.onBuild(new ElasticsearchClusterRunner.Builder() { 32 | @Override 33 | public void build(final int number, final Builder settingsBuilder) { 34 | settingsBuilder.put("http.cors.enabled", true); 35 | settingsBuilder.put("http.cors.allow-origin", "*"); 36 | settingsBuilder.putList("discovery.zen.ping.unicast.hosts", 37 | "localhost:9301-9310"); 38 | } 39 | }).build(newConfigs().clusterName(clusterName).numOfNode(1).pluginTypes("org.codelibs.elasticsearch.langfield.LangFieldPlugin")); 40 | 41 | // wait for yellow status 42 | runner.ensureYellow(); 43 | } 44 | 45 | @Override 46 | protected void tearDown() throws Exception { 47 | // close runner 48 | runner.close(); 49 | // delete all files 50 | runner.clean(); 51 | } 52 | 53 | public void test_basic() throws Exception { 54 | 55 | final String index = "test_index"; 56 | final String type = "test_type"; 57 | 58 | { 59 | // create an index 60 | runner.createIndex(index, (Settings) null); 61 | runner.ensureYellow(index); 62 | 63 | // create a mapping 64 | final XContentBuilder mappingBuilder = XContentFactory.jsonBuilder()// 65 | .startObject()// 66 | .startObject(type)// 67 | .startObject("properties")// 68 | 69 | // id 70 | .startObject("id")// 71 | .field("type", "keyword")// 72 | .endObject()// 73 | 74 | // message 75 | .startObject("message")// 76 | .field("type", "langstring")// 77 | .endObject()// 78 | 79 | .endObject()// 80 | .endObject()// 81 | .endObject(); 82 | runner.createMapping(index, type, mappingBuilder); 83 | } 84 | 85 | if (!runner.indexExists(index)) { 86 | fail(); 87 | } 88 | 89 | { 90 | String id = "none"; 91 | final IndexResponse indexResponse1 = runner.insert(index, type, id, 92 | "{\"id\":\"" + id + "\",\"message\":\"\",\"test\":\"\"}"); 93 | assertEquals(Result.CREATED, indexResponse1.getResult()); 94 | } 95 | { 96 | String id = "en"; 97 | String message = "This is a pen."; 98 | final IndexResponse indexResponse1 = runner.insert(index, type, id, 99 | "{\"id\":\"" + id + "\",\"message\":\"" + message + "\",\"test\":\"" + message + "\"}"); 100 | assertEquals(Result.CREATED, indexResponse1.getResult()); 101 | } 102 | { 103 | String id = "fr"; 104 | String message = "C'est un stylo."; 105 | final IndexResponse indexResponse1 = runner.insert(index, type, id, 106 | "{\"id\":\"" + id + "\",\"message\":\"" + message + "\"}"); 107 | assertEquals(Result.CREATED, indexResponse1.getResult()); 108 | } 109 | { 110 | String id = "ja"; 111 | String message = "これはペンです。"; 112 | final IndexResponse indexResponse1 = runner.insert(index, type, id, 113 | "{\"id\":\"" + id + "\",\"message\":\"" + message + "\"}"); 114 | assertEquals(Result.CREATED, indexResponse1.getResult()); 115 | } 116 | { 117 | String id = "ko"; 118 | String message = "이것은펜 이다 ."; 119 | final IndexResponse indexResponse1 = runner.insert(index, type, id, 120 | "{\"id\":\"" + id + "\",\"message\":\"" + message + "\"}"); 121 | assertEquals(Result.CREATED, indexResponse1.getResult()); 122 | } 123 | { 124 | String id = "zh-cn"; 125 | String message = "这是一支笔。"; 126 | final IndexResponse indexResponse1 = runner.insert(index, type, id, 127 | "{\"id\":\"" + id + "\",\"message\":\"" + message + "\"}"); 128 | assertEquals(Result.CREATED, indexResponse1.getResult()); 129 | } 130 | { 131 | String id = "zh-tw"; 132 | String message = "這是一支鋼筆。"; 133 | final IndexResponse indexResponse1 = runner.insert(index, type, id, 134 | "{\"id\":\"" + id + "\",\"message\":\"" + message + "\"}"); 135 | assertEquals(Result.CREATED, indexResponse1.getResult()); 136 | } 137 | 138 | runner.refresh(); 139 | 140 | final Client client = runner.client(); 141 | 142 | { 143 | SearchResponse response = client.prepareSearch(index).setTypes(type) 144 | .setQuery(QueryBuilders.boolQuery() 145 | .filter(QueryBuilders.existsQuery("message_en"))) 146 | .execute().actionGet(); 147 | SearchHits searchHits = response.getHits(); 148 | assertEquals(1, searchHits.getTotalHits()); 149 | } 150 | { 151 | SearchResponse response = client.prepareSearch(index).setTypes(type) 152 | .setQuery(QueryBuilders.boolQuery() 153 | .filter(QueryBuilders.existsQuery("message_fr"))) 154 | .execute().actionGet(); 155 | SearchHits searchHits = response.getHits(); 156 | assertEquals(1, searchHits.getTotalHits()); 157 | } 158 | { 159 | SearchResponse response = client.prepareSearch(index).setTypes(type) 160 | .setQuery(QueryBuilders.boolQuery() 161 | .filter(QueryBuilders.existsQuery("message_ja"))) 162 | .execute().actionGet(); 163 | SearchHits searchHits = response.getHits(); 164 | assertEquals(1, searchHits.getTotalHits()); 165 | } 166 | { 167 | SearchResponse response = client.prepareSearch(index).setTypes(type) 168 | .setQuery(QueryBuilders.boolQuery() 169 | .filter(QueryBuilders.existsQuery("message_ko"))) 170 | .execute().actionGet(); 171 | SearchHits searchHits = response.getHits(); 172 | assertEquals(1, searchHits.getTotalHits()); 173 | } 174 | { 175 | SearchResponse response = client.prepareSearch(index).setTypes(type) 176 | .setQuery(QueryBuilders.boolQuery() 177 | .filter(QueryBuilders.existsQuery("message_zh-cn"))) 178 | .execute().actionGet(); 179 | SearchHits searchHits = response.getHits(); 180 | assertEquals(1, searchHits.getTotalHits()); 181 | } 182 | { 183 | SearchResponse response = client.prepareSearch(index).setTypes(type) 184 | .setQuery(QueryBuilders.boolQuery() 185 | .filter(QueryBuilders.existsQuery("message_zh-tw"))) 186 | .execute().actionGet(); 187 | SearchHits searchHits = response.getHits(); 188 | assertEquals(1, searchHits.getTotalHits()); 189 | } 190 | 191 | } 192 | 193 | public void test_withLang() throws Exception { 194 | 195 | final String index = "test_index"; 196 | final String type = "test_type"; 197 | 198 | { 199 | // create an index 200 | runner.createIndex(index, (Settings) null); 201 | runner.ensureYellow(index); 202 | 203 | // create a mapping 204 | final XContentBuilder mappingBuilder = XContentFactory.jsonBuilder()// 205 | .startObject()// 206 | .startObject(type)// 207 | .startObject("properties")// 208 | 209 | // id 210 | .startObject("id")// 211 | .field("type", "keyword")// 212 | .endObject()// 213 | 214 | // message 215 | .startObject("message")// 216 | .field("type", "langstring")// 217 | .field("lang_field", "lang")// 218 | .endObject()// 219 | 220 | // lang 221 | .startObject("lang")// 222 | .field("type", "keyword")// 223 | .endObject()// 224 | 225 | .endObject()// 226 | .endObject()// 227 | .endObject(); 228 | runner.createMapping(index, type, mappingBuilder); 229 | } 230 | 231 | if (!runner.indexExists(index)) { 232 | fail(); 233 | } 234 | 235 | { 236 | String id = "none"; 237 | final IndexResponse indexResponse1 = runner.insert(index, type, id, 238 | "{\"id\":\"" + id + "\",\"lang\":\"\",\"message\":\"\",\"test\":\"\"}"); 239 | assertEquals(Result.CREATED, indexResponse1.getResult()); 240 | } 241 | { 242 | String id = "en"; 243 | String message = "This is a pen."; 244 | final IndexResponse indexResponse1 = runner.insert(index, type, id, 245 | "{\"id\":\"" + id + "\",\"lang\":\"en\",\"message\":\"" + message + "\"}"); 246 | assertEquals(Result.CREATED, indexResponse1.getResult()); 247 | } 248 | { 249 | String id = "ja"; 250 | String message = "This is a pen."; 251 | final IndexResponse indexResponse1 = runner.insert(index, type, id, 252 | "{\"id\":\"" + id + "\",\"lang\":\"ja\",\"message\":\"" + message + "\"}"); 253 | assertEquals(Result.CREATED, indexResponse1.getResult()); 254 | } 255 | 256 | runner.refresh(); 257 | 258 | final Client client = runner.client(); 259 | 260 | { 261 | SearchResponse response = client.prepareSearch(index).setTypes(type) 262 | .setQuery(QueryBuilders.boolQuery() 263 | .filter(QueryBuilders.existsQuery("message_en"))) 264 | .execute().actionGet(); 265 | SearchHits searchHits = response.getHits(); 266 | assertEquals(1, searchHits.getTotalHits()); 267 | } 268 | { 269 | SearchResponse response = client.prepareSearch(index).setTypes(type) 270 | .setQuery(QueryBuilders.boolQuery() 271 | .filter(QueryBuilders.existsQuery("message_ja"))) 272 | .execute().actionGet(); 273 | SearchHits searchHits = response.getHits(); 274 | assertEquals(1, searchHits.getTotalHits()); 275 | } 276 | 277 | } 278 | 279 | public void test_withLangBaseName() throws Exception { 280 | 281 | final String index = "test_index"; 282 | final String type = "test_type"; 283 | 284 | { 285 | // create an index 286 | runner.createIndex(index, (Settings) null); 287 | runner.ensureYellow(index); 288 | 289 | // create a mapping 290 | final XContentBuilder mappingBuilder = XContentFactory.jsonBuilder()// 291 | .startObject()// 292 | .startObject(type)// 293 | .startObject("properties")// 294 | 295 | // id 296 | .startObject("id")// 297 | .field("type", "keyword")// 298 | .endObject()// 299 | 300 | // message 301 | .startObject("message")// 302 | .field("type", "langstring")// 303 | .field("lang_base_name", "content")// 304 | .field("lang_field", "lang")// 305 | .field("index", false)// 306 | .endObject()// 307 | 308 | // content 309 | .startObject("content")// 310 | .field("type", "langstring")// 311 | .field("lang_field", "lang")// 312 | .endObject()// 313 | 314 | // lang 315 | .startObject("lang")// 316 | .field("type", "keyword")// 317 | .endObject()// 318 | 319 | .endObject()// 320 | .endObject()// 321 | .endObject(); 322 | runner.createMapping(index, type, mappingBuilder); 323 | } 324 | 325 | if (!runner.indexExists(index)) { 326 | fail(); 327 | } 328 | 329 | { 330 | String id = "none"; 331 | final IndexResponse indexResponse1 = runner.insert(index, type, id, 332 | "{\"id\":\"" + id + "\",\"message\":\"\",\"test\":\"\"}"); 333 | assertEquals(Result.CREATED, indexResponse1.getResult()); 334 | } 335 | { 336 | String id = "default"; 337 | String message = "This is a dog."; 338 | final IndexResponse indexResponse1 = runner.insert(index, type, id, 339 | "{\"id\":\"" + id + "\",\"message\":\"" + message + "\"}"); 340 | assertEquals(Result.CREATED, indexResponse1.getResult()); 341 | } 342 | { 343 | String id = "en"; 344 | String message = "This is a pineapple."; 345 | final IndexResponse indexResponse1 = runner.insert(index, type, id, 346 | "{\"id\":\"" + id + "\",\"lang\":\"en\",\"message\":\"" + message + "\"}"); 347 | assertEquals(Result.CREATED, indexResponse1.getResult()); 348 | } 349 | { 350 | String id = "ja"; 351 | String message = "This is a pen."; 352 | String content = "This is an apple."; 353 | final IndexResponse indexResponse1 = runner.insert(index, type, id, 354 | "{\"id\":\"" + id + "\",\"lang\":\"ja\",\"message\":\"" + message + "\",\"content\":\"" + content + "\"}"); 355 | assertEquals(Result.CREATED, indexResponse1.getResult()); 356 | } 357 | 358 | runner.refresh(); 359 | 360 | final Client client = runner.client(); 361 | 362 | { 363 | SearchResponse response = client.prepareSearch(index).setTypes(type) 364 | .setQuery(QueryBuilders.boolQuery() 365 | .filter(QueryBuilders.existsQuery("message_en"))) 366 | .execute().actionGet(); 367 | SearchHits searchHits = response.getHits(); 368 | assertEquals(0, searchHits.getTotalHits()); 369 | } 370 | { 371 | SearchResponse response = client.prepareSearch(index).setTypes(type) 372 | .setQuery(QueryBuilders.boolQuery() 373 | .filter(QueryBuilders.existsQuery("message_ja"))) 374 | .execute().actionGet(); 375 | SearchHits searchHits = response.getHits(); 376 | assertEquals(0, searchHits.getTotalHits()); 377 | } 378 | { 379 | SearchResponse response = client.prepareSearch(index).setTypes(type) 380 | .setQuery(QueryBuilders.boolQuery() 381 | .filter(QueryBuilders.existsQuery("content_en"))) 382 | .execute().actionGet(); 383 | SearchHits searchHits = response.getHits(); 384 | assertEquals(2, searchHits.getTotalHits()); 385 | } 386 | { 387 | SearchResponse response = client.prepareSearch(index).setTypes(type) 388 | .setQuery(QueryBuilders.boolQuery() 389 | .filter(QueryBuilders.existsQuery("content_ja"))) 390 | .execute().actionGet(); 391 | SearchHits searchHits = response.getHits(); 392 | assertEquals(1, searchHits.getTotalHits()); 393 | } 394 | { 395 | SearchResponse response = client.prepareSearch(index).setTypes(type) 396 | .setQuery(QueryBuilders.boolQuery() 397 | .filter(QueryBuilders.matchQuery("content_ja", "pen"))) 398 | .execute().actionGet(); 399 | SearchHits searchHits = response.getHits(); 400 | assertEquals(1, searchHits.getTotalHits()); 401 | } 402 | { 403 | SearchResponse response = client.prepareSearch(index).setTypes(type) 404 | .setQuery(QueryBuilders.boolQuery() 405 | .filter(QueryBuilders.matchQuery("content_ja", "apple"))) 406 | .execute().actionGet(); 407 | SearchHits searchHits = response.getHits(); 408 | assertEquals(1, searchHits.getTotalHits()); 409 | } 410 | { 411 | SearchResponse response = client.prepareSearch(index).setTypes(type) 412 | .setQuery(QueryBuilders.boolQuery() 413 | .filter(QueryBuilders.matchQuery("content_ja", "pineapple"))) 414 | .execute().actionGet(); 415 | SearchHits searchHits = response.getHits(); 416 | assertEquals(0, searchHits.getTotalHits()); 417 | } 418 | 419 | } 420 | } 421 | -------------------------------------------------------------------------------- /src/test/java/org/codelibs/elasticsearch/langfield/detect/LangDetectorTest.java: -------------------------------------------------------------------------------- 1 | package org.codelibs.elasticsearch.langfield.detect; 2 | 3 | import static org.junit.Assert.assertEquals; 4 | 5 | import java.util.List; 6 | 7 | import org.codelibs.elasticsearch.langfield.detect.util.LangProfile; 8 | import org.elasticsearch.ElasticsearchException; 9 | import org.junit.After; 10 | import org.junit.Before; 11 | import org.junit.Test; 12 | 13 | /** 14 | * Unit test for {@link LangDetector} and {@link LangDetectorFactory}. 15 | * @author Nakatani Shuyo 16 | * 17 | */ 18 | public class LangDetectorTest { 19 | 20 | private static final String TRAINING_EN = "a a a b b c c d e"; 21 | 22 | private static final String TRAINING_FR = "a b b c c c d d d"; 23 | 24 | private static final String TRAINING_JA = "\u3042 \u3042 \u3042 \u3044 \u3046 \u3048 \u3048"; 25 | 26 | private LangDetectorFactory langDetectorFactory; 27 | 28 | @Before 29 | public void setUp() throws Exception { 30 | langDetectorFactory = new LangDetectorFactory(); 31 | 32 | 33 | LangProfile profile_en = new LangProfile("en"); 34 | for (String w : TRAINING_EN.split(" ")) 35 | profile_en.add(w); 36 | langDetectorFactory.addProfile(profile_en, 0, 3); 37 | 38 | LangProfile profile_fr = new LangProfile("fr"); 39 | for (String w : TRAINING_FR.split(" ")) 40 | profile_fr.add(w); 41 | langDetectorFactory.addProfile(profile_fr, 1, 3); 42 | 43 | LangProfile profile_ja = new LangProfile("ja"); 44 | for (String w : TRAINING_JA.split(" ")) 45 | profile_ja.add(w); 46 | langDetectorFactory.addProfile(profile_ja, 2, 3); 47 | } 48 | 49 | @After 50 | public void tearDown() throws Exception { 51 | } 52 | 53 | @Test 54 | public final void testDetector1() throws ElasticsearchException { 55 | LangDetector detect = langDetectorFactory.getLangDetector(); 56 | detect.append("a"); 57 | assertEquals(detect.detect(), "en"); 58 | } 59 | 60 | @Test 61 | public final void testDetector2() throws ElasticsearchException { 62 | LangDetector detect = langDetectorFactory.getLangDetector(); 63 | detect.append("b d"); 64 | assertEquals(detect.detect(), "fr"); 65 | } 66 | 67 | @Test 68 | public final void testDetector3() throws ElasticsearchException { 69 | LangDetector detect = langDetectorFactory.getLangDetector(); 70 | detect.append("d e"); 71 | assertEquals(detect.detect(), "en"); 72 | } 73 | 74 | @Test 75 | public final void testDetector4() throws ElasticsearchException { 76 | LangDetector detect = langDetectorFactory.getLangDetector(); 77 | detect.append("\u3042\u3042\u3042\u3042a"); 78 | assertEquals(detect.detect(), "ja"); 79 | } 80 | 81 | @Test 82 | public final void testLangList() throws ElasticsearchException { 83 | List langList = langDetectorFactory.getLangList(); 84 | assertEquals(langList.size(), 3); 85 | assertEquals(langList.get(0), "en"); 86 | assertEquals(langList.get(1), "fr"); 87 | assertEquals(langList.get(2), "ja"); 88 | } 89 | 90 | @Test(expected = UnsupportedOperationException.class) 91 | public final void testLangListException() throws ElasticsearchException { 92 | List langList = langDetectorFactory.getLangList(); 93 | langList.add("hoge"); 94 | //langList.add(1, "hoge"); 95 | } 96 | 97 | } -------------------------------------------------------------------------------- /src/test/java/org/codelibs/elasticsearch/langfield/detect/LanguageTest.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | */ 4 | package org.codelibs.elasticsearch.langfield.detect; 5 | 6 | import static org.junit.Assert.*; 7 | 8 | import org.junit.After; 9 | import org.junit.Before; 10 | import org.junit.Test; 11 | 12 | /** 13 | * @author Nakatani Shuyo 14 | * 15 | */ 16 | public class LanguageTest { 17 | 18 | /** 19 | * @throws java.lang.Exception 20 | */ 21 | @Before 22 | public void setUp() throws Exception { 23 | } 24 | 25 | /** 26 | * @throws java.lang.Exception 27 | */ 28 | @After 29 | public void tearDown() throws Exception { 30 | } 31 | 32 | /** 33 | * Test method for {@link org.codelibs.elasticsearch.langfield.detect.Language#Language(java.lang.String, double)}. 34 | */ 35 | @Test 36 | public final void testLanguage() { 37 | Language lang = new Language(null, 0); 38 | assertEquals(lang.lang, null); 39 | assertEquals(lang.prob, 0.0, 0.0001); 40 | assertEquals(lang.toString(), ""); 41 | 42 | Language lang2 = new Language("en", 1.0); 43 | assertEquals(lang2.lang, "en"); 44 | assertEquals(lang2.prob, 1.0, 0.0001); 45 | assertEquals(lang2.toString(), "en:1.0"); 46 | 47 | } 48 | 49 | } 50 | -------------------------------------------------------------------------------- /src/test/java/org/codelibs/elasticsearch/langfield/detect/util/LangProfileTest.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | */ 4 | package org.codelibs.elasticsearch.langfield.detect.util; 5 | 6 | import static org.junit.Assert.*; 7 | 8 | import org.junit.After; 9 | import org.junit.AfterClass; 10 | import org.junit.Before; 11 | import org.junit.BeforeClass; 12 | import org.junit.Test; 13 | 14 | /** 15 | * @author Nakatani Shuyo 16 | * 17 | */ 18 | public class LangProfileTest { 19 | 20 | /** 21 | * @throws java.lang.Exception 22 | */ 23 | @BeforeClass 24 | public static void setUpBeforeClass() throws Exception { 25 | } 26 | 27 | /** 28 | * @throws java.lang.Exception 29 | */ 30 | @AfterClass 31 | public static void tearDownAfterClass() throws Exception { 32 | } 33 | 34 | /** 35 | * @throws java.lang.Exception 36 | */ 37 | @Before 38 | public void setUp() throws Exception { 39 | } 40 | 41 | /** 42 | * @throws java.lang.Exception 43 | */ 44 | @After 45 | public void tearDown() throws Exception { 46 | } 47 | 48 | /** 49 | * Test method for {@link org.codelibs.elasticsearch.langfield.detect.util.LangProfile#LangProfile()}. 50 | */ 51 | @Test 52 | public final void testLangProfile() { 53 | LangProfile profile = new LangProfile(); 54 | assertEquals(profile.name, null); 55 | } 56 | 57 | /** 58 | * Test method for {@link org.codelibs.elasticsearch.langfield.detect.util.LangProfile#LangProfile(java.lang.String)}. 59 | */ 60 | @Test 61 | public final void testLangProfileStringInt() { 62 | LangProfile profile = new LangProfile("en"); 63 | assertEquals(profile.name, "en"); 64 | } 65 | 66 | /** 67 | * Test method for {@link org.codelibs.elasticsearch.langfield.detect.util.LangProfile#add(java.lang.String)}. 68 | */ 69 | @Test 70 | public final void testAdd() { 71 | LangProfile profile = new LangProfile("en"); 72 | profile.add("a"); 73 | assertEquals((int)profile.freq.get("a"), 1); 74 | profile.add("a"); 75 | assertEquals((int)profile.freq.get("a"), 2); 76 | profile.omitLessFreq(); 77 | } 78 | 79 | 80 | /** 81 | * Illegal call test for {@link LangProfile#add(String)} 82 | */ 83 | @Test 84 | public final void testAddIllegally1() { 85 | LangProfile profile = new LangProfile(); // Illegal ( available for only JSONIC ) but ignore 86 | profile.add("a"); // ignore 87 | assertEquals(profile.freq.get("a"), null); // ignored 88 | } 89 | 90 | /** 91 | * Illegal call test for {@link LangProfile#add(String)} 92 | */ 93 | @Test 94 | public final void testAddIllegally2() { 95 | LangProfile profile = new LangProfile("en"); 96 | profile.add("a"); 97 | profile.add(""); // Illegal (string's length of parameter must be between 1 and 3) but ignore 98 | profile.add("abcd"); // as well 99 | assertEquals((int)profile.freq.get("a"), 1); 100 | assertEquals(profile.freq.get(""), null); // ignored 101 | assertEquals(profile.freq.get("abcd"), null); // ignored 102 | 103 | } 104 | 105 | /** 106 | * Test method for {@link org.codelibs.elasticsearch.langfield.detect.util.LangProfile#omitLessFreq()}. 107 | */ 108 | @Test 109 | public final void testOmitLessFreq() { 110 | LangProfile profile = new LangProfile("en"); 111 | String[] grams = "a b c \u3042 \u3044 \u3046 \u3048 \u304a \u304b \u304c \u304d \u304e \u304f".split(" "); 112 | for (int i=0;i<5;++i) for (String g : grams) { 113 | profile.add(g); 114 | } 115 | profile.add("\u3050"); 116 | 117 | assertEquals((int)profile.freq.get("a"), 5); 118 | assertEquals((int)profile.freq.get("\u3042"), 5); 119 | assertEquals((int)profile.freq.get("\u3050"), 1); 120 | profile.omitLessFreq(); 121 | assertEquals(profile.freq.get("a"), null); // omitted 122 | assertEquals((int)profile.freq.get("\u3042"), 5); 123 | assertEquals(profile.freq.get("\u3050"), null); // omitted 124 | } 125 | 126 | /** 127 | * Illegal call test for {@link org.codelibs.elasticsearch.langfield.detect.util.LangProfile#omitLessFreq()}. 128 | */ 129 | @Test 130 | public final void testOmitLessFreqIllegally() { 131 | LangProfile profile = new LangProfile(); 132 | profile.omitLessFreq(); // ignore 133 | } 134 | 135 | } 136 | -------------------------------------------------------------------------------- /src/test/java/org/codelibs/elasticsearch/langfield/detect/util/NGramTest.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | */ 4 | package org.codelibs.elasticsearch.langfield.detect.util; 5 | 6 | import static org.junit.Assert.*; 7 | 8 | import static org.hamcrest.CoreMatchers.is; 9 | import org.junit.After; 10 | import org.junit.Before; 11 | import org.junit.Test; 12 | 13 | /** 14 | * @author Nakatani Shuyo 15 | * 16 | */ 17 | public class NGramTest { 18 | 19 | /** 20 | * @throws java.lang.Exception 21 | */ 22 | @Before 23 | public void setUp() throws Exception { 24 | } 25 | 26 | /** 27 | * @throws java.lang.Exception 28 | */ 29 | @After 30 | public void tearDown() throws Exception { 31 | } 32 | 33 | /** 34 | * Test method for constants 35 | */ 36 | @Test 37 | public final void testConstants() { 38 | assertThat(NGram.N_GRAM, is(3)); 39 | assertEquals(NGram.N_GRAM, 3); 40 | } 41 | 42 | /** 43 | * Test method for {@link NGram#normalize(char)} with Latin characters 44 | */ 45 | @Test 46 | public final void testNormalizeWithLatin() { 47 | assertEquals(NGram.normalize('\u0000'), ' '); 48 | assertEquals(NGram.normalize('\u0009'), ' '); 49 | assertEquals(NGram.normalize('\u0020'), ' '); 50 | assertEquals(NGram.normalize('\u0030'), ' '); 51 | assertEquals(NGram.normalize('\u0040'), ' '); 52 | assertEquals(NGram.normalize('\u0041'), '\u0041'); 53 | assertEquals(NGram.normalize('\u005a'), '\u005a'); 54 | assertEquals(NGram.normalize('\u005b'), ' '); 55 | assertEquals(NGram.normalize('\u0060'), ' '); 56 | assertEquals(NGram.normalize('\u0061'), '\u0061'); 57 | assertEquals(NGram.normalize('\u007a'), '\u007a'); 58 | assertEquals(NGram.normalize('\u007b'), ' '); 59 | assertEquals(NGram.normalize('\u007f'), ' '); 60 | assertEquals(NGram.normalize('\u0080'), '\u0080'); 61 | assertEquals(NGram.normalize('\u00a0'), ' '); 62 | assertEquals(NGram.normalize('\u00a1'), '\u00a1'); 63 | } 64 | 65 | /** 66 | * Test method for {@link NGram#normalize(char)} with CJK Kanji characters 67 | */ 68 | @Test 69 | public final void testNormalizeWithCJKKanji() { 70 | assertEquals(NGram.normalize('\u4E00'), '\u4E00'); 71 | assertEquals(NGram.normalize('\u4E01'), '\u4E01'); 72 | assertEquals(NGram.normalize('\u4E02'), '\u4E02'); 73 | assertEquals(NGram.normalize('\u4E03'), '\u4E01'); 74 | assertEquals(NGram.normalize('\u4E04'), '\u4E04'); 75 | assertEquals(NGram.normalize('\u4E05'), '\u4E05'); 76 | assertEquals(NGram.normalize('\u4E06'), '\u4E06'); 77 | assertEquals(NGram.normalize('\u4E07'), '\u4E07'); 78 | assertEquals(NGram.normalize('\u4E08'), '\u4E08'); 79 | assertEquals(NGram.normalize('\u4E09'), '\u4E09'); 80 | assertEquals(NGram.normalize('\u4E10'), '\u4E10'); 81 | assertEquals(NGram.normalize('\u4E11'), '\u4E11'); 82 | assertEquals(NGram.normalize('\u4E12'), '\u4E12'); 83 | assertEquals(NGram.normalize('\u4E13'), '\u4E13'); 84 | assertEquals(NGram.normalize('\u4E14'), '\u4E14'); 85 | assertEquals(NGram.normalize('\u4E15'), '\u4E15'); 86 | assertEquals(NGram.normalize('\u4E1e'), '\u4E1e'); 87 | assertEquals(NGram.normalize('\u4E1f'), '\u4E1f'); 88 | assertEquals(NGram.normalize('\u4E20'), '\u4E20'); 89 | assertEquals(NGram.normalize('\u4E21'), '\u4E21'); 90 | assertEquals(NGram.normalize('\u4E22'), '\u4E22'); 91 | assertEquals(NGram.normalize('\u4E23'), '\u4E23'); 92 | assertEquals(NGram.normalize('\u4E24'), '\u4E13'); 93 | assertEquals(NGram.normalize('\u4E25'), '\u4E13'); 94 | assertEquals(NGram.normalize('\u4E30'), '\u4E30'); 95 | } 96 | 97 | /** 98 | * Test method for {@link NGram#normalize(char)} for Romanian characters 99 | */ 100 | @Test 101 | public final void testNormalizeForRomanian() { 102 | assertEquals(NGram.normalize('\u015f'), '\u015f'); 103 | assertEquals(NGram.normalize('\u0163'), '\u0163'); 104 | assertEquals(NGram.normalize('\u0219'), '\u015f'); 105 | assertEquals(NGram.normalize('\u021b'), '\u0163'); 106 | } 107 | 108 | /** 109 | * Test method for {@link NGram#get(int)} and {@link NGram#addChar(char)} 110 | */ 111 | @Test 112 | public final void testNGram() { 113 | NGram ngram = new NGram(); 114 | assertEquals(ngram.get(0), null); 115 | assertEquals(ngram.get(1), null); 116 | assertEquals(ngram.get(2), null); 117 | assertEquals(ngram.get(3), null); 118 | assertEquals(ngram.get(4), null); 119 | ngram.addChar(' '); 120 | assertEquals(ngram.get(1), null); 121 | assertEquals(ngram.get(2), null); 122 | assertEquals(ngram.get(3), null); 123 | ngram.addChar('A'); 124 | assertEquals(ngram.get(1), "A"); 125 | assertEquals(ngram.get(2), " A"); 126 | assertEquals(ngram.get(3), null); 127 | ngram.addChar('\u06cc'); 128 | assertEquals(ngram.get(1), "\u064a"); 129 | assertEquals(ngram.get(2), "A\u064a"); 130 | assertEquals(ngram.get(3), " A\u064a"); 131 | ngram.addChar('\u1ea0'); 132 | assertEquals(ngram.get(1), "\u1ec3"); 133 | assertEquals(ngram.get(2), "\u064a\u1ec3"); 134 | assertEquals(ngram.get(3), "A\u064a\u1ec3"); 135 | ngram.addChar('\u3044'); 136 | assertEquals(ngram.get(1), "\u3042"); 137 | assertEquals(ngram.get(2), "\u1ec3\u3042"); 138 | assertEquals(ngram.get(3), "\u064a\u1ec3\u3042"); 139 | 140 | ngram.addChar('\u30a4'); 141 | assertEquals(ngram.get(1), "\u30a2"); 142 | assertEquals(ngram.get(2), "\u3042\u30a2"); 143 | assertEquals(ngram.get(3), "\u1ec3\u3042\u30a2"); 144 | ngram.addChar('\u3106'); 145 | assertEquals(ngram.get(1), "\u3105"); 146 | assertEquals(ngram.get(2), "\u30a2\u3105"); 147 | assertEquals(ngram.get(3), "\u3042\u30a2\u3105"); 148 | ngram.addChar('\uac01'); 149 | assertEquals(ngram.get(1), "\uac00"); 150 | assertEquals(ngram.get(2), "\u3105\uac00"); 151 | assertEquals(ngram.get(3), "\u30a2\u3105\uac00"); 152 | ngram.addChar('\u2010'); 153 | assertEquals(ngram.get(1), null); 154 | assertEquals(ngram.get(2), "\uac00 "); 155 | assertEquals(ngram.get(3), "\u3105\uac00 "); 156 | 157 | ngram.addChar('a'); 158 | assertEquals(ngram.get(1), "a"); 159 | assertEquals(ngram.get(2), " a"); 160 | assertEquals(ngram.get(3), null); 161 | 162 | } 163 | 164 | /** 165 | * Test method for {@link NGram#get(int)} and {@link NGram#addChar(char)} 166 | */ 167 | @Test 168 | public final void testNGram3() { 169 | NGram ngram = new NGram(); 170 | 171 | ngram.addChar('A'); 172 | assertEquals(ngram.get(1), "A"); 173 | assertEquals(ngram.get(2), " A"); 174 | assertEquals(ngram.get(3), null); 175 | 176 | ngram.addChar('1'); 177 | assertEquals(ngram.get(1), null); 178 | assertEquals(ngram.get(2), "A "); 179 | assertEquals(ngram.get(3), " A "); 180 | 181 | ngram.addChar('B'); 182 | assertEquals(ngram.get(1), "B"); 183 | assertEquals(ngram.get(2), " B"); 184 | assertEquals(ngram.get(3), null); 185 | 186 | } 187 | 188 | /** 189 | * Test method for {@link NGram#get(int)} and {@link NGram#addChar(char)} 190 | */ 191 | @Test 192 | public final void testNormalizeVietnamese() { 193 | assertEquals(NGram.normalize_vi(""), ""); 194 | assertEquals(NGram.normalize_vi("ABC"), "ABC"); 195 | assertEquals(NGram.normalize_vi("012"), "012"); 196 | assertEquals(NGram.normalize_vi("\u00c0"), "\u00c0"); 197 | 198 | assertEquals(NGram.normalize_vi("\u0041\u0300"), "\u00C0"); 199 | assertEquals(NGram.normalize_vi("\u0045\u0300"), "\u00C8"); 200 | assertEquals(NGram.normalize_vi("\u0049\u0300"), "\u00CC"); 201 | assertEquals(NGram.normalize_vi("\u004F\u0300"), "\u00D2"); 202 | assertEquals(NGram.normalize_vi("\u0055\u0300"), "\u00D9"); 203 | assertEquals(NGram.normalize_vi("\u0059\u0300"), "\u1EF2"); 204 | assertEquals(NGram.normalize_vi("\u0061\u0300"), "\u00E0"); 205 | assertEquals(NGram.normalize_vi("\u0065\u0300"), "\u00E8"); 206 | assertEquals(NGram.normalize_vi("\u0069\u0300"), "\u00EC"); 207 | assertEquals(NGram.normalize_vi("\u006F\u0300"), "\u00F2"); 208 | assertEquals(NGram.normalize_vi("\u0075\u0300"), "\u00F9"); 209 | assertEquals(NGram.normalize_vi("\u0079\u0300"), "\u1EF3"); 210 | assertEquals(NGram.normalize_vi("\u00C2\u0300"), "\u1EA6"); 211 | assertEquals(NGram.normalize_vi("\u00CA\u0300"), "\u1EC0"); 212 | assertEquals(NGram.normalize_vi("\u00D4\u0300"), "\u1ED2"); 213 | assertEquals(NGram.normalize_vi("\u00E2\u0300"), "\u1EA7"); 214 | assertEquals(NGram.normalize_vi("\u00EA\u0300"), "\u1EC1"); 215 | assertEquals(NGram.normalize_vi("\u00F4\u0300"), "\u1ED3"); 216 | assertEquals(NGram.normalize_vi("\u0102\u0300"), "\u1EB0"); 217 | assertEquals(NGram.normalize_vi("\u0103\u0300"), "\u1EB1"); 218 | assertEquals(NGram.normalize_vi("\u01A0\u0300"), "\u1EDC"); 219 | assertEquals(NGram.normalize_vi("\u01A1\u0300"), "\u1EDD"); 220 | assertEquals(NGram.normalize_vi("\u01AF\u0300"), "\u1EEA"); 221 | assertEquals(NGram.normalize_vi("\u01B0\u0300"), "\u1EEB"); 222 | 223 | assertEquals(NGram.normalize_vi("\u0041\u0301"), "\u00C1"); 224 | assertEquals(NGram.normalize_vi("\u0045\u0301"), "\u00C9"); 225 | assertEquals(NGram.normalize_vi("\u0049\u0301"), "\u00CD"); 226 | assertEquals(NGram.normalize_vi("\u004F\u0301"), "\u00D3"); 227 | assertEquals(NGram.normalize_vi("\u0055\u0301"), "\u00DA"); 228 | assertEquals(NGram.normalize_vi("\u0059\u0301"), "\u00DD"); 229 | assertEquals(NGram.normalize_vi("\u0061\u0301"), "\u00E1"); 230 | assertEquals(NGram.normalize_vi("\u0065\u0301"), "\u00E9"); 231 | assertEquals(NGram.normalize_vi("\u0069\u0301"), "\u00ED"); 232 | assertEquals(NGram.normalize_vi("\u006F\u0301"), "\u00F3"); 233 | assertEquals(NGram.normalize_vi("\u0075\u0301"), "\u00FA"); 234 | assertEquals(NGram.normalize_vi("\u0079\u0301"), "\u00FD"); 235 | assertEquals(NGram.normalize_vi("\u00C2\u0301"), "\u1EA4"); 236 | assertEquals(NGram.normalize_vi("\u00CA\u0301"), "\u1EBE"); 237 | assertEquals(NGram.normalize_vi("\u00D4\u0301"), "\u1ED0"); 238 | assertEquals(NGram.normalize_vi("\u00E2\u0301"), "\u1EA5"); 239 | assertEquals(NGram.normalize_vi("\u00EA\u0301"), "\u1EBF"); 240 | assertEquals(NGram.normalize_vi("\u00F4\u0301"), "\u1ED1"); 241 | assertEquals(NGram.normalize_vi("\u0102\u0301"), "\u1EAE"); 242 | assertEquals(NGram.normalize_vi("\u0103\u0301"), "\u1EAF"); 243 | assertEquals(NGram.normalize_vi("\u01A0\u0301"), "\u1EDA"); 244 | assertEquals(NGram.normalize_vi("\u01A1\u0301"), "\u1EDB"); 245 | assertEquals(NGram.normalize_vi("\u01AF\u0301"), "\u1EE8"); 246 | assertEquals(NGram.normalize_vi("\u01B0\u0301"), "\u1EE9"); 247 | 248 | assertEquals(NGram.normalize_vi("\u0041\u0303"), "\u00C3"); 249 | assertEquals(NGram.normalize_vi("\u0045\u0303"), "\u1EBC"); 250 | assertEquals(NGram.normalize_vi("\u0049\u0303"), "\u0128"); 251 | assertEquals(NGram.normalize_vi("\u004F\u0303"), "\u00D5"); 252 | assertEquals(NGram.normalize_vi("\u0055\u0303"), "\u0168"); 253 | assertEquals(NGram.normalize_vi("\u0059\u0303"), "\u1EF8"); 254 | assertEquals(NGram.normalize_vi("\u0061\u0303"), "\u00E3"); 255 | assertEquals(NGram.normalize_vi("\u0065\u0303"), "\u1EBD"); 256 | assertEquals(NGram.normalize_vi("\u0069\u0303"), "\u0129"); 257 | assertEquals(NGram.normalize_vi("\u006F\u0303"), "\u00F5"); 258 | assertEquals(NGram.normalize_vi("\u0075\u0303"), "\u0169"); 259 | assertEquals(NGram.normalize_vi("\u0079\u0303"), "\u1EF9"); 260 | assertEquals(NGram.normalize_vi("\u00C2\u0303"), "\u1EAA"); 261 | assertEquals(NGram.normalize_vi("\u00CA\u0303"), "\u1EC4"); 262 | assertEquals(NGram.normalize_vi("\u00D4\u0303"), "\u1ED6"); 263 | assertEquals(NGram.normalize_vi("\u00E2\u0303"), "\u1EAB"); 264 | assertEquals(NGram.normalize_vi("\u00EA\u0303"), "\u1EC5"); 265 | assertEquals(NGram.normalize_vi("\u00F4\u0303"), "\u1ED7"); 266 | assertEquals(NGram.normalize_vi("\u0102\u0303"), "\u1EB4"); 267 | assertEquals(NGram.normalize_vi("\u0103\u0303"), "\u1EB5"); 268 | assertEquals(NGram.normalize_vi("\u01A0\u0303"), "\u1EE0"); 269 | assertEquals(NGram.normalize_vi("\u01A1\u0303"), "\u1EE1"); 270 | assertEquals(NGram.normalize_vi("\u01AF\u0303"), "\u1EEE"); 271 | assertEquals(NGram.normalize_vi("\u01B0\u0303"), "\u1EEF"); 272 | 273 | assertEquals(NGram.normalize_vi("\u0041\u0309"), "\u1EA2"); 274 | assertEquals(NGram.normalize_vi("\u0045\u0309"), "\u1EBA"); 275 | assertEquals(NGram.normalize_vi("\u0049\u0309"), "\u1EC8"); 276 | assertEquals(NGram.normalize_vi("\u004F\u0309"), "\u1ECE"); 277 | assertEquals(NGram.normalize_vi("\u0055\u0309"), "\u1EE6"); 278 | assertEquals(NGram.normalize_vi("\u0059\u0309"), "\u1EF6"); 279 | assertEquals(NGram.normalize_vi("\u0061\u0309"), "\u1EA3"); 280 | assertEquals(NGram.normalize_vi("\u0065\u0309"), "\u1EBB"); 281 | assertEquals(NGram.normalize_vi("\u0069\u0309"), "\u1EC9"); 282 | assertEquals(NGram.normalize_vi("\u006F\u0309"), "\u1ECF"); 283 | assertEquals(NGram.normalize_vi("\u0075\u0309"), "\u1EE7"); 284 | assertEquals(NGram.normalize_vi("\u0079\u0309"), "\u1EF7"); 285 | assertEquals(NGram.normalize_vi("\u00C2\u0309"), "\u1EA8"); 286 | assertEquals(NGram.normalize_vi("\u00CA\u0309"), "\u1EC2"); 287 | assertEquals(NGram.normalize_vi("\u00D4\u0309"), "\u1ED4"); 288 | assertEquals(NGram.normalize_vi("\u00E2\u0309"), "\u1EA9"); 289 | assertEquals(NGram.normalize_vi("\u00EA\u0309"), "\u1EC3"); 290 | assertEquals(NGram.normalize_vi("\u00F4\u0309"), "\u1ED5"); 291 | assertEquals(NGram.normalize_vi("\u0102\u0309"), "\u1EB2"); 292 | assertEquals(NGram.normalize_vi("\u0103\u0309"), "\u1EB3"); 293 | assertEquals(NGram.normalize_vi("\u01A0\u0309"), "\u1EDE"); 294 | assertEquals(NGram.normalize_vi("\u01A1\u0309"), "\u1EDF"); 295 | assertEquals(NGram.normalize_vi("\u01AF\u0309"), "\u1EEC"); 296 | assertEquals(NGram.normalize_vi("\u01B0\u0309"), "\u1EED"); 297 | 298 | assertEquals(NGram.normalize_vi("\u0041\u0323"), "\u1EA0"); 299 | assertEquals(NGram.normalize_vi("\u0045\u0323"), "\u1EB8"); 300 | assertEquals(NGram.normalize_vi("\u0049\u0323"), "\u1ECA"); 301 | assertEquals(NGram.normalize_vi("\u004F\u0323"), "\u1ECC"); 302 | assertEquals(NGram.normalize_vi("\u0055\u0323"), "\u1EE4"); 303 | assertEquals(NGram.normalize_vi("\u0059\u0323"), "\u1EF4"); 304 | assertEquals(NGram.normalize_vi("\u0061\u0323"), "\u1EA1"); 305 | assertEquals(NGram.normalize_vi("\u0065\u0323"), "\u1EB9"); 306 | assertEquals(NGram.normalize_vi("\u0069\u0323"), "\u1ECB"); 307 | assertEquals(NGram.normalize_vi("\u006F\u0323"), "\u1ECD"); 308 | assertEquals(NGram.normalize_vi("\u0075\u0323"), "\u1EE5"); 309 | assertEquals(NGram.normalize_vi("\u0079\u0323"), "\u1EF5"); 310 | assertEquals(NGram.normalize_vi("\u00C2\u0323"), "\u1EAC"); 311 | assertEquals(NGram.normalize_vi("\u00CA\u0323"), "\u1EC6"); 312 | assertEquals(NGram.normalize_vi("\u00D4\u0323"), "\u1ED8"); 313 | assertEquals(NGram.normalize_vi("\u00E2\u0323"), "\u1EAD"); 314 | assertEquals(NGram.normalize_vi("\u00EA\u0323"), "\u1EC7"); 315 | assertEquals(NGram.normalize_vi("\u00F4\u0323"), "\u1ED9"); 316 | assertEquals(NGram.normalize_vi("\u0102\u0323"), "\u1EB6"); 317 | assertEquals(NGram.normalize_vi("\u0103\u0323"), "\u1EB7"); 318 | assertEquals(NGram.normalize_vi("\u01A0\u0323"), "\u1EE2"); 319 | assertEquals(NGram.normalize_vi("\u01A1\u0323"), "\u1EE3"); 320 | assertEquals(NGram.normalize_vi("\u01AF\u0323"), "\u1EF0"); 321 | assertEquals(NGram.normalize_vi("\u01B0\u0323"), "\u1EF1"); 322 | 323 | } 324 | } --------------------------------------------------------------------------------