Juartaurus commited on
Commit
1865436
1 Parent(s): e5c7430

Upload folder using huggingface_hub

Browse files
This view is limited to 50 files because it contains too many changes.   See raw diff
Files changed (50) hide show
  1. .gitattributes +12 -0
  2. .gitignore +145 -0
  3. README.md +29 -8
  4. README_.md +7 -0
  5. VnCoreNLP/LICENSE.md +14 -0
  6. VnCoreNLP/Readme.md +136 -0
  7. VnCoreNLP/TagsetDescription.md +67 -0
  8. VnCoreNLP/VLSP2013_POS_tagset.pdf +0 -0
  9. VnCoreNLP/VnCoreNLP-1.1.1.jar +3 -0
  10. VnCoreNLP/VnCoreNLP-1.2.jar +3 -0
  11. VnCoreNLP/VnDT-treebank-description.pdf +0 -0
  12. VnCoreNLP/models/dep/vi-dep.xz +3 -0
  13. VnCoreNLP/models/ner/vi-500brownclusters.xz +3 -0
  14. VnCoreNLP/models/ner/vi-ner.xz +3 -0
  15. VnCoreNLP/models/ner/vi-pretrainedembeddings.xz +3 -0
  16. VnCoreNLP/models/postagger/vi-tagger +3 -0
  17. VnCoreNLP/models/wordsegmenter/vi-vocab +0 -0
  18. VnCoreNLP/models/wordsegmenter/wordsegmenter.rdr +0 -0
  19. VnCoreNLP/pom.xml +103 -0
  20. VnCoreNLP/src/main/java/vn/corenlp/ner/NerRecognizer.java +85 -0
  21. VnCoreNLP/src/main/java/vn/corenlp/parser/DependencyParser.java +74 -0
  22. VnCoreNLP/src/main/java/vn/corenlp/postagger/PosTagger.java +65 -0
  23. VnCoreNLP/src/main/java/vn/corenlp/tokenizer/StringUtils.java +207 -0
  24. VnCoreNLP/src/main/java/vn/corenlp/tokenizer/Tokenizer.java +397 -0
  25. VnCoreNLP/src/main/java/vn/corenlp/wordsegmenter/FWObject.java +30 -0
  26. VnCoreNLP/src/main/java/vn/corenlp/wordsegmenter/Node.java +85 -0
  27. VnCoreNLP/src/main/java/vn/corenlp/wordsegmenter/Utils.java +126 -0
  28. VnCoreNLP/src/main/java/vn/corenlp/wordsegmenter/Vocabulary.java +1605 -0
  29. VnCoreNLP/src/main/java/vn/corenlp/wordsegmenter/WordSegmenter.java +245 -0
  30. VnCoreNLP/src/main/java/vn/corenlp/wordsegmenter/WordTag.java +13 -0
  31. VnCoreNLP/src/main/java/vn/pipeline/Annotation.java +147 -0
  32. VnCoreNLP/src/main/java/vn/pipeline/LexicalInitializer.java +82 -0
  33. VnCoreNLP/src/main/java/vn/pipeline/Sentence.java +110 -0
  34. VnCoreNLP/src/main/java/vn/pipeline/Utils.java +31 -0
  35. VnCoreNLP/src/main/java/vn/pipeline/VnCoreNLP.java +134 -0
  36. VnCoreNLP/src/main/java/vn/pipeline/Word.java +111 -0
  37. VnCoreNLP/src/main/resources/log4j.properties +10 -0
  38. VnCoreNLP/src/test/java/VnCoreNLPExample.java +30 -0
  39. __pycache__/app.cpython-38.pyc +0 -0
  40. api/__pycache__/tracker.cpython-38.pyc +0 -0
  41. api/detector.py +37 -0
  42. api/ir.py +0 -0
  43. api/tracker.py +44 -0
  44. app.py +291 -0
  45. backend/__init__.py +1 -0
  46. backend/main.py +4 -0
  47. backend/server/__pycache__/app.cpython-38.pyc +0 -0
  48. backend/server/__pycache__/database.cpython-38.pyc +0 -0
  49. backend/server/__pycache__/services.cpython-38.pyc +0 -0
  50. backend/server/app.py +19 -0
.gitattributes CHANGED
@@ -33,3 +33,15 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
 
 
 
 
 
 
 
 
 
 
 
 
 
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
36
+ VnCoreNLP/VnCoreNLP-1.1.1.jar filter=lfs diff=lfs merge=lfs -text
37
+ VnCoreNLP/VnCoreNLP-1.2.jar filter=lfs diff=lfs merge=lfs -text
38
+ VnCoreNLP/models/postagger/vi-tagger filter=lfs diff=lfs merge=lfs -text
39
+ checkpoints/ir/ir_2.bak filter=lfs diff=lfs merge=lfs -text
40
+ src/sts/build/lib.linux-x86_64-cpython-38/detectron2/_C.cpython-38-x86_64-linux-gnu.so filter=lfs diff=lfs merge=lfs -text
41
+ src/sts/build/temp.linux-x86_64-cpython-38/home/kienvs/sources/poi_engineering_api/src/sts/detectron2/layers/csrc/ROIAlignRotated/ROIAlignRotated_cpu.o filter=lfs diff=lfs merge=lfs -text
42
+ src/sts/build/temp.linux-x86_64-cpython-38/home/kienvs/sources/poi_engineering_api/src/sts/detectron2/layers/csrc/box_iou_rotated/box_iou_rotated_cpu.o filter=lfs diff=lfs merge=lfs -text
43
+ src/sts/build/temp.linux-x86_64-cpython-38/home/kienvs/sources/poi_engineering_api/src/sts/detectron2/layers/csrc/cocoeval/cocoeval.o filter=lfs diff=lfs merge=lfs -text
44
+ src/sts/build/temp.linux-x86_64-cpython-38/home/kienvs/sources/poi_engineering_api/src/sts/detectron2/layers/csrc/nms_rotated/nms_rotated_cpu.o filter=lfs diff=lfs merge=lfs -text
45
+ src/sts/build/temp.linux-x86_64-cpython-38/home/kienvs/sources/poi_engineering_api/src/sts/detectron2/layers/csrc/vision.o filter=lfs diff=lfs merge=lfs -text
46
+ src/sts/detectron2/_C.cpython-38-x86_64-linux-gnu.so filter=lfs diff=lfs merge=lfs -text
47
+ src/sts/dist/detectron2-0.4-py3.8-linux-x86_64.egg filter=lfs diff=lfs merge=lfs -text
.gitignore ADDED
@@ -0,0 +1,145 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # outputs
2
+ outputs/*
3
+
4
+ # uploads
5
+ static/uploads/*.*
6
+ static/images/*.*
7
+ static/videos/*/
8
+
9
+ # logs
10
+ logs
11
+ tensorboard
12
+ lightning_logs
13
+
14
+ # checkpoints
15
+ checkpoints/*/*.*
16
+
17
+ # Byte-compiled / optimized / DLL files
18
+ __pycache__/
19
+ *.py[cod]
20
+ *$py.class
21
+
22
+ # C extensions
23
+ *.so
24
+
25
+ # Distribution / packaging
26
+ .Python
27
+ build/
28
+ develop-eggs/
29
+ dist/
30
+ downloads/
31
+ eggs/
32
+ .eggs/
33
+ lib/
34
+ lib64/
35
+ parts/
36
+ sdist/
37
+ var/
38
+ wheels/
39
+ pip-wheel-metadata/
40
+ share/python-wheels/
41
+ *.egg-info/
42
+ .installed.cfg
43
+ *.egg
44
+ MANIFEST
45
+
46
+ # PyInstaller
47
+ # Usually these files are written by a python script from a template
48
+ # before PyInstaller builds the exe, so as to inject date/other infos into it.
49
+ *.manifest
50
+ *.spec
51
+
52
+ # Installer logs
53
+ pip-log.txt
54
+ pip-delete-this-directory.txt
55
+
56
+ # Unit test / coverage reports
57
+ htmlcov/
58
+ .tox/
59
+ .nox/
60
+ .coverage
61
+ .coverage.*
62
+ .cache
63
+ nosetests.xml
64
+ coverage.xml
65
+ *.cover
66
+ *.py,cover
67
+ .hypothesis/
68
+ .pytest_cache/
69
+
70
+ # Translations
71
+ *.mo
72
+ *.pot
73
+
74
+ # Django stuff:
75
+ *.log
76
+ local_settings.py
77
+ db.sqlite3
78
+ db.sqlite3-journal
79
+
80
+ # Flask stuff:
81
+ instance/
82
+ .webassets-cache
83
+
84
+ # Scrapy stuff:
85
+ .scrapy
86
+
87
+ # Sphinx documentation
88
+ docs/_build/
89
+
90
+ # PyBuilder
91
+ target/
92
+
93
+ # Jupyter Notebook
94
+ .ipynb_checkpoints
95
+
96
+ # IPython
97
+ profile_default/
98
+ ipython_config.py
99
+
100
+ # pyenv
101
+ .python-version
102
+
103
+ # pipenv
104
+ # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
105
+ # However, in case of collaboration, if having platform-specific dependencies or dependencies
106
+ # having no cross-platform support, pipenv may install dependencies that don't work, or not
107
+ # install all needed dependencies.
108
+ #Pipfile.lock
109
+
110
+ # PEP 582; used by e.g. github.com/David-OConnor/pyflow
111
+ __pypackages__/
112
+
113
+ # Celery stuff
114
+ celerybeat-schedule
115
+ celerybeat.pid
116
+
117
+ # SageMath parsed files
118
+ *.sage.py
119
+
120
+ # Environments
121
+ .env
122
+ .venv
123
+ env/
124
+ venv/
125
+ ENV/
126
+ env.bak/
127
+ venv.bak/
128
+
129
+ # Spyder project settings
130
+ .spyderproject
131
+ .spyproject
132
+
133
+ # Rope project settings
134
+ .ropeproject
135
+
136
+ # mkdocs documentation
137
+ /site
138
+
139
+ # mypy
140
+ .mypy_cache/
141
+ .dmypy.json
142
+ dmypy.json
143
+
144
+ # Pyre type checker
145
+ .pyre/
README.md CHANGED
@@ -1,12 +1,33 @@
1
  ---
2
- title: Poi Engineering
3
- emoji: 🔥
4
- colorFrom: purple
5
- colorTo: indigo
6
- sdk: gradio
7
- sdk_version: 4.7.1
8
  app_file: app.py
9
- pinned: false
 
10
  ---
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
11
 
12
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
 
 
 
1
  ---
2
+ title: poi_Engineering
 
 
 
 
 
3
  app_file: app.py
4
+ sdk: gradio
5
+ sdk_version: 3.50.2
6
  ---
7
+ # Pipeline_POI_Engineering
8
+ Repo Signboard segmentation and Text recognition
9
+
10
+ ## Download pretrain model:
11
+
12
+ ss: signboards segmentation
13
+ str: scene text recognition
14
+ ir: information retrieval
15
+
16
+ All the checkpoints are available here: [poi_engineering_checkpoints](https://drive.google.com/drive/folders/1mY5RWhaxNAFiAX-rROZSnJtd1npVB48U?usp=sharing)
17
+
18
+ For each model, copy the checkpoint to the same directory (ir --> ir; ss --> ss; str --> str)
19
+
20
+ ## Run:
21
+ Setup enviroments:
22
+ ```sh
23
+ bash setup.sh
24
+ ```
25
+ Extract text:
26
+ ```sh
27
+ bash extract.sh
28
+ ```
29
 
30
+ ## Image parser
31
+ ```
32
+ curl -F "image=@/home/trungtv/sources/POI_Engineering/outputs/20220520_150925/frames/frames_0.jpg" http://localhost:5050/parse_image
33
+ ```
README_.md ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ ### Installation
2
+
3
+ ```
4
+ conda create -n poi_engineering python=3.7
5
+ conda activate poi_engineering
6
+
7
+ ```
VnCoreNLP/LICENSE.md ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Copyright (C) 2018-2019 vncorenlp
2
+
3
+ This program is free software: you can redistribute it and/or modify
4
+ it under the terms of the GNU General Public License as published by
5
+ the Free Software Foundation, either version 3 of the License, or
6
+ (at your option) any later version.
7
+
8
+ This program is distributed in the hope that it will be useful,
9
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
10
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
+ GNU General Public License for more details.
12
+
13
+ You should have received a copy of the GNU General Public License
14
+ along with this program. If not, see <https://www.gnu.org/licenses/>.
VnCoreNLP/Readme.md ADDED
@@ -0,0 +1,136 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #### Table of contents
2
+ 1. [Introduction](#introduction)
3
+ 2. [Installation](#install)
4
+ 2. [Usage for Python users](#python)
5
+ 3. [Usage for Java users](#java)
6
+ 4. [Experimental results](#exp)
7
+
8
+ # VnCoreNLP: A Vietnamese natural language processing toolkit <a name="introduction"></a>
9
+
10
+ VnCoreNLP is a **fast and accurate** NLP annotation pipeline for Vietnamese, providing rich linguistic annotations through key NLP components of **word segmentation**, **POS tagging**, **named entity recognition** (NER) and **dependency parsing**. Users do not have to install external dependencies. Users can run processing pipelines from either the command-line or the API. The general architecture and experimental results of VnCoreNLP can be found in the following related papers:
11
+
12
+ 1. Thanh Vu, Dat Quoc Nguyen, Dai Quoc Nguyen, Mark Dras and Mark Johnson. **2018**. [VnCoreNLP: A Vietnamese Natural Language Processing Toolkit](http://aclweb.org/anthology/N18-5012). In *Proceedings of the 2018 Conference of the North American Chapter of the Association for Computational Linguistics: Demonstrations*, [NAACL 2018](http://naacl2018.org), pages 56-60. [[.bib]](http://aclweb.org/anthology/N18-5012.bib)
13
+ 2. Dat Quoc Nguyen, Dai Quoc Nguyen, Thanh Vu, Mark Dras and Mark Johnson. **2018**. [A Fast and Accurate Vietnamese Word Segmenter](http://www.lrec-conf.org/proceedings/lrec2018/summaries/55.html). In *Proceedings of the 11th International Conference on Language Resources and Evaluation*, [LREC 2018](http://lrec2018.lrec-conf.org/en/), pages 2582-2587. [[.bib]](https://dblp.uni-trier.de/rec/bibtex/conf/lrec/NguyenNVDJ18)
14
+ 3. Dat Quoc Nguyen, Thanh Vu, Dai Quoc Nguyen, Mark Dras and Mark Johnson. **2017**. [From Word Segmentation to POS Tagging for Vietnamese](http://aclweb.org/anthology/U17-1013). In *Proceedings of the 15th Annual Workshop of the Australasian Language Technology Association*, [ALTA 2017](http://alta2017.alta.asn.au), pages 108-113. [[.bib]](http://aclweb.org/anthology/U17-1013.bib)
15
+
16
+ Please **CITE** paper [1] whenever VnCoreNLP is used to produce published results or incorporated into other software. If you are dealing in depth with either word segmentation or POS tagging, you are also encouraged to cite paper [2] or [3], respectively.
17
+
18
+ If you are looking for light-weight versions, VnCoreNLP's word segmentation and POS tagging components have also been released as independent packages [RDRsegmenter](https://github.com/datquocnguyen/RDRsegmenter) [2] and [VnMarMoT](https://github.com/datquocnguyen/VnMarMoT) [3], resepectively.
19
+
20
+
21
+ ## Installation <a name="install"></a>
22
+
23
+ - `Java 1.8+` (Prerequisite)
24
+ - File `VnCoreNLP-1.2.jar` (27MB) and folder `models` (115MB) are placed in the same working folder.
25
+ - `Python 3.6+` if using [a Python wrapper of VnCoreNLP](https://github.com/thelinhbkhn2014/VnCoreNLP_Wrapper). To install this wrapper, users have to run the following command:
26
+
27
+ `$ pip3 install py_vncorenlp`
28
+
29
+ _A special thanks goes to [Linh The Nguyen](https://github.com/thelinhbkhn2014) for creating this wrapper!_
30
+
31
+
32
+ ## Usage for Python users <a name="python"></a>
33
+
34
+ ```python
35
+ import py_vncorenlp
36
+
37
+ # Automatically download VnCoreNLP components from the original repository
38
+ # and save them in some local working folder
39
+ py_vncorenlp.download_model(save_dir='/absolute/path/to/vncorenlp')
40
+
41
+ # Load VnCoreNLP from the local working folder that contains both `VnCoreNLP-1.2.jar` and `models`
42
+ model = py_vncorenlp.VnCoreNLP(save_dir='/absolute/path/to/vncorenlp')
43
+ # Equivalent to: model = py_vncorenlp.VnCoreNLP(annotators=["wseg", "pos", "ner", "parse"], save_dir='/absolute/path/to/vncorenlp')
44
+
45
+ # Annotate a raw corpus
46
+ model.annotate_file(input_file="/absolute/path/to/input/file", output_file="/absolute/path/to/output/file")
47
+
48
+ # Annotate a raw text
49
+ model.print_out(model.annotate_text("Ông Nguyễn Khắc Chúc đang làm việc tại Đại học Quốc gia Hà Nội. Bà Lan, vợ ông Chúc, cũng làm việc tại đây."))
50
+ ```
51
+
52
+ By default, the output is formatted with 6 columns representing word index, word form, POS tag, NER label, head index of the current word and its dependency relation type:
53
+
54
+ ```
55
+ 1 Ông Nc O 4 sub
56
+ 2 Nguyễn_Khắc_Chúc Np B-PER 1 nmod
57
+ 3 đang R O 4 adv
58
+ 4 làm_việc V O 0 root
59
+ 5 tại E O 4 loc
60
+ 6 Đại_học N B-ORG 5 pob
61
+ ...
62
+ ```
63
+
64
+ For users who use VnCoreNLP only for word segmentation:
65
+
66
+ ```python
67
+ rdrsegmenter = py_vncorenlp.VnCoreNLP(annotators=["wseg"], save_dir='/absolute/path/to/vncorenlp')
68
+ text = "Ông Nguyễn Khắc Chúc đang làm việc tại Đại học Quốc gia Hà Nội. Bà Lan, vợ ông Chúc, cũng làm việc tại đây."
69
+ output = rdrsegmenter.word_segment(text)
70
+ print(output)
71
+ # ['Ông Nguyễn_Khắc_Chúc đang làm_việc tại Đại_học Quốc_gia Hà_Nội .', 'Bà Lan , vợ ông Chúc , cũng làm_việc tại đây .']
72
+ ```
73
+
74
+
75
+
76
+ ## Usage for Java users <a name="java"></a>
77
+
78
+ ### Using VnCoreNLP from the command line
79
+
80
+ You can run VnCoreNLP to annotate an input raw text corpus (e.g. a collection of news content) by using following commands:
81
+
82
+ // To perform word segmentation, POS tagging, NER and then dependency parsing
83
+ $ java -Xmx2g -jar VnCoreNLP-1.2.jar -fin input.txt -fout output.txt
84
+ // To perform word segmentation, POS tagging and then NER
85
+ $ java -Xmx2g -jar VnCoreNLP-1.2.jar -fin input.txt -fout output.txt -annotators wseg,pos,ner
86
+ // To perform word segmentation and then POS tagging
87
+ $ java -Xmx2g -jar VnCoreNLP-1.2.jar -fin input.txt -fout output.txt -annotators wseg,pos
88
+ // To perform word segmentation
89
+ $ java -Xmx2g -jar VnCoreNLP-1.2.jar -fin input.txt -fout output.txt -annotators wseg
90
+
91
+
92
+ ### Using VnCoreNLP from the API
93
+
94
+ The following code is a simple and complete example:
95
+
96
+ ```java
97
+ import vn.pipeline.*;
98
+ import java.io.*;
99
+ public class VnCoreNLPExample {
100
+ public static void main(String[] args) throws IOException {
101
+
102
+ // "wseg", "pos", "ner", and "parse" refer to as word segmentation, POS tagging, NER and dependency parsing, respectively.
103
+ String[] annotators = {"wseg", "pos", "ner", "parse"};
104
+ VnCoreNLP pipeline = new VnCoreNLP(annotators);
105
+
106
+ String str = "Ông Nguyễn Khắc Chúc đang làm việc tại Đại học Quốc gia Hà Nội. Bà Lan, vợ ông Chúc, cũng làm việc tại đây.";
107
+
108
+ Annotation annotation = new Annotation(str);
109
+ pipeline.annotate(annotation);
110
+
111
+ System.out.println(annotation.toString());
112
+ // 1 Ông Nc O 4 sub
113
+ // 2 Nguyễn_Khắc_Chúc Np B-PER 1 nmod
114
+ // 3 đang R O 4 adv
115
+ // 4 làm_việc V O 0 root
116
+ // ...
117
+
118
+ //Write to file
119
+ PrintStream outputPrinter = new PrintStream("output.txt");
120
+ pipeline.printToFile(annotation, outputPrinter);
121
+
122
+ // You can also get a single sentence to analyze individually
123
+ Sentence firstSentence = annotation.getSentences().get(0);
124
+ System.out.println(firstSentence.toString());
125
+ }
126
+ }
127
+ ```
128
+
129
+ <img width="1039" alt="vncorenlpexample" src="https://user-images.githubusercontent.com/33695776/37561346-aca1fd68-2aa0-11e8-8bd8-530577b0b5cf.png">
130
+
131
+ See VnCoreNLP's open-source in folder `src` for API details.
132
+
133
+ ## Experimental results <a name="exp"></a>
134
+
135
+ See details in papers [1,2,3] above or at [NLP-progress](http://nlpprogress.com/vietnamese/vietnamese.html).
136
+
VnCoreNLP/TagsetDescription.md ADDED
@@ -0,0 +1,67 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ## POS tags, NER types and dependency labels in VnCoreNLP
2
+
3
+ The following sections are to briefly describe [POS tags](https://github.com/vncorenlp/VnCoreNLP/blob/master/VLSP2013_POS_tagset.pdf), [NER types](http://vlsp.org.vn/vlsp2016/eval/ner) and [dependency labels](https://github.com/vncorenlp/VnCoreNLP/blob/master/VnDT-treebank-description.pdf) used in VnCoreNLP. See details in [Link-to-POS-tag-description](https://github.com/vncorenlp/VnCoreNLP/blob/master/VLSP2013_POS_tagset.pdf), [Link-to-NER-type-description](http://vlsp.org.vn/vlsp2016/eval/ner) and [Link-to-dependency-label-description](https://github.com/vncorenlp/VnCoreNLP/blob/master/VnDT-treebank-description.pdf).
4
+
5
+ ### POS tags
6
+
7
+ |Label| Meaning |
8
+ |---|---|
9
+ | Np | Proper noun |
10
+ | Nc | Classifier noun |
11
+ | Nu | Unit noun |
12
+ | N | Noun |
13
+ | Ny | Abbreviated noun |
14
+ | Nb | (Foreign) borrowed noun|
15
+ | V | Verb|
16
+ |Vb |(Foreign) borrowed verb|
17
+ |A| Adjective|
18
+ |P| Pronoun|
19
+ |R |Adverb|
20
+ |L| Determiner|
21
+ |M |Numeral/Quantity|
22
+ |E |Preposition|
23
+ |C |Subordinating conjunction|
24
+ |Cc |Coordinating conjunction|
25
+ |I |Interjection/Exclamation|
26
+ |T |Particle/Auxiliary, modal words|
27
+ |Y |Abbreviation|
28
+ |Z |Bound morpheme|
29
+ |X |Un-definition/Other|
30
+ |CH |Punctuation and symbols|
31
+
32
+ ### NER types
33
+
34
+ |Label| Meaning |
35
+ |---|---|
36
+ | PER | Names of persons |
37
+ | LOC | Names of locations |
38
+ | ORG| Names of organizations|
39
+ | MISC|Names of miscellaneous entities|
40
+
41
+ ### Top 21 most frequent dependency labels
42
+
43
+ These following labels has an appearance rate of at least 0.2%:
44
+
45
+ |Label| Meaning |
46
+ |---|---|
47
+ |adv|Adverbial |
48
+ |amod| Adjective modifier |
49
+ |conj| Conjunction |
50
+ |coord| Coordination |
51
+ |dep| Default label |
52
+ |det| Determiner |
53
+ |dir| Direction |
54
+ |dob| Direct object |
55
+ |iob| Indirect object |
56
+ |loc| Location |
57
+ |mnr| Manner |
58
+ |nmod| Noun modifier |
59
+ |pmod| Prepositional modifier |
60
+ |pob| Object of a preposition |
61
+ |prd| Predicate |
62
+ |prp| Purpose |
63
+ |punct| Punctuation |
64
+ |root| Root |
65
+ |sub| Subject |
66
+ |tmp|Temporal|
67
+ |vmod| Verb modifier |
VnCoreNLP/VLSP2013_POS_tagset.pdf ADDED
Binary file (130 kB). View file
 
VnCoreNLP/VnCoreNLP-1.1.1.jar ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:c356b2baa0b83a287642b29d5c2ec5e9558c84d1c937f0aa88a5eea8748e587e
3
+ size 27412575
VnCoreNLP/VnCoreNLP-1.2.jar ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:9e2811cdbc2ddfc71d04be5dc36e185c88dcd1ad4d5d69e4ff2e1369dccf7793
3
+ size 27412703
VnCoreNLP/VnDT-treebank-description.pdf ADDED
Binary file (251 kB). View file
 
VnCoreNLP/models/dep/vi-dep.xz ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:266e4a3a55d5edd1607d5f036c2f95b70c0a6c80f58b57fd9962677a6ef331b7
3
+ size 16048864
VnCoreNLP/models/ner/vi-500brownclusters.xz ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:d30f9cfdf0af193a69e185d1acda0306a9fbe1321f8a700f7c66557a90f92b8c
3
+ size 5599844
VnCoreNLP/models/ner/vi-ner.xz ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:f04c5e752d7f99a6313b758fc2607a2c3906e58b1d60a37eb0192aead73d61f7
3
+ size 9956876
VnCoreNLP/models/ner/vi-pretrainedembeddings.xz ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:00d3d034f1b23a8bfe5168195741fde845808c212e6dfcd4c94bead1665eb0fc
3
+ size 57313672
VnCoreNLP/models/postagger/vi-tagger ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:a95608a5982db89c11353b451154ec396eccc0ff1f5b22874935ecdf4e0ace01
3
+ size 29709468
VnCoreNLP/models/wordsegmenter/vi-vocab ADDED
Binary file (527 kB). View file
 
VnCoreNLP/models/wordsegmenter/wordsegmenter.rdr ADDED
The diff for this file is too large to render. See raw diff
 
VnCoreNLP/pom.xml ADDED
@@ -0,0 +1,103 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project xmlns="http://maven.apache.org/POM/4.0.0"
3
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5
+ <modelVersion>4.0.0</modelVersion>
6
+
7
+ <groupId>VnCoreNLP</groupId>
8
+ <artifactId>VnCoreNLP</artifactId>
9
+ <version>1.2</version>
10
+ <build>
11
+ <plugins>
12
+ <plugin>
13
+ <groupId>org.apache.maven.plugins</groupId>
14
+ <artifactId>maven-compiler-plugin</artifactId>
15
+ <version>3.3</version>
16
+ <configuration>
17
+ <source>1.8</source>
18
+ <target>1.8</target>
19
+ </configuration>
20
+ </plugin>
21
+ <plugin>
22
+ <groupId>org.apache.maven.plugins</groupId>
23
+ <artifactId>maven-shade-plugin</artifactId>
24
+ <version>3.1.0</version>
25
+ <executions>
26
+ <execution>
27
+ <phase>package</phase>
28
+ <goals>
29
+ <goal>shade</goal>
30
+ </goals>
31
+ <configuration>
32
+ <shadedArtifactAttached>false</shadedArtifactAttached>
33
+ <transformers>
34
+ <!-- add Main-Class to manifest file -->
35
+ <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
36
+ <mainClass>vn.pipeline.VnCoreNLP</mainClass>
37
+ </transformer>
38
+ </transformers>
39
+ </configuration>
40
+ </execution>
41
+ </executions>
42
+ </plugin>
43
+ </plugins>
44
+ </build>
45
+
46
+ <properties>
47
+ <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
48
+ </properties>
49
+
50
+ <dependencies>
51
+
52
+ <dependency>
53
+ <groupId>com.optimaize.languagedetector</groupId>
54
+ <artifactId>language-detector</artifactId>
55
+ <version>0.6</version>
56
+ </dependency>
57
+
58
+ <dependency>
59
+ <groupId>vncorenlp</groupId>
60
+ <artifactId>marmot</artifactId>
61
+ <version>1.0</version>
62
+ </dependency>
63
+
64
+ <dependency>
65
+ <groupId>edu.emory.mathcs.nlp</groupId>
66
+ <artifactId>nlp4j-api</artifactId>
67
+ <version>1.1.3</version>
68
+ </dependency>
69
+
70
+ <dependency>
71
+ <groupId>log4j</groupId>
72
+ <artifactId>log4j</artifactId>
73
+ <version>1.2.17</version>
74
+ </dependency>
75
+
76
+ <dependency>
77
+ <groupId>org.slf4j</groupId>
78
+ <artifactId>slf4j-log4j12</artifactId>
79
+ <version>1.7.5</version>
80
+ </dependency>
81
+
82
+ <!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api -->
83
+ <dependency>
84
+ <groupId>org.slf4j</groupId>
85
+ <artifactId>slf4j-api</artifactId>
86
+ <version>1.7.25</version>
87
+ </dependency>
88
+
89
+ <!--mvn install:install-file -Dfile=lib/marmot.jar -DgroupId=vncorenlp -DartifactId=marmot -Dversion=1.0 -Dpackaging=jar-->
90
+ </dependencies>
91
+ <repositories>
92
+ <repository>
93
+ <id>vncorenlp</id>
94
+ <name>vncorenlp thirdparty repo</name>
95
+ <url>https://github.com/vncorenlp/thirdparty/raw/repository/</url>
96
+ <snapshots>
97
+ <enabled>true</enabled>
98
+ <updatePolicy>always</updatePolicy>
99
+ </snapshots>
100
+ </repository>
101
+ </repositories>
102
+
103
+ </project>
VnCoreNLP/src/main/java/vn/corenlp/ner/NerRecognizer.java ADDED
@@ -0,0 +1,85 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ package vn.corenlp.ner;
2
+
3
+ import edu.emory.mathcs.nlp.common.util.NLPUtils;
4
+ import edu.emory.mathcs.nlp.component.template.NLPComponent;
5
+
6
+ import edu.emory.mathcs.nlp.component.template.lexicon.GlobalLexica;
7
+ import edu.emory.mathcs.nlp.component.template.node.FeatMap;
8
+ import edu.emory.mathcs.nlp.component.template.node.NLPNode;
9
+ import edu.emory.mathcs.nlp.decode.NLPDecoder;
10
+ import org.apache.log4j.Logger;
11
+ import vn.corenlp.wordsegmenter.Vocabulary;
12
+ import vn.pipeline.LexicalInitializer;
13
+ import vn.pipeline.Word;
14
+ import vn.pipeline.Utils;
15
+
16
+ import java.io.File;
17
+ import java.io.IOException;
18
+ import java.util.ArrayList;
19
+ import java.util.List;
20
+
21
+ public class NerRecognizer {
22
+ private NLPDecoder nlpDecoder ;
23
+ public final static Logger LOGGER = Logger.getLogger(NerRecognizer.class);
24
+ private static NerRecognizer nerRecognizer;
25
+ public static NerRecognizer initialize() throws IOException{
26
+ if(nerRecognizer == null) {
27
+ nerRecognizer = new NerRecognizer();
28
+ }
29
+ return nerRecognizer;
30
+ }
31
+
32
+
33
+ public NerRecognizer() throws IOException{
34
+ LOGGER.info("Loading NER model");
35
+ nlpDecoder = new NLPDecoder();
36
+ List<NLPComponent<NLPNode>> components = new ArrayList();
37
+
38
+ String modelPath = Utils.jarDir + "/models/ner/vi-ner.xz";
39
+ if (!new File(modelPath).exists()) throw new IOException("NerRecognizer: " + modelPath + " is not found!");
40
+ GlobalLexica lexica = LexicalInitializer.initialize(true).initializeLexica();
41
+ if(lexica != null) {
42
+ components.add(lexica);
43
+ }
44
+ components.add(NLPUtils.getComponent(modelPath));
45
+ nlpDecoder.setComponents(components);
46
+
47
+ }
48
+
49
+
50
+ public void tagSentence(List<Word> sentenceWords) {
51
+ NLPNode[] decodedNodes = nlpDecoder.decode(toNodeArray(sentenceWords));
52
+ for(int i = 0; i < sentenceWords.size(); i++) {
53
+ Word word = sentenceWords.get(i);
54
+ word.setNerLabel(decodedNodes[i + 1].getNamedEntityTag().replace("U-", "B-").replace("L-", "I-"));
55
+ }
56
+ }
57
+
58
+ private NLPNode[] toNodeArray(List<Word> sentenceWords) {
59
+ NLPNode[] nlpNodes = new NLPNode[sentenceWords.size() + 1];
60
+ nlpNodes[0] = new NLPNode();
61
+ for(int i = 0; i < sentenceWords.size(); i++) {
62
+ Word word = sentenceWords.get(i);
63
+ nlpNodes[i + 1] = new NLPNode(word.getIndex(), word.getForm(), word.getForm(), addLabelForPOSTag(word), new FeatMap());
64
+
65
+ }
66
+ return nlpNodes;
67
+ }
68
+
69
+ public String addLabelForPOSTag(Word word) {
70
+ String[] tokens = word.getForm().split("_");
71
+ String output = word.getPosTag();
72
+ if (word.getPosTag() != null && word.getPosTag().equals("Np")) {
73
+ if (Vocabulary.VN_FAMILY_NAMES.contains(tokens[0].toLowerCase())
74
+ || (tokens.length > 1 && Vocabulary.VN_MIDDLE_NAMES.contains(tokens[1].toLowerCase())))
75
+ output = word.getPosTag() + "-1";
76
+ else output = word.getPosTag() + "-0";
77
+ }
78
+ return output;
79
+ }
80
+
81
+ public static void main(String[] args) {
82
+
83
+
84
+ }
85
+ }
VnCoreNLP/src/main/java/vn/corenlp/parser/DependencyParser.java ADDED
@@ -0,0 +1,74 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ package vn.corenlp.parser;
2
+
3
+ import edu.emory.mathcs.nlp.common.util.NLPUtils;
4
+ import edu.emory.mathcs.nlp.component.template.NLPComponent;
5
+
6
+ import edu.emory.mathcs.nlp.component.template.lexicon.GlobalLexica;
7
+ import edu.emory.mathcs.nlp.component.template.node.FeatMap;
8
+ import edu.emory.mathcs.nlp.component.template.node.NLPNode;
9
+ import edu.emory.mathcs.nlp.decode.NLPDecoder;
10
+ import org.apache.log4j.Logger;
11
+ import vn.pipeline.LexicalInitializer;
12
+ import vn.pipeline.Word;
13
+ import vn.pipeline.Utils;
14
+
15
+ import java.io.File;
16
+ import java.io.IOException;
17
+ import java.util.ArrayList;
18
+ import java.util.List;
19
+
20
+ public class DependencyParser {
21
+ private NLPDecoder nlpDecoder ;
22
+ public final static Logger LOGGER = Logger.getLogger(DependencyParser.class);
23
+ private static DependencyParser dependencyParser;
24
+ public static DependencyParser initialize() throws IOException {
25
+ if(dependencyParser == null) {
26
+ dependencyParser = new DependencyParser();
27
+ }
28
+ return dependencyParser;
29
+ }
30
+
31
+ public DependencyParser() throws IOException {
32
+ LOGGER.info("Loading Dependency Parsing model");
33
+ nlpDecoder = new NLPDecoder();
34
+ List<NLPComponent<NLPNode>> components = new ArrayList();
35
+
36
+ String modelPath = Utils.jarDir + "/models/dep/vi-dep.xz";
37
+ if (!new File(modelPath).exists()) throw new IOException("DependencyParser: " + modelPath + " is not found!");
38
+ GlobalLexica lexica = LexicalInitializer.initialize(true).initializeLexica();
39
+ if(lexica != null) {
40
+ components.add(lexica);
41
+ }
42
+ components.add(NLPUtils.getComponent(modelPath));
43
+ nlpDecoder.setComponents(components);
44
+
45
+ }
46
+
47
+ public void tagSentence(List<Word> sentenceWords) {
48
+ NLPNode[] decodedNodes = nlpDecoder.decode(toNodeArray(sentenceWords));
49
+ for(int i = 0; i < sentenceWords.size(); i++) {
50
+ Word word = sentenceWords.get(i);
51
+ word.setHead(decodedNodes[i + 1].getDependencyHead().getID());
52
+ word.setDepLabel(decodedNodes[i + 1].getDependencyLabel());
53
+ if(word.getPosTag() != null && word.getPosTag().equals("CH")) word.setDepLabel("punct");
54
+ }
55
+ }
56
+
57
+ private NLPNode[] toNodeArray(List<Word> sentenceWords) {
58
+ NLPNode[] nlpNodes = new NLPNode[sentenceWords.size() + 1];
59
+ nlpNodes[0] = new NLPNode();
60
+ for(int i = 0; i < sentenceWords.size(); i++) {
61
+ Word word = sentenceWords.get(i);
62
+ //int id, String form, String lemma, String posTag, FeatMap feats
63
+ nlpNodes[i + 1] = new NLPNode(word.getIndex(), word.getForm(), word.getForm(),
64
+ word.getPosTag(), new FeatMap());
65
+
66
+ }
67
+ return nlpNodes;
68
+ }
69
+
70
+ public static void main(String[] args) {
71
+
72
+
73
+ }
74
+ }
VnCoreNLP/src/main/java/vn/corenlp/postagger/PosTagger.java ADDED
@@ -0,0 +1,65 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ package vn.corenlp.postagger;
2
+
3
+ import marmot.morph.MorphTagger;
4
+ import marmot.morph.Sentence;
5
+ import marmot.morph.Word;
6
+
7
+ import marmot.util.FileUtils;
8
+ import org.apache.log4j.Logger;
9
+
10
+ import java.io.File;
11
+ import java.io.IOException;
12
+ import java.util.ArrayList;
13
+ import java.util.LinkedList;
14
+ import java.util.List;
15
+
16
+ import vn.pipeline.Utils;
17
+
18
+ public class PosTagger {
19
+ private static PosTagger posTagger = null;
20
+ private MorphTagger tagger;
21
+ public final static Logger LOGGER = Logger.getLogger(PosTagger.class);
22
+ public PosTagger() throws IOException {
23
+ LOGGER.info("Loading POS Tagging model");
24
+ String modelPath = Utils.jarDir + "/models/postagger/vi-tagger";
25
+ if (!new File(modelPath).exists()) throw new IOException("PosTagger: " + modelPath + " is not found!");
26
+ tagger = FileUtils.loadFromFile(modelPath);
27
+
28
+ }
29
+
30
+ public static PosTagger initialize() throws IOException {
31
+ if(posTagger == null) {
32
+ posTagger = new PosTagger();
33
+ }
34
+ return posTagger;
35
+ }
36
+
37
+ public List<vn.pipeline.Word> tagSentence(String sentence) throws IOException {
38
+ List<vn.pipeline.Word> output = new ArrayList<>();
39
+ String line = sentence.trim();
40
+ if (line.length() == 0) {
41
+ return output;
42
+ }
43
+ String[] tokenstrs = line.split(" ");
44
+ LinkedList tokens = new LinkedList();
45
+
46
+ for(int i = 0; i < tokenstrs.length; ++i) {
47
+ if (!tokenstrs[i].isEmpty()) {
48
+ Word word = new Word(tokenstrs[i]);
49
+ tokens.add(word);
50
+ }
51
+ }
52
+
53
+ Sentence marmotSentence = new Sentence(tokens);
54
+ Object lemma_tags = tagger.tagWithLemma(marmotSentence);
55
+ for(int i = 0; i < marmotSentence.size(); ++i) {
56
+ List<String> token_lemma_tags = (List)((List)lemma_tags).get(i);
57
+ vn.pipeline.Word word = new vn.pipeline.Word((i + 1), marmotSentence.getWord(i).getWordForm(), (String)token_lemma_tags.get(1));
58
+ output.add(word);
59
+
60
+ }
61
+ return output;
62
+ }
63
+
64
+
65
+ }
VnCoreNLP/src/main/java/vn/corenlp/tokenizer/StringUtils.java ADDED
@@ -0,0 +1,207 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ package vn.corenlp.tokenizer;
2
+
3
+ import java.util.HashSet;
4
+ import java.util.regex.Matcher;
5
+ import java.util.regex.Pattern;
6
+
7
+ public class StringUtils
8
+ {
9
+
10
+ public static void testFoundByRegex(String s, String regex)
11
+ {
12
+ System.out.println("Test string: " + s);
13
+
14
+ Pattern pattern = Pattern.compile(regex);
15
+ Matcher matcher = pattern.matcher(s);
16
+ if (matcher.find()) {
17
+ System.out.println(s.substring(0, matcher.start()));
18
+ System.out.println(s.substring(matcher.start(), matcher.end()));
19
+ System.out.println(s.substring(matcher.end()));
20
+ }
21
+ }
22
+
23
+ public static String char2Hex(Character c)
24
+ {
25
+ return String.format("\\u%04x", (int) c);
26
+ }
27
+
28
+ public static Character hex2Char(String hex)
29
+ {
30
+ int hexToInt = Integer.parseInt(hex.substring(2), 16);
31
+ return (char) hexToInt;
32
+ }
33
+
34
+ public static boolean hasPunctuation(String s)
35
+ {
36
+ for (int i = 0; i < s.length(); i++) {
37
+ if (!Character.isLetterOrDigit(s.charAt(i)))
38
+ return true;
39
+ }
40
+
41
+ return false;
42
+ }
43
+
44
+ public static boolean isPunctuation(String s)
45
+ {
46
+ for (int i = 0; i < s.length(); i++) {
47
+ if (Character.isLetterOrDigit(s.charAt(i)))
48
+ return false;
49
+ }
50
+
51
+ return true;
52
+ }
53
+
54
+ public static boolean isNumeric(String s) {
55
+ return s != null && s.matches("[-+]?\\d*\\.?\\d+");
56
+ }
57
+
58
+ // Modified by Dat Quoc Nguyen
59
+ public static boolean isBrace(String string)
60
+ {
61
+ if (string.equals("”") || string.equals("�") || string.equals("'") || string.equals(")")
62
+ || string.equals("}") || string.equals("]")) {
63
+ return true;
64
+ }
65
+ return false;
66
+ }
67
+
68
+ public static HashSet<String> VN_abbreviation;
69
+ public static HashSet<String> VN_exception;
70
+ static {
71
+ VN_abbreviation = new HashSet<String>();
72
+ VN_exception = new HashSet<String>();
73
+
74
+ VN_abbreviation.add("M.City");
75
+ VN_abbreviation.add("V.I.P");
76
+ VN_abbreviation.add("PGS.Ts");
77
+ VN_abbreviation.add("MRS.");
78
+ VN_abbreviation.add("Mrs.");
79
+ VN_abbreviation.add("Man.United");
80
+ VN_abbreviation.add("Mr.");
81
+ VN_abbreviation.add("SHB.ĐN");
82
+ VN_abbreviation.add("Gs.Bs");
83
+ VN_abbreviation.add("U.S.A");
84
+ VN_abbreviation.add("TMN.CSG");
85
+ VN_abbreviation.add("Kts.Ts");
86
+ VN_abbreviation.add("R.Madrid");
87
+ VN_abbreviation.add("Tp.");
88
+ VN_abbreviation.add("T.Ư");
89
+ VN_abbreviation.add("D.C");
90
+ VN_abbreviation.add("Gs.Tskh");
91
+ VN_abbreviation.add("PGS.KTS");
92
+ VN_abbreviation.add("GS.BS");
93
+ VN_abbreviation.add("KTS.TS");
94
+ VN_abbreviation.add("PGS-TS");
95
+ VN_abbreviation.add("Co.");
96
+ VN_abbreviation.add("S.H.E");
97
+ VN_abbreviation.add("Ths.Bs");
98
+ VN_abbreviation.add("T&T.HN");
99
+ VN_abbreviation.add("MR.");
100
+ VN_abbreviation.add("Ms.");
101
+ VN_abbreviation.add("T.T.P");
102
+ VN_abbreviation.add("TT.");
103
+ VN_abbreviation.add("TP.");
104
+ VN_abbreviation.add("ĐH.QGHN");
105
+ VN_abbreviation.add("Gs.Kts");
106
+ VN_abbreviation.add("Man.Utd");
107
+ VN_abbreviation.add("GD-ĐT");
108
+ VN_abbreviation.add("T.W");
109
+ VN_abbreviation.add("Corp.");
110
+ VN_abbreviation.add("ĐT.LA");
111
+ VN_abbreviation.add("Dr.");
112
+ VN_abbreviation.add("T&T");
113
+ VN_abbreviation.add("HN.ACB");
114
+ VN_abbreviation.add("GS.KTS");
115
+ VN_abbreviation.add("MS.");
116
+ VN_abbreviation.add("Prof.");
117
+ VN_abbreviation.add("GS.TS");
118
+ VN_abbreviation.add("PGs.Ts");
119
+ VN_abbreviation.add("PGS.BS");
120
+ VN_abbreviation.add("BT.");
121
+ VN_abbreviation.add("Ltd.");
122
+ VN_abbreviation.add("ThS.BS");
123
+ VN_abbreviation.add("Gs.Ts");
124
+ VN_abbreviation.add("SL.NA");
125
+ //VN_abbreviation.add("P.");
126
+ VN_abbreviation.add("Th.S");
127
+ VN_abbreviation.add("Gs.Vs");
128
+ VN_abbreviation.add("PGs.Bs");
129
+ VN_abbreviation.add("T.O.P");
130
+ VN_abbreviation.add("PGS.TS");
131
+ VN_abbreviation.add("HN.T&T");
132
+ VN_abbreviation.add("SG.XT");
133
+ VN_abbreviation.add("O.T.C");
134
+ VN_abbreviation.add("TS.BS");
135
+ VN_abbreviation.add("Yahoo!");
136
+ VN_abbreviation.add("Man.City");
137
+ VN_abbreviation.add("MISS.");
138
+ VN_abbreviation.add("HA.GL");
139
+ VN_abbreviation.add("GS.Ts");
140
+ VN_abbreviation.add("TBT.");
141
+ VN_abbreviation.add("GS.VS");
142
+ VN_abbreviation.add("GS.TSKH");
143
+ VN_abbreviation.add("Ts.Bs");
144
+ VN_abbreviation.add("M.U");
145
+ VN_abbreviation.add("Gs.TSKH");
146
+ VN_abbreviation.add("U.S");
147
+ VN_abbreviation.add("Miss.");
148
+ VN_abbreviation.add("GD.ĐT");
149
+ VN_abbreviation.add("PGs.Kts");
150
+ //VN_abbreviation.add("Q.");
151
+ VN_abbreviation.add("St.");
152
+ VN_abbreviation.add("Ng.");
153
+ VN_abbreviation.add("Inc.");
154
+ VN_abbreviation.add("Th.");
155
+ VN_abbreviation.add("N.O.V.A");
156
+
157
+ VN_exception.add("Wi-fi");
158
+ VN_exception.add("17+");
159
+ VN_exception.add("km/h");
160
+ VN_exception.add("M7");
161
+ VN_exception.add("M8");
162
+ VN_exception.add("21+");
163
+ VN_exception.add("G3");
164
+ VN_exception.add("M9");
165
+ VN_exception.add("G4");
166
+ VN_exception.add("km3");
167
+ VN_exception.add("m/s");
168
+ VN_exception.add("km2");
169
+ VN_exception.add("5g");
170
+ VN_exception.add("4G");
171
+ VN_exception.add("8K");
172
+ VN_exception.add("3g");
173
+ VN_exception.add("E9");
174
+ VN_exception.add("U21");
175
+ VN_exception.add("4K");
176
+ VN_exception.add("U23");
177
+ VN_exception.add("Z1");
178
+ VN_exception.add("Z2");
179
+ VN_exception.add("Z3");
180
+ VN_exception.add("Z4");
181
+ VN_exception.add("Z5");
182
+ VN_exception.add("Jong-un");
183
+ VN_exception.add("u19");
184
+ VN_exception.add("5s");
185
+ VN_exception.add("wi-fi");
186
+ VN_exception.add("18+");
187
+ VN_exception.add("Wi-Fi");
188
+ VN_exception.add("m2");
189
+ VN_exception.add("16+");
190
+ VN_exception.add("m3");
191
+ VN_exception.add("V-League");
192
+ VN_exception.add("Geun-hye");
193
+ VN_exception.add("5G");
194
+ VN_exception.add("4g");
195
+ VN_exception.add("Z3+");
196
+ VN_exception.add("3G");
197
+ VN_exception.add("km/s");
198
+ VN_exception.add("6+");
199
+ VN_exception.add("u21");
200
+ VN_exception.add("WI-FI");
201
+ VN_exception.add("u23");
202
+ VN_exception.add("U19");
203
+ VN_exception.add("6s");
204
+ VN_exception.add("4s");
205
+ }
206
+
207
+ }
VnCoreNLP/src/main/java/vn/corenlp/tokenizer/Tokenizer.java ADDED
@@ -0,0 +1,397 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ package vn.corenlp.tokenizer;
2
+
3
+ import java.io.IOException;
4
+ import java.util.ArrayList;
5
+ import java.util.HashSet;
6
+ import java.util.List;
7
+ import java.util.regex.Matcher;
8
+ import java.util.regex.Pattern;
9
+
10
+
11
+ /**
12
+ * This class contains methods used for tokenization step.
13
+ *
14
+ * @author tuanphong94
15
+ * @link https://github.com/phongnt570/UETsegmenter/blob/master/src/vn/edu/vnu/uet/nlp/tokenizer/tokenizer.tokenizer.java
16
+ *
17
+ */
18
+ public class Tokenizer {
19
+ /**
20
+ * @param s
21
+ * @return List of tokens from s
22
+ * @throws IOException
23
+ */
24
+ public static List<String> tokenize(String s) throws IOException {
25
+ if (s == null || s.trim().isEmpty()) {
26
+ return new ArrayList<String>();
27
+ }
28
+
29
+ String[] tempTokens = s.trim().split("\\s+");
30
+ if (tempTokens.length == 0) {
31
+ return new ArrayList<String>();
32
+ }
33
+
34
+ List<String> tokens = new ArrayList<String>();
35
+
36
+ for (String token : tempTokens) {
37
+ if (token.length() == 1 || !StringUtils.hasPunctuation(token)) {
38
+ tokens.add(token);
39
+ continue;
40
+ }
41
+
42
+ if (token.endsWith(",")) {
43
+ tokens.addAll(tokenize(token.substring(0, token.length() - 1)));
44
+ tokens.add(",");
45
+ continue;
46
+ }
47
+
48
+ if (StringUtils.VN_abbreviation.contains(token)) {
49
+ tokens.add(token);
50
+ continue;
51
+ }
52
+
53
+
54
+ if (token.endsWith(".") && Character.isAlphabetic(token.charAt(token.length() - 2))) {
55
+ if ((token.length() == 2 && Character.isUpperCase(token.charAt(token.length() - 2))) || (Pattern.compile(Regex.SHORT_NAME).matcher(token).find())) {
56
+ tokens.add(token);
57
+ continue;
58
+ }
59
+ tokens.addAll(tokenize(token.substring(0, token.length() - 1)));
60
+ tokens.add(".");
61
+ continue;
62
+ }
63
+
64
+ if (StringUtils.VN_exception.contains(token)) {
65
+ tokens.add(token);
66
+ continue;
67
+ }
68
+
69
+ boolean tokenContainsAbb = false;
70
+ for (String e : StringUtils.VN_abbreviation) {
71
+ int i = token.indexOf(e);
72
+ if (i < 0)
73
+ continue;
74
+
75
+ tokenContainsAbb = true;
76
+ tokens = recursive(tokens, token, i, i + e.length());
77
+ break;
78
+ }
79
+ if (tokenContainsAbb)
80
+ continue;
81
+
82
+ boolean tokenContainsExp = false;
83
+ for (String e : StringUtils.VN_exception) {
84
+ int i = token.indexOf(e);
85
+ if (i < 0)
86
+ continue;
87
+
88
+ tokenContainsExp = true;
89
+ tokens = recursive(tokens, token, i, i + e.length());
90
+ break;
91
+ }
92
+ if (tokenContainsExp)
93
+ continue;
94
+
95
+ List<String> regexes = Regex.getRegexList();
96
+
97
+ boolean matching = false;
98
+ for (String regex : regexes) {
99
+ if (token.matches(regex)) {
100
+ tokens.add(token);
101
+ matching = true;
102
+ break;
103
+ }
104
+ }
105
+ if (matching) {
106
+ continue;
107
+ }
108
+
109
+ for (int i = 0; i < regexes.size(); i++) {
110
+ Pattern pattern = Pattern.compile(regexes.get(i));
111
+ Matcher matcher = pattern.matcher(token);
112
+
113
+ if (matcher.find()) {
114
+ if (i == Regex.getRegexIndex("url")) {
115
+ String[] elements = token.split(Pattern.quote("."));
116
+ boolean hasURL = true;
117
+ for (String ele : elements) {
118
+ if (ele.length() == 1 && Character.isUpperCase(ele.charAt(0))) {
119
+ hasURL = false;
120
+ break;
121
+ }
122
+ for (int j = 0; j < ele.length(); j++) {
123
+ if (ele.charAt(j) >= 128) {
124
+ hasURL = false;
125
+ break;
126
+ }
127
+ }
128
+ }
129
+ if (hasURL) {
130
+ tokens = recursive(tokens, token, matcher.start(), matcher.end());
131
+ } else {
132
+ continue;
133
+ }
134
+ }
135
+
136
+ else if (i == Regex.getRegexIndex("month")) {
137
+ int start = matcher.start();
138
+
139
+ boolean hasLetter = false;
140
+
141
+ for (int j = 0; j < start; j++) {
142
+ if (Character.isLetter(token.charAt(j))) {
143
+ tokens = recursive(tokens, token, matcher.start(), matcher.end());
144
+ hasLetter = true;
145
+ break;
146
+ }
147
+ }
148
+
149
+ if (!hasLetter) {
150
+ tokens.add(token);
151
+ }
152
+ }
153
+
154
+ else {
155
+ tokens = recursive(tokens, token, matcher.start(), matcher.end());
156
+ }
157
+
158
+ matching = true;
159
+ break;
160
+ }
161
+ }
162
+
163
+ if (matching)
164
+ continue;
165
+ else
166
+ tokens.add(token);
167
+ }
168
+
169
+ return tokens;
170
+ }
171
+
172
+ private static List<String> recursive(List<String> tokens, String token, int beginMatch, int endMatch)
173
+ throws IOException {
174
+ if (beginMatch > 0)
175
+ tokens.addAll(tokenize(token.substring(0, beginMatch)));
176
+ tokens.addAll(tokenize(token.substring(beginMatch, endMatch)));
177
+
178
+ if (endMatch < token.length())
179
+ tokens.addAll(tokenize(token.substring(endMatch)));
180
+
181
+ return tokens;
182
+ }
183
+
184
+ public static List<String> joinSentences(List<String> tokens) {
185
+ List<String> sentences = new ArrayList<>();
186
+
187
+ List<String> sentence = new ArrayList<>();
188
+ for (int i = 0; i < tokens.size(); i++) {
189
+ String token = tokens.get(i);
190
+ String nextToken = null;
191
+ if (i != tokens.size() - 1) {
192
+ nextToken = tokens.get(i + 1);
193
+ }
194
+ String beforeToken = null;
195
+ if (i > 0) {
196
+ beforeToken = tokens.get(i - 1);
197
+ }
198
+
199
+ sentence.add(token);
200
+
201
+ if (i == tokens.size() - 1) {
202
+ sentences.add(joinSentence(sentence));
203
+ return sentences;
204
+ }
205
+
206
+ if (i < tokens.size() - 2 && token.equals(StringConst.COLON)) {
207
+ if (Character.isDigit(nextToken.charAt(0)) && tokens.get(i + 2).equals(StringConst.STOP)
208
+ || tokens.get(i + 2).equals(StringConst.COMMA)) {
209
+ sentences.add(joinSentence(sentence));
210
+ sentence.clear();
211
+ continue;
212
+ }
213
+ }
214
+
215
+ if (token.matches(Regex.EOS_PUNCTUATION)) {
216
+
217
+ // Added by Dat Quoc Nguyen
218
+ if (nextToken.equals("\"") || nextToken.equals("''")) {
219
+ int count = 0;
220
+ for (String senToken : sentence) {
221
+ if (senToken.equals("\"") || senToken.equals("''"))
222
+ count += 1;
223
+ }
224
+ if (count % 2 == 1)
225
+ continue;
226
+ }
227
+
228
+ // If the current sentence is in the quote or in the brace
229
+ if (StringUtils.isBrace(nextToken) || nextToken.isEmpty() || Character.isLowerCase(nextToken.charAt(0))
230
+ || nextToken.equals(StringConst.COMMA) || Character.isDigit(nextToken.charAt(0))) {
231
+ continue;
232
+ }
233
+
234
+ // Sentence starts with its order number
235
+ if (sentence.size() == 2 && token.equals(StringConst.STOP)) {
236
+ if (Character.isDigit(beforeToken.charAt(0))) {
237
+ continue;
238
+ }
239
+ if (Character.isLowerCase(beforeToken.charAt(0))) {
240
+ continue;
241
+ }
242
+ if (Character.isUpperCase(beforeToken.charAt(0))) {
243
+ if (beforeToken.length() == 1) {
244
+ continue;
245
+ }
246
+ }
247
+ }
248
+
249
+ sentences.add(joinSentence(sentence));
250
+ sentence.clear();
251
+ }
252
+ }
253
+
254
+ return sentences;
255
+ }
256
+
257
+ public static String joinSentence(List<String> tokens) {
258
+ StringBuffer sent = new StringBuffer();
259
+ int length = tokens.size();
260
+ String token;
261
+ for (int i = 0; i < length; i++) {
262
+ token = tokens.get(i);
263
+ if (token.isEmpty() || token == null || token.equals(StringConst.SPACE)) {
264
+ continue;
265
+ }
266
+ sent.append(token);
267
+ if (i < length - 1)
268
+ sent.append(StringConst.SPACE);
269
+ }
270
+ return sent.toString().trim();
271
+ }
272
+ }
273
+
274
+ interface StringConst
275
+ {
276
+ public static final String BOS = "<s>";
277
+ public static final String EOS = "</s>";
278
+
279
+ public static final String SPACE = " ";
280
+ public static final String COMMA = ",";
281
+ public static final String STOP = ".";
282
+ public static final String COLON = ":";
283
+ public static final String UNDERSCORE = "_";
284
+ }
285
+
286
+ class Regex
287
+ {
288
+
289
+ public static final String ELLIPSIS = "\\.{2,}";
290
+
291
+ public static final String EMAIL = "([\\w\\d_\\.-]+)@(([\\d\\w-]+)\\.)*([\\d\\w-]+)";
292
+
293
+ public static final String FULL_DATE = "(0?[1-9]|[12][0-9]|3[01])(\\/|-|\\.)(1[0-2]|(0?[1-9]))((\\/|-|\\.)\\d{4})";
294
+
295
+ public static final String MONTH = "(1[0-2]|(0?[1-9]))(\\/)\\d{4}";
296
+
297
+ public static final String DATE = "(0?[1-9]|[12][0-9]|3[01])(\\/)(1[0-2]|(0?[1-9]))";
298
+
299
+ public static final String TIME = "(\\d\\d:\\d\\d:\\d\\d)|((0?\\d|1\\d|2[0-3])(:|h)(0?\\d|[1-5]\\d)(’|'|p|ph)?)";
300
+
301
+ public static final String MONEY = "\\p{Sc}\\d+([\\.,]\\d+)*|\\d+([\\.,]\\d+)*\\p{Sc}";
302
+
303
+ public static final String PHONE_NUMBER = "(\\(?\\+\\d{1,2}\\)?[\\s\\.-]?)?\\d{2,}[\\s\\.-]?\\d{3,}[\\s\\.-]?\\d{3,}";
304
+
305
+ public static final String URL = "(((https?|ftp):\\/\\/|www\\.)[^\\s/$.?#].[^\\s]*)|(https?:\\/\\/)?(www\\.)?[-a-zA-Z0-9@:%._\\+~#=]{2,256}\\.[a-z]{2,6}\\b([-a-zA-Z0-9@:%_\\+.~#?&//=]*)";
306
+
307
+ public static final String NUMBER = "[-+]?\\d+([\\.,]\\d+)*%?\\p{Sc}?";
308
+
309
+ public static final String PUNCTUATION = ",|\\.|:|\\?|!|;|-|_|\"|'|“|”|\\||\\(|\\)|\\[|\\]|\\{|\\}|⟨|⟩|«|»|\\\\|\\/|\\‘|\\’|\\“|\\â€�|…|…|‘|’|·";
310
+
311
+ public static final String SPECIAL_CHAR = "\\~|\\@|\\#|\\^|\\&|\\*|\\+|\\-|\\–|<|>|\\|";
312
+
313
+ public static final String EOS_PUNCTUATION = "(\\.+|\\?|!|…)";
314
+
315
+ public static final String NUMBERS_EXPRESSION = NUMBER + "([\\+\\-\\*\\/]" + NUMBER + ")*";
316
+
317
+ public static final String SHORT_NAME = "([\\p{L}]+([\\.\\-][\\p{L}]+)+)|([\\p{L}]+-\\d+)";
318
+
319
+ public static final String WORD_WITH_HYPHEN = "\\p{L}+-\\p{L}+(-\\p{L}+)*";
320
+
321
+ public static final String ALLCAP = "[A-Z]+\\.[A-Z]+";
322
+
323
+ private static List<String> regexes = null;
324
+
325
+ private static List<String> regexIndex = null;
326
+
327
+ public static List<String> getRegexList()
328
+ {
329
+ if (regexes == null) {
330
+ regexes = new ArrayList<String>();
331
+ regexIndex = new ArrayList<String>();
332
+
333
+ regexes.add(ELLIPSIS);
334
+ regexIndex.add("ELLIPSIS");
335
+
336
+ regexes.add(EMAIL);
337
+ regexIndex.add("EMAIL");
338
+
339
+ regexes.add(URL);
340
+ regexIndex.add("URL");
341
+
342
+ regexes.add(FULL_DATE);
343
+ regexIndex.add("FULL_DATE");
344
+
345
+ regexes.add(MONTH);
346
+ regexIndex.add("MONTH");
347
+
348
+ regexes.add(DATE);
349
+ regexIndex.add("DATE");
350
+
351
+ regexes.add(TIME);
352
+ regexIndex.add("TIME");
353
+
354
+ regexes.add(MONEY);
355
+ regexIndex.add("MONEY");
356
+
357
+ regexes.add(PHONE_NUMBER);
358
+ regexIndex.add("PHONE_NUMBER");
359
+
360
+ regexes.add(SHORT_NAME);
361
+ regexIndex.add("SHORT_NAME");
362
+
363
+ regexes.add(NUMBERS_EXPRESSION);
364
+ regexIndex.add("NUMBERS_EXPRESSION");
365
+
366
+ regexes.add(NUMBER);
367
+ regexIndex.add("NUMBER");
368
+
369
+ regexes.add(WORD_WITH_HYPHEN);
370
+ regexIndex.add("WORD_WITH_HYPHEN");
371
+
372
+ regexes.add(PUNCTUATION);
373
+ regexIndex.add("PUNCTUATION");
374
+
375
+ regexes.add(SPECIAL_CHAR);
376
+ regexIndex.add("SPECIAL_CHAR");
377
+
378
+ regexes.add(ALLCAP);
379
+ regexIndex.add("ALLCAP");
380
+
381
+ }
382
+
383
+ return regexes;
384
+ }
385
+
386
+ public static int getRegexIndex(String regex)
387
+ {
388
+ return regexIndex.indexOf(regex.toUpperCase());
389
+ }
390
+ public static void main(String[] args) throws IOException {
391
+ List<String> tokens = Tokenizer.tokenize("93% 9-10 anh-yeu-em");
392
+
393
+ for(String token : tokens) {
394
+ System.out.print(token + " ");
395
+ }
396
+ }
397
+ }
VnCoreNLP/src/main/java/vn/corenlp/wordsegmenter/FWObject.java ADDED
@@ -0,0 +1,30 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ package vn.corenlp.wordsegmenter;
2
+
3
+ /**
4
+ * @author DatQuocNguyen
5
+ */
6
+
7
+ /*
8
+ * Define a 5-word/tag window object to capture the context surrounding a word
9
+ */
10
+ public class FWObject {
11
+ private String[] context;
12
+
13
+ public FWObject(boolean check) {
14
+ context = new String[10];
15
+ if (check == true) {
16
+ for (int i = 0; i < 10; i += 2) {
17
+ context[i] = "<W>";
18
+ context[i + 1] = "<T>";
19
+ }
20
+ }
21
+ }
22
+
23
+ public String[] getContext() {
24
+ return context;
25
+ }
26
+
27
+ public void setContext(String[] context) {
28
+ this.context = context;
29
+ }
30
+ }
VnCoreNLP/src/main/java/vn/corenlp/wordsegmenter/Node.java ADDED
@@ -0,0 +1,85 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ package vn.corenlp.wordsegmenter;
2
+
3
+ /**
4
+ * @author DatQuocNguyen
5
+ */
6
+
7
+ public class Node {
8
+ private FWObject condition;
9
+ private String conclusion;
10
+ private Node exceptNode;
11
+ private Node ifnotNode;
12
+ private Node fatherNode;
13
+ private int depth;
14
+
15
+ public Node(FWObject inCondition, String inConclusion, Node inFatherNode, Node inExceptNode,
16
+ Node inIfnotNode, int inDepth) {
17
+ this.condition = inCondition;
18
+ this.conclusion = inConclusion;
19
+ this.fatherNode = inFatherNode;
20
+ this.exceptNode = inExceptNode;
21
+ this.ifnotNode = inIfnotNode;
22
+ this.depth = inDepth;
23
+ }
24
+
25
+ public void setIfnotNode(Node node) {
26
+ this.ifnotNode = node;
27
+ }
28
+
29
+ public void setExceptNode(Node node) {
30
+ this.exceptNode = node;
31
+ }
32
+
33
+ public void setFatherNode(Node node) {
34
+ this.fatherNode = node;
35
+ }
36
+
37
+ public int countNodes() {
38
+ int count = 1;
39
+ if (exceptNode != null) {
40
+ count += exceptNode.countNodes();
41
+ }
42
+ if (ifnotNode != null) {
43
+ count += ifnotNode.countNodes();
44
+ }
45
+ return count;
46
+ }
47
+
48
+ public boolean satisfy(FWObject object) {
49
+ boolean check = true;
50
+ for (int i = 0; i < 10; i++) {
51
+ String key = condition.getContext()[i];
52
+ if (key != null) {
53
+ if (!key.equals(object.getContext()[i])) {
54
+ check = false;
55
+ break;
56
+ }
57
+ }
58
+ }
59
+ return check;
60
+ }
61
+
62
+ public FWObject getCondition() {
63
+ return condition;
64
+ }
65
+
66
+ public String getConclusion() {
67
+ return conclusion;
68
+ }
69
+
70
+ public Node getExceptNode() {
71
+ return exceptNode;
72
+ }
73
+
74
+ public Node getIfnotNode() {
75
+ return ifnotNode;
76
+ }
77
+
78
+ public Node getFatherNode() {
79
+ return fatherNode;
80
+ }
81
+
82
+ public int getDepth() {
83
+ return depth;
84
+ }
85
+ }
VnCoreNLP/src/main/java/vn/corenlp/wordsegmenter/Utils.java ADDED
@@ -0,0 +1,126 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ package vn.corenlp.wordsegmenter;
2
+
3
+ import java.util.HashMap;
4
+ import java.util.List;
5
+ import java.util.Map;
6
+ import java.util.Set;
7
+
8
+ /**
9
+ * @author DatQuocNguyen
10
+ *
11
+ */
12
+ public class Utils
13
+ {
14
+ public static FWObject getCondition(String strCondition)
15
+ {
16
+ FWObject condition = new FWObject(false);
17
+
18
+ for (String rule : strCondition.split(" and ")) {
19
+ rule = rule.trim();
20
+ String key = rule.substring(rule.indexOf(".") + 1, rule.indexOf(" "));
21
+ String value = getConcreteValue(rule);
22
+
23
+ if (key.equals("prevWord2")) {
24
+ condition.getContext()[4] = value;
25
+ }
26
+ else if (key.equals("prevTag2")) {
27
+ condition.getContext()[5] = value;
28
+ }
29
+ else if (key.equals("prevWord1")) {
30
+ condition.getContext()[2] = value;
31
+ }
32
+ else if (key.equals("prevTag1")) {
33
+ condition.getContext()[3] = value;
34
+ }
35
+ else if (key.equals("word")) {
36
+ condition.getContext()[1] = value;
37
+ }
38
+ else if (key.equals("tag")) {
39
+ condition.getContext()[0] = value;
40
+ }
41
+ else if (key.equals("nextWord1")) {
42
+ condition.getContext()[6] = value;
43
+ }
44
+ else if (key.equals("nextTag1")) {
45
+ condition.getContext()[7] = value;
46
+ }
47
+ else if (key.equals("nextWord2")) {
48
+ condition.getContext()[8] = value;
49
+ }
50
+ else if (key.equals("nextTag2")) {
51
+ condition.getContext()[9] = value;
52
+ }
53
+ }
54
+
55
+ return condition;
56
+ }
57
+
58
+ public static FWObject getObject(List<WordTag> wordtags, int size, int index)
59
+ {
60
+ FWObject object = new FWObject(true);
61
+
62
+ if (index > 1) {
63
+ object.getContext()[4] = wordtags.get(index - 2).word;
64
+ object.getContext()[5] = wordtags.get(index - 2).tag;
65
+ }
66
+
67
+ if (index > 0) {
68
+ object.getContext()[2] = wordtags.get(index - 1).word;
69
+ object.getContext()[3] = wordtags.get(index - 1).tag;
70
+ }
71
+
72
+ String currentWord = wordtags.get(index).word;
73
+ String currentTag = wordtags.get(index).tag;
74
+
75
+ object.getContext()[1] = currentWord;
76
+ object.getContext()[0] = currentTag;
77
+
78
+ if (index < size - 1) {
79
+ object.getContext()[6] = wordtags.get(index + 1).word;
80
+ object.getContext()[7] = wordtags.get(index + 1).tag;
81
+ }
82
+
83
+ if (index < size - 2) {
84
+ object.getContext()[8] = wordtags.get(index + 2).word;
85
+ object.getContext()[9] = wordtags.get(index + 2).tag;
86
+ }
87
+
88
+ return object;
89
+ }
90
+
91
+ public static String getConcreteValue(String str)
92
+ {
93
+ if (str.contains("\"\"")) {
94
+ if (str.contains("Word"))
95
+ return "<W>";
96
+ else
97
+ return "<T>";
98
+ }
99
+ String conclusion = str.substring(str.indexOf("\"") + 1, str.length() - 1);
100
+ return conclusion;
101
+ }
102
+
103
+ public static Map<String, String> NORMALIZER;
104
+ public static Set<String> NORMALIZER_KEYS;
105
+ static {
106
+ NORMALIZER = new HashMap<String, String>();
107
+ NORMALIZER.put("òa", "oà");
108
+ NORMALIZER.put("óa", "oá");
109
+ NORMALIZER.put("ỏa", "oả");
110
+ NORMALIZER.put("õa", "oã");
111
+ NORMALIZER.put("ọa", "oạ");
112
+ NORMALIZER.put("òe", "oè");
113
+ NORMALIZER.put("óe", "oé");
114
+ NORMALIZER.put("ỏe", "oẻ");
115
+ NORMALIZER.put("õe", "oẽ");
116
+ NORMALIZER.put("ọe", "oẹ");
117
+ NORMALIZER.put("ùy", "uỳ");
118
+ NORMALIZER.put("úy", "uý");
119
+ NORMALIZER.put("ủy", "uỷ");
120
+ NORMALIZER.put("ũy", "uỹ");
121
+ NORMALIZER.put("ụy", "uỵ");
122
+ NORMALIZER.put("Ủy", "Uỷ");
123
+ NORMALIZER_KEYS = NORMALIZER.keySet();
124
+ }
125
+
126
+ }
VnCoreNLP/src/main/java/vn/corenlp/wordsegmenter/Vocabulary.java ADDED
@@ -0,0 +1,1605 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ package vn.corenlp.wordsegmenter;
2
+
3
+ import java.io.File;
4
+ import java.io.FileInputStream;
5
+ import java.io.IOException;
6
+ import java.io.ObjectInputStream;
7
+ import java.util.HashSet;
8
+ import java.util.Set;
9
+
10
+ import vn.pipeline.Utils;
11
+
12
+ @SuppressWarnings("unchecked")
13
+ public class Vocabulary {
14
+ public static Set<String> VN_DICT;
15
+ static {
16
+ VN_DICT = new HashSet<String>();
17
+ try {
18
+ String vocabPath = Utils.jarDir + "/models/wordsegmenter/vi-vocab";
19
+ if (!new File(vocabPath).exists())
20
+ throw new IOException("Vocabulary: " + vocabPath + " is not found!");
21
+ //Vocabulary.class.getClassLoader().getResource("wordsegmenter/vi-vocab").getPath()
22
+ ObjectInputStream ois = new ObjectInputStream(new FileInputStream(vocabPath));
23
+ VN_DICT = (Set<String>) ois.readObject();
24
+ ois.close();
25
+ }
26
+ catch (IOException | ClassNotFoundException e1) {
27
+ // TODO Auto-generated catch block
28
+ e1.printStackTrace();
29
+ }
30
+ // BufferedReader buffer;
31
+ // try {
32
+ // buffer = new BufferedReader(new InputStreamReader(
33
+ // new FileInputStream(new File("VnVocab.txt")), "UTF-8"));
34
+ // for (String line; (line = buffer.readLine()) != null;) {
35
+ // line = line.trim();
36
+ // if (line.contains(" "))
37
+ // VN_DICT.add(line);
38
+ // }
39
+ // buffer.close();
40
+ // }
41
+ // catch (FileNotFoundException e) {
42
+ // // TODO Auto-generated catch block
43
+ // e.printStackTrace();
44
+ // }
45
+ // catch (IOException e) {
46
+ // // TODO Auto-generated catch block
47
+ // e.printStackTrace();
48
+ // }
49
+ }
50
+
51
+ public static Set<String> COUNTRY_L_NAME;
52
+ static {
53
+ COUNTRY_L_NAME = new HashSet<String>();
54
+ COUNTRY_L_NAME.add("na uy");
55
+ COUNTRY_L_NAME.add("san marino");
56
+ COUNTRY_L_NAME.add("phần lan");
57
+ COUNTRY_L_NAME.add("bồ đào nha");
58
+ COUNTRY_L_NAME.add("ca-ri-bê hà lan");
59
+ COUNTRY_L_NAME.add("quần đảo bắc mariana");
60
+ COUNTRY_L_NAME.add("ả rập xê-út");
61
+ COUNTRY_L_NAME.add("tây ban nha");
62
+ COUNTRY_L_NAME.add("quần đảo virgin");
63
+ COUNTRY_L_NAME.add("đảo somoa thuộc mỹ");
64
+ COUNTRY_L_NAME.add("đông timor");
65
+ COUNTRY_L_NAME.add("hoa kỳ");
66
+ COUNTRY_L_NAME.add("quần đảo pitcairn");
67
+ COUNTRY_L_NAME.add("samoa thuộc mỹ");
68
+ COUNTRY_L_NAME.add("hàn quốc");
69
+ COUNTRY_L_NAME.add("đảo ascension");
70
+ COUNTRY_L_NAME.add("thuỵ sĩ");
71
+ COUNTRY_L_NAME.add("ai cập");
72
+ COUNTRY_L_NAME.add("burkina faso");
73
+ COUNTRY_L_NAME.add("mông cổ");
74
+ COUNTRY_L_NAME.add("polynesia thuộc pháp");
75
+ COUNTRY_L_NAME.add("turks và caicos");
76
+ COUNTRY_L_NAME.add("thổ nhĩ kỳ");
77
+ COUNTRY_L_NAME.add("liên bang micronesia");
78
+ COUNTRY_L_NAME.add("đảo man");
79
+ COUNTRY_L_NAME.add("saint helena");
80
+ COUNTRY_L_NAME.add("ả rập saudi");
81
+ COUNTRY_L_NAME.add("ba lan");
82
+ COUNTRY_L_NAME.add("são tomé và príncipe");
83
+ COUNTRY_L_NAME.add("đảo norfolk");
84
+ COUNTRY_L_NAME.add("chdcnd triều tiên");
85
+ COUNTRY_L_NAME.add("quần đảo canary");
86
+ COUNTRY_L_NAME.add("guiana thuộc pháp");
87
+ COUNTRY_L_NAME.add("antigua và barbuda");
88
+ COUNTRY_L_NAME.add("saint pierre và miquelon");
89
+ COUNTRY_L_NAME.add("sri lanka");
90
+ COUNTRY_L_NAME.add("ceuta và melilla");
91
+ COUNTRY_L_NAME.add("việt nam");
92
+ COUNTRY_L_NAME.add("bờ biển ngà");
93
+ COUNTRY_L_NAME.add("thuỵ điển");
94
+ COUNTRY_L_NAME.add("el salvador");
95
+ COUNTRY_L_NAME.add("svalbard và jan mayen");
96
+ COUNTRY_L_NAME.add("saint lucia");
97
+ COUNTRY_L_NAME.add("diego garcia");
98
+ COUNTRY_L_NAME.add("ấn độ");
99
+ COUNTRY_L_NAME.add("tây sahara");
100
+ COUNTRY_L_NAME.add("quần đảo cook");
101
+ COUNTRY_L_NAME.add("guinea xích đạo");
102
+ COUNTRY_L_NAME.add("trung quốc");
103
+ COUNTRY_L_NAME.add("chdc congo");
104
+ COUNTRY_L_NAME.add("cộng hoà dominica");
105
+ COUNTRY_L_NAME.add("cape verde");
106
+ COUNTRY_L_NAME.add("hà lan");
107
+ COUNTRY_L_NAME.add("puerto rico");
108
+ COUNTRY_L_NAME.add("đài loan");
109
+ COUNTRY_L_NAME.add("cộng hoà séc");
110
+ COUNTRY_L_NAME.add("costa rica");
111
+ COUNTRY_L_NAME.add("saint kitts và nevis");
112
+ COUNTRY_L_NAME.add("nhật bản");
113
+ COUNTRY_L_NAME.add("quần đảo faroe");
114
+ COUNTRY_L_NAME.add("đan mạch");
115
+ COUNTRY_L_NAME.add("turk và caicos");
116
+ COUNTRY_L_NAME.add("cabo verde");
117
+ COUNTRY_L_NAME.add("nam sudan");
118
+ COUNTRY_L_NAME.add("cộng hoà trung phi");
119
+ COUNTRY_L_NAME.add("trung phi");
120
+ COUNTRY_L_NAME.add("saint vincent và grenadines");
121
+ COUNTRY_L_NAME.add("quần đảo cocos");
122
+ COUNTRY_L_NAME.add("thành vatican");
123
+ COUNTRY_L_NAME.add("saint barthélemy");
124
+ COUNTRY_L_NAME.add("nam cực");
125
+ COUNTRY_L_NAME.add("trinidad và tobago");
126
+ COUNTRY_L_NAME.add("cộng hoà congo");
127
+ COUNTRY_L_NAME.add("quần đảo cayman");
128
+ COUNTRY_L_NAME.add("saint martin");
129
+ COUNTRY_L_NAME.add("tristan da cunha");
130
+ COUNTRY_L_NAME.add("bosnia và herzegovina");
131
+ COUNTRY_L_NAME.add("thái lan");
132
+ COUNTRY_L_NAME.add("new zealand");
133
+ COUNTRY_L_NAME.add("hồng kông");
134
+ COUNTRY_L_NAME.add("wallis và futuna");
135
+ COUNTRY_L_NAME.add("sierra leone");
136
+ COUNTRY_L_NAME.add("sint maarten");
137
+ COUNTRY_L_NAME.add("quần đảo solomon");
138
+ COUNTRY_L_NAME.add("nam phi");
139
+ COUNTRY_L_NAME.add("bosna và hercegovina");
140
+ COUNTRY_L_NAME.add("vương quốc anh");
141
+ COUNTRY_L_NAME.add("papua new guinea");
142
+ COUNTRY_L_NAME.add("hy lạp");
143
+ COUNTRY_L_NAME.add("đảo giáng sinh");
144
+ COUNTRY_L_NAME.add("triều tiên");
145
+ COUNTRY_L_NAME.add("quần đảo falkland");
146
+ COUNTRY_L_NAME.add("miến điện");
147
+ COUNTRY_L_NAME.add("quần đảo marshall");
148
+ COUNTRY_L_NAME.add("new caledonia");
149
+ }
150
+
151
+ public static Set<String> COUNTRY_S_NAME;
152
+ static {
153
+ COUNTRY_S_NAME = new HashSet<String>();
154
+ COUNTRY_S_NAME.add("mỹ");
155
+ COUNTRY_S_NAME.add("belarus");
156
+ COUNTRY_S_NAME.add("guinée");
157
+ COUNTRY_S_NAME.add("gambia");
158
+ COUNTRY_S_NAME.add("cô-oét");
159
+ COUNTRY_S_NAME.add("guinea");
160
+ COUNTRY_S_NAME.add("estonia");
161
+ COUNTRY_S_NAME.add("philippines");
162
+ COUNTRY_S_NAME.add("cuba");
163
+ COUNTRY_S_NAME.add("mauritius");
164
+ COUNTRY_S_NAME.add("mali");
165
+ COUNTRY_S_NAME.add("armenia");
166
+ COUNTRY_S_NAME.add("aruba");
167
+ COUNTRY_S_NAME.add("méxico");
168
+ COUNTRY_S_NAME.add("ukraina");
169
+ COUNTRY_S_NAME.add("bénin");
170
+ COUNTRY_S_NAME.add("congo");
171
+ COUNTRY_S_NAME.add("monaco");
172
+ COUNTRY_S_NAME.add("séc");
173
+ COUNTRY_S_NAME.add("kenya");
174
+ COUNTRY_S_NAME.add("hungary");
175
+ COUNTRY_S_NAME.add("greenland");
176
+ COUNTRY_S_NAME.add("li-băng");
177
+ COUNTRY_S_NAME.add("paraguay");
178
+ COUNTRY_S_NAME.add("palau");
179
+ COUNTRY_S_NAME.add("vanuatu");
180
+ COUNTRY_S_NAME.add("colombia");
181
+ COUNTRY_S_NAME.add("azerbaijan");
182
+ COUNTRY_S_NAME.add("syria");
183
+ COUNTRY_S_NAME.add("rwanda");
184
+ COUNTRY_S_NAME.add("libya");
185
+ COUNTRY_S_NAME.add("guernsey");
186
+ COUNTRY_S_NAME.add("afghanistan");
187
+ COUNTRY_S_NAME.add("guiné-bissau");
188
+ COUNTRY_S_NAME.add("hungari");
189
+ COUNTRY_S_NAME.add("kiribati");
190
+ COUNTRY_S_NAME.add("dominica");
191
+ COUNTRY_S_NAME.add("bulgaria");
192
+ COUNTRY_S_NAME.add("brasil");
193
+ COUNTRY_S_NAME.add("bahrain");
194
+ COUNTRY_S_NAME.add("guatemala");
195
+ COUNTRY_S_NAME.add("ghana");
196
+ COUNTRY_S_NAME.add("somalia");
197
+ COUNTRY_S_NAME.add("jamaica");
198
+ COUNTRY_S_NAME.add("togo");
199
+ COUNTRY_S_NAME.add("liechtenstein");
200
+ COUNTRY_S_NAME.add("serbia");
201
+ COUNTRY_S_NAME.add("ma-rốc");
202
+ COUNTRY_S_NAME.add("bỉ");
203
+ COUNTRY_S_NAME.add("úc");
204
+ COUNTRY_S_NAME.add("senegal");
205
+ COUNTRY_S_NAME.add("montserrat");
206
+ COUNTRY_S_NAME.add("zambia");
207
+ COUNTRY_S_NAME.add("namibia");
208
+ COUNTRY_S_NAME.add("comoros");
209
+ COUNTRY_S_NAME.add("curaçao");
210
+ COUNTRY_S_NAME.add("palestine");
211
+ COUNTRY_S_NAME.add("canada");
212
+ COUNTRY_S_NAME.add("li-bi");
213
+ COUNTRY_S_NAME.add("honduras");
214
+ COUNTRY_S_NAME.add("réunion");
215
+ COUNTRY_S_NAME.add("maldives");
216
+ COUNTRY_S_NAME.add("chile");
217
+ COUNTRY_S_NAME.add("algérie");
218
+ COUNTRY_S_NAME.add("oman");
219
+ COUNTRY_S_NAME.add("timor-leste");
220
+ COUNTRY_S_NAME.add("brazil");
221
+ COUNTRY_S_NAME.add("lesotho");
222
+ COUNTRY_S_NAME.add("guyana");
223
+ COUNTRY_S_NAME.add("peru");
224
+ COUNTRY_S_NAME.add("malaysia");
225
+ COUNTRY_S_NAME.add("jersey");
226
+ COUNTRY_S_NAME.add("síp");
227
+ COUNTRY_S_NAME.add("belize");
228
+ COUNTRY_S_NAME.add("nauru");
229
+ COUNTRY_S_NAME.add("campuchia");
230
+ COUNTRY_S_NAME.add("kuwait");
231
+ COUNTRY_S_NAME.add("slovenia");
232
+ COUNTRY_S_NAME.add("somali");
233
+ COUNTRY_S_NAME.add("haiti");
234
+ COUNTRY_S_NAME.add("zimbabwe");
235
+ COUNTRY_S_NAME.add("macedonia");
236
+ COUNTRY_S_NAME.add("micronesia");
237
+ COUNTRY_S_NAME.add("philippin");
238
+ COUNTRY_S_NAME.add("bolivia");
239
+ COUNTRY_S_NAME.add("brunei");
240
+ COUNTRY_S_NAME.add("israel");
241
+ COUNTRY_S_NAME.add("lào");
242
+ COUNTRY_S_NAME.add("bangladesh");
243
+ COUNTRY_S_NAME.add("ý");
244
+ COUNTRY_S_NAME.add("ireland");
245
+ COUNTRY_S_NAME.add("albania");
246
+ COUNTRY_S_NAME.add("botswana");
247
+ COUNTRY_S_NAME.add("venezuela");
248
+ COUNTRY_S_NAME.add("andorra");
249
+ COUNTRY_S_NAME.add("malawi");
250
+ COUNTRY_S_NAME.add("moldova");
251
+ COUNTRY_S_NAME.add("madagascar");
252
+ COUNTRY_S_NAME.add("turkmenistan");
253
+ COUNTRY_S_NAME.add("iran");
254
+ COUNTRY_S_NAME.add("iraq");
255
+ COUNTRY_S_NAME.add("seychelles");
256
+ COUNTRY_S_NAME.add("indonesia");
257
+ COUNTRY_S_NAME.add("tchad");
258
+ COUNTRY_S_NAME.add("nicaragua");
259
+ COUNTRY_S_NAME.add("gibraltar");
260
+ COUNTRY_S_NAME.add("ethiopia");
261
+ COUNTRY_S_NAME.add("ecuador");
262
+ COUNTRY_S_NAME.add("guinea-bissau");
263
+ COUNTRY_S_NAME.add("mauritania");
264
+ COUNTRY_S_NAME.add("albani");
265
+ COUNTRY_S_NAME.add("algeria");
266
+ COUNTRY_S_NAME.add("mozambique");
267
+ COUNTRY_S_NAME.add("cameroon");
268
+ COUNTRY_S_NAME.add("vatican");
269
+ COUNTRY_S_NAME.add("liban");
270
+ COUNTRY_S_NAME.add("panama");
271
+ COUNTRY_S_NAME.add("uae");
272
+ COUNTRY_S_NAME.add("luxembourg");
273
+ COUNTRY_S_NAME.add("nigeria");
274
+ COUNTRY_S_NAME.add("sudan");
275
+ COUNTRY_S_NAME.add("benin");
276
+ COUNTRY_S_NAME.add("chad");
277
+ COUNTRY_S_NAME.add("liberia");
278
+ COUNTRY_S_NAME.add("djibouti");
279
+ COUNTRY_S_NAME.add("đức");
280
+ COUNTRY_S_NAME.add("tajikistan");
281
+ COUNTRY_S_NAME.add("fiji");
282
+ COUNTRY_S_NAME.add("singapore");
283
+ COUNTRY_S_NAME.add("mexico");
284
+ COUNTRY_S_NAME.add("samoa");
285
+ COUNTRY_S_NAME.add("tunisia");
286
+ COUNTRY_S_NAME.add("bahamas");
287
+ COUNTRY_S_NAME.add("bhutan");
288
+ COUNTRY_S_NAME.add("uganda");
289
+ COUNTRY_S_NAME.add("uruguay");
290
+ COUNTRY_S_NAME.add("gabon");
291
+ COUNTRY_S_NAME.add("bungari");
292
+ COUNTRY_S_NAME.add("niger");
293
+ COUNTRY_S_NAME.add("kyrgyzstan");
294
+ COUNTRY_S_NAME.add("pakistan");
295
+ COUNTRY_S_NAME.add("martinique");
296
+ COUNTRY_S_NAME.add("macao");
297
+ COUNTRY_S_NAME.add("kosovo");
298
+ COUNTRY_S_NAME.add("mayotte");
299
+ COUNTRY_S_NAME.add("yemen");
300
+ COUNTRY_S_NAME.add("georgia");
301
+ COUNTRY_S_NAME.add("pháp");
302
+ COUNTRY_S_NAME.add("ai-len");
303
+ COUNTRY_S_NAME.add("argentina");
304
+ COUNTRY_S_NAME.add("jordan");
305
+ COUNTRY_S_NAME.add("anguilla");
306
+ COUNTRY_S_NAME.add("swaziland");
307
+ COUNTRY_S_NAME.add("burundi");
308
+ COUNTRY_S_NAME.add("slovakia");
309
+ COUNTRY_S_NAME.add("uzbekistan");
310
+ COUNTRY_S_NAME.add("maroc");
311
+ COUNTRY_S_NAME.add("tanzania");
312
+ COUNTRY_S_NAME.add("litva");
313
+ COUNTRY_S_NAME.add("grenada");
314
+ COUNTRY_S_NAME.add("gruzia");
315
+ COUNTRY_S_NAME.add("lít-va");
316
+ COUNTRY_S_NAME.add("guam");
317
+ COUNTRY_S_NAME.add("eritrea");
318
+ COUNTRY_S_NAME.add("áo");
319
+ COUNTRY_S_NAME.add("croatia");
320
+ COUNTRY_S_NAME.add("niue");
321
+ COUNTRY_S_NAME.add("nepal");
322
+ COUNTRY_S_NAME.add("tokelau");
323
+ COUNTRY_S_NAME.add("bermuda");
324
+ COUNTRY_S_NAME.add("i-rắc");
325
+ COUNTRY_S_NAME.add("suriname");
326
+ COUNTRY_S_NAME.add("guadeloupe");
327
+ COUNTRY_S_NAME.add("nga");
328
+ COUNTRY_S_NAME.add("romania");
329
+ COUNTRY_S_NAME.add("angola");
330
+ COUNTRY_S_NAME.add("latvia");
331
+ COUNTRY_S_NAME.add("kazakhstan");
332
+ COUNTRY_S_NAME.add("malta");
333
+ COUNTRY_S_NAME.add("myanmar");
334
+ COUNTRY_S_NAME.add("iceland");
335
+ COUNTRY_S_NAME.add("românia");
336
+ COUNTRY_S_NAME.add("montenegro");
337
+ COUNTRY_S_NAME.add("macau");
338
+ COUNTRY_S_NAME.add("tuvalu");
339
+ COUNTRY_S_NAME.add("qatar");
340
+ COUNTRY_S_NAME.add("tonga");
341
+ COUNTRY_S_NAME.add("barbados");
342
+ }
343
+
344
+ public static Set<String> WORLD_COMPANY;
345
+ static {
346
+ WORLD_COMPANY = new HashSet<String>();
347
+ WORLD_COMPANY.add("verizon");
348
+ WORLD_COMPANY.add("prada");
349
+ WORLD_COMPANY.add("hp");
350
+ WORLD_COMPANY.add("walmart");
351
+ WORLD_COMPANY.add("adidas");
352
+ WORLD_COMPANY.add("mastercard");
353
+ WORLD_COMPANY.add("digg");
354
+ WORLD_COMPANY.add("canon");
355
+ WORLD_COMPANY.add("ikea");
356
+ WORLD_COMPANY.add("sony");
357
+ WORLD_COMPANY.add("twitter");
358
+ WORLD_COMPANY.add("lego");
359
+ WORLD_COMPANY.add("toshiba");
360
+ WORLD_COMPANY.add("nokia");
361
+ WORLD_COMPANY.add("bbc");
362
+ WORLD_COMPANY.add("vmware");
363
+ WORLD_COMPANY.add("mercedes-benz");
364
+ WORLD_COMPANY.add("google");
365
+ WORLD_COMPANY.add("intel");
366
+ WORLD_COMPANY.add("iphone");
367
+ WORLD_COMPANY.add("rbc");
368
+ WORLD_COMPANY.add("fedex");
369
+ WORLD_COMPANY.add("mercedes");
370
+ WORLD_COMPANY.add("gillette");
371
+ WORLD_COMPANY.add("ups");
372
+ WORLD_COMPANY.add("carrefour");
373
+ WORLD_COMPANY.add("lenovo");
374
+ WORLD_COMPANY.add("loreal");
375
+ WORLD_COMPANY.add("mcdonald");
376
+ WORLD_COMPANY.add("coca-cola");
377
+ WORLD_COMPANY.add("guardian");
378
+ WORLD_COMPANY.add("cisco");
379
+ WORLD_COMPANY.add("paypal");
380
+ WORLD_COMPANY.add("cvs");
381
+ WORLD_COMPANY.add("acer");
382
+ WORLD_COMPANY.add("cnn");
383
+ WORLD_COMPANY.add("nike");
384
+ WORLD_COMPANY.add("facebook");
385
+ WORLD_COMPANY.add("spotify");
386
+ WORLD_COMPANY.add("adobe");
387
+ WORLD_COMPANY.add("kfc");
388
+ WORLD_COMPANY.add("westpac");
389
+ WORLD_COMPANY.add("subway");
390
+ WORLD_COMPANY.add("ibm");
391
+ WORLD_COMPANY.add("panasonic");
392
+ WORLD_COMPANY.add("visa");
393
+ WORLD_COMPANY.add("motorola");
394
+ WORLD_COMPANY.add("nissan");
395
+ WORLD_COMPANY.add("citibank");
396
+ WORLD_COMPANY.add("baidu");
397
+ WORLD_COMPANY.add("ford");
398
+ WORLD_COMPANY.add("microsoft");
399
+ WORLD_COMPANY.add("bmw");
400
+ WORLD_COMPANY.add("foxconn");
401
+ WORLD_COMPANY.add("yahoo");
402
+ WORLD_COMPANY.add("hermes");
403
+ WORLD_COMPANY.add("oracle");
404
+ WORLD_COMPANY.add("mcdonalds");
405
+ WORLD_COMPANY.add("tencent");
406
+ WORLD_COMPANY.add("mtv");
407
+ WORLD_COMPANY.add("zara");
408
+ WORLD_COMPANY.add("amazon");
409
+ WORLD_COMPANY.add("toyota");
410
+ WORLD_COMPANY.add("gucci");
411
+ WORLD_COMPANY.add("ebay");
412
+ WORLD_COMPANY.add("kodak");
413
+ WORLD_COMPANY.add("youtube");
414
+ WORLD_COMPANY.add("android");
415
+ WORLD_COMPANY.add("linkedin");
416
+ WORLD_COMPANY.add("myspace");
417
+ WORLD_COMPANY.add("t-mobile");
418
+ WORLD_COMPANY.add("apple");
419
+ WORLD_COMPANY.add("samsung");
420
+ WORLD_COMPANY.add("aldi");
421
+ WORLD_COMPANY.add("colgate");
422
+ WORLD_COMPANY.add("starbucks");
423
+ WORLD_COMPANY.add("pepsi");
424
+ WORLD_COMPANY.add("honda");
425
+ WORLD_COMPANY.add("dell");
426
+ WORLD_COMPANY.add("hitachi");
427
+ WORLD_COMPANY.add("blackberry");
428
+ WORLD_COMPANY.add("disney");
429
+ WORLD_COMPANY.add("siemens");
430
+ WORLD_COMPANY.add("vodafone");
431
+ }
432
+
433
+ public static Set<String> VN_LOCATIONS;
434
+ static {
435
+ VN_LOCATIONS = new HashSet<String>();
436
+ VN_LOCATIONS.add("mỹ tho");
437
+ VN_LOCATIONS.add("tập cận bình");
438
+ VN_LOCATIONS.add("nam đông");
439
+ VN_LOCATIONS.add("kiên lương");
440
+ VN_LOCATIONS.add("lương sơn");
441
+ VN_LOCATIONS.add("gò vấp");
442
+ VN_LOCATIONS.add("quang bình");
443
+ VN_LOCATIONS.add("ia pa");
444
+ VN_LOCATIONS.add("lạc sơn");
445
+ VN_LOCATIONS.add("chí linh");
446
+ VN_LOCATIONS.add("ninh hải");
447
+ VN_LOCATIONS.add("sơn dương");
448
+ VN_LOCATIONS.add("quan sơn");
449
+ VN_LOCATIONS.add("ứng hoà");
450
+ VN_LOCATIONS.add("krông pắk");
451
+ VN_LOCATIONS.add("tân hưng");
452
+ VN_LOCATIONS.add("nghệ an");
453
+ VN_LOCATIONS.add("tân thạnh");
454
+ VN_LOCATIONS.add("yên định");
455
+ VN_LOCATIONS.add("mường nhé");
456
+ VN_LOCATIONS.add("ngô quyền");
457
+ VN_LOCATIONS.add("hàm thuận bắc");
458
+ VN_LOCATIONS.add("phú tân");
459
+ VN_LOCATIONS.add("tân hồng");
460
+ VN_LOCATIONS.add("trà ôn");
461
+ VN_LOCATIONS.add("từ liêm");
462
+ VN_LOCATIONS.add("bình thuận");
463
+ VN_LOCATIONS.add("an phú");
464
+ VN_LOCATIONS.add("duy xuyên");
465
+ VN_LOCATIONS.add("nam trực");
466
+ VN_LOCATIONS.add("phù cừ");
467
+ VN_LOCATIONS.add("mai sơn");
468
+ VN_LOCATIONS.add("thạnh phú");
469
+ VN_LOCATIONS.add("lộc bình");
470
+ VN_LOCATIONS.add("kim thành");
471
+ VN_LOCATIONS.add("cái bè");
472
+ VN_LOCATIONS.add("hà quảng");
473
+ VN_LOCATIONS.add("long thành");
474
+ VN_LOCATIONS.add("đồng phù");
475
+ VN_LOCATIONS.add("bảo yên");
476
+ VN_LOCATIONS.add("chiêm hoá");
477
+ VN_LOCATIONS.add("gia nghĩa");
478
+ VN_LOCATIONS.add("an dương");
479
+ VN_LOCATIONS.add("phú quý");
480
+ VN_LOCATIONS.add("quảng trạch");
481
+ VN_LOCATIONS.add("trường sa");
482
+ VN_LOCATIONS.add("hoàn kiếm");
483
+ VN_LOCATIONS.add("thủ thừa");
484
+ VN_LOCATIONS.add("hải lăng");
485
+ VN_LOCATIONS.add("pleiku");
486
+ VN_LOCATIONS.add("thanh hoá");
487
+ VN_LOCATIONS.add("bạch thông");
488
+ VN_LOCATIONS.add("vĩnh phúc");
489
+ VN_LOCATIONS.add("vãn lãng");
490
+ VN_LOCATIONS.add("bình gia");
491
+ VN_LOCATIONS.add("sa thầy");
492
+ VN_LOCATIONS.add("triệu sơn");
493
+ VN_LOCATIONS.add("yên thuỷ");
494
+ VN_LOCATIONS.add("văn giang");
495
+ VN_LOCATIONS.add("hồ chí minh");
496
+ VN_LOCATIONS.add("nga sơn");
497
+ VN_LOCATIONS.add("gia lâm");
498
+ VN_LOCATIONS.add("vị thanh");
499
+ VN_LOCATIONS.add("cái răng");
500
+ VN_LOCATIONS.add("cao bằng");
501
+ VN_LOCATIONS.add("hoài ân");
502
+ VN_LOCATIONS.add("vĩnh long");
503
+ VN_LOCATIONS.add("kim động");
504
+ VN_LOCATIONS.add("ngân sơn");
505
+ VN_LOCATIONS.add("lấp vò");
506
+ VN_LOCATIONS.add("sông công");
507
+ VN_LOCATIONS.add("hoài nhơn");
508
+ VN_LOCATIONS.add("kim bôi");
509
+ VN_LOCATIONS.add("bắc ninh");
510
+ VN_LOCATIONS.add("thái nguyên");
511
+ VN_LOCATIONS.add("đơn dương");
512
+ VN_LOCATIONS.add("định quán");
513
+ VN_LOCATIONS.add("gò công");
514
+ VN_LOCATIONS.add("hà giang");
515
+ VN_LOCATIONS.add("hoà bình");
516
+ VN_LOCATIONS.add("mèo vạc");
517
+ VN_LOCATIONS.add("mộc châu");
518
+ VN_LOCATIONS.add("quảng ngãi");
519
+ VN_LOCATIONS.add("cẩm giàng");
520
+ VN_LOCATIONS.add("sông hinh");
521
+ VN_LOCATIONS.add("thới bình");
522
+ VN_LOCATIONS.add("phụng hiệp");
523
+ VN_LOCATIONS.add("ninh hoà");
524
+ VN_LOCATIONS.add("hậu giang");
525
+ VN_LOCATIONS.add("cái nước");
526
+ VN_LOCATIONS.add("ô môn");
527
+ VN_LOCATIONS.add("gia lai");
528
+ VN_LOCATIONS.add("phổ yên");
529
+ VN_LOCATIONS.add("quế sơn");
530
+ VN_LOCATIONS.add("yên thành");
531
+ VN_LOCATIONS.add("tiên du");
532
+ VN_LOCATIONS.add("an minh");
533
+ VN_LOCATIONS.add("chợ lách");
534
+ VN_LOCATIONS.add("phú ninh");
535
+ VN_LOCATIONS.add("tủa chùa");
536
+ VN_LOCATIONS.add("hương trà");
537
+ VN_LOCATIONS.add("thăng bình");
538
+ VN_LOCATIONS.add("vĩnh thuận");
539
+ VN_LOCATIONS.add("hà tĩnh");
540
+ VN_LOCATIONS.add("lâm đồng");
541
+ VN_LOCATIONS.add("phú quốc");
542
+ VN_LOCATIONS.add("long mỹ");
543
+ VN_LOCATIONS.add("long an");
544
+ VN_LOCATIONS.add("bình lục");
545
+ VN_LOCATIONS.add("vĩnh thạnh");
546
+ VN_LOCATIONS.add("đống đa");
547
+ VN_LOCATIONS.add("hạ long");
548
+ VN_LOCATIONS.add("kỳ sơn");
549
+ VN_LOCATIONS.add("đăk song");
550
+ VN_LOCATIONS.add("lai vung");
551
+ VN_LOCATIONS.add("ý yên");
552
+ VN_LOCATIONS.add("xuyên mộc");
553
+ VN_LOCATIONS.add("vị xuyên");
554
+ VN_LOCATIONS.add("duy tiên");
555
+ VN_LOCATIONS.add("khánh sơn");
556
+ VN_LOCATIONS.add("bỉm sơn");
557
+ VN_LOCATIONS.add("hiệp đức");
558
+ VN_LOCATIONS.add("kim sơn");
559
+ VN_LOCATIONS.add("xín mần");
560
+ VN_LOCATIONS.add("hương thuỷ");
561
+ VN_LOCATIONS.add("tuy hoà");
562
+ VN_LOCATIONS.add("u minh");
563
+ VN_LOCATIONS.add("thiệu hoá");
564
+ VN_LOCATIONS.add("bù đốp");
565
+ VN_LOCATIONS.add("yên sơn");
566
+ VN_LOCATIONS.add("quảng xương");
567
+ VN_LOCATIONS.add("cần đước");
568
+ VN_LOCATIONS.add("thuỷ nguyên");
569
+ VN_LOCATIONS.add("yên dũng");
570
+ VN_LOCATIONS.add("yên hưng");
571
+ VN_LOCATIONS.add("bắc mê");
572
+ VN_LOCATIONS.add("thọ xuân");
573
+ VN_LOCATIONS.add("móng cái");
574
+ VN_LOCATIONS.add("lạc dương");
575
+ VN_LOCATIONS.add("cẩm xuyên");
576
+ VN_LOCATIONS.add("lâm thao");
577
+ VN_LOCATIONS.add("bình tân");
578
+ VN_LOCATIONS.add("phúc yên");
579
+ VN_LOCATIONS.add("sơn tây");
580
+ VN_LOCATIONS.add("vĩnh châu");
581
+ VN_LOCATIONS.add("na hang");
582
+ VN_LOCATIONS.add("chương mỹ");
583
+ VN_LOCATIONS.add("bảo lộc");
584
+ VN_LOCATIONS.add("nghi xuân");
585
+ VN_LOCATIONS.add("lương tài");
586
+ VN_LOCATIONS.add("thoại sơn");
587
+ VN_LOCATIONS.add("cửa lò");
588
+ VN_LOCATIONS.add("đông hưng");
589
+ VN_LOCATIONS.add("lập thạch");
590
+ VN_LOCATIONS.add("nam định");
591
+ VN_LOCATIONS.add("quảng nam");
592
+ VN_LOCATIONS.add("kiên hải");
593
+ VN_LOCATIONS.add("đồng xuân");
594
+ VN_LOCATIONS.add("phú xuyên");
595
+ VN_LOCATIONS.add("tiểu cần");
596
+ VN_LOCATIONS.add("phúc thọ");
597
+ VN_LOCATIONS.add("đông giang");
598
+ VN_LOCATIONS.add("gò dầu");
599
+ VN_LOCATIONS.add("giá rai");
600
+ VN_LOCATIONS.add("tây sơn");
601
+ VN_LOCATIONS.add("phú hoà");
602
+ VN_LOCATIONS.add("việt yên");
603
+ VN_LOCATIONS.add("đak đoa");
604
+ VN_LOCATIONS.add("mường la");
605
+ VN_LOCATIONS.add("hồng ngự");
606
+ VN_LOCATIONS.add("bắc bình");
607
+ VN_LOCATIONS.add("phủ lý");
608
+ VN_LOCATIONS.add("gio linh");
609
+ VN_LOCATIONS.add("cồn cỏ");
610
+ VN_LOCATIONS.add("đức linh");
611
+ VN_LOCATIONS.add("củ chi");
612
+ VN_LOCATIONS.add("hương sơn");
613
+ VN_LOCATIONS.add("tịnh biên");
614
+ VN_LOCATIONS.add("bình thuỷ");
615
+ VN_LOCATIONS.add("nhà bè");
616
+ VN_LOCATIONS.add("yên thế");
617
+ VN_LOCATIONS.add("vĩnh tường");
618
+ VN_LOCATIONS.add("kế sách");
619
+ VN_LOCATIONS.add("sóc sơn");
620
+ VN_LOCATIONS.add("chợ đồn");
621
+ VN_LOCATIONS.add("châu phú");
622
+ VN_LOCATIONS.add("kiến an");
623
+ VN_LOCATIONS.add("sốp cộp");
624
+ VN_LOCATIONS.add("lệ thuỷ");
625
+ VN_LOCATIONS.add("sơn tịnh");
626
+ VN_LOCATIONS.add("càng long");
627
+ VN_LOCATIONS.add("vị thuỷ");
628
+ VN_LOCATIONS.add("ea súp");
629
+ VN_LOCATIONS.add("quảng điền");
630
+ VN_LOCATIONS.add("nghĩa lộ");
631
+ VN_LOCATIONS.add("đồ sơn");
632
+ VN_LOCATIONS.add("krông pa");
633
+ VN_LOCATIONS.add("việt trì");
634
+ VN_LOCATIONS.add("tân thành");
635
+ VN_LOCATIONS.add("nghĩa hưng");
636
+ VN_LOCATIONS.add("bạc liêu");
637
+ VN_LOCATIONS.add("hưng yên");
638
+ VN_LOCATIONS.add("hoàng mai");
639
+ VN_LOCATIONS.add("diên khánh");
640
+ VN_LOCATIONS.add("lăk");
641
+ VN_LOCATIONS.add("bắc trà my");
642
+ VN_LOCATIONS.add("tân châu");
643
+ VN_LOCATIONS.add("tân phú");
644
+ VN_LOCATIONS.add("bình long");
645
+ VN_LOCATIONS.add("đông hà");
646
+ VN_LOCATIONS.add("kon plông");
647
+ VN_LOCATIONS.add("sa đéc");
648
+ VN_LOCATIONS.add("an lão");
649
+ VN_LOCATIONS.add("như xuân");
650
+ VN_LOCATIONS.add("bến lức");
651
+ VN_LOCATIONS.add("thanh khê");
652
+ VN_LOCATIONS.add("long xuyên");
653
+ VN_LOCATIONS.add("chợ gạo");
654
+ VN_LOCATIONS.add("lục nam");
655
+ VN_LOCATIONS.add("hoà thành");
656
+ VN_LOCATIONS.add("vũng liêm");
657
+ VN_LOCATIONS.add("bình định");
658
+ VN_LOCATIONS.add("cẩm mỹ");
659
+ VN_LOCATIONS.add("mộc hoá");
660
+ VN_LOCATIONS.add("tánh linh");
661
+ VN_LOCATIONS.add("đất đỏ");
662
+ VN_LOCATIONS.add("quế võ");
663
+ VN_LOCATIONS.add("trấn yên");
664
+ VN_LOCATIONS.add("cầu ngang");
665
+ VN_LOCATIONS.add("lai châu");
666
+ VN_LOCATIONS.add("gò công tây");
667
+ VN_LOCATIONS.add("lý nhân");
668
+ VN_LOCATIONS.add("bà rịa-vũng tàu");
669
+ VN_LOCATIONS.add("bình giang");
670
+ VN_LOCATIONS.add("mường khương");
671
+ VN_LOCATIONS.add("gò quao");
672
+ VN_LOCATIONS.add("bình đại");
673
+ VN_LOCATIONS.add("điện bàn");
674
+ VN_LOCATIONS.add("hải châu");
675
+ VN_LOCATIONS.add("bắc giang");
676
+ VN_LOCATIONS.add("văn lâm");
677
+ VN_LOCATIONS.add("ninh thuận");
678
+ VN_LOCATIONS.add("cô tô");
679
+ VN_LOCATIONS.add("quảng uyên");
680
+ VN_LOCATIONS.add("đông hải");
681
+ VN_LOCATIONS.add("phan thiết");
682
+ VN_LOCATIONS.add("tĩnh gia");
683
+ VN_LOCATIONS.add("bạch long vĩ");
684
+ VN_LOCATIONS.add("hoài đức");
685
+ VN_LOCATIONS.add("la gi");
686
+ VN_LOCATIONS.add("ngọc hồi");
687
+ VN_LOCATIONS.add("bình sơn");
688
+ VN_LOCATIONS.add("dương minh châu");
689
+ VN_LOCATIONS.add("can lộc");
690
+ VN_LOCATIONS.add("hồng bàng");
691
+ VN_LOCATIONS.add("thanh miện");
692
+ VN_LOCATIONS.add("trảng bàng");
693
+ VN_LOCATIONS.add("thái bình");
694
+ VN_LOCATIONS.add("hải dương");
695
+ VN_LOCATIONS.add("hà tây");
696
+ VN_LOCATIONS.add("krông nô");
697
+ VN_LOCATIONS.add("tam đường");
698
+ VN_LOCATIONS.add("nguyên bình");
699
+ VN_LOCATIONS.add("thủ dầu một");
700
+ VN_LOCATIONS.add("vĩnh lộc");
701
+ VN_LOCATIONS.add("đăk r'lấp");
702
+ VN_LOCATIONS.add("hai bà trưng");
703
+ VN_LOCATIONS.add("long khánh");
704
+ VN_LOCATIONS.add("bình liêu");
705
+ VN_LOCATIONS.add("đồng hỷ");
706
+ VN_LOCATIONS.add("võ nhai");
707
+ VN_LOCATIONS.add("lạc thuỷ");
708
+ VN_LOCATIONS.add("quỳnh phụ");
709
+ VN_LOCATIONS.add("diễn châu");
710
+ VN_LOCATIONS.add("cầu giấy");
711
+ VN_LOCATIONS.add("sơn la");
712
+ VN_LOCATIONS.add("sông mã");
713
+ VN_LOCATIONS.add("kinh môn");
714
+ VN_LOCATIONS.add("thạch thành");
715
+ VN_LOCATIONS.add("ea kar");
716
+ VN_LOCATIONS.add("krông búk");
717
+ VN_LOCATIONS.add("gò công đông");
718
+ VN_LOCATIONS.add("phù ninh");
719
+ VN_LOCATIONS.add("sơn hà");
720
+ VN_LOCATIONS.add("đạ tẻh");
721
+ VN_LOCATIONS.add("mộ đức");
722
+ VN_LOCATIONS.add("cờ đỏ");
723
+ VN_LOCATIONS.add("hương khê");
724
+ VN_LOCATIONS.add("phú lương");
725
+ VN_LOCATIONS.add("di linh");
726
+ VN_LOCATIONS.add("phú vang");
727
+ VN_LOCATIONS.add("lạng giang");
728
+ VN_LOCATIONS.add("yên mô");
729
+ VN_LOCATIONS.add("giao thuỷ");
730
+ VN_LOCATIONS.add("quốc oai");
731
+ VN_LOCATIONS.add("tuyên quang");
732
+ VN_LOCATIONS.add("bát xát");
733
+ VN_LOCATIONS.add("bắc hà");
734
+ VN_LOCATIONS.add("đắk lắk");
735
+ VN_LOCATIONS.add("tiên phước");
736
+ VN_LOCATIONS.add("lê chân");
737
+ VN_LOCATIONS.add("tiên yên");
738
+ VN_LOCATIONS.add("bến cát");
739
+ VN_LOCATIONS.add("tây giang");
740
+ VN_LOCATIONS.add("đà nẵng");
741
+ VN_LOCATIONS.add("ia grai");
742
+ VN_LOCATIONS.add("tam bình");
743
+ VN_LOCATIONS.add("thường tín");
744
+ VN_LOCATIONS.add("vĩnh bảo");
745
+ VN_LOCATIONS.add("hướng hoá");
746
+ VN_LOCATIONS.add("sơn trà");
747
+ VN_LOCATIONS.add("tân uyên");
748
+ VN_LOCATIONS.add("m'đrăk");
749
+ VN_LOCATIONS.add("quản bạ");
750
+ VN_LOCATIONS.add("liên chiểu");
751
+ VN_LOCATIONS.add("tri tôn");
752
+ VN_LOCATIONS.add("tiên lãng");
753
+ VN_LOCATIONS.add("biên hoà");
754
+ VN_LOCATIONS.add("hải hậu");
755
+ VN_LOCATIONS.add("tây ninh");
756
+ VN_LOCATIONS.add("quỳnh nhai");
757
+ VN_LOCATIONS.add("thạch hà");
758
+ VN_LOCATIONS.add("đồng nai");
759
+ VN_LOCATIONS.add("tuyên hoá");
760
+ VN_LOCATIONS.add("mai châu");
761
+ VN_LOCATIONS.add("yên bái");
762
+ VN_LOCATIONS.add("duyên hải");
763
+ VN_LOCATIONS.add("tháp mười");
764
+ VN_LOCATIONS.add("phú nhuận");
765
+ VN_LOCATIONS.add("ân thi");
766
+ VN_LOCATIONS.add("khoái châu");
767
+ VN_LOCATIONS.add("hòn đất");
768
+ VN_LOCATIONS.add("thống nhất");
769
+ VN_LOCATIONS.add("nghĩa đàn");
770
+ VN_LOCATIONS.add("quế phong");
771
+ VN_LOCATIONS.add("thủ đức");
772
+ VN_LOCATIONS.add("hạ lang");
773
+ VN_LOCATIONS.add("vĩnh linh");
774
+ VN_LOCATIONS.add("yên lạc");
775
+ VN_LOCATIONS.add("triệu phong");
776
+ VN_LOCATIONS.add("lâm hà");
777
+ VN_LOCATIONS.add("bảo lâm");
778
+ VN_LOCATIONS.add("hải phòng");
779
+ VN_LOCATIONS.add("vũ quang");
780
+ VN_LOCATIONS.add("cao lộc");
781
+ VN_LOCATIONS.add("nhơn trạch");
782
+ VN_LOCATIONS.add("quảng trị");
783
+ VN_LOCATIONS.add("thạch thất");
784
+ VN_LOCATIONS.add("chơn thành");
785
+ VN_LOCATIONS.add("tân yên");
786
+ VN_LOCATIONS.add("thanh hà");
787
+ VN_LOCATIONS.add("thạnh hoá");
788
+ VN_LOCATIONS.add("si ma cai");
789
+ VN_LOCATIONS.add("bác ái");
790
+ VN_LOCATIONS.add("đăk hà");
791
+ VN_LOCATIONS.add("yên minh");
792
+ VN_LOCATIONS.add("tân bình");
793
+ VN_LOCATIONS.add("đại từ");
794
+ VN_LOCATIONS.add("phục hoà");
795
+ VN_LOCATIONS.add("ninh sơn");
796
+ VN_LOCATIONS.add("long phú");
797
+ VN_LOCATIONS.add("hà tiên");
798
+ VN_LOCATIONS.add("thanh bình");
799
+ VN_LOCATIONS.add("mỏ cày");
800
+ VN_LOCATIONS.add("thạnh trị");
801
+ VN_LOCATIONS.add("trà vinh");
802
+ VN_LOCATIONS.add("dầu tiếng");
803
+ VN_LOCATIONS.add("bắc kạn");
804
+ VN_LOCATIONS.add("chư sê");
805
+ VN_LOCATIONS.add("thanh trì");
806
+ VN_LOCATIONS.add("ngọc lạc");
807
+ VN_LOCATIONS.add("từ sơn");
808
+ VN_LOCATIONS.add("gia bình");
809
+ VN_LOCATIONS.add("pác nặm");
810
+ VN_LOCATIONS.add("thốt nốt");
811
+ VN_LOCATIONS.add("trà bồng");
812
+ VN_LOCATIONS.add("thừa thiên-huế");
813
+ VN_LOCATIONS.add("phước long");
814
+ VN_LOCATIONS.add("cẩm phả");
815
+ VN_LOCATIONS.add("kon rẫy");
816
+ VN_LOCATIONS.add("long biên");
817
+ VN_LOCATIONS.add("cư m'gar");
818
+ VN_LOCATIONS.add("cao lãnh");
819
+ VN_LOCATIONS.add("buôn đôn");
820
+ VN_LOCATIONS.add("đắk nông");
821
+ VN_LOCATIONS.add("lý sơn");
822
+ VN_LOCATIONS.add("sóc trăng");
823
+ VN_LOCATIONS.add("hoằng hoá");
824
+ VN_LOCATIONS.add("quận 10");
825
+ VN_LOCATIONS.add("krông ana");
826
+ VN_LOCATIONS.add("quận 11");
827
+ VN_LOCATIONS.add("quận 12");
828
+ VN_LOCATIONS.add("phan rang-tháp chàm");
829
+ VN_LOCATIONS.add("tân kỳ");
830
+ VN_LOCATIONS.add("tương dương");
831
+ VN_LOCATIONS.add("đan phượng");
832
+ VN_LOCATIONS.add("anh sơn");
833
+ VN_LOCATIONS.add("quận 2");
834
+ VN_LOCATIONS.add("quận 1");
835
+ VN_LOCATIONS.add("qui nhơn");
836
+ VN_LOCATIONS.add("tư nghĩa");
837
+ VN_LOCATIONS.add("bố trạch");
838
+ VN_LOCATIONS.add("quận 9");
839
+ VN_LOCATIONS.add("thạch an");
840
+ VN_LOCATIONS.add("bảo thắng");
841
+ VN_LOCATIONS.add("quận 8");
842
+ VN_LOCATIONS.add("quận 7");
843
+ VN_LOCATIONS.add("nghĩa hành");
844
+ VN_LOCATIONS.add("quận 6");
845
+ VN_LOCATIONS.add("quận 5");
846
+ VN_LOCATIONS.add("hội an");
847
+ VN_LOCATIONS.add("quận 4");
848
+ VN_LOCATIONS.add("quận 3");
849
+ VN_LOCATIONS.add("phong điền");
850
+ VN_LOCATIONS.add("xuân lộc");
851
+ VN_LOCATIONS.add("côn đảo");
852
+ VN_LOCATIONS.add("nha trang");
853
+ VN_LOCATIONS.add("tân lạc");
854
+ VN_LOCATIONS.add("hạ hoà");
855
+ VN_LOCATIONS.add("gia viễn");
856
+ VN_LOCATIONS.add("đồng tháp");
857
+ VN_LOCATIONS.add("hoành bồ");
858
+ VN_LOCATIONS.add("bắc quang");
859
+ VN_LOCATIONS.add("na rì");
860
+ VN_LOCATIONS.add("sông cầu");
861
+ VN_LOCATIONS.add("mường tè");
862
+ VN_LOCATIONS.add("yên phong");
863
+ VN_LOCATIONS.add("tứ kỳ");
864
+ VN_LOCATIONS.add("vũ thư");
865
+ VN_LOCATIONS.add("mỹ hào");
866
+ VN_LOCATIONS.add("chư prông");
867
+ VN_LOCATIONS.add("hóc môn");
868
+ VN_LOCATIONS.add("châu đốc");
869
+ VN_LOCATIONS.add("đô lương");
870
+ VN_LOCATIONS.add("mang thít");
871
+ VN_LOCATIONS.add("tràng định");
872
+ VN_LOCATIONS.add("cam ranh");
873
+ VN_LOCATIONS.add("mang yang");
874
+ VN_LOCATIONS.add("hàm thuận nam");
875
+ VN_LOCATIONS.add("hưng nguyên");
876
+ VN_LOCATIONS.add("kiến xương");
877
+ VN_LOCATIONS.add("ninh phước");
878
+ VN_LOCATIONS.add("phong thổ");
879
+ VN_LOCATIONS.add("đức thọ");
880
+ VN_LOCATIONS.add("hồng lĩnh");
881
+ VN_LOCATIONS.add("khánh vĩnh");
882
+ VN_LOCATIONS.add("mỹ lộc");
883
+ VN_LOCATIONS.add("ngọc hiển");
884
+ VN_LOCATIONS.add("phước sơn");
885
+ VN_LOCATIONS.add("hà đông");
886
+ VN_LOCATIONS.add("lào cai");
887
+ VN_LOCATIONS.add("vĩnh yên");
888
+ VN_LOCATIONS.add("quỳ châu");
889
+ VN_LOCATIONS.add("sơn động");
890
+ VN_LOCATIONS.add("bến cầu");
891
+ VN_LOCATIONS.add("đông anh");
892
+ VN_LOCATIONS.add("kông chro");
893
+ VN_LOCATIONS.add("trảng bom");
894
+ VN_LOCATIONS.add("đông triều");
895
+ VN_LOCATIONS.add("ba tơ");
896
+ VN_LOCATIONS.add("cù lao dung");
897
+ VN_LOCATIONS.add("mỹ xuyên");
898
+ VN_LOCATIONS.add("quảng hà");
899
+ VN_LOCATIONS.add("tân biên");
900
+ VN_LOCATIONS.add("bá thước");
901
+ VN_LOCATIONS.add("cà mau");
902
+ VN_LOCATIONS.add("chi lăng");
903
+ VN_LOCATIONS.add("yên bình");
904
+ VN_LOCATIONS.add("bình minh");
905
+ VN_LOCATIONS.add("bình dương");
906
+ VN_LOCATIONS.add("an nhơn");
907
+ VN_LOCATIONS.add("chư păh");
908
+ VN_LOCATIONS.add("việt nam");
909
+ VN_LOCATIONS.add("giồng riềng");
910
+ VN_LOCATIONS.add("cát tiên");
911
+ VN_LOCATIONS.add("thuận an");
912
+ VN_LOCATIONS.add("ngã năm");
913
+ VN_LOCATIONS.add("cẩm thuỷ");
914
+ VN_LOCATIONS.add("minh long");
915
+ VN_LOCATIONS.add("nam đàn");
916
+ VN_LOCATIONS.add("tân hiệp");
917
+ VN_LOCATIONS.add("thanh sơn");
918
+ VN_LOCATIONS.add("dĩ an");
919
+ VN_LOCATIONS.add("thuận thành");
920
+ VN_LOCATIONS.add("điện biên phủ");
921
+ VN_LOCATIONS.add("vạn ninh");
922
+ VN_LOCATIONS.add("hưng yê");
923
+ VN_LOCATIONS.add("thái thuỵ");
924
+ VN_LOCATIONS.add("thanh xuân");
925
+ VN_LOCATIONS.add("cần giờ");
926
+ VN_LOCATIONS.add("ngũ hành sơn");
927
+ VN_LOCATIONS.add("ba tri");
928
+ VN_LOCATIONS.add("hồng dân");
929
+ VN_LOCATIONS.add("ninh giang");
930
+ VN_LOCATIONS.add("phan rang tháp chàm");
931
+ VN_LOCATIONS.add("than uyên");
932
+ VN_LOCATIONS.add("phú lộc");
933
+ VN_LOCATIONS.add("thanh chương");
934
+ VN_LOCATIONS.add("lục ngạn");
935
+ VN_LOCATIONS.add("năm căn");
936
+ VN_LOCATIONS.add("điện biên đông");
937
+ VN_LOCATIONS.add("hữu lũng");
938
+ VN_LOCATIONS.add("hoàng su phì");
939
+ VN_LOCATIONS.add("tây hồ");
940
+ VN_LOCATIONS.add("bắc yên");
941
+ VN_LOCATIONS.add("sài gòn");
942
+ VN_LOCATIONS.add("vĩnh cửu");
943
+ VN_LOCATIONS.add("bình phước");
944
+ VN_LOCATIONS.add("nam sách");
945
+ VN_LOCATIONS.add("hưng hà");
946
+ VN_LOCATIONS.add("bình chánh");
947
+ VN_LOCATIONS.add("uông bí");
948
+ VN_LOCATIONS.add("ea h'leo");
949
+ VN_LOCATIONS.add("tam điệp");
950
+ VN_LOCATIONS.add("nam giang");
951
+ VN_LOCATIONS.add("trùng khánh");
952
+ VN_LOCATIONS.add("gia lộc");
953
+ VN_LOCATIONS.add("tam dương");
954
+ VN_LOCATIONS.add("hoà an");
955
+ VN_LOCATIONS.add("thừa thiên huế");
956
+ VN_LOCATIONS.add("nông cống");
957
+ VN_LOCATIONS.add("tam kỳ");
958
+ VN_LOCATIONS.add("đak pơ");
959
+ VN_LOCATIONS.add("bình thạnh");
960
+ VN_LOCATIONS.add("hà nội");
961
+ VN_LOCATIONS.add("châu thành");
962
+ VN_LOCATIONS.add("tiên lữ");
963
+ VN_LOCATIONS.add("cầu kè");
964
+ VN_LOCATIONS.add("ninh kiều");
965
+ VN_LOCATIONS.add("buôn ma thuột");
966
+ VN_LOCATIONS.add("an khê");
967
+ VN_LOCATIONS.add("đức huệ");
968
+ VN_LOCATIONS.add("tiền hải");
969
+ VN_LOCATIONS.add("tuy phước");
970
+ VN_LOCATIONS.add("bà rịa");
971
+ VN_LOCATIONS.add("đa krông");
972
+ VN_LOCATIONS.add("đồng xoài");
973
+ VN_LOCATIONS.add("ba vì");
974
+ VN_LOCATIONS.add("quảng ninh");
975
+ VN_LOCATIONS.add("điện biên");
976
+ VN_LOCATIONS.add("hà trung");
977
+ VN_LOCATIONS.add("thanh oai");
978
+ VN_LOCATIONS.add("trà cú");
979
+ VN_LOCATIONS.add("văn yên");
980
+ VN_LOCATIONS.add("bình xuyên");
981
+ VN_LOCATIONS.add("hoà vang");
982
+ VN_LOCATIONS.add("trà lĩnh");
983
+ VN_LOCATIONS.add("yên khánh");
984
+ VN_LOCATIONS.add("kbang");
985
+ VN_LOCATIONS.add("hoàng sa");
986
+ VN_LOCATIONS.add("văn quan");
987
+ VN_LOCATIONS.add("ba chẽ");
988
+ VN_LOCATIONS.add("nho quan");
989
+ VN_LOCATIONS.add("khánh hoà");
990
+ VN_LOCATIONS.add("đăk mil");
991
+ VN_LOCATIONS.add("kiến thuỵ");
992
+ VN_LOCATIONS.add("đầm hà");
993
+ VN_LOCATIONS.add("hàm tân");
994
+ VN_LOCATIONS.add("phù cát");
995
+ VN_LOCATIONS.add("kim bảng");
996
+ VN_LOCATIONS.add("vũng tầu");
997
+ VN_LOCATIONS.add("kiên giang");
998
+ VN_LOCATIONS.add("long hồ");
999
+ VN_LOCATIONS.add("mường chà");
1000
+ VN_LOCATIONS.add("thanh ba");
1001
+ VN_LOCATIONS.add("đại lộc");
1002
+ VN_LOCATIONS.add("mê linh");
1003
+ VN_LOCATIONS.add("mường lát");
1004
+ VN_LOCATIONS.add("đạ huoai");
1005
+ VN_LOCATIONS.add("huế");
1006
+ VN_LOCATIONS.add("cần thơ");
1007
+ VN_LOCATIONS.add("vụ bản");
1008
+ VN_LOCATIONS.add("thanh liêm");
1009
+ VN_LOCATIONS.add("đoan hùng");
1010
+ VN_LOCATIONS.add("hiệp hoà");
1011
+ VN_LOCATIONS.add("bắc sơn");
1012
+ VN_LOCATIONS.add("tân trụ");
1013
+ VN_LOCATIONS.add("cần giuộc");
1014
+ VN_LOCATIONS.add("đăk glong");
1015
+ VN_LOCATIONS.add("hậu lộc");
1016
+ VN_LOCATIONS.add("kỳ anh");
1017
+ VN_LOCATIONS.add("cai lậy");
1018
+ VN_LOCATIONS.add("krông bông");
1019
+ VN_LOCATIONS.add("yên lập");
1020
+ VN_LOCATIONS.add("mù căng chải");
1021
+ VN_LOCATIONS.add("mỹ tú");
1022
+ VN_LOCATIONS.add("trạm tấu");
1023
+ VN_LOCATIONS.add("cư jút");
1024
+ VN_LOCATIONS.add("quỳ hợp");
1025
+ VN_LOCATIONS.add("tân phước");
1026
+ VN_LOCATIONS.add("vĩnh lợi");
1027
+ VN_LOCATIONS.add("đồng văn");
1028
+ VN_LOCATIONS.add("đông sơn");
1029
+ VN_LOCATIONS.add("tây trà");
1030
+ VN_LOCATIONS.add("lộc ninh");
1031
+ VN_LOCATIONS.add("sầm sơn");
1032
+ VN_LOCATIONS.add("lạng sơn");
1033
+ VN_LOCATIONS.add("sa pa");
1034
+ VN_LOCATIONS.add("hàm yên");
1035
+ VN_LOCATIONS.add("vân đồn");
1036
+ VN_LOCATIONS.add("đà bắc");
1037
+ VN_LOCATIONS.add("vân canh");
1038
+ VN_LOCATIONS.add("sơn hoà");
1039
+ VN_LOCATIONS.add("thuận bắc");
1040
+ VN_LOCATIONS.add("châu đức");
1041
+ VN_LOCATIONS.add("thường xuân");
1042
+ VN_LOCATIONS.add("định hoá");
1043
+ VN_LOCATIONS.add("giồng trôm");
1044
+ VN_LOCATIONS.add("núi thành");
1045
+ VN_LOCATIONS.add("rạch giá");
1046
+ VN_LOCATIONS.add("con cuông");
1047
+ VN_LOCATIONS.add("ninh bình");
1048
+ VN_LOCATIONS.add("đồng hới");
1049
+ VN_LOCATIONS.add("tân an");
1050
+ VN_LOCATIONS.add("trực ninh");
1051
+ VN_LOCATIONS.add("thuận châu");
1052
+ VN_LOCATIONS.add("vinh");
1053
+ VN_LOCATIONS.add("trần văn thời");
1054
+ VN_LOCATIONS.add("minh hoá");
1055
+ VN_LOCATIONS.add("yên mỹ");
1056
+ VN_LOCATIONS.add("quan hoá");
1057
+ VN_LOCATIONS.add("văn bàn");
1058
+ VN_LOCATIONS.add("cam lộ");
1059
+ VN_LOCATIONS.add("lang chánh");
1060
+ VN_LOCATIONS.add("phù yên");
1061
+ VN_LOCATIONS.add("đăk tô");
1062
+ VN_LOCATIONS.add("hoa lư");
1063
+ VN_LOCATIONS.add("lục yên");
1064
+ VN_LOCATIONS.add("đức phổ");
1065
+ VN_LOCATIONS.add("hà nam");
1066
+ VN_LOCATIONS.add("tuy an");
1067
+ VN_LOCATIONS.add("an giang");
1068
+ VN_LOCATIONS.add("ba bể");
1069
+ VN_LOCATIONS.add("xuân trường");
1070
+ VN_LOCATIONS.add("cát hải");
1071
+ VN_LOCATIONS.add("kon tum");
1072
+ VN_LOCATIONS.add("bù đăng");
1073
+ VN_LOCATIONS.add("krông năng");
1074
+ VN_LOCATIONS.add("an biên");
1075
+ VN_LOCATIONS.add("yên châu");
1076
+ VN_LOCATIONS.add("phú thọ");
1077
+ VN_LOCATIONS.add("tam nông");
1078
+ VN_LOCATIONS.add("quỳnh lưu");
1079
+ VN_LOCATIONS.add("đình lập");
1080
+ VN_LOCATIONS.add("nghi lộc");
1081
+ VN_LOCATIONS.add("chợ mới");
1082
+ VN_LOCATIONS.add("đức trọng");
1083
+ VN_LOCATIONS.add("đầm dơi");
1084
+ VN_LOCATIONS.add("long đất");
1085
+ VN_LOCATIONS.add("mường lay");
1086
+ VN_LOCATIONS.add("tiền giang");
1087
+ VN_LOCATIONS.add("thông nông");
1088
+ VN_LOCATIONS.add("phú yên");
1089
+ VN_LOCATIONS.add("quảng bình");
1090
+ VN_LOCATIONS.add("sìn hồ");
1091
+ VN_LOCATIONS.add("tuy phong");
1092
+ VN_LOCATIONS.add("ba đình");
1093
+ VN_LOCATIONS.add("phù mỹ");
1094
+ VN_LOCATIONS.add("đức hoà");
1095
+ VN_LOCATIONS.add("bảo lạc");
1096
+ VN_LOCATIONS.add("đăk glei");
1097
+ VN_LOCATIONS.add("bến tre");
1098
+ VN_LOCATIONS.add("như thanh");
1099
+ VN_LOCATIONS.add("thanh thuỷ");
1100
+ VN_LOCATIONS.add("đà lạt");
1101
+ VN_LOCATIONS.add("đức cơ");
1102
+ VN_LOCATIONS.add("văn chấn");
1103
+ VN_LOCATIONS.add("bà rịa vũng tàu");
1104
+ VN_LOCATIONS.add("vĩnh hưng");
1105
+ VN_LOCATIONS.add("cao phong");
1106
+ VN_LOCATIONS.add("nam trà my");
1107
+ VN_LOCATIONS.add("phú giáo");
1108
+ VN_LOCATIONS.add("phú bình");
1109
+ VN_LOCATIONS.add("ayun pa");
1110
+ VN_LOCATIONS.add("mỹ đức");
1111
+ VN_LOCATIONS.add("tuần giáo");
1112
+ }
1113
+
1114
+ public static Set<String> VN_FIRST_SENT_WORDS;
1115
+ static {
1116
+ VN_FIRST_SENT_WORDS = new HashSet<String>();
1117
+ VN_FIRST_SENT_WORDS.add("được");
1118
+ VN_FIRST_SENT_WORDS.add("cty");
1119
+ VN_FIRST_SENT_WORDS.add("mẹ");
1120
+ VN_FIRST_SENT_WORDS.add("trừ");
1121
+ VN_FIRST_SENT_WORDS.add("lên");
1122
+ VN_FIRST_SENT_WORDS.add("trưởng");
1123
+ VN_FIRST_SENT_WORDS.add("là");
1124
+ VN_FIRST_SENT_WORDS.add("chàng");
1125
+ VN_FIRST_SENT_WORDS.add("theo");
1126
+ VN_FIRST_SENT_WORDS.add("tên");
1127
+ VN_FIRST_SENT_WORDS.add("giờ");
1128
+ VN_FIRST_SENT_WORDS.add("biết");
1129
+ VN_FIRST_SENT_WORDS.add("già");
1130
+ VN_FIRST_SENT_WORDS.add("những");
1131
+ VN_FIRST_SENT_WORDS.add("thấy");
1132
+ VN_FIRST_SENT_WORDS.add("thương");
1133
+ VN_FIRST_SENT_WORDS.add("lang");
1134
+ VN_FIRST_SENT_WORDS.add("gái");
1135
+ VN_FIRST_SENT_WORDS.add("mà");
1136
+ VN_FIRST_SENT_WORDS.add("xóm");
1137
+ VN_FIRST_SENT_WORDS.add("má");
1138
+ VN_FIRST_SENT_WORDS.add("cầu");
1139
+ VN_FIRST_SENT_WORDS.add("khách");
1140
+ VN_FIRST_SENT_WORDS.add("nhánh");
1141
+ VN_FIRST_SENT_WORDS.add("hôm");
1142
+ VN_FIRST_SENT_WORDS.add("nhớ");
1143
+ VN_FIRST_SENT_WORDS.add("hạng");
1144
+ VN_FIRST_SENT_WORDS.add("huyện");
1145
+ VN_FIRST_SENT_WORDS.add("vậy");
1146
+ VN_FIRST_SENT_WORDS.add("nhà");
1147
+ VN_FIRST_SENT_WORDS.add("ấp");
1148
+ VN_FIRST_SENT_WORDS.add("sông");
1149
+ VN_FIRST_SENT_WORDS.add("thằng");
1150
+ VN_FIRST_SENT_WORDS.add("nài");
1151
+ VN_FIRST_SENT_WORDS.add("ngành");
1152
+ VN_FIRST_SENT_WORDS.add("nếu");
1153
+ VN_FIRST_SENT_WORDS.add("trời");
1154
+ VN_FIRST_SENT_WORDS.add("đảng");
1155
+ VN_FIRST_SENT_WORDS.add("vào");
1156
+ VN_FIRST_SENT_WORDS.add("thầy");
1157
+ VN_FIRST_SENT_WORDS.add("hai");
1158
+ VN_FIRST_SENT_WORDS.add("vùng");
1159
+ VN_FIRST_SENT_WORDS.add("chuyện");
1160
+ VN_FIRST_SENT_WORDS.add("nhìn");
1161
+ VN_FIRST_SENT_WORDS.add("tim");
1162
+ VN_FIRST_SENT_WORDS.add("cha");
1163
+ VN_FIRST_SENT_WORDS.add("sang");
1164
+ VN_FIRST_SENT_WORDS.add("bên");
1165
+ VN_FIRST_SENT_WORDS.add("đường");
1166
+ VN_FIRST_SENT_WORDS.add("cho");
1167
+ VN_FIRST_SENT_WORDS.add("bảng");
1168
+ VN_FIRST_SENT_WORDS.add("khi");
1169
+ VN_FIRST_SENT_WORDS.add("quận");
1170
+ VN_FIRST_SENT_WORDS.add("biển");
1171
+ VN_FIRST_SENT_WORDS.add("cu");
1172
+ VN_FIRST_SENT_WORDS.add("metro");
1173
+ VN_FIRST_SENT_WORDS.add("vốn");
1174
+ VN_FIRST_SENT_WORDS.add("đến");
1175
+ VN_FIRST_SENT_WORDS.add("năm");
1176
+ VN_FIRST_SENT_WORDS.add("khu");
1177
+ VN_FIRST_SENT_WORDS.add("đài");
1178
+ VN_FIRST_SENT_WORDS.add("miền");
1179
+ VN_FIRST_SENT_WORDS.add("việc");
1180
+ VN_FIRST_SENT_WORDS.add("do");
1181
+ VN_FIRST_SENT_WORDS.add("lập");
1182
+ VN_FIRST_SENT_WORDS.add("nghe");
1183
+ VN_FIRST_SENT_WORDS.add("mắt");
1184
+ VN_FIRST_SENT_WORDS.add("viện");
1185
+ VN_FIRST_SENT_WORDS.add("cả");
1186
+ VN_FIRST_SENT_WORDS.add("em");
1187
+ VN_FIRST_SENT_WORDS.add("rừng");
1188
+ VN_FIRST_SENT_WORDS.add("liệu");
1189
+ VN_FIRST_SENT_WORDS.add("bố");
1190
+ VN_FIRST_SENT_WORDS.add("bộ");
1191
+ VN_FIRST_SENT_WORDS.add("cháu");
1192
+ VN_FIRST_SENT_WORDS.add("riêng");
1193
+ VN_FIRST_SENT_WORDS.add("bà");
1194
+ VN_FIRST_SENT_WORDS.add("số");
1195
+ VN_FIRST_SENT_WORDS.add("chị");
1196
+ VN_FIRST_SENT_WORDS.add("người");
1197
+ VN_FIRST_SENT_WORDS.add("bé");
1198
+ VN_FIRST_SENT_WORDS.add("tàu");
1199
+ VN_FIRST_SENT_WORDS.add("làng");
1200
+ VN_FIRST_SENT_WORDS.add("cảng");
1201
+ VN_FIRST_SENT_WORDS.add("sở");
1202
+ VN_FIRST_SENT_WORDS.add("chiếc");
1203
+ VN_FIRST_SENT_WORDS.add("tết");
1204
+ VN_FIRST_SENT_WORDS.add("cậu");
1205
+ VN_FIRST_SENT_WORDS.add("luật");
1206
+ VN_FIRST_SENT_WORDS.add("chờ");
1207
+ VN_FIRST_SENT_WORDS.add("rời");
1208
+ VN_FIRST_SENT_WORDS.add("chắc");
1209
+ VN_FIRST_SENT_WORDS.add("hội");
1210
+ VN_FIRST_SENT_WORDS.add("chợ");
1211
+ VN_FIRST_SENT_WORDS.add("viên");
1212
+ VN_FIRST_SENT_WORDS.add("cụ");
1213
+ VN_FIRST_SENT_WORDS.add("nay");
1214
+ VN_FIRST_SENT_WORDS.add("thuốc");
1215
+ VN_FIRST_SENT_WORDS.add("bọn");
1216
+ VN_FIRST_SENT_WORDS.add("tờ");
1217
+ VN_FIRST_SENT_WORDS.add("phía");
1218
+ VN_FIRST_SENT_WORDS.add("chữ");
1219
+ VN_FIRST_SENT_WORDS.add("xe");
1220
+ VN_FIRST_SENT_WORDS.add("cò");
1221
+ VN_FIRST_SENT_WORDS.add("có");
1222
+ VN_FIRST_SENT_WORDS.add("cô");
1223
+ VN_FIRST_SENT_WORDS.add("dân");
1224
+ VN_FIRST_SENT_WORDS.add("nhóm");
1225
+ VN_FIRST_SENT_WORDS.add("song");
1226
+ VN_FIRST_SENT_WORDS.add("chú");
1227
+ VN_FIRST_SENT_WORDS.add("từ");
1228
+ VN_FIRST_SENT_WORDS.add("như");
1229
+ VN_FIRST_SENT_WORDS.add("ngày");
1230
+ VN_FIRST_SENT_WORDS.add("phim");
1231
+ VN_FIRST_SENT_WORDS.add("chính");
1232
+ VN_FIRST_SENT_WORDS.add("tân");
1233
+ VN_FIRST_SENT_WORDS.add("gặp");
1234
+ VN_FIRST_SENT_WORDS.add("các");
1235
+ VN_FIRST_SENT_WORDS.add("quê");
1236
+ VN_FIRST_SENT_WORDS.add("dì");
1237
+ VN_FIRST_SENT_WORDS.add("bởi");
1238
+ VN_FIRST_SENT_WORDS.add("quí");
1239
+ VN_FIRST_SENT_WORDS.add("về");
1240
+ VN_FIRST_SENT_WORDS.add("trại");
1241
+ VN_FIRST_SENT_WORDS.add("tại");
1242
+ VN_FIRST_SENT_WORDS.add("lão");
1243
+ VN_FIRST_SENT_WORDS.add("đảo");
1244
+ VN_FIRST_SENT_WORDS.add("nguyên");
1245
+ VN_FIRST_SENT_WORDS.add("còn");
1246
+ VN_FIRST_SENT_WORDS.add("tiếng");
1247
+ VN_FIRST_SENT_WORDS.add("dòng");
1248
+ VN_FIRST_SENT_WORDS.add("và");
1249
+ VN_FIRST_SENT_WORDS.add("hiện");
1250
+ VN_FIRST_SENT_WORDS.add("vợ");
1251
+ VN_FIRST_SENT_WORDS.add("thuyền");
1252
+ VN_FIRST_SENT_WORDS.add("vụ");
1253
+ VN_FIRST_SENT_WORDS.add("đoàn");
1254
+ VN_FIRST_SENT_WORDS.add("thành");
1255
+ VN_FIRST_SENT_WORDS.add("giới");
1256
+ VN_FIRST_SENT_WORDS.add("bến");
1257
+ VN_FIRST_SENT_WORDS.add("vì");
1258
+ VN_FIRST_SENT_WORDS.add("đi");
1259
+ VN_FIRST_SENT_WORDS.add("sân");
1260
+ VN_FIRST_SENT_WORDS.add("sâm");
1261
+ VN_FIRST_SENT_WORDS.add("con");
1262
+ VN_FIRST_SENT_WORDS.add("bác");
1263
+ VN_FIRST_SENT_WORDS.add("cùng");
1264
+ VN_FIRST_SENT_WORDS.add("báo");
1265
+ VN_FIRST_SENT_WORDS.add("chồng");
1266
+ VN_FIRST_SENT_WORDS.add("hàng");
1267
+ VN_FIRST_SENT_WORDS.add("đất");
1268
+ VN_FIRST_SENT_WORDS.add("mỗi");
1269
+ VN_FIRST_SENT_WORDS.add("núi");
1270
+ VN_FIRST_SENT_WORDS.add("phòng");
1271
+ VN_FIRST_SENT_WORDS.add("xã");
1272
+ VN_FIRST_SENT_WORDS.add("hồ");
1273
+ VN_FIRST_SENT_WORDS.add("ông");
1274
+ VN_FIRST_SENT_WORDS.add("giọng");
1275
+ VN_FIRST_SENT_WORDS.add("trường");
1276
+ VN_FIRST_SENT_WORDS.add("đèo");
1277
+ VN_FIRST_SENT_WORDS.add("trùm");
1278
+ VN_FIRST_SENT_WORDS.add("nhiều");
1279
+ VN_FIRST_SENT_WORDS.add("thư");
1280
+ VN_FIRST_SENT_WORDS.add("cục");
1281
+ VN_FIRST_SENT_WORDS.add("nước");
1282
+ VN_FIRST_SENT_WORDS.add("thôn");
1283
+ VN_FIRST_SENT_WORDS.add("bạn");
1284
+ VN_FIRST_SENT_WORDS.add("nàng");
1285
+ VN_FIRST_SENT_WORDS.add("bệnh");
1286
+ VN_FIRST_SENT_WORDS.add("cụm");
1287
+ VN_FIRST_SENT_WORDS.add("tướng");
1288
+ VN_FIRST_SENT_WORDS.add("buôn");
1289
+ VN_FIRST_SENT_WORDS.add("để");
1290
+ VN_FIRST_SENT_WORDS.add("anh");
1291
+ VN_FIRST_SENT_WORDS.add("lính");
1292
+ VN_FIRST_SENT_WORDS.add("với");
1293
+ VN_FIRST_SENT_WORDS.add("ngoài");
1294
+ VN_FIRST_SENT_WORDS.add("trên");
1295
+ VN_FIRST_SENT_WORDS.add("hỏi");
1296
+ VN_FIRST_SENT_WORDS.add("sau");
1297
+ VN_FIRST_SENT_WORDS.add("đội");
1298
+ VN_FIRST_SENT_WORDS.add("gọi");
1299
+ VN_FIRST_SENT_WORDS.add("rồi");
1300
+ VN_FIRST_SENT_WORDS.add("một");
1301
+ VN_FIRST_SENT_WORDS.add("chúc");
1302
+ VN_FIRST_SENT_WORDS.add("nhưng");
1303
+ VN_FIRST_SENT_WORDS.add("đêm");
1304
+ VN_FIRST_SENT_WORDS.add("phó");
1305
+ VN_FIRST_SENT_WORDS.add("bỗng");
1306
+ VN_FIRST_SENT_WORDS.add("trong");
1307
+ VN_FIRST_SENT_WORDS.add("trước");
1308
+ VN_FIRST_SENT_WORDS.add("bản");
1309
+ VN_FIRST_SENT_WORDS.add("cuốn");
1310
+ VN_FIRST_SENT_WORDS.add("chùa");
1311
+ VN_FIRST_SENT_WORDS.add("ban");
1312
+ VN_FIRST_SENT_WORDS.add("giữa");
1313
+ VN_FIRST_SENT_WORDS.add("ngay");
1314
+ VN_FIRST_SENT_WORDS.add("lúc");
1315
+ VN_FIRST_SENT_WORDS.add("tỉnh");
1316
+ VN_FIRST_SENT_WORDS.add("tuy");
1317
+ VN_FIRST_SENT_WORDS.add("vẫn");
1318
+
1319
+ VN_FIRST_SENT_WORDS.add("trà");
1320
+ VN_FIRST_SENT_WORDS.add("ôi");
1321
+ VN_FIRST_SENT_WORDS.add("cặp");
1322
+ VN_FIRST_SENT_WORDS.add("taxi");
1323
+ VN_FIRST_SENT_WORDS.add("nhiễm");
1324
+ VN_FIRST_SENT_WORDS.add("virus");
1325
+ VN_FIRST_SENT_WORDS.add("hồi");
1326
+ VN_FIRST_SENT_WORDS.add("nghĩa");
1327
+ VN_FIRST_SENT_WORDS.add("đọc");
1328
+ VN_FIRST_SENT_WORDS.add("nhờ");
1329
+ VN_FIRST_SENT_WORDS.add("tới");
1330
+ VN_FIRST_SENT_WORDS.add("ong");
1331
+ VN_FIRST_SENT_WORDS.add("website");
1332
+ VN_FIRST_SENT_WORDS.add("bóng");
1333
+ VN_FIRST_SENT_WORDS.add("quít");
1334
+ VN_FIRST_SENT_WORDS.add("kungfu");
1335
+ VN_FIRST_SENT_WORDS.add("ra");
1336
+ VN_FIRST_SENT_WORDS.add("đồng");
1337
+ VN_FIRST_SENT_WORDS.add("băng");
1338
+ VN_FIRST_SENT_WORDS.add("ba");
1339
+ VN_FIRST_SENT_WORDS.add("bầu");
1340
+ VN_FIRST_SENT_WORDS.add("hay");
1341
+ VN_FIRST_SENT_WORDS.add("giải");
1342
+ VN_FIRST_SENT_WORDS.add("giao");
1343
+ VN_FIRST_SENT_WORDS.add("cửa");
1344
+ VN_FIRST_SENT_WORDS.add("phần");
1345
+ VN_FIRST_SENT_WORDS.add("sinh");
1346
+ VN_FIRST_SENT_WORDS.add("vietcombank");
1347
+ VN_FIRST_SENT_WORDS.add("vàng");
1348
+ VN_FIRST_SENT_WORDS.add("fred");
1349
+ VN_FIRST_SENT_WORDS.add("tập");
1350
+ VN_FIRST_SENT_WORDS.add("toyota");
1351
+ VN_FIRST_SENT_WORDS.add("bế");
1352
+ VN_FIRST_SENT_WORDS.add("tuồng");
1353
+ VN_FIRST_SENT_WORDS.add("nguồn");
1354
+ VN_FIRST_SENT_WORDS.add("phường");
1355
+ VN_FIRST_SENT_WORDS.add("làm");
1356
+ VN_FIRST_SENT_WORDS.add("tuyển");
1357
+ VN_FIRST_SENT_WORDS.add("đền");
1358
+ VN_FIRST_SENT_WORDS.add("mong");
1359
+ VN_FIRST_SENT_WORDS.add("nghỉ");
1360
+ VN_FIRST_SENT_WORDS.add("hầm");
1361
+ VN_FIRST_SENT_WORDS.add("trán");
1362
+ VN_FIRST_SENT_WORDS.add("dắt");
1363
+ VN_FIRST_SENT_WORDS.add("sợ");
1364
+ VN_FIRST_SENT_WORDS.add("chỗ");
1365
+ VN_FIRST_SENT_WORDS.add("lái");
1366
+ VN_FIRST_SENT_WORDS.add("xem");
1367
+ VN_FIRST_SENT_WORDS.add("chủ");
1368
+ VN_FIRST_SENT_WORDS.add("chứ");
1369
+ VN_FIRST_SENT_WORDS.add("đợt");
1370
+ VN_FIRST_SENT_WORDS.add("đoạn");
1371
+ VN_FIRST_SENT_WORDS.add("đồn");
1372
+ VN_FIRST_SENT_WORDS.add("trục");
1373
+ VN_FIRST_SENT_WORDS.add("tự");
1374
+ VN_FIRST_SENT_WORDS.add("neil");
1375
+ VN_FIRST_SENT_WORDS.add("điện");
1376
+ VN_FIRST_SENT_WORDS.add("trạm");
1377
+ VN_FIRST_SENT_WORDS.add("gần");
1378
+ VN_FIRST_SENT_WORDS.add("giặc");
1379
+ VN_FIRST_SENT_WORDS.add("cúng");
1380
+ VN_FIRST_SENT_WORDS.add("dù");
1381
+ VN_FIRST_SENT_WORDS.add("vịnh");
1382
+ VN_FIRST_SENT_WORDS.add("quân");
1383
+ VN_FIRST_SENT_WORDS.add("dãy");
1384
+ VN_FIRST_SENT_WORDS.add("pha");
1385
+ VN_FIRST_SENT_WORDS.add("toàn");
1386
+ VN_FIRST_SENT_WORDS.add("tháp");
1387
+ VN_FIRST_SENT_WORDS.add("quĩ");
1388
+ VN_FIRST_SENT_WORDS.add("đĩa");
1389
+ VN_FIRST_SENT_WORDS.add("gà");
1390
+ VN_FIRST_SENT_WORDS.add("lao");
1391
+ VN_FIRST_SENT_WORDS.add("bốn");
1392
+ VN_FIRST_SENT_WORDS.add("họ");
1393
+ VN_FIRST_SENT_WORDS.add("họp");
1394
+ VN_FIRST_SENT_WORDS.add("đèn");
1395
+ VN_FIRST_SENT_WORDS.add("cũng");
1396
+ VN_FIRST_SENT_WORDS.add("động");
1397
+ VN_FIRST_SENT_WORDS.add("mặt");
1398
+ VN_FIRST_SENT_WORDS.add("đầm");
1399
+ VN_FIRST_SENT_WORDS.add("cống");
1400
+ VN_FIRST_SENT_WORDS.add("nơi");
1401
+ VN_FIRST_SENT_WORDS.add("tùng");
1402
+ VN_FIRST_SENT_WORDS.add("phố");
1403
+ VN_FIRST_SENT_WORDS.add("đầu");
1404
+ VN_FIRST_SENT_WORDS.add("vượt");
1405
+ VN_FIRST_SENT_WORDS.add("sao");
1406
+ VN_FIRST_SENT_WORDS.add("cách");
1407
+ VN_FIRST_SENT_WORDS.add("hoặc");
1408
+ VN_FIRST_SENT_WORDS.add("của");
1409
+ VN_FIRST_SENT_WORDS.add("hết");
1410
+ VN_FIRST_SENT_WORDS.add("đỉnh");
1411
+ VN_FIRST_SENT_WORDS.add("kênh");
1412
+ VN_FIRST_SENT_WORDS.add("quyền");
1413
+ VN_FIRST_SENT_WORDS.add("bar");
1414
+ VN_FIRST_SENT_WORDS.add("chống");
1415
+ VN_FIRST_SENT_WORDS.add("khắp");
1416
+ VN_FIRST_SENT_WORDS.add("sách");
1417
+ VN_FIRST_SENT_WORDS.add("wikipedia");
1418
+ }
1419
+
1420
+ public static Set<String> VN_MIDDLE_NAMES;
1421
+ static {
1422
+ VN_MIDDLE_NAMES = new HashSet<String>();
1423
+ VN_MIDDLE_NAMES.add("thúy");
1424
+ VN_MIDDLE_NAMES.add("bao");
1425
+ VN_MIDDLE_NAMES.add("thùy");
1426
+ VN_MIDDLE_NAMES.add("mạnh");
1427
+ VN_MIDDLE_NAMES.add("mỹ");
1428
+ VN_MIDDLE_NAMES.add("an");
1429
+ VN_MIDDLE_NAMES.add("hoa");
1430
+ VN_MIDDLE_NAMES.add("nữ");
1431
+ VN_MIDDLE_NAMES.add("trường");
1432
+ VN_MIDDLE_NAMES.add("vĩnh");
1433
+ VN_MIDDLE_NAMES.add("đắc");
1434
+ VN_MIDDLE_NAMES.add("minh");
1435
+ VN_MIDDLE_NAMES.add("thanh");
1436
+ VN_MIDDLE_NAMES.add("thi");
1437
+ VN_MIDDLE_NAMES.add("thu");
1438
+ VN_MIDDLE_NAMES.add("ninh");
1439
+ VN_MIDDLE_NAMES.add("đình");
1440
+ VN_MIDDLE_NAMES.add("hải");
1441
+ VN_MIDDLE_NAMES.add("tuấn");
1442
+ VN_MIDDLE_NAMES.add("bội");
1443
+ VN_MIDDLE_NAMES.add("thuý");
1444
+ VN_MIDDLE_NAMES.add("việt");
1445
+ VN_MIDDLE_NAMES.add("nguyễn");
1446
+ VN_MIDDLE_NAMES.add("bá");
1447
+ VN_MIDDLE_NAMES.add("phương");
1448
+ VN_MIDDLE_NAMES.add("bé");
1449
+ VN_MIDDLE_NAMES.add("tố");
1450
+ VN_MIDDLE_NAMES.add("quốc");
1451
+ VN_MIDDLE_NAMES.add("nguyệt");
1452
+ VN_MIDDLE_NAMES.add("tử");
1453
+ VN_MIDDLE_NAMES.add("cảnh");
1454
+ VN_MIDDLE_NAMES.add("trọng");
1455
+ VN_MIDDLE_NAMES.add("huy");
1456
+ VN_MIDDLE_NAMES.add("nam");
1457
+ VN_MIDDLE_NAMES.add("chí");
1458
+ VN_MIDDLE_NAMES.add("thái");
1459
+ VN_MIDDLE_NAMES.add("thành");
1460
+ VN_MIDDLE_NAMES.add("chính");
1461
+ VN_MIDDLE_NAMES.add("đinh");
1462
+ VN_MIDDLE_NAMES.add("mai");
1463
+ VN_MIDDLE_NAMES.add("thiên");
1464
+ VN_MIDDLE_NAMES.add("tôn");
1465
+ VN_MIDDLE_NAMES.add("phi");
1466
+ VN_MIDDLE_NAMES.add("hà");
1467
+ VN_MIDDLE_NAMES.add("khắc");
1468
+ VN_MIDDLE_NAMES.add("trúc");
1469
+ VN_MIDDLE_NAMES.add("lan");
1470
+ VN_MIDDLE_NAMES.add("doãn");
1471
+ VN_MIDDLE_NAMES.add("nhất");
1472
+ VN_MIDDLE_NAMES.add("huỳnh");
1473
+ VN_MIDDLE_NAMES.add("quỳnh");
1474
+ VN_MIDDLE_NAMES.add("diễm");
1475
+ VN_MIDDLE_NAMES.add("khánh");
1476
+ VN_MIDDLE_NAMES.add("hữu");
1477
+ VN_MIDDLE_NAMES.add("tấn");
1478
+ VN_MIDDLE_NAMES.add("anh");
1479
+ VN_MIDDLE_NAMES.add("hoành");
1480
+ VN_MIDDLE_NAMES.add("hoàng");
1481
+ VN_MIDDLE_NAMES.add("diệu");
1482
+ VN_MIDDLE_NAMES.add("lê");
1483
+ VN_MIDDLE_NAMES.add("phú");
1484
+ VN_MIDDLE_NAMES.add("duy");
1485
+ VN_MIDDLE_NAMES.add("bảo");
1486
+ VN_MIDDLE_NAMES.add("huyền");
1487
+ VN_MIDDLE_NAMES.add("nguyên");
1488
+ VN_MIDDLE_NAMES.add("bích");
1489
+ VN_MIDDLE_NAMES.add("ánh");
1490
+ VN_MIDDLE_NAMES.add("công");
1491
+ VN_MIDDLE_NAMES.add("mộng");
1492
+ VN_MIDDLE_NAMES.add("lệnh");
1493
+ VN_MIDDLE_NAMES.add("cẩm");
1494
+ VN_MIDDLE_NAMES.add("phúc");
1495
+ VN_MIDDLE_NAMES.add("nhật");
1496
+ VN_MIDDLE_NAMES.add("ngọc");
1497
+ VN_MIDDLE_NAMES.add("thời");
1498
+ VN_MIDDLE_NAMES.add("sơn");
1499
+ VN_MIDDLE_NAMES.add("thuỳ");
1500
+ VN_MIDDLE_NAMES.add("văn");
1501
+ VN_MIDDLE_NAMES.add("vân");
1502
+ VN_MIDDLE_NAMES.add("qui");
1503
+ VN_MIDDLE_NAMES.add("hồng");
1504
+ VN_MIDDLE_NAMES.add("thế");
1505
+ VN_MIDDLE_NAMES.add("kim");
1506
+ VN_MIDDLE_NAMES.add("thị");
1507
+ VN_MIDDLE_NAMES.add("danh");
1508
+ VN_MIDDLE_NAMES.add("hoài");
1509
+ VN_MIDDLE_NAMES.add("tiến");
1510
+ VN_MIDDLE_NAMES.add("tú");
1511
+ VN_MIDDLE_NAMES.add("bửu");
1512
+ VN_MIDDLE_NAMES.add("trung");
1513
+ VN_MIDDLE_NAMES.add("thiện");
1514
+ VN_MIDDLE_NAMES.add("tuyết");
1515
+ VN_MIDDLE_NAMES.add("đăng");
1516
+ VN_MIDDLE_NAMES.add("như");
1517
+ VN_MIDDLE_NAMES.add("hùng");
1518
+ VN_MIDDLE_NAMES.add("vô");
1519
+ VN_MIDDLE_NAMES.add("miên");
1520
+ VN_MIDDLE_NAMES.add("quý");
1521
+ VN_MIDDLE_NAMES.add("quang");
1522
+ VN_MIDDLE_NAMES.add("đức");
1523
+ VN_MIDDLE_NAMES.add("ưng");
1524
+ VN_MIDDLE_NAMES.add("tường");
1525
+ VN_MIDDLE_NAMES.add("kiều");
1526
+ VN_MIDDLE_NAMES.add("thảo");
1527
+ VN_MIDDLE_NAMES.add("xuân");
1528
+ VN_MIDDLE_NAMES.add("viết");
1529
+ VN_MIDDLE_NAMES.add("vũ");
1530
+ VN_MIDDLE_NAMES.add("kế");
1531
+ VN_MIDDLE_NAMES.add("gia");
1532
+ VN_MIDDLE_NAMES.add("phước");
1533
+ VN_MIDDLE_NAMES.add("linh");
1534
+ VN_MIDDLE_NAMES.add("cao");
1535
+ VN_MIDDLE_NAMES.add("lệ");
1536
+ }
1537
+
1538
+ public static Set<String> VN_FAMILY_NAMES;
1539
+ static {
1540
+ VN_FAMILY_NAMES = new HashSet<String>();
1541
+ VN_FAMILY_NAMES.add("bảo");
1542
+ VN_FAMILY_NAMES.add("phan");
1543
+ VN_FAMILY_NAMES.add("lý");
1544
+ VN_FAMILY_NAMES.add("bao");
1545
+ VN_FAMILY_NAMES.add("huyền");
1546
+ VN_FAMILY_NAMES.add("lưu");
1547
+ VN_FAMILY_NAMES.add("nguyên");
1548
+ VN_FAMILY_NAMES.add("diêu");
1549
+ VN_FAMILY_NAMES.add("vĩnh");
1550
+ VN_FAMILY_NAMES.add("ngô");
1551
+ VN_FAMILY_NAMES.add("công");
1552
+ VN_FAMILY_NAMES.add("giang");
1553
+ VN_FAMILY_NAMES.add("đào");
1554
+ VN_FAMILY_NAMES.add("bùi");
1555
+ VN_FAMILY_NAMES.add("hông");
1556
+ VN_FAMILY_NAMES.add("ngọc");
1557
+ VN_FAMILY_NAMES.add("chi");
1558
+ VN_FAMILY_NAMES.add("bưu");
1559
+ VN_FAMILY_NAMES.add("tạ");
1560
+ VN_FAMILY_NAMES.add("nguyễn");
1561
+ VN_FAMILY_NAMES.add("văn");
1562
+ VN_FAMILY_NAMES.add("qui");
1563
+ VN_FAMILY_NAMES.add("hồng");
1564
+ VN_FAMILY_NAMES.add("quy");
1565
+ VN_FAMILY_NAMES.add("từ");
1566
+ VN_FAMILY_NAMES.add("trân");
1567
+ VN_FAMILY_NAMES.add("hường");
1568
+ VN_FAMILY_NAMES.add("tô");
1569
+ VN_FAMILY_NAMES.add("mạc");
1570
+ VN_FAMILY_NAMES.add("bửu");
1571
+ VN_FAMILY_NAMES.add("đặng");
1572
+ VN_FAMILY_NAMES.add("huyên");
1573
+ VN_FAMILY_NAMES.add("lâm");
1574
+ VN_FAMILY_NAMES.add("võ");
1575
+ VN_FAMILY_NAMES.add("đinh");
1576
+ VN_FAMILY_NAMES.add("miên");
1577
+ VN_FAMILY_NAMES.add("mai");
1578
+ VN_FAMILY_NAMES.add("hương");
1579
+ VN_FAMILY_NAMES.add("lương");
1580
+ VN_FAMILY_NAMES.add("hồ");
1581
+ VN_FAMILY_NAMES.add("tôn");
1582
+ VN_FAMILY_NAMES.add("ưng");
1583
+ VN_FAMILY_NAMES.add("la");
1584
+ VN_FAMILY_NAMES.add("thân");
1585
+ VN_FAMILY_NAMES.add("hà");
1586
+ VN_FAMILY_NAMES.add("dương");
1587
+ VN_FAMILY_NAMES.add("trịnh");
1588
+ VN_FAMILY_NAMES.add("tằng");
1589
+ VN_FAMILY_NAMES.add("lan");
1590
+ VN_FAMILY_NAMES.add("doãn");
1591
+ VN_FAMILY_NAMES.add("vinh");
1592
+ VN_FAMILY_NAMES.add("trần");
1593
+ VN_FAMILY_NAMES.add("huỳnh");
1594
+ VN_FAMILY_NAMES.add("vương");
1595
+ VN_FAMILY_NAMES.add("vũ");
1596
+ VN_FAMILY_NAMES.add("cao");
1597
+ VN_FAMILY_NAMES.add("phạm");
1598
+ VN_FAMILY_NAMES.add("hoàng");
1599
+ VN_FAMILY_NAMES.add("đỗ");
1600
+ VN_FAMILY_NAMES.add("trương");
1601
+ VN_FAMILY_NAMES.add("đoàn");
1602
+ VN_FAMILY_NAMES.add("diệp");
1603
+ VN_FAMILY_NAMES.add("lê");
1604
+ }
1605
+ }
VnCoreNLP/src/main/java/vn/corenlp/wordsegmenter/WordSegmenter.java ADDED
@@ -0,0 +1,245 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ package vn.corenlp.wordsegmenter;
2
+
3
+ import org.apache.log4j.Logger;
4
+
5
+ import java.io.BufferedReader;
6
+ import java.io.File;
7
+ import java.io.FileInputStream;
8
+ import java.io.IOException;
9
+ import java.io.InputStreamReader;
10
+
11
+ import java.util.ArrayList;
12
+ import java.util.Arrays;
13
+ import java.util.List;
14
+
15
+ /**
16
+ * @author DatQuocNguyen
17
+ */
18
+ public class WordSegmenter {
19
+ private Node root;
20
+ private static WordSegmenter wordSegmenter = null;
21
+ public final static Logger LOGGER = Logger.getLogger(WordSegmenter.class);
22
+ public WordSegmenter()
23
+ throws IOException {
24
+ LOGGER.info("Loading Word Segmentation model");
25
+ String modelPath = vn.pipeline.Utils.jarDir + "/models/wordsegmenter/wordsegmenter.rdr";
26
+ if (!new File(modelPath).exists())
27
+ throw new IOException("WordSegmenter: " + modelPath + " is not found!");
28
+
29
+ this.constructTreeFromRulesFile(modelPath);
30
+ }
31
+
32
+ public static WordSegmenter initialize() throws IOException {
33
+ if(wordSegmenter == null) {
34
+ wordSegmenter = new WordSegmenter();
35
+ }
36
+ return wordSegmenter;
37
+ }
38
+ private void constructTreeFromRulesFile(String rulesFilePath)
39
+ throws IOException {
40
+ BufferedReader buffer = new BufferedReader(
41
+ new InputStreamReader(new FileInputStream(new File(rulesFilePath)), "UTF-8"));
42
+ String line = buffer.readLine();
43
+
44
+ this.root = new Node(new FWObject(false), "NN", null, null, null, 0);
45
+
46
+ Node currentNode = this.root;
47
+ int currentDepth = 0;
48
+
49
+ for (; (line = buffer.readLine()) != null; ) {
50
+ int depth = 0;
51
+ for (int i = 0; i <= 6; i++) { // Supposed that the maximum
52
+ // exception level is up to 6.
53
+ if (line.charAt(i) == '\t')
54
+ depth += 1;
55
+ else
56
+ break;
57
+ }
58
+
59
+ line = line.trim();
60
+ if (line.length() == 0)
61
+ continue;
62
+
63
+ if (line.contains("cc:"))
64
+ continue;
65
+
66
+ FWObject condition = Utils.getCondition(line.split(" : ")[0].trim());
67
+ String conclusion = Utils.getConcreteValue(line.split(" : ")[1].trim());
68
+
69
+ Node node = new Node(condition, conclusion, null, null, null, depth);
70
+
71
+ if (depth > currentDepth) {
72
+ currentNode.setExceptNode(node);
73
+ } else if (depth == currentDepth) {
74
+ currentNode.setIfnotNode(node);
75
+ } else {
76
+ while (currentNode.getDepth() != depth)
77
+ currentNode = currentNode.getFatherNode();
78
+ currentNode.setIfnotNode(node);
79
+ }
80
+ node.setFatherNode(currentNode);
81
+
82
+ currentNode = node;
83
+ currentDepth = depth;
84
+ }
85
+ buffer.close();
86
+ }
87
+
88
+ private Node findFiredNode(FWObject object) {
89
+ Node currentN = root;
90
+ Node firedN = null;
91
+ while (true) {
92
+ if (currentN.satisfy(object)) {
93
+ firedN = currentN;
94
+ if (currentN.getExceptNode() == null) {
95
+ break;
96
+ } else {
97
+ currentN = currentN.getExceptNode();
98
+ }
99
+ } else {
100
+ if (currentN.getIfnotNode() == null) {
101
+ break;
102
+ } else {
103
+ currentN = currentN.getIfnotNode();
104
+ }
105
+ }
106
+
107
+ }
108
+
109
+ return firedN;
110
+ }
111
+
112
+ private List<WordTag> getInitialSegmentation(String sentence)
113
+ {
114
+ List<WordTag> wordtags = new ArrayList<>();
115
+
116
+ for (String regex : Utils.NORMALIZER_KEYS)
117
+ if (sentence.contains(regex))
118
+ sentence = sentence.replaceAll(regex, Utils.NORMALIZER.get(regex));
119
+
120
+ List<String> tokens = Arrays.asList(sentence.split("\\s+"));
121
+ List<String> lowerTokens = Arrays.asList(sentence.toLowerCase().split("\\s+"));
122
+
123
+ int senLength = tokens.size();
124
+ int i = 0;
125
+ while (i < senLength) {
126
+ String token = tokens.get(i);
127
+ if (token.chars().allMatch(Character::isLetter)) {
128
+
129
+ if (Character.isLowerCase(token.charAt(0)) && (i + 1) < senLength) {
130
+ if (Character.isUpperCase(tokens.get(i + 1).charAt(0))) {
131
+ wordtags.add(new WordTag(token, "B"));
132
+ i++;
133
+ continue;
134
+ }
135
+ }
136
+
137
+ boolean isSingleSyllabel = true;
138
+ for (int j = Math.min(i + 4, senLength); j > i + 1; j--) {
139
+ String word = String.join(" ", lowerTokens.subList(i, j));
140
+ if (Vocabulary.VN_DICT.contains(word)
141
+ || Vocabulary.VN_LOCATIONS.contains(word) || Vocabulary.COUNTRY_L_NAME.contains(word)) {
142
+
143
+ wordtags.add(new WordTag(token, "B"));
144
+ for (int k = i + 1; k < j; k++)
145
+ wordtags.add(new WordTag(tokens.get(k), "I"));
146
+
147
+ i = j - 1;
148
+
149
+ isSingleSyllabel = false;
150
+ break;
151
+ }
152
+ }
153
+ if (isSingleSyllabel) {
154
+ String lowercasedToken = lowerTokens.get(i);
155
+
156
+ if (Vocabulary.VN_FIRST_SENT_WORDS.contains(lowercasedToken)
157
+ || Character.isLowerCase(token.charAt(0))
158
+ || token.chars().allMatch(Character::isUpperCase)
159
+ || Vocabulary.COUNTRY_S_NAME.contains(lowercasedToken)
160
+ || Vocabulary.WORLD_COMPANY.contains(lowercasedToken)) {
161
+
162
+ wordtags.add(new WordTag(token, "B"));
163
+ i++;
164
+ continue;
165
+
166
+ }
167
+
168
+ // Capitalized
169
+ int ilower = i + 1;
170
+ for (ilower = i + 1; ilower < Math.min(i + 4, senLength); ilower++) {
171
+ String ntoken = tokens.get(ilower);
172
+ if (Character.isLowerCase(ntoken.charAt(0))
173
+ || !ntoken.chars().allMatch(Character::isLetter)
174
+ || ntoken.equals("LBKT") || ntoken.equals("RBKT")) {
175
+ break;
176
+ }
177
+ }
178
+
179
+ if (ilower > i + 1) {
180
+ boolean isNotMiddleName = true;
181
+ if (Vocabulary.VN_MIDDLE_NAMES.contains(lowercasedToken) && (i >= 1)) {
182
+ String prevT = tokens.get(i - 1);
183
+ if (Character.isUpperCase(prevT.charAt(0))) {
184
+ if (Vocabulary.VN_FAMILY_NAMES.contains(prevT.toLowerCase())) {
185
+ wordtags.add(new WordTag(token, "I"));
186
+ isNotMiddleName = false;
187
+ }
188
+ }
189
+ }
190
+ if (isNotMiddleName)
191
+ wordtags.add(new WordTag(token, "B"));
192
+ for (int k = i + 1; k < ilower; k++)
193
+ wordtags.add(new WordTag(tokens.get(k), "I"));
194
+
195
+ i = ilower - 1;
196
+ }
197
+ else {
198
+ wordtags.add(new WordTag(token, "B"));
199
+ }
200
+ }
201
+ }
202
+ else {
203
+ wordtags.add(new WordTag(token, "B"));
204
+ }
205
+
206
+ i++;
207
+ }
208
+
209
+ return wordtags;
210
+
211
+ }
212
+
213
+ public String segmentTokenizedString(String str)
214
+ throws IOException {
215
+ StringBuilder sb = new StringBuilder();
216
+
217
+ String line = str.trim();
218
+ if (line.length() == 0) {
219
+ return "\n";
220
+ }
221
+
222
+ List<WordTag> wordtags = this.getInitialSegmentation(line);
223
+
224
+ int size = wordtags.size();
225
+ for (int i = 0; i < size; i++) {
226
+ FWObject object = Utils.getObject(wordtags, size, i);
227
+ Node firedNode = findFiredNode(object);
228
+ if (firedNode.getDepth() > 0) {
229
+ if (firedNode.getConclusion().equals("B"))
230
+ sb.append(" " + wordtags.get(i).form);
231
+ else
232
+ sb.append("_" + wordtags.get(i).form);
233
+ }
234
+ else {// Fired at root, return initialized tag
235
+ if (wordtags.get(i).tag.equals("B"))
236
+ sb.append(" " + wordtags.get(i).form);
237
+ else
238
+ sb.append("_" + wordtags.get(i).form);
239
+ }
240
+ }
241
+ return sb.toString().trim();
242
+ }
243
+
244
+ }
245
+
VnCoreNLP/src/main/java/vn/corenlp/wordsegmenter/WordTag.java ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ package vn.corenlp.wordsegmenter;
2
+
3
+ public class WordTag {
4
+ public String word;
5
+ public String tag;
6
+ public String form;
7
+
8
+ public WordTag(String iword, String itag) {
9
+ form = iword;
10
+ word = iword.toLowerCase();
11
+ tag = itag;
12
+ }
13
+ }
VnCoreNLP/src/main/java/vn/pipeline/Annotation.java ADDED
@@ -0,0 +1,147 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ package vn.pipeline;
2
+
3
+ import java.io.*;
4
+ import java.util.*;
5
+
6
+ public class Annotation {
7
+ private String rawText;
8
+ private List<String> tokens;
9
+ private String wordSegmentedText;
10
+ private List<Word> words;
11
+ private List<Sentence> sentences;
12
+
13
+ public Annotation(String rawText) {
14
+ this.rawText = rawText.trim();
15
+ this.tokens = new ArrayList<>();
16
+ this.wordSegmentedText = "";
17
+ this.words = new ArrayList<>();
18
+ }
19
+
20
+ public String detectLanguage() {
21
+ try {
22
+ return Utils.detectLanguage(rawText);
23
+ } catch (IOException e) {
24
+ System.err.println("Cannot detect language!");
25
+ }
26
+ // Can't detect language
27
+ return "N/A";
28
+ }
29
+
30
+ public static boolean isAlphabetic(String str) {
31
+ char[] chars = str.toCharArray();
32
+
33
+ for (char c : chars) {
34
+ if (!Character.isLetter(c)) {
35
+ return false;
36
+ }
37
+ }
38
+
39
+ return true;
40
+ }
41
+
42
+ @Override
43
+ public String toString() {
44
+ StringBuffer sb = new StringBuffer();
45
+ if(sentences != null)
46
+ for(Sentence sentence : sentences) {
47
+ sb.append(sentence.toString() + "\n\n");
48
+ }
49
+ else return rawText;
50
+ return sb.toString();
51
+ }
52
+
53
+ // Word count
54
+ public HashMap<String, Integer> wordCount() {
55
+ HashMap<String, Integer> output = new HashMap<>();
56
+ for (Word np : words) {
57
+ String w = np.getForm();
58
+ if (!output.containsKey(w)) output.put(w, 1);
59
+ else output.put(w, output.get(w) + 1);
60
+ }
61
+ return output;
62
+ }
63
+
64
+ public LinkedHashMap<String, Integer> ngrams(int n, boolean isWordLevel) {
65
+ if (!isWordLevel) return ngramAtCharacterLevel(n);
66
+ return ngramAtWordLevel(n);
67
+ }
68
+
69
+ private LinkedHashMap<String, Integer> ngramAtCharacterLevel(int n) {
70
+ LinkedHashMap<String, Integer> output = new LinkedHashMap<>();
71
+ for (int i = 0; i < this.rawText.length(); i++) {
72
+ StringBuffer sb = new StringBuffer();
73
+ if (i + n <= this.rawText.length()) {
74
+ for (int j = i; j < i + n; j++)
75
+ sb.append(this.rawText.charAt(j));
76
+ String ngram = sb.toString();
77
+ if (!output.containsKey(ngram)) output.put(ngram, 1);
78
+ else output.put(ngram, output.get(ngram) + 1);
79
+ }
80
+ }
81
+ return output;
82
+ }
83
+
84
+ private LinkedHashMap<String, Integer> ngramAtWordLevel(int n) {
85
+ LinkedHashMap<String, Integer> output = new LinkedHashMap<>();
86
+ for (int i = 0; i < this.tokens.size(); i++) {
87
+ StringBuffer sb = new StringBuffer();
88
+ if (i + n <= this.tokens.size()) {
89
+ for (int j = i; j < i + n; j++)
90
+ sb.append(this.tokens.get(j) + " ");
91
+ String ngram = sb.toString();
92
+ if (!output.containsKey(ngram)) output.put(ngram, 1);
93
+ else output.put(ngram, output.get(ngram) + 1);
94
+ }
95
+ }
96
+ return output;
97
+ }
98
+
99
+ public String getRawText() {
100
+ return rawText;
101
+ }
102
+
103
+ public List<Sentence> getSentences() {
104
+ return sentences;
105
+ }
106
+
107
+ public List<String> getTokens() {
108
+ return tokens;
109
+ }
110
+
111
+ public String getWordSegmentedText() {
112
+ return wordSegmentedText;
113
+ }
114
+
115
+
116
+ public String getWordSegmentedTaggedText() {
117
+ StringBuffer wordSegmentedTaggedText = new StringBuffer();
118
+ for(Sentence sentence : sentences) {
119
+ wordSegmentedTaggedText.append(sentence.getWordSegmentedTaggedSentence() + " ");
120
+ }
121
+ return wordSegmentedTaggedText.toString().trim();
122
+ }
123
+
124
+ public List<Word> getWords() {
125
+ return words;
126
+ }
127
+
128
+ public void setRawText(String rawText) {
129
+ this.rawText = rawText;
130
+ }
131
+
132
+ public void setTokens(List<String> tokens) {
133
+ this.tokens = tokens;
134
+ }
135
+
136
+ public void setWordSegmentedText(String wordSegmentedText) {
137
+ this.wordSegmentedText = wordSegmentedText;
138
+ }
139
+
140
+ public void setWords(List<Word> words) {
141
+ this.words = words;
142
+ }
143
+
144
+ public void setSentences(List<Sentence> sentences) {
145
+ this.sentences = sentences;
146
+ }
147
+ }
VnCoreNLP/src/main/java/vn/pipeline/LexicalInitializer.java ADDED
@@ -0,0 +1,82 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ package vn.pipeline;
2
+
3
+ import edu.emory.mathcs.nlp.component.template.lexicon.GlobalLexica;
4
+
5
+ import org.apache.log4j.Logger;
6
+ import org.w3c.dom.Document;
7
+ import org.w3c.dom.Element;
8
+
9
+ import javax.xml.parsers.DocumentBuilder;
10
+ import javax.xml.parsers.DocumentBuilderFactory;
11
+ import java.io.File;
12
+ import java.io.IOException;
13
+ import java.util.HashMap;
14
+ import java.util.logging.Handler;
15
+ import java.util.logging.Level;
16
+
17
+ public class LexicalInitializer {
18
+ private static LexicalInitializer lexicalInitializer;
19
+ private HashMap<String, String> lexicalMap ;
20
+ private boolean initLexica = false;
21
+ private GlobalLexica globalLexica;
22
+
23
+ public final static Logger LOGGER = Logger.getLogger(LexicalInitializer.class);
24
+
25
+ public LexicalInitializer(boolean initLexica) throws IOException {
26
+
27
+ this.initLexica = initLexica;
28
+ this.lexicalMap = new HashMap<>();
29
+
30
+ String lexicalPath = Utils.jarDir + "/models/ner/vi-500brownclusters.xz";
31
+ if (!new File(lexicalPath).exists())
32
+ throw new IOException("LexicalInitializer: " + lexicalPath + " is not found!");
33
+ lexicalMap.put("word_clusters", lexicalPath);
34
+
35
+ lexicalPath = Utils.jarDir + "/models/ner/vi-pretrainedembeddings.xz";
36
+ if (!new File(lexicalPath).exists())
37
+ throw new IOException("LexicalInitializer: " + lexicalPath + " is not found!");
38
+ lexicalMap.put("word_embeddings", lexicalPath);
39
+ }
40
+
41
+ public static LexicalInitializer initialize(boolean initLexica) throws IOException {
42
+ if (lexicalInitializer == null) {
43
+ lexicalInitializer = new LexicalInitializer(initLexica);
44
+ lexicalInitializer.initializeLexica();
45
+ }
46
+ return lexicalInitializer;
47
+ }
48
+
49
+ public GlobalLexica initializeLexica() {
50
+ if (globalLexica == null && initLexica)
51
+ try {
52
+
53
+ DocumentBuilderFactory dbfac = DocumentBuilderFactory.newInstance();
54
+ DocumentBuilder docBuilder = dbfac.newDocumentBuilder();
55
+ Document xmlDoc = docBuilder.newDocument();
56
+ Element root = xmlDoc.createElement("root");
57
+ Element lexicals = xmlDoc.createElement("lexica");
58
+ for(String lexicalName : lexicalMap.keySet()) {
59
+ Element lexical = xmlDoc.createElement(lexicalName);
60
+ lexical.setAttribute("field", "word_form_lowercase");
61
+ if(!new File(lexicalMap.get(lexicalName)).exists()) return null;
62
+ lexical.appendChild(xmlDoc.createTextNode(lexicalMap.get(lexicalName)));
63
+ lexicals.appendChild(lexical);
64
+ }
65
+ root.appendChild(lexicals);
66
+
67
+ java.util.logging.Logger globalLogger = java.util.logging.Logger.getLogger("");
68
+ globalLogger.setLevel(Level.OFF);
69
+ Handler[] handlers = globalLogger.getHandlers();
70
+ for(Handler handler : handlers) {
71
+ globalLogger.removeHandler(handler);
72
+ }
73
+
74
+ globalLexica = new GlobalLexica<>(root);
75
+ } catch (Exception e) {
76
+ e.printStackTrace();
77
+ }
78
+ return globalLexica;
79
+ }
80
+
81
+
82
+ }
VnCoreNLP/src/main/java/vn/pipeline/Sentence.java ADDED
@@ -0,0 +1,110 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ package vn.pipeline;
2
+
3
+ import vn.corenlp.ner.NerRecognizer;
4
+ import vn.corenlp.parser.DependencyParser;
5
+ import vn.corenlp.postagger.PosTagger;
6
+ import vn.corenlp.wordsegmenter.WordSegmenter;
7
+ import vn.corenlp.tokenizer.Tokenizer;
8
+
9
+ import java.io.IOException;
10
+ import java.util.ArrayList;
11
+ import java.util.List;
12
+
13
+ public class Sentence {
14
+ private String rawSentence;
15
+ private List<String> tokens;
16
+ private String wordSegmentedSentence;
17
+
18
+ private List<Word> words;
19
+
20
+ private WordSegmenter wordSegmenter ;
21
+ private PosTagger posTagger;
22
+ private NerRecognizer nerRecognizer;
23
+ private DependencyParser dependencyParser;
24
+
25
+ public Sentence(String rawSentence, WordSegmenter wordSegmenter, PosTagger tagger, NerRecognizer nerRecognizer, DependencyParser dependencyParser) throws IOException {
26
+ this.posTagger = tagger;
27
+ this.nerRecognizer = nerRecognizer;
28
+ this.dependencyParser = dependencyParser;
29
+ this.wordSegmenter = wordSegmenter;
30
+ init(rawSentence.trim());
31
+ }
32
+
33
+
34
+ public String detectLanguage() {
35
+ try {
36
+ return Utils.detectLanguage(rawSentence);
37
+ } catch (IOException e) {
38
+ System.err.println("Cannot detect language!");
39
+ }
40
+ // Can't detect language
41
+ return "N/A";
42
+ }
43
+
44
+ private void init(String rawSentence) throws IOException {
45
+ this.rawSentence = rawSentence;
46
+ this.tokens = Tokenizer.tokenize(this.rawSentence);
47
+
48
+ if(this.wordSegmenter != null) {
49
+ this.wordSegmentedSentence = this.wordSegmenter.segmentTokenizedString(this.rawSentence);
50
+ }
51
+ else this.wordSegmentedSentence = String.join(" ", this.tokens);
52
+
53
+ this.createWords();
54
+
55
+ }
56
+
57
+ private void createWords() throws IOException {
58
+
59
+ if (this.posTagger != null)
60
+ this.words = posTagger.tagSentence(this.wordSegmentedSentence);
61
+ else {
62
+ this.words = new ArrayList<>();
63
+ String[] segmentedTokens = this.wordSegmentedSentence.split(" ");
64
+ for (int i = 0; i < segmentedTokens.length; i++) {
65
+ Word word = new Word((i+1), segmentedTokens[i]);
66
+ this.words.add(word);
67
+ }
68
+ }
69
+
70
+ if (this.nerRecognizer != null)
71
+ this.nerRecognizer.tagSentence(this.words);
72
+ if (this.dependencyParser != null)
73
+ this.dependencyParser.tagSentence(this.words);
74
+
75
+ }
76
+
77
+ @Override
78
+ public String toString() {
79
+ StringBuffer sb = new StringBuffer();
80
+ for (Word word : words) {
81
+ sb.append(word.toString() + "\n");
82
+ }
83
+ return sb.toString().trim();
84
+ }
85
+
86
+ public String getRawSentence() {
87
+ return rawSentence;
88
+ }
89
+
90
+ public List<String> getTokens() {
91
+ return tokens;
92
+ }
93
+
94
+ public String getWordSegmentedSentence() {
95
+ return wordSegmentedSentence;
96
+ }
97
+
98
+ public List<Word> getWords() {
99
+ return words;
100
+ }
101
+
102
+ public String getWordSegmentedTaggedSentence() {
103
+ StringBuffer wordSegmentedTaggedSentence = new StringBuffer();
104
+ for(Word word : this.words) {
105
+ wordSegmentedTaggedSentence.append(word.toString() + " ");
106
+ }
107
+ return wordSegmentedTaggedSentence.toString().trim();
108
+ }
109
+
110
+ }
VnCoreNLP/src/main/java/vn/pipeline/Utils.java ADDED
@@ -0,0 +1,31 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ package vn.pipeline;
2
+
3
+ import com.optimaize.langdetect.DetectedLanguage;
4
+ import com.optimaize.langdetect.LanguageDetector;
5
+ import com.optimaize.langdetect.LanguageDetectorBuilder;
6
+ import com.optimaize.langdetect.ngram.NgramExtractors;
7
+ import com.optimaize.langdetect.profiles.LanguageProfileReader;
8
+
9
+ import java.io.File;
10
+ import java.io.IOException;
11
+ import java.util.List;
12
+
13
+ public class Utils {
14
+ private static File jarFile = new File(VnCoreNLP.class.getProtectionDomain().getCodeSource().getLocation().getPath());
15
+ public static String jarDir = jarFile.getParentFile().getPath();
16
+
17
+ private static LanguageDetector languageDetector = null;
18
+ public static String detectLanguage(String text) throws IOException{
19
+ if(languageDetector == null) {
20
+ languageDetector = LanguageDetectorBuilder.create(NgramExtractors.standard())
21
+ .shortTextAlgorithm(0)
22
+ .withProfiles(new LanguageProfileReader().readAllBuiltIn())
23
+ .build();
24
+ }
25
+ List<DetectedLanguage> detectedLanguages = languageDetector.getProbabilities(text);
26
+ if(detectedLanguages.size() > 0)
27
+ return detectedLanguages.get(0).getLocale().getLanguage();
28
+ return "N/A";
29
+ }
30
+
31
+ }
VnCoreNLP/src/main/java/vn/pipeline/VnCoreNLP.java ADDED
@@ -0,0 +1,134 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ package vn.pipeline;
2
+
3
+ import org.apache.log4j.Logger;
4
+ import vn.corenlp.ner.NerRecognizer;
5
+ import vn.corenlp.parser.DependencyParser;
6
+ import vn.corenlp.postagger.PosTagger;
7
+ import vn.corenlp.tokenizer.Tokenizer;
8
+ import vn.corenlp.wordsegmenter.WordSegmenter;
9
+
10
+ import java.io.*;
11
+ import java.util.ArrayList;
12
+ import java.util.List;
13
+
14
+
15
+ public class VnCoreNLP {
16
+
17
+ public final static Logger LOGGER = Logger.getLogger(Annotation.class);
18
+
19
+ private WordSegmenter wordSegmenter;
20
+ private PosTagger posTagger;
21
+ private NerRecognizer nerRecognizer;
22
+ private DependencyParser dependencyParser;
23
+
24
+ public VnCoreNLP() throws IOException {
25
+ String[] annotators = {"wseg", "pos", "ner", "parse"};
26
+ initAnnotators(annotators);
27
+ }
28
+
29
+ public VnCoreNLP(String[] annotators) throws IOException {
30
+ initAnnotators(annotators);
31
+
32
+ }
33
+
34
+ public void initAnnotators(String[] annotators) throws IOException{
35
+ for(String annotator : annotators) {
36
+ switch (annotator.trim()) {
37
+ case "parse":
38
+ this.dependencyParser = DependencyParser.initialize();
39
+ break;
40
+ case "ner":
41
+ this.nerRecognizer = NerRecognizer.initialize();
42
+ break;
43
+ case "pos":
44
+ this.posTagger = PosTagger.initialize();
45
+ break;
46
+ case "wseg":
47
+ this.wordSegmenter = WordSegmenter.initialize();
48
+ break;
49
+ }
50
+ }
51
+
52
+ }
53
+
54
+ public void printToFile(Annotation annotation, PrintStream printer) throws IOException {
55
+ for(Sentence sentence : annotation.getSentences()) {
56
+ printer.println(sentence.toString());
57
+ }
58
+ }
59
+
60
+ public void printToFile(Annotation annotation, String fileOut) throws IOException {
61
+ PrintStream printer = new PrintStream(fileOut, "UTF-8");
62
+ for(Sentence sentence : annotation.getSentences()) {
63
+ printer.println(sentence.toString() + "\n");
64
+ }
65
+ }
66
+
67
+ public void annotate(Annotation annotation) throws IOException {
68
+ List<String> rawSentences = Tokenizer.joinSentences(Tokenizer.tokenize(annotation.getRawText()));
69
+ annotation.setSentences(new ArrayList<>());
70
+ for (String rawSentence : rawSentences) {
71
+ if (rawSentence.trim().length() > 0) {
72
+ Sentence sentence = new Sentence(rawSentence, wordSegmenter, posTagger, nerRecognizer, dependencyParser);
73
+ annotation.getSentences().add(sentence);
74
+ annotation.getTokens().addAll(sentence.getTokens());
75
+ annotation.getWords().addAll(sentence.getWords());
76
+ annotation.setWordSegmentedText(annotation.getWordSegmentedTaggedText() + sentence.getWordSegmentedSentence() + " ");
77
+ }
78
+
79
+ }
80
+
81
+ annotation.setWordSegmentedText(annotation.getWordSegmentedTaggedText().trim());
82
+
83
+ }
84
+
85
+ public static void printUsage() {
86
+ System.out.println("Usage: \n\t-fin inputFile (required)\n\t-fout outputFile (optional, default: inputFile.out)\n" +
87
+ "\t-annotators functionNames (optional, default: wseg,pos,ner,parse)" +
88
+ "\nExample 1: -fin sample_input.txt -fout output.txt" +
89
+ "\nExample 2: -fin sample_input.txt -fout output.txt -annotators wseg,pos,ner");
90
+ }
91
+
92
+ public static void processPipeline(String fileIn, String fileOut, String[] annotators) throws IOException{
93
+
94
+ FileInputStream fis = new FileInputStream(new File(fileIn));
95
+ InputStreamReader isr = new InputStreamReader(fis, "UTF-8");
96
+ OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(new File(fileOut)), "UTF-8");
97
+
98
+ BufferedReader br = new BufferedReader(isr);
99
+ VnCoreNLP pipeline = new VnCoreNLP(annotators);
100
+ LOGGER.info("Start processing " + fileIn);
101
+ while(br.ready()) {
102
+ String line = br.readLine();
103
+ if (line.trim().length() > 0) {
104
+ Annotation annotation = new Annotation(line);
105
+ pipeline.annotate(annotation);
106
+ osw.write(annotation.toString());
107
+ }
108
+ }
109
+ br.close();
110
+ isr.close();
111
+ fis.close();
112
+ osw.close();
113
+ LOGGER.info("Wrote output to " + fileOut);
114
+ }
115
+
116
+ public static void main(String[] args) throws IOException {
117
+ String fileIn = null, fileOut = null;
118
+ String[] annotators = {"wseg", "pos", "ner", "parse"};
119
+ for(int i = 0; i < args.length; i++) {
120
+ if (args[i].equals("-fin") && i + 1 < args.length) fileIn = args[i+1];
121
+ else if (args[i].equals("-fout") && i + 1 < args.length) fileOut = args[i+1];
122
+ else if (args[i].equals("-annotators") && i + 1 < args.length) annotators = args[i+1].split(",");
123
+ }
124
+
125
+ if (fileIn == null) {
126
+ printUsage();
127
+ return;
128
+ }
129
+
130
+ if (fileOut == null) fileOut = fileIn + ".out";
131
+ processPipeline(fileIn, fileOut, annotators);
132
+ }
133
+
134
+ }
VnCoreNLP/src/main/java/vn/pipeline/Word.java ADDED
@@ -0,0 +1,111 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ package vn.pipeline;
2
+
3
+ public class Word {
4
+ private int index = -1;
5
+ private String form;
6
+ private String posTag;
7
+ private String nerLabel;
8
+ private int head = -1;
9
+ private String depLabel;
10
+
11
+ public Word(Word word) {
12
+ this.index = word.index;
13
+ this.form = word.form;
14
+ this.posTag = word.posTag;
15
+ this.nerLabel = word.nerLabel;
16
+ this.head = word.head;
17
+ this.depLabel = word.depLabel;
18
+ }
19
+ public Word(int index, String form, String posTag) {
20
+ this.index = index;
21
+ this.form = form;
22
+ this.posTag = posTag;
23
+ }
24
+
25
+ public Word(int index, String form) {
26
+ this.index = index;
27
+ this.form = form;
28
+ }
29
+
30
+ public Word(int index, String form, String posTag, String nerLabel) {
31
+ this.index = index;
32
+ this.form = form;
33
+ this.posTag = posTag;
34
+ this.nerLabel = nerLabel;
35
+ }
36
+
37
+ public Word(int index, String form, String posTag, String nerLabel, String chunkingLabel) {
38
+ this.index = index;
39
+ this.form = form;
40
+ this.posTag = posTag;
41
+ this.nerLabel = nerLabel;
42
+ }
43
+
44
+ public Word(int index, String form, String posTag, String nerLabel, int head, String depLabel, String chunkingLabel) {
45
+ this.index = index;
46
+ this.form = form;
47
+ this.posTag = posTag;
48
+ this.nerLabel = nerLabel;
49
+ this.head = head;
50
+ this.depLabel = depLabel;
51
+ }
52
+
53
+ @Override
54
+ public String toString() {
55
+ return this.getIndex() + "\t" +
56
+ this.getForm() + "\t" +
57
+ (this.getPosTag() == null?"_": this.getPosTag()) + "\t" +
58
+ (this.getNerLabel() == null?"_": this.getNerLabel()) + "\t" +
59
+ (this.getHead() == -1?"_\t": this.getHead()) + "\t" +
60
+ (this.getDepLabel() == null?"_": this.getDepLabel());
61
+ }
62
+
63
+ public String getForm() {
64
+ return form;
65
+ }
66
+
67
+ public void setForm(String form) {
68
+ this.form = form;
69
+ }
70
+
71
+ public String getPosTag() {
72
+ return posTag;
73
+ }
74
+
75
+ public void setPosTag(String pos) {
76
+ this.posTag = pos;
77
+ }
78
+
79
+ public String getNerLabel() {
80
+ return nerLabel;
81
+ }
82
+
83
+ public void setNerLabel(String nerLabel) {
84
+ this.nerLabel = nerLabel;
85
+ }
86
+
87
+ public int getIndex() {
88
+ return index;
89
+ }
90
+
91
+ public void setIndex(int index) {
92
+ this.index = index;
93
+ }
94
+
95
+ public int getHead() {
96
+ return head;
97
+ }
98
+
99
+ public void setHead(int head) {
100
+ this.head = head;
101
+ }
102
+
103
+ public String getDepLabel() {
104
+ return depLabel;
105
+ }
106
+
107
+ public void setDepLabel(String depLabel) {
108
+ this.depLabel = depLabel;
109
+ }
110
+
111
+ }
VnCoreNLP/src/main/resources/log4j.properties ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ # Root logger option
2
+
3
+ log4j.rootLogger=INFO, stdout
4
+ log4j.logger.edu.emory.mathcs.nlp=OFF
5
+
6
+ # Direct log messages to stdout
7
+ log4j.appender.stdout=org.apache.log4j.ConsoleAppender
8
+ log4j.appender.stdout.Target=System.out
9
+ log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
10
+ log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
VnCoreNLP/src/test/java/VnCoreNLPExample.java ADDED
@@ -0,0 +1,30 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import vn.pipeline.*;
2
+ import java.io.*;
3
+ public class VnCoreNLPExample {
4
+ public static void main(String[] args) throws IOException {
5
+
6
+ // "wseg", "pos", "ner", and "parse" refer to as word segmentation, POS tagging, NER and dependency parsing, respectively.
7
+ String[] annotators = {"wseg", "pos", "ner", "parse"};
8
+ VnCoreNLP pipeline = new VnCoreNLP(annotators);
9
+
10
+ String str = "Ông Nguyễn Khắc Chúc đang làm việc tại Đại học Quốc gia Hà Nội. "
11
+ + "Bà Lan, vợ ông Chúc, cũng làm việc tại đây.";
12
+ Annotation annotation = new Annotation(str);
13
+ pipeline.annotate(annotation);
14
+
15
+ System.out.println(annotation.toString());
16
+ // 1 Ông Nc O 4 sub
17
+ // 2 Nguyễn_Khắc_Chúc Np B-PER 1 nmod
18
+ // 3 đang R O 4 adv
19
+ // 4 làm_việc V O 0 root
20
+ // ...
21
+
22
+ //Write to file
23
+ PrintStream outputPrinter = new PrintStream("output.txt");
24
+ pipeline.printToFile(annotation, outputPrinter);
25
+
26
+ // You can also get a single sentence to analyze individually
27
+ Sentence firstSentence = annotation.getSentences().get(0);
28
+ System.out.println(firstSentence.toString());
29
+ }
30
+ }
__pycache__/app.cpython-38.pyc ADDED
Binary file (3.19 kB). View file
 
api/__pycache__/tracker.cpython-38.pyc ADDED
Binary file (1.81 kB). View file
 
api/detector.py ADDED
@@ -0,0 +1,37 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import sys
2
+ sys.path.append("./")
3
+ import uvicorn
4
+ import shutil
5
+
6
+ from fastapi import FastAPI, File, UploadFile, Request
7
+ from fastapi.responses import HTMLResponse
8
+ from fastapi.templating import Jinja2Templates
9
+ from fastapi.staticfiles import StaticFiles
10
+ from src.ss.signboard_detect import SignBoardDetector
11
+
12
+ signboardDetector = SignBoardDetector(checkpoint="./checkpoints/ss/ss.ckpt")
13
+
14
+ app = FastAPI()
15
+ app.mount("/static", StaticFiles(directory="static"), name="static")
16
+ templates = Jinja2Templates(directory="templates")
17
+
18
+ @app.get("/upload", response_class=HTMLResponse)
19
+ async def upload(request: Request):
20
+ return templates.TemplateResponse("detector.html", {"request": request})
21
+
22
+ @app.post("/uploadfile")
23
+ async def create_upload_file(file: UploadFile = File(...)):
24
+ if file.content_type.split("/")[0] != "image":
25
+ return {"file_name": file.filename,
26
+ "file_type": file.content_type,
27
+ "warning": "Need a image file instead."}
28
+ else:
29
+ with open(f"./static/images/{file.filename}", "wb") as buffer:
30
+ shutil.copyfileobj(file.file, buffer)
31
+ results = signboardDetector.inference_signboard(image=[f"./static/images/{file.filename}"], score=0.7)
32
+ file.file.close()
33
+ return {"results": results}
34
+
35
+ if __name__ == "__main__":
36
+ # main()
37
+ uvicorn.run("api.detector:app", reload=True, port=8001)
api/ir.py ADDED
File without changes
api/tracker.py ADDED
@@ -0,0 +1,44 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import sys
2
+ sys.path.append("./")
3
+ import os
4
+ import uvicorn
5
+ import shutil
6
+
7
+ from fastapi import FastAPI, File, UploadFile, Request
8
+ from fastapi.responses import HTMLResponse
9
+ from fastapi.templating import Jinja2Templates
10
+ from fastapi.staticfiles import StaticFiles
11
+ from src.tracker.signboard_track import SignboardTracker
12
+
13
+ signboardTracker = SignboardTracker()
14
+
15
+ app = FastAPI()
16
+ app.mount("/static", StaticFiles(directory="static"), name="static")
17
+ templates = Jinja2Templates(directory="templates")
18
+
19
+ @app.get("/upload", response_class=HTMLResponse)
20
+ async def upload(request: Request):
21
+ return templates.TemplateResponse("tracker.html", {"request": request})
22
+
23
+ @app.post("/uploadfile")
24
+ async def create_upload_file(file: UploadFile = File(...)):
25
+ if file.content_type.split("/")[0] != "video":
26
+ return {"file_name": file.filename,
27
+ "file_type": file.content_type,
28
+ "warning": "Need a video file instead."}
29
+ else:
30
+ output_folder = ('.').join(file.filename.split('.')[:-1])
31
+ if os.path.exists("./static/videos/" + output_folder):
32
+ shutil.rmtree("./static/videos/" + output_folder)
33
+ os.mkdir("./static/videos/" + output_folder)
34
+ os.mkdir("./static/videos/" + output_folder + "/frames")
35
+ with open(f"./static/videos/{output_folder}/{file.filename}", "wb") as buffer:
36
+ shutil.copyfileobj(file.file, buffer)
37
+ output = f"./static/videos/{output_folder}/{('.').join(file.filename.split('.')[:-1])}_traked.{file.filename.split('.')[-1]}"
38
+ output_format = "mp4v"
39
+ results = signboardTracker.inference_signboard(f"./static/videos/{output_folder}/{file.filename}", output, output_format, "./static/videos/" + output_folder + "/frames")
40
+ return {"results": results}
41
+
42
+ if __name__ == "__main__":
43
+ # main()
44
+ uvicorn.run("api.tracker:app", reload=True, port=8000)
app.py ADDED
@@ -0,0 +1,291 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import numpy as np
2
+ import gradio as gr
3
+ import cv2
4
+ import os
5
+ import shutil
6
+ import re
7
+ import torch
8
+ import csv
9
+ import time
10
+
11
+ from src.sts.demo.sts import handle_sts
12
+ from src.ir.ir import handle_ir
13
+ from src.ir.src.models.tc_classifier import TCClassifier
14
+ from src.tracker.signboard_track import SignboardTracker
15
+
16
+ from omegaconf import DictConfig
17
+ from hydra import compose, initialize
18
+
19
+ signboardTracker = SignboardTracker()
20
+
21
+ tracking_result_dir = ""
22
+ output_track_format = "mp4v"
23
+ output_track = ""
24
+ output_sts = ""
25
+ video_dir = ""
26
+ vd_dir = ""
27
+ labeling_dir = ""
28
+
29
+ frame_out = {}
30
+ rs = {}
31
+ results = []
32
+
33
+ # with initialize(version_base=None, config_path="src/ir/configs", job_name="ir"):
34
+ # config = compose(config_name="test")
35
+ # config: DictConfig
36
+ # model_ir = TCClassifier(config.model.train.model_name,
37
+ # config.model.train.n_classes,
38
+ # config.model.train.lr,
39
+ # config.model.train.scheduler_type,
40
+ # config.model.train.max_steps,
41
+ # config.model.train.weight_decay,
42
+ # config.model.train.classifier_dropout,
43
+ # config.model.train.mixout,
44
+ # config.model.train.freeze_encoder)
45
+ # model_ir = model_ir.load_from_checkpoint(checkpoint_path=config.ckpt_path, map_location=torch.device("cuda"))
46
+
47
+ def create_dir(list_dir_path):
48
+ for dir_path in list_dir_path:
49
+ if not os.path.isdir(dir_path):
50
+ os.makedirs(dir_path)
51
+
52
+ def get_meta_from_video(input_video):
53
+ if input_video is not None:
54
+ video_name = os.path.basename(input_video).split('.')[0]
55
+
56
+ global video_dir
57
+ video_dir = os.path.join("static/videos/", f"{video_name}")
58
+
59
+ global vd_dir
60
+ vd_dir = os.path.join(video_dir, os.path.basename(input_video))
61
+
62
+ global output_track
63
+ output_track = os.path.join(video_dir,"original")
64
+
65
+ global tracking_result_dir
66
+ tracking_result_dir = os.path.join(video_dir,"track/cropped")
67
+
68
+ global output_sts
69
+ output_sts = os.path.join(video_dir,"track/sts")
70
+
71
+ global labeling_dir
72
+ labeling_dir = os.path.join(video_dir,"track/labeling")
73
+
74
+ if os.path.isdir(video_dir):
75
+ return None
76
+ else:
77
+ create_dir([output_track, video_dir, os.path.join(video_dir, "track/segment"), output_sts, tracking_result_dir, labeling_dir])
78
+
79
+ # initialize the video stream
80
+ video_cap = cv2.VideoCapture(input_video)
81
+ # grab the width, height, and fps of the frames in the video stream.
82
+ frame_width = int(video_cap.get(cv2.CAP_PROP_FRAME_WIDTH))
83
+ frame_height = int(video_cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
84
+ fps = int(video_cap.get(cv2.CAP_PROP_FPS))
85
+
86
+ #tổng Fps
87
+ # total_frames = int(video_cap.get(cv2.CAP_PROP_FRAME_COUNT))
88
+ # print(total_frames)
89
+ # # Tính tổng số giây trong video
90
+ # total_seconds = total_frames / video_cap.get(cv2.CAP_PROP_FPS)
91
+ # print(total_seconds)
92
+
93
+ # initialize the FourCC and a video writer object
94
+ fourcc = cv2.VideoWriter_fourcc(*"mp4v")
95
+ output = cv2.VideoWriter(vd_dir, fourcc, fps, (frame_width, frame_height))
96
+
97
+ while True:
98
+ success, frame = video_cap.read()
99
+ # write the frame to the output file
100
+ if success == True:
101
+ output.write(frame)
102
+ else:
103
+ break
104
+ # print(fps)
105
+ # return gr.Slider(1, fps, value=4, label="FPS",step=1, info="Choose between 1 and {fps}", interactive=True)
106
+ return gr.Textbox(value=fps)
107
+
108
+ def get_signboard(evt: gr.SelectData):
109
+ name_fr = int(evt.index) + 1
110
+ ids_dir = tracking_result_dir
111
+ all_ids = os.listdir(ids_dir)
112
+ gallery=[]
113
+ for i in all_ids:
114
+ fr_id = str(name_fr)
115
+ al = re.search("[\d]*_"+fr_id+".png", i)
116
+ if al:
117
+ id_dir = os.path.join(ids_dir, i)
118
+ gallery.append(id_dir)
119
+ gallery = sorted(gallery)
120
+ return gallery, name_fr
121
+
122
+ def tracking(fps_target):
123
+ start = time.time()
124
+ fps_target = int(fps_target)
125
+ global results
126
+ results = signboardTracker.inference_signboard(fps_target, vd_dir, output_track, output_track_format, tracking_result_dir)[0]
127
+ # print("result", results)
128
+ fd = []
129
+ global frame_out
130
+ list_id = []
131
+
132
+ with open(os.path.join(video_dir, "track/label.csv"), 'w', newline='') as file:
133
+ writer = csv.writer(file)
134
+ writer.writerow(["Signboard", "Frame", "Text"])
135
+
136
+ for frame, values in results.items():
137
+ frame_dir = os.path.join(output_track, f"{frame}.jpg")
138
+ # segment = os.path.join(video_dir,"segment/" + f"{frame}.jpg")
139
+ list_boxs = []
140
+ full = []
141
+ list_id_tmp = []
142
+ # print("values", values)
143
+ for value in values:
144
+
145
+ list_boxs.append(value['box'])
146
+ list_id_tmp.append(value['id'])
147
+ _, dict_rec_sign_out = handle_sts(frame_dir, labeling_dir, list_boxs, list_id_tmp)
148
+
149
+ # predicted = handle_ir(frame_dir, dict_rec_sign_out, os.path.join(video_dir, "ir"))
150
+ # print(predicted)
151
+
152
+ # fd.append(frame_dir)
153
+ # frame_out[frame] = full
154
+ list_id.extend(list_id_tmp)
155
+ list_id = list(set(list_id))
156
+ # print(list_id)
157
+ print(time.time()-start)
158
+ return gr.Dropdown(label="signboard",choices=list_id, interactive=True)
159
+
160
+
161
+ def get_select_index(img_id, evt: gr.SelectData):
162
+ ids_dir = tracking_result_dir
163
+ # print(ids_dir)
164
+ all_ids = os.listdir(ids_dir)
165
+ gallery = []
166
+ for i in all_ids:
167
+ fr_id = str(img_id)
168
+ al = re.search("[\d]*_"+fr_id+".png", i)
169
+ if al:
170
+ id_dir = os.path.join(ids_dir, i)
171
+ gallery.append(id_dir)
172
+ gallery = sorted(gallery)
173
+
174
+ gallery_id=[]
175
+ id_name = gallery[evt.index]
176
+ id = os.path.basename(id_name).split(".")[0].split("_")[0]
177
+ for i in all_ids:
178
+ al = re.search("^" +id + "_[\d]*.png", i)
179
+ if al:
180
+ id_dir = os.path.join(ids_dir, i)
181
+ gallery_id.append(id_dir)
182
+ gallery_id = sorted(gallery_id)
183
+ return gallery_id
184
+
185
+ id_glb = None
186
+ def select_id(evt: gr.SelectData):
187
+ choice=[]
188
+ global id_glb
189
+ id_glb = evt.value
190
+ for key, values in results.items():
191
+ for value in values:
192
+ if value['id'] == evt.value:
193
+ choice.append(int(key))
194
+ return gr.Dropdown(label="frame", choices=choice, interactive=True)
195
+
196
+
197
+ import pandas as pd
198
+
199
+ frame_glb = None
200
+ def select_frame(evt: gr.SelectData):
201
+ full_img = os.path.join(output_track, str(evt.value) + ".jpg")
202
+ crop_img = os.path.join(tracking_result_dir, str(id_glb) + "_" + str(evt.value) + ".png")
203
+
204
+ global frame_glb
205
+ frame_glb = evt.value
206
+ data = pd.read_csv(os.path.join(labeling_dir, str(id_glb) + "_" + str(frame_glb) + '.csv'), header=0)
207
+
208
+ return full_img, crop_img, data
209
+
210
+ def get_data(dtfr):
211
+ print(dtfr)
212
+
213
+ # df = pd.read_csv(os.path.join(video_dir, "track/label.csv"))
214
+ # for i, row in df.iterrows():
215
+ # if str(row["Signboard"]) == str(id_tmp) and str(row["Frame"]) == str(frame_tmp):
216
+ # # print(row["Text"])
217
+ # df_new = df.replace(str(row["Text"]), str(labeling))
218
+ # print(df_new)
219
+ dtfr.to_csv(os.path.join(labeling_dir, str(id_glb) + "_" + str(frame_glb) + '.csv'), index=False, header=True)
220
+ return
221
+
222
+ def seg_track_app():
223
+ ##########################################################
224
+ ###################### Front-end ########################
225
+ ##########################################################
226
+ with gr.Blocks(css=".gradio-container {background-color: white}") as demo:
227
+ gr.Markdown(
228
+ '''
229
+ <div style="text-align:center;">
230
+ <span style="font-size:3em; font-weight:bold;">POI Engineeing</span>
231
+ </div>
232
+ '''
233
+ )
234
+ with gr.Row():
235
+ # video input
236
+ with gr.Column(scale=0.2):
237
+
238
+ tab_video_input = gr.Row(label="Video type input")
239
+ with tab_video_input:
240
+ input_video = gr.Video(label='Input video')
241
+
242
+ tab_everything = gr.Row(label="Tracking")
243
+ with tab_everything:
244
+ with gr.Row():
245
+ seg_signboard = gr.Button(value="Tracking", interactive=True)
246
+ all_info = gr.Row(label="Information about video")
247
+ with all_info:
248
+ with gr.Row():
249
+ text = gr.Textbox(label="Fps")
250
+ check_fps = gr.Textbox(label="Choose fps for output", interactive=True)
251
+
252
+ with gr.Column(scale=1):
253
+ with gr.Row():
254
+ with gr.Column(scale=2):
255
+ with gr.Row():
256
+ with gr.Column(scale=1):
257
+ id_drop = gr.Dropdown(label="Signboards",choices=[])
258
+ with gr.Column(scale=1):
259
+ fr_drop = gr.Dropdown(label="Frames",choices=[])
260
+ full_img = gr.Image(label="Full Image")
261
+
262
+ with gr.Column(scale=1):
263
+ crop_img = gr.Image(label="Cropped Image")
264
+ with gr.Row():
265
+ dtfr = gr.Dataframe(headers=["Tag", "Value"], datatype=["str", "str"], interactive=True)
266
+ with gr.Row():
267
+ submit = gr.Button(value="Submit", interactive=True)
268
+
269
+ ##########################################################
270
+ ###################### back-end #########################
271
+ ##########################################################
272
+ input_video.change(
273
+ fn=get_meta_from_video,
274
+ inputs=input_video,
275
+ outputs=text
276
+ )
277
+ seg_signboard.click(
278
+ fn=tracking,
279
+ inputs=check_fps,
280
+ outputs=id_drop
281
+ )
282
+
283
+ id_drop.select(select_id, None, fr_drop)
284
+ fr_drop.select(select_frame, None, [full_img,crop_img, dtfr])
285
+ submit.click(get_data, dtfr, None)
286
+
287
+ demo.queue(concurrency_count=1)
288
+ demo.launch(debug=True, enable_queue=True, share=True)
289
+
290
+ if __name__ == "__main__":
291
+ seg_track_app()
backend/__init__.py ADDED
@@ -0,0 +1 @@
 
 
1
+ from fastapi import FastAPI, Body
backend/main.py ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ import uvicorn
2
+
3
+ if __name__ == "__main__":
4
+ uvicorn.run("server.app:app", host="0.0.0.0", port=5000, reload=True)
backend/server/__pycache__/app.cpython-38.pyc ADDED
Binary file (701 Bytes). View file
 
backend/server/__pycache__/database.cpython-38.pyc ADDED
Binary file (1.8 kB). View file
 
backend/server/__pycache__/services.cpython-38.pyc ADDED
Binary file (1.23 kB). View file
 
backend/server/app.py ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from fastapi import FastAPI
2
+ from fastapi.middleware.cors import CORSMiddleware
3
+ from server.routes.user import router as UserRouter
4
+
5
+ app = FastAPI()
6
+
7
+ app.add_middleware(
8
+ CORSMiddleware,
9
+ allow_origins=["*"],
10
+ allow_credentials=True,
11
+ allow_methods=["*"],
12
+ allow_headers=["*"],
13
+ )
14
+ app.include_router(UserRouter, tags=["User"], prefix="/user")
15
+
16
+
17
+ @app.get("/", tags=["Root"])
18
+ async def read_root():
19
+ return {"message": "Welcome to labeling app!"}