[
  {
    "path": ".gitattributes",
    "content": ""
  },
  {
    "path": "AUTHORS",
    "content": "# Contributors should be added to this file in the following format:\n# Name or Organization <email address>\n\nBaidu.com, Inc.\n\n# Initial version authors:\nSun Shuqi <sunshuqi01@baidu.com>\nSun Huifeng <sunhuifeng@baidu.com>\nJiao Zhenyu <jiaozhenyu@baidu.com>\nYang Yu <yangyu16@baidu.com>\n\n# Partial list of contributors:\nHuang Dingbang <huangdingbang@baidu.com>\n"
  },
  {
    "path": "Android/README.md",
    "content": "## LAC的Android调用\n\nAndroid的调用中，我们采用[NDK](https://developer.android.google.cn/ndk/)调用[C++的接口](../c++/README.md)的代码。NDK的使用可以参照[NDK官网](https://developer.android.google.cn/ndk/)或其他博客的教程，这里我们主要展示如何将我们的LAC模型集成到Android应用中\n\n### 示例运行\n\n#### 1. 直接安装运行\n\n- 我们编译了一个**APK安装包**`lac_demo.apk`，可在[release界面](https://github.com/baidu/lac/releases/)下载文件、安装到Android手机中进行测试，目前该demo仅集成了armeabi-v7a或arm64-v8a的库。\n\n#### 2. 编译APK文件\n\n- 下载代码后，可直接使用Android Studio打开[testlac](./testlac)这个文件夹的项目，编译运行该项目即可直接生成一个Android手机的apk文件（支持armeabi-v7a或arm64-v8a）。\n- 项目依赖于[NDK](https://developer.android.google.cn/ndk/)和[CMake](https://developer.android.google.cn/ndk/guides/cmake)进行编译，如果编译过程中提示NDK配置有误，可参照此处进行安装配置：\n  - **安装**：依次打开Tools>SDK Manager>SDK Tools，勾选LLDB、CMake和NDK进行下载\n  - **配置**：打开File > Project Structure > SDK Location，选择默认NDK的路径\n\n### 模型集成过程\n\nLAC模型是使用Paddle训练所得的模型，若要在移动端的调用自己训练的Paddle模型，需要进行以下两项工作\n\n- 集成依赖库[PaddleLite](https://paddle-lite.readthedocs.io/zh/latest/index.html)，该库Paddle为移动端调用模型所定制的轻量库，并集成模型压缩和优化等相关功能\n- 为了适配移动端设备，还需要使用PaddleLite的工具对模型进行优化\n\n#### 1. 依赖库准备\n\n`testlac`项目仅支持armeabi-v7a和arm64-v8a是因为在该项目中仅集成了armeabi-v7a和arm64-v8a的PaddleLite依赖库，即testlac项目中jniLibs中的文件。如需更多平台依赖库的支持，需要集成对应的libs文件：\n\n- 直接下载：https://paddle-lite.readthedocs.io/zh/latest/user_guides/release_lib.html\n- 自行编译：https://paddle-lite.readthedocs.io/zh/latest/user_guides/source_compile.html\n\n下载或编译完成后，参照示例将其放于testlac项目的jniLibs文件夹，同时修改build.gradle中ndk的abiFilters选项，即可完成其他框架的支持。\n\n> 注：PaddleLite预测库的Libs链接需要在CMakeLists.txt文件中声明，如需在自己项目中进行集成，可参考testlac项目中CMakeLists.txt文件的写法。\n\n\n#### 2. 模型优化\n\n为了适配于移动端设备，我们需要通过PaddleLite的工具对模型进行优化。具体模型优化可以参考PaddleLite官网的介绍：[模型优化工具 opt](https://paddle-lite.readthedocs.io/zh/latest/user_guides/model_optimize_tool.html)，在此我们给出一个简单的使用示例：\n\n- 到[官网](https://paddle-lite.readthedocs.io/zh/latest/user_guides/model_optimize_tool.html)中下载优化工具opt\n- 执行下列命令生成优化后的模型\n\n  ```sh\n  # valid_targets可选(arm|opencl|x86|npu|xpu)\n  ./opt --model_dir=./lac_model/model \\\n        --valid_targets=arm \\\n        --optimize_out_type=naive_buffer \\\n        --optimize_out=lac_model_opt\n  ```\n\n  > 经过转换后的模型，对应于testlac项目assets目录下的lac_model/model.nb文件。\n\n- 我们在[release界面](https://github.com/baidu/lac/releases/)提供了经过优化转换的LAC模型`models_android.zip`，以供大家下载使用，解压后其中包含三个不同的模型：\n  - `seg_model`：仅实现分词的模型，体积小\n  - `lac_model`：实现分词、词性标注、实体识别于一体的词法分析模型\n  - `laclite_model`：`lac_model`的轻量化版本，效果会稍差于`lac_model`\n\n#### 3. 其他\n\n- 目前PaddleLite已支持直接使用Java接口调用模型，而不用通过jni的形式调用c++接口，具体可参照官网提供的[Android Demo](https://paddle-lite.readthedocs.io/zh/latest/demo_guides/android_app_demo.html)进行修改\n- PaddleLite官网也提供了[iOS Demo](https://paddle-lite.readthedocs.io/zh/latest/demo_guides/ios_app_demo.html)，有需要的同学可参照[iOS Demo](https://paddle-lite.readthedocs.io/zh/latest/demo_guides/ios_app_demo.html)实现在iOS上的应用"
  },
  {
    "path": "Android/testlac/.project",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<projectDescription>\n\t<name>testlac</name>\n\t<comment>Project testlac created by Buildship.</comment>\n\t<projects>\n\t</projects>\n\t<buildSpec>\n\t\t<buildCommand>\n\t\t\t<name>org.eclipse.buildship.core.gradleprojectbuilder</name>\n\t\t\t<arguments>\n\t\t\t</arguments>\n\t\t</buildCommand>\n\t</buildSpec>\n\t<natures>\n\t\t<nature>org.eclipse.buildship.core.gradleprojectnature</nature>\n\t</natures>\n</projectDescription>\n"
  },
  {
    "path": "Android/testlac/app/.gitignore",
    "content": "/build\n"
  },
  {
    "path": "Android/testlac/app/.project",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<projectDescription>\n\t<name>app</name>\n\t<comment>Project app created by Buildship.</comment>\n\t<projects>\n\t</projects>\n\t<buildSpec>\n\t\t<buildCommand>\n\t\t\t<name>org.eclipse.jdt.core.javabuilder</name>\n\t\t\t<arguments>\n\t\t\t</arguments>\n\t\t</buildCommand>\n\t\t<buildCommand>\n\t\t\t<name>org.eclipse.buildship.core.gradleprojectbuilder</name>\n\t\t\t<arguments>\n\t\t\t</arguments>\n\t\t</buildCommand>\n\t</buildSpec>\n\t<natures>\n\t\t<nature>org.eclipse.jdt.core.javanature</nature>\n\t\t<nature>org.eclipse.buildship.core.gradleprojectnature</nature>\n\t</natures>\n</projectDescription>\n"
  },
  {
    "path": "Android/testlac/app/build.gradle",
    "content": "apply plugin: 'com.android.application'\n\nandroid {\n    compileSdkVersion 29\n    buildToolsVersion \"29.0.2\"\n\n    defaultConfig {\n        applicationId \"com.example.testlac\"\n        minSdkVersion 23\n        targetSdkVersion 29\n        versionCode 1\n        versionName \"1.0\"\n\n        testInstrumentationRunner \"androidx.test.runner.AndroidJUnitRunner\"\n\n        externalNativeBuild {\n            cmake {\n                cppFlags \"\"\n                arguments \"-DANDROID_STL=c++_shared\"\n            }\n        }\n        ndk {\n            abiFilters \"armeabi-v7a\", \"arm64-v8a\"\n        }\n    }\n\n    buildTypes {\n        release {\n            minifyEnabled false\n            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'\n        }\n    }\n\n    externalNativeBuild {\n        cmake {\n            path \"src/main/cpp/CMakeLists.txt\"\n            version \"3.10.2\"\n        }\n    }\n}\n\ndependencies {\n    implementation fileTree(dir: 'libs', include: ['*.jar'])\n\n    implementation 'androidx.appcompat:appcompat:1.0.2'\n    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'\n    testImplementation 'junit:junit:4.12'\n    androidTestImplementation 'androidx.test.ext:junit:1.1.1'\n    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'\n}\n"
  },
  {
    "path": "Android/testlac/app/proguard-rules.pro",
    "content": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguardFiles setting in build.gradle.\n#\n# For more details, see\n#   http://developer.android.com/guide/developing/tools/proguard.html\n\n# If your project uses WebView with JS, uncomment the following\n# and specify the fully qualified class name to the JavaScript interface\n# class:\n#-keepclassmembers class fqcn.of.javascript.interface.for.webview {\n#   public *;\n#}\n\n# Uncomment this to preserve the line number information for\n# debugging stack traces.\n#-keepattributes SourceFile,LineNumberTable\n\n# If you keep the line number information, uncomment this to\n# hide the original source file name.\n#-renamesourcefileattribute SourceFile\n"
  },
  {
    "path": "Android/testlac/app/src/androidTest/java/com/example/testlac/ExampleInstrumentedTest.java",
    "content": "package com.example.testlac;\n\nimport android.content.Context;\n\nimport androidx.test.platform.app.InstrumentationRegistry;\nimport androidx.test.ext.junit.runners.AndroidJUnit4;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\n\nimport static org.junit.Assert.*;\n\n/**\n * Instrumented test, which will execute on an Android device.\n *\n * @see <a href=\"http://d.android.com/tools/testing\">Testing documentation</a>\n */\n@RunWith(AndroidJUnit4.class)\npublic class ExampleInstrumentedTest {\n    @Test\n    public void useAppContext() {\n        // Context of the app under test.\n        Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();\n\n        assertEquals(\"com.example.testlac\", appContext.getPackageName());\n    }\n}\n"
  },
  {
    "path": "Android/testlac/app/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"com.example.testlac\">\n    <uses-permission android:name=\"android.permission.READ_EXTERNAL_STORAGE\"/>\n    <uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\" />\n    <application\n        android:allowBackup=\"true\"\n        android:icon=\"@mipmap/ic_launcher\"\n        android:label=\"@string/app_name\"\n        android:roundIcon=\"@mipmap/ic_launcher_round\"\n        android:supportsRtl=\"true\"\n        android:theme=\"@style/AppTheme\"\n        android:requestLegacyExternalStorage=\"true\">\n        <activity android:name=\".MainActivity\">\n            <intent-filter>\n                <action android:name=\"android.intent.action.MAIN\" />\n\n                <category android:name=\"android.intent.category.LAUNCHER\" />\n            </intent-filter>\n        </activity>\n    </application>\n\n</manifest>"
  },
  {
    "path": "Android/testlac/app/src/main/assets/lac_model/q2b.dic",
    "content": "萬\t万\n與\t与\n醜\t丑\n專\t专\n業\t业\n叢\t丛\n東\t东\n絲\t丝\n丟\t丢\n兩\t两\n嚴\t严\n喪\t丧\n個\t个\n爿\t丬\n豐\t丰\n臨\t临\n為\t为\n麗\t丽\n舉\t举\n麼\t么\n義\t义\n烏\t乌\n樂\t乐\n喬\t乔\n習\t习\n鄉\t乡\n書\t书\n買\t买\n亂\t乱\n爭\t争\n於\t于\n虧\t亏\n雲\t云\n亙\t亘\n亞\t亚\n產\t产\n畝\t亩\n親\t亲\n褻\t亵\n嚲\t亸\n億\t亿\n僅\t仅\n從\t从\n侖\t仑\n倉\t仓\n儀\t仪\n們\t们\n價\t价\n眾\t众\n優\t优\n夥\t伙\n會\t会\n傴\t伛\n傘\t伞\n偉\t伟\n傳\t传\n傷\t伤\n倀\t伥\n倫\t伦\n傖\t伧\n偽\t伪\n佇\t伫\n體\t体\n餘\t余\n傭\t佣\n僉\t佥\n俠\t侠\n侶\t侣\n僥\t侥\n偵\t侦\n側\t侧\n僑\t侨\n儈\t侩\n儕\t侪\n儂\t侬\n俁\t俣\n儔\t俦\n儼\t俨\n倆\t俩\n儷\t俪\n儉\t俭\n債\t债\n傾\t倾\n傯\t偬\n僂\t偻\n僨\t偾\n償\t偿\n儻\t傥\n儐\t傧\n儲\t储\n儺\t傩\n兒\t儿\n兌\t兑\n兗\t兖\n黨\t党\n蘭\t兰\n關\t关\n興\t兴\n茲\t兹\n養\t养\n獸\t兽\n囅\t冁\n內\t内\n岡\t冈\n冊\t册\n寫\t写\n軍\t军\n農\t农\n塚\t冢\n馮\t冯\n沖\t冲\n決\t决\n況\t况\n凍\t冻\n淨\t净\n淒\t凄\n涼\t凉\n淩\t凌\n減\t减\n湊\t凑\n凜\t凛\n幾\t几\n鳳\t凤\n鳧\t凫\n憑\t凭\n凱\t凯\n擊\t击\n氹\t凼\n鑿\t凿\n芻\t刍\n劃\t划\n劉\t刘\n則\t则\n剛\t刚\n創\t創\n刪\t删\n別\t别\n剗\t刬\n剄\t刭\n劊\t刽\n劌\t刿\n剴\t剀\n劑\t剂\n剮\t剐\n劍\t剑\n剝\t剥\n劇\t剧\n勸\t劝\n辦\t办\n務\t务\n勱\t劢\n動\t動\n勵\t励\n勁\t劲\n勞\t劳\n勢\t势\n勳\t勋\n猛\t勐\n勩\t勚\n勻\t匀\n匭\t匦\n匱\t匮\n區\t区\n醫\t医\n華\t华\n協\t协\n單\t单\n賣\t卖\n盧\t卢\n鹵\t卤\n臥\t卧\n衛\t卫\n卻\t却\n巹\t卺\n廠\t厂\n廳\t厅\n曆\t历\n厲\t厉\n壓\t压\n厭\t厌\n厙\t厍\n廁\t厕\n廂\t厢\n厴\t厣\n廈\t厦\n廚\t厨\n廄\t厩\n廝\t厮\n縣\t县\n三\t叁\n參\t參\n靉\t叆\n靆\t叇\n雙\t双\n發\t发\n變\t变\n敘\t叙\n疊\t叠\n葉\t叶\n號\t号\n歎\t叹\n嘰\t叽\n籲\t吁\n後\t后\n嚇\t吓\n呂\t吕\n嗎\t吗\n唚\t吣\n噸\t吨\n聽\t听\n啟\t启\n吳\t吴\n嘸\t呒\n囈\t呓\n嘔\t呕\n嚦\t呖\n唄\t呗\n員\t员\n咼\t呙\n嗆\t呛\n嗚\t呜\n詠\t咏\n哢\t咔\n嚨\t咙\n嚀\t咛\n噝\t咝\n吒\t咤\n噅\t咴\n鹹\t咸\n呱\t哌\n響\t响\n啞\t哑\n噠\t哒\n嘵\t哓\n嗶\t哔\n噦\t哕\n嘩\t哗\n噲\t哙\n嚌\t哜\n噥\t哝\n喲\t哟\n嘜\t唛\n嗊\t唝\n嘮\t唠\n啢\t唡\n嗩\t唢\n唕\t唣\n喚\t唤\n呼\t唿\n嘖\t啧\n嗇\t啬\n囀\t啭\n齧\t啮\n囉\t啰\n嘽\t啴\n嘯\t啸\n噴\t喷\n嘍\t喽\n嚳\t喾\n囁\t嗫\n呵\t呵\n噯\t嗳\n噓\t嘘\n嚶\t嘤\n囑\t嘱\n嚕\t噜\n劈\t噼\n囂\t嚣\n謔\t嚯\n團\t团\n園\t园\n囪\t囱\n圍\t围\n圇\t囵\n國\t国\n圖\t图\n圓\t圆\n聖\t圣\n壙\t圹\n場\t场\n阪\t坂\n壞\t坏\n塊\t块\n堅\t坚\n壇\t坛\n壢\t坜\n壩\t坝\n塢\t坞\n墳\t坟\n墜\t坠\n壟\t垄\n垅\t垄\n壚\t垆\n壘\t垒\n墾\t垦\n坰\t垧\n堊\t垩\n墊\t垫\n埡\t垭\n墶\t垯\n壋\t垱\n塏\t垲\n堖\t垴\n塒\t埘\n塤\t埙\n堝\t埚\n埝\t垫\n垵\t埯\n塹\t堑\n墮\t堕\n壪\t塆\n原\t塬\n牆\t墙\n壯\t壮\n聲\t声\n殼\t壳\n壺\t壶\n壼\t壸\n處\t处\n備\t备\n複\t复\n夠\t够\n頭\t头\n誇\t夸\n夾\t夹\n奪\t夺\n奩\t奁\n奐\t奂\n奮\t奋\n獎\t奖\n奧\t奥\n妝\t妆\n婦\t妇\n媽\t妈\n嫵\t妩\n嫗\t妪\n媯\t妫\n姍\t姗\n薑\t姜\n婁\t娄\n婭\t娅\n嬈\t娆\n嬌\t娇\n孌\t娈\n娛\t娱\n媧\t娲\n嫻\t娴\n嫿\t婳\n嬰\t婴\n嬋\t婵\n嬸\t婶\n媼\t媪\n嬡\t嫒\n嬪\t嫔\n嬙\t嫱\n嬤\t嬷\n孫\t孙\n學\t学\n孿\t孪\n寧\t宁\n寶\t宝\n實\t实\n寵\t宠\n審\t审\n憲\t宪\n宮\t宫\n寬\t宽\n賓\t宾\n寢\t寝\n對\t对\n尋\t寻\n導\t导\n壽\t寿\n將\t将\n爾\t尔\n塵\t尘\n嘗\t尝\n堯\t尧\n尷\t尴\n屍\t尸\n盡\t尽\n層\t层\n屭\t屃\n屜\t屉\n屆\t届\n屬\t属\n屢\t屡\n屨\t屦\n嶼\t屿\n歲\t岁\n豈\t岂\n嶇\t岖\n崗\t岗\n峴\t岘\n嶴\t岙\n嵐\t岚\n島\t岛\n嶺\t岭\n嶽\t岳\n崠\t岽\n巋\t岿\n嶨\t峃\n嶧\t峄\n峽\t峡\n嶢\t峣\n嶠\t峤\n崢\t峥\n巒\t峦\n嶗\t崂\n崍\t崃\n嶮\t崄\n嶄\t崭\n嶸\t嵘\n嶔\t嵚\n崳\t嵛\n嶁\t嵝\n脊\t嵴\n巔\t巅\n鞏\t巩\n巰\t巯\n幣\t币\n帥\t帅\n師\t师\n幃\t帏\n帳\t帐\n簾\t帘\n幟\t帜\n帶\t带\n幀\t帧\n幫\t帮\n幬\t帱\n幘\t帻\n幗\t帼\n冪\t幂\n襆\t幞\n幹\t干\n並\t并\n么\t么\n廣\t广\n莊\t庄\n慶\t庆\n廬\t庐\n廡\t庑\n庫\t库\n應\t应\n廟\t庙\n龐\t庞\n廢\t废\n廎\t庼\n廩\t廪\n開\t开\n異\t异\n棄\t弃\n張\t张\n彌\t弥\n弳\t弪\n彎\t弯\n彈\t弹\n強\t强\n歸\t归\n當\t当\n錄\t录\n彠\t彟\n彥\t彦\n徹\t彻\n徑\t径\n徠\t徕\n禦\t御\n憶\t忆\n懺\t忏\n憂\t忧\n愾\t忾\n懷\t怀\n態\t态\n慫\t怂\n憮\t怃\n慪\t怄\n悵\t怅\n愴\t怆\n憐\t怜\n總\t总\n懟\t怼\n懌\t怿\n戀\t恋\n懇\t恳\n惡\t恶\n慟\t恸\n懨\t恹\n愷\t恺\n惻\t恻\n惱\t恼\n惲\t恽\n悅\t悦\n愨\t悫\n懸\t悬\n慳\t悭\n憫\t悯\n驚\t惊\n懼\t惧\n慘\t惨\n懲\t惩\n憊\t惫\n愜\t惬\n慚\t惭\n憚\t惮\n慣\t惯\n湣\t愍\n慍\t愠\n憤\t愤\n憒\t愦\n願\t愿\n懾\t慑\n憖\t慭\n怵\t憷\n懣\t懑\n懶\t懒\n懍\t懔\n戇\t戆\n戔\t戋\n戲\t戏\n戧\t戗\n戰\t战\n戩\t戬\n戶\t户\n紮\t扎\n撲\t扑\n扡\t扦\n執\t执\n擴\t扩\n捫\t扪\n掃\t扫\n揚\t扬\n擾\t扰\n撫\t抚\n拋\t抛\n摶\t抟\n摳\t抠\n掄\t抡\n搶\t抢\n護\t护\n報\t报\n擔\t担\n擬\t拟\n攏\t拢\n揀\t拣\n擁\t拥\n攔\t拦\n擰\t拧\n撥\t拨\n擇\t择\n掛\t挂\n摯\t挚\n攣\t挛\n掗\t挜\n撾\t挝\n撻\t挞\n挾\t挟\n撓\t挠\n擋\t挡\n撟\t挢\n掙\t挣\n擠\t挤\n揮\t挥\n撏\t挦\n撈\t捞\n損\t损\n撿\t捡\n換\t换\n搗\t捣\n據\t据\n撚\t捻\n擄\t掳\n摑\t掴\n擲\t掷\n撣\t掸\n摻\t掺\n摜\t掼\n摣\t揸\n攬\t揽\n撳\t揿\n攙\t搀\n擱\t搁\n摟\t搂\n攪\t搅\n攜\t携\n攝\t摄\n攄\t摅\n擺\t摆\n搖\t摇\n擯\t摈\n攤\t摊\n攖\t撄\n撐\t撑\n攆\t撵\n擷\t撷\n擼\t撸\n攛\t撺\n擻\t擞\n攢\t攒\n敵\t敌\n斂\t敛\n數\t数\n齋\t斋\n斕\t斓\n斬\t斩\n斷\t断\n無\t无\n舊\t旧\n時\t时\n曠\t旷\n暘\t旸\n曇\t昙\n晝\t昼\n曨\t昽\n顯\t显\n晉\t晋\n曬\t晒\n曉\t晓\n曄\t晔\n暈\t晕\n暉\t晖\n暫\t暂\n曖\t暧\n劄\t札\n術\t术\n樸\t朴\n機\t机\n殺\t杀\n雜\t杂\n權\t权\n條\t条\n來\t来\n楊\t杨\n榪\t杩\n傑\t杰\n極\t极\n構\t构\n樅\t枞\n樞\t枢\n棗\t枣\n櫪\t枥\n梘\t枧\n棖\t枨\n槍\t枪\n楓\t枫\n梟\t枭\n櫃\t柜\n檸\t柠\n檉\t柽\n梔\t栀\n柵\t栅\n標\t标\n棧\t栈\n櫛\t栉\n櫳\t栊\n棟\t栋\n櫨\t栌\n櫟\t栎\n欄\t栏\n樹\t树\n棲\t栖\n樣\t样\n欒\t栾\n棬\t桊\n椏\t丫\n橈\t桡\n楨\t桢\n檔\t档\n榿\t桤\n橋\t桥\n樺\t桦\n檜\t桧\n槳\t桨\n樁\t桩\n夢\t梦\n檮\t梼\n棶\t梾\n檢\t检\n欞\t棂\n槨\t椁\n櫝\t椟\n槧\t椠\n欏\t椤\n橢\t椭\n樓\t楼\n欖\t榄\n櫬\t榇\n櫚\t榈\n櫸\t榉\n檟\t槚\n檻\t槛\n檳\t槟\n櫧\t槠\n橫\t横\n檣\t樯\n櫻\t樱\n櫫\t橥\n櫥\t橱\n櫓\t橹\n櫞\t橼\n簷\t檐\n檁\t檩\n歡\t欢\n歟\t欤\n歐\t欧\n殲\t歼\n歿\t殁\n殤\t殇\n殘\t残\n殞\t殒\n殮\t殓\n殫\t殚\n殯\t殡\n毆\t殴\n毀\t毁\n轂\t毂\n畢\t毕\n斃\t毙\n氈\t毡\n毿\t毵\n氌\t氇\n氣\t气\n氫\t氢\n氬\t氩\n氳\t氲\n彙\t汇\n漢\t汉\n汙\t污\n湯\t汤\n洶\t汹\n遝\t沓\n溝\t沟\n沒\t没\n灃\t沣\n漚\t沤\n瀝\t沥\n淪\t沦\n滄\t沧\n渢\t沨\n溈\t沩\n滬\t沪\n濔\t沵\n濘\t泞\n淚\t泪\n澩\t泶\n瀧\t泷\n瀘\t泸\n濼\t泺\n瀉\t泻\n潑\t泼\n澤\t泽\n涇\t泾\n潔\t洁\n灑\t洒\n窪\t洼\n浹\t浃\n淺\t浅\n漿\t浆\n澆\t浇\n湞\t浈\n溮\t浉\n濁\t浊\n測\t测\n澮\t浍\n濟\t济\n瀏\t浏\n滻\t浐\n渾\t浑\n滸\t浒\n濃\t浓\n潯\t浔\n濜\t浕\n塗\t涂\n湧\t涌\n濤\t涛\n澇\t涝\n淶\t涞\n漣\t涟\n潿\t涠\n渦\t涡\n溳\t涢\n渙\t涣\n滌\t涤\n潤\t润\n澗\t涧\n漲\t涨\n澀\t涩\n澱\t淀\n淵\t渊\n淥\t渌\n漬\t渍\n瀆\t渎\n漸\t渐\n澠\t渑\n漁\t渔\n瀋\t渖\n滲\t渗\n溫\t温\n遊\t游\n灣\t湾\n濕\t湿\n潰\t溃\n濺\t溅\n漵\t溆\n漊\t溇\n潷\t滗\n滾\t滚\n滯\t滞\n灩\t滟\n灄\t滠\n滿\t满\n瀅\t滢\n濾\t滤\n濫\t滥\n灤\t滦\n濱\t滨\n灘\t滩\n澦\t滪\n漤\t滥\n瀠\t潆\n瀟\t潇\n瀲\t潋\n濰\t潍\n潛\t潜\n瀦\t潴\n瀾\t澜\n瀨\t濑\n瀕\t濒\n灝\t灏\n滅\t灭\n燈\t灯\n靈\t灵\n災\t灾\n燦\t灿\n煬\t炀\n爐\t炉\n燉\t炖\n煒\t炜\n熗\t炝\n點\t点\n煉\t炼\n熾\t炽\n爍\t烁\n爛\t烂\n烴\t烃\n燭\t烛\n煙\t烟\n煩\t烦\n燒\t烧\n燁\t烨\n燴\t烩\n燙\t烫\n燼\t烬\n熱\t热\n煥\t焕\n燜\t焖\n燾\t焘\n煆\t煅\n糊\t煳\n退\t煺\n溜\t熘\n愛\t爱\n爺\t爷\n牘\t牍\n犛\t牦\n牽\t牵\n犧\t牺\n犢\t犊\n犟\t强\n犬\t犭\n狀\t状\n獷\t犷\n獁\t犸\n猶\t犹\n狽\t狈\n麅\t狍\n獮\t狝\n獰\t狞\n獨\t独\n狹\t狭\n獅\t狮\n獪\t狯\n猙\t狰\n獄\t狱\n猻\t狲\n獫\t猃\n獵\t猎\n獼\t猕\n玀\t猡\n豬\t猪\n貓\t猫\n蝟\t猬\n獻\t献\n獺\t獭\n璣\t玑\n璵\t玙\n瑒\t玚\n瑪\t玛\n瑋\t玮\n環\t环\n現\t现\n瑲\t玱\n璽\t玺\n瑉\t珉\n玨\t珏\n琺\t珐\n瓏\t珑\n璫\t珰\n琿\t珲\n璡\t琎\n璉\t琏\n瑣\t琐\n瓊\t琼\n瑤\t瑶\n璦\t瑷\n璿\t璇\n瓔\t璎\n瓚\t瓒\n甕\t瓮\n甌\t瓯\n電\t电\n畫\t画\n暢\t畅\n佘\t畲\n疇\t畴\n癤\t疖\n療\t疗\n瘧\t疟\n癘\t疠\n瘍\t疡\n鬁\t疬\n瘡\t疮\n瘋\t疯\n皰\t疱\n屙\t疴\n癰\t痈\n痙\t痉\n癢\t痒\n瘂\t痖\n癆\t痨\n瘓\t痪\n癇\t痫\n癡\t痴\n癉\t瘅\n瘮\t瘆\n瘞\t瘗\n瘺\t瘘\n癟\t瘪\n癱\t瘫\n癮\t瘾\n癭\t瘿\n癩\t癞\n癬\t癣\n癲\t癫\n臒\t癯\n皚\t皑\n皺\t皱\n皸\t皲\n盞\t盏\n鹽\t盐\n監\t监\n蓋\t盖\n盜\t盗\n盤\t盘\n瞘\t眍\n眥\t眦\n矓\t眬\n著\t著\n睜\t睁\n睞\t睐\n瞼\t睑\n瞞\t瞒\n矚\t瞩\n矯\t矫\n磯\t矶\n礬\t矾\n礦\t矿\n碭\t砀\n碼\t码\n磚\t砖\n硨\t砗\n硯\t砚\n碸\t砜\n礪\t砺\n礱\t砻\n礫\t砾\n礎\t础\n硜\t硁\n矽\t硅\n碩\t硕\n硤\t硖\n磽\t硗\n磑\t硙\n礄\t硚\n確\t确\n鹼\t硷\n礙\t碍\n磧\t碛\n磣\t碜\n堿\t硷\n镟\t碹\n磙\t滚\n禮\t礼\n禕\t祎\n禰\t祢\n禎\t祯\n禱\t祷\n禍\t祸\n稟\t禀\n祿\t禄\n禪\t禅\n離\t离\n禿\t秃\n稈\t秆\n種\t种\n積\t积\n稱\t称\n穢\t秽\n穠\t秾\n穭\t稆\n稅\t税\n穌\t稣\n穩\t稳\n穡\t穑\n窮\t穷\n竊\t窃\n竅\t窍\n窯\t窑\n竄\t窜\n窩\t窝\n窺\t窥\n竇\t窦\n窶\t窭\n豎\t竖\n競\t竞\n篤\t笃\n筍\t笋\n筆\t笔\n筧\t笕\n箋\t笺\n籠\t笼\n籩\t笾\n築\t筑\n篳\t筚\n篩\t筛\n簹\t筜\n箏\t筝\n籌\t筹\n簽\t签\n簡\t简\n籙\t箓\n簀\t箦\n篋\t箧\n籜\t箨\n籮\t箩\n簞\t箪\n簫\t箫\n簣\t篑\n簍\t篓\n籃\t篮\n籬\t篱\n籪\t簖\n籟\t籁\n糴\t籴\n類\t类\n秈\t籼\n糶\t粜\n糲\t粝\n粵\t粤\n糞\t粪\n糧\t粮\n糝\t糁\n餱\t糇\n緊\t紧\n縶\t絷\n糸\t纟\n糾\t纠\n紆\t纡\n紅\t红\n紂\t纣\n纖\t纤\n紇\t纥\n約\t约\n級\t级\n紈\t纨\n纊\t纩\n紀\t纪\n紉\t纫\n緯\t纬\n紜\t纭\n紘\t纮\n純\t纯\n紕\t纰\n紗\t纱\n綱\t纲\n納\t纳\n紝\t纴\n縱\t纵\n綸\t纶\n紛\t纷\n紙\t纸\n紋\t纹\n紡\t纺\n紵\t纻\n紖\t纼\n紐\t纽\n紓\t纾\n線\t线\n紺\t绀\n絏\t绁\n紱\t绂\n練\t练\n組\t组\n紳\t绅\n細\t细\n織\t织\n終\t终\n縐\t绉\n絆\t绊\n紼\t绋\n絀\t绌\n紹\t绍\n繹\t绎\n經\t经\n紿\t绐\n綁\t绑\n絨\t绒\n結\t结\n絝\t绔\n繞\t绕\n絰\t绖\n絎\t绗\n繪\t绘\n給\t给\n絢\t绚\n絳\t绛\n絡\t络\n絕\t绝\n絞\t绞\n統\t统\n綆\t绠\n綃\t绡\n絹\t绢\n繡\t绣\n綌\t绤\n綏\t绥\n絛\t绦\n繼\t继\n綈\t绨\n績\t绩\n緒\t绪\n綾\t绫\n緓\t绬\n續\t续\n綺\t绮\n緋\t绯\n綽\t绰\n緔\t绱\n緄\t绲\n繩\t绳\n維\t维\n綿\t绵\n綬\t绶\n繃\t绷\n綢\t䌷\n綯\t绹\n綹\t绺\n綣\t绻\n綜\t综\n綻\t绽\n綰\t绾\n綠\t绿\n綴\t缀\n緇\t缁\n緙\t缂\n緗\t缃\n緘\t缄\n緬\t缅\n纜\t缆\n緹\t缇\n緲\t缈\n緝\t缉\n縕\t缊\n繢\t缋\n緦\t缌\n綞\t缍\n緞\t缎\n緶\t缏\n缐\t线\n緱\t缑\n縋\t缒\n緩\t缓\n締\t缔\n縷\t缕\n編\t编\n緡\t缗\n緣\t缘\n縉\t缙\n縛\t缚\n縟\t缛\n縝\t缜\n縫\t缝\n縗\t缞\n縞\t缟\n纏\t缠\n縭\t缡\n縊\t缢\n縑\t缣\n繽\t缤\n縹\t缥\n縵\t缦\n縲\t缧\n纓\t缨\n縮\t缩\n繆\t缪\n繅\t缫\n纈\t缬\n繚\t缭\n繕\t缮\n繒\t缯\n韁\t缰\n繾\t缱\n繰\t缲\n繯\t缳\n繳\t缴\n纘\t缵\n罌\t罂\n網\t网\n羅\t罗\n罰\t罚\n罷\t罢\n羆\t罴\n羈\t羁\n羥\t羟\n羨\t羡\n翹\t翘\n翽\t翙\n翬\t翚\n耮\t耢\n耬\t耧\n聳\t耸\n恥\t耻\n聶\t聂\n聾\t聋\n職\t职\n聹\t聍\n聯\t联\n聵\t聩\n聰\t聪\n肅\t肃\n腸\t肠\n膚\t肤\n膁\t肷\n腎\t肾\n腫\t肿\n脹\t胀\n脅\t胁\n膽\t胆\n勝\t胜\n朧\t胧\n腖\t胨\n臚\t胪\n脛\t胫\n膠\t胶\n脈\t脉\n膾\t脍\n髒\t脏\n臍\t脐\n腦\t脑\n膿\t脓\n臠\t脔\n腳\t脚\n脫\t脱\n腡\t脶\n臉\t脸\n臘\t腊\n醃\t腌\n膕\t腘\n齶\t腭\n膩\t腻\n靦\t腼\n膃\t腽\n騰\t腾\n臏\t膑\n臢\t臜\n輿\t舆\n艤\t舣\n艦\t舰\n艙\t舱\n艫\t舻\n艱\t艰\n豔\t艳\n艸\t艹\n藝\t艺\n節\t节\n羋\t芈\n薌\t芗\n蕪\t芜\n蘆\t芦\n蓯\t苁\n葦\t苇\n藶\t苈\n莧\t苋\n萇\t苌\n蒼\t苍\n苧\t苎\n蘇\t苏\n檾\t苘\n蘋\t苹\n範\t范\n莖\t茎\n蘢\t茏\n蔦\t茑\n塋\t茔\n煢\t茕\n繭\t茧\n荊\t荆\n薦\t荐\n薘\t荙\n莢\t荚\n蕘\t荛\n蓽\t荜\n蕎\t荞\n薈\t荟\n薺\t荠\n蕩\t荡\n榮\t荣\n葷\t荤\n滎\t荥\n犖\t荦\n熒\t荧\n蕁\t荨\n藎\t荩\n蓀\t荪\n蔭\t荫\n蕒\t荬\n葒\t荭\n葤\t荮\n藥\t药\n蒞\t莅\n蓧\t莜\n萊\t莱\n蓮\t莲\n蒔\t莳\n萵\t莴\n薟\t莶\n獲\t获\n蕕\t莸\n瑩\t莹\n鶯\t莺\n蓴\t莼\n蘀\t萚\n蘿\t萝\n螢\t萤\n營\t营\n縈\t萦\n蕭\t萧\n薩\t萨\n蔥\t葱\n蕆\t蒇\n蕢\t蒉\n蔣\t蒋\n蔞\t蒌\n藍\t蓝\n薊\t蓟\n蘺\t蓠\n蕷\t蓣\n鎣\t蓥\n驀\t蓦\n薔\t蔷\n蘞\t蔹\n藺\t蔺\n藹\t蔼\n蘄\t蕲\n蘊\t蕴\n藪\t薮\n槁\t藁\n蘚\t藓\n虜\t虏\n慮\t虑\n虛\t虚\n蟲\t虫\n虯\t虬\n蟣\t虮\n雖\t虽\n蝦\t虾\n蠆\t虿\n蝕\t蚀\n蟻\t蚁\n螞\t蚂\n蠶\t蚕\n蠔\t蚝\n蜆\t蚬\n蠱\t蛊\n蠣\t蛎\n蟶\t蛏\n蠻\t蛮\n蟄\t蛰\n蛺\t蛱\n蟯\t蛲\n螄\t蛳\n蠐\t蛴\n蛻\t蜕\n蝸\t蜗\n蠟\t蜡\n蠅\t蝇\n蟈\t蝈\n蟬\t蝉\n蠍\t蝎\n螻\t蝼\n蠑\t蝾\n螿\t螀\n蟎\t螨\n蠨\t蟏\n釁\t衅\n銜\t衔\n補\t补\n襯\t衬\n袞\t衮\n襖\t袄\n嫋\t袅\n褘\t袆\n襪\t袜\n襲\t袭\n襏\t袯\n裝\t装\n襠\t裆\n褌\t裈\n褳\t裢\n襝\t裣\n褲\t裤\n襇\t裥\n褸\t褛\n襤\t褴\n繈\t襁\n襴\t襕\n見\t见\n觀\t观\n覎\t觃\n規\t規\n覓\t觅\n視\t视\n覘\t觇\n覽\t览\n覺\t觉\n覬\t觊\n覡\t觋\n覿\t觌\n覥\t觍\n覦\t觎\n覯\t觏\n覲\t觐\n覷\t觑\n觴\t觞\n觸\t触\n觶\t觯\n讋\t詟\n譽\t誉\n謄\t誊\n訁\t讠\n計\t计\n訂\t订\n訃\t讣\n認\t认\n譏\t讥\n訐\t讦\n訌\t讧\n討\t讨\n讓\t让\n訕\t讪\n訖\t讫\n訓\t训\n議\t议\n訊\t讯\n記\t记\n訒\t讱\n講\t讲\n諱\t讳\n謳\t讴\n詎\t讵\n訝\t讶\n訥\t讷\n許\t许\n訛\t讹\n論\t论\n訩\t讻\n訟\t讼\n諷\t讽\n設\t设\n訪\t访\n訣\t诀\n證\t证\n詁\t诂\n訶\t诃\n評\t评\n詛\t诅\n識\t识\n詗\t诇\n詐\t诈\n訴\t诉\n診\t诊\n詆\t诋\n謅\t诌\n詞\t词\n詘\t诎\n詔\t诏\n詖\t诐\n譯\t译\n詒\t诒\n誆\t诓\n誄\t诔\n試\t试\n詿\t诖\n詩\t诗\n詰\t诘\n詼\t诙\n誠\t诚\n誅\t诛\n詵\t诜\n話\t话\n誕\t诞\n詬\t诟\n詮\t诠\n詭\t诡\n詢\t询\n詣\t诣\n諍\t诤\n該\t该\n詳\t详\n詫\t诧\n諢\t诨\n詡\t诩\n譸\t诪\n誡\t诫\n誣\t诬\n語\t语\n誚\t诮\n誤\t误\n誥\t诰\n誘\t诱\n誨\t诲\n誑\t诳\n說\t说\n誦\t诵\n誒\t诶\n請\t请\n諸\t诸\n諏\t诹\n諾\t诺\n讀\t读\n諑\t诼\n誹\t诽\n課\t课\n諉\t诿\n諛\t谀\n誰\t谁\n諗\t谂\n調\t调\n諂\t谄\n諒\t谅\n諄\t谆\n誶\t谇\n談\t谈\n誼\t谊\n謀\t谋\n諶\t谌\n諜\t谍\n謊\t谎\n諫\t谏\n諧\t谐\n谑\t嚯\n謁\t谒\n謂\t谓\n諤\t谔\n諭\t谕\n諼\t谖\n讒\t谗\n諮\t咨\n諳\t谙\n諺\t谚\n諦\t谛\n謎\t谜\n諞\t谝\n諝\t谞\n謨\t谟\n讜\t谠\n謖\t谡\n謝\t谢\n謠\t谣\n謗\t谤\n諡\t谥\n謙\t谦\n謐\t谧\n謹\t谨\n謾\t谩\n謫\t谪\n譾\t谫\n謬\t谬\n譚\t谭\n譖\t谮\n譙\t谯\n讕\t谰\n譜\t谱\n譎\t谲\n讞\t谳\n譴\t谴\n譫\t谵\n讖\t谶\n穀\t谷\n豶\t豮\n貝\t贝\n貞\t贞\n負\t负\n貟\t贠\n貢\t贡\n財\t财\n責\t责\n賢\t贤\n敗\t败\n賬\t账\n貨\t货\n質\t质\n販\t贩\n貪\t贪\n貧\t贫\n貶\t贬\n購\t购\n貯\t贮\n貫\t贯\n貳\t贰\n賤\t贱\n賁\t贲\n貰\t贳\n貼\t贴\n貴\t贵\n貺\t贶\n貸\t贷\n貿\t贸\n費\t费\n賀\t贺\n貽\t贻\n賊\t贼\n贄\t贽\n賈\t贾\n賄\t贿\n貲\t资\n賃\t赁\n賂\t赂\n贓\t赃\n資\t资\n賅\t赅\n贐\t赆\n賕\t赇\n賑\t赈\n賚\t赉\n賒\t赊\n賦\t赋\n賭\t赌\n齎\t赍\n贖\t赎\n賞\t赏\n賜\t赐\n贔\t赑\n賙\t赒\n賡\t赓\n賠\t赔\n賧\t赕\n賴\t赖\n賵\t赗\n贅\t赘\n賻\t赙\n賺\t赚\n賽\t赛\n賾\t赜\n贗\t赝\n贊\t赞\n贇\t赟\n贈\t赠\n贍\t赡\n贏\t赢\n贛\t贛\n赬\t赪\n趙\t赵\n趕\t赶\n趨\t趋\n趲\t趱\n躉\t趸\n躍\t跃\n蹌\t跄\n蹠\t跖\n躒\t跞\n踐\t践\n躂\t跶\n蹺\t跷\n蹕\t跸\n躚\t跹\n躋\t跻\n踴\t踊\n躊\t踌\n蹤\t踪\n躓\t踬\n躑\t踯\n躡\t蹑\n蹣\t蹒\n躕\t蹰\n躥\t蹿\n躪\t躏\n躦\t躜\n軀\t躯\n車\t车\n軋\t轧\n軌\t轨\n軒\t轩\n軑\t轪\n軔\t轫\n轉\t转\n軛\t轭\n輪\t轮\n軟\t软\n轟\t轰\n軲\t轱\n軻\t轲\n轤\t轳\n軸\t轴\n軹\t轵\n軼\t轶\n軤\t轷\n軫\t轸\n轢\t轹\n軺\t轺\n輕\t轻\n軾\t轼\n載\t载\n輊\t轾\n轎\t轿\n輈\t辀\n輇\t辁\n輅\t辂\n較\t较\n輒\t辄\n輔\t辅\n輛\t辆\n輦\t辇\n輩\t辈\n輝\t辉\n輥\t辊\n輞\t辋\n輬\t辌\n輟\t辍\n輜\t辎\n輳\t辏\n輻\t辐\n輯\t辑\n轀\t辒\n輸\t输\n轡\t辔\n轅\t辕\n轄\t辖\n輾\t辗\n轆\t辘\n轍\t辙\n轔\t辚\n辭\t辞\n辯\t辩\n辮\t辫\n邊\t边\n遼\t辽\n達\t达\n遷\t迁\n過\t过\n邁\t迈\n運\t运\n還\t还\n這\t这\n進\t进\n遠\t远\n違\t违\n連\t连\n遲\t迟\n邇\t迩\n逕\t径\n跡\t迹\n適\t适\n選\t选\n遜\t逊\n遞\t递\n邐\t逦\n邏\t逻\n遺\t遗\n遙\t遥\n鄧\t邓\n鄺\t邝\n鄔\t邬\n郵\t邮\n鄒\t邹\n鄴\t邺\n鄰\t邻\n鬱\t郁\n郤\t郄\n郟\t郏\n鄶\t郐\n鄭\t郑\n鄆\t郓\n酈\t郦\n鄖\t郧\n鄲\t郸\n醞\t酝\n醱\t酦\n醬\t酱\n釅\t酽\n釃\t酾\n釀\t酿\n釋\t释\n裏\t里\n鑒\t鉴\n鑾\t銮\n鏨\t錾\n釓\t钆\n釔\t钇\n針\t针\n釘\t钉\n釗\t钊\n釙\t钋\n釕\t钌\n釷\t钍\n釺\t钎\n釧\t钏\n釤\t钐\n鈒\t钑\n釩\t钒\n釣\t钓\n鍆\t钔\n釹\t钕\n鍚\t钖\n釵\t钗\n鈃\t钘\n鈣\t钙\n鈈\t钚\n鈦\t钛\n鈍\t钝\n鈔\t钞\n鍾\t钟\n鈉\t钠\n鋇\t钡\n鋼\t钢\n鈑\t钣\n鈐\t钤\n鑰\t钥\n欽\t钦\n鈞\t钧\n鎢\t钨\n鉤\t钩\n鈧\t钪\n鈁\t钫\n鈥\t钬\n鈄\t钭\n鈕\t钮\n鈀\t钯\n鈺\t钰\n錢\t钱\n鉦\t钲\n鉗\t钳\n鈷\t钴\n缽\t钵\n鈳\t钶\n鉕\t钷\n鈽\t钸\n鈸\t钹\n鉞\t钺\n鑽\t钻\n鉬\t钼\n鉭\t钽\n鉀\t钾\n鈿\t钿\n鈾\t铀\n鐵\t铁\n鉑\t铂\n鈴\t铃\n鑠\t铄\n鉛\t铅\n鉚\t铆\n鈰\t铈\n鉉\t铉\n鉈\t铊\n鉍\t铋\n鈮\t铌\n鈹\t铍\n鐸\t铎\n鉶\t铏\n銬\t铐\n銠\t铑\n鉺\t铒\n鋩\t铓\n錏\t铔\n銪\t铕\n鋮\t铖\n鋏\t铗\n鋣\t铘\n鐃\t铙\n銍\t铚\n鐺\t铛\n銅\t铜\n鋁\t铝\n銱\t铞\n銦\t铟\n鎧\t铠\n鍘\t铡\n銖\t铢\n銑\t铣\n鋌\t铤\n銩\t铥\n銛\t铦\n鏵\t铧\n銓\t铨\n鎩\t铩\n鉿\t铪\n銚\t铫\n鉻\t铬\n銘\t铭\n錚\t铮\n銫\t铯\n鉸\t铰\n銥\t铱\n鏟\t铲\n銃\t铳\n鐋\t铴\n銨\t铵\n銀\t银\n銣\t铷\n鑄\t铸\n鐒\t铹\n鋪\t铺\n鋙\t铻\n錸\t铼\n鋱\t铽\n鏈\t炼\n鏗\t铿\n銷\t销\n鎖\t锁\n鋰\t锂\n鋥\t锃\n鋤\t锄\n鍋\t锅\n鋯\t锆\n鋨\t锇\n鏽\t锈\n銼\t锉\n鋝\t锊\n鋒\t锋\n鋅\t锌\n鋶\t锍\n鐦\t锎\n鐧\t锏\n銳\t锐\n銻\t锑\n鋃\t锒\n鋟\t锓\n鋦\t锔\n錒\t锕\n錆\t锖\n鍺\t锗\n鍩\t锘\n錯\t错\n錨\t锚\n錛\t锛\n錡\t锜\n鍀\t锝\n錁\t锞\n錕\t锟\n錩\t锠\n錫\t锡\n錮\t锢\n鑼\t锣\n錘\t锤\n錐\t锥\n錦\t锦\n鑕\t锧\n鍁\t锨\n錈\t锩\n鍃\t锪\n錇\t锫\n錟\t锬\n錠\t锭\n鍵\t键\n鋸\t锯\n錳\t锰\n錙\t锱\n鍥\t锲\n鍈\t锳\n鍇\t锴\n鏘\t锵\n鍶\t锶\n鍔\t锷\n鍤\t锸\n鍬\t锹\n锺\t钟\n鍛\t锻\n鎪\t锼\n鍠\t锽\n鍰\t锾\n鎄\t锿\n鍍\t镀\n鎂\t镁\n鏤\t镂\n鎡\t镃\n鐨\t镄\n鎇\t镅\n鏌\t镆\n鎮\t镇\n鎛\t镈\n鎘\t镉\n鑷\t镊\n钂\t镋\n鐫\t镌\n鎳\t镍\n鎿\t镎\n鎦\t镏\n鎬\t镐\n鎊\t镑\n鎰\t镒\n鎵\t镓\n鑌\t镔\n鎔\t镕\n鏢\t镖\n鏜\t镗\n鏝\t镘\n鏍\t镙\n鏰\t镚\n鏞\t镛\n鏡\t镜\n鏑\t镝\n鏃\t镞\n鏐\t镠\n鐔\t镡\n钁\t镢\n鐐\t镣\n鏷\t镤\n鑥\t镥\n鐓\t镦\n鑭\t镧\n鐠\t镨\n鑹\t镩\n鏹\t镪\n鐙\t镫\n鑊\t镬\n鐳\t镭\n鐶\t镮\n鐲\t镯\n鐮\t镰\n鐿\t镱\n鑔\t镲\n鑣\t镳\n鑞\t镴\n鑱\t镵\n鑲\t镶\n長\t长\n門\t门\n閂\t闩\n閃\t闪\n閆\t闫\n閈\t闬\n閉\t闭\n問\t问\n闖\t闯\n閏\t闰\n闈\t闱\n閑\t闲\n閎\t闳\n間\t间\n閔\t闵\n閌\t闶\n悶\t闷\n閘\t闸\n鬧\t闹\n閨\t闺\n聞\t闻\n闥\t闼\n閩\t闽\n閭\t闾\n闓\t闿\n閥\t阀\n閣\t合\n閡\t阂\n閫\t阃\n鬮\t阄\n閱\t阅\n閬\t阆\n闍\t阇\n閾\t阈\n閹\t阉\n閶\t阊\n鬩\t阋\n閿\t阌\n閽\t阍\n閻\t阎\n閼\t阏\n闡\t阐\n闌\t阑\n闃\t阒\n闠\t阓\n闊\t阔\n闋\t阕\n闔\t阖\n闐\t阗\n闒\t阘\n闕\t阙\n闞\t阚\n闤\t阛\n隊\t队\n陽\t阳\n陰\t阴\n陣\t阵\n階\t階\n際\t际\n陸\t陆\n隴\t陇\n陳\t陈\n陘\t陉\n陝\t陕\n隉\t陧\n隕\t陨\n險\t险\n隨\t随\n隱\t隐\n隸\t隶\n雋\t隽\n難\t难\n雛\t雏\n讎\t仇\n靂\t雳\n霧\t雾\n霽\t霁\n黴\t霉\n靄\t霭\n靚\t靓\n靜\t静\n靨\t靥\n韃\t鞑\n鞽\t鞒\n韉\t鞯\n韝\t鞴\n韋\t韦\n韌\t韧\n韍\t韨\n韓\t韩\n韙\t韪\n韞\t韫\n韜\t韬\n韻\t韵\n頁\t页\n頂\t顶\n頃\t顷\n頇\t顸\n項\t项\n順\t顺\n須\t须\n頊\t顼\n頑\t顽\n顧\t顾\n頓\t顿\n頎\t颀\n頒\t颁\n頌\t颂\n頏\t颃\n預\t预\n顱\t颅\n領\t领\n頗\t颇\n頸\t颈\n頡\t颉\n頰\t颊\n頲\t颋\n頜\t颌\n潁\t颍\n熲\t颎\n頦\t颏\n頤\t颐\n頻\t频\n頮\t颒\n頹\t颓\n頷\t颔\n頴\t颖\n穎\t颖\n顆\t颗\n題\t题\n顒\t颙\n顎\t颚\n顓\t颛\n顏\t颜\n額\t额\n顳\t颞\n顢\t颟\n顛\t颠\n顙\t颡\n顥\t颢\n纇\t颣\n顫\t颤\n顬\t颥\n顰\t颦\n顴\t颧\n風\t风\n颺\t扬\n颭\t飐\n颮\t飑\n颯\t飒\n颶\t飓\n颸\t飔\n颼\t飕\n颻\t飖\n飀\t飗\n飄\t飘\n飆\t飙\n飚\t飙\n飛\t飞\n饗\t飨\n饜\t餍\n飣\t饤\n饑\t饥\n飥\t饦\n餳\t饧\n飩\t饨\n餼\t饩\n飪\t饪\n飫\t饫\n飭\t饬\n飯\t饭\n飲\t饮\n餞\t饯\n飾\t饰\n飽\t饱\n飼\t饲\n飿\t饳\n飴\t饴\n餌\t饵\n饒\t饶\n餉\t饷\n餄\t饸\n餎\t饹\n餃\t饺\n餏\t饻\n餅\t饼\n餑\t饽\n餖\t饾\n餓\t饿\n馀\t余\n餒\t馁\n餕\t馂\n餜\t馃\n餛\t馄\n餡\t馅\n館\t馆\n餷\t馇\n饋\t馈\n餶\t馉\n餿\t馊\n饞\t馋\n饁\t馌\n饃\t馍\n餺\t馎\n餾\t馏\n饈\t馐\n饉\t馑\n饅\t馒\n饊\t馓\n饌\t馔\n饢\t馕\n馬\t马\n馭\t驭\n馱\t驮\n馴\t驯\n馳\t驰\n驅\t驱\n馹\t驲\n駁\t驳\n驢\t驴\n駔\t驵\n駛\t驶\n駟\t驷\n駙\t驸\n駒\t驹\n騶\t驺\n駐\t驻\n駝\t驼\n駑\t驽\n駕\t驾\n驛\t驿\n駘\t骀\n驍\t骁\n罵\t骂\n駰\t骃\n驕\t骄\n驊\t骅\n駱\t骆\n駭\t骇\n駢\t骈\n驫\t骉\n驪\t骊\n騁\t骋\n驗\t验\n騂\t骍\n駸\t骎\n駿\t骏\n騏\t骐\n騎\t骑\n騍\t骒\n騅\t骓\n騌\t鬃\n驌\t骕\n驂\t骖\n騙\t骗\n騭\t骘\n騤\t骙\n騷\t骚\n騖\t骛\n驁\t骜\n騮\t骝\n騫\t骞\n騸\t骟\n驃\t骠\n騾\t骡\n驄\t骢\n驏\t骣\n驟\t骤\n驥\t骥\n驦\t骦\n驤\t骧\n髏\t髅\n髖\t髋\n髕\t髌\n鬢\t鬓\n魘\t魇\n魎\t魉\n魚\t鱼\n魛\t鱽\n魢\t鱾\n魷\t鱿\n魨\t鲀\n魯\t鲁\n魴\t鲂\n魺\t鲄\n鮁\t鲅\n鮃\t鲆\n鯰\t鲇\n鱸\t鲈\n鮋\t鲉\n鮓\t鲊\n鮒\t鲋\n鮊\t鲌\n鮑\t鲍\n鱟\t鲎\n鮍\t鲏\n鮐\t鲐\n鮭\t鲑\n鮚\t鲒\n鮳\t鲓\n鮪\t鲔\n鮞\t鲕\n鮦\t鲖\n鰂\t鲗\n鮜\t鲘\n鱠\t鲙\n鱭\t鲚\n鮫\t鲛\n鮮\t鲜\n鮺\t鲝\n鯗\t鲞\n鱘\t鲟\n鯁\t鲠\n鱺\t鲡\n鰱\t鲢\n鰹\t鲣\n鯉\t鲤\n鰣\t鲥\n鰷\t鲦\n鯀\t鲧\n鯊\t鲨\n鯇\t鲩\n鮶\t鲪\n鯽\t鲫\n鯒\t鲬\n鯖\t鲭\n鯪\t鲮\n鯕\t鲯\n鯫\t鲰\n鯡\t鲱\n鯤\t鲲\n鯧\t鲳\n鯝\t鲴\n鯢\t鲵\n鲶\t鲇\n鯛\t鲷\n鯨\t鲸\n鯵\t鲹\n鯴\t鲺\n鯔\t鲻\n鱝\t鲼\n鰈\t鲽\n鰏\t鲾\n鱨\t鲿\n鯷\t鳀\n鰮\t鳁\n鰃\t鳂\n鰓\t鳃\n鱷\t鳄\n鰍\t鳅\n鰒\t鳆\n鰉\t鳇\n鰁\t鳈\n鱂\t鳉\n鯿\t鳊\n鰠\t鳋\n鼇\t鳌\n鰭\t鳍\n鰨\t鳎\n鰥\t鳏\n鰩\t鳐\n鰟\t鳑\n鰜\t鳒\n鰳\t鳓\n鰾\t鳔\n鱈\t鳕\n鱉\t鳖\n鰻\t鳗\n鰵\t鳘\n鱅\t鳙\n鰼\t鳛\n鱖\t鳜\n鱔\t鳝\n鱗\t鳞\n鱒\t鳟\n鱯\t鳠\n鱤\t鳡\n鱧\t鳢\n鱣\t鳣\n鳥\t鸟\n鳩\t鸠\n雞\t鸡\n鳶\t鸢\n鳴\t鸣\n鳲\t鸤\n鷗\t鸥\n鴉\t鸦\n鶬\t鸧\n鴇\t鸨\n鴆\t鸩\n鴣\t鸪\n鶇\t鸫\n鸕\t鸬\n鴨\t鸭\n鴞\t鸮\n鴦\t鸯\n鴒\t鸰\n鴟\t鸱\n鴝\t鸲\n鴛\t鸳\n鴬\t鸴\n鴕\t鸵\n鷥\t鸶\n鷙\t鸷\n鴯\t鸸\n鴰\t鸹\n鵂\t鸺\n鴴\t鸻\n鵃\t鸼\n鴿\t鸽\n鸞\t鸾\n鴻\t鸿\n鵐\t鹀\n鵓\t鹁\n鸝\t鹂\n鵑\t鹃\n鵠\t鹄\n鵝\t鹅\n鵒\t鹆\n鷳\t鹇\n鵜\t鹈\n鵡\t鹉\n鵲\t鹊\n鶓\t鹋\n鵪\t鹌\n鶤\t鹍\n鵯\t鹎\n鵬\t鹏\n鵮\t鹐\n鶉\t鹑\n鶊\t鹒\n鵷\t鹓\n鷫\t鹔\n鶘\t鹕\n鶡\t鹖\n鶚\t鹗\n鶻\t鹘\n鶖\t鹙\n鶿\t鹚\n鶥\t鹛\n鶩\t鹜\n鷊\t鹝\n鷂\t鹞\n鶲\t鹟\n鶹\t鹠\n鶺\t鹡\n鷁\t鹢\n鶼\t鹣\n鶴\t鹤\n鷖\t鹥\n鸚\t鹦\n鷓\t鹧\n鷚\t鹨\n鷯\t鹩\n鷦\t鹪\n鷲\t鹫\n鷸\t鹬\n鷺\t鹭\n鸇\t鹯\n鷹\t鹰\n鸌\t鹱\n鸏\t鹲\n鸛\t鹳\n鸘\t鹴\n鹺\t鹾\n麥\t麦\n麩\t麸\n黃\t黄\n黌\t黉\n黶\t黡\n黷\t黩\n黲\t黪\n黽\t黾\n黿\t鼋\n鼂\t鼌\n鼉\t鼍\n鞀\t鼗\n鼴\t鼹\n齇\t齄\n齊\t齐\n齏\t齑\n齒\t齿\n齔\t龀\n齕\t龁\n齗\t龂\n齟\t龃\n齡\t龄\n齙\t龅\n齠\t龆\n齜\t龇\n齦\t龈\n齬\t龉\n齪\t龊\n齲\t龋\n齷\t龌\n龍\t龙\n龔\t龚\n龕\t龛\n龜\t龟\n「\t\"\n」\t\"\n『\t\"\n』\t\"\n鑀\t锿\n鞌\t鞍\n骯\t肮\n爊\t熬\n厫\t廒\n翶\t翱\n鰲\t鳌\n抝\t拗\n垇\t坳\n慠\t傲\n覇\t霸\n栢\t柏\n襬\t摆\n岅\t坂\n闆\t板\n幇\t帮\n幚\t帮\n牓\t榜\n蜯\t蚌\n襃\t褒\n緥\t褓\n寳\t宝\n菢\t抱\n鉋\t铇\n鑤\t铇\n盃\t杯\n桮\t杯\n揹\t背\n俻\t备\n誖\t悖\n逩\t奔\n綳\t绷\n逬\t迸\n偪\t逼\n粃\t秕\n痺\t痹\n獘\t毙\n徧\t遍\n臕\t膘\n飈\t飚\n錶\t表\n鼈\t鳖\n龞\t鳖\n彆\t别\n璸\t瑸\n髩\t鬓\n鬂\t鬓\n氷\t冰\n梹\t槟\n幷\t并\n併\t并\n倂\t并\n竝\t并\n盋\t钵\n鉢\t钵\n愽\t博\n駮\t驳\n蔔\t卜\n倸\t睬\n採\t采\n寀\t采\n跴\t踩\n綵\t彩\n埰\t采\n叄\t叁\n湌\t餐\n飱\t飧\n慙\t惭\n厠\t厕\n筞\t䇲\n揷\t插\n査\t查\n詧\t察\n奼\t姹\n産\t产\n剷\t铲\n甞\t尝\n塲\t场\n膓\t肠\n嚐\t尝\n厰\t厂\n謿\t嘲\n撦\t扯\n趂\t趁\n乗\t乘\n堘\t塍\n椉\t乘\n喫\t吃\n竾\t篪\n勅\t敕\n翄\t翅\n衝\t冲\n紬\t䌷\n酧\t酬\n醻\t酬\n讐\t仇\n矁\t瞅\n耡\t锄\n処\t处\n舩\t船\n窓\t窗\n牎\t窗\n牕\t窗\n窻\t窗\n牀\t床\n剏\t創\n剙\t創\n搥\t捶\n鎚\t锤\n旾\t春\n脣\t唇\n湻\t淳\n蒓\t莼\n醕\t醇\n惷\t蠢\n甆\t瓷\n飺\t糍\n辤\t辞\n餈\t糍\n鷀\t鹚\n怱\t匆\n悤\t匆\n麁\t粗\n麤\t粗\n蹵\t蹴\n欑\t攒\n簒\t篡\n脃\t脆\n畣\t答\n迖\t达\n剳\t札\n獃\t呆\n瑇\t玳\n躭\t耽\n啗\t啖\n噉\t啖\n噹\t当\n攩\t挡\n盪\t荡\n擣\t捣\n惪\t德\n櫈\t凳\n隄\t堤\n廸\t迪\n牴\t抵\n觝\t抵\n蔕\t蒂\n敁\t掂\n彫\t雕\n琱\t雕\n鼦\t貂\n鵰\t雕\n弔\t吊\n窵\t窎\n蜨\t蝶\n曡\t叠\n疉\t叠\n矴\t碇\n椗\t碇\n崬\t岽\n峝\t峒\n働\t動\n兠\t兜\n荳\t豆\n鬥\t斗\n鬦\t斗\n鬪\t斗\n鬭\t斗\n匵\t椟\n覩\t睹\n妬\t妒\n螙\t蠹\n蠧\t蠹\n撴\t蹾\n墪\t墩\n遯\t遁\n朶\t朵\n躱\t躲\n刴\t剁\n垜\t垛\n跥\t跺\n峩\t峨\n頟\t额\n鵞\t鹅\n譌\t讹\n戹\t厄\n阨\t厄\n蕚\t萼\n鰐\t鳄\n尒\t尔\n弍\t贰\n栰\t筏\n罸\t罚\n灋\t法\n髮\t发\n旛\t幡\n飜\t翻\n凣\t凡\n緐\t繁\n倣\t仿\n髣\t仿\n疿\t痱\n蚡\t鼢\n峯\t峰\n蠭\t蜂\n伕\t夫\n彿\t佛\n鳬\t凫\n髴\t佛\n鬴\t釜\n坿\t附\n復\t复\n媍\t妇\n嘠\t嘎\n畡\t垓\n槩\t概\n槪\t概\n乹\t干\n亁\t干\n尲\t尴\n桿\t杆\n榦\t干\n灨\t贛\n棡\t\n罁\t缸\n槓\t杠\n皐\t皋\n臯\t皋\n睪\t睾\n槹\t槔\n橰\t槔\n餻\t糕\n槀\t槁\n稾\t稿\n吿\t告\n暠\t皓\n肐\t胳\n謌\t歌\n挌\t格\n骼\t胳\n臈\t腊\n箇\t个\n畊\t耕\n骾\t鲠\n躳\t躬\n贑\t贛\n鈎\t钩\n耉\t耇\n耈\t耇\n搆\t构\n皷\t鼓\n僱\t雇\n騧\t䯄\n罣\t挂\n枴\t拐\n柺\t拐\n恠\t怪\n関\t关\n舘\t馆\n礶\t罐\n鑵\t罐\n珪\t圭\n槼\t規\n嬀\t妫\n瓌\t瑰\n槶\t椢\n瞶\t瞆\n嘓\t啯\n囯\t国\n菓\t果\n圅\t函\n猂\t悍\n釬\t焊\n銲\t焊\n澣\t浣\n糰\t团\n噑\t嗥\n皜\t皓\n嗬\t呵\n咊\t和\n盇\t盍\n覈\t核\n龢\t和\n恆\t恒\n鬨\t闹\n虖\t呼\n衚\t胡\n餬\t糊\n鬍\t胡\n箎\t篪\n沍\t冱\n芲\t花\n蘤\t花\n畵\t画\n懽\t欢\n貛\t獾\n怳\t恍\n煇\t辉\n幑\t徽\n囘\t回\n囬\t回\n廻\t回\n迴\t回\n逥\t回\n痐\t蛔\n蛕\t蛔\n蜖\t蛔\n譭\t毁\n匯\t汇\n滙\t汇\n殨\t㱮\n篲\t彗\n昬\t昏\n旤\t祸\n穫\t获\n飢\t饥\n賫\t赍\n撃\t击\n賷\t赍\n鷄\t鸡\n覊\t羁\n卽\t即\n檝\t楫\n颳\t刮\n旣\t既\n蹟\t迹\n繫\t系\n傢\t家\n裌\t夹\n筴\t䇲\n戞\t戛\n叚\t假\n斚\t斝\n姦\t奸\n牋\t笺\n椾\t笺\n絸\t茧\n襉\t裥\n礆\t硷\n謭\t谫\n蠒\t茧\n鹻\t硷\n籛\t篯\n劒\t剑\n鍳\t鉴\n鑑\t鉴\n彊\t强\n殭\t僵\n繮\t缰\n奨\t奖\n奬\t奖\n敎\t教\n糹\t纟\n勦\t剿\n儌\t侥\n呌\t叫\n堦\t階\n稭\t秸\n刦\t劫\n刧\t劫\n刼\t劫\n媫\t婕\n觧\t解\n釒\t钅\n觔\t斤\n儘\t尽\n秔\t糠\n稉\t糠\n穽\t阱\n浄\t净\n凈\t净\n踁\t胫\n逈\t迥\n烱\t炯\n絅\t䌹\n揫\t揪\n韮\t韭\n廐\t厩\n俥\t伡\n捄\t救\n侷\t局\n鶪\t䴗\n榘\t矩\n擧\t举\n欅\t榉\n钜\t巨\n鉅\t巨\n鎸\t镌\n捲\t卷\n勌\t倦\n睠\t眷\n獧\t狷\n撧\t撅\n絶\t绝\n橜\t橛\n鐝\t镢\n麕\t麇\n儁\t俊\n栞\t刊\n埳\t坎\n偘\t侃\n矙\t瞰\n穅\t糠\n摃\t扛\n攷\t考\n痾\t疴\n殻\t壳\n剋\t克\n尅\t克\n肎\t肯\n褃\t裉\n阬\t坑\n敂\t叩\n宼\t寇\n釦\t扣\n簆\t筘\n擓\t㧟\n欵\t款\n鑛\t矿\n闚\t窥\n媿\t愧\n餽\t馈\n髠\t髡\n裩\t裈\n鵾\t鹍\n綑\t捆\n睏\t困\n濶\t阔\n辢\t辣\n倈\t俫\n頼\t赖\n嬾\t懒\n灠\t滥\n瑯\t琅\n虆\t蔂\n纍\t累\n稜\t棱\n棃\t梨\n犂\t犁\n貍\t狸\n釐\t厘\n灕\t漓\n裡\t里\n茘\t荔\n涖\t莅\n厤\t历\n厯\t历\n慄\t栗\n歴\t历\n隷\t隶\n歷\t历\n癧\t疬\n瓈\t璃\n亷\t廉\n匲\t奁\n匳\t奁\n鎌\t镰\n籨\t奁\n槤\t梿\n歛\t敛\n蜋\t螂\n樑\t梁\n両\t两\n鴷\t䴕\n粦\t磷\n隣\t邻\n燐\t磷\n麐\t麟\n恡\t吝\n蔆\t菱\n霛\t灵\n櫺\t棂\n畱\t留\n瑠\t琉\n璢\t琉\n癅\t瘤\n栁\t柳\n桺\t柳\n磟\t碌\n蹓\t溜\n霤\t溜\n壠\t垄\n衖\t弄\n瞜\t䁖\n瘻\t瘘\n罏\t垆\n滷\t卤\n樐\t橹\n磠\t硵\n艣\t橹\n艪\t橹\n彔\t录\n剹\t戮\n勠\t戮\n録\t录\n圝\t圞\n崙\t仑\n驘\t骡\n躶\t裸\n臝\t裸\n緑\t绿\n畧\t略\n痲\t淋\n蟇\t蟆\n禡\t祃\n駡\t骂\n衇\t脉\n霢\t霡\n氂\t牦\n冇\t没\n夘\t卯\n戼\t卯\n皃\t貌\n獏\t貘\n麽\t么\n苺\t莓\n楳\t梅\n鋂\t镅\n蝱\t虻\n醿\t醾\n瞇\t眯\n祕\t秘\n覔\t觅\n幎\t幂\n緜\t绵\n靣\t面\n麪\t面\n麵\t面\n玅\t妙\n冺\t泯\n謩\t谟\n饝\t馍\n冐\t冒\n畆\t亩\n畮\t亩\n幙\t幕\n吶\t呐\n廼\t乃\n嬭\t奶\n錼\t镎\n閙\t闹\n嫰\t嫩\n蜺\t霓\n妳\t奶\n暱\t昵\n秊\t年\n鮎\t鲇\n唸\t念\n裊\t袅\n褭\t袅\n嬝\t袅\n揑\t捏\n湼\t涅\n嚙\t啮\n孼\t孽\n櫱\t蘖\n糱\t糵\n囓\t啮\n寕\t宁\n薴\t苎\n辳\t农\n挵\t弄\n煗\t暖\n稬\t糯\n穤\t糯\n衂\t衄\n蕅\t藕\n槃\t盘\n厐\t庞\n徬\t彷\n龎\t厐\n髈\t膀\n砲\t炮\n礮\t炮\n肧\t胚\n珮\t佩\n掽\t碰\n毘\t毗\n闢\t辟\n鷿\t䴙\n腁\t胼\n騗\t骗\n飃\t飘\n闝\t嫖\n拚\t拼\n屛\t屏\n蓱\t萍\n幈\t屏\n缾\t瓶\n凴\t凭\n廹\t迫\n僕\t仆\n舖\t铺\n悽\t凄\n朞\t期\n慽\t戚\n慼\t戚\n亝\t斋\n竒\t奇\n旂\t旗\n棊\t棋\n碁\t棋\n碕\t埼\n唘\t启\n啓\t启\n栔\t契\n噐\t器\n憇\t憩\n鈆\t铅\n諐\t愆\n籤\t签\n拑\t钳\n乾\t干\n鉆\t钻\n羗\t羌\n鎗\t枪\n墻\t墙\n艢\t樯\n繦\t襁\n鍫\t锹\n顦\t憔\n陗\t峭\n琹\t琴\n懃\t勤\n寑\t寝\n吢\t吣\n搇\t揿\n鶄\t䴖\n坵\t丘\n秌\t秋\n鰌\t鳅\n駈\t驱\n敺\t驱\n覰\t觑\n踡\t蜷\n甽\t圳\n舃\t舄\n搉\t榷\n慤\t悫\n帬\t裙\n裠\t裙\n羣\t群\n冄\t冉\n蚦\t蚺\n髥\t髯\n孃\t娘\n遶\t绕\n姙\t妊\n袵\t衽\n靭\t韧\n靱\t韧\n餁\t饪\n毧\t绒\n羢\t绒\n螎\t融\n宂\t冗\n壖\t堧\n輭\t软\n蕋\t蕊\n橤\t蕊\n蘂\t蕊\n鋭\t锐\n叡\t睿\n篛\t箬\n揌\t塞\n顋\t腮\n繖\t伞\n桒\t桑\n澁\t涩\n濇\t涩\n槮\t椮\n剎\t刹\n挱\t挲\n搧\t扇\n羴\t膻\n羶\t膻\n樿\t椫\n饍\t膳\n鱓\t鳝\n尙\t尚\n捨\t舍\n慴\t慑\n葠\t參\n蓡\t參\n蔘\t參\n鰺\t鲹\n讅\t审\n昇\t升\n賸\t剩\n溼\t湿\n鳾\t䴓\n蝨\t虱\n飠\t饣\n旹\t时\n拾\t十\n柹\t柿\n眎\t视\n眡\t视\n弒\t弑\n謚\t谥\n収\t收\n夀\t寿\n倐\t倏\n疎\t疏\n庻\t庶\n竪\t竖\n潄\t漱\n挩\t捝\n説\t说\n枱\t台\n飤\t饲\n竢\t俟\n禩\t祀\n崧\t嵩\n鬆\t松\n叜\t叟\n甦\t苏\n蘓\t苏\n泝\t溯\n遡\t溯\n膆\t嗉\n愬\t诉\n痠\t酸\n祘\t算\n筭\t算\n嵗\t岁\n歳\t岁\n繸\t䍁\n潠\t噀\n簑\t蓑\n鎻\t锁\n牠\t它\n墖\t塔\n荅\t答\n搨\t拓\n臺\t台\n颱\t台\n擡\t抬\n檯\t台\n罈\t坛\n壜\t坛\n罎\t坛\n嘆\t叹\n撢\t掸\n醣\t糖\n餹\t糖\n鎲\t镋\n搯\t掏\n縧\t绦\n縚\t绦\n迯\t逃\n咷\t啕\n鞉\t鼗\n籐\t藤\n鷈\t䴘\n嗁\t啼\n蹏\t蹄\n逷\t逖\n鬀\t剃\n塡\t填\n儵\t倏\n聼\t听\n痌\t恫\n衕\t同\n筩\t筒\n兎\t兔\n頽\t颓\n穨\t颓\n臋\t臀\n拕\t拖\n託\t讬\n駞\t驼\n鼃\t蛙\n譁\t哗\n韈\t袜\n韤\t袜\n喎\t㖞\n盌\t碗\n椀\t碗\n輓\t挽\n翫\t玩\n尫\t尪\n尩\t尪\n亾\t亡\n徃\t往\n朢\t望\n爲\t为\n撝\t㧑\n潙\t沩\n僞\t伪\n衞\t卫\n餧\t喂\n餵\t喂\n榲\t榅\n鰛\t鳁\n螡\t蚊\n蟁\t蚊\n脗\t吻\n搵\t揾\n杇\t圬\n啎\t忤\n摀\t捂\n悮\t误\n悞\t悮\n隖\t坞\n煕\t熙\n熈\t熙\n磎\t溪\n醯\t酰\n譆\t嘻\n蓆\t席\n係\t系\n隟\t隙\n戱\t戏\n舝\t辖\n杴\t锨\n僊\t仙\n鱻\t鲜\n絃\t弦\n閒\t闲\n啣\t衔\n嫺\t娴\n鷴\t鹇\n尠\t鲜\n尟\t鲜\n俔\t伣\n綫\t线\n亯\t享\n鮝\t鲞\n饟\t饷\n曏\t向\n嚮\t向\n鵁\t䴔\n篠\t筱\n効\t效\n傚\t效\n歗\t啸\n脇\t胁\n衺\t邪\n擕\t携\n鞵\t鞋\n洩\t泄\n屓\t屃\n紲\t绁\n蠏\t蟹\n爕\t燮\n訢\t欣\n郉\t邢\n莕\t荇\n倖\t幸\n兇\t凶\n胷\t胸\n綉\t绣\n銹\t锈\n歘\t欻\n鬚\t须\n卹\t恤\n勗\t勖\n敍\t叙\n壻\t婿\n賉\t恤\n萲\t萱\n煖\t暖\n蕿\t萱\n諠\t喧\n蘐\t萱\n藼\t萱\n衒\t炫\n鏇\t镟\n斈\t学\n鷽\t鸴\n勛\t勋\n壎\t埙\n薰\t熏\n燻\t熏\n廵\t巡\n鱏\t鲟\n狥\t徇\n鵶\t鸦\n枒\t丫\n崕\t崖\n菸\t烟\n臙\t胭\n姸\t妍\n硏\t研\n喦\t岩\n嵒\t岩\n揅\t研\n顔\t颜\n巗\t岩\n菴\t庵\n鴈\t雁\n燄\t焰\n騐\t验\n贋\t赝\n鷰\t燕\n醼\t宴\n讌\t宴\n艷\t艳\n豓\t艳\n灧\t滟\n敭\t扬\n幺\t么\n殀\t夭\n窰\t窑\n餚\t肴\n謡\t谣\n齩\t咬\n葯\t药\n鈅\t钥\n燿\t耀\n虵\t蛇\n埜\t野\n壄\t野\n抴\t曳\n亱\t夜\n爗\t烨\n弌\t壹\n吚\t咿\n毉\t医\n迻\t移\n銕\t铁\n彜\t彝\n彞\t彝\n迆\t迤\n螘\t蚁\n搤\t扼\n瞖\t翳\n囙\t因\n陻\t堙\n隂\t阴\n婣\t姻\n慇\t殷\n瘖\t喑\n婬\t淫\n滛\t淫\n誾\t訚\n螾\t蚓\n廕\t荫\n甖\t罂\n鸎\t莺\n颕\t颖\n暎\t映\n雝\t雍\n惥\t恿\n慂\t恿\n肬\t疣\n蚘\t蛔\n汚\t污\n踰\t逾\n庽\t寓\n瘉\t愈\n慾\t欲\n魊\t蜮\n癒\t愈\n欎\t郁\n鬰\t郁\n寃\t冤\n猨\t猿\n蝯\t猿\n戉\t钺\n閲\t阅\n蕓\t芸\n篔\t筼\n熅\t煴\n薀\t蕰\n醖\t酝\n藴\t蕴\n帀\t匝\n桚\t拶\n襍\t杂\n烖\t灾\n簮\t簪\n偺\t咱\n儹\t攒\n賛\t赞\n蹔\t暂\n酇\t酂\n讚\t赞\n喒\t咱\n贜\t赃\n塟\t葬\n臟\t脏\n蹧\t糟\n皁\t皂\n譟\t噪\n竈\t灶\n紥\t扎\n箚\t札\n樝\t楂\n牐\t闸\n煠\t炸\n搾\t榨\n氊\t毡\n琖\t盏\n嶃\t崭\n佔\t占\n麞\t獐\n鞝\t绱\n炤\t照\n櫂\t棹\n摺\t折\n輙\t辄\n讁\t谪\n淛\t浙\n遉\t侦\n碪\t砧\n鍼\t针\n辴\t冁\n癥\t症\n証\t证\n巵\t卮\n秖\t只\n衹\t只\n隻\t只\n姪\t侄\n阯\t址\n帋\t纸\n恉\t旨\n徵\t征\n製\t制\n誌\t志\n稺\t稚\n緻\t致\n穉\t稚\n鐘\t钟\n衆\t众\n週\t周\n箒\t帚\n呪\t咒\n藷\t薯\n煑\t煮\n苎\t苎\n竚\t伫\n註\t注\n筯\t箸\n塼\t砖\n甎\t砖\n縳\t䌸\n譔\t撰\n粧\t妆\n準\t准\n槕\t桌\n梲\t棁\n谘\t咨\n孶\t孳\n趦\t趑\n姉\t姊\n骔\t鬃\n椶\t棕\n鬉\t鬃\n騣\t鬃\n縂\t总\n糉\t粽\n瘲\t疭\n鉏\t锄\n鑚\t钻\n辠\t罪\n檇\t槜\n罇\t樽\n𩣑\t䯃\n𨯅\t䥿\n𩨂\t骢\n𤺥\t瘩\n𧩙\t䜥\n𧝞\t䘛\n𨧜\t䦁\n𩗗\t飓\n𩶘\t䲞\n𤫩\t㻏\n𨊰\t䢀\n𧶧\t䞎\n𧵳\t䞌\n𩞯\t䭪\n𡢃\t㛠\n𨦫\t䦀\n𨋢\t䢂\n𨊸\t䢁\n𧹔\t账\n𡠹\t㛿\n𧜵\t䙊\n𡞵\t㛟\n𤪺\t㻘\n着\t著\n𩚥\t𩠀\n𨏠\t𨐇\n𩣺\t𩧼\n𩗀\t𩙦\n𩞄\t𩠎\n𥿊\t𦈈\n𩞦\t𩠏\n𧶔\t𧹓\n𩿪\t𪉄\n𩥄\t𩨋\n𩜦\t𩠆\n𩵩\t𩽺\n𩵹\t𩽻\n𩚵\t𩠁\n𩎢\t𩏾\n𩤊\t𩧩\n𨥛\t𨱀\n𨊻\t𨐆\n𩥉\t𩧱\n𩛩\t𩠃\n𨶲\t𨸋\n𩢴\t𩧵\n𪀾\t𪉋\n𩡺\t𩧦\n𩜇\t𩠉\n𨶏\t𨸊\n𩣏\t𩧶\n𩢾\t𩧮\n𩧆\t𩨐\n𩏪\t𩏽\n𨫒\t𨱐\n𪃏\t𪉏\n𩚛\t𩟿\n𩸦\t𩾆\n𪘀\t𪚏\n𨧱\t𨱊\n𪁖\t𪉌\n𩢡\t𩧬\n𩤲\t𩨉\n𩙈\t𩙰\n𩘹\t𩙨\n𩘝\t𩙭\n𩥑\t𩨌\n𩤙\t𩨆\n𨳑\t𨸁\n𩸃\t𩾅\n𩜵\t𩠊\n𩘺\t𩙬\n𩤸\t𩨅\n𨥊\t𨰿\n𨏥\t𨐊\n𦂅\t𦈒\n𩓣\t𩖕\n𩝔\t𩠋\n𨷲\t𨸎\n𨶮\t𨸌\n𩛆\t𩠂\n𩽇\t𩾎\n𪃍\t𪉐\n𨳕\t𨸀\n𨎮\t𨐉\n𩶱\t𩽽\n𩥇\t𩨍\n𩘀\t𩙩\n𪈁\t𪉕\n𩢸\t𩧳\n𪁈\t𪉉\n𩶰\t𩽿\n𩷰\t𩾄\n𪀸\t𪉅\n𪄕\t𪉒\n𪈼\t𪉓\n𪄆\t𪉔\n瞭\t了\n乃\t乃\n迺\t乃\n纔\t才\n韆\t千\n凢\t凡\n丫\t丫\n桠\t丫\n耑\t专\n匃\t丐\n匄\t丐\n𠪾\t历\n疋\t匹\n巨\t巨\n陞\t升\n仇\t仇\n雠\t仇\n崘\t仑\n㕥\t以\n㠯\t以\n朮\t术\n佈\t布\n祇\t只\n丣\t卯\n鼕\t冬\n甯\t宁\n齣\t出\n糺\t纠\n动\t動\n托\t讬\n扬\t扬\n飏\t扬\n𠕂\t再\n𠕅\t再\n袷\t夹\n麴\t曲\n麯\t曲\n麹\t曲\n仝\t同\n㠶\t帆\n颿\t帆\n硃\t朱\n佀\t似\n閤\t合\n𠌂\t伞\n创\t創\n𡬶\t寻\n阶\t階\n戯\t戏\n讙\t欢\n驩\t欢\n䭾\t驮\n縴\t纤\n垻\t坝\n儗\t拟\n㕁\t却\n囌\t苏\n邨\t村\n唫\t吟\n你\t奶\n隣\t邻\n疘\t肛\n㠀\t岛\n刨\t铇\n㱃\t饮\n𤰜\t亩\n畂\t亩\n𤱈\t亩\n氾\t泛\n汎\t泛\n沈\t渖\n菑\t灾\n䛐\t词\n跼\t局\n规\t規\n堃\t坤\n𬞟\t苹\n欝\t郁\n犇\t奔\n崐\t昆\n崑\t昆\n嘑\t呼\n謼\t呼\n㟁\t岸\n巖\t岩\n雰\t氛\n妷\t侄\n欣\t欣\n䜣\t欣\n径\t径\n迳\t径\n𠇮\t命\n兔\t兔\n䘚\t卒\n癈\t废\n劵\t券\n匟\t炕\n鑪\t炉\n𬬻\t炉\n㳒\t法\n霑\t沾\n寔\t实\n䛡\t话\n𨽻\t隶\n瀰\t弥\n㕘\t參\n参\t參\n珎\t珍\n𦊱\t挂\n𢬸\t括\n草\t艹\n㙛\t砖\n昰\t是\n閧\t闹\n哄\t闹\n嚥\t咽\n傌\t骂\n倃\t咱\n𠴰\t咱\n偺\t咱\n欬\t咳\n鞦\t秋\n龝\t秋\n脩\t修\n㑺\t俊\n䘑\t脉\n陿\t狭\n合\t合\n阁\t合\n鍊\t炼\n薙\t剃\n絜\t洁\n䘏\t恤\n醆\t盏\n扞\t捍\n喆\t哲\n𢷬\t捣\n噁\t恶\n𫫇\t恶\n𦂳\t紧\n𦃂\t紧\n㨪\t晃\n㤙\t恩\n咲\t笑\n藉\t借\n俛\t俯\n頫\t俯\n𫖯\t俯\n䠶\t射\n拏\t拿\n㧱\t拿\n挐\t拿\n𤱊\t留\n㽞\t留\n资\t资\n𠖇\t冥\n㝠\t冥\n𡨘\t冤\n毬\t球\n𤨏\t琐\n㨗\t捷\n㨿\t据\n惏\t婪\n槑\t梅\n𡐨\t野\n媮\t偷\n衘\t衔\n𩓐\t脖\n蔴\t麻\n旋\t镟\n觕\t粗\n痳\t淋\n殽\t淆\n㴱\t深\n顇\t悴\n㓂\t寇\n𡨥\t寇\n㝛\t宿\n勣\t绩\n𪟝\t绩\n绸\t䌷\n菉\t绿\n蒐\t搜\n㪚\t散\n𦵏\t葬\n㕑\t厨\n冣\t最\n㝡\t最\n晳\t晰\n㡌\t帽\n链\t炼\n䳘\t鹅\n策\t䇲\n㪟\t敦\n淼\t渺\n𣺌\t渺\n嘅\t慨\n𥦗\t窗\n袴\t裤\n䰟\t魂\n㩗\t携\n㩦\t携\n鞾\t靴\n濛\t蒙\n懞\t蒙\n矇\t蒙\n㮣\t概\n詶\t酬\n踫\t碰\n㼝\t碗\n㬉\t暖\n闇\t暗\n晻\t暗\n蹻\t跷\n䗬\t蜂\n寘\t置\n燬\t毁\n骽\t腿\n㢘\t廉\n谿\t溪\n昚\t慎\n㬪\t叠\n𠞰\t剿\n琍\t璃\n衊\t蔑\n𤋮\t熙\n碱\t硷\n𥄨\t瞅\n𠻳\t嗽\n筦\t管\n𡚁\t弊\n砦\t寨\n厀\t膝\n㿜\t瘪\n䊀\t糊\n澂\t澄\n癄\t憔\n𢮥\t操\n撡\t操\n粇\t糠\n䥥\t镰\n繙\t翻\n蝡\t蠕\n赣\t贛\n札\t札\n㩳\t㧐\n軔\t轫\n𦍑\t羌\n㘭\t坳\n袟\t帙\n袠\t帙\n㒺\t罔\n罋\t瓮\n膞\t䏝\n熰\t𬉼\n㥮\t㤘\n荍\t荞\n斮\t斫\n斲\t斫\n斵\t斫\n𦕈\t眇\n哶\t咩\n𠴟\t咩\n䬃\t飒\n㳄\t涎\n酖\t鸩\n鏺\t䥽\n䶊\t衄\n濬\t浚\n襢\t袒\n謟\t谄\n娿\t婀\n粰\t麸\n䴸\t麸\n勑\t敕\n覜\t眺\n㥦\t惬\n㥫\t惇\n箠\t棰\n啑\t喋\n剉\t锉\n嬃\t媭\n椷\t缄\n枏\t楠\n柟\t楠\n楥\t楦\n嘷\t嗥\n獋\t嗥\n粺\t稗\n䈰\t筲\n糠\t糠\n粳\t糠\n𣙜\t榷\n𦉆\t碴\n籑\t馔\n㯭\t橹\n鐯\t䦃\n蔾\t藜\n䠀\t蹚\n䴉\t鹮\n𥲻\t纂\n䝔\t獾\n訏\t𬣙\n澫\t𬇕\n詝\t𬣞\n紃\t𬘓\n塸\t𫭟\n埨\t𫭢\n蒍\t𫇭\n蔿\t𫇭\n軏\t𫐄\n㠣\t𫵷\n㑳\t㑇\n潕\t𣲘\n湋\t𣲗\n澐\t沄\n浿\t𬇙\n諓\t𬣡\n彄\t𫸩\n馼\t𫘜\n紞\t𬘘\n駃\t𫘝\n㭎\t\n軝\t𬨂\n暐\t𬀩\n晛\t𬀪\n釴\t𬬩\n詷\t𫍣\n詪\t𬣳\n鄩\t𬩽\n隑\t𬮿\n隮\t𬯀\n娙\t𫰛\n駓\t𬳵\n駉\t𬳶\n䮄\t𫠊\n瓅\t𬍛\n蔄\t𬜬\n龑\t䶮\n睍\t𪾢\n鈇\t𫓧\n鋹\t𬬮\n釿\t𬬱\n錀\t𬬭\n絪\t𬘡\n駪\t𬳽\n綎\t𬘩\n綖\t𫄧\n璕\t𬍤\n𡑍\t𫭼\n䓣\t𬜯\n藭\t䓖\n梜\t𬂩\n頍\t𫠆\n輄\t𨐈\n赀\t资\n鄳\t𫑡\n輋\t𪨶\n鉥\t𬬸\n鉮\t𬬹\n鉊\t𬬿\n鉧\t𬭁\n僤\t𫢸\n餗\t𫗧\n燖\t𬊈\n礐\t𬒈\n駼\t𬳿\n絺\t𫄨\n綄\t𬘫\n墠\t𫮃\n罃\t䓨\n頔\t𬱖\n蝀\t𬟽\n銈\t𫓯\n鉷\t𫟹\n鐽\t𫟼\n貙\t䝙\n漍\t𬇹\n璗\t𬍡\n諲\t𬤇\n諴\t𫍯\n諟\t𬤊\n謏\t𫍲\n隤\t𬯎\n綪\t𬘬\n綝\t𬘭\n騑\t𬴂\n騊\t𫘦\n綡\t𫟅\n綧\t𬘯\n騄\t𫘧\n塿\t𪣻\n櫍\t𬃊\n鵏\t𬷕\n輗\t𫐐\n齘\t𬹼\n嵽\t𫶇\n顗\t𫖮\n䥑\t鿏\n𨧀\t𬭊\n銶\t𨱇\n鋗\t𫓶\n鋐\t𬭎\n頠\t𬱟\n䰾\t鲃\n鵟\t𫛭\n廞\t𫷷\n闉\t𬮱\n燀\t𬊤\n濆\t𣸣\n濚\t溁\n斆\t敩\n騞\t𬴃\n騠\t𫘨\n緼\t缊\n醲\t𬪩\n磾\t䃅\n輼\t辒\n輶\t𬨎\n輮\t𫐓\n錤\t𫓹\n錞\t𬭚\n𨨏\t𬭛\n穇\t䅟\n篢\t𬕂\n鮣\t䲟\n鮈\t𬶋\n鮀\t𬶍\n膢\t𦝼\n闑\t𫔶\n襀\t𫌀\n頵\t𫖳\n騵\t𫘪\n騱\t𫘬\n璊\t𫞩\n欓\t𣗋\n鶠\t𬸘\n𥗽\t𬒗\n鮆\t𫚖\n鎝\t𨱏\n鍭\t𬭤\n鰤\t𫚕\n鮡\t𬶐\n鮠\t𬶏\n鮟\t𩽾\n鸑\t𬸚\n譓\t𬤝\n縯\t𬙂\n螮\t䗖\n鎓\t𬭩\n鷉\t䴘\n鮸\t𩾃\n瀂\t澛\n鶱\t𬸣\n譞\t𫍽\n驎\t𬴊\n䡵\t𫟦\n齮\t𬺈\n齯\t𫠜\n巘\t𪩘\n鏏\t𬭬\n鐄\t𨱑\n䥕\t𬭯\n饘\t𫗴\n鷟\t𬸦\n繶\t𫄷\n瓛\t𤩽\n㘚\t㘎\n𨭎\t𬭳\n𨭆\t𬭶\n鐇\t𫔍\n鏻\t𬭸\n鐏\t𨱔\n鐩\t𬭼\n鐍\t𫔎\n鷭\t𬸪\n鰆\t䲠\n鯻\t𬶟\n鰊\t𬶠\n鱀\t𬶨\n繻\t𦈡\n纁\t𫄸\n鬹\t鬶\n虉\t𬟁\n鰧\t䲢\n鸊\t䴙\n纆\t𬙊\n鰶\t𬶭\n鱇\t𩾌\n䲁\t鳚\n鱚\t𬶮\n纕\t𬙋\n齼\t𬺓\n䲘\t鳤\n鱲\t𫚭\n‘\t\"\n’\t\"\n“\t\"\n”\t\"\n｀\t`\n＾\t^\n～\t~\n￣\t~\n＜\t<\n﹤\t<\n〈\t<\n＝\t=\n﹦\t=\n＞\t>\n﹥\t>\n〉\t>\n｜\t|\n‖\t|\n　\t \n＿\t_\n－\t-\n﹣\t-\n—\t-\n，\t,\n﹑\t,\n﹐\t,\n、\t,\n；\t;\n﹔\t;\n∶\t:\n：\t:\n﹕\t:\n！\t!\n﹗\t!\n？\t?\n﹖\t?\n／\t/\n．\t.\n﹒\t.\n。\t.\n…\t.\n・\t·\n•\t·\n＇\t\"\n'\t\"\n＂\t\"\n〝\t\"\n〞\t\"\n（\t(\n﹙\t(\n〔\t(\n）\t)\n﹚\t)\n〕\t)\n［\t[\n﹝\t[\n【\t[\n〖\t[\n］\t]\n﹞\t]\n】\t]\n〗\t]\n｛\t{\n﹜\t{\n﹛\t{\n｝\t}\n＠\t@\n﹫\t@\n＄\t$\n﹩\t$\n＊\t*\n﹡\t*\n＼\t\\\n﹨\t\\\n＆\t&\n﹠\t&\n＃\t#\n﹟\t#\n％\t%\n﹪\t%\n＋\t+\n﹢\t+\n𐒠\t0\n𐴰\t0\n𑁦\t0\n𑃰\t0\n𑄶\t0\n𑇐\t0\n𑋰\t0\n𑑐\t0\n𑓐\t0\n𑙐\t0\n𑛀\t0\n𑜰\t0\n𑣠\t0\n𑱐\t0\n𑵐\t0\n𑶠\t0\n𖩠\t0\n𖭐\t0\n𝟎\t0\n𝟘\t0\n𝟢\t0\n𝟬\t0\n𝟶\t0\n𞥐\t0\n０\t0\n୦\t0\n෦\t0\n๐\t0\n໐\t0\n༠\t0\n၀\t0\n႐\t0\n០\t0\n᠐\t0\n᥆\t0\n᧐\t0\n᪀\t0\n᪐\t0\n᭐\t0\n᮰\t0\n᱀\t0\n᱐\t0\n꘠\t0\n꣐\t0\n꤀\t0\n꧐\t0\n꧰\t0\n꩐\t0\n꯰\t0\n߀\t0\n٠\t0\n०\t0\n০\t0\n੦\t0\n૦\t0\n௦\t0\n౦\t0\n೦\t0\n൦\t0\n۰\t0\n𐒡\t1\n𐴱\t1\n𑁧\t1\n𑃱\t1\n𑄷\t1\n𑇑\t1\n𑋱\t1\n𑑑\t1\n𑓑\t1\n𑙑\t1\n𑛁\t1\n𑜱\t1\n𑣡\t1\n𑱑\t1\n𑵑\t1\n𑶡\t1\n𖩡\t1\n𖭑\t1\n𝟏\t1\n𝟙\t1\n𝟣\t1\n𝟭\t1\n𝟷\t1\n𞥑\t1\n１\t1\n୧\t1\n෧\t1\n๑\t1\n໑\t1\n༡\t1\n၁\t1\n႑\t1\n១\t1\n᠑\t1\n᥇\t1\n᧑\t1\n᪁\t1\n᪑\t1\n᭑\t1\n᮱\t1\n᱁\t1\n᱑\t1\n꘡\t1\n꣑\t1\n꤁\t1\n꧑\t1\n꧱\t1\n꩑\t1\n꯱\t1\n߁\t1\n١\t1\n१\t1\n১\t1\n੧\t1\n૧\t1\n௧\t1\n౧\t1\n೧\t1\n൧\t1\n۱\t1\n𐒢\t2\n𐴲\t2\n𑁨\t2\n𑃲\t2\n𑄸\t2\n𑇒\t2\n𑋲\t2\n𑑒\t2\n𑓒\t2\n𑙒\t2\n𑛂\t2\n𑜲\t2\n𑣢\t2\n𑱒\t2\n𑵒\t2\n𑶢\t2\n𖩢\t2\n𖭒\t2\n𝟐\t2\n𝟚\t2\n𝟤\t2\n𝟮\t2\n𝟸\t2\n𞥒\t2\n２\t2\n୨\t2\n෨\t2\n๒\t2\n໒\t2\n༢\t2\n၂\t2\n႒\t2\n២\t2\n᠒\t2\n᥈\t2\n᧒\t2\n᪂\t2\n᪒\t2\n᭒\t2\n᮲\t2\n᱂\t2\n᱒\t2\n꘢\t2\n꣒\t2\n꤂\t2\n꧒\t2\n꧲\t2\n꩒\t2\n꯲\t2\n߂\t2\n٢\t2\n२\t2\n২\t2\n੨\t2\n૨\t2\n௨\t2\n౨\t2\n೨\t2\n൨\t2\n۲\t2\n𐒣\t3\n𐴳\t3\n𑁩\t3\n𑃳\t3\n𑄹\t3\n𑇓\t3\n𑋳\t3\n𑑓\t3\n𑓓\t3\n𑙓\t3\n𑛃\t3\n𑜳\t3\n𑣣\t3\n𑱓\t3\n𑵓\t3\n𑶣\t3\n𖩣\t3\n𖭓\t3\n𝟑\t3\n𝟛\t3\n𝟥\t3\n𝟯\t3\n𝟹\t3\n𞥓\t3\n３\t3\n୩\t3\n෩\t3\n๓\t3\n໓\t3\n༣\t3\n၃\t3\n႓\t3\n៣\t3\n᠓\t3\n᥉\t3\n᧓\t3\n᪃\t3\n᪓\t3\n᭓\t3\n᮳\t3\n᱃\t3\n᱓\t3\n꘣\t3\n꣓\t3\n꤃\t3\n꧓\t3\n꧳\t3\n꩓\t3\n꯳\t3\n߃\t3\n٣\t3\n३\t3\n৩\t3\n੩\t3\n૩\t3\n௩\t3\n౩\t3\n೩\t3\n൩\t3\n۳\t3\n𐒤\t4\n𐴴\t4\n𑁪\t4\n𑃴\t4\n𑄺\t4\n𑇔\t4\n𑋴\t4\n𑑔\t4\n𑓔\t4\n𑙔\t4\n𑛄\t4\n𑜴\t4\n𑣤\t4\n𑱔\t4\n𑵔\t4\n𑶤\t4\n𖩤\t4\n𖭔\t4\n𝟒\t4\n𝟜\t4\n𝟦\t4\n𝟰\t4\n𝟺\t4\n𞥔\t4\n４\t4\n୪\t4\n෪\t4\n๔\t4\n໔\t4\n༤\t4\n၄\t4\n႔\t4\n៤\t4\n᠔\t4\n᥊\t4\n᧔\t4\n᪄\t4\n᪔\t4\n᭔\t4\n᮴\t4\n᱄\t4\n᱔\t4\n꘤\t4\n꣔\t4\n꤄\t4\n꧔\t4\n꧴\t4\n꩔\t4\n꯴\t4\n߄\t4\n٤\t4\n४\t4\n৪\t4\n੪\t4\n૪\t4\n௪\t4\n౪\t4\n೪\t4\n൪\t4\n۴\t4\n𐒥\t5\n𐴵\t5\n𑁫\t5\n𑃵\t5\n𑄻\t5\n𑇕\t5\n𑋵\t5\n𑑕\t5\n𑓕\t5\n𑙕\t5\n𑛅\t5\n𑜵\t5\n𑣥\t5\n𑱕\t5\n𑵕\t5\n𑶥\t5\n𖩥\t5\n𖭕\t5\n𝟓\t5\n𝟝\t5\n𝟧\t5\n𝟱\t5\n𝟻\t5\n𞥕\t5\n５\t5\n୫\t5\n෫\t5\n๕\t5\n໕\t5\n༥\t5\n၅\t5\n႕\t5\n៥\t5\n᠕\t5\n᥋\t5\n᧕\t5\n᪅\t5\n᪕\t5\n᭕\t5\n᮵\t5\n᱅\t5\n᱕\t5\n꘥\t5\n꣕\t5\n꤅\t5\n꧕\t5\n꧵\t5\n꩕\t5\n꯵\t5\n߅\t5\n٥\t5\n५\t5\n৫\t5\n੫\t5\n૫\t5\n௫\t5\n౫\t5\n೫\t5\n൫\t5\n۵\t5\n𐒦\t6\n𐴶\t6\n𑁬\t6\n𑃶\t6\n𑄼\t6\n𑇖\t6\n𑋶\t6\n𑑖\t6\n𑓖\t6\n𑙖\t6\n𑛆\t6\n𑜶\t6\n𑣦\t6\n𑱖\t6\n𑵖\t6\n𑶦\t6\n𖩦\t6\n𖭖\t6\n𝟔\t6\n𝟞\t6\n𝟨\t6\n𝟲\t6\n𝟼\t6\n𞥖\t6\n６\t6\n୬\t6\n෬\t6\n๖\t6\n໖\t6\n༦\t6\n၆\t6\n႖\t6\n៦\t6\n᠖\t6\n᥌\t6\n᧖\t6\n᪆\t6\n᪖\t6\n᭖\t6\n᮶\t6\n᱆\t6\n᱖\t6\n꘦\t6\n꣖\t6\n꤆\t6\n꧖\t6\n꧶\t6\n꩖\t6\n꯶\t6\n߆\t6\n٦\t6\n६\t6\n৬\t6\n੬\t6\n૬\t6\n௬\t6\n౬\t6\n೬\t6\n൬\t6\n۶\t6\n𐒧\t7\n𐴷\t7\n𑁭\t7\n𑃷\t7\n𑄽\t7\n𑇗\t7\n𑋷\t7\n𑑗\t7\n𑓗\t7\n𑙗\t7\n𑛇\t7\n𑜷\t7\n𑣧\t7\n𑱗\t7\n𑵗\t7\n𑶧\t7\n𖩧\t7\n𖭗\t7\n𝟕\t7\n𝟟\t7\n𝟩\t7\n𝟳\t7\n𝟽\t7\n𞥗\t7\n７\t7\n୭\t7\n෭\t7\n๗\t7\n໗\t7\n༧\t7\n၇\t7\n႗\t7\n៧\t7\n᠗\t7\n᥍\t7\n᧗\t7\n᪇\t7\n᪗\t7\n᭗\t7\n᮷\t7\n᱇\t7\n᱗\t7\n꘧\t7\n꣗\t7\n꤇\t7\n꧗\t7\n꧷\t7\n꩗\t7\n꯷\t7\n߇\t7\n٧\t7\n७\t7\n৭\t7\n੭\t7\n૭\t7\n௭\t7\n౭\t7\n೭\t7\n൭\t7\n۷\t7\n𐒨\t8\n𐴸\t8\n𑁮\t8\n𑃸\t8\n𑄾\t8\n𑇘\t8\n𑋸\t8\n𑑘\t8\n𑓘\t8\n𑙘\t8\n𑛈\t8\n𑜸\t8\n𑣨\t8\n𑱘\t8\n𑵘\t8\n𑶨\t8\n𖩨\t8\n𖭘\t8\n𝟖\t8\n𝟠\t8\n𝟪\t8\n𝟴\t8\n𝟾\t8\n𞥘\t8\n８\t8\n୮\t8\n෮\t8\n๘\t8\n໘\t8\n༨\t8\n၈\t8\n႘\t8\n៨\t8\n᠘\t8\n᥎\t8\n᧘\t8\n᪈\t8\n᪘\t8\n᭘\t8\n᮸\t8\n᱈\t8\n᱘\t8\n꘨\t8\n꣘\t8\n꤈\t8\n꧘\t8\n꧸\t8\n꩘\t8\n꯸\t8\n߈\t8\n٨\t8\n८\t8\n৮\t8\n੮\t8\n૮\t8\n௮\t8\n౮\t8\n೮\t8\n൮\t8\n۸\t8\n𐒩\t9\n𐴹\t9\n𑁯\t9\n𑃹\t9\n𑄿\t9\n𑇙\t9\n𑋹\t9\n𑑙\t9\n𑓙\t9\n𑙙\t9\n𑛉\t9\n𑜹\t9\n𑣩\t9\n𑱙\t9\n𑵙\t9\n𑶩\t9\n𖩩\t9\n𖭙\t9\n𝟗\t9\n𝟡\t9\n𝟫\t9\n𝟵\t9\n𝟿\t9\n𞥙\t9\n９\t9\n୯\t9\n෯\t9\n๙\t9\n໙\t9\n༩\t9\n၉\t9\n႙\t9\n៩\t9\n᠙\t9\n᥏\t9\n᧙\t9\n᪉\t9\n᪙\t9\n᭙\t9\n᮹\t9\n᱉\t9\n᱙\t9\n꘩\t9\n꣙\t9\n꤉\t9\n꧙\t9\n꧹\t9\n꩙\t9\n꯹\t9\n߉\t9\n٩\t9\n९\t9\n৯\t9\n੯\t9\n૯\t9\n௯\t9\n౯\t9\n೯\t9\n൯\t9\n۹\t9\nａ\ta\nＡ\tA\nｂ\tb\nＢ\tB\nｃ\tc\nＣ\tC\nｄ\td\nＤ\tD\nｅ\te\nＥ\tE\nｆ\tf\nＦ\tF\nｇ\tg\nＧ\tG\nｈ\th\nＨ\tH\nｉ\ti\nＩ\tI\nｊ\tj\nＪ\tJ\nｋ\tk\nＫ\tK\nｌ\tl\nＬ\tL\nｍ\tm\nＭ\tM\nｎ\tn\nＮ\tN\nｏ\to\nＯ\tO\nｐ\tp\nＰ\tP\nｑ\tq\nＱ\tQ\nｒ\tr\nＲ\tR\nｓ\ts\nＳ\tS\nｔ\tt\nＴ\tT\nｕ\tu\nＵ\tU\nｖ\tv\nＶ\tV\nｗ\tw\nＷ\tW\nｘ\tx\nＸ\tX\nｙ\ty\nＹ\tY\nｚ\tz\nＺ\tZ\nブ\tフ\nド\tト\nが\tか\nど\tと\nで\tて\nビ\tヒ\nだ\tた\nべ\tへ\nデ\tテ\nジ\tシ\nグ\tク\nじ\tし\nベ\tヘ\nバ\tハ\nぐ\tく\nダ\tタ\nプ\tフ\nび\tひ\nポ\tホ\nげ\tけ\nズ\tス\nぷ\tふ\nぱ\tは\nガ\tカ\nゴ\tコ\nゼ\tセ\nピ\tヒ\nペ\tヘ\nヴ\tウ\nパ\tハ\nご\tこ\nぴ\tひ\nず\tす\nザ\tサ\nギ\tキ\nヂ\tチ\nボ\tホ\nぶ\tふ\nば\tは\nゲ\tケ\nぼ\tほ\nぺ\tへ\nぎ\tき\nゾ\tソ\nぽ\tほ\nづ\tつ\nぞ\tそ\nざ\tさ\nゞ\tゝ\nヅ\tツ\nぜ\tせ\nぢ\tち\nヾ\tヽ\nü\tu\n‑\t‐\n①\t1\n②\t2\nⅡ\tI\nè\te\nö\to\nầ\ta\nơ\to\né\te\nò\to\nó\to\n﹊\t \nǐ\ti\nÖ\tO\n₂\t2\nń\tn\nñ\tn\nà\ta\n⑩\t1\n℃\t°\nŠ\tS\nč\tc\ní\ti\ná\ta\nù\tu\nš\ts\n²\t2\n≠\t=\nã\ta\nć\tc\ně\te\nž\tz\nČ\tC\n③\t3\n￡\t£\nā\ta\ną\ta\n⒍\t6\nⅤ\tV\nē\te\nå\ta\nÓ\tO\nⅢ\tI\nţ\tt\nş\ts\nй\tи\në\te\nÔ\tO\nú\tu\nÉ\tE\n½\t1\n¼\t1\nŚ\tS\nś\ts\nä\ta\nŻ\tZ\nğ\tg\nç\tc\n¹\t1\n⑧\t8\nê\te\nﬂ\tf\nǔ\tu\n℡\tT\n﹏\t_\nŞ\tS\nÅ\tA\n㎡\tm\nô\to\n￥\t¥\nṭ\tt\nÁ\tA\nấ\ta\nź\tz\n⑦\t7\nⅣ\tI\nâ\ta\nō\to\n㏒\tl\nï\ti\nŜ\tS\nū\tu\nⅠ\tI\n㎝\tc\nḩ\th\nī\ti\nⅳ\ti\nǒ\to\nę\te\nⅩ\tX\ný\ty\nÄ\tA\nř\tr\n④\t4\nă\ta\n№\tN\nì\ti\nΆ\tΑ\nά\tα\nί\tι\nộ\to\nạ\ta\nắ\ta\n⑨\t9\n≯\t>\nẕ\tz\nĀ\tA\nⅲ\ti\nľ\tl\nோ\tே\n⑤\t5\nṛ\tr\n﹍\t_\n㎎\tm\n⒊\t3\n⒋\t4\nÂ\tA\nİ\tI\nî\ti\nё\tе\n凉\t凉\nș\ts\nő\to\nĞ\tG\nŽ\tZ\nℝ\tR\nℙ\tP\n㊣\t正\nż\tz\nſ\ts\nű\tu\nĪ\tI\nÇ\tC\n″\t′\nº\to\nÚ\tU\nǹ\tn\nẃ\tw\nõ\to\nⅦ\tV\nⅱ\ti\n¨\t \nḥ\th\nệ\te\nư\tu\nờ\to\n￠\t¢\n≮\t<\nЁ\tЕ\nⅹ\tx\nŐ\tO\nﬁ\tf\nⅪ\tX\nŏ\to\nЙ\tИ\nŌ\tO\n￢\t¬\nÀ\tA\n㎜\tm\nª\ta\nả\ta\nÎ\tI\nế\te\n⒏\t8\n⒈\t1\n⒉\t2\n⒌\t5\n⑴\t(\n⑵\t(\n⒁\t(\nȘ\tS\nⅴ\tv\n칠\tᄎ\n보\tᄇ\n산\tᄉ\nņ\tn\nė\te\nṇ\tn\n⑥\t6\nử\tu\nũ\tu\nὐ\tυ\nų\tu\nⅸ\ti\n郎\t郎\n´\t \n참\tᄎ\n치\tᄎ\nǫ\to\nṣ\ts\nŷ\ty\nÜ\tU\nň\tn\nÍ\tI\n﹎\t_\nț\tt\nṅ\tn\nό\tο\nύ\tυ\n¾\t3\n¯\t \n裏\t裏\n⒛\t2\nǎ\ta\n⑺\t(\nḲ\tK\nẩ\ta\nổ\to\nἋ\tΑ\nῶ\tω\n⒎\t7\nǜ\tu\nǚ\tu\n﹋\t \nḨ\tH\nḏ\td\nỳ\ty\n는\tᄂ\nỵ\ty\nĒ\tE\nẾ\tE\nļ\tl\n광\tᄀ\n릉\tᄅ\n⑸\t(\nẹ\te\n설\tᄉ\n빙\tᄇ\n박\tᄇ\n호\tᄒ\nⅰ\ti\nÒ\tO\nḤ\tH\n㏄\tc\n매\tᄆ\n운\tᄋ\n족\tᄌ\n발\tᄇ\nû\tu\nḪ\tH\n⑷\t(\nů\tu\n⅔\t2\nķ\tk\nÿ\ty\n㈱\t(\nǦ\tG\nⅧ\tV\nỗ\to\nọ\to\n애\tᄋ\n자\tᄌ\n인\tᄋ\n권\tᄀ\n연\tᄋ\nொ\tெ\nĆ\tC\n종\tᄌ\n갓\tᄀ\n집\tᄌ\nḍ\td\nÑ\tN\n⑹\t(\nở\to\nứ\tu\n⅓\t1\nŪ\tU\nĕ\te\n˙\t \n﹌\t \nố\to\nữ\tu\nǘ\tu\nị\ti\n㏕\tm\nĩ\ti\nễ\te\n정\tᄌ\n희\tᄒ\nÝ\tY\n와\tᄋ\nⅥ\tV\nⅶ\tv\nⅵ\tv\nǖ\tu\nȚ\tT\n³\t3\nṃ\tm\nồ\to\n재\tᄌ\n활\tᄒ\n립\tᄅ\n과\tᄀ\n㎞\tk\n행\tᄒ\n베\tᄇ\n⒒\t1\n중\tᄌ\n고\tᄀ\n등\tᄃ\n교\tᄀ\nµ\tμ\n﹃\t『\nŭ\tu\n경\tᄀ\n공\tᄀ\n업\tᄋ\n체\tᄎ\n육\tᄋ\n단\tᄃ\nأ\tا\nὲ\tε\nụ\tu\n™\tT\nĝ\tg\nÈ\tE\nÌ\tI\nÙ\tU\nإ\tا\nⅫ\tX\nἀ\tα\nή\tη\nể\te\n늦\tᄂ\n어\tᄋ\n양\tᄋ\nέ\tε\nỌ\tO\nĠ\tG\nⅨ\tI\nớ\to\n︿\t〈\n그\tᄀ\n래\tᄅ\n드\tᄃ\n론\tᄅ\nќ\tк\n㏑\tl\nề\te\nợ\to\n주\tᄌ\n⁺\t+\n⒐\t9\nằ\ta\n달\tᄃ\n나\tᄂ\nὈ\tΟ\n⑻\t(\n바\tᄇ\n탕\tᄐ\n돋\tᄃ\n움\tᄋ\nώ\tω\nť\tt\n환\tᄒ\n국\tᄀ\n선\tᄉ\n㎏\tk\n찜\tᄍ\n닭\tᄃ\nἶ\tι\nآ\tا\nĽ\tL\n겸\tᄀ\nⅷ\tv\nŵ\tw\nự\tu\nำ\tํ\n︶\t)\n힘\tᄒ\n찬\tᄎ\n㏎\tK\nṁ\tm\n⒆\t(\nḵ\tk\n응\tᄋ\n답\tᄃ\n하\tᄒ\n라\tᄅ\n청\tᄎ\n춘\tᄎ\n⒚\t1\nģ\tg\nĘ\tE\nḱ\tk\nḳ\tk\n⑶\t(\nʰ\th\n⁵\t5\n모\tᄆ\nẻ\te\n⑿\t(\nġ\tg\nṉ\tn\n포\tᄑ\n외\tᄋ\n생\tᄉ\n여\tᄋ\n린\tᄅ\n소\tᄉ\n반\tᄇ\n군\tᄀ\n웅\tᄋ\n본\tᄇ\n풀\tᄑ\nʷ\tw\nў\tу\n⒔\t1\n𝜀\tε\n귀\tᄀ\n℉\t°\n℅\tc\nṬ\tT\nΌ\tΟ\n적\tᄌ\n유\tᄋ\n령\tᄅ\n맥\tᄆ\nἐ\tε\nῦ\tυ\nὸ\tο\nÕ\tO\nŸ\tY\nẫ\ta\nủ\tu\nї\tі\nĉ\tc\n￤\t¦\n﹉\t \n⒀\t(\nℳ\tM\nĭ\ti\nŢ\tT\n΄\t \nǯ\tʒ\n젇\tᄌ\n객\tᄀ\n품\tᄑ\nṢ\tS\n점\tᄌ\n만\tᄆ\n에\tᄋ\n︱\t—\nď\td\nừ\tu\nℵ\tא\nậ\ta\nÊ\tE\n를\tᄅ\n위\tᄋ\n합\tᄒ\nൊ\tെ\n길\tᄀ\nῆ\tη\nἘ\tΕ\nἈ\tΑ\nἌ\tΑ\n⒕\t1\n제\tᄌ\n망\tᄆ\n루\tᄅ\nো\tে\n황\tᄒ\n해\tᄒ\n북\tᄇ\n도\tᄃ\n병\tᄇ\nḶ\tL\nḷ\tl\nḻ\tl\n〈\t〈\n〉\t〉\n새\tᄉ\n옥\tᄋ\nἄ\tα\n피\tᄑ\n세\tᄉ\n계\tᄀ\n로\tᄅ\n영\tᄋ\n송\tᄉ\n비\tᄇ\n상\tᄉ\nὼ\tω\nἒ\tε\nὴ\tη\nὶ\tι\nὖ\tυ\nἳ\tι\nℓ\tl\nĄ\tA\nẒ\tZ\nẸ\tE\nϹ\tΣ\nϲ\tς\nỏ\to\nೇ\tೆ\nئ\tي\n⒇\t(\nȕ\tu\nẓ\tz\nㅭ\tᇙ\nො\tෙ\n礼\t礼\nȟ\th\n헌\tᄒ\n구\tᄀ\n려\tᄅ\n쪼\tᄍ\n디\tᄃ\n킨\tᄏ\n⅝\t5\n렇\tᄅ\n게\tᄀ\n울\tᄋ\n었\tᄋ\n다\tᄃ\nŗ\tr\n율\tᄋ\n전\tᄌ\n역\tᄋ\n앞\tᄋ\n독\tᄃ\n︴\t_\n누\tᄂ\n밀\tᄆ\n은\tᄋ\n있\tᄋ\nặ\ta\n⅜\t3\n︻\t【\n원\tᄋ\n더\tᄃ\n문\tᄆ\n네\tᄂ\n림\tᄅ\n메\tᄆ\n커\tᄏ\n담\tᄃ\nỹ\ty\n미\tᄆ\n허\tᄒ\n각\tᄀ\n⒑\t1\nև\tե\n방\tᄇ\nǣ\tæ\nῬ\tΡ\nຳ\tໍ\n용\tᄋ\n마\tᄆ\n차\tᄎ\nṖ\tP\n온\tᄋ\n우\tᄋ\n뢰\tᄅ\nĬ\tI\n강\tᄀ\n남\tᄂ\n헤\tᄒ\nẤ\tA\n오\tᄋ\n므\tᄆ\n스\tᄉ\nḌ\tD\n㎚\tn\nẽ\te\nΐ\tι\nὁ\tο\n⅞\t7\n･\t・\n팔\tᄑ\n손\tᄉ\n현\tᄒ\n석\tᄉ\n진\tᄌ\n완\tᄋ\n가\tᄀ\n요\tᄋ\n첨\tᄎ\nὺ\tυ\n︽\t《\n⒓\t1\n내\tᄂ\n신\tᄉ\n시\tᄉ\n지\tᄌ\nḡ\tg\n천\tᄎ\n안\tᄋ\nﬃ\tf\nὉ\tΟ\nﾟ\t゚\nŝ\ts\nㅣ\tᅵ\nㅜ\tᅮ\n토\tᄐ\n끼\tᄁ\n늘\tᄂ\nৌ\tে\n데\tᄃ\nį\ti\nೀ\tಿ\nἅ\tα\nẋ\tx\n㎢\tk\n트\tᄐ\n윤\tᄋ\n조\tᄌ\n찰\tᄎ\n화\tᄒ\n녀\tᄂ\nἩ\tΗ\nὑ\tυ\nǴ\tG\nϊ\tι\nΈ\tΕ\n곰\tᄀ\n엌\tᄋ\n후\tᄒ\n춧\tᄎ\nÃ\tA\n왕\tᄋ\n덕\tᄃ\n두\tᄃ\n봉\tᄇ\n큰\tᄏ\n렁\tᄅ\n난\tᄂ\n수\tᄉ\nḫ\th\n앙\tᄋ\n책\tᄎ\nỉ\ti\nĶ\tK\nẖ\th\nˢ\ts\nஔ\tஒ\nϵ\tε\n˚\t \n₨\tR\n콤\tᄏ\n날\tᄂ\n러\tᄅ\n⅛\t1\n당\tᄃ\nĢ\tG\n혁\tᄒ\n낭\tᄂ\n식\tᄉ\nŘ\tR\n명\tᄆ\n타\tᄐ\n일\tᄋ\n‼\t!\nṟ\tr\n풍\tᄑ\n댐\tᄃ\n첫\tᄎ\n눈\tᄂ\n코\tᄏ\n리\tᄅ\n범\tᄇ\n순\tᄉ\n출\tᄎ\n무\tᄆ\n축\tᄎ\n회\tᄒ\n창\tᄎ\n년\tᄂ\n념\tᄂ\n금\tᄀ\n협\tᄒ\n총\tᄎ\n밤\tᄇ\nẼ\tE\nϕ\tφ\n씨\tᄊ\n으\tᄋ\nỷ\ty\nṱ\tt\n백\tᄇ\nǽ\tæ\nේ\tෙ\nẔ\tZ\nϖ\tπ\n秊\t秊\n¸\t \n을\tᄋ\nῖ\tι\nẵ\ta\n항\tᄒ\n술\tᄉ\n준\tᄌ\n관\tᄀ\n규\tᄀ\n칙\tᄎ\n먹\tᄆ\nĎ\tD\n⒙\t1\nೊ\tೆ\n복\tᄇ\n눌\tᄂ\n룽\tᄅ\n돌\tᄃ\n솥\tᄉ\n빔\tᄇ\nෝ\tෙ\n⑼\t(\n최\tᄎ\n니\tᄂ\n엘\tᄋ\n별\tᄇ\n분\tᄇ\nἸ\tΙ\nἜ\tΕ\n᾿\t \nἙ\tΕ\nᵒ\to\nḑ\td\n민\tᄆ\n결\tᄀ\n승\tᄉ\n웃\tᄋ\n음\tᄋ\n찾\tᄎ\n람\tᄅ\n들\tᄃ\n빅\tᄇ\n램\tᄅ\n넌\tᄂ\nȍ\to\n름\tᄅ\n귤\tᄀ\n감\tᄀ\n류\tᄅ\n₄\t4\n₃\t3\n궁\tᄀ\n향\tᄒ\nǰ\tj\nṯ\tt\nὩ\tΩ\nὰ\tα\n떻\tᄄ\n낼\tᄂ\n획\tᄒ\nἍ\tΑ\n칭\tᄎ\nẢ\tA\n취\tᄎ\n개\tᄀ\nĵ\tj\nӯ\tу\n물\tᄆ\n짜\tᄍ\n났\tᄂ\n란\tᄅ\n초\tᄎ\nℕ\tN\n₀\t0\n특\tᄐ\n목\tᄆ\n︹\t〔\n︺\t〕\n랑\tᄅ\n팍\tᄑ\n휘\tᄒ\nĴ\tJ\n찍\tᄍ\n⒄\t(\n⒃\t(\n⑾\t(\nʲ\tj\n똑\tᄄ\nὠ\tω\n야\tᄋ\n채\tᄎ\n슴\tᄉ\n︒\t。\nἡ\tη\nЇ\tІ\nὄ\tο\nḠ\tG\n⑽\t(\nЌ\tК\nḗ\te\n쁜\tᄈ\n놈\tᄂ\n𝔓\tP\nῡ\tυ\n왜\tᄋ\n골\tᄀ\nἰ\tι\n쇼\tᄉ\n뷰\tᄇ\n티\tᄐ\n흥\tᄒ\n투\tᄐ\nೋ\tೆ\n틀\tᄐ\n嗀\t嗀\nോ\tേ\nƠ\tO\n첩\tᄎ\n딪\tᄃ\n쳐\tᄎ\n빠\tᄈ\n˘\t \n형\tᄒ\n엽\tᄋ\n클\tᄏ\n브\tᄇ\n릴\tᄅ\nῥ\tρ\nὤ\tω\n친\tᄎ\n존\tᄌ\n렌\tᄅ\n검\tᄀ\n절\tᄌ\nؤ\tو\n롯\tᄅ\n험\tᄒ\nӧ\tо\n알\tᄋ\n플\tᄑ\nℂ\tC\nċ\tc\n실\tᄉ\nĻ\tL\n낙\tᄂ\n맵\tᄆ\n⒗\t1\n홍\tᄒ\nṚ\tR\n납\tᄂ\nỊ\tI\nỘ\tO\nỆ\tE\nƯ\tU\n탁\tᄐ\n텔\tᄐ\n︵\t(\n따\tᄄ\n언\tᄋ\n약\tᄋ\n블\tᄇ\nǧ\tg\n장\tᄌ\n간\tᄀ\n⁷\t7\n쟁\tᄌ\n찔\tᄍ\n팥\tᄑ\n렘\tᄅ\n⁶\t6\n예\tᄋ\n불\tᄇ\nṮ\tT\n번\tᄇ\n층\tᄎ\n료\tᄅ\nᾶ\tα\n맨\tᄆ\n키\tᄏ\n효\tᄒ\nṀ\tM\nỡ\to\nḴ\tK\n⒅\t(\n노\tᄂ\n흠\tᄒ\nἹ\tΙ\n능\tᄂ\n없\tᄋ\n말\tᄆ\n레\tᄅ\n﹁\t\"\n﹂\t\"\n파\tᄑ\n℠\tS\n"
  },
  {
    "path": "Android/testlac/app/src/main/assets/lac_model/tag.dic",
    "content": "0\ta-B\n1\ta-I\n2\tad-B\n3\tad-I\n4\tan-B\n5\tan-I\n6\tc-B\n7\tc-I\n8\td-B\n9\td-I\n10\tf-B\n11\tf-I\n12\tm-B\n13\tm-I\n14\tn-B\n15\tn-I\n16\tnr-B\n17\tnr-I\n18\tns-B\n19\tns-I\n20\tnt-B\n21\tnt-I\n22\tnw-B\n23\tnw-I\n24\tnz-B\n25\tnz-I\n26\tp-B\n27\tp-I\n28\tq-B\n29\tq-I\n30\tr-B\n31\tr-I\n32\ts-B\n33\ts-I\n34\tt-B\n35\tt-I\n36\tu-B\n37\tu-I\n38\tv-B\n39\tv-I\n40\tvd-B\n41\tvd-I\n42\tvn-B\n43\tvn-I\n44\tw-B\n45\tw-I\n46\txc-B\n47\txc-I\n16\tPER-B\n17\tPER-I\n18\tLOC-B\n19\tLOC-I\n20\tORG-B\n21\tORG-I\n34\tTIME-B\n35\tTIME-I\n48\tO\n"
  },
  {
    "path": "Android/testlac/app/src/main/assets/lac_model/word.dic",
    "content": "0\t \n1\t!\n2\t\"\n3\t#\n4\t$\n5\t%\n6\t&\n7\t(\n8\t)\n9\t*\n10\t+\n11\t,\n12\t-\n13\t.\n14\t/\n15\t0\n16\t1\n17\t2\n18\t3\n19\t4\n20\t5\n21\t6\n22\t7\n23\t8\n24\t9\n25\t:\n26\t;\n27\t<\n28\t=\n29\t>\n30\t?\n31\t@\n32\tA\n33\tB\n34\tC\n35\tD\n36\tE\n37\tF\n38\tG\n39\tH\n40\tI\n41\tJ\n42\tK\n43\tL\n44\tM\n45\tN\n46\tO\n47\tP\n48\tQ\n49\tR\n50\tS\n51\tT\n52\tU\n53\tV\n54\tW\n55\tX\n56\tY\n57\tZ\n58\t[\n59\t\\\n60\t]\n61\t^\n62\t_\n63\t`\n64\ta\n65\tb\n66\tc\n67\td\n68\te\n69\tf\n70\tg\n71\th\n72\ti\n73\tj\n74\tk\n75\tl\n76\tm\n77\tn\n78\to\n79\tp\n80\tq\n81\tr\n82\ts\n83\tt\n84\tu\n85\tv\n86\tw\n87\tx\n88\ty\n89\tz\n90\t{\n91\t|\n92\t}\n93\t~\n94\t\n95\t¢\n96\t£\n97\t¤\n98\t¥\n99\t§\n100\t«\n101\t®\n102\t°\n103\t±\n104\t·\n105\t»\n106\tÆ\n107\t×\n108\tØ\n109\tÞ\n110\tß\n111\tæ\n112\tð\n113\t÷\n114\tø\n115\tþ\n116\tĐ\n117\tđ\n118\tı\n119\tŁ\n120\tł\n121\tœ\n122\tə\n123\tɡ\n124\tʻ\n125\tʿ\n126\tˇ\n127\tˉ\n128\tˊ\n129\tˋ\n130\t́\n131\tΑ\n132\tΒ\n133\tΓ\n134\tΔ\n135\tΕ\n136\tΗ\n137\tΘ\n138\tΙ\n139\tΚ\n140\tΜ\n141\tΟ\n142\tΠ\n143\tΡ\n144\tΣ\n145\tΤ\n146\tΥ\n147\tΦ\n148\tΧ\n149\tΨ\n150\tΩ\n151\tα\n152\tβ\n153\tγ\n154\tδ\n155\tε\n156\tζ\n157\tη\n158\tθ\n159\tι\n160\tκ\n161\tλ\n162\tμ\n163\tν\n164\tξ\n165\tο\n166\tπ\n167\tρ\n168\tς\n169\tσ\n170\tτ\n171\tυ\n172\tφ\n173\tχ\n174\tψ\n175\tω\n176\tА\n177\tБ\n178\tВ\n179\tГ\n180\tД\n181\tЕ\n182\tЖ\n183\tЗ\n184\tИ\n185\tК\n186\tЛ\n187\tМ\n188\tН\n189\tО\n190\tП\n191\tР\n192\tС\n193\tТ\n194\tУ\n195\tФ\n196\tХ\n197\tЦ\n198\tЧ\n199\tШ\n200\tЩ\n201\tЪ\n202\tЫ\n203\tЬ\n204\tЭ\n205\tЮ\n206\tЯ\n207\tа\n208\tб\n209\tв\n210\tг\n211\tд\n212\tе\n213\tж\n214\tз\n215\tи\n216\tк\n217\tл\n218\tм\n219\tн\n220\tо\n221\tп\n222\tр\n223\tс\n224\tт\n225\tу\n226\tф\n227\tх\n228\tц\n229\tч\n230\tш\n231\tщ\n232\tъ\n233\tы\n234\tь\n235\tэ\n236\tю\n237\tя\n238\tі\n239\tј\n240\tա\n241\tא\n242\tב\n243\tד\n244\tה\n245\tו\n246\tח\n247\tי\n248\tל\n249\tמ\n250\tן\n251\tנ\n252\tס\n253\tע\n254\tק\n255\tר\n256\tש\n257\tת\n258\tا\n259\tب\n260\tة\n261\tت\n262\tج\n263\tح\n264\tد\n265\tر\n266\tس\n267\tش\n268\tع\n269\tف\n270\tل\n271\tم\n272\tن\n273\tه\n274\tو\n275\tي\n276\tی\n277\tं\n278\tक\n279\tग\n280\tज\n281\tत\n282\tद\n283\tन\n284\tप\n285\tब\n286\tम\n287\tय\n288\tर\n289\tल\n290\tव\n291\tस\n292\tह\n293\tा\n294\tि\n295\tी\n296\tु\n297\tे\n298\tो\n299\t्\n300\tা\n301\t்\n302\tන\n303\tර\n304\tව\n305\t්\n306\tා\n307\tි\n308\tු\n309\tෙ\n310\tง\n311\tน\n312\tม\n313\tร\n314\tอ\n315\tา\n316\tเ\n317\t་\n318\tᄀ\n319\tᄂ\n320\tᄃ\n321\tᄅ\n322\tᄆ\n323\tᄇ\n324\tᄉ\n325\tᄋ\n326\tᄌ\n327\tᄎ\n328\tᄒ\n329\t‐\n330\t–\n331\t―\n332\t„\n333\t†\n334\t‰\n335\t′\n336\t※\n337\t₤\n338\t€\n339\t←\n340\t↑\n341\t→\n342\t↓\n343\t↖\n344\t↗\n345\t↘\n346\t↙\n347\t∈\n348\t∏\n349\t∑\n350\t−\n351\t∕\n352\t√\n353\t∝\n354\t∞\n355\t∠\n356\t∣\n357\t∧\n358\t∨\n359\t∩\n360\t∪\n361\t∫\n362\t∮\n363\t∴\n364\t∵\n365\t∽\n366\t≈\n367\t≌\n368\t≡\n369\t≤\n370\t≥\n371\t⊕\n372\t⊙\n373\t⊥\n374\t⌒\n375\t━\n376\t│\n377\t┃\n378\t┄\n379\t┅\n380\t┈\n381\t┊\n382\t┋\n383\t┏\n384\t┓\n385\t┛\n386\t┦\n387\t┬\n388\t┳\n389\t┷\n390\t┻\n391\t╃\n392\t═\n393\t╟\n394\t╧\n395\t╬\n396\t╭\n397\t╮\n398\t╯\n399\t╰\n400\t╱\n401\t▁\n402\t▂\n403\t▃\n404\t▄\n405\t▅\n406\t▆\n407\t▇\n408\t█\n409\t▌\n410\t▓\n411\t■\n412\t□\n413\t▪\n414\t▲\n415\t△\n416\t▼\n417\t▽\n418\t◆\n419\t◇\n420\t○\n421\t◎\n422\t●\n423\t◢\n424\t◣\n425\t◤\n426\t◥\n427\t★\n428\t☆\n429\t♀\n430\t♂\n431\t❤\n432\t〃\n433\t々\n434\t〆\n435\t〇\n436\t《\n437\t》\n438\t〓\n439\tぁ\n440\tあ\n441\tぃ\n442\tい\n443\tぅ\n444\tう\n445\tぇ\n446\tえ\n447\tぉ\n448\tお\n449\tか\n450\tき\n451\tく\n452\tけ\n453\tこ\n454\tさ\n455\tし\n456\tす\n457\tせ\n458\tそ\n459\tた\n460\tち\n461\tっ\n462\tつ\n463\tて\n464\tと\n465\tな\n466\tに\n467\tぬ\n468\tね\n469\tの\n470\tは\n471\tひ\n472\tふ\n473\tへ\n474\tほ\n475\tま\n476\tみ\n477\tむ\n478\tめ\n479\tも\n480\tゃ\n481\tや\n482\tゅ\n483\tゆ\n484\tょ\n485\tよ\n486\tら\n487\tり\n488\tる\n489\tれ\n490\tろ\n491\tゎ\n492\tわ\n493\tゐ\n494\tゑ\n495\tを\n496\tん\n497\t゛\n498\t゜\n499\tゝ\n500\tァ\n501\tア\n502\tィ\n503\tイ\n504\tゥ\n505\tウ\n506\tェ\n507\tエ\n508\tォ\n509\tオ\n510\tカ\n511\tキ\n512\tク\n513\tケ\n514\tコ\n515\tサ\n516\tシ\n517\tス\n518\tセ\n519\tソ\n520\tタ\n521\tチ\n522\tッ\n523\tツ\n524\tテ\n525\tト\n526\tナ\n527\tニ\n528\tヌ\n529\tネ\n530\tノ\n531\tハ\n532\tヒ\n533\tフ\n534\tヘ\n535\tホ\n536\tマ\n537\tミ\n538\tム\n539\tメ\n540\tモ\n541\tャ\n542\tヤ\n543\tュ\n544\tユ\n545\tョ\n546\tヨ\n547\tラ\n548\tリ\n549\tル\n550\tレ\n551\tロ\n552\tワ\n553\tヲ\n554\tン\n555\tヶ\n556\tー\n557\tヽ\n558\tㄆ\n559\tㄇ\n560\tㄊ\n561\tㄋ\n562\tㄎ\n563\tㄏ\n564\tㄒ\n565\tㄚ\n566\tㄟ\n567\tㄣ\n568\tㄥ\n569\tㄧ\n570\tㄨ\n571\t䇲\n572\t䌷\n573\t䴘\n574\t䴙\n575\t䶮\n576\t一\n577\t丁\n578\t丂\n579\t七\n580\t丄\n581\t丅\n582\t丆\n583\t万\n584\t丈\n585\t上\n586\t下\n587\t丌\n588\t不\n589\t与\n590\t丏\n591\t丐\n592\t丑\n593\t专\n594\t且\n595\t丕\n596\t世\n597\t丗\n598\t丘\n599\t丙\n600\t业\n601\t丛\n602\t东\n603\t丝\n604\t丞\n605\t丢\n606\t两\n607\t严\n608\t丧\n609\t丨\n610\t个\n611\t丫\n612\t丬\n613\t中\n614\t丰\n615\t串\n616\t临\n617\t丶\n618\t丷\n619\t丸\n620\t丹\n621\t为\n622\t主\n623\t丼\n624\t丽\n625\t举\n626\t丿\n627\t乀\n628\t乁\n629\t乂\n630\t乃\n631\t乄\n632\t久\n633\t乇\n634\t么\n635\t义\n636\t之\n637\t乌\n638\t乍\n639\t乎\n640\t乏\n641\t乐\n642\t乒\n643\t乓\n644\t乔\n645\t乕\n646\t乖\n647\t乘\n648\t乙\n649\t乚\n650\t乛\n651\t乜\n652\t九\n653\t乞\n654\t也\n655\t习\n656\t乡\n657\t乣\n658\t书\n659\t乩\n660\t买\n661\t乱\n662\t乳\n663\t乸\n664\t亀\n665\t亅\n666\t了\n667\t亇\n668\t予\n669\t争\n670\t亊\n671\t事\n672\t二\n673\t亍\n674\t于\n675\t亏\n676\t云\n677\t互\n678\t亓\n679\t五\n680\t井\n681\t亖\n682\t亘\n683\t亚\n684\t些\n685\t亜\n686\t亟\n687\t亠\n688\t亡\n689\t亢\n690\t交\n691\t亥\n692\t亦\n693\t产\n694\t亨\n695\t亩\n696\t享\n697\t京\n698\t亭\n699\t亮\n700\t亰\n701\t亲\n702\t亳\n703\t亵\n704\t亶\n705\t亹\n706\t人\n707\t亻\n708\t亽\n709\t亿\n710\t什\n711\t仁\n712\t仂\n713\t仃\n714\t仄\n715\t仅\n716\t仆\n717\t仇\n718\t仉\n719\t今\n720\t介\n721\t仍\n722\t从\n723\t仏\n724\t仐\n725\t仑\n726\t仓\n727\t仔\n728\t仕\n729\t他\n730\t仗\n731\t付\n732\t仙\n733\t仞\n734\t仟\n735\t仡\n736\t代\n737\t令\n738\t以\n739\t仨\n740\t仪\n741\t仫\n742\t们\n743\t仮\n744\t仰\n745\t仲\n746\t仵\n747\t件\n748\t价\n749\t任\n750\t仼\n751\t份\n752\t仿\n753\t企\n754\t伈\n755\t伉\n756\t伊\n757\t伋\n758\t伍\n759\t伎\n760\t伏\n761\t伐\n762\t休\n763\t众\n764\t优\n765\t伙\n766\t会\n767\t伛\n768\t伝\n769\t伞\n770\t伟\n771\t传\n772\t伢\n773\t伤\n774\t伥\n775\t伦\n776\t伧\n777\t伩\n778\t伪\n779\t伫\n780\t伬\n781\t伯\n782\t估\n783\t伱\n784\t伲\n785\t伴\n786\t伶\n787\t伸\n788\t伺\n789\t似\n790\t伽\n791\t伾\n792\t佂\n793\t佃\n794\t但\n795\t佉\n796\t位\n797\t低\n798\t住\n799\t佐\n800\t佑\n801\t体\n802\t何\n803\t佗\n804\t余\n805\t佚\n806\t佛\n807\t作\n808\t佝\n809\t佞\n810\t佟\n811\t佢\n812\t佣\n813\t佤\n814\t佥\n815\t佧\n816\t佩\n817\t佬\n818\t佯\n819\t佰\n820\t佲\n821\t佳\n822\t佴\n823\t佶\n824\t佷\n825\t佺\n826\t佻\n827\t佼\n828\t佽\n829\t佾\n830\t使\n831\t侃\n832\t侄\n833\t侈\n834\t侉\n835\t例\n836\t侍\n837\t侎\n838\t侏\n839\t侑\n840\t侓\n841\t侗\n842\t侘\n843\t供\n844\t依\n845\t侠\n846\t価\n847\t侣\n848\t侥\n849\t侦\n850\t侧\n851\t侨\n852\t侩\n853\t侪\n854\t侬\n855\t侮\n856\t侯\n857\t侵\n858\t便\n859\t促\n860\t俄\n861\t俅\n862\t俆\n863\t俊\n864\t俎\n865\t俏\n866\t俐\n867\t俑\n868\t俗\n869\t俘\n870\t俚\n871\t俜\n872\t保\n873\t俞\n874\t俟\n875\t信\n876\t俢\n877\t俣\n878\t俤\n879\t俦\n880\t俨\n881\t俩\n882\t俪\n883\t俫\n884\t俬\n885\t俭\n886\t修\n887\t俯\n888\t俱\n889\t俳\n890\t俵\n891\t俶\n892\t俸\n893\t俺\n894\t俾\n895\t倌\n896\t倍\n897\t倏\n898\t倒\n899\t倓\n900\t倔\n901\t倘\n902\t候\n903\t倚\n904\t倜\n905\t倞\n906\t借\n907\t倡\n908\t値\n909\t倥\n910\t倦\n911\t倨\n912\t倩\n913\t倪\n914\t倬\n915\t倭\n916\t倮\n917\t倶\n918\t债\n919\t倻\n920\t值\n921\t倾\n922\t偁\n923\t偃\n924\t假\n925\t偈\n926\t偌\n927\t偎\n928\t偏\n929\t偓\n930\t偕\n931\t做\n932\t停\n933\t偞\n934\t健\n935\t偬\n936\t偲\n937\t偶\n938\t偷\n939\t偸\n940\t偻\n941\t偾\n942\t偿\n943\t傀\n944\t傅\n945\t傈\n946\t傉\n947\t傍\n948\t傒\n949\t傕\n950\t傣\n951\t傥\n952\t傧\n953\t储\n954\t傩\n955\t催\n956\t傲\n957\t傻\n958\t像\n959\t僖\n960\t僚\n961\t僦\n962\t僧\n963\t僭\n964\t僮\n965\t僰\n966\t僳\n967\t僵\n968\t僻\n969\t僾\n970\t儆\n971\t儋\n972\t儒\n973\t儚\n974\t儡\n975\t儿\n976\t兀\n977\t允\n978\t元\n979\t兄\n980\t充\n981\t兆\n982\t先\n983\t光\n984\t克\n985\t免\n986\t児\n987\t兑\n988\t兔\n989\t兕\n990\t兖\n991\t党\n992\t兜\n993\t兢\n994\t入\n995\t全\n996\t八\n997\t公\n998\t六\n999\t兮\n1000\t兰\n1001\t共\n1002\t兲\n1003\t关\n1004\t兴\n1005\t兵\n1006\t其\n1007\t具\n1008\t典\n1009\t兹\n1010\t养\n1011\t兼\n1012\t兽\n1013\t兿\n1014\t冀\n1015\t冂\n1016\t冃\n1017\t内\n1018\t円\n1019\t冈\n1020\t冉\n1021\t册\n1022\t再\n1023\t冏\n1024\t冒\n1025\t冕\n1026\t冖\n1027\t冗\n1028\t写\n1029\t冚\n1030\t军\n1031\t农\n1032\t冠\n1033\t冢\n1034\t冤\n1035\t冥\n1036\t冦\n1037\t冧\n1038\t冨\n1039\t冫\n1040\t冬\n1041\t冮\n1042\t冯\n1043\t冰\n1044\t冲\n1045\t决\n1046\t冴\n1047\t况\n1048\t冶\n1049\t冷\n1050\t冻\n1051\t冼\n1052\t冽\n1053\t冿\n1054\t净\n1055\t凃\n1056\t凄\n1057\t准\n1058\t凇\n1059\t凉\n1060\t凊\n1061\t凋\n1062\t凌\n1063\t减\n1064\t凑\n1065\t凔\n1066\t凖\n1067\t凛\n1068\t凝\n1069\t几\n1070\t凡\n1071\t凤\n1072\t凪\n1073\t凫\n1074\t凭\n1075\t凯\n1076\t凰\n1077\t凳\n1078\t凶\n1079\t凸\n1080\t凹\n1081\t出\n1082\t击\n1083\t凼\n1084\t函\n1085\t凿\n1086\t刀\n1087\t刁\n1088\t刂\n1089\t刃\n1090\t分\n1091\t切\n1092\t刈\n1093\t刊\n1094\t刍\n1095\t刎\n1096\t刑\n1097\t划\n1098\t刖\n1099\t列\n1100\t刘\n1101\t则\n1102\t刚\n1103\t初\n1104\t删\n1105\t判\n1106\t利\n1107\t别\n1108\t刬\n1109\t刮\n1110\t到\n1111\t制\n1112\t刷\n1113\t券\n1114\t刹\n1115\t刺\n1116\t刻\n1117\t刽\n1118\t刿\n1119\t剀\n1120\t剁\n1121\t剂\n1122\t剃\n1123\t削\n1124\t剌\n1125\t前\n1126\t剐\n1127\t剑\n1128\t剔\n1129\t剖\n1130\t剜\n1131\t剡\n1132\t剣\n1133\t剤\n1134\t剥\n1135\t剧\n1136\t剩\n1137\t剪\n1138\t副\n1139\t剰\n1140\t割\n1141\t創\n1142\t剽\n1143\t剿\n1144\t力\n1145\t劝\n1146\t办\n1147\t功\n1148\t加\n1149\t务\n1150\t劢\n1151\t劣\n1152\t助\n1153\t努\n1154\t劫\n1155\t劬\n1156\t劭\n1157\t励\n1158\t劲\n1159\t劳\n1160\t労\n1161\t劻\n1162\t劼\n1163\t劾\n1164\t势\n1165\t勃\n1166\t勇\n1167\t勉\n1168\t勋\n1169\t勍\n1170\t勐\n1171\t勒\n1172\t動\n1173\t勖\n1174\t勘\n1175\t募\n1176\t勤\n1177\t勥\n1178\t勫\n1179\t勰\n1180\t勲\n1181\t勺\n1182\t勾\n1183\t勿\n1184\t匀\n1185\t匂\n1186\t包\n1187\t匆\n1188\t匈\n1189\t匍\n1190\t匏\n1191\t匐\n1192\t匕\n1193\t化\n1194\t北\n1195\t匙\n1196\t匚\n1197\t匝\n1198\t匠\n1199\t匡\n1200\t匣\n1201\t匪\n1202\t匮\n1203\t匹\n1204\t区\n1205\t医\n1206\t匾\n1207\t匿\n1208\t十\n1209\t千\n1210\t卅\n1211\t升\n1212\t午\n1213\t卉\n1214\t半\n1215\t卌\n1216\t卍\n1217\t华\n1218\t协\n1219\t卐\n1220\t卑\n1221\t卒\n1222\t卓\n1223\t单\n1224\t卖\n1225\t南\n1226\t単\n1227\t博\n1228\t卜\n1229\t卞\n1230\t卟\n1231\t占\n1232\t卡\n1233\t卢\n1234\t卣\n1235\t卤\n1236\t卦\n1237\t卧\n1238\t卩\n1239\t卫\n1240\t卮\n1241\t卯\n1242\t印\n1243\t危\n1244\t卲\n1245\t即\n1246\t却\n1247\t卵\n1248\t卷\n1249\t卸\n1250\t卺\n1251\t卿\n1252\t厂\n1253\t厄\n1254\t厅\n1255\t历\n1256\t厉\n1257\t压\n1258\t厌\n1259\t厍\n1260\t厓\n1261\t厕\n1262\t厘\n1263\t厚\n1264\t厝\n1265\t厡\n1266\t厢\n1267\t厥\n1268\t厦\n1269\t厨\n1270\t厩\n1271\t厮\n1272\t厳\n1273\t厶\n1274\t厷\n1275\t去\n1276\t县\n1277\t叁\n1278\t參\n1279\t叆\n1280\t又\n1281\t叉\n1282\t及\n1283\t友\n1284\t双\n1285\t反\n1286\t发\n1287\t叒\n1288\t叔\n1289\t叕\n1290\t取\n1291\t受\n1292\t变\n1293\t叙\n1294\t叛\n1295\t叟\n1296\t叠\n1297\t口\n1298\t古\n1299\t句\n1300\t另\n1301\t叨\n1302\t叩\n1303\t只\n1304\t叫\n1305\t召\n1306\t叭\n1307\t叮\n1308\t可\n1309\t台\n1310\t叱\n1311\t史\n1312\t右\n1313\t叵\n1314\t叶\n1315\t号\n1316\t司\n1317\t叹\n1318\t叻\n1319\t叼\n1320\t叽\n1321\t吁\n1322\t吃\n1323\t各\n1324\t吅\n1325\t吆\n1326\t合\n1327\t吉\n1328\t吊\n1329\t吋\n1330\t同\n1331\t名\n1332\t后\n1333\t吏\n1334\t吐\n1335\t向\n1336\t吓\n1337\t吔\n1338\t吕\n1339\t吖\n1340\t吗\n1341\t吙\n1342\t君\n1343\t吝\n1344\t吞\n1345\t吟\n1346\t吠\n1347\t吡\n1348\t吣\n1349\t吥\n1350\t否\n1351\t吧\n1352\t吨\n1353\t吩\n1354\t含\n1355\t听\n1356\t吭\n1357\t吮\n1358\t启\n1359\t吱\n1360\t吲\n1361\t吴\n1362\t吵\n1363\t吸\n1364\t吹\n1365\t吻\n1366\t吼\n1367\t吽\n1368\t吾\n1369\t呀\n1370\t呃\n1371\t呆\n1372\t呈\n1373\t呉\n1374\t告\n1375\t呋\n1376\t呎\n1377\t呐\n1378\t呑\n1379\t呒\n1380\t呓\n1381\t呔\n1382\t呕\n1383\t呖\n1384\t呗\n1385\t员\n1386\t呙\n1387\t呛\n1388\t呜\n1389\t呢\n1390\t呤\n1391\t呦\n1392\t周\n1393\t呬\n1394\t呯\n1395\t呲\n1396\t味\n1397\t呴\n1398\t呵\n1399\t呷\n1400\t呸\n1401\t呻\n1402\t命\n1403\t咀\n1404\t咁\n1405\t咂\n1406\t咄\n1407\t咅\n1408\t咆\n1409\t咋\n1410\t和\n1411\t咎\n1412\t咏\n1413\t咐\n1414\t咒\n1415\t咔\n1416\t咕\n1417\t咖\n1418\t咗\n1419\t咘\n1420\t咙\n1421\t咚\n1422\t咛\n1423\t咝\n1424\t咡\n1425\t咣\n1426\t咤\n1427\t咥\n1428\t咦\n1429\t咧\n1430\t咨\n1431\t咩\n1432\t咪\n1433\t咫\n1434\t咬\n1435\t咭\n1436\t咯\n1437\t咱\n1438\t咳\n1439\t咵\n1440\t咸\n1441\t咻\n1442\t咽\n1443\t咾\n1444\t咿\n1445\t哀\n1446\t品\n1447\t哂\n1448\t哆\n1449\t哇\n1450\t哈\n1451\t哉\n1452\t哋\n1453\t哌\n1454\t响\n1455\t哎\n1456\t哏\n1457\t哐\n1458\t哑\n1459\t哒\n1460\t哓\n1461\t哔\n1462\t哕\n1463\t哗\n1464\t哙\n1465\t哚\n1466\t哝\n1467\t哞\n1468\t哟\n1469\t哥\n1470\t哦\n1471\t哧\n1472\t哨\n1473\t哩\n1474\t哪\n1475\t哭\n1476\t哮\n1477\t哲\n1478\t哹\n1479\t哺\n1480\t哻\n1481\t哼\n1482\t哽\n1483\t哾\n1484\t唁\n1485\t唂\n1486\t唃\n1487\t唅\n1488\t唆\n1489\t唇\n1490\t唈\n1491\t唉\n1492\t唊\n1493\t唋\n1494\t唌\n1495\t唍\n1496\t唎\n1497\t唏\n1498\t唐\n1499\t唑\n1500\t唒\n1501\t唓\n1502\t唔\n1503\t唖\n1504\t唗\n1505\t唙\n1506\t唛\n1507\t唜\n1508\t唝\n1509\t唞\n1510\t唠\n1511\t唢\n1512\t唣\n1513\t唤\n1514\t唧\n1515\t唬\n1516\t售\n1517\t唯\n1518\t唰\n1519\t唱\n1520\t唳\n1521\t唵\n1522\t唷\n1523\t唻\n1524\t唾\n1525\t唿\n1526\t啁\n1527\t啃\n1528\t啄\n1529\t商\n1530\t啇\n1531\t啉\n1532\t啊\n1533\t啐\n1534\t啕\n1535\t啖\n1536\t啜\n1537\t啡\n1538\t啤\n1539\t啥\n1540\t啦\n1541\t啧\n1542\t啪\n1543\t啫\n1544\t啬\n1545\t啭\n1546\t啮\n1547\t啰\n1548\t啲\n1549\t啵\n1550\t啶\n1551\t啷\n1552\t啸\n1553\t啻\n1554\t啼\n1555\t啾\n1556\t喀\n1557\t喁\n1558\t喂\n1559\t喃\n1560\t善\n1561\t喇\n1562\t喈\n1563\t喉\n1564\t喊\n1565\t喋\n1566\t喏\n1567\t喑\n1568\t喔\n1569\t喘\n1570\t喙\n1571\t喜\n1572\t喝\n1573\t喟\n1574\t喧\n1575\t喰\n1576\t喱\n1577\t喳\n1578\t喵\n1579\t営\n1580\t喷\n1581\t喹\n1582\t喻\n1583\t喽\n1584\t喾\n1585\t嗄\n1586\t嗅\n1587\t嗉\n1588\t嗌\n1589\t嗏\n1590\t嗑\n1591\t嗒\n1592\t嗓\n1593\t嗔\n1594\t嗖\n1595\t嗙\n1596\t嗜\n1597\t嗝\n1598\t嗞\n1599\t嗟\n1600\t嗡\n1601\t嗣\n1602\t嗤\n1603\t嗥\n1604\t嗦\n1605\t嗨\n1606\t嗪\n1607\t嗫\n1608\t嗮\n1609\t嗯\n1610\t嗲\n1611\t嗳\n1612\t嗵\n1613\t嗷\n1614\t嗽\n1615\t嘀\n1616\t嘁\n1617\t嘈\n1618\t嘉\n1619\t嘌\n1620\t嘎\n1621\t嘏\n1622\t嘘\n1623\t嘚\n1624\t嘛\n1625\t嘞\n1626\t嘟\n1627\t嘢\n1628\t嘣\n1629\t嘤\n1630\t嘦\n1631\t嘧\n1632\t嘬\n1633\t嘭\n1634\t嘱\n1635\t嘲\n1636\t嘴\n1637\t嘶\n1638\t嘹\n1639\t嘻\n1640\t嘼\n1641\t嘿\n1642\t噂\n1643\t噌\n1644\t噎\n1645\t噏\n1646\t噔\n1647\t噗\n1648\t噘\n1649\t噙\n1650\t噚\n1651\t噛\n1652\t噜\n1653\t噢\n1654\t噤\n1655\t器\n1656\t噩\n1657\t噪\n1658\t噫\n1659\t噬\n1660\t噱\n1661\t噶\n1662\t噺\n1663\t噻\n1664\t噼\n1665\t嚄\n1666\t嚅\n1667\t嚎\n1668\t嚏\n1669\t嚒\n1670\t嚓\n1671\t嚜\n1672\t嚞\n1673\t嚟\n1674\t嚣\n1675\t嚯\n1676\t嚷\n1677\t嚼\n1678\t囊\n1679\t囍\n1680\t囔\n1681\t囖\n1682\t囗\n1683\t囚\n1684\t四\n1685\t囝\n1686\t回\n1687\t囟\n1688\t因\n1689\t囡\n1690\t团\n1691\t団\n1692\t囤\n1693\t囧\n1694\t囩\n1695\t囫\n1696\t园\n1697\t囮\n1698\t困\n1699\t囱\n1700\t囲\n1701\t図\n1702\t围\n1703\t囵\n1704\t囷\n1705\t囹\n1706\t固\n1707\t国\n1708\t图\n1709\t囿\n1710\t圃\n1711\t圄\n1712\t圆\n1713\t圈\n1714\t圉\n1715\t圊\n1716\t圌\n1717\t圏\n1718\t圐\n1719\t圙\n1720\t圜\n1721\t圞\n1722\t土\n1723\t圣\n1724\t圧\n1725\t在\n1726\t圩\n1727\t圪\n1728\t圬\n1729\t圭\n1730\t圮\n1731\t圯\n1732\t地\n1733\t圳\n1734\t圹\n1735\t场\n1736\t圻\n1737\t圾\n1738\t址\n1739\t坂\n1740\t均\n1741\t坉\n1742\t坊\n1743\t坍\n1744\t坎\n1745\t坏\n1746\t坐\n1747\t坑\n1748\t块\n1749\t坚\n1750\t坛\n1751\t坜\n1752\t坝\n1753\t坞\n1754\t坟\n1755\t坠\n1756\t坡\n1757\t坤\n1758\t坦\n1759\t坨\n1760\t坩\n1761\t坪\n1762\t坭\n1763\t坯\n1764\t坳\n1765\t坷\n1766\t坻\n1767\t坼\n1768\t垂\n1769\t垃\n1770\t垄\n1771\t垆\n1772\t垈\n1773\t型\n1774\t垌\n1775\t垒\n1776\t垓\n1777\t垕\n1778\t垚\n1779\t垛\n1780\t垟\n1781\t垠\n1782\t垡\n1783\t垢\n1784\t垣\n1785\t垤\n1786\t垦\n1787\t垧\n1788\t垩\n1789\t垫\n1790\t垭\n1791\t垮\n1792\t垯\n1793\t垰\n1794\t垱\n1795\t垲\n1796\t垴\n1797\t垸\n1798\t垾\n1799\t埂\n1800\t埃\n1801\t埇\n1802\t埋\n1803\t埌\n1804\t城\n1805\t埏\n1806\t埒\n1807\t埔\n1808\t埕\n1809\t埗\n1810\t埘\n1811\t埙\n1812\t埚\n1813\t域\n1814\t埠\n1815\t埤\n1816\t埫\n1817\t埭\n1818\t埯\n1819\t埴\n1820\t埵\n1821\t埸\n1822\t培\n1823\t基\n1824\t埼\n1825\t堀\n1826\t堁\n1827\t堂\n1828\t堆\n1829\t堇\n1830\t堉\n1831\t堌\n1832\t堎\n1833\t堑\n1834\t堔\n1835\t堕\n1836\t堙\n1837\t堞\n1838\t堠\n1839\t堡\n1840\t堤\n1841\t堪\n1842\t堰\n1843\t堵\n1844\t堺\n1845\t堽\n1846\t塄\n1847\t塅\n1848\t塆\n1849\t塌\n1850\t塍\n1851\t塑\n1852\t塔\n1853\t塘\n1854\t塞\n1855\t塩\n1856\t填\n1857\t塬\n1858\t塯\n1859\t塱\n1860\t塾\n1861\t墀\n1862\t墁\n1863\t境\n1864\t墅\n1865\t墉\n1866\t墒\n1867\t墓\n1868\t増\n1869\t墘\n1870\t墙\n1871\t增\n1872\t墟\n1873\t墦\n1874\t墨\n1875\t墩\n1876\t壁\n1877\t壅\n1878\t壆\n1879\t壊\n1880\t壑\n1881\t壕\n1882\t壤\n1883\t士\n1884\t壬\n1885\t壮\n1886\t声\n1887\t壱\n1888\t売\n1889\t壳\n1890\t壶\n1891\t壷\n1892\t壸\n1893\t壹\n1894\t夂\n1895\t处\n1896\t夆\n1897\t备\n1898\t変\n1899\t夊\n1900\t夋\n1901\t夌\n1902\t复\n1903\t夏\n1904\t夔\n1905\t夕\n1906\t外\n1907\t夙\n1908\t多\n1909\t夜\n1910\t够\n1911\t夤\n1912\t大\n1913\t夨\n1914\t天\n1915\t太\n1916\t夫\n1917\t夬\n1918\t夭\n1919\t央\n1920\t夯\n1921\t失\n1922\t夲\n1923\t头\n1924\t夷\n1925\t夸\n1926\t夹\n1927\t夺\n1928\t夼\n1929\t奀\n1930\t奁\n1931\t奂\n1932\t奄\n1933\t奇\n1934\t奈\n1935\t奉\n1936\t奋\n1937\t奌\n1938\t奎\n1939\t奏\n1940\t契\n1941\t奓\n1942\t奔\n1943\t奕\n1944\t奖\n1945\t套\n1946\t奘\n1947\t奚\n1948\t奠\n1949\t奢\n1950\t奤\n1951\t奥\n1952\t奭\n1953\t女\n1954\t奴\n1955\t奶\n1956\t奷\n1957\t奸\n1958\t她\n1959\t好\n1960\t妁\n1961\t如\n1962\t妃\n1963\t妄\n1964\t妆\n1965\t妇\n1966\t妈\n1967\t妊\n1968\t妍\n1969\t妏\n1970\t妒\n1971\t妓\n1972\t妖\n1973\t妗\n1974\t妘\n1975\t妙\n1976\t妞\n1977\t妠\n1978\t妣\n1979\t妤\n1980\t妥\n1981\t妨\n1982\t妩\n1983\t妪\n1984\t妫\n1985\t妮\n1986\t妯\n1987\t妲\n1988\t妹\n1989\t妺\n1990\t妻\n1991\t妾\n1992\t姁\n1993\t姆\n1994\t姊\n1995\t始\n1996\t姌\n1997\t姐\n1998\t姑\n1999\t姒\n2000\t姓\n2001\t委\n2002\t姗\n2003\t姘\n2004\t姚\n2005\t姜\n2006\t姝\n2007\t姣\n2008\t姤\n2009\t姥\n2010\t姧\n2011\t姨\n2012\t姫\n2013\t姬\n2014\t姮\n2015\t姱\n2016\t姳\n2017\t姵\n2018\t姹\n2019\t姻\n2020\t姽\n2021\t姿\n2022\t威\n2023\t娃\n2024\t娄\n2025\t娅\n2026\t娆\n2027\t娇\n2028\t娈\n2029\t娉\n2030\t娌\n2031\t娑\n2032\t娓\n2033\t娘\n2034\t娚\n2035\t娜\n2036\t娟\n2037\t娠\n2038\t娡\n2039\t娣\n2040\t娥\n2041\t娩\n2042\t娭\n2043\t娱\n2044\t娲\n2045\t娴\n2046\t娶\n2047\t娼\n2048\t婀\n2049\t婆\n2050\t婉\n2051\t婊\n2052\t婍\n2053\t婐\n2054\t婓\n2055\t婕\n2056\t婖\n2057\t婘\n2058\t婚\n2059\t婠\n2060\t婢\n2061\t婥\n2062\t婧\n2063\t婪\n2064\t婲\n2065\t婳\n2066\t婴\n2067\t婵\n2068\t婶\n2069\t婷\n2070\t婺\n2071\t婼\n2072\t婿\n2073\t媂\n2074\t媃\n2075\t媄\n2076\t媒\n2077\t媗\n2078\t媚\n2079\t媛\n2080\t媜\n2081\t媞\n2082\t媤\n2083\t媪\n2084\t媱\n2085\t媲\n2086\t媳\n2087\t媵\n2088\t媸\n2089\t媺\n2090\t媾\n2091\t嫁\n2092\t嫂\n2093\t嫄\n2094\t嫉\n2095\t嫌\n2096\t嫐\n2097\t嫑\n2098\t嫒\n2099\t嫔\n2100\t嫖\n2101\t嫘\n2102\t嫚\n2103\t嫠\n2104\t嫡\n2105\t嫣\n2106\t嫤\n2107\t嫦\n2108\t嫩\n2109\t嫪\n2110\t嫫\n2111\t嫱\n2112\t嫲\n2113\t嫽\n2114\t嬅\n2115\t嬉\n2116\t嬖\n2117\t嬗\n2118\t嬛\n2119\t嬢\n2120\t嬬\n2121\t嬲\n2122\t嬴\n2123\t嬷\n2124\t嬿\n2125\t孀\n2126\t子\n2127\t孑\n2128\t孒\n2129\t孓\n2130\t孔\n2131\t孕\n2132\t孖\n2133\t字\n2134\t存\n2135\t孙\n2136\t孚\n2137\t孛\n2138\t孜\n2139\t孝\n2140\t孟\n2141\t孢\n2142\t季\n2143\t孤\n2144\t孥\n2145\t学\n2146\t孧\n2147\t孩\n2148\t孪\n2149\t孬\n2150\t孰\n2151\t孱\n2152\t孳\n2153\t孵\n2154\t孺\n2155\t孽\n2156\t宀\n2157\t宁\n2158\t它\n2159\t宅\n2160\t宇\n2161\t守\n2162\t安\n2163\t宋\n2164\t完\n2165\t宍\n2166\t宏\n2167\t宓\n2168\t宔\n2169\t宕\n2170\t宗\n2171\t官\n2172\t宙\n2173\t定\n2174\t宛\n2175\t宜\n2176\t宝\n2177\t实\n2178\t実\n2179\t宠\n2180\t审\n2181\t客\n2182\t宣\n2183\t室\n2184\t宥\n2185\t宦\n2186\t宪\n2187\t宫\n2188\t宬\n2189\t宰\n2190\t害\n2191\t宴\n2192\t宵\n2193\t家\n2194\t宸\n2195\t容\n2196\t宽\n2197\t宾\n2198\t宿\n2199\t寂\n2200\t寄\n2201\t寅\n2202\t密\n2203\t寇\n2204\t富\n2205\t寐\n2206\t寒\n2207\t寓\n2208\t寛\n2209\t寝\n2210\t寞\n2211\t察\n2212\t寡\n2213\t寤\n2214\t寥\n2215\t寨\n2216\t寮\n2217\t寯\n2218\t寰\n2219\t寸\n2220\t对\n2221\t寺\n2222\t寻\n2223\t导\n2224\t対\n2225\t寿\n2226\t封\n2227\t専\n2228\t射\n2229\t将\n2230\t尉\n2231\t尊\n2232\t小\n2233\t尐\n2234\t少\n2235\t尓\n2236\t尔\n2237\t尕\n2238\t尖\n2239\t尘\n2240\t尚\n2241\t尛\n2242\t尜\n2243\t尝\n2244\t尢\n2245\t尤\n2246\t尥\n2247\t尧\n2248\t尨\n2249\t尪\n2250\t尬\n2251\t就\n2252\t尴\n2253\t尸\n2254\t尹\n2255\t尺\n2256\t尻\n2257\t尼\n2258\t尽\n2259\t尾\n2260\t尿\n2261\t局\n2262\t屁\n2263\t层\n2264\t屃\n2265\t屄\n2266\t居\n2267\t屈\n2268\t屉\n2269\t届\n2270\t屋\n2271\t屌\n2272\t屎\n2273\t屏\n2274\t屐\n2275\t屑\n2276\t展\n2277\t属\n2278\t屠\n2279\t屡\n2280\t屣\n2281\t履\n2282\t屦\n2283\t屮\n2284\t屯\n2285\t山\n2286\t屹\n2287\t屺\n2288\t屾\n2289\t屿\n2290\t岀\n2291\t岁\n2292\t岂\n2293\t岈\n2294\t岌\n2295\t岐\n2296\t岑\n2297\t岒\n2298\t岔\n2299\t岕\n2300\t岖\n2301\t岗\n2302\t岘\n2303\t岙\n2304\t岚\n2305\t岛\n2306\t岜\n2307\t岞\n2308\t岠\n2309\t岢\n2310\t岣\n2311\t岩\n2312\t岫\n2313\t岬\n2314\t岭\n2315\t岱\n2316\t岳\n2317\t岵\n2318\t岷\n2319\t岸\n2320\t岺\n2321\t岽\n2322\t岿\n2323\t峁\n2324\t峃\n2325\t峄\n2326\t峇\n2327\t峋\n2328\t峎\n2329\t峒\n2330\t峘\n2331\t峙\n2332\t峚\n2333\t峠\n2334\t峡\n2335\t峣\n2336\t峤\n2337\t峥\n2338\t峦\n2339\t峨\n2340\t峪\n2341\t峭\n2342\t峰\n2343\t峻\n2344\t崀\n2345\t崁\n2346\t崂\n2347\t崃\n2348\t崆\n2349\t崇\n2350\t崋\n2351\t崎\n2352\t崔\n2353\t崖\n2354\t崚\n2355\t崛\n2356\t崟\n2357\t崤\n2358\t崦\n2359\t崩\n2360\t崭\n2361\t崮\n2362\t崴\n2363\t崽\n2364\t嵇\n2365\t嵊\n2366\t嵋\n2367\t嵌\n2368\t嵎\n2369\t嵕\n2370\t嵖\n2371\t嵘\n2372\t嵚\n2373\t嵛\n2374\t嵝\n2375\t嵨\n2376\t嵩\n2377\t嵬\n2378\t嵯\n2379\t嵴\n2380\t嶂\n2381\t嶅\n2382\t嶋\n2383\t嶌\n2384\t嶙\n2385\t嶝\n2386\t嶶\n2387\t嶷\n2388\t巅\n2389\t巆\n2390\t巉\n2391\t巍\n2392\t巕\n2393\t巛\n2394\t巜\n2395\t川\n2396\t州\n2397\t巡\n2398\t巢\n2399\t巣\n2400\t工\n2401\t左\n2402\t巧\n2403\t巨\n2404\t巩\n2405\t巫\n2406\t巭\n2407\t差\n2408\t巯\n2409\t己\n2410\t已\n2411\t巳\n2412\t巴\n2413\t巷\n2414\t巻\n2415\t巽\n2416\t巾\n2417\t巿\n2418\t币\n2419\t市\n2420\t布\n2421\t帅\n2422\t帆\n2423\t师\n2424\t希\n2425\t帏\n2426\t帐\n2427\t帑\n2428\t帔\n2429\t帕\n2430\t帖\n2431\t帘\n2432\t帙\n2433\t帚\n2434\t帛\n2435\t帜\n2436\t帝\n2437\t带\n2438\t帧\n2439\t席\n2440\t帮\n2441\t帯\n2442\t帰\n2443\t帷\n2444\t常\n2445\t帻\n2446\t帼\n2447\t帽\n2448\t幂\n2449\t幄\n2450\t幅\n2451\t幌\n2452\t幔\n2453\t幕\n2454\t幛\n2455\t幞\n2456\t幡\n2457\t幢\n2458\t幪\n2459\t干\n2460\t平\n2461\t年\n2462\t并\n2463\t幸\n2464\t幻\n2465\t幼\n2466\t幽\n2467\t广\n2468\t庁\n2469\t広\n2470\t庄\n2471\t庆\n2472\t庇\n2473\t床\n2474\t序\n2475\t庐\n2476\t庑\n2477\t庒\n2478\t库\n2479\t应\n2480\t底\n2481\t庖\n2482\t店\n2483\t庙\n2484\t庚\n2485\t府\n2486\t庝\n2487\t庞\n2488\t废\n2489\t庠\n2490\t庡\n2491\t庤\n2492\t庥\n2493\t度\n2494\t座\n2495\t庭\n2496\t庵\n2497\t庶\n2498\t康\n2499\t庸\n2500\t庹\n2501\t庾\n2502\t廃\n2503\t廆\n2504\t廉\n2505\t廊\n2506\t廋\n2507\t廌\n2508\t廓\n2509\t廖\n2510\t廛\n2511\t廨\n2512\t廪\n2513\t廯\n2514\t廰\n2515\t延\n2516\t廷\n2517\t建\n2518\t廿\n2519\t开\n2520\t弁\n2521\t异\n2522\t弃\n2523\t弄\n2524\t弇\n2525\t弈\n2526\t弊\n2527\t弋\n2528\t弎\n2529\t式\n2530\t弐\n2531\t弑\n2532\t弓\n2533\t引\n2534\t弗\n2535\t弘\n2536\t弛\n2537\t弟\n2538\t张\n2539\t弢\n2540\t弥\n2541\t弦\n2542\t弧\n2543\t弩\n2544\t弭\n2545\t弯\n2546\t弱\n2547\t弶\n2548\t弹\n2549\t强\n2550\t弼\n2551\t弾\n2552\t彀\n2553\t彐\n2554\t归\n2555\t当\n2556\t录\n2557\t彖\n2558\t彗\n2559\t彘\n2560\t彝\n2561\t彡\n2562\t形\n2563\t彤\n2564\t彦\n2565\t彧\n2566\t彩\n2567\t彪\n2568\t彬\n2569\t彭\n2570\t彰\n2571\t影\n2572\t彳\n2573\t彷\n2574\t役\n2575\t彻\n2576\t彼\n2577\t往\n2578\t征\n2579\t徂\n2580\t径\n2581\t待\n2582\t徇\n2583\t很\n2584\t徉\n2585\t徊\n2586\t律\n2587\t徍\n2588\t徐\n2589\t徒\n2590\t従\n2591\t徕\n2592\t得\n2593\t徘\n2594\t徙\n2595\t徜\n2596\t御\n2597\t徦\n2598\t徨\n2599\t循\n2600\t徭\n2601\t微\n2602\t徳\n2603\t徴\n2604\t德\n2605\t徻\n2606\t徼\n2607\t徽\n2608\t心\n2609\t忄\n2610\t必\n2611\t忆\n2612\t忌\n2613\t忍\n2614\t忏\n2615\t忐\n2616\t忑\n2617\t忒\n2618\t忓\n2619\t忔\n2620\t忖\n2621\t志\n2622\t忘\n2623\t忙\n2624\t忛\n2625\t応\n2626\t忝\n2627\t忞\n2628\t忠\n2629\t忡\n2630\t忤\n2631\t忧\n2632\t忪\n2633\t快\n2634\t忱\n2635\t念\n2636\t忸\n2637\t忻\n2638\t忽\n2639\t忾\n2640\t忿\n2641\t怀\n2642\t态\n2643\t怂\n2644\t怃\n2645\t怄\n2646\t怅\n2647\t怆\n2648\t怍\n2649\t怎\n2650\t怏\n2651\t怒\n2652\t怔\n2653\t怕\n2654\t怖\n2655\t怙\n2656\t怛\n2657\t怜\n2658\t思\n2659\t怠\n2660\t怡\n2661\t急\n2662\t怦\n2663\t性\n2664\t怨\n2665\t怩\n2666\t怪\n2667\t怫\n2668\t怮\n2669\t怯\n2670\t怹\n2671\t总\n2672\t怼\n2673\t怿\n2674\t恁\n2675\t恂\n2676\t恃\n2677\t恋\n2678\t恍\n2679\t恐\n2680\t恒\n2681\t恓\n2682\t恕\n2683\t恖\n2684\t恘\n2685\t恙\n2686\t恚\n2687\t恢\n2688\t恣\n2689\t恤\n2690\t恨\n2691\t恩\n2692\t恪\n2693\t恫\n2694\t恬\n2695\t恭\n2696\t息\n2697\t恰\n2698\t恳\n2699\t恵\n2700\t恶\n2701\t恸\n2702\t恹\n2703\t恺\n2704\t恻\n2705\t恼\n2706\t恽\n2707\t恿\n2708\t悄\n2709\t悉\n2710\t悌\n2711\t悍\n2712\t悒\n2713\t悔\n2714\t悕\n2715\t悖\n2716\t悚\n2717\t悛\n2718\t悝\n2719\t悟\n2720\t悠\n2721\t患\n2722\t悦\n2723\t您\n2724\t悩\n2725\t悪\n2726\t悫\n2727\t悬\n2728\t悭\n2729\t悯\n2730\t悱\n2731\t悲\n2732\t悳\n2733\t悴\n2734\t悸\n2735\t悻\n2736\t悼\n2737\t悾\n2738\t情\n2739\t惆\n2740\t惇\n2741\t惊\n2742\t惋\n2743\t惑\n2744\t惔\n2745\t惕\n2746\t惘\n2747\t惚\n2748\t惜\n2749\t惟\n2750\t惠\n2751\t惢\n2752\t惣\n2753\t惦\n2754\t惧\n2755\t惨\n2756\t惩\n2757\t惫\n2758\t惬\n2759\t惭\n2760\t惮\n2761\t惯\n2762\t惰\n2763\t想\n2764\t惴\n2765\t惶\n2766\t惹\n2767\t惺\n2768\t愀\n2769\t愁\n2770\t愆\n2771\t愈\n2772\t愉\n2773\t愍\n2774\t愎\n2775\t意\n2776\t愔\n2777\t愕\n2778\t愙\n2779\t愚\n2780\t感\n2781\t愠\n2782\t愢\n2783\t愣\n2784\t愤\n2785\t愧\n2786\t愫\n2787\t愿\n2788\t慈\n2789\t慊\n2790\t慌\n2791\t慎\n2792\t慑\n2793\t慕\n2794\t慜\n2795\t慢\n2796\t慧\n2797\t慨\n2798\t慰\n2799\t慱\n2800\t慵\n2801\t慷\n2802\t憋\n2803\t憎\n2804\t憔\n2805\t憝\n2806\t憣\n2807\t憧\n2808\t憨\n2809\t憩\n2810\t憬\n2811\t憷\n2812\t憾\n2813\t懂\n2814\t懆\n2815\t懈\n2816\t懊\n2817\t懋\n2818\t懐\n2819\t懑\n2820\t懒\n2821\t懓\n2822\t懦\n2823\t懵\n2824\t懿\n2825\t戆\n2826\t戈\n2827\t戊\n2828\t戋\n2829\t戌\n2830\t戍\n2831\t戎\n2832\t戏\n2833\t成\n2834\t我\n2835\t戒\n2836\t戕\n2837\t或\n2838\t戗\n2839\t战\n2840\t戚\n2841\t戛\n2842\t戝\n2843\t戟\n2844\t戠\n2845\t戡\n2846\t戢\n2847\t戥\n2848\t戦\n2849\t截\n2850\t戬\n2851\t戮\n2852\t戳\n2853\t戴\n2854\t户\n2855\t戸\n2856\t戻\n2857\t戽\n2858\t戾\n2859\t房\n2860\t所\n2861\t扁\n2862\t扃\n2863\t扆\n2864\t扇\n2865\t扈\n2866\t扉\n2867\t手\n2868\t扌\n2869\t才\n2870\t扎\n2871\t扑\n2872\t扒\n2873\t打\n2874\t扔\n2875\t払\n2876\t扛\n2877\t扣\n2878\t扥\n2879\t扦\n2880\t执\n2881\t扩\n2882\t扪\n2883\t扫\n2884\t扬\n2885\t扭\n2886\t扮\n2887\t扯\n2888\t扰\n2889\t扱\n2890\t扳\n2891\t扶\n2892\t批\n2893\t扼\n2894\t扽\n2895\t找\n2896\t承\n2897\t技\n2898\t抄\n2899\t抉\n2900\t把\n2901\t抑\n2902\t抒\n2903\t抓\n2904\t抔\n2905\t投\n2906\t抖\n2907\t抗\n2908\t折\n2909\t抚\n2910\t抛\n2911\t抜\n2912\t択\n2913\t抟\n2914\t抠\n2915\t抡\n2916\t抢\n2917\t护\n2918\t报\n2919\t抨\n2920\t披\n2921\t抬\n2922\t抱\n2923\t抵\n2924\t抹\n2925\t抺\n2926\t抻\n2927\t押\n2928\t抽\n2929\t抿\n2930\t拂\n2931\t拄\n2932\t担\n2933\t拆\n2934\t拇\n2935\t拈\n2936\t拉\n2937\t拊\n2938\t拌\n2939\t拍\n2940\t拎\n2941\t拐\n2942\t拒\n2943\t拓\n2944\t拔\n2945\t拖\n2946\t拗\n2947\t拘\n2948\t拙\n2949\t招\n2950\t拜\n2951\t拝\n2952\t拟\n2953\t拠\n2954\t拡\n2955\t拢\n2956\t拣\n2957\t拥\n2958\t拦\n2959\t拧\n2960\t拨\n2961\t择\n2962\t括\n2963\t拭\n2964\t拮\n2965\t拯\n2966\t拱\n2967\t拳\n2968\t拴\n2969\t拶\n2970\t拷\n2971\t拼\n2972\t拽\n2973\t拿\n2974\t持\n2975\t挂\n2976\t指\n2977\t挈\n2978\t按\n2979\t挎\n2980\t挑\n2981\t挖\n2982\t挙\n2983\t挚\n2984\t挛\n2985\t挝\n2986\t挞\n2987\t挟\n2988\t挠\n2989\t挡\n2990\t挢\n2991\t挣\n2992\t挤\n2993\t挥\n2994\t挨\n2995\t挪\n2996\t挫\n2997\t振\n2998\t挲\n2999\t挹\n3000\t挺\n3001\t挽\n3002\t挿\n3003\t捂\n3004\t捅\n3005\t捆\n3006\t捉\n3007\t捋\n3008\t捌\n3009\t捍\n3010\t捎\n3011\t捏\n3012\t捐\n3013\t捕\n3014\t捜\n3015\t捞\n3016\t损\n3017\t捡\n3018\t换\n3019\t捣\n3020\t捧\n3021\t捩\n3022\t捭\n3023\t据\n3024\t捯\n3025\t捰\n3026\t捱\n3027\t捶\n3028\t捷\n3029\t捺\n3030\t捻\n3031\t掀\n3032\t掂\n3033\t掇\n3034\t授\n3035\t掉\n3036\t掌\n3037\t掏\n3038\t掐\n3039\t排\n3040\t掖\n3041\t掘\n3042\t掟\n3043\t掠\n3044\t探\n3045\t掣\n3046\t接\n3047\t控\n3048\t推\n3049\t掩\n3050\t措\n3051\t掬\n3052\t掮\n3053\t掰\n3054\t掱\n3055\t掲\n3056\t掳\n3057\t掴\n3058\t掷\n3059\t掸\n3060\t掹\n3061\t掺\n3062\t掼\n3063\t掾\n3064\t揄\n3065\t揆\n3066\t揉\n3067\t揍\n3068\t描\n3069\t提\n3070\t插\n3071\t揖\n3072\t揠\n3073\t握\n3074\t揣\n3075\t揩\n3076\t揪\n3077\t揭\n3078\t援\n3079\t揵\n3080\t揶\n3081\t揸\n3082\t揺\n3083\t揽\n3084\t揾\n3085\t揿\n3086\t搀\n3087\t搁\n3088\t搂\n3089\t搅\n3090\t搋\n3091\t搏\n3092\t搐\n3093\t搓\n3094\t搔\n3095\t搜\n3096\t搞\n3097\t搡\n3098\t搦\n3099\t搪\n3100\t搬\n3101\t搭\n3102\t搴\n3103\t携\n3104\t搽\n3105\t摁\n3106\t摄\n3107\t摆\n3108\t摇\n3109\t摈\n3110\t摊\n3111\t摒\n3112\t摔\n3113\t摘\n3114\t摛\n3115\t摞\n3116\t摧\n3117\t摩\n3118\t摫\n3119\t摭\n3120\t摸\n3121\t摹\n3122\t摽\n3123\t撂\n3124\t撄\n3125\t撅\n3126\t撇\n3127\t撑\n3128\t撒\n3129\t撕\n3130\t撘\n3131\t撞\n3132\t撤\n3133\t撩\n3134\t撬\n3135\t播\n3136\t撮\n3137\t撰\n3138\t撵\n3139\t撷\n3140\t撸\n3141\t撺\n3142\t撼\n3143\t擀\n3144\t擂\n3145\t擅\n3146\t操\n3147\t擎\n3148\t擒\n3149\t擘\n3150\t擞\n3151\t擢\n3152\t擤\n3153\t擦\n3154\t攀\n3155\t攉\n3156\t攒\n3157\t攘\n3158\t攞\n3159\t攥\n3160\t攫\n3161\t支\n3162\t攵\n3163\t收\n3164\t攸\n3165\t改\n3166\t攻\n3167\t放\n3168\t政\n3169\t故\n3170\t效\n3171\t敌\n3172\t敏\n3173\t救\n3174\t敓\n3175\t敔\n3176\t敕\n3177\t敖\n3178\t教\n3179\t敛\n3180\t敝\n3181\t敞\n3182\t敢\n3183\t散\n3184\t敦\n3185\t敬\n3186\t数\n3187\t敲\n3188\t整\n3189\t敷\n3190\t文\n3191\t斉\n3192\t斋\n3193\t斌\n3194\t斎\n3195\t斐\n3196\t斑\n3197\t斓\n3198\t斗\n3199\t料\n3200\t斛\n3201\t斜\n3202\t斝\n3203\t斟\n3204\t斡\n3205\t斤\n3206\t斥\n3207\t斧\n3208\t斩\n3209\t斫\n3210\t断\n3211\t斯\n3212\t新\n3213\t方\n3214\t施\n3215\t斿\n3216\t旁\n3217\t旃\n3218\t旄\n3219\t旅\n3220\t旆\n3221\t旌\n3222\t旎\n3223\t族\n3224\t旒\n3225\t旖\n3226\t旗\n3227\t无\n3228\t既\n3229\t日\n3230\t旦\n3231\t旧\n3232\t旨\n3233\t早\n3234\t旬\n3235\t旭\n3236\t旮\n3237\t旯\n3238\t旰\n3239\t旱\n3240\t旳\n3241\t时\n3242\t旷\n3243\t旸\n3244\t旺\n3245\t旻\n3246\t旼\n3247\t昀\n3248\t昂\n3249\t昃\n3250\t昄\n3251\t昆\n3252\t昉\n3253\t昊\n3254\t昌\n3255\t明\n3256\t昏\n3257\t昐\n3258\t易\n3259\t昔\n3260\t昕\n3261\t昙\n3262\t昜\n3263\t昝\n3264\t星\n3265\t映\n3266\t春\n3267\t昧\n3268\t昨\n3269\t昭\n3270\t是\n3271\t昱\n3272\t昳\n3273\t昴\n3274\t昵\n3275\t昶\n3276\t昹\n3277\t昺\n3278\t昼\n3279\t显\n3280\t晁\n3281\t晃\n3282\t晋\n3283\t晌\n3284\t晏\n3285\t晒\n3286\t晓\n3287\t晔\n3288\t晕\n3289\t晖\n3290\t晗\n3291\t晙\n3292\t晚\n3293\t晞\n3294\t晟\n3295\t晡\n3296\t晢\n3297\t晤\n3298\t晥\n3299\t晦\n3300\t晧\n3301\t晨\n3302\t晩\n3303\t普\n3304\t景\n3305\t晰\n3306\t晴\n3307\t晶\n3308\t晷\n3309\t晸\n3310\t智\n3311\t晾\n3312\t暁\n3313\t暂\n3314\t暄\n3315\t暇\n3316\t暌\n3317\t暑\n3318\t暖\n3319\t暗\n3320\t暝\n3321\t暦\n3322\t暧\n3323\t暨\n3324\t暮\n3325\t暴\n3326\t暸\n3327\t暹\n3328\t暻\n3329\t暾\n3330\t曈\n3331\t曌\n3332\t曐\n3333\t曙\n3334\t曛\n3335\t曜\n3336\t曝\n3337\t曦\n3338\t曩\n3339\t曰\n3340\t曱\n3341\t曲\n3342\t曳\n3343\t更\n3344\t曷\n3345\t曹\n3346\t曺\n3347\t曼\n3348\t曽\n3349\t曾\n3350\t替\n3351\t最\n3352\t朅\n3353\t月\n3354\t有\n3355\t朊\n3356\t朋\n3357\t服\n3358\t朐\n3359\t朓\n3360\t朔\n3361\t朕\n3362\t朗\n3363\t望\n3364\t朝\n3365\t期\n3366\t朦\n3367\t木\n3368\t朩\n3369\t未\n3370\t末\n3371\t本\n3372\t札\n3373\t术\n3374\t朱\n3375\t朲\n3376\t朴\n3377\t朵\n3378\t朹\n3379\t机\n3380\t朽\n3381\t朿\n3382\t杀\n3383\t杂\n3384\t权\n3385\t杆\n3386\t杈\n3387\t杉\n3388\t杌\n3389\t李\n3390\t杏\n3391\t材\n3392\t村\n3393\t杓\n3394\t杖\n3395\t杜\n3396\t杞\n3397\t束\n3398\t杠\n3399\t条\n3400\t来\n3401\t杨\n3402\t杩\n3403\t杪\n3404\t杭\n3405\t杮\n3406\t杯\n3407\t杰\n3408\t杲\n3409\t杳\n3410\t杵\n3411\t杷\n3412\t杺\n3413\t杼\n3414\t松\n3415\t板\n3416\t极\n3417\t枂\n3418\t构\n3419\t枇\n3420\t枉\n3421\t枊\n3422\t枋\n3423\t析\n3424\t枓\n3425\t枕\n3426\t林\n3427\t枘\n3428\t枙\n3429\t枚\n3430\t果\n3431\t枝\n3432\t枞\n3433\t枢\n3434\t枣\n3435\t枥\n3436\t枧\n3437\t枨\n3438\t枪\n3439\t枫\n3440\t枭\n3441\t枯\n3442\t枰\n3443\t枳\n3444\t架\n3445\t枷\n3446\t枸\n3447\t枹\n3448\t枼\n3449\t柁\n3450\t柃\n3451\t柄\n3452\t柊\n3453\t柏\n3454\t某\n3455\t柑\n3456\t柒\n3457\t染\n3458\t柔\n3459\t柘\n3460\t柙\n3461\t柚\n3462\t柜\n3463\t柝\n3464\t柞\n3465\t柠\n3466\t柢\n3467\t查\n3468\t柩\n3469\t柬\n3470\t柯\n3471\t柰\n3472\t柱\n3473\t柳\n3474\t柴\n3475\t柷\n3476\t柸\n3477\t柽\n3478\t柾\n3479\t柿\n3480\t栀\n3481\t栄\n3482\t栅\n3483\t栆\n3484\t标\n3485\t栈\n3486\t栉\n3487\t栊\n3488\t栋\n3489\t栌\n3490\t栎\n3491\t栏\n3492\t树\n3493\t栒\n3494\t栓\n3495\t栖\n3496\t栗\n3497\t栝\n3498\t栟\n3499\t校\n3500\t栩\n3501\t株\n3502\t栲\n3503\t栳\n3504\t栴\n3505\t样\n3506\t核\n3507\t根\n3508\t格\n3509\t栽\n3510\t栾\n3511\t桀\n3512\t桁\n3513\t桂\n3514\t桃\n3515\t桄\n3516\t桅\n3517\t框\n3518\t案\n3519\t桉\n3520\t桊\n3521\t桌\n3522\t桎\n3523\t桐\n3524\t桑\n3525\t桓\n3526\t桔\n3527\t桕\n3528\t桖\n3529\t桜\n3530\t桡\n3531\t桢\n3532\t档\n3533\t桤\n3534\t桥\n3535\t桦\n3536\t桧\n3537\t桨\n3538\t桩\n3539\t桫\n3540\t桲\n3541\t桴\n3542\t桶\n3543\t桷\n3544\t梁\n3545\t梃\n3546\t梅\n3547\t梆\n3548\t梏\n3549\t梓\n3550\t梗\n3551\t梢\n3552\t梣\n3553\t梦\n3554\t梧\n3555\t梨\n3556\t梭\n3557\t梯\n3558\t械\n3559\t梳\n3560\t梵\n3561\t梶\n3562\t梼\n3563\t梾\n3564\t梿\n3565\t检\n3566\t棂\n3567\t棉\n3568\t棋\n3569\t棍\n3570\t棐\n3571\t棑\n3572\t棒\n3573\t棕\n3574\t棘\n3575\t棚\n3576\t棠\n3577\t棣\n3578\t棨\n3579\t棪\n3580\t森\n3581\t棰\n3582\t棱\n3583\t棵\n3584\t棹\n3585\t棺\n3586\t棻\n3587\t椁\n3588\t椅\n3589\t椇\n3590\t椋\n3591\t植\n3592\t椎\n3593\t椒\n3594\t椛\n3595\t検\n3596\t椟\n3597\t椤\n3598\t椪\n3599\t椭\n3600\t椰\n3601\t椴\n3602\t椹\n3603\t椽\n3604\t椿\n3605\t楀\n3606\t楂\n3607\t楒\n3608\t楔\n3609\t楗\n3610\t楚\n3611\t楝\n3612\t楞\n3613\t楠\n3614\t楢\n3615\t楣\n3616\t楦\n3617\t楪\n3618\t楫\n3619\t楮\n3620\t楯\n3621\t楷\n3622\t楸\n3623\t楹\n3624\t楼\n3625\t楽\n3626\t榀\n3627\t概\n3628\t榄\n3629\t榆\n3630\t榇\n3631\t榈\n3632\t榉\n3633\t榊\n3634\t榎\n3635\t榔\n3636\t榕\n3637\t榖\n3638\t榛\n3639\t榜\n3640\t榣\n3641\t榧\n3642\t榨\n3643\t榫\n3644\t榭\n3645\t榴\n3646\t榶\n3647\t榷\n3648\t榻\n3649\t槇\n3650\t槊\n3651\t槌\n3652\t槎\n3653\t槐\n3654\t様\n3655\t槙\n3656\t槛\n3657\t槟\n3658\t槠\n3659\t槭\n3660\t槲\n3661\t槺\n3662\t槻\n3663\t槽\n3664\t槿\n3665\t樊\n3666\t樋\n3667\t樗\n3668\t樘\n3669\t樟\n3670\t模\n3671\t樨\n3672\t権\n3673\t横\n3674\t樫\n3675\t樯\n3676\t樱\n3677\t樵\n3678\t樻\n3679\t樽\n3680\t樾\n3681\t橄\n3682\t橇\n3683\t橐\n3684\t橒\n3685\t橘\n3686\t橙\n3687\t橛\n3688\t橞\n3689\t橡\n3690\t橦\n3691\t橱\n3692\t橹\n3693\t橼\n3694\t橾\n3695\t檀\n3696\t檄\n3697\t檎\n3698\t檐\n3699\t檑\n3700\t檗\n3701\t檚\n3702\t檛\n3703\t檠\n3704\t檩\n3705\t檫\n3706\t檬\n3707\t檵\n3708\t欠\n3709\t次\n3710\t欢\n3711\t欣\n3712\t欤\n3713\t欧\n3714\t欲\n3715\t欷\n3716\t欸\n3717\t欹\n3718\t欺\n3719\t欻\n3720\t款\n3721\t歃\n3722\t歆\n3723\t歇\n3724\t歉\n3725\t歌\n3726\t歓\n3727\t歙\n3728\t止\n3729\t正\n3730\t此\n3731\t步\n3732\t武\n3733\t歧\n3734\t歩\n3735\t歪\n3736\t歯\n3737\t歹\n3738\t歺\n3739\t死\n3740\t歼\n3741\t殁\n3742\t殂\n3743\t殃\n3744\t殄\n3745\t殅\n3746\t殆\n3747\t殇\n3748\t殉\n3749\t殊\n3750\t残\n3751\t殍\n3752\t殑\n3753\t殒\n3754\t殓\n3755\t殖\n3756\t殚\n3757\t殛\n3758\t殡\n3759\t殢\n3760\t殳\n3761\t殴\n3762\t段\n3763\t殷\n3764\t殿\n3765\t毁\n3766\t毂\n3767\t毅\n3768\t毋\n3769\t母\n3770\t毎\n3771\t每\n3772\t毐\n3773\t毑\n3774\t毒\n3775\t毓\n3776\t比\n3777\t毕\n3778\t毖\n3779\t毗\n3780\t毙\n3781\t毛\n3782\t毡\n3783\t毫\n3784\t毯\n3785\t毳\n3786\t毽\n3787\t氅\n3788\t氏\n3789\t氐\n3790\t民\n3791\t氓\n3792\t气\n3793\t氕\n3794\t氖\n3795\t気\n3796\t氘\n3797\t氙\n3798\t氚\n3799\t氛\n3800\t氟\n3801\t氡\n3802\t氢\n3803\t氤\n3804\t氦\n3805\t氧\n3806\t氨\n3807\t氩\n3808\t氪\n3809\t氮\n3810\t氯\n3811\t氰\n3812\t氲\n3813\t水\n3814\t氵\n3815\t永\n3816\t氺\n3817\t氽\n3818\t氿\n3819\t汀\n3820\t汁\n3821\t求\n3822\t汆\n3823\t汇\n3824\t汉\n3825\t汊\n3826\t汏\n3827\t汐\n3828\t汔\n3829\t汕\n3830\t汖\n3831\t汗\n3832\t汛\n3833\t汜\n3834\t汝\n3835\t汞\n3836\t江\n3837\t池\n3838\t污\n3839\t汣\n3840\t汤\n3841\t汨\n3842\t汩\n3843\t汪\n3844\t汫\n3845\t汭\n3846\t汰\n3847\t汲\n3848\t汴\n3849\t汶\n3850\t汹\n3851\t汽\n3852\t汾\n3853\t沁\n3854\t沂\n3855\t沃\n3856\t沄\n3857\t沅\n3858\t沆\n3859\t沇\n3860\t沉\n3861\t沌\n3862\t沏\n3863\t沐\n3864\t沑\n3865\t沓\n3866\t沔\n3867\t沕\n3868\t沙\n3869\t沚\n3870\t沛\n3871\t沟\n3872\t没\n3873\t沢\n3874\t沣\n3875\t沤\n3876\t沥\n3877\t沦\n3878\t沧\n3879\t沨\n3880\t沩\n3881\t沪\n3882\t沫\n3883\t沬\n3884\t沭\n3885\t沮\n3886\t沱\n3887\t河\n3888\t沵\n3889\t沸\n3890\t油\n3891\t沺\n3892\t治\n3893\t沼\n3894\t沽\n3895\t沾\n3896\t沿\n3897\t泃\n3898\t泄\n3899\t泅\n3900\t泉\n3901\t泊\n3902\t泌\n3903\t泐\n3904\t泑\n3905\t泓\n3906\t泔\n3907\t法\n3908\t泖\n3909\t泗\n3910\t泘\n3911\t泛\n3912\t泞\n3913\t泠\n3914\t泡\n3915\t波\n3916\t泣\n3917\t泥\n3918\t注\n3919\t泪\n3920\t泫\n3921\t泬\n3922\t泮\n3923\t泯\n3924\t泰\n3925\t泱\n3926\t泳\n3927\t泵\n3928\t泷\n3929\t泸\n3930\t泺\n3931\t泻\n3932\t泼\n3933\t泽\n3934\t泾\n3935\t洁\n3936\t洄\n3937\t洇\n3938\t洈\n3939\t洋\n3940\t洌\n3941\t洎\n3942\t洐\n3943\t洑\n3944\t洒\n3945\t洗\n3946\t洙\n3947\t洛\n3948\t洞\n3949\t洢\n3950\t洣\n3951\t津\n3952\t洧\n3953\t洨\n3954\t洪\n3955\t洫\n3956\t洮\n3957\t洰\n3958\t洱\n3959\t洲\n3960\t洳\n3961\t洵\n3962\t洸\n3963\t洹\n3964\t洺\n3965\t活\n3966\t洼\n3967\t洽\n3968\t派\n3969\t流\n3970\t浃\n3971\t浅\n3972\t浆\n3973\t浇\n3974\t浈\n3975\t浉\n3976\t浊\n3977\t测\n3978\t浍\n3979\t济\n3980\t浏\n3981\t浐\n3982\t浑\n3983\t浒\n3984\t浓\n3985\t浔\n3986\t浗\n3987\t浙\n3988\t浚\n3989\t浛\n3990\t浜\n3991\t浞\n3992\t浠\n3993\t浡\n3994\t浣\n3995\t浤\n3996\t浥\n3997\t浦\n3998\t浩\n3999\t浪\n4000\t浭\n4001\t浮\n4002\t浯\n4003\t浴\n4004\t浵\n4005\t海\n4006\t浸\n4007\t浼\n4008\t涂\n4009\t涅\n4010\t消\n4011\t涉\n4012\t涌\n4013\t涎\n4014\t涐\n4015\t涑\n4016\t涓\n4017\t涔\n4018\t涕\n4019\t涘\n4020\t涙\n4021\t涛\n4022\t涝\n4023\t涞\n4024\t涟\n4025\t涠\n4026\t涡\n4027\t涢\n4028\t涣\n4029\t涤\n4030\t润\n4031\t涧\n4032\t涨\n4033\t涩\n4034\t涪\n4035\t涮\n4036\t涯\n4037\t液\n4038\t涴\n4039\t涵\n4040\t涸\n4041\t涿\n4042\t淀\n4043\t淄\n4044\t淅\n4045\t淆\n4046\t淇\n4047\t淉\n4048\t淋\n4049\t淌\n4050\t淏\n4051\t淑\n4052\t淖\n4053\t淘\n4054\t淙\n4055\t淝\n4056\t淞\n4057\t淠\n4058\t淡\n4059\t淤\n4060\t淦\n4061\t淫\n4062\t淬\n4063\t淮\n4064\t淯\n4065\t深\n4066\t淳\n4067\t淴\n4068\t混\n4069\t淸\n4070\t淹\n4071\t添\n4072\t渃\n4073\t清\n4074\t渇\n4075\t済\n4076\t渉\n4077\t渊\n4078\t渋\n4079\t渌\n4080\t渍\n4081\t渎\n4082\t渐\n4083\t渑\n4084\t渓\n4085\t渔\n4086\t渕\n4087\t渖\n4088\t渗\n4089\t渚\n4090\t渝\n4091\t渟\n4092\t渠\n4093\t渡\n4094\t渣\n4095\t渤\n4096\t渥\n4097\t温\n4098\t渫\n4099\t渭\n4100\t港\n4101\t渲\n4102\t渴\n4103\t游\n4104\t渺\n4105\t渼\n4106\t湃\n4107\t湄\n4108\t湉\n4109\t湍\n4110\t湎\n4111\t湓\n4112\t湔\n4113\t湖\n4114\t湘\n4115\t湛\n4116\t湜\n4117\t湟\n4118\t湫\n4119\t湮\n4120\t湲\n4121\t湳\n4122\t湴\n4123\t湶\n4124\t湾\n4125\t湿\n4126\t満\n4127\t溁\n4128\t溃\n4129\t溅\n4130\t溆\n4131\t溇\n4132\t溉\n4133\t溏\n4134\t源\n4135\t溘\n4136\t溟\n4137\t溢\n4138\t溥\n4139\t溦\n4140\t溧\n4141\t溪\n4142\t溯\n4143\t溱\n4144\t溲\n4145\t溴\n4146\t溶\n4147\t溷\n4148\t溺\n4149\t溽\n4150\t滁\n4151\t滂\n4152\t滃\n4153\t滆\n4154\t滇\n4155\t滈\n4156\t滉\n4157\t滋\n4158\t滏\n4159\t滑\n4160\t滒\n4161\t滓\n4162\t滔\n4163\t滕\n4164\t滗\n4165\t滘\n4166\t滚\n4167\t滝\n4168\t滞\n4169\t滟\n4170\t滠\n4171\t满\n4172\t滢\n4173\t滤\n4174\t滥\n4175\t滦\n4176\t滨\n4177\t滩\n4178\t滳\n4179\t滴\n4180\t滹\n4181\t漂\n4182\t漆\n4183\t漈\n4184\t漉\n4185\t漏\n4186\t漓\n4187\t演\n4188\t漕\n4189\t漖\n4190\t漟\n4191\t漠\n4192\t漩\n4193\t漪\n4194\t漫\n4195\t漯\n4196\t漱\n4197\t漳\n4198\t漶\n4199\t漷\n4200\t漾\n4201\t潆\n4202\t潇\n4203\t潋\n4204\t潍\n4205\t潏\n4206\t潓\n4207\t潘\n4208\t潜\n4209\t潞\n4210\t潟\n4211\t潢\n4212\t潥\n4213\t潦\n4214\t潭\n4215\t潮\n4216\t潲\n4217\t潴\n4218\t潸\n4219\t潺\n4220\t潼\n4221\t潽\n4222\t澄\n4223\t澈\n4224\t澉\n4225\t澋\n4226\t澌\n4227\t澍\n4228\t澎\n4229\t澔\n4230\t澛\n4231\t澜\n4232\t澡\n4233\t澥\n4234\t澧\n4235\t澪\n4236\t澭\n4237\t澳\n4238\t澴\n4239\t澶\n4240\t澹\n4241\t激\n4242\t濂\n4243\t濉\n4244\t濑\n4245\t濒\n4246\t濞\n4247\t濠\n4248\t濡\n4249\t濮\n4250\t濯\n4251\t濹\n4252\t瀍\n4253\t瀑\n4254\t瀚\n4255\t瀛\n4256\t瀞\n4257\t瀣\n4258\t瀬\n4259\t瀵\n4260\t瀹\n4261\t瀼\n4262\t灌\n4263\t灏\n4264\t灜\n4265\t灞\n4266\t灡\n4267\t火\n4268\t灬\n4269\t灭\n4270\t灯\n4271\t灰\n4272\t灵\n4273\t灶\n4274\t灸\n4275\t灼\n4276\t灾\n4277\t灿\n4278\t炀\n4279\t炁\n4280\t炅\n4281\t炆\n4282\t炉\n4283\t炊\n4284\t炎\n4285\t炒\n4286\t炔\n4287\t炕\n4288\t炖\n4289\t炘\n4290\t炙\n4291\t炜\n4292\t炝\n4293\t炟\n4294\t炣\n4295\t炫\n4296\t炬\n4297\t炭\n4298\t炮\n4299\t炯\n4300\t炳\n4301\t炴\n4302\t炷\n4303\t炸\n4304\t点\n4305\t炻\n4306\t炼\n4307\t炽\n4308\t烀\n4309\t烁\n4310\t烂\n4311\t烃\n4312\t烈\n4313\t烊\n4314\t烋\n4315\t烎\n4316\t烔\n4317\t烘\n4318\t烙\n4319\t烛\n4320\t烜\n4321\t烝\n4322\t烟\n4323\t烤\n4324\t烦\n4325\t烧\n4326\t烨\n4327\t烩\n4328\t烫\n4329\t烬\n4330\t热\n4331\t烯\n4332\t烷\n4333\t烹\n4334\t烺\n4335\t烽\n4336\t焄\n4337\t焉\n4338\t焊\n4339\t焌\n4340\t焐\n4341\t焓\n4342\t焔\n4343\t焕\n4344\t焖\n4345\t焗\n4346\t焘\n4347\t焙\n4348\t焚\n4349\t焜\n4350\t焦\n4351\t焯\n4352\t焰\n4353\t焱\n4354\t然\n4355\t焼\n4356\t煅\n4357\t煊\n4358\t煋\n4359\t煌\n4360\t煎\n4361\t煐\n4362\t煜\n4363\t煞\n4364\t煤\n4365\t煦\n4366\t照\n4367\t煨\n4368\t煮\n4369\t煲\n4370\t煳\n4371\t煸\n4372\t煺\n4373\t煽\n4374\t熄\n4375\t熇\n4376\t熊\n4377\t熏\n4378\t熔\n4379\t熘\n4380\t熙\n4381\t熟\n4382\t熠\n4383\t熥\n4384\t熨\n4385\t熬\n4386\t熳\n4387\t熵\n4388\t熹\n4389\t熺\n4390\t燃\n4391\t燊\n4392\t燎\n4393\t燏\n4394\t燔\n4395\t燕\n4396\t燚\n4397\t燠\n4398\t燥\n4399\t燧\n4400\t燮\n4401\t燹\n4402\t爆\n4403\t爝\n4404\t爨\n4405\t爩\n4406\t爪\n4407\t爬\n4408\t爰\n4409\t爱\n4410\t爵\n4411\t父\n4412\t爷\n4413\t爸\n4414\t爹\n4415\t爻\n4416\t爽\n4417\t牁\n4418\t牂\n4419\t片\n4420\t版\n4421\t牌\n4422\t牍\n4423\t牒\n4424\t牖\n4425\t牙\n4426\t牛\n4427\t牝\n4428\t牟\n4429\t牡\n4430\t牢\n4431\t牤\n4432\t牦\n4433\t牧\n4434\t物\n4435\t牯\n4436\t牲\n4437\t牵\n4438\t特\n4439\t牺\n4440\t犀\n4441\t犁\n4442\t犄\n4443\t犊\n4444\t犍\n4445\t犒\n4446\t犠\n4447\t犭\n4448\t犯\n4449\t犰\n4450\t犳\n4451\t犴\n4452\t状\n4453\t犷\n4454\t犸\n4455\t犹\n4456\t犼\n4457\t犽\n4458\t犾\n4459\t狂\n4460\t狃\n4461\t狄\n4462\t狈\n4463\t狍\n4464\t狎\n4465\t狐\n4466\t狒\n4467\t狗\n4468\t狙\n4469\t狛\n4470\t狝\n4471\t狞\n4472\t狟\n4473\t狠\n4474\t狡\n4475\t狦\n4476\t狨\n4477\t狩\n4478\t独\n4479\t狭\n4480\t狮\n4481\t狰\n4482\t狱\n4483\t狲\n4484\t狳\n4485\t狴\n4486\t狶\n4487\t狷\n4488\t狸\n4489\t狻\n4490\t狼\n4491\t狾\n4492\t猁\n4493\t猄\n4494\t猇\n4495\t猊\n4496\t猋\n4497\t猌\n4498\t猎\n4499\t猔\n4500\t猕\n4501\t猖\n4502\t猗\n4503\t猜\n4504\t猝\n4505\t猞\n4506\t猟\n4507\t猠\n4508\t猡\n4509\t猢\n4510\t猥\n4511\t猩\n4512\t猪\n4513\t猫\n4514\t猬\n4515\t猭\n4516\t献\n4517\t猱\n4518\t猳\n4519\t猴\n4520\t猷\n4521\t猹\n4522\t猾\n4523\t猿\n4524\t獀\n4525\t獐\n4526\t獒\n4527\t獗\n4528\t獠\n4529\t獣\n4530\t獬\n4531\t獭\n4532\t獴\n4533\t獾\n4534\t玂\n4535\t玄\n4536\t率\n4537\t玉\n4538\t玊\n4539\t王\n4540\t玍\n4541\t玎\n4542\t玏\n4543\t玑\n4544\t玓\n4545\t玕\n4546\t玖\n4547\t玗\n4548\t玘\n4549\t玙\n4550\t玚\n4551\t玛\n4552\t玟\n4553\t玠\n4554\t玡\n4555\t玢\n4556\t玥\n4557\t玦\n4558\t玧\n4559\t玩\n4560\t玫\n4561\t玭\n4562\t玮\n4563\t环\n4564\t现\n4565\t玲\n4566\t玳\n4567\t玴\n4568\t玷\n4569\t玹\n4570\t玺\n4571\t玻\n4572\t珀\n4573\t珂\n4574\t珅\n4575\t珇\n4576\t珈\n4577\t珉\n4578\t珊\n4579\t珍\n4580\t珏\n4581\t珐\n4582\t珑\n4583\t珖\n4584\t珙\n4585\t珞\n4586\t珠\n4587\t珣\n4588\t珥\n4589\t珧\n4590\t珩\n4591\t班\n4592\t珰\n4593\t珲\n4594\t珵\n4595\t珹\n4596\t珺\n4597\t珽\n4598\t琀\n4599\t琁\n4600\t球\n4601\t琄\n4602\t琅\n4603\t理\n4604\t琇\n4605\t琉\n4606\t琊\n4607\t琌\n4608\t琎\n4609\t琏\n4610\t琐\n4611\t琚\n4612\t琛\n4613\t琜\n4614\t琢\n4615\t琤\n4616\t琥\n4617\t琦\n4618\t琨\n4619\t琩\n4620\t琪\n4621\t琬\n4622\t琭\n4623\t琮\n4624\t琯\n4625\t琰\n4626\t琲\n4627\t琳\n4628\t琴\n4629\t琵\n4630\t琶\n4631\t琼\n4632\t瑀\n4633\t瑁\n4634\t瑄\n4635\t瑅\n4636\t瑆\n4637\t瑈\n4638\t瑍\n4639\t瑕\n4640\t瑗\n4641\t瑙\n4642\t瑚\n4643\t瑛\n4644\t瑜\n4645\t瑝\n4646\t瑞\n4647\t瑟\n4648\t瑢\n4649\t瑧\n4650\t瑨\n4651\t瑭\n4652\t瑰\n4653\t瑱\n4654\t瑶\n4655\t瑷\n4656\t瑾\n4657\t璀\n4658\t璁\n4659\t璂\n4660\t璃\n4661\t璆\n4662\t璇\n4663\t璈\n4664\t璋\n4665\t璎\n4666\t璐\n4667\t璘\n4668\t璜\n4669\t璞\n4670\t璟\n4671\t璠\n4672\t璧\n4673\t璨\n4674\t璩\n4675\t璱\n4676\t璶\n4677\t璺\n4678\t瓒\n4679\t瓘\n4680\t瓙\n4681\t瓜\n4682\t瓞\n4683\t瓟\n4684\t瓠\n4685\t瓢\n4686\t瓣\n4687\t瓤\n4688\t瓦\n4689\t瓮\n4690\t瓯\n4691\t瓴\n4692\t瓶\n4693\t瓷\n4694\t瓿\n4695\t甁\n4696\t甃\n4697\t甄\n4698\t甅\n4699\t甍\n4700\t甏\n4701\t甑\n4702\t甘\n4703\t甙\n4704\t甚\n4705\t甜\n4706\t生\n4707\t甡\n4708\t甥\n4709\t用\n4710\t甩\n4711\t甪\n4712\t甫\n4713\t甬\n4714\t甭\n4715\t田\n4716\t由\n4717\t甲\n4718\t申\n4719\t甴\n4720\t电\n4721\t男\n4722\t甸\n4723\t町\n4724\t画\n4725\t甾\n4726\t畀\n4727\t畅\n4728\t畈\n4729\t畋\n4730\t界\n4731\t畎\n4732\t畏\n4733\t畑\n4734\t畔\n4735\t留\n4736\t畚\n4737\t畛\n4738\t畜\n4739\t畠\n4740\t略\n4741\t畦\n4742\t番\n4743\t畯\n4744\t畲\n4745\t畳\n4746\t畴\n4747\t畸\n4748\t畹\n4749\t畿\n4750\t疁\n4751\t疃\n4752\t疆\n4753\t疍\n4754\t疏\n4755\t疑\n4756\t疔\n4757\t疖\n4758\t疗\n4759\t疙\n4760\t疚\n4761\t疝\n4762\t疟\n4763\t疠\n4764\t疡\n4765\t疣\n4766\t疤\n4767\t疥\n4768\t疫\n4769\t疬\n4770\t疭\n4771\t疮\n4772\t疯\n4773\t疱\n4774\t疲\n4775\t疳\n4776\t疴\n4777\t疵\n4778\t疸\n4779\t疹\n4780\t疼\n4781\t疽\n4782\t疾\n4783\t痂\n4784\t痄\n4785\t病\n4786\t症\n4787\t痈\n4788\t痉\n4789\t痊\n4790\t痍\n4791\t痒\n4792\t痔\n4793\t痕\n4794\t痘\n4795\t痛\n4796\t痞\n4797\t痢\n4798\t痣\n4799\t痤\n4800\t痦\n4801\t痧\n4802\t痨\n4803\t痩\n4804\t痪\n4805\t痫\n4806\t痰\n4807\t痱\n4808\t痴\n4809\t痷\n4810\t痹\n4811\t痼\n4812\t痿\n4813\t瘀\n4814\t瘁\n4815\t瘆\n4816\t瘊\n4817\t瘌\n4818\t瘕\n4819\t瘗\n4820\t瘘\n4821\t瘙\n4822\t瘟\n4823\t瘠\n4824\t瘢\n4825\t瘤\n4826\t瘦\n4827\t瘩\n4828\t瘪\n4829\t瘫\n4830\t瘰\n4831\t瘳\n4832\t瘴\n4833\t瘸\n4834\t瘾\n4835\t瘿\n4836\t癀\n4837\t癃\n4838\t癌\n4839\t癍\n4840\t癔\n4841\t癖\n4842\t癜\n4843\t癞\n4844\t癣\n4845\t癫\n4846\t癶\n4847\t癸\n4848\t発\n4849\t登\n4850\t白\n4851\t百\n4852\t皂\n4853\t的\n4854\t皆\n4855\t皇\n4856\t皈\n4857\t皊\n4858\t皋\n4859\t皌\n4860\t皎\n4861\t皑\n4862\t皓\n4863\t皕\n4864\t皖\n4865\t皘\n4866\t皙\n4867\t皛\n4868\t皞\n4869\t皤\n4870\t皦\n4871\t皮\n4872\t皱\n4873\t皲\n4874\t皴\n4875\t皿\n4876\t盂\n4877\t盅\n4878\t盆\n4879\t盈\n4880\t盉\n4881\t益\n4882\t盍\n4883\t盎\n4884\t盏\n4885\t盐\n4886\t监\n4887\t盒\n4888\t盔\n4889\t盖\n4890\t盗\n4891\t盘\n4892\t盛\n4893\t盟\n4894\t盥\n4895\t盦\n4896\t目\n4897\t盯\n4898\t盱\n4899\t盲\n4900\t直\n4901\t相\n4902\t盹\n4903\t盺\n4904\t盼\n4905\t盾\n4906\t眀\n4907\t省\n4908\t眄\n4909\t眇\n4910\t眈\n4911\t眉\n4912\t看\n4913\t県\n4914\t眏\n4915\t眒\n4916\t眔\n4917\t眙\n4918\t眚\n4919\t眞\n4920\t真\n4921\t眠\n4922\t眦\n4923\t眧\n4924\t眨\n4925\t眩\n4926\t眬\n4927\t眭\n4928\t眯\n4929\t眵\n4930\t眶\n4931\t眷\n4932\t眸\n4933\t眺\n4934\t眼\n4935\t睁\n4936\t睇\n4937\t睌\n4938\t睐\n4939\t睑\n4940\t睚\n4941\t睛\n4942\t睡\n4943\t睢\n4944\t督\n4945\t睥\n4946\t睦\n4947\t睨\n4948\t睩\n4949\t睫\n4950\t睬\n4951\t睲\n4952\t睹\n4953\t睺\n4954\t睽\n4955\t睾\n4956\t睿\n4957\t瞄\n4958\t瞅\n4959\t瞆\n4960\t瞋\n4961\t瞌\n4962\t瞍\n4963\t瞎\n4964\t瞏\n4965\t瞐\n4966\t瞑\n4967\t瞒\n4968\t瞟\n4969\t瞠\n4970\t瞥\n4971\t瞧\n4972\t瞩\n4973\t瞪\n4974\t瞬\n4975\t瞰\n4976\t瞳\n4977\t瞴\n4978\t瞻\n4979\t瞽\n4980\t瞾\n4981\t瞿\n4982\t矍\n4983\t矗\n4984\t矛\n4985\t矜\n4986\t矞\n4987\t矢\n4988\t矣\n4989\t知\n4990\t矩\n4991\t矫\n4992\t矬\n4993\t短\n4994\t矮\n4995\t石\n4996\t矶\n4997\t矸\n4998\t矾\n4999\t矿\n5000\t砀\n5001\t码\n5002\t砂\n5003\t砆\n5004\t砉\n5005\t砋\n5006\t砌\n5007\t砍\n5008\t砑\n5009\t砒\n5010\t研\n5011\t砕\n5012\t砖\n5013\t砗\n5014\t砘\n5015\t砚\n5016\t砜\n5017\t砝\n5018\t砟\n5019\t砣\n5020\t砥\n5021\t砧\n5022\t砬\n5023\t砭\n5024\t砮\n5025\t砯\n5026\t砰\n5027\t砳\n5028\t破\n5029\t砵\n5030\t砷\n5031\t砸\n5032\t砹\n5033\t砺\n5034\t砻\n5035\t砼\n5036\t砾\n5037\t础\n5038\t硁\n5039\t硄\n5040\t硅\n5041\t硇\n5042\t硉\n5043\t硌\n5044\t硎\n5045\t硐\n5046\t硑\n5047\t硒\n5048\t硕\n5049\t硖\n5050\t硗\n5051\t硚\n5052\t硝\n5053\t硪\n5054\t硫\n5055\t硬\n5056\t确\n5057\t硷\n5058\t硼\n5059\t碇\n5060\t碉\n5061\t碌\n5062\t碍\n5063\t碎\n5064\t碑\n5065\t碓\n5066\t碗\n5067\t碘\n5068\t碚\n5069\t碛\n5070\t碜\n5071\t碟\n5072\t碣\n5073\t碧\n5074\t碰\n5075\t碲\n5076\t碳\n5077\t碴\n5078\t碶\n5079\t碹\n5080\t碾\n5081\t磁\n5082\t磅\n5083\t磊\n5084\t磋\n5085\t磐\n5086\t磔\n5087\t磕\n5088\t磡\n5089\t磨\n5090\t磬\n5091\t磲\n5092\t磴\n5093\t磷\n5094\t磺\n5095\t磻\n5096\t礁\n5097\t礓\n5098\t礞\n5099\t礟\n5100\t礤\n5101\t礴\n5102\t示\n5103\t礻\n5104\t礼\n5105\t礽\n5106\t社\n5107\t祀\n5108\t祁\n5109\t祂\n5110\t祅\n5111\t祆\n5112\t祈\n5113\t祉\n5114\t祎\n5115\t祐\n5116\t祓\n5117\t祖\n5118\t祗\n5119\t祙\n5120\t祚\n5121\t祛\n5122\t祜\n5123\t祝\n5124\t神\n5125\t祟\n5126\t祠\n5127\t祢\n5128\t祥\n5129\t祧\n5130\t票\n5131\t祭\n5132\t祯\n5133\t祲\n5134\t祷\n5135\t祸\n5136\t祺\n5137\t祼\n5138\t禀\n5139\t禁\n5140\t禄\n5141\t禅\n5142\t禇\n5143\t禊\n5144\t福\n5145\t禔\n5146\t禘\n5147\t禚\n5148\t禛\n5149\t禟\n5150\t禤\n5151\t禧\n5152\t禫\n5153\t禬\n5154\t禳\n5155\t禹\n5156\t禺\n5157\t离\n5158\t禽\n5159\t禾\n5160\t秀\n5161\t私\n5162\t秃\n5163\t秆\n5164\t秇\n5165\t秉\n5166\t秋\n5167\t种\n5168\t科\n5169\t秒\n5170\t秕\n5171\t秘\n5172\t租\n5173\t秣\n5174\t秤\n5175\t秦\n5176\t秧\n5177\t秩\n5178\t秫\n5179\t秭\n5180\t积\n5181\t称\n5182\t秸\n5183\t移\n5184\t秽\n5185\t秾\n5186\t稀\n5187\t稂\n5188\t稃\n5189\t程\n5190\t稍\n5191\t税\n5192\t稔\n5193\t稗\n5194\t稚\n5195\t稞\n5196\t稠\n5197\t稣\n5198\t稥\n5199\t稰\n5200\t稲\n5201\t稳\n5202\t稷\n5203\t稹\n5204\t稻\n5205\t稼\n5206\t稽\n5207\t稿\n5208\t穂\n5209\t穆\n5210\t穑\n5211\t穗\n5212\t穝\n5213\t穰\n5214\t穴\n5215\t究\n5216\t穷\n5217\t穸\n5218\t穹\n5219\t空\n5220\t穿\n5221\t突\n5222\t窃\n5223\t窄\n5224\t窅\n5225\t窈\n5226\t窊\n5227\t窍\n5228\t窎\n5229\t窑\n5230\t窒\n5231\t窕\n5232\t窖\n5233\t窗\n5234\t窘\n5235\t窜\n5236\t窝\n5237\t窟\n5238\t窠\n5239\t窣\n5240\t窥\n5241\t窦\n5242\t窨\n5243\t窳\n5244\t窸\n5245\t窿\n5246\t竂\n5247\t立\n5248\t竑\n5249\t竖\n5250\t站\n5251\t竜\n5252\t竞\n5253\t竟\n5254\t章\n5255\t竣\n5256\t童\n5257\t竦\n5258\t竨\n5259\t竭\n5260\t端\n5261\t竹\n5262\t竺\n5263\t竽\n5264\t竿\n5265\t笃\n5266\t笄\n5267\t笆\n5268\t笈\n5269\t笊\n5270\t笋\n5271\t笏\n5272\t笑\n5273\t笔\n5274\t笕\n5275\t笙\n5276\t笛\n5277\t笞\n5278\t笠\n5279\t笢\n5280\t笤\n5281\t笥\n5282\t符\n5283\t笨\n5284\t笪\n5285\t笫\n5286\t第\n5287\t笮\n5288\t笳\n5289\t笵\n5290\t笸\n5291\t笹\n5292\t笺\n5293\t笼\n5294\t笾\n5295\t筇\n5296\t等\n5297\t筋\n5298\t筌\n5299\t筏\n5300\t筐\n5301\t筑\n5302\t筒\n5303\t答\n5304\t筘\n5305\t筚\n5306\t筛\n5307\t筜\n5308\t筝\n5309\t筠\n5310\t筮\n5311\t筱\n5312\t筲\n5313\t筵\n5314\t筷\n5315\t筹\n5316\t筼\n5317\t筽\n5318\t签\n5319\t简\n5320\t箅\n5321\t箍\n5322\t箐\n5323\t箓\n5324\t箔\n5325\t箕\n5326\t算\n5327\t箜\n5328\t箝\n5329\t管\n5330\t箦\n5331\t箧\n5332\t箨\n5333\t箩\n5334\t箪\n5335\t箫\n5336\t箬\n5337\t箭\n5338\t箱\n5339\t箴\n5340\t箸\n5341\t篁\n5342\t篆\n5343\t篇\n5344\t篌\n5345\t篑\n5346\t篓\n5347\t篙\n5348\t篝\n5349\t篡\n5350\t篦\n5351\t篪\n5352\t篮\n5353\t篱\n5354\t篷\n5355\t篸\n5356\t篼\n5357\t篾\n5358\t簃\n5359\t簇\n5360\t簈\n5361\t簋\n5362\t簌\n5363\t簕\n5364\t簖\n5365\t簟\n5366\t簧\n5367\t簪\n5368\t簸\n5369\t簿\n5370\t籀\n5371\t籁\n5372\t籍\n5373\t籖\n5374\t籣\n5375\t米\n5376\t籴\n5377\t籹\n5378\t类\n5379\t籼\n5380\t籽\n5381\t粄\n5382\t粉\n5383\t粋\n5384\t粑\n5385\t粒\n5386\t粕\n5387\t粗\n5388\t粘\n5389\t粜\n5390\t粞\n5391\t粟\n5392\t粢\n5393\t粤\n5394\t粥\n5395\t粨\n5396\t粪\n5397\t粮\n5398\t粱\n5399\t粲\n5400\t粹\n5401\t粼\n5402\t粽\n5403\t精\n5404\t粿\n5405\t糁\n5406\t糅\n5407\t糌\n5408\t糍\n5409\t糕\n5410\t糖\n5411\t糗\n5412\t糙\n5413\t糜\n5414\t糟\n5415\t糠\n5416\t糡\n5417\t糨\n5418\t糬\n5419\t糯\n5420\t糵\n5421\t系\n5422\t紊\n5423\t素\n5424\t索\n5425\t紧\n5426\t紫\n5427\t累\n5428\t経\n5429\t絚\n5430\t絮\n5431\t絵\n5432\t継\n5433\t続\n5434\t綦\n5435\t綮\n5436\t綶\n5437\t総\n5438\t縁\n5439\t縄\n5440\t縠\n5441\t縦\n5442\t縻\n5443\t繁\n5444\t繇\n5445\t繋\n5446\t纂\n5447\t纛\n5448\t纟\n5449\t纠\n5450\t纡\n5451\t红\n5452\t纣\n5453\t纤\n5454\t纥\n5455\t约\n5456\t级\n5457\t纨\n5458\t纪\n5459\t纫\n5460\t纬\n5461\t纭\n5462\t纮\n5463\t纯\n5464\t纰\n5465\t纱\n5466\t纲\n5467\t纳\n5468\t纴\n5469\t纵\n5470\t纶\n5471\t纷\n5472\t纸\n5473\t纹\n5474\t纺\n5475\t纻\n5476\t纽\n5477\t纾\n5478\t线\n5479\t绀\n5480\t绁\n5481\t绂\n5482\t练\n5483\t组\n5484\t绅\n5485\t细\n5486\t织\n5487\t终\n5488\t绉\n5489\t绊\n5490\t绌\n5491\t绍\n5492\t绎\n5493\t经\n5494\t绐\n5495\t绑\n5496\t绒\n5497\t结\n5498\t绔\n5499\t绕\n5500\t绖\n5501\t绗\n5502\t绘\n5503\t给\n5504\t绚\n5505\t绛\n5506\t络\n5507\t绝\n5508\t绞\n5509\t统\n5510\t绠\n5511\t绡\n5512\t绢\n5513\t绣\n5514\t绥\n5515\t绦\n5516\t继\n5517\t绨\n5518\t绩\n5519\t绪\n5520\t绫\n5521\t续\n5522\t绮\n5523\t绯\n5524\t绰\n5525\t绱\n5526\t绳\n5527\t维\n5528\t绵\n5529\t绶\n5530\t绷\n5531\t绹\n5532\t绺\n5533\t绻\n5534\t综\n5535\t绽\n5536\t绾\n5537\t绿\n5538\t缀\n5539\t缁\n5540\t缂\n5541\t缃\n5542\t缄\n5543\t缅\n5544\t缆\n5545\t缇\n5546\t缈\n5547\t缉\n5548\t缊\n5549\t缌\n5550\t缎\n5551\t缑\n5552\t缒\n5553\t缓\n5554\t缔\n5555\t缕\n5556\t编\n5557\t缗\n5558\t缘\n5559\t缙\n5560\t缚\n5561\t缛\n5562\t缜\n5563\t缝\n5564\t缟\n5565\t缠\n5566\t缡\n5567\t缢\n5568\t缤\n5569\t缥\n5570\t缦\n5571\t缧\n5572\t缨\n5573\t缩\n5574\t缪\n5575\t缫\n5576\t缬\n5577\t缭\n5578\t缮\n5579\t缯\n5580\t缰\n5581\t缱\n5582\t缲\n5583\t缳\n5584\t缴\n5585\t缵\n5586\t缶\n5587\t缷\n5588\t缸\n5589\t缺\n5590\t罂\n5591\t罄\n5592\t罅\n5593\t罉\n5594\t罍\n5595\t罐\n5596\t网\n5597\t罒\n5598\t罔\n5599\t罕\n5600\t罗\n5601\t罘\n5602\t罚\n5603\t罟\n5604\t罠\n5605\t罡\n5606\t罢\n5607\t罥\n5608\t罨\n5609\t罩\n5610\t罪\n5611\t置\n5612\t署\n5613\t罴\n5614\t罹\n5615\t罾\n5616\t羁\n5617\t羊\n5618\t羌\n5619\t美\n5620\t羑\n5621\t羔\n5622\t羙\n5623\t羚\n5624\t羞\n5625\t羟\n5626\t羡\n5627\t群\n5628\t羧\n5629\t羮\n5630\t羯\n5631\t羰\n5632\t羱\n5633\t羲\n5634\t羸\n5635\t羹\n5636\t羼\n5637\t羽\n5638\t羿\n5639\t翀\n5640\t翁\n5641\t翃\n5642\t翅\n5643\t翊\n5644\t翌\n5645\t翎\n5646\t翔\n5647\t翕\n5648\t翘\n5649\t翙\n5650\t翚\n5651\t翛\n5652\t翟\n5653\t翠\n5654\t翡\n5655\t翥\n5656\t翦\n5657\t翩\n5658\t翮\n5659\t翯\n5660\t翰\n5661\t翱\n5662\t翳\n5663\t翻\n5664\t翼\n5665\t翾\n5666\t耀\n5667\t老\n5668\t考\n5669\t耄\n5670\t者\n5671\t耆\n5672\t耋\n5673\t而\n5674\t耍\n5675\t耐\n5676\t耒\n5677\t耔\n5678\t耕\n5679\t耖\n5680\t耗\n5681\t耘\n5682\t耙\n5683\t耜\n5684\t耦\n5685\t耧\n5686\t耨\n5687\t耳\n5688\t耵\n5689\t耶\n5690\t耷\n5691\t耸\n5692\t耻\n5693\t耽\n5694\t耿\n5695\t聂\n5696\t聃\n5697\t聆\n5698\t聊\n5699\t聋\n5700\t职\n5701\t聍\n5702\t聒\n5703\t联\n5704\t聘\n5705\t聚\n5706\t聛\n5707\t聜\n5708\t聝\n5709\t聡\n5710\t聢\n5711\t聩\n5712\t聪\n5713\t聱\n5714\t聴\n5715\t聿\n5716\t肃\n5717\t肄\n5718\t肆\n5719\t肇\n5720\t肉\n5721\t肋\n5722\t肌\n5723\t肏\n5724\t肓\n5725\t肖\n5726\t肘\n5727\t肚\n5728\t肛\n5729\t肜\n5730\t肝\n5731\t肟\n5732\t肠\n5733\t股\n5734\t肢\n5735\t肤\n5736\t肥\n5737\t肩\n5738\t肪\n5739\t肫\n5740\t肮\n5741\t肯\n5742\t肱\n5743\t育\n5744\t肴\n5745\t肶\n5746\t肸\n5747\t肺\n5748\t肼\n5749\t肽\n5750\t肾\n5751\t肿\n5752\t胀\n5753\t胁\n5754\t胂\n5755\t胃\n5756\t胄\n5757\t胆\n5758\t背\n5759\t胍\n5760\t胎\n5761\t胔\n5762\t胖\n5763\t胗\n5764\t胙\n5765\t胚\n5766\t胛\n5767\t胜\n5768\t胝\n5769\t胞\n5770\t胡\n5771\t胤\n5772\t胥\n5773\t胧\n5774\t胨\n5775\t胪\n5776\t胫\n5777\t胬\n5778\t胭\n5779\t胯\n5780\t胰\n5781\t胱\n5782\t胳\n5783\t胴\n5784\t胶\n5785\t胸\n5786\t胺\n5787\t胼\n5788\t能\n5789\t脂\n5790\t脆\n5791\t脉\n5792\t脌\n5793\t脍\n5794\t脏\n5795\t脐\n5796\t脑\n5797\t脒\n5798\t脓\n5799\t脔\n5800\t脕\n5801\t脖\n5802\t脘\n5803\t脙\n5804\t脚\n5805\t脜\n5806\t脝\n5807\t脟\n5808\t脠\n5809\t脡\n5810\t脢\n5811\t脤\n5812\t脥\n5813\t脦\n5814\t脧\n5815\t脨\n5816\t脪\n5817\t脭\n5818\t脮\n5819\t脯\n5820\t脰\n5821\t脱\n5822\t脲\n5823\t脳\n5824\t脴\n5825\t脷\n5826\t脸\n5827\t脽\n5828\t脾\n5829\t脿\n5830\t腆\n5831\t腈\n5832\t腊\n5833\t腋\n5834\t腌\n5835\t腐\n5836\t腑\n5837\t腓\n5838\t腔\n5839\t腕\n5840\t腘\n5841\t腙\n5842\t腚\n5843\t腠\n5844\t腥\n5845\t腧\n5846\t腩\n5847\t腭\n5848\t腮\n5849\t腰\n5850\t腱\n5851\t腴\n5852\t腹\n5853\t腺\n5854\t腻\n5855\t腼\n5856\t腾\n5857\t腿\n5858\t膀\n5859\t膈\n5860\t膊\n5861\t膏\n5862\t膑\n5863\t膘\n5864\t膛\n5865\t膜\n5866\t膝\n5867\t膣\n5868\t膦\n5869\t膨\n5870\t膳\n5871\t膺\n5872\t膻\n5873\t臀\n5874\t臂\n5875\t臃\n5876\t臆\n5877\t臊\n5878\t臌\n5879\t臓\n5880\t臜\n5881\t臣\n5882\t臧\n5883\t自\n5884\t臬\n5885\t臭\n5886\t至\n5887\t致\n5888\t臵\n5889\t臸\n5890\t臻\n5891\t臼\n5892\t臾\n5893\t舀\n5894\t舂\n5895\t舅\n5896\t舆\n5897\t舌\n5898\t舍\n5899\t舎\n5900\t舐\n5901\t舒\n5902\t舔\n5903\t舗\n5904\t舛\n5905\t舜\n5906\t舞\n5907\t舟\n5908\t舢\n5909\t舣\n5910\t舨\n5911\t航\n5912\t舫\n5913\t般\n5914\t舰\n5915\t舱\n5916\t舴\n5917\t舵\n5918\t舶\n5919\t舷\n5920\t舸\n5921\t船\n5922\t舺\n5923\t舾\n5924\t艄\n5925\t艇\n5926\t艋\n5927\t艏\n5928\t艘\n5929\t艟\n5930\t艨\n5931\t艮\n5932\t良\n5933\t艰\n5934\t色\n5935\t艳\n5936\t艶\n5937\t艹\n5938\t艺\n5939\t艽\n5940\t艾\n5941\t艿\n5942\t节\n5943\t芃\n5944\t芄\n5945\t芈\n5946\t芊\n5947\t芋\n5948\t芍\n5949\t芎\n5950\t芐\n5951\t芑\n5952\t芒\n5953\t芔\n5954\t芗\n5955\t芘\n5956\t芙\n5957\t芛\n5958\t芜\n5959\t芝\n5960\t芟\n5961\t芡\n5962\t芣\n5963\t芥\n5964\t芦\n5965\t芧\n5966\t芨\n5967\t芩\n5968\t芪\n5969\t芫\n5970\t芬\n5971\t芭\n5972\t芮\n5973\t芯\n5974\t芰\n5975\t花\n5976\t芳\n5977\t芴\n5978\t芶\n5979\t芷\n5980\t芸\n5981\t芹\n5982\t芽\n5983\t芾\n5984\t苁\n5985\t苄\n5986\t苇\n5987\t苈\n5988\t苋\n5989\t苌\n5990\t苍\n5991\t苎\n5992\t苏\n5993\t苐\n5994\t苑\n5995\t苒\n5996\t苓\n5997\t苔\n5998\t苕\n5999\t苖\n6000\t苗\n6001\t苘\n6002\t苛\n6003\t苜\n6004\t苞\n6005\t苟\n6006\t苠\n6007\t苡\n6008\t苢\n6009\t苣\n6010\t苤\n6011\t若\n6012\t苦\n6013\t苨\n6014\t苪\n6015\t苫\n6016\t苮\n6017\t苯\n6018\t英\n6019\t苴\n6020\t苷\n6021\t苹\n6022\t苻\n6023\t苼\n6024\t苾\n6025\t苿\n6026\t茀\n6027\t茁\n6028\t茂\n6029\t范\n6030\t茄\n6031\t茅\n6032\t茆\n6033\t茇\n6034\t茈\n6035\t茉\n6036\t茌\n6037\t茎\n6038\t茏\n6039\t茑\n6040\t茓\n6041\t茔\n6042\t茕\n6043\t茗\n6044\t茚\n6045\t茛\n6046\t茜\n6047\t茧\n6048\t茨\n6049\t茫\n6050\t茬\n6051\t茭\n6052\t茯\n6053\t茱\n6054\t茳\n6055\t茴\n6056\t茵\n6057\t茶\n6058\t茸\n6059\t茹\n6060\t茺\n6061\t茻\n6062\t茼\n6063\t荀\n6064\t荃\n6065\t荄\n6066\t荆\n6067\t荇\n6068\t荌\n6069\t荏\n6070\t荐\n6071\t荑\n6072\t荒\n6073\t荔\n6074\t荖\n6075\t荘\n6076\t荚\n6077\t荛\n6078\t荜\n6079\t荞\n6080\t荟\n6081\t荠\n6082\t荡\n6083\t荣\n6084\t荤\n6085\t荥\n6086\t荦\n6087\t荧\n6088\t荨\n6089\t荩\n6090\t荪\n6091\t荫\n6092\t荬\n6093\t荭\n6094\t药\n6095\t荷\n6096\t荸\n6097\t荻\n6098\t荼\n6099\t荽\n6100\t荿\n6101\t莀\n6102\t莅\n6103\t莆\n6104\t莉\n6105\t莎\n6106\t莒\n6107\t莓\n6108\t莔\n6109\t莘\n6110\t莙\n6111\t莛\n6112\t莜\n6113\t莞\n6114\t莠\n6115\t莤\n6116\t莨\n6117\t莩\n6118\t莪\n6119\t莫\n6120\t莯\n6121\t莱\n6122\t莲\n6123\t莳\n6124\t莴\n6125\t莶\n6126\t获\n6127\t莸\n6128\t莹\n6129\t莺\n6130\t莼\n6131\t莽\n6132\t菀\n6133\t菁\n6134\t菂\n6135\t菅\n6136\t菇\n6137\t菈\n6138\t菊\n6139\t菋\n6140\t菌\n6141\t菏\n6142\t菒\n6143\t菔\n6144\t菖\n6145\t菘\n6146\t菜\n6147\t菝\n6148\t菟\n6149\t菠\n6150\t菡\n6151\t菥\n6152\t菩\n6153\t菪\n6154\t菰\n6155\t菱\n6156\t菲\n6157\t菻\n6158\t菽\n6159\t萁\n6160\t萃\n6161\t萄\n6162\t萆\n6163\t萋\n6164\t萌\n6165\t萍\n6166\t萎\n6167\t萏\n6168\t萘\n6169\t萜\n6170\t萝\n6171\t萢\n6172\t萤\n6173\t营\n6174\t萦\n6175\t萧\n6176\t萨\n6177\t萩\n6178\t萫\n6179\t萱\n6180\t萸\n6181\t萼\n6182\t落\n6183\t葆\n6184\t葇\n6185\t葎\n6186\t葑\n6187\t著\n6188\t葙\n6189\t葚\n6190\t葛\n6191\t葜\n6192\t葡\n6193\t董\n6194\t葩\n6195\t葫\n6196\t葬\n6197\t葭\n6198\t葱\n6199\t葳\n6200\t葵\n6201\t葶\n6202\t葸\n6203\t葺\n6204\t蒂\n6205\t蒃\n6206\t蒄\n6207\t蒇\n6208\t蒉\n6209\t蒋\n6210\t蒌\n6211\t蒎\n6212\t蒗\n6213\t蒙\n6214\t蒜\n6215\t蒟\n6216\t蒡\n6217\t蒨\n6218\t蒩\n6219\t蒯\n6220\t蒲\n6221\t蒴\n6222\t蒸\n6223\t蒹\n6224\t蒺\n6225\t蒻\n6226\t蒽\n6227\t蒾\n6228\t蒿\n6229\t蓁\n6230\t蓂\n6231\t蓃\n6232\t蓄\n6233\t蓉\n6234\t蓊\n6235\t蓍\n6236\t蓐\n6237\t蓑\n6238\t蓓\n6239\t蓖\n6240\t蓝\n6241\t蓟\n6242\t蓠\n6243\t蓣\n6244\t蓥\n6245\t蓦\n6246\t蓬\n6247\t蓼\n6248\t蓿\n6249\t蔊\n6250\t蔍\n6251\t蔑\n6252\t蔓\n6253\t蔗\n6254\t蔚\n6255\t蔟\n6256\t蔡\n6257\t蔨\n6258\t蔫\n6259\t蔬\n6260\t蔵\n6261\t蔷\n6262\t蔸\n6263\t蔹\n6264\t蔺\n6265\t蔻\n6266\t蔼\n6267\t蔽\n6268\t蕃\n6269\t蕈\n6270\t蕉\n6271\t蕊\n6272\t蕖\n6273\t蕗\n6274\t蕙\n6275\t蕞\n6276\t蕤\n6277\t蕥\n6278\t蕨\n6279\t蕰\n6280\t蕲\n6281\t蕴\n6282\t蕺\n6283\t蕻\n6284\t蕾\n6285\t薄\n6286\t薅\n6287\t薇\n6288\t薏\n6289\t薛\n6290\t薜\n6291\t薡\n6292\t薢\n6293\t薤\n6294\t薨\n6295\t薪\n6296\t薫\n6297\t薬\n6298\t薮\n6299\t薯\n6300\t薷\n6301\t薹\n6302\t藁\n6303\t藏\n6304\t藐\n6305\t藓\n6306\t藕\n6307\t藜\n6308\t藠\n6309\t藤\n6310\t藨\n6311\t藩\n6312\t藻\n6313\t藿\n6314\t蘅\n6315\t蘑\n6316\t蘖\n6317\t蘘\n6318\t蘧\n6319\t蘩\n6320\t蘸\n6321\t蘼\n6322\t虎\n6323\t虏\n6324\t虐\n6325\t虑\n6326\t虓\n6327\t虔\n6328\t虚\n6329\t虞\n6330\t虢\n6331\t虫\n6332\t虬\n6333\t虮\n6334\t虱\n6335\t虹\n6336\t虺\n6337\t虻\n6338\t虽\n6339\t虾\n6340\t虿\n6341\t蚀\n6342\t蚁\n6343\t蚂\n6344\t蚊\n6345\t蚋\n6346\t蚌\n6347\t蚍\n6348\t蚓\n6349\t蚕\n6350\t蚜\n6351\t蚝\n6352\t蚣\n6353\t蚤\n6354\t蚧\n6355\t蚨\n6356\t蚩\n6357\t蚪\n6358\t蚬\n6359\t蚯\n6360\t蚰\n6361\t蚱\n6362\t蚴\n6363\t蚵\n6364\t蚶\n6365\t蚺\n6366\t蛀\n6367\t蛄\n6368\t蛆\n6369\t蛇\n6370\t蛉\n6371\t蛊\n6372\t蛋\n6373\t蛍\n6374\t蛎\n6375\t蛏\n6376\t蛐\n6377\t蛔\n6378\t蛙\n6379\t蛛\n6380\t蛞\n6381\t蛟\n6382\t蛤\n6383\t蛩\n6384\t蛭\n6385\t蛮\n6386\t蛯\n6387\t蛰\n6388\t蛱\n6389\t蛲\n6390\t蛳\n6391\t蛴\n6392\t蛸\n6393\t蛹\n6394\t蛾\n6395\t蜀\n6396\t蜂\n6397\t蜃\n6398\t蜇\n6399\t蜈\n6400\t蜉\n6401\t蜊\n6402\t蜍\n6403\t蜒\n6404\t蜓\n6405\t蜕\n6406\t蜗\n6407\t蜘\n6408\t蜚\n6409\t蜜\n6410\t蜞\n6411\t蜡\n6412\t蜢\n6413\t蜣\n6414\t蜥\n6415\t蜩\n6416\t蜮\n6417\t蜱\n6418\t蜴\n6419\t蜷\n6420\t蜻\n6421\t蜿\n6422\t蝂\n6423\t蝇\n6424\t蝈\n6425\t蝉\n6426\t蝌\n6427\t蝎\n6428\t蝓\n6429\t蝗\n6430\t蝙\n6431\t蝜\n6432\t蝠\n6433\t蝣\n6434\t蝤\n6435\t蝥\n6436\t蝮\n6437\t蝰\n6438\t蝲\n6439\t蝴\n6440\t蝶\n6441\t蝼\n6442\t蝽\n6443\t蝾\n6444\t螂\n6445\t螃\n6446\t螅\n6447\t螈\n6448\t螋\n6449\t融\n6450\t螓\n6451\t螟\n6452\t螣\n6453\t螨\n6454\t螫\n6455\t螬\n6456\t螭\n6457\t螯\n6458\t螳\n6459\t螵\n6460\t螺\n6461\t螽\n6462\t蟀\n6463\t蟆\n6464\t蟊\n6465\t蟋\n6466\t蟑\n6467\t蟒\n6468\t蟛\n6469\t蟞\n6470\t蟠\n6471\t蟥\n6472\t蟮\n6473\t蟳\n6474\t蟹\n6475\t蟾\n6476\t蠃\n6477\t蠊\n6478\t蠓\n6479\t蠕\n6480\t蠖\n6481\t蠛\n6482\t蠡\n6483\t蠢\n6484\t蠲\n6485\t蠹\n6486\t蠼\n6487\t血\n6488\t衄\n6489\t衅\n6490\t行\n6491\t衍\n6492\t衎\n6493\t衔\n6494\t街\n6495\t衙\n6496\t衡\n6497\t衢\n6498\t衣\n6499\t衤\n6500\t补\n6501\t表\n6502\t衩\n6503\t衫\n6504\t衬\n6505\t衮\n6506\t衰\n6507\t衲\n6508\t衷\n6509\t衽\n6510\t衾\n6511\t衿\n6512\t袁\n6513\t袂\n6514\t袄\n6515\t袅\n6516\t袆\n6517\t袈\n6518\t袋\n6519\t袍\n6520\t袒\n6521\t袓\n6522\t袖\n6523\t袛\n6524\t袜\n6525\t袢\n6526\t袤\n6527\t袪\n6528\t被\n6529\t袭\n6530\t袱\n6531\t裁\n6532\t裂\n6533\t装\n6534\t裆\n6535\t裈\n6536\t裉\n6537\t裒\n6538\t裔\n6539\t裕\n6540\t裘\n6541\t裙\n6542\t裟\n6543\t裢\n6544\t裤\n6545\t裥\n6546\t裨\n6547\t裱\n6548\t裳\n6549\t裴\n6550\t裸\n6551\t裹\n6552\t裾\n6553\t褀\n6554\t褂\n6555\t褆\n6556\t褉\n6557\t褋\n6558\t褐\n6559\t褒\n6560\t褓\n6561\t褔\n6562\t褙\n6563\t褚\n6564\t褛\n6565\t褡\n6566\t褥\n6567\t褪\n6568\t褫\n6569\t褰\n6570\t褴\n6571\t褶\n6572\t襁\n6573\t襄\n6574\t襙\n6575\t襞\n6576\t襟\n6577\t襦\n6578\t襻\n6579\t西\n6580\t覀\n6581\t要\n6582\t覃\n6583\t覅\n6584\t覆\n6585\t覌\n6586\t規\n6587\t覗\n6588\t覚\n6589\t覧\n6590\t観\n6591\t见\n6592\t观\n6593\t觅\n6594\t视\n6595\t觇\n6596\t览\n6597\t觉\n6598\t觊\n6599\t觌\n6600\t觎\n6601\t觐\n6602\t觑\n6603\t角\n6604\t觚\n6605\t觜\n6606\t觞\n6607\t解\n6608\t觥\n6609\t触\n6610\t言\n6611\t訇\n6612\t訚\n6613\t訫\n6614\t訳\n6615\t訸\n6616\t訾\n6617\t詈\n6618\t詹\n6619\t誉\n6620\t誊\n6621\t誓\n6622\t読\n6623\t謇\n6624\t謦\n6625\t警\n6626\t譬\n6627\t譲\n6628\t讃\n6629\t讠\n6630\t计\n6631\t订\n6632\t讣\n6633\t认\n6634\t讥\n6635\t讦\n6636\t讧\n6637\t讨\n6638\t让\n6639\t讪\n6640\t讫\n6641\t讬\n6642\t训\n6643\t议\n6644\t讯\n6645\t记\n6646\t讲\n6647\t讳\n6648\t讴\n6649\t讵\n6650\t讶\n6651\t讷\n6652\t许\n6653\t讹\n6654\t论\n6655\t讼\n6656\t讽\n6657\t设\n6658\t访\n6659\t诀\n6660\t证\n6661\t诂\n6662\t诃\n6663\t评\n6664\t诅\n6665\t识\n6666\t诈\n6667\t诉\n6668\t诊\n6669\t诋\n6670\t诌\n6671\t词\n6672\t诎\n6673\t诏\n6674\t译\n6675\t诒\n6676\t诔\n6677\t试\n6678\t诗\n6679\t诘\n6680\t诙\n6681\t诚\n6682\t诛\n6683\t诜\n6684\t话\n6685\t诞\n6686\t诟\n6687\t诠\n6688\t诡\n6689\t询\n6690\t诣\n6691\t诤\n6692\t该\n6693\t详\n6694\t诧\n6695\t诨\n6696\t诩\n6697\t诫\n6698\t诬\n6699\t语\n6700\t诮\n6701\t误\n6702\t诰\n6703\t诱\n6704\t诲\n6705\t诳\n6706\t说\n6707\t诵\n6708\t诶\n6709\t请\n6710\t诸\n6711\t诹\n6712\t诺\n6713\t读\n6714\t诼\n6715\t诽\n6716\t课\n6717\t诿\n6718\t谀\n6719\t谁\n6720\t谂\n6721\t调\n6722\t谄\n6723\t谅\n6724\t谆\n6725\t谇\n6726\t谈\n6727\t谊\n6728\t谋\n6729\t谌\n6730\t谍\n6731\t谎\n6732\t谏\n6733\t谐\n6734\t谒\n6735\t谓\n6736\t谔\n6737\t谕\n6738\t谖\n6739\t谗\n6740\t谙\n6741\t谚\n6742\t谛\n6743\t谜\n6744\t谝\n6745\t谞\n6746\t谟\n6747\t谠\n6748\t谡\n6749\t谢\n6750\t谣\n6751\t谤\n6752\t谥\n6753\t谦\n6754\t谧\n6755\t谨\n6756\t谩\n6757\t谪\n6758\t谬\n6759\t谭\n6760\t谮\n6761\t谯\n6762\t谰\n6763\t谱\n6764\t谲\n6765\t谳\n6766\t谴\n6767\t谵\n6768\t谶\n6769\t谷\n6770\t豁\n6771\t豆\n6772\t豇\n6773\t豉\n6774\t豊\n6775\t豌\n6776\t豕\n6777\t豚\n6778\t象\n6779\t豢\n6780\t豨\n6781\t豪\n6782\t豫\n6783\t豳\n6784\t豸\n6785\t豹\n6786\t豺\n6787\t貂\n6788\t貅\n6789\t貉\n6790\t貊\n6791\t貌\n6792\t貔\n6793\t貘\n6794\t賨\n6795\t賮\n6796\t賯\n6797\t賰\n6798\t賱\n6799\t賲\n6800\t賳\n6801\t賶\n6802\t贛\n6803\t贝\n6804\t贞\n6805\t负\n6806\t贠\n6807\t贡\n6808\t财\n6809\t责\n6810\t贤\n6811\t败\n6812\t账\n6813\t货\n6814\t质\n6815\t贩\n6816\t贪\n6817\t贫\n6818\t贬\n6819\t购\n6820\t贮\n6821\t贯\n6822\t贰\n6823\t贱\n6824\t贲\n6825\t贴\n6826\t贵\n6827\t贶\n6828\t贷\n6829\t贸\n6830\t费\n6831\t贺\n6832\t贻\n6833\t贼\n6834\t贽\n6835\t贾\n6836\t贿\n6837\t赁\n6838\t赂\n6839\t赃\n6840\t资\n6841\t赅\n6842\t赈\n6843\t赉\n6844\t赊\n6845\t赋\n6846\t赌\n6847\t赍\n6848\t赎\n6849\t赏\n6850\t赐\n6851\t赑\n6852\t赓\n6853\t赔\n6854\t赖\n6855\t赗\n6856\t赘\n6857\t赚\n6858\t赛\n6859\t赜\n6860\t赝\n6861\t赞\n6862\t赟\n6863\t赠\n6864\t赡\n6865\t赢\n6866\t赤\n6867\t赦\n6868\t赧\n6869\t赪\n6870\t赫\n6871\t赭\n6872\t赮\n6873\t走\n6874\t赳\n6875\t赴\n6876\t赵\n6877\t赶\n6878\t起\n6879\t赿\n6880\t趁\n6881\t趄\n6882\t超\n6883\t越\n6884\t趋\n6885\t趐\n6886\t趔\n6887\t趟\n6888\t趣\n6889\t足\n6890\t趴\n6891\t趵\n6892\t趸\n6893\t趺\n6894\t趾\n6895\t跂\n6896\t跃\n6897\t跄\n6898\t跆\n6899\t跋\n6900\t跌\n6901\t跎\n6902\t跏\n6903\t跑\n6904\t跖\n6905\t跗\n6906\t跚\n6907\t跛\n6908\t距\n6909\t跞\n6910\t跟\n6911\t跣\n6912\t跤\n6913\t跨\n6914\t跩\n6915\t跪\n6916\t跬\n6917\t路\n6918\t跳\n6919\t践\n6920\t跶\n6921\t跷\n6922\t跸\n6923\t跹\n6924\t跺\n6925\t跻\n6926\t跽\n6927\t踅\n6928\t踉\n6929\t踊\n6930\t踌\n6931\t踏\n6932\t踝\n6933\t踞\n6934\t踟\n6935\t踢\n6936\t踩\n6937\t踪\n6938\t踬\n6939\t踮\n6940\t踯\n6941\t踱\n6942\t踵\n6943\t踹\n6944\t踽\n6945\t蹀\n6946\t蹁\n6947\t蹂\n6948\t蹄\n6949\t蹇\n6950\t蹈\n6951\t蹉\n6952\t蹊\n6953\t蹋\n6954\t蹑\n6955\t蹒\n6956\t蹖\n6957\t蹙\n6958\t蹚\n6959\t蹦\n6960\t蹩\n6961\t蹬\n6962\t蹭\n6963\t蹰\n6964\t蹲\n6965\t蹴\n6966\t蹶\n6967\t蹼\n6968\t蹿\n6969\t躁\n6970\t躅\n6971\t躇\n6972\t躏\n6973\t躔\n6974\t躙\n6975\t躞\n6976\t身\n6977\t躬\n6978\t躯\n6979\t躰\n6980\t躲\n6981\t躺\n6982\t躾\n6983\t転\n6984\t軽\n6985\t车\n6986\t轧\n6987\t轨\n6988\t轩\n6989\t轫\n6990\t转\n6991\t轭\n6992\t轮\n6993\t软\n6994\t轰\n6995\t轱\n6996\t轲\n6997\t轳\n6998\t轴\n6999\t轵\n7000\t轶\n7001\t轸\n7002\t轹\n7003\t轻\n7004\t轼\n7005\t载\n7006\t轿\n7007\t辂\n7008\t较\n7009\t辄\n7010\t辅\n7011\t辆\n7012\t辇\n7013\t辈\n7014\t辉\n7015\t辊\n7016\t辋\n7017\t辍\n7018\t辎\n7019\t辏\n7020\t辐\n7021\t辑\n7022\t输\n7023\t辔\n7024\t辕\n7025\t辖\n7026\t辗\n7027\t辘\n7028\t辙\n7029\t辚\n7030\t辛\n7031\t辜\n7032\t辞\n7033\t辟\n7034\t辣\n7035\t辨\n7036\t辩\n7037\t辫\n7038\t辰\n7039\t辱\n7040\t辶\n7041\t边\n7042\t辺\n7043\t辻\n7044\t込\n7045\t辽\n7046\t达\n7047\t辿\n7048\t迀\n7049\t迁\n7050\t迂\n7051\t迄\n7052\t迅\n7053\t过\n7054\t迈\n7055\t迎\n7056\t运\n7057\t近\n7058\t返\n7059\t还\n7060\t这\n7061\t进\n7062\t远\n7063\t违\n7064\t连\n7065\t迟\n7066\t迢\n7067\t迤\n7068\t迥\n7069\t迦\n7070\t迨\n7071\t迩\n7072\t迪\n7073\t迫\n7074\t迭\n7075\t迮\n7076\t述\n7077\t迷\n7078\t迸\n7079\t迹\n7080\t追\n7081\t送\n7082\t适\n7083\t逃\n7084\t逄\n7085\t逅\n7086\t逆\n7087\t选\n7088\t逊\n7089\t逋\n7090\t逍\n7091\t透\n7092\t逐\n7093\t逑\n7094\t递\n7095\t途\n7096\t逖\n7097\t逗\n7098\t通\n7099\t逛\n7100\t逝\n7101\t逞\n7102\t速\n7103\t造\n7104\t逡\n7105\t逢\n7106\t逦\n7107\t逮\n7108\t逯\n7109\t逵\n7110\t逶\n7111\t逸\n7112\t逹\n7113\t逺\n7114\t逻\n7115\t逼\n7116\t逾\n7117\t遁\n7118\t遂\n7119\t遄\n7120\t遅\n7121\t遇\n7122\t遍\n7123\t遏\n7124\t遐\n7125\t遑\n7126\t遒\n7127\t道\n7128\t遗\n7129\t遛\n7130\t遢\n7131\t遣\n7132\t遥\n7133\t遨\n7134\t遭\n7135\t遮\n7136\t遴\n7137\t遵\n7138\t遹\n7139\t遽\n7140\t避\n7141\t邀\n7142\t邂\n7143\t邃\n7144\t邈\n7145\t邋\n7146\t邑\n7147\t邓\n7148\t邕\n7149\t邗\n7150\t邙\n7151\t邛\n7152\t邝\n7153\t邠\n7154\t邡\n7155\t邢\n7156\t那\n7157\t邦\n7158\t邪\n7159\t邬\n7160\t邮\n7161\t邯\n7162\t邰\n7163\t邱\n7164\t邳\n7165\t邴\n7166\t邵\n7167\t邶\n7168\t邸\n7169\t邹\n7170\t邺\n7171\t邻\n7172\t邽\n7173\t邾\n7174\t郁\n7175\t郃\n7176\t郄\n7177\t郅\n7178\t郇\n7179\t郊\n7180\t郎\n7181\t郏\n7182\t郑\n7183\t郓\n7184\t郗\n7185\t郚\n7186\t郛\n7187\t郜\n7188\t郝\n7189\t郞\n7190\t郡\n7191\t郢\n7192\t郦\n7193\t郧\n7194\t部\n7195\t郪\n7196\t郫\n7197\t郭\n7198\t郯\n7199\t郴\n7200\t郷\n7201\t郸\n7202\t都\n7203\t郾\n7204\t鄀\n7205\t鄂\n7206\t鄄\n7207\t鄕\n7208\t鄙\n7209\t鄚\n7210\t鄜\n7211\t鄞\n7212\t鄢\n7213\t鄣\n7214\t鄯\n7215\t鄱\n7216\t酂\n7217\t酃\n7218\t酆\n7219\t酉\n7220\t酊\n7221\t酋\n7222\t酌\n7223\t配\n7224\t酎\n7225\t酏\n7226\t酐\n7227\t酒\n7228\t酔\n7229\t酗\n7230\t酚\n7231\t酝\n7232\t酞\n7233\t酡\n7234\t酢\n7235\t酣\n7236\t酤\n7237\t酥\n7238\t酩\n7239\t酪\n7240\t酫\n7241\t酬\n7242\t酮\n7243\t酯\n7244\t酰\n7245\t酱\n7246\t酴\n7247\t酵\n7248\t酶\n7249\t酷\n7250\t酸\n7251\t酹\n7252\t酽\n7253\t酾\n7254\t酿\n7255\t醅\n7256\t醇\n7257\t醉\n7258\t醋\n7259\t醌\n7260\t醍\n7261\t醐\n7262\t醒\n7263\t醚\n7264\t醛\n7265\t醡\n7266\t醢\n7267\t醤\n7268\t醪\n7269\t醭\n7270\t醮\n7271\t醴\n7272\t醸\n7273\t醺\n7274\t采\n7275\t釈\n7276\t釉\n7277\t释\n7278\t里\n7279\t重\n7280\t野\n7281\t量\n7282\t金\n7283\t釜\n7284\t釭\n7285\t鈊\n7286\t鈡\n7287\t鉄\n7288\t鉱\n7289\t鉲\n7290\t鉴\n7291\t銆\n7292\t銭\n7293\t銮\n7294\t鋆\n7295\t錧\n7296\t錬\n7297\t錾\n7298\t鍏\n7299\t鍐\n7300\t鍒\n7301\t鍖\n7302\t鍗\n7303\t鍙\n7304\t鍦\n7305\t鍪\n7306\t鎏\n7307\t鎭\n7308\t鎴\n7309\t鎷\n7310\t鏁\n7311\t鏂\n7312\t鏄\n7313\t鏉\n7314\t鏊\n7315\t鏖\n7316\t鏸\n7317\t鐗\n7318\t鐜\n7319\t鐡\n7320\t鐢\n7321\t鑫\n7322\t鑺\n7323\t钅\n7324\t钆\n7325\t钇\n7326\t针\n7327\t钉\n7328\t钊\n7329\t钋\n7330\t钌\n7331\t钍\n7332\t钎\n7333\t钏\n7334\t钐\n7335\t钒\n7336\t钓\n7337\t钕\n7338\t钖\n7339\t钗\n7340\t钙\n7341\t钚\n7342\t钛\n7343\t钝\n7344\t钞\n7345\t钟\n7346\t钠\n7347\t钡\n7348\t钢\n7349\t钣\n7350\t钤\n7351\t钥\n7352\t钦\n7353\t钧\n7354\t钨\n7355\t钩\n7356\t钪\n7357\t钫\n7358\t钬\n7359\t钭\n7360\t钮\n7361\t钯\n7362\t钰\n7363\t钱\n7364\t钲\n7365\t钳\n7366\t钴\n7367\t钵\n7368\t钶\n7369\t钸\n7370\t钹\n7371\t钺\n7372\t钻\n7373\t钼\n7374\t钽\n7375\t钾\n7376\t钿\n7377\t铀\n7378\t铁\n7379\t铂\n7380\t铃\n7381\t铄\n7382\t铅\n7383\t铆\n7384\t铇\n7385\t铈\n7386\t铉\n7387\t铊\n7388\t铋\n7389\t铌\n7390\t铍\n7391\t铎\n7392\t铏\n7393\t铐\n7394\t铑\n7395\t铒\n7396\t铕\n7397\t铖\n7398\t铗\n7399\t铘\n7400\t铙\n7401\t铚\n7402\t铛\n7403\t铜\n7404\t铝\n7405\t铞\n7406\t铟\n7407\t铠\n7408\t铡\n7409\t铢\n7410\t铣\n7411\t铤\n7412\t铥\n7413\t铧\n7414\t铨\n7415\t铩\n7416\t铪\n7417\t铫\n7418\t铬\n7419\t铭\n7420\t铮\n7421\t铯\n7422\t铰\n7423\t铱\n7424\t铲\n7425\t铳\n7426\t铵\n7427\t银\n7428\t铷\n7429\t铸\n7430\t铺\n7431\t铼\n7432\t铿\n7433\t销\n7434\t锁\n7435\t锂\n7436\t锃\n7437\t锄\n7438\t锅\n7439\t锆\n7440\t锇\n7441\t锈\n7442\t锉\n7443\t锋\n7444\t锌\n7445\t锍\n7446\t锎\n7447\t锏\n7448\t锐\n7449\t锑\n7450\t锒\n7451\t锔\n7452\t锕\n7453\t锖\n7454\t锗\n7455\t锘\n7456\t错\n7457\t锚\n7458\t锛\n7459\t锜\n7460\t锝\n7461\t锞\n7462\t锟\n7463\t锠\n7464\t锡\n7465\t锢\n7466\t锣\n7467\t锤\n7468\t锥\n7469\t锦\n7470\t锨\n7471\t锩\n7472\t锪\n7473\t锭\n7474\t键\n7475\t锯\n7476\t锰\n7477\t锱\n7478\t锲\n7479\t锴\n7480\t锵\n7481\t锶\n7482\t锷\n7483\t锹\n7484\t锻\n7485\t锽\n7486\t镀\n7487\t镁\n7488\t镂\n7489\t镄\n7490\t镆\n7491\t镇\n7492\t镈\n7493\t镉\n7494\t镊\n7495\t镋\n7496\t镌\n7497\t镍\n7498\t镏\n7499\t镐\n7500\t镑\n7501\t镒\n7502\t镓\n7503\t镔\n7504\t镕\n7505\t镖\n7506\t镗\n7507\t镘\n7508\t镙\n7509\t镚\n7510\t镛\n7511\t镜\n7512\t镝\n7513\t镞\n7514\t镟\n7515\t镠\n7516\t镡\n7517\t镢\n7518\t镣\n7519\t镤\n7520\t镥\n7521\t镦\n7522\t镧\n7523\t镨\n7524\t镩\n7525\t镪\n7526\t镫\n7527\t镬\n7528\t镭\n7529\t镮\n7530\t镯\n7531\t镰\n7532\t镱\n7533\t镲\n7534\t镳\n7535\t镶\n7536\t长\n7537\t閠\n7538\t閦\n7539\t閪\n7540\t闂\n7541\t闄\n7542\t闘\n7543\t门\n7544\t闩\n7545\t闪\n7546\t闫\n7547\t闭\n7548\t问\n7549\t闯\n7550\t闰\n7551\t闱\n7552\t闲\n7553\t闳\n7554\t间\n7555\t闵\n7556\t闷\n7557\t闸\n7558\t闹\n7559\t闺\n7560\t闻\n7561\t闼\n7562\t闽\n7563\t闾\n7564\t闿\n7565\t阀\n7566\t阂\n7567\t阃\n7568\t阄\n7569\t阅\n7570\t阆\n7571\t阇\n7572\t阈\n7573\t阉\n7574\t阊\n7575\t阋\n7576\t阌\n7577\t阍\n7578\t阎\n7579\t阏\n7580\t阐\n7581\t阑\n7582\t阒\n7583\t阔\n7584\t阕\n7585\t阖\n7586\t阗\n7587\t阙\n7588\t阚\n7589\t阜\n7590\t阝\n7591\t队\n7592\t阡\n7593\t阮\n7594\t阱\n7595\t防\n7596\t阳\n7597\t阴\n7598\t阵\n7599\t阻\n7600\t阿\n7601\t陀\n7602\t陂\n7603\t附\n7604\t际\n7605\t陆\n7606\t陇\n7607\t陈\n7608\t陉\n7609\t陋\n7610\t陌\n7611\t降\n7612\t陏\n7613\t限\n7614\t陔\n7615\t陕\n7616\t陛\n7617\t陜\n7618\t陟\n7619\t陡\n7620\t院\n7621\t除\n7622\t陥\n7623\t陨\n7624\t险\n7625\t陪\n7626\t陬\n7627\t陲\n7628\t陵\n7629\t陶\n7630\t陷\n7631\t険\n7632\t隅\n7633\t隆\n7634\t隈\n7635\t隋\n7636\t隍\n7637\t階\n7638\t随\n7639\t隐\n7640\t隔\n7641\t隗\n7642\t隘\n7643\t隙\n7644\t障\n7645\t隠\n7646\t隧\n7647\t隰\n7648\t隳\n7649\t隶\n7650\t隹\n7651\t隼\n7652\t隽\n7653\t难\n7654\t雀\n7655\t雁\n7656\t雄\n7657\t雅\n7658\t集\n7659\t雇\n7660\t雉\n7661\t雌\n7662\t雍\n7663\t雎\n7664\t雏\n7665\t雑\n7666\t雒\n7667\t雕\n7668\t雨\n7669\t雩\n7670\t雪\n7671\t雫\n7672\t雯\n7673\t雱\n7674\t雳\n7675\t零\n7676\t雷\n7677\t雹\n7678\t雾\n7679\t需\n7680\t霁\n7681\t霂\n7682\t霄\n7683\t霆\n7684\t震\n7685\t霈\n7686\t霉\n7687\t霊\n7688\t霍\n7689\t霎\n7690\t霏\n7691\t霓\n7692\t霖\n7693\t霙\n7694\t霜\n7695\t霞\n7696\t霪\n7697\t霭\n7698\t霰\n7699\t露\n7700\t霸\n7701\t霹\n7702\t霾\n7703\t靐\n7704\t靑\n7705\t青\n7706\t靓\n7707\t靖\n7708\t静\n7709\t靛\n7710\t非\n7711\t靠\n7712\t靡\n7713\t面\n7714\t靥\n7715\t革\n7716\t靬\n7717\t靳\n7718\t靴\n7719\t靶\n7720\t靺\n7721\t靼\n7722\t鞅\n7723\t鞋\n7724\t鞍\n7725\t鞑\n7726\t鞘\n7727\t鞠\n7728\t鞣\n7729\t鞥\n7730\t鞨\n7731\t鞭\n7732\t鞲\n7733\t韡\n7734\t韦\n7735\t韧\n7736\t韩\n7737\t韪\n7738\t韫\n7739\t韬\n7740\t韭\n7741\t韰\n7742\t音\n7743\t韵\n7744\t韶\n7745\t頬\n7746\t顕\n7747\t页\n7748\t顶\n7749\t顷\n7750\t顸\n7751\t项\n7752\t顺\n7753\t须\n7754\t顼\n7755\t顽\n7756\t顾\n7757\t顿\n7758\t颀\n7759\t颁\n7760\t颂\n7761\t颃\n7762\t预\n7763\t颅\n7764\t领\n7765\t颇\n7766\t颈\n7767\t颉\n7768\t颊\n7769\t颋\n7770\t颌\n7771\t颍\n7772\t颎\n7773\t颏\n7774\t颐\n7775\t频\n7776\t颓\n7777\t颔\n7778\t颖\n7779\t颗\n7780\t题\n7781\t颙\n7782\t颚\n7783\t颛\n7784\t颜\n7785\t额\n7786\t颞\n7787\t颠\n7788\t颡\n7789\t颢\n7790\t颣\n7791\t颤\n7792\t颦\n7793\t颧\n7794\t风\n7795\t飒\n7796\t飓\n7797\t飕\n7798\t飖\n7799\t飘\n7800\t飙\n7801\t飞\n7802\t食\n7803\t飧\n7804\t飨\n7805\t餍\n7806\t餐\n7807\t餮\n7808\t饔\n7809\t饕\n7810\t饣\n7811\t饥\n7812\t饦\n7813\t饧\n7814\t饨\n7815\t饪\n7816\t饬\n7817\t饭\n7818\t饮\n7819\t饯\n7820\t饰\n7821\t饱\n7822\t饲\n7823\t饴\n7824\t饵\n7825\t饶\n7826\t饷\n7827\t饸\n7828\t饹\n7829\t饺\n7830\t饼\n7831\t饽\n7832\t饿\n7833\t馁\n7834\t馃\n7835\t馄\n7836\t馅\n7837\t馆\n7838\t馇\n7839\t馈\n7840\t馊\n7841\t馋\n7842\t馍\n7843\t馏\n7844\t馐\n7845\t馑\n7846\t馒\n7847\t馓\n7848\t馔\n7849\t馕\n7850\t首\n7851\t馗\n7852\t香\n7853\t馥\n7854\t馨\n7855\t馫\n7856\t馿\n7857\t駄\n7858\t駅\n7859\t駆\n7860\t騒\n7861\t験\n7862\t騳\n7863\t马\n7864\t驭\n7865\t驮\n7866\t驯\n7867\t驰\n7868\t驱\n7869\t驳\n7870\t驴\n7871\t驶\n7872\t驷\n7873\t驸\n7874\t驹\n7875\t驺\n7876\t驻\n7877\t驼\n7878\t驽\n7879\t驾\n7880\t驿\n7881\t骀\n7882\t骁\n7883\t骂\n7884\t骃\n7885\t骄\n7886\t骅\n7887\t骆\n7888\t骇\n7889\t骈\n7890\t骉\n7891\t骊\n7892\t骋\n7893\t验\n7894\t骎\n7895\t骏\n7896\t骐\n7897\t骑\n7898\t骓\n7899\t骕\n7900\t骖\n7901\t骗\n7902\t骘\n7903\t骙\n7904\t骚\n7905\t骛\n7906\t骜\n7907\t骝\n7908\t骞\n7909\t骟\n7910\t骠\n7911\t骡\n7912\t骢\n7913\t骤\n7914\t骥\n7915\t骧\n7916\t骨\n7917\t骰\n7918\t骶\n7919\t骷\n7920\t骸\n7921\t骺\n7922\t髀\n7923\t髁\n7924\t髂\n7925\t髄\n7926\t髅\n7927\t髋\n7928\t髌\n7929\t髎\n7930\t髑\n7931\t髓\n7932\t高\n7933\t髙\n7934\t髡\n7935\t髦\n7936\t髪\n7937\t髫\n7938\t髭\n7939\t髯\n7940\t髹\n7941\t髻\n7942\t鬃\n7943\t鬄\n7944\t鬓\n7945\t鬘\n7946\t鬟\n7947\t鬣\n7948\t鬯\n7949\t鬲\n7950\t鬻\n7951\t鬼\n7952\t魁\n7953\t魂\n7954\t魃\n7955\t魄\n7956\t魅\n7957\t魇\n7958\t魈\n7959\t魉\n7960\t魍\n7961\t魏\n7962\t魑\n7963\t魔\n7964\t魕\n7965\t魟\n7966\t鮨\n7967\t鮰\n7968\t鰕\n7969\t鱼\n7970\t鱿\n7971\t鲀\n7972\t鲁\n7973\t鲂\n7974\t鲃\n7975\t鲅\n7976\t鲆\n7977\t鲇\n7978\t鲈\n7979\t鲉\n7980\t鲊\n7981\t鲋\n7982\t鲌\n7983\t鲍\n7984\t鲎\n7985\t鲏\n7986\t鲐\n7987\t鲑\n7988\t鲔\n7989\t鲖\n7990\t鲘\n7991\t鲚\n7992\t鲛\n7993\t鲜\n7994\t鲞\n7995\t鲟\n7996\t鲠\n7997\t鲡\n7998\t鲢\n7999\t鲣\n8000\t鲤\n8001\t鲥\n8002\t鲦\n8003\t鲧\n8004\t鲨\n8005\t鲩\n8006\t鲫\n8007\t鲭\n8008\t鲮\n8009\t鲱\n8010\t鲲\n8011\t鲳\n8012\t鲴\n8013\t鲵\n8014\t鲷\n8015\t鲸\n8016\t鲹\n8017\t鲺\n8018\t鲻\n8019\t鲼\n8020\t鲽\n8021\t鳀\n8022\t鳃\n8023\t鳄\n8024\t鳅\n8025\t鳇\n8026\t鳉\n8027\t鳊\n8028\t鳌\n8029\t鳍\n8030\t鳎\n8031\t鳏\n8032\t鳐\n8033\t鳑\n8034\t鳔\n8035\t鳕\n8036\t鳖\n8037\t鳗\n8038\t鳘\n8039\t鳙\n8040\t鳜\n8041\t鳝\n8042\t鳞\n8043\t鳟\n8044\t鳡\n8045\t鳢\n8046\t鳮\n8047\t鳯\n8048\t鳽\n8049\t鵺\n8050\t鶏\n8051\t鷇\n8052\t鸟\n8053\t鸠\n8054\t鸡\n8055\t鸢\n8056\t鸣\n8057\t鸥\n8058\t鸦\n8059\t鸨\n8060\t鸩\n8061\t鸪\n8062\t鸫\n8063\t鸬\n8064\t鸭\n8065\t鸮\n8066\t鸯\n8067\t鸰\n8068\t鸱\n8069\t鸲\n8070\t鸳\n8071\t鸵\n8072\t鸶\n8073\t鸷\n8074\t鸸\n8075\t鸹\n8076\t鸻\n8077\t鸽\n8078\t鸾\n8079\t鸿\n8080\t鹀\n8081\t鹁\n8082\t鹂\n8083\t鹃\n8084\t鹄\n8085\t鹅\n8086\t鹆\n8087\t鹇\n8088\t鹈\n8089\t鹉\n8090\t鹊\n8091\t鹋\n8092\t鹌\n8093\t鹍\n8094\t鹎\n8095\t鹏\n8096\t鹑\n8097\t鹓\n8098\t鹕\n8099\t鹗\n8100\t鹘\n8101\t鹚\n8102\t鹛\n8103\t鹜\n8104\t鹞\n8105\t鹟\n8106\t鹡\n8107\t鹣\n8108\t鹤\n8109\t鹦\n8110\t鹧\n8111\t鹨\n8112\t鹩\n8113\t鹪\n8114\t鹫\n8115\t鹬\n8116\t鹭\n8117\t鹮\n8118\t鹰\n8119\t鹳\n8120\t鹿\n8121\t麂\n8122\t麇\n8123\t麈\n8124\t麋\n8125\t麑\n8126\t麒\n8127\t麓\n8128\t麝\n8129\t麟\n8130\t麦\n8131\t麸\n8132\t麺\n8133\t麻\n8134\t麾\n8135\t麿\n8136\t黄\n8137\t黉\n8138\t黍\n8139\t黎\n8140\t黏\n8141\t黐\n8142\t黑\n8143\t黒\n8144\t黔\n8145\t黖\n8146\t默\n8147\t黙\n8148\t黛\n8149\t黜\n8150\t黝\n8151\t黟\n8152\t黠\n8153\t黢\n8154\t黥\n8155\t黧\n8156\t黩\n8157\t黪\n8158\t黯\n8159\t黻\n8160\t黼\n8161\t黾\n8162\t鼋\n8163\t鼍\n8164\t鼎\n8165\t鼐\n8166\t鼓\n8167\t鼔\n8168\t鼗\n8169\t鼙\n8170\t鼠\n8171\t鼢\n8172\t鼩\n8173\t鼬\n8174\t鼯\n8175\t鼹\n8176\t鼻\n8177\t鼾\n8178\t齁\n8179\t齉\n8180\t齐\n8181\t齑\n8182\t齢\n8183\t齾\n8184\t齿\n8185\t龃\n8186\t龄\n8187\t龅\n8188\t龇\n8189\t龈\n8190\t龉\n8191\t龊\n8192\t龋\n8193\t龌\n8194\t龖\n8195\t龘\n8196\t龙\n8197\t龚\n8198\t龛\n8199\t龟\n8200\t龠\n8201\t\n8202\t\n8203\t\n8204\t\n8205\t\n8206\t\n8207\t\n8208\t𨱇\n8209\t𩽾\n8210\t𩾃\n8211\t𩾌\n8212\t𪩘\n8213\t𫍽\n8214\t𫐓\n8215\t𫚭\n8216\t𬀩\n8217\t𬒈\n8218\t𬭎\n8219\t𬱖\n8220\t𬶋\n8221\t𬶍\n8222\t𬸦\n8223\tOOV\n"
  },
  {
    "path": "Android/testlac/app/src/main/cpp/CMakeLists.txt",
    "content": "# For more information about using CMake with Android Studio, read the\n# documentation: https://d.android.com/studio/projects/add-native-code.html\n\n# Sets the minimum version of CMake required to build the native library.\n\ncmake_minimum_required(VERSION 3.4.1)\ninclude_directories(${CMAKE_CURRENT_SOURCE_DIR}/paddle/include)\n\n# Creates and names a library, sets it as either STATIC\n# or SHARED, and provides the relative paths to its source code.\n# You can define multiple libraries, and CMake builds them for you.\n# Gradle automatically packages shared libraries with your APK.\nset(CMAKE_CXX_FLAGS\n        \"${CMAKE_CXX_FLAGS} -ffast-math -Ofast -Os -DNDEBUG -fno-exceptions -fomit-frame-pointer -fno-asynchronous-unwind-tables -fno-unwind-tables\"\n        )\nset(CMAKE_CXX_FLAGS\n        \"${CMAKE_CXX_FLAGS} -fvisibility=hidden -fvisibility-inlines-hidden -fdata-sections -ffunction-sections\"\n        )\nset(CMAKE_SHARED_LINKER_FLAGS\n        \"${CMAKE_SHARED_LINKER_FLAGS} -Wl,--gc-sections -Wl,-z,nocopyreloc\")\n\nadd_library( # Sets the name of the library.\n        native_lib\n        # Sets the library as a shared library.\n        SHARED\n        # Provides a relative path to your source file(s).\n        native_lib.cpp\n        lac.h\n        lac.cpp\n        lac_util.h\n        lac_util.cpp\n        )\n\nfind_library( # Sets the name of the path variable.\n        log-lib\n        # Specifies the name of the NDK library that\n        # you want CMake to locate.\n        log)\n\n# add paddle library\nadd_library(\n        paddle_lite_jni\n        SHARED\n        IMPORTED\n)\n\nif(${ANDROID_ABI} STREQUAL \"armeabi-v7a\")\n    set_target_properties(\n            paddle_lite_jni\n            PROPERTIES IMPORTED_LOCATION\n            ${CMAKE_CURRENT_SOURCE_DIR}/../jniLibs/${ANDROID_ABI}/libpaddle_light_api_shared.so)\nelse()\n    set_target_properties(\n            paddle_lite_jni\n            PROPERTIES IMPORTED_LOCATION\n            ${CMAKE_CURRENT_SOURCE_DIR}/../jniLibs/${ANDROID_ABI}/libpaddle_lite_jni.so)\n\nendif()\n\ntarget_link_libraries( # Specifies the target library.\n        native_lib\n        paddle_lite_jni\n        # Links the target library to the log library\n        # included in the NDK.\n        ${log-lib})"
  },
  {
    "path": "Android/testlac/app/src/main/cpp/lac.cpp",
    "content": "/* Copyright (c) 2020 Baidu, Inc. All Rights Reserved.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License. */\n\n#include <iostream>\n#include<fstream>\n#include<iostream>\n#include \"lac.h\"\n#include \"lac_util.h\"\n#include \"paddle_api.h\"\n\n/* LAC构造函数：初始化、装载模型和词典 */\nLAC::LAC(std::string model_dict_path, int threads, CODE_TYPE type)\n    : _codetype(type),\n      _lod(std::vector<std::vector<uint64_t> >(1)),\n      _word2id_dict(new std::unordered_map<std::string, int64_t>),\n      _q2b_dict(new std::unordered_map<std::string, std::string>),\n      _id2label_dict(new std::unordered_map<int64_t, std::string>)\n{\n    /* 装载词典 */\n    std::string word_dict_path = model_dict_path + \"/word.dic\";\n    load_word2id_dict(word_dict_path, *_word2id_dict);\n    std::string q2b_dict_path = model_dict_path + \"/q2b.dic\";\n    load_q2b_dict(q2b_dict_path, *_q2b_dict);\n    std::string label_dict_path = model_dict_path + \"/tag.dic\";\n    load_id2label_dict(label_dict_path, *_id2label_dict);\n    std::cout << \"read word dict succeed\" << std::endl;\n\n    paddle::lite_api::MobileConfig config;\n    config.set_threads(threads);  // 自行设置多线程\n\n    /* 装载模型 */\n    config.set_model_from_file(model_dict_path + \"/model.nb\");\n    this->_predictor = paddle::lite_api::CreatePaddlePredictor(config);\n\n    std::cout << \"load model succeed\" << std::endl;\n\n    /* 初始化输入输出变量 */\n    this->_input_tensor = this->_predictor->GetInput(0);\n    this->_output_tensor = this->_predictor->GetOutput(0);\n    this->_oov_id = this->_word2id_dict->size() - 1;\n    auto word_iter = this->_word2id_dict->find(\"OOV\");\n    if (word_iter != this->_word2id_dict->end())\n    {\n        this->_oov_id = word_iter->second;\n    }\n\n    std::cout << \"init succeed\" << std::endl;\n}\n\n\nint LAC::feed_data(const std::vector<std::string> &querys)\n{\n    this->_seq_words_batch.clear();\n    this->_lod[0].clear();\n\n    this->_lod[0].push_back(0);\n    long shape = 0;\n    for (size_t i = 0; i < querys.size(); ++i)\n    {\n        split_words(querys[i], this->_codetype, this->_seq_words);\n        this->_seq_words_batch.push_back(this->_seq_words);\n        shape += this->_seq_words.size();\n        this->_lod[0].push_back(shape);\n    }\n    this->_input_tensor->Resize({shape, 1});\n    this->_input_tensor->SetLoD(this->_lod);\n\n    int64_t *input_d = this->_input_tensor->mutable_data<int64_t>();\n    int index = 0;\n    for (size_t i = 0; i < this->_seq_words_batch.size(); ++i)\n    {\n        for (size_t j = 0; j < this->_seq_words_batch[i].size(); ++j)\n        {\n            /* normalization */\n            std::string word = this->_seq_words_batch[i][j];\n            auto q2b_iter = this->_q2b_dict->find(word);\n            if (q2b_iter != this->_q2b_dict->end())\n            {\n                word = q2b_iter->second;\n            }\n\n            /* get word_id */\n            int64_t word_id = this->_oov_id; // OOV word\n            auto word_iter = this->_word2id_dict->find(word);\n            if (word_iter != this->_word2id_dict->end())\n            {\n                word_id = word_iter->second;\n            }\n            input_d[index++] = word_id;\n        }\n    }\n    return 0;\n}\n\n/* 对输出的标签进行解码转换为模型输出格式 */\nint LAC::parse_targets(\n    const std::vector<std::string> &tags,\n    const std::vector<std::string> &words,\n    std::vector<OutputItem> &result)\n{\n    result.clear();\n    for (size_t i = 0; i < tags.size(); ++i)\n    {\n        /* 若新词，则push_back一个新词，否则append到上一个词中 */\n        if (result.empty() || tags[i].rfind(\"B\") == tags[i].length() - 1 || tags[i].rfind(\"S\") == tags[i].length() - 1)\n        {\n            OutputItem output_item;\n            output_item.word = words[i];\n            output_item.tag = tags[i].substr(0, tags[i].length() - 2);\n            result.push_back(output_item);\n        }\n        else\n        {\n            result[result.size() - 1].word += words[i];\n        }\n    }\n    return 0;\n}\n\nstd::vector<OutputItem> LAC::lexer(const std::string &query)\n{\n\n    std::vector<std::string> query_vector = std::vector<std::string>({query});\n\n    auto result = lexer(query_vector);\n    return result[0];\n}\n\nstd::vector<std::vector<OutputItem>> LAC::lexer(const std::vector<std::string> &querys)\n{\n\n    this->feed_data(querys);\n    this->_predictor->Run();\n\n    /* 对模型输出进行解码 */\n    int output_size = 0;\n    const int64_t *output_d = this->_output_tensor->data<int64_t>();\n    this->_labels.clear();\n    this->_results_batch.clear();\n    for (size_t i = 0; i < this->_lod[0].size() - 1; ++i)\n    {\n        for (size_t j = 0; j < _lod[0][i + 1] - _lod[0][i]; ++j)\n        {\n\n            int64_t cur_label_id = output_d[_lod[0][i] + j];\n            auto it = this->_id2label_dict->find(cur_label_id);\n            this->_labels.push_back(it->second);\n        }\n        parse_targets(this->_labels, this->_seq_words_batch[i], this->_results);\n        this->_labels.clear();\n\n        _results_batch.push_back(this->_results);\n    }\n\n    return this->_results_batch;\n}\n"
  },
  {
    "path": "Android/testlac/app/src/main/cpp/lac.h",
    "content": "/* Copyright (c) 2020 Baidu, Inc. All Rights Reserved.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License. */\n\n#ifndef BAIDU_LAC_LAC_H\n#define BAIDU_LAC_LAC_H\n#include <unordered_map>\n#include <memory>\n#include <string>\n#include <vector>\n#include \"paddle_api.h\"\n\n/* 编码设置 */\nenum CODE_TYPE\n{\n    CODE_GB18030 = 0,\n    CODE_UTF8 = 1,\n};\n\n/* 模型输出的结构 */\nstruct OutputItem\n{\n    std::string word;   // 分词结果\n    std::string tag;    // 单词类型\n};\n\n#endif\n\n#ifndef LAC_CLASS\n#define LAC_CLASS\nclass LAC\n{\nprivate:\n    CODE_TYPE _codetype;\n\n    /* 中间变量 */\n    std::vector<std::string> _seq_words;\n    std::vector<std::vector<std::string>> _seq_words_batch;\n    std::vector<std::vector<uint64_t>> _lod;\n    std::vector<std::string> _labels;\n    std::vector<OutputItem> _results;\n    std::vector<std::vector<OutputItem>> _results_batch;\n\n    /* 数据转换词典 */\n    std::shared_ptr<std::unordered_map<int64_t, std::string>> _id2label_dict;\n    std::shared_ptr<std::unordered_map<std::string, std::string>> _q2b_dict;\n    std::shared_ptr<std::unordered_map<std::string, int64_t>> _word2id_dict;\n    int64_t _oov_id;\n\n    /* paddle数据结构*/\n    std::shared_ptr<paddle::lite_api::PaddlePredictor> _predictor;    // \n    std::unique_ptr<paddle::lite_api::Tensor> _input_tensor;  //  \n    std::unique_ptr<const paddle::lite_api::Tensor> _output_tensor; //\n\nprivate:\n    /* 将字符串输入转为Tensor */\n    int feed_data(const std::vector<std::string> &querys);\n\n    /* 将模型标签结果转换为模型输出格式 */\n    int parse_targets(\n        const std::vector<std::string> &tag_ids,\n        const std::vector<std::string> &words,\n        std::vector<OutputItem> &result);\n\npublic:\n    /* 初始化：装载模型和词典 */\n    explicit LAC(std::string model_dict_path, int threads = 1, CODE_TYPE type = CODE_UTF8);\n    /* 更新为单个字典文件, 去除protobuf依赖删除 */\n    // explicit LAC(std::string model_dict_path, int threads = 1, CODE_TYPE type = CODE_UTF8);\n\n\n    /* 调用程序 */\n    std::vector<OutputItem> lexer(const std::string &query);                           // 单个query\n    std::vector<std::vector<OutputItem>> lexer(const std::vector<std::string> &query); // batch\n};\n#endif\n\n"
  },
  {
    "path": "Android/testlac/app/src/main/cpp/lac_util.cpp",
    "content": "/* Copyright (c) 2020 Baidu, Inc. All Rights Reserved.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License. */\n\n#include \"lac_util.h\"\n\n// 以pattern作为切割符，对line进行切分并放入tokens中\nRVAL split_tokens(const std::string &line, const std::string &pattern,\n                  std::vector<std::string> &tokens)\n{\n    if (\"\" == line || \"\" == pattern)\n    {\n        return _FAILD;\n    }\n\n    tokens.clear();\n    int pos = 0;\n    int size = line.size();\n\n    for (int i = 0; i < size; i++)\n    {\n        pos = line.find(pattern, i);\n\n        if (-1 != pos)\n        {\n            tokens.push_back(line.substr(i, pos - i));\n            i = pos + pattern.size() - 1;\n        }\n        else\n        {\n            tokens.push_back(line.substr(i));\n            break;\n        }\n    } // end of for\n    return _SUCCESS;\n}\n\n// 装载字符转为数字index的词典\nRVAL load_word2id_dict(const std::string &filepath,\n                       std::unordered_map<std::string, int64_t> &kv_dict)\n{\n    kv_dict.clear();\n    std::ifstream infile(filepath);\n    if (infile.fail())\n    {\n        return _FAILD;\n    }\n\n    std::string line = \"\";\n    std::vector<std::string> tokens;\n    while (std::getline(infile, line) && infile.good())\n    {\n        split_tokens(line, \"\\t\", tokens);\n        if (\"\" == line || 2 != tokens.size())\n        {\n            continue;\n        }\n        int64_t val = std::stoll(tokens[0]);\n        std::string key = tokens[1];\n        kv_dict[key] = val;\n    }\n    infile.close();\n    return _SUCCESS;\n}\n\n// 装载字符正则化的词典\nRVAL load_q2b_dict(const std::string &filepath,\n                   std::unordered_map<std::string, std::string> &kv_dict)\n{\n    kv_dict.clear();\n    std::ifstream infile(filepath);\n    if (infile.fail())\n    {\n        return _FAILD;\n    }\n\n    std::string line = \"\";\n    std::vector<std::string> tokens;\n    while (std::getline(infile, line) && infile.good())\n    {\n        split_tokens(line, \"\\t\", tokens);\n        if (\"\" == line || 2 != tokens.size())\n        {\n            continue;\n        }\n        kv_dict[tokens[0]] = tokens[1];\n    }\n    infile.close();\n    return _SUCCESS;\n}\n\n// 装载label解码用的词典\nRVAL load_id2label_dict(const std::string &filepath,\n                        std::unordered_map<int64_t, std::string> &kv_dict)\n{\n    kv_dict.clear();\n    std::ifstream infile(filepath);\n    if (infile.fail())\n    {\n        return _FAILD;\n    }\n\n    std::string line = \"\";\n    std::vector<std::string> tokens;\n    while (std::getline(infile, line) && infile.good())\n    {\n        split_tokens(line, \"\\t\", tokens);\n        if (\"\" == line || 2 != tokens.size())\n        {\n            continue;\n        }\n        int64_t key = std::stoll(tokens[0]);\n        std::string val = tokens[1];\n        kv_dict[key] = val;\n    }\n    infile.close();\n    return _SUCCESS;\n}\n\n// 获取下一个gb18030字符的长度\nint get_next_gb18030(const char *str)\n{\n    unsigned char *str_in = (unsigned char *)str;\n    if (str_in[0] < 0x80)\n    {\n        return 1;\n    }\n    if (str_in[0] >= 0x81 && str_in[0] <= 0xfe &&\n        str_in[1] >= 0x40 && str_in[1] <= 0xFE && str_in[1] != 0x7F)\n    {\n        return 2;\n    }\n    if (str_in[0] >= 0x81 && str_in[0] <= 0xfe &&\n        str_in[1] >= 0x30 && str_in[1] <= 0x39 &&\n        str_in[2] >= 0x81 && str_in[2] <= 0xfe &&\n        str_in[3] >= 0x30 && str_in[3] <= 0x39)\n    {\n        return 4;\n    }\n    return 0;\n}\n\n// 获取下一个UTF8字符的长度\nint get_next_utf8(const char *str)\n{\n    unsigned char *str_in = (unsigned char *)str;\n    if (str_in[0] < 0x80)\n    {\n        return 1;\n    }\n    if (str_in[0] >= 0xC2 && str_in[0] < 0xE0 &&\n        str_in[1] >> 6 == 2)\n    {\n        return 2;\n    }\n    if (str_in[0] >> 4 == 14 && str_in[1] >> 6 == 2 &&\n        str_in[2] >> 6 == 2 && (str_in[0] > 0xE0 || str_in[1] >= 0xA0))\n    {\n        return 3;\n    }\n    if (str_in[0] >> 3 == 30 && str_in[1] >> 6 == 2 && str_in[2] >> 6 == 2 &&\n        str_in[3] >> 6 == 2 && str_in[0] <= 0xF4 && (str_in[0] > 0xF0 || str_in[1] >= 0x90))\n    {\n        return 4;\n    }\n    return 0;\n}\n\n// 获取下一个codetype字符的长度\nint get_next_word(const char *str, CODE_TYPE codetype)\n{\n    int len = 0;\n    switch (codetype)\n    {\n        case CODE_GB18030:\n            len = get_next_gb18030(str);\n            break;\n        case CODE_UTF8:\n            len = get_next_utf8(str);\n            break;\n        default:\n            len = 0;\n            break;\n    }\n    len = len == 0 ? 1 : len;\n    return len;\n}\n\n// 将字符串按照单字切分\nRVAL split_words(const char *input, int len, CODE_TYPE codetype, std::vector<std::string> &words)\n{\n    words.clear();\n    char *p = (char *)input;\n    int temp_len = 0;\n    std::string key;\n    for (int i = 0; i < len; i += temp_len)\n    {\n        temp_len = get_next_word(p, codetype);\n        key.assign(p, temp_len);\n        words.push_back(key);\n        p += temp_len;\n    }\n    return _SUCCESS;\n}\n\n// 将字符串按照单字切分\nRVAL split_words(const std::string &input, CODE_TYPE codetype, std::vector<std::string> &words)\n{\n    const char *p = input.c_str();\n    int len = input.length();\n    return split_words(p, len, codetype, words);\n}\n"
  },
  {
    "path": "Android/testlac/app/src/main/cpp/lac_util.h",
    "content": "/* Copyright (c) 2020 Baidu, Inc. All Rights Reserved.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License. */\n\n#ifndef BAIDU_LAC_LAC_UTIL_H\n#define BAIDU_LAC_LAC_UTIL_H\n\n#include <vector>\n#include <string>\n#include <fstream>\n#include <unordered_map>\n\n#include \"lac.h\"\n/* 函数返回值 */\nenum RVAL\n{\n    _SUCCESS = 0,\n    _FAILD = -1,\n};\n\n// 以pattern作为切割符，对line进行切分并放入tokens中\nRVAL split_tokens(const std::string &line, const std::string &pattern,\n                  std::vector<std::string> &tokens);\n\n// 装载字符串输入转为数字的词典\nRVAL load_word2id_dict(const std::string &filepath,\n                       std::unordered_map<std::string, int64_t> &kv_dict);\n\n// 装载字符正则化的词典\nRVAL load_q2b_dict(const std::string &filepath,\n                   std::unordered_map<std::string, std::string> &kv_dict);\n\n// 装载label解码用的词典\nRVAL load_id2label_dict(const std::string &filepath,\n                        std::unordered_map<int64_t, std::string> &kv_dict);\n\n// 获取下一个字的长度\nint get_next_gb18030(const char *str);\nint get_next_utf8(const char *str);\nint get_next_word(const char *str, CODE_TYPE codetype);\n\n// 将字符串按照单字切分\nRVAL split_words(const char *input, int len, CODE_TYPE codetype, std::vector<std::string> &words);\nRVAL split_words(const std::string &input, CODE_TYPE codetype, std::vector<std::string> &words);\n\n#endif\n\n\n"
  },
  {
    "path": "Android/testlac/app/src/main/cpp/native_lib.cpp",
    "content": "#include <jni.h>\n#include <string>\n#include <iostream>\n#include <fstream>\n#include <ctime>\n#include <sys/time.h>\n#include <android/log.h>\n#include \"lac.h\"\n#define LOGI(...) \\\n  ((void)__android_log_print(ANDROID_LOG_INFO, \"lac_demo::\", __VA_ARGS__))\n\nstd::unique_ptr<LAC> uPtr_Lac;\n\nextern \"C\"\nJNIEXPORT void JNICALL\nJava_com_example_testlac_MainActivity_initLac(JNIEnv *env, jobject thiz, jstring model_path) {\n    std::unique_ptr<LAC> lac(new LAC(env->GetStringUTFChars(model_path, 0), 1));\n    uPtr_Lac = std::move(lac);\n}\n\n\n/*\nJava_com_example_testlac_MainActivity_initLac(JNIEnv *env, jobject thiz, jbyteArray buffer, jint length) {\n\n    jbyte * lac_dict = new jbyte[length];\n    env->GetByteArrayRegion(buffer, 0, length, lac_dict);\n    std::unique_ptr<LAC> lac(new LAC((void*) lac_dict, length, 1));\n    uPtr_Lac = std::move(lac);\n} */\n\nextern \"C\"\nJNIEXPORT void JNICALL\nJava_com_example_testlac_MainActivity_releaseLac(JNIEnv *env, jobject thiz) {\n    uPtr_Lac.release();\n}\n\nextern \"C\" JNIEXPORT jstring JNICALL\nJava_com_example_testlac_MainActivity_stringFromJNI(\n        JNIEnv *env,\n        jobject /* this */) {\n    std::string hello = \"测试分词from LAC\";\n    return env->NewStringUTF(hello.c_str());\n}\nextern \"C\"\nJNIEXPORT jstring JNICALL\nJava_com_example_testlac_MainActivity_stringCutFromJNI(JNIEnv *env, jobject thiz,\n                                                       jstring source_text) {\n    const char *utf8 = env->GetStringUTFChars(source_text, NULL);\n    std::string str_source_text = std::string(utf8);\n    env->ReleaseStringUTFChars(source_text, utf8);\n\n\n    auto result = uPtr_Lac->lexer(str_source_text);\n    std::string output_str = \"\";\n    for (int i=0; i<result.size(); i++) {\n        if(result[i].tag.length() == 0){\n            output_str += (result[i].word + \" \");\n        }\n        else{\n            output_str += (result[i].word + \"\\001\" + result[i].tag + \" \");\n        }\n    }\n    LOGI(\"test_lac input: %s, output: %s\", str_source_text.c_str(), output_str.c_str());\n\n    return env->NewStringUTF(output_str.c_str());\n}\n\n"
  },
  {
    "path": "Android/testlac/app/src/main/cpp/paddle/include/paddle_api.h",
    "content": "// Copyright (c) 2019 PaddlePaddle Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/*\n * This file defines PaddlePredictor, the api for lite. It supports multiple\n * hardware including ARM, X86, OpenCL, CUDA and so on.\n */\n\n#ifndef PADDLE_LITE_API_H_  // NOLINT\n#define PADDLE_LITE_API_H_\n#include <memory>\n#include <string>\n#include <vector>\n#include \"paddle_place.h\"  // NOLINT\n\nnamespace paddle {\nnamespace lite_api {\n\nusing shape_t = std::vector<int64_t>;\nusing lod_t = std::vector<std::vector<uint64_t>>;\n\nenum class LiteModelType { kProtobuf = 0, kNaiveBuffer, UNK };\n\nstruct LITE_API Tensor {\n  explicit Tensor(void* raw);\n  explicit Tensor(const void* raw);\n\n  void Resize(const shape_t& shape);\n\n  /// Readonly data.\n  template <typename T>\n  const T* data() const;\n\n  template <typename T>\n  T* mutable_data(TargetType type = TargetType::kHost) const;\n\n  template <typename T, TargetType type = TargetType::kHost>\n  void CopyFromCpu(const T* data);\n\n  template <typename T>\n  void CopyToCpu(T* data) const;\n  /// Shape of the tensor.\n  shape_t shape() const;\n  TargetType target() const;\n  PrecisionType precision() const;\n\n  // LoD of the tensor\n  lod_t lod() const;\n\n  // Set LoD of the tensor\n  void SetLoD(const lod_t& lod);\n\n private:\n  void* raw_tensor_;\n};\n\n/// The PaddlePredictor defines the basic interfaces for different kinds of\n/// predictors.\nclass LITE_API PaddlePredictor {\n public:\n  PaddlePredictor() = default;\n\n  /// Get i-th input.\n  virtual std::unique_ptr<Tensor> GetInput(int i) = 0;\n\n  /// Get i-th output.\n  virtual std::unique_ptr<const Tensor> GetOutput(int i) const = 0;\n\n  virtual void Run() = 0;\n  virtual std::shared_ptr<PaddlePredictor> Clone() = 0;\n\n  virtual std::string GetVersion() const = 0;\n\n  // Get input names\n  virtual std::vector<std::string> GetInputNames() = 0;\n  // Get output names\n  virtual std::vector<std::string> GetOutputNames() = 0;\n\n  // Get Input by name\n  virtual std::unique_ptr<Tensor> GetInputByName(const std::string& name) = 0;\n\n  /// Get a readonly tensor, return null if no one called `name` exists.\n  virtual std::unique_ptr<const Tensor> GetTensor(\n      const std::string& name) const = 0;\n\n  /// Persist the optimized model to disk. This API is only supported by\n  /// CxxConfig, and the persisted model can be reused for MobileConfig.\n  virtual void SaveOptimizedModel(\n      const std::string& model_dir,\n      LiteModelType model_type = LiteModelType::kProtobuf,\n      bool record_info = false);\n\n  virtual ~PaddlePredictor() = default;\n\n protected:\n  int threads_{1};\n  lite_api::PowerMode mode_{lite_api::LITE_POWER_NO_BIND};\n};\n\n/// Base class for all the configs.\nclass LITE_API ConfigBase {\n  std::string model_dir_;\n  int threads_{1};\n  PowerMode mode_{LITE_POWER_NO_BIND};\n\n public:\n  explicit ConfigBase(PowerMode mode = LITE_POWER_NO_BIND, int threads = 1);\n  // set Model_dir\n  void set_model_dir(const std::string& x) { model_dir_ = x; }\n  const std::string& model_dir() const { return model_dir_; }\n  // set Power_mode\n  void set_power_mode(PowerMode mode);\n  PowerMode power_mode() const { return mode_; }\n  // set Thread\n  void set_threads(int threads);\n  int threads() const { return threads_; }\n};\n\n/// CxxConfig is the config for the Full feature predictor.\nclass LITE_API CxxConfig : public ConfigBase {\n  std::vector<Place> valid_places_;\n  std::string model_file_;\n  std::string param_file_;\n  bool model_from_memory_{false};\n#ifdef LITE_WITH_X86\n  int x86_math_library_math_threads_ = 1;\n#endif\n#ifdef LITE_WITH_CUDA\n  bool multi_stream_{false};\n#endif\n#ifdef LITE_WITH_MLU\n  lite_api::MLUCoreVersion mlu_core_version_{lite_api::MLUCoreVersion::MLU_270};\n  int mlu_core_number_{1};\n  DataLayoutType mlu_input_layout_{DATALAYOUT(kNCHW)};\n  bool mlu_use_first_conv_{false};\n  std::vector<float> mlu_first_conv_mean_;\n  std::vector<float> mlu_first_conv_std_;\n#endif\n\n public:\n  void set_valid_places(const std::vector<Place>& x) { valid_places_ = x; }\n  void set_model_file(const std::string& path) { model_file_ = path; }\n  void set_param_file(const std::string& path) { param_file_ = path; }\n  void set_model_buffer(const char* model_buffer,\n                        size_t model_buffer_size,\n                        const char* param_buffer,\n                        size_t param_buffer_size) {\n    model_file_ = std::string(model_buffer, model_buffer + model_buffer_size);\n    param_file_ = std::string(param_buffer, param_buffer + param_buffer_size);\n    model_from_memory_ = true;\n  }\n\n  const std::vector<Place>& valid_places() const { return valid_places_; }\n  std::string model_file() const { return model_file_; }\n  std::string param_file() const { return param_file_; }\n  bool model_from_memory() const { return model_from_memory_; }\n\n#ifdef LITE_WITH_X86\n  void set_x86_math_library_num_threads(int threads) {\n    x86_math_library_math_threads_ = threads;\n  }\n  int x86_math_library_num_threads() const {\n    return x86_math_library_math_threads_;\n  }\n#endif\n#ifdef LITE_WITH_CUDA\n  void set_multi_stream(bool multi_stream) { multi_stream_ = multi_stream; }\n  int multi_stream() const { return multi_stream_; }\n#endif\n\n#ifdef LITE_WITH_MLU\n  // set MLU core version, which is used when compiling MLU kernels\n  void set_mlu_core_version(lite_api::MLUCoreVersion core_version);\n  // set MLU core number, which is used when compiling MLU kernels\n  void set_mlu_core_number(int core_number);\n  // set MLU input layout. User can specify layout of input data to be NHWC,\n  // default is NCHW\n  void set_mlu_input_layout(DataLayoutType layout);\n  // whether use MLU's first conv kernel. First conv is a special kernel\n  // provided by MLU, its input is uint8, and also needs two 3-dimentional\n  // vectors which save all inputs' mean and std values\n  void set_mlu_use_first_conv(bool use_first_conv);\n  // set the 3-dimentional mean vector used by MLU's first conv\n  void set_mlu_first_conv_mean(const std::vector<float>& mean);\n  // set the 3-dimentional std vector used by MLU's first conv\n  void set_mlu_first_conv_std(const std::vector<float>& std);\n\n  lite_api::MLUCoreVersion mlu_core_version() const;\n  int mlu_core_number() const;\n  DataLayoutType mlu_input_layout() const;\n  bool mlu_use_first_conv() const;\n  const std::vector<float>& mlu_first_conv_mean() const;\n  const std::vector<float>& mlu_first_conv_std() const;\n#endif\n\n  // XPU only, set the size of the workspace memory from L3 cache for the\n  // current thread.\n  void set_xpu_workspace_l3_size_per_thread(int l3_size = 0xfffc00);\n  // XPU only, specify the target device ID for the current thread.\n  void set_xpu_dev_per_thread(int dev_no = 0);\n};\n\n/// MobileConfig is the config for the light weight predictor, it will skip\n/// IR optimization or other unnecessary stages.\nclass LITE_API MobileConfig : public ConfigBase {\n  // whether to load data from memory. Model data will be loaded from memory\n  // buffer if model_from_memory_ is true.\n  bool model_from_memory_{false};\n\n  // model data readed from file or memory buffer in combined format.\n  std::string lite_model_file_;\n\n  // NOTE: This is a deprecated variable and will be removed in latter release.\n  std::string model_buffer_;\n  std::string param_buffer_;\n\n public:\n  // set model data in combined format, `set_model_from_file` refers to loading\n  // model from file, set_model_from_buffer refers to loading model from memory\n  // buffer\n  void set_model_from_file(const std::string& x);\n  void set_model_from_buffer(const std::string& x);\n  // return model data in lite_model_file_, which is in combined format.\n  const std::string& lite_model_file() const { return lite_model_file_; }\n\n  // return model_from_memory_, which indicates whether to load model from\n  // memory buffer.\n  bool model_from_memory() const { return model_from_memory_; }\n\n  // NOTE: This is a deprecated API and will be removed in latter release.\n  void set_model_buffer(const char* model_buffer,\n                        size_t model_buffer_size,\n                        const char* param_buffer,\n                        size_t param_buffer_size);\n\n  // NOTE: This is a deprecated API and will be removed in latter release.\n  const std::string& model_buffer() const { return model_buffer_; }\n\n  // NOTE: This is a deprecated API and will be removed in latter release.\n  const std::string& param_buffer() const { return param_buffer_; }\n};\n\ntemplate <typename ConfigT>\nLITE_API std::shared_ptr<PaddlePredictor> CreatePaddlePredictor(const ConfigT&);\n\n}  // namespace lite_api\n}  // namespace paddle\n\n#endif  // NOLINT\n"
  },
  {
    "path": "Android/testlac/app/src/main/cpp/paddle/include/paddle_image_preprocess.h",
    "content": "// Copyright (c) 2019 PaddlePaddle Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n#pragma once\n\n#include <stdint.h>\n#include <stdio.h>\n#include <vector>\n#include \"lite/api/paddle_api.h\"\n#include \"lite/api/paddle_place.h\"\n\nnamespace paddle {\nnamespace lite {\nnamespace utils {\nnamespace cv {\ntypedef paddle::lite_api::Tensor Tensor;\ntypedef paddle::lite_api::DataLayoutType LayoutType;\n// color enum\nenum ImageFormat {\n  RGBA = 0,\n  BGRA,\n  RGB,\n  BGR,\n  GRAY,\n  NV21 = 11,\n  NV12,\n};\n// flip enum\nenum FlipParam {\n  XY = -1,  // flip along the XY axis\n  X = 0,    // flip along the X axis\n  Y         // flip along the Y axis\n};\n// transform param\ntypedef struct {\n  int ih;                // input height\n  int iw;                // input width\n  int oh;                // outpu theight\n  int ow;                // output width\n  FlipParam flip_param;  // flip, support x, y, xy\n  float rotate_param;    // rotate, support 90, 180, 270\n} TransParam;\n\nclass ImagePreprocess {\n public:\n  /*\n  * init\n  * param srcFormat: input image color\n  * param dstFormat: output image color\n  * param param: input image parameter, egs: input size\n  */\n  ImagePreprocess(ImageFormat srcFormat,\n                  ImageFormat dstFormat,\n                  TransParam param);\n\n  /*\n  * image color convert\n  * support NV12/NV21_to_BGR(RGB), NV12/NV21_to_BGRA(RGBA),\n  * BGR(RGB)and BGRA(RGBA) transform,\n  * BGR(RGB)and RGB(BGR) transform,\n  * BGR(RGB)and RGBA(BGRA) transform,\n  * BGR(RGB) and GRAY transform,\n  * BGRA(RGBA) and GRAY transform,\n  * param src: input image data\n  * param dst: output image data\n  */\n  void imageConvert(const uint8_t* src, uint8_t* dst);\n  /*\n  * image color convert\n  * support NV12/NV21_to_BGR(RGB), NV12/NV21_to_BGRA(RGBA),\n  * BGR(RGB)and BGRA(RGBA) transform,\n  * BGR(RGB)and RGB(BGR) transform,\n  * BGR(RGB)and RGBA(BGRA) transform,\n  * BGR(RGB)and GRAY transform,\n  * BGRA(RGBA) and GRAY transform,\n  * param src: input image data\n  * param dst: output image data\n  * param srcFormat: input image image format support: GRAY, NV12(NV21),\n  * BGR(RGB) and BGRA(RGBA)\n  * param dstFormat: output image image format, support GRAY, BGR(RGB) and\n  * BGRA(RGBA)\n  */\n  void imageConvert(const uint8_t* src,\n                    uint8_t* dst,\n                    ImageFormat srcFormat,\n                    ImageFormat dstFormat);\n  /*\n  * image resize, use bilinear method\n  * support image format: 1-channel image (egs: GRAY, 2-channel image (egs:\n  * NV12, NV21), 3-channel(egs: BGR), 4-channel(egs: BGRA)\n  * param src: input image data\n  * param dst: output image data\n  */\n  void imageResize(const uint8_t* src, uint8_t* dst);\n  /*\n   image resize, use bilinear method\n  * support image format: 1-channel image (egs: GRAY, 2-channel image (egs:\n  NV12, NV21), 3-channel image(egs: BGR), 4-channel image(egs: BGRA)\n  * param src: input image data\n  * param dst: output image data\n  * param srcw: input image width\n  * param srch: input image height\n  * param dstw: output image width\n  * param dsth: output image height\n  */\n  void imageResize(const uint8_t* src,\n                   uint8_t* dst,\n                   ImageFormat srcFormat,\n                   int srcw,\n                   int srch,\n                   int dstw,\n                   int dsth);\n\n  /*\n  * image Rotate\n  * support 90, 180 and 270 Rotate process\n  * color format support 1-channel image, 3-channel image and 4-channel image\n  * param src: input image data\n  * param dst: output image data\n  */\n  void imageRotate(const uint8_t* src, uint8_t* dst);\n  /*\n  * image Rotate\n  * support 90, 180 and 270 Rotate process\n  * color format support 1-channel image, 3-channel image and 4-channel image\n  * param src: input image data\n  * param dst: output image data\n  * param srcFormat: input image format, support GRAY, BGR(RGB) and BGRA(RGBA)\n  * param srcw: input image width\n  * param srch: input image height\n  * param degree: Rotate degree, support 90, 180 and 270\n  */\n  void imageRotate(const uint8_t* src,\n                   uint8_t* dst,\n                   ImageFormat srcFormat,\n                   int srcw,\n                   int srch,\n                   float degree);\n  /*\n  * image Flip\n  * support X, Y and XY flip process\n  * color format support 1-channel image, 3-channel image and 4-channel image\n  * param src: input image data\n  * param dst: output image data\n  */\n  void imageFlip(const uint8_t* src, uint8_t* dst);\n  /*\n  * image Flip\n  * support X, Y and XY flip process\n  * color format support 1-channel image, 3-channel image and 4-channel image\n  * param src: input image data\n  * param dst: output image data\n  * param srcFormat: input image format, support GRAY, BGR(RGB) and BGRA(RGBA)\n  * param srcw: input image width\n  * param srch: input image height\n  * param flip_param: flip parameter, support X, Y and XY\n  */\n  void imageFlip(const uint8_t* src,\n                 uint8_t* dst,\n                 ImageFormat srcFormat,\n                 int srcw,\n                 int srch,\n                 FlipParam flip_param);\n  /*\n  * change image data to tensor data\n  * support image format is GRAY, BGR(RGB) and BGRA(RGBA), Data layout is NHWC\n  * and\n  * NCHW\n  * param src: input image data\n  * param dstTensor: output tensor data\n  * param layout: output tensor layout，support NHWC and NCHW\n  * param means: means of image\n  * param scales: scales of image\n  */\n  void image2Tensor(const uint8_t* src,\n                    Tensor* dstTensor,\n                    LayoutType layout,\n                    float* means,\n                    float* scales);\n  /*\n   * change image data to tensor data\n  * support image format is GRAY, BGR(RGB) and BGRA(RGBA), Data layout is NHWC\n  * and\n  * NCHW\n  * param src: input image data\n  * param dstTensor: output tensor data\n  * param srcFormat: input image format, support BGR(RGB) and BGRA(RGBA)\n  * param srcw: input image width\n  * param srch: input image height\n  * param layout: output tensor layout，support NHWC and NCHW\n  * param means: means of image\n  * param scales: scales of image\n  */\n  void image2Tensor(const uint8_t* src,\n                    Tensor* dstTensor,\n                    ImageFormat srcFormat,\n                    int srcw,\n                    int srch,\n                    LayoutType layout,\n                    float* means,\n                    float* scales);\n\n private:\n  ImageFormat srcFormat_;\n  ImageFormat dstFormat_;\n  TransParam transParam_;\n};\n}  // namespace cv\n}  // namespace utils\n}  // namespace lite\n}  // namespace paddle\n"
  },
  {
    "path": "Android/testlac/app/src/main/cpp/paddle/include/paddle_lite_factory_helper.h",
    "content": "// Copyright (c) 2019 PaddlePaddle Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/*\n * This file defines some MACROS that explicitly determine the op, kernel, mir\n * passes used in the inference lib.\n */\n#pragma once\n\n// some platform-independent defintion\n#include \"lite/utils/macros.h\"\n\n#define USE_LITE_OP(op_type__)       \\\n  extern int touch_op_##op_type__(); \\\n  int LITE_OP_REGISTER_FAKE(op_type__) UNUSED = touch_op_##op_type__();\n\n#define USE_LITE_KERNEL(op_type__, target__, precision__, layout__, alias__) \\\n  extern int touch_##op_type__##target__##precision__##layout__##alias__();  \\\n  int op_type__##target__##precision__##layout__##alias__##__use_lite_kernel \\\n      UNUSED = touch_##op_type__##target__##precision__##layout__##alias__();\n\n#define USE_MIR_PASS(name__)                      \\\n  extern bool mir_pass_registry##name__##_fake(); \\\n  static bool mir_pass_usage##name__ UNUSED =     \\\n      mir_pass_registry##name__##_fake();\n\n#define LITE_OP_REGISTER_FAKE(op_type__) op_type__##__registry__\n"
  },
  {
    "path": "Android/testlac/app/src/main/cpp/paddle/include/paddle_place.h",
    "content": "// Copyright (c) 2019 PaddlePaddle Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n#pragma once\n#include <set>\n#include <string>\n\n// Generic helper definitions for shared library support\n#if defined _WIN32 || defined __CYGWIN__\n#define PADDLE_LITE_HELPER_DLL_IMPORT __declspec(dllimport)\n#define PADDLE_LITE_HELPER_DLL_EXPORT __declspec(dllexport)\n#define PADDLE_LITE_HELPER_DLL_LOCAL\n#else\n#if __GNUC__ >= 4\n#define PADDLE_LITE_HELPER_DLL_IMPORT __attribute__((visibility(\"default\")))\n#define PADDLE_LITE_HELPER_DLL_EXPORT __attribute__((visibility(\"default\")))\n#else\n#define PADDLE_LITE_HELPER_DLL_IMPORT\n#define PADDLE_LITE_HELPER_DLL_EXPORT\n#endif\n#endif\n\n#ifdef LITE_ON_TINY_PUBLISH\n#define LITE_API PADDLE_LITE_HELPER_DLL_EXPORT\n#define LITE_API_IMPORT PADDLE_LITE_HELPER_DLL_IMPORT\n#else\n#define LITE_API\n#define LITE_API_IMPORT\n#endif\n\nnamespace paddle {\nnamespace lite_api {\n\nenum class TargetType : int {\n  kUnk = 0,\n  kHost = 1,\n  kX86 = 2,\n  kCUDA = 3,\n  kARM = 4,\n  kOpenCL = 5,\n  kAny = 6,  // any target\n  kFPGA = 7,\n  kNPU = 8,\n  kXPU = 9,\n  kBM = 10,\n  kMLU = 11,\n  kRKNPU = 12,\n  kAPU = 13,\n  NUM = 14,  // number of fields.\n};\nenum class PrecisionType : int {\n  kUnk = 0,\n  kFloat = 1,\n  kInt8 = 2,\n  kInt32 = 3,\n  kAny = 4,  // any precision\n  kFP16 = 5,\n  kBool = 6,\n  kInt64 = 7,\n  kInt16 = 8,\n  NUM = 9,  // number of fields.\n};\nenum class DataLayoutType : int {\n  kUnk = 0,\n  kNCHW = 1,\n  kNHWC = 3,\n  kImageDefault = 4,  // for opencl image2d\n  kImageFolder = 5,   // for opencl image2d\n  kImageNW = 6,       // for opencl image2d\n  kAny = 2,           // any data layout\n  NUM = 7,            // number of fields.\n};\n\ntypedef enum {\n  LITE_POWER_HIGH = 0,\n  LITE_POWER_LOW = 1,\n  LITE_POWER_FULL = 2,\n  LITE_POWER_NO_BIND = 3,\n  LITE_POWER_RAND_HIGH = 4,\n  LITE_POWER_RAND_LOW = 5\n} PowerMode;\n\ntypedef enum { MLU_220 = 0, MLU_270 = 1 } MLUCoreVersion;\n\nenum class ActivationType : int {\n  kIndentity = 0,\n  kRelu = 1,\n  kRelu6 = 2,\n  kPRelu = 3,\n  kLeakyRelu = 4,\n  kSigmoid = 5,\n  kTanh = 6,\n  kSwish = 7,\n  kExp = 8,\n  kAbs = 9,\n  kHardSwish = 10,\n  kReciprocal = 11,\n  NUM = 12,\n};\n\nstatic size_t PrecisionTypeLength(PrecisionType type) {\n  switch (type) {\n    case PrecisionType::kFloat:\n      return 4;\n    case PrecisionType::kInt8:\n      return 1;\n    case PrecisionType::kInt32:\n      return 4;\n    case PrecisionType::kInt64:\n      return 8;\n    case PrecisionType::kFP16:\n      return 2;\n    default:\n      return 4;\n  }\n}\n\ntemplate <typename T>\nstruct PrecisionTypeTrait {\n  constexpr static PrecisionType Type() { return PrecisionType::kUnk; }\n};\n\n#define _ForEachPrecisionTypeHelper(callback, cpp_type, precision_type) \\\n  callback(cpp_type, ::paddle::lite_api::PrecisionType::precision_type);\n\n#define _ForEachPrecisionType(callback)                   \\\n  _ForEachPrecisionTypeHelper(callback, bool, kBool);     \\\n  _ForEachPrecisionTypeHelper(callback, float, kFloat);   \\\n  _ForEachPrecisionTypeHelper(callback, int8_t, kInt8);   \\\n  _ForEachPrecisionTypeHelper(callback, int16_t, kInt16); \\\n  _ForEachPrecisionTypeHelper(callback, int, kInt32);     \\\n  _ForEachPrecisionTypeHelper(callback, int64_t, kInt64);\n\n#define DefinePrecisionTypeTrait(cpp_type, precision_type)           \\\n  template <>                                                        \\\n  struct PrecisionTypeTrait<cpp_type> {                              \\\n    constexpr static PrecisionType Type() { return precision_type; } \\\n  }\n\n_ForEachPrecisionType(DefinePrecisionTypeTrait);\n\n#undef _ForEachPrecisionTypeHelper\n#undef _ForEachPrecisionType\n#undef DefinePrecisionTypeTrait\n\n#define TARGET(item__) paddle::lite_api::TargetType::item__\n#define PRECISION(item__) paddle::lite_api::PrecisionType::item__\n#define DATALAYOUT(item__) paddle::lite_api::DataLayoutType::item__\n\nconst std::string& ActivationTypeToStr(ActivationType act);\n\nconst std::string& TargetToStr(TargetType target);\n\nconst std::string& PrecisionToStr(PrecisionType precision);\n\nconst std::string& DataLayoutToStr(DataLayoutType layout);\n\nconst std::string& TargetRepr(TargetType target);\n\nconst std::string& PrecisionRepr(PrecisionType precision);\n\nconst std::string& DataLayoutRepr(DataLayoutType layout);\n\n// Get a set of all the elements represented by the target.\nstd::set<TargetType> ExpandValidTargets(TargetType target = TARGET(kAny));\n\n// Get a set of all the elements represented by the precision.\nstd::set<PrecisionType> ExpandValidPrecisions(\n    PrecisionType precision = PRECISION(kAny));\n\n// Get a set of all the elements represented by the layout.\nstd::set<DataLayoutType> ExpandValidLayouts(\n    DataLayoutType layout = DATALAYOUT(kAny));\n\n/*\n * Place specifies the execution context of a Kernel or input/output for a\n * kernel. It is used to make the analysis of the MIR more clear and accurate.\n */\nstruct LITE_API Place {\n  TargetType target{TARGET(kUnk)};\n  PrecisionType precision{PRECISION(kUnk)};\n  DataLayoutType layout{DATALAYOUT(kUnk)};\n  int16_t device{0};  // device ID\n\n  Place() = default;\n  Place(TargetType target,\n        PrecisionType precision = PRECISION(kFloat),\n        DataLayoutType layout = DATALAYOUT(kNCHW),\n        int16_t device = 0)\n      : target(target), precision(precision), layout(layout), device(device) {}\n\n  bool is_valid() const {\n    return target != TARGET(kUnk) && precision != PRECISION(kUnk) &&\n           layout != DATALAYOUT(kUnk);\n  }\n\n  size_t hash() const;\n\n  bool operator==(const Place& other) const {\n    return target == other.target && precision == other.precision &&\n           layout == other.layout && device == other.device;\n  }\n\n  bool operator!=(const Place& other) const { return !(*this == other); }\n\n  friend bool operator<(const Place& a, const Place& b);\n\n  std::string DebugString() const;\n};\n\n}  // namespace lite_api\n}  // namespace paddle\n"
  },
  {
    "path": "Android/testlac/app/src/main/cpp/paddle/include/paddle_use_kernels.h",
    "content": "#pragma once\n#include \"paddle_lite_factory_helper.h\"\n\nUSE_LITE_KERNEL(box_coder, kARM, kFloat, kNCHW, def);\nUSE_LITE_KERNEL(calib, kARM, kInt8, kNCHW, fp32_to_int8);\nUSE_LITE_KERNEL(calib, kARM, kInt8, kNCHW, int8_to_fp32);\nUSE_LITE_KERNEL(calib, kARM, kInt8, kNHWC, fp32_to_int8);\nUSE_LITE_KERNEL(calib, kARM, kInt8, kNHWC, int8_to_fp32);\nUSE_LITE_KERNEL(calib_once, kARM, kInt8, kNCHW, fp32_to_int8);\nUSE_LITE_KERNEL(calib_once, kARM, kInt8, kNCHW, int8_to_fp32);\nUSE_LITE_KERNEL(calib_once, kARM, kInt8, kNHWC, fp32_to_int8);\nUSE_LITE_KERNEL(calib_once, kARM, kInt8, kNHWC, int8_to_fp32);\nUSE_LITE_KERNEL(reduce_prod, kARM, kInt32, kNCHW, def);\nUSE_LITE_KERNEL(reduce_prod, kARM, kFloat, kNCHW, def);\nUSE_LITE_KERNEL(roi_align, kARM, kFloat, kNCHW, def);\nUSE_LITE_KERNEL(shuffle_channel, kARM, kFloat, kNCHW, def);\nUSE_LITE_KERNEL(scale, kARM, kFloat, kNCHW, def);\nUSE_LITE_KERNEL(scale, kARM, kInt32, kNCHW, def);\nUSE_LITE_KERNEL(box_clip, kARM, kFloat, kNCHW, def);\nUSE_LITE_KERNEL(affine_channel, kARM, kFloat, kNCHW, def);\nUSE_LITE_KERNEL(pad2d, kARM, kFloat, kNCHW, def);\nUSE_LITE_KERNEL(mul, kARM, kFloat, kNCHW, def);\nUSE_LITE_KERNEL(read_from_array, kARM, kAny, kNCHW, def);\nUSE_LITE_KERNEL(shape, kHost, kAny, kAny, def);\nUSE_LITE_KERNEL(mean, kARM, kFloat, kNCHW, def);\nUSE_LITE_KERNEL(feed, kHost, kAny, kAny, def);\nUSE_LITE_KERNEL(is_empty, kHost, kAny, kAny, def);\nUSE_LITE_KERNEL(assign, kARM, kAny, kNCHW, def);\nUSE_LITE_KERNEL(write_to_array, kARM, kAny, kNCHW, def);\nUSE_LITE_KERNEL(layout, kARM, kFloat, kNCHW, nchw2nhwc);\nUSE_LITE_KERNEL(layout, kARM, kFloat, kNCHW, nhwc2nchw);\nUSE_LITE_KERNEL(layout, kARM, kInt8, kNCHW, int8_nchw2nhwc);\nUSE_LITE_KERNEL(layout, kARM, kInt8, kNCHW, int8_nhwc2nchw);\nUSE_LITE_KERNEL(layout_once, kARM, kFloat, kNCHW, nchw2nhwc);\nUSE_LITE_KERNEL(layout_once, kARM, kFloat, kNCHW, nhwc2nchw);\nUSE_LITE_KERNEL(layout_once, kARM, kInt8, kNCHW, int8_nchw2nhwc);\nUSE_LITE_KERNEL(layout_once, kARM, kInt8, kNCHW, int8_nhwc2nchw);\nUSE_LITE_KERNEL(gru_unit, kARM, kFloat, kNCHW, def);\nUSE_LITE_KERNEL(axpy, kARM, kFloat, kNCHW, def);\nUSE_LITE_KERNEL(conv2d_transpose, kARM, kFloat, kNCHW, def);\nUSE_LITE_KERNEL(lrn, kARM, kFloat, kNCHW, def);\nUSE_LITE_KERNEL(beam_search_decode, kARM, kFloat, kNCHW, def);\nUSE_LITE_KERNEL(density_prior_box, kARM, kFloat, kNCHW, def);\nUSE_LITE_KERNEL(squeeze, kARM, kFloat, kNCHW, def);\nUSE_LITE_KERNEL(squeeze2, kARM, kFloat, kNCHW, def);\nUSE_LITE_KERNEL(sequence_softmax, kARM, kFloat, kNCHW, def);\nUSE_LITE_KERNEL(lstm, kARM, kFloat, kNCHW, def);\nUSE_LITE_KERNEL(relu, kARM, kFloat, kNCHW, def);\nUSE_LITE_KERNEL(leaky_relu, kARM, kFloat, kNCHW, def);\nUSE_LITE_KERNEL(relu_clipped, kARM, kFloat, kNCHW, def);\nUSE_LITE_KERNEL(prelu, kARM, kFloat, kNCHW, def);\nUSE_LITE_KERNEL(sigmoid, kARM, kFloat, kNCHW, def);\nUSE_LITE_KERNEL(tanh, kARM, kFloat, kNCHW, def);\nUSE_LITE_KERNEL(swish, kARM, kFloat, kNCHW, def);\nUSE_LITE_KERNEL(relu6, kARM, kFloat, kNCHW, def);\nUSE_LITE_KERNEL(log, kARM, kFloat, kNCHW, def);\nUSE_LITE_KERNEL(exp, kARM, kFloat, kNCHW, def);\nUSE_LITE_KERNEL(floor, kARM, kFloat, kNCHW, def);\nUSE_LITE_KERNEL(hard_sigmoid, kARM, kFloat, kNCHW, def);\nUSE_LITE_KERNEL(rsqrt, kARM, kFloat, kNCHW, def);\nUSE_LITE_KERNEL(square, kARM, kFloat, kNCHW, def);\nUSE_LITE_KERNEL(hard_swish, kARM, kFloat, kNCHW, def);\nUSE_LITE_KERNEL(reciprocal, kARM, kFloat, kNCHW, def);\nUSE_LITE_KERNEL(abs, kARM, kFloat, kNCHW, def);\nUSE_LITE_KERNEL(top_k, kARM, kFloat, kNCHW, def);\nUSE_LITE_KERNEL(crf_decoding, kHost, kFloat, kNCHW, def);\nUSE_LITE_KERNEL(cast, kARM, kAny, kNCHW, def);\nUSE_LITE_KERNEL(pool2d, kARM, kFloat, kNCHW, def);\nUSE_LITE_KERNEL(logical_xor, kHost, kAny, kAny, def);\nUSE_LITE_KERNEL(logical_and, kHost, kAny, kAny, def);\nUSE_LITE_KERNEL(logical_or, kHost, kAny, kAny, def);\nUSE_LITE_KERNEL(logical_not, kHost, kAny, kAny, def);\nUSE_LITE_KERNEL(lookup_table_dequant, kARM, kAny, kNCHW, def);\nUSE_LITE_KERNEL(split, kARM, kFloat, kNCHW, def);\nUSE_LITE_KERNEL(distribute_fpn_proposals, kARM, kFloat, kNCHW, def);\nUSE_LITE_KERNEL(yolo_box, kARM, kFloat, kNCHW, def);\nUSE_LITE_KERNEL(fill_constant, kARM, kAny, kNCHW, def);\nUSE_LITE_KERNEL(im2sequence, kARM, kFloat, kNCHW, def);\nUSE_LITE_KERNEL(split_lod_tensor, kARM, kFloat, kNCHW, def);\nUSE_LITE_KERNEL(concat, kARM, kAny, kNCHW, def);\nUSE_LITE_KERNEL(slice, kARM, kFloat, kNCHW, def);\nUSE_LITE_KERNEL(slice, kARM, kInt32, kNCHW, def);\nUSE_LITE_KERNEL(grid_sampler, kARM, kFloat, kNCHW, def);\nUSE_LITE_KERNEL(gather, kARM, kAny, kNCHW, def);\nUSE_LITE_KERNEL(power, kARM, kFloat, kNCHW, def);\nUSE_LITE_KERNEL(negative, kARM, kFloat, kNCHW, def);\nUSE_LITE_KERNEL(arg_max, kARM, kFloat, kNCHW, def);\nUSE_LITE_KERNEL(reshape, kHost, kAny, kAny, def);\nUSE_LITE_KERNEL(reshape2, kHost, kAny, kAny, def);\nUSE_LITE_KERNEL(flatten, kHost, kAny, kAny, def);\nUSE_LITE_KERNEL(flatten2, kHost, kAny, kAny, def);\nUSE_LITE_KERNEL(norm, kARM, kFloat, kNCHW, def);\nUSE_LITE_KERNEL(reduce_max, kARM, kFloat, kNCHW, def);\nUSE_LITE_KERNEL(sequence_conv, kARM, kFloat, kNCHW, def);\nUSE_LITE_KERNEL(lookup_table, kARM, kAny, kNCHW, def);\nUSE_LITE_KERNEL(lookup_table_v2, kARM, kAny, kNCHW, def);\nUSE_LITE_KERNEL(conv2d, kARM, kFloat, kNCHW, def);\nUSE_LITE_KERNEL(depthwise_conv2d, kARM, kFloat, kNCHW, def);\nUSE_LITE_KERNEL(conv2d, kARM, kInt8, kNCHW, int8_out);\nUSE_LITE_KERNEL(conv2d, kARM, kInt8, kNCHW, fp32_out);\nUSE_LITE_KERNEL(depthwise_conv2d, kARM, kInt8, kNCHW, int8_out);\nUSE_LITE_KERNEL(depthwise_conv2d, kARM, kInt8, kNCHW, fp32_out);\nUSE_LITE_KERNEL(layer_norm, kARM, kFloat, kNCHW, def);\nUSE_LITE_KERNEL(unsqueeze, kARM, kFloat, kNCHW, def);\nUSE_LITE_KERNEL(unsqueeze2, kARM, kFloat, kNCHW, def);\nUSE_LITE_KERNEL(batch_norm, kARM, kFloat, kNCHW, def);\nUSE_LITE_KERNEL(gru, kARM, kFloat, kNCHW, def);\nUSE_LITE_KERNEL(assign_value, kARM, kAny, kNCHW, def);\nUSE_LITE_KERNEL(expand, kARM, kFloat, kNCHW, def);\nUSE_LITE_KERNEL(conditional_block, kARM, kFloat, kNCHW, def);\nUSE_LITE_KERNEL(merge_lod_tensor, kARM, kFloat, kNCHW, def);\nUSE_LITE_KERNEL(multiclass_nms, kHost, kFloat, kNCHW, def);\nUSE_LITE_KERNEL(multiclass_nms2, kHost, kFloat, kNCHW, def);\nUSE_LITE_KERNEL(sequence_expand, kARM, kFloat, kNCHW, def);\nUSE_LITE_KERNEL(transpose, kARM, kFloat, kNCHW, def);\nUSE_LITE_KERNEL(transpose2, kARM, kFloat, kNCHW, def);\nUSE_LITE_KERNEL(while, kARM, kFloat, kNCHW, def);\nUSE_LITE_KERNEL(lod_reset, kARM, kAny, kNCHW, def);\nUSE_LITE_KERNEL(stack, kARM, kFloat, kNCHW, def);\nUSE_LITE_KERNEL(increment, kARM, kAny, kNCHW, def);\nUSE_LITE_KERNEL(anchor_generator, kARM, kFloat, kNCHW, def);\nUSE_LITE_KERNEL(dropout, kARM, kFloat, kNCHW, def);\nUSE_LITE_KERNEL(softmax, kARM, kFloat, kNCHW, def);\nUSE_LITE_KERNEL(collect_fpn_proposals, kARM, kFloat, kNCHW, def);\nUSE_LITE_KERNEL(prior_box, kARM, kFloat, kNCHW, def);\nUSE_LITE_KERNEL(crop, kARM, kFloat, kNCHW, def);\nUSE_LITE_KERNEL(ctc_align, kHost, kInt64, kNCHW, def);\nUSE_LITE_KERNEL(ctc_align, kHost, kInt32, kNCHW, def);\nUSE_LITE_KERNEL(beam_search, kARM, kFloat, kNCHW, def);\nUSE_LITE_KERNEL(sequence_pool, kARM, kFloat, kNCHW, def);\nUSE_LITE_KERNEL(generate_proposals, kARM, kFloat, kNCHW, def);\nUSE_LITE_KERNEL(fill_constant_batch_size_like, kARM, kAny, kNCHW, def);\nUSE_LITE_KERNEL(decode_bboxes, kARM, kFloat, kNCHW, def);\nUSE_LITE_KERNEL(matmul, kARM, kFloat, kNCHW, def);\nUSE_LITE_KERNEL(fetch, kHost, kAny, kAny, def);\nUSE_LITE_KERNEL(elementwise_add, kARM, kFloat, kNCHW, def);\nUSE_LITE_KERNEL(fusion_elementwise_add_activation, kARM, kFloat, kNCHW, def);\nUSE_LITE_KERNEL(elementwise_sub, kARM, kFloat, kNCHW, def);\nUSE_LITE_KERNEL(fusion_elementwise_sub_activation, kARM, kFloat, kNCHW, def);\nUSE_LITE_KERNEL(elementwise_mul, kARM, kFloat, kNCHW, def);\nUSE_LITE_KERNEL(elementwise_mul, kARM, kInt32, kNCHW, def);\nUSE_LITE_KERNEL(elementwise_mul, kARM, kInt64, kNCHW, def);\nUSE_LITE_KERNEL(fusion_elementwise_mul_activation, kARM, kFloat, kNCHW, def);\nUSE_LITE_KERNEL(elementwise_max, kARM, kFloat, kNCHW, def);\nUSE_LITE_KERNEL(fusion_elementwise_max_activation, kARM, kFloat, kNCHW, def);\nUSE_LITE_KERNEL(elementwise_div, kARM, kFloat, kNCHW, def);\nUSE_LITE_KERNEL(fusion_elementwise_div_activation, kARM, kFloat, kNCHW, def);\nUSE_LITE_KERNEL(bilinear_interp, kARM, kFloat, kNCHW, def);\nUSE_LITE_KERNEL(nearest_interp, kARM, kFloat, kNCHW, def);\nUSE_LITE_KERNEL(equal, kHost, kFloat, kAny, def);\nUSE_LITE_KERNEL(equal, kHost, kInt32, kAny, def);\nUSE_LITE_KERNEL(not_equal, kHost, kFloat, kAny, def);\nUSE_LITE_KERNEL(less_than, kHost, kFloat, kAny, def);\nUSE_LITE_KERNEL(less_than, kHost, kInt32, kAny, def);\nUSE_LITE_KERNEL(less_than, kHost, kInt64, kAny, def);\nUSE_LITE_KERNEL(less_equal, kHost, kFloat, kAny, def);\nUSE_LITE_KERNEL(greater_than, kHost, kFloat, kAny, def);\nUSE_LITE_KERNEL(greater_equal, kHost, kFloat, kAny, def);\nUSE_LITE_KERNEL(range, kARM, kFloat, kNCHW, def);\nUSE_LITE_KERNEL(fc, kARM, kFloat, kNCHW, def);\nUSE_LITE_KERNEL(fc, kARM, kInt8, kNCHW, int8out);\nUSE_LITE_KERNEL(fc, kARM, kInt8, kNCHW, fp32out);\nUSE_LITE_KERNEL(reduce_mean, kARM, kFloat, kNCHW, def);\nUSE_LITE_KERNEL(instance_norm, kARM, kFloat, kNCHW, def);"
  },
  {
    "path": "Android/testlac/app/src/main/cpp/paddle/include/paddle_use_ops.h",
    "content": "#pragma once\n#include \"paddle_lite_factory_helper.h\"\n\nUSE_LITE_OP(unsqueeze);\nUSE_LITE_OP(unsqueeze2);\nUSE_LITE_OP(softmax);\nUSE_LITE_OP(search_group_padding);\nUSE_LITE_OP(collect_fpn_proposals);\nUSE_LITE_OP(beam_search);\nUSE_LITE_OP(search_seq_softmax);\nUSE_LITE_OP(mean);\nUSE_LITE_OP(attention_padding_mask);\nUSE_LITE_OP(search_attention_padding_mask);\nUSE_LITE_OP(increment);\nUSE_LITE_OP(search_seq_fc);\nUSE_LITE_OP(scale);\nUSE_LITE_OP(lookup_table_dequant);\nUSE_LITE_OP(reduce_mean);\nUSE_LITE_OP(write_to_array);\nUSE_LITE_OP(match_matrix_tensor);\nUSE_LITE_OP(sequence_reshape);\nUSE_LITE_OP(im2sequence);\nUSE_LITE_OP(sequence_arithmetic);\nUSE_LITE_OP(search_seq_arithmetic);\nUSE_LITE_OP(dropout);\nUSE_LITE_OP(lrn);\nUSE_LITE_OP(calib);\nUSE_LITE_OP(search_grnn);\nUSE_LITE_OP(cast);\nUSE_LITE_OP(io_copy);\nUSE_LITE_OP(reduce_prod);\nUSE_LITE_OP(fc);\nUSE_LITE_OP(power);\nUSE_LITE_OP(sequence_softmax);\nUSE_LITE_OP(assign);\nUSE_LITE_OP(ctc_align);\nUSE_LITE_OP(while);\nUSE_LITE_OP(affine_channel);\nUSE_LITE_OP(gru);\nUSE_LITE_OP(__xpu__multi_encoder);\nUSE_LITE_OP(uniform_random);\nUSE_LITE_OP(yolo_box);\nUSE_LITE_OP(stack);\nUSE_LITE_OP(shape);\nUSE_LITE_OP(anchor_generator);\nUSE_LITE_OP(sequence_reverse);\nUSE_LITE_OP(square);\nUSE_LITE_OP(relu_clipped);\nUSE_LITE_OP(swish);\nUSE_LITE_OP(log);\nUSE_LITE_OP(exp);\nUSE_LITE_OP(abs);\nUSE_LITE_OP(floor);\nUSE_LITE_OP(hard_sigmoid);\nUSE_LITE_OP(sqrt);\nUSE_LITE_OP(rsqrt);\nUSE_LITE_OP(softsign);\nUSE_LITE_OP(gelu);\nUSE_LITE_OP(hard_swish);\nUSE_LITE_OP(reciprocal);\nUSE_LITE_OP(var_conv_2d);\nUSE_LITE_OP(generate_proposals);\nUSE_LITE_OP(feed);\nUSE_LITE_OP(mul);\nUSE_LITE_OP(decode_bboxes);\nUSE_LITE_OP(sequence_topk_avg_pooling);\nUSE_LITE_OP(pad2d);\nUSE_LITE_OP(layer_norm);\nUSE_LITE_OP(sequence_pool_concat);\nUSE_LITE_OP(multiclass_nms);\nUSE_LITE_OP(multiclass_nms2);\nUSE_LITE_OP(top_k);\nUSE_LITE_OP(elementwise_sub);\nUSE_LITE_OP(elementwise_add);\nUSE_LITE_OP(elementwise_mul);\nUSE_LITE_OP(elementwise_max);\nUSE_LITE_OP(elementwise_div);\nUSE_LITE_OP(batch_norm);\nUSE_LITE_OP(flatten);\nUSE_LITE_OP(flatten2);\nUSE_LITE_OP(is_empty);\nUSE_LITE_OP(nearest_interp);\nUSE_LITE_OP(bilinear_interp);\nUSE_LITE_OP(fetch);\nUSE_LITE_OP(fake_quantize_moving_average_abs_max);\nUSE_LITE_OP(sequence_expand_as);\nUSE_LITE_OP(reshape);\nUSE_LITE_OP(reshape2);\nUSE_LITE_OP(matmul);\nUSE_LITE_OP(fake_quantize_dequantize_moving_average_abs_max);\nUSE_LITE_OP(assign_value);\nUSE_LITE_OP(merge_lod_tensor);\nUSE_LITE_OP(sequence_expand);\nUSE_LITE_OP(density_prior_box);\nUSE_LITE_OP(crop);\nUSE_LITE_OP(grid_sampler);\nUSE_LITE_OP(subgraph);\nUSE_LITE_OP(fill_constant_batch_size_like);\nUSE_LITE_OP(fake_dequantize_max_abs);\nUSE_LITE_OP(sequence_concat);\nUSE_LITE_OP(transpose);\nUSE_LITE_OP(transpose2);\nUSE_LITE_OP(search_fc);\nUSE_LITE_OP(lookup_table_v2);\nUSE_LITE_OP(box_coder);\nUSE_LITE_OP(sequence_conv);\nUSE_LITE_OP(equal);\nUSE_LITE_OP(not_equal);\nUSE_LITE_OP(less_than);\nUSE_LITE_OP(less_equal);\nUSE_LITE_OP(greater_than);\nUSE_LITE_OP(greater_equal);\nUSE_LITE_OP(fake_channel_wise_dequantize_max_abs);\nUSE_LITE_OP(beam_search_decode);\nUSE_LITE_OP(__xpu__resnet50);\nUSE_LITE_OP(io_copy_once);\nUSE_LITE_OP(layout);\nUSE_LITE_OP(instance_norm);\nUSE_LITE_OP(negative);\nUSE_LITE_OP(lod_reset);\nUSE_LITE_OP(norm);\nUSE_LITE_OP(lstm);\nUSE_LITE_OP(fake_quantize_range_abs_max);\nUSE_LITE_OP(fake_quantize_abs_max);\nUSE_LITE_OP(sigmoid);\nUSE_LITE_OP(tanh);\nUSE_LITE_OP(relu);\nUSE_LITE_OP(leaky_relu);\nUSE_LITE_OP(relu6);\nUSE_LITE_OP(prelu);\nUSE_LITE_OP(reduce_max);\nUSE_LITE_OP(logical_xor);\nUSE_LITE_OP(logical_and);\nUSE_LITE_OP(logical_or);\nUSE_LITE_OP(logical_not);\nUSE_LITE_OP(distribute_fpn_proposals);\nUSE_LITE_OP(split_lod_tensor);\nUSE_LITE_OP(reduce_sum);\nUSE_LITE_OP(sequence_unpad);\nUSE_LITE_OP(shuffle_channel);\nUSE_LITE_OP(read_from_array);\nUSE_LITE_OP(search_aligned_mat_mul);\nUSE_LITE_OP(arg_max);\nUSE_LITE_OP(conv2d);\nUSE_LITE_OP(depthwise_conv2d);\nUSE_LITE_OP(gather);\nUSE_LITE_OP(gru_unit);\nUSE_LITE_OP(expand);\nUSE_LITE_OP(fusion_elementwise_sub_activation);\nUSE_LITE_OP(fusion_elementwise_add_activation);\nUSE_LITE_OP(fusion_elementwise_mul_activation);\nUSE_LITE_OP(fusion_elementwise_max_activation);\nUSE_LITE_OP(fusion_elementwise_div_activation);\nUSE_LITE_OP(prior_box);\nUSE_LITE_OP(split);\nUSE_LITE_OP(lookup_table);\nUSE_LITE_OP(conv2d_transpose);\nUSE_LITE_OP(depthwise_conv2d_transpose);\nUSE_LITE_OP(crf_decoding);\nUSE_LITE_OP(roi_align);\nUSE_LITE_OP(box_clip);\nUSE_LITE_OP(calib_once);\nUSE_LITE_OP(concat);\nUSE_LITE_OP(pool2d);\nUSE_LITE_OP(conditional_block);\nUSE_LITE_OP(search_seq_depadding);\nUSE_LITE_OP(range);\nUSE_LITE_OP(squeeze);\nUSE_LITE_OP(squeeze2);\nUSE_LITE_OP(fill_constant);\nUSE_LITE_OP(sequence_pool);\nUSE_LITE_OP(axpy);\nUSE_LITE_OP(slice);\nUSE_LITE_OP(layout_once);"
  },
  {
    "path": "Android/testlac/app/src/main/cpp/paddle/include/paddle_use_passes.h",
    "content": "// Copyright (c) 2019 PaddlePaddle Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n#pragma once\n#include \"paddle_lite_factory_helper.h\"  // NOLINT\n\nUSE_MIR_PASS(demo);\nUSE_MIR_PASS(static_kernel_pick_pass);\nUSE_MIR_PASS(variable_place_inference_pass);\nUSE_MIR_PASS(type_target_cast_pass);\nUSE_MIR_PASS(generate_program_pass);\n\nUSE_MIR_PASS(io_copy_kernel_pick_pass);\nUSE_MIR_PASS(argument_type_display_pass);\nUSE_MIR_PASS(runtime_context_assign_pass);\nUSE_MIR_PASS(graph_visualize_pass);\n\nUSE_MIR_PASS(lite_conv_bn_fuse_pass);\nUSE_MIR_PASS(lite_fc_fuse_pass);\nUSE_MIR_PASS(lite_shuffle_channel_fuse_pass);\nUSE_MIR_PASS(lite_transpose_softmax_transpose_fuse_pass);\nUSE_MIR_PASS(lite_interpolate_fuse_pass);\nUSE_MIR_PASS(lite_sequence_pool_concat_fuse_pass);\nUSE_MIR_PASS(identity_scale_eliminate_pass);\nUSE_MIR_PASS(lite_conv_elementwise_fuse_pass);\nUSE_MIR_PASS(lite_conv_activation_fuse_pass);\nUSE_MIR_PASS(lite_var_conv_2d_activation_fuse_pass);\nUSE_MIR_PASS(lite_elementwise_add_activation_fuse_pass);\nUSE_MIR_PASS(lite_quant_dequant_fuse_pass);\nUSE_MIR_PASS(type_precision_cast_pass);\nUSE_MIR_PASS(type_layout_cast_pass);\nUSE_MIR_PASS(type_layout_cast_preprocess_pass);\nUSE_MIR_PASS(memory_optimize_pass);\nUSE_MIR_PASS(multi_stream_analysis_pass);\nUSE_MIR_PASS(elementwise_mul_constant_eliminate_pass)\nUSE_MIR_PASS(npu_subgraph_pass);\nUSE_MIR_PASS(xpu_subgraph_pass);\nUSE_MIR_PASS(mlu_subgraph_pass);\nUSE_MIR_PASS(mlu_postprocess_pass);\nUSE_MIR_PASS(weight_quantization_preprocess_pass);\nUSE_MIR_PASS(apu_subgraph_pass);\nUSE_MIR_PASS(quantized_op_attributes_inference_pass);\nUSE_MIR_PASS(__xpu__resnet_fuse_pass);\nUSE_MIR_PASS(__xpu__multi_encoder_fuse_pass);\n"
  },
  {
    "path": "Android/testlac/app/src/main/java/com/example/testlac/MainActivity.java",
    "content": "package com.example.testlac;\n\nimport androidx.annotation.NonNull;\nimport androidx.appcompat.app.AppCompatActivity;\nimport androidx.core.app.ActivityCompat;\nimport androidx.core.content.ContextCompat;\n\nimport android.Manifest;\nimport android.app.AlertDialog;\nimport android.content.Context;\nimport android.content.DialogInterface;\nimport android.content.pm.PackageManager;\nimport android.content.res.Resources;\nimport android.os.Bundle;\nimport android.text.TextUtils;\nimport android.view.View;\nimport android.widget.Button;\nimport android.widget.EditText;\nimport android.widget.TextView;\n\nimport java.io.BufferedOutputStream;\nimport java.io.File;\nimport java.io.FileOutputStream;\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.io.OutputStream;\n\npublic class MainActivity extends AppCompatActivity {\n    private TextView mCutResult;\n    private EditText mInputText;\n    private Button mButton;\n\n    // Used to load the 'native-lib' library on application startup.\n    static {\n        System.loadLibrary(\"native_lib\");\n    }\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.activity_main);\n        mInputText = (EditText) findViewById(R.id.input_text);\n        mCutResult = (TextView) findViewById(R.id.cut_result);\n        mButton = (Button) findViewById((R.id.cut_button));\n        // Example of a call to a native method\n        TextView tv = findViewById(R.id.sample_text);\n        if (!checkAllPermissions()) {\n            requestAllPermissions();\n        }\n        tv.setText(stringFromJNI());\n        mButton.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                String inputText = mInputText.getText().toString();\n                if (!TextUtils.isEmpty(inputText)) {\n                    mCutResult.setText(stringCutFromJNI(inputText));\n                } else {\n                    mCutResult.setText(stringCutFromJNI(\"输入太短\"));\n                }\n            }\n        });\n\n        String model_path = copyFromAssetsToCache(\"lac_model\", this);\n        initLac(model_path);\n\n        /* load model for protobuf file, need protobuf lib, abandon\n        Resources res = getResources();\n        try {\n            //获取文件的字节数\n            InputStream lac_dict = res.openRawResource(R.raw.lac_dict_model);\n            int length = lac_dict.available();\n            //创建byte数组\n            byte[]  buffer = new byte[length];\n            //将文件中的数据读到byte数组中\n            lac_dict.read(buffer);\n            // 初始化模型\n            initLac(buffer, length);\n        } catch (IOException e) {\n            e.printStackTrace();\n        }\n         */\n\n    }\n\n    @Override\n    protected void onDestroy() {\n        releaseLac();\n        super.onDestroy();\n    }\n\n    @Override\n    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,\n                                           @NonNull int[] grantResults) {\n        super.onRequestPermissionsResult(requestCode, permissions, grantResults);\n        if (grantResults[0] != PackageManager.PERMISSION_GRANTED || grantResults[1] != PackageManager.PERMISSION_GRANTED) {\n            new AlertDialog.Builder(MainActivity.this)\n                    .setTitle(\"Permission denied\")\n                    .setMessage(\"Click to force quit the app, then open Settings->Apps & notifications->Target \" +\n                            \"App->Permissions to grant all of the permissions.\")\n                    .setCancelable(false)\n                    .setPositiveButton(\"Exit\", new DialogInterface.OnClickListener() {\n                        @Override\n                        public void onClick(DialogInterface dialog, int which) {\n                            MainActivity.this.finish();\n                        }\n                    }).show();\n        }\n    }\n\n    public static String copyFromAssetsToCache(String modelPath, Context context) {\n        String newPath = context.getCacheDir() + \"/\" + modelPath;\n        // String newPath = \"/sdcard/\" + modelPath;\n        File desDir = new File(newPath);\n\n        try {\n            if (!desDir.exists()) {\n                desDir.mkdir();\n            }\n            for (String fileName : context.getAssets().list(modelPath)) {\n                InputStream stream = context.getAssets().open(modelPath + \"/\" + fileName);\n                OutputStream output = new BufferedOutputStream(new FileOutputStream(newPath + \"/\" + fileName));\n\n                byte data[] = new byte[1024];\n                int count;\n\n                while ((count = stream.read(data)) != -1) {\n                    output.write(data, 0, count);\n                }\n\n                output.flush();\n                output.close();\n                stream.close();\n            }\n\n        } catch (Exception e) {\n            throw new RuntimeException(e);\n        }\n\n        return desDir.getPath();\n    }\n\n    private void requestAllPermissions() {\n        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,\n                Manifest.permission.READ_EXTERNAL_STORAGE}, 0);\n    }\n\n    private boolean checkAllPermissions() {\n        return ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED\n                && ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED;\n    }\n\n    /**\n     * A native method that is implemented by the 'native-lib' native library,\n     * which is packaged with this application.\n     *\n     */\n//    public native void initLac(byte[] lac_dict, int length);\n\n    public native void initLac(String model_path);\n\n    public native void releaseLac();\n\n    public native String stringFromJNI();\n\n    public native String stringCutFromJNI(String source_text);\n}\n"
  },
  {
    "path": "Android/testlac/app/src/main/res/drawable/ic_launcher_background.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"108dp\"\n    android:height=\"108dp\"\n    android:viewportWidth=\"108\"\n    android:viewportHeight=\"108\">\n    <path\n        android:fillColor=\"#3DDC84\"\n        android:pathData=\"M0,0h108v108h-108z\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M9,0L9,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,0L19,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M29,0L29,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M39,0L39,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M49,0L49,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M59,0L59,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M69,0L69,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M79,0L79,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M89,0L89,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M99,0L99,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,9L108,9\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,19L108,19\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,29L108,29\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,39L108,39\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,49L108,49\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,59L108,59\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,69L108,69\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,79L108,79\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,89L108,89\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,99L108,99\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,29L89,29\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,39L89,39\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,49L89,49\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,59L89,59\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,69L89,69\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,79L89,79\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M29,19L29,89\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M39,19L39,89\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M49,19L49,89\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M59,19L59,89\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M69,19L69,89\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M79,19L79,89\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n</vector>\n"
  },
  {
    "path": "Android/testlac/app/src/main/res/drawable-v24/ic_launcher_foreground.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:aapt=\"http://schemas.android.com/aapt\"\n    android:width=\"108dp\"\n    android:height=\"108dp\"\n    android:viewportWidth=\"108\"\n    android:viewportHeight=\"108\">\n    <path android:pathData=\"M31,63.928c0,0 6.4,-11 12.1,-13.1c7.2,-2.6 26,-1.4 26,-1.4l38.1,38.1L107,108.928l-32,-1L31,63.928z\">\n        <aapt:attr name=\"android:fillColor\">\n            <gradient\n                android:endX=\"85.84757\"\n                android:endY=\"92.4963\"\n                android:startX=\"42.9492\"\n                android:startY=\"49.59793\"\n                android:type=\"linear\">\n                <item\n                    android:color=\"#44000000\"\n                    android:offset=\"0.0\" />\n                <item\n                    android:color=\"#00000000\"\n                    android:offset=\"1.0\" />\n            </gradient>\n        </aapt:attr>\n    </path>\n    <path\n        android:fillColor=\"#FFFFFF\"\n        android:fillType=\"nonZero\"\n        android:pathData=\"M65.3,45.828l3.8,-6.6c0.2,-0.4 0.1,-0.9 -0.3,-1.1c-0.4,-0.2 -0.9,-0.1 -1.1,0.3l-3.9,6.7c-6.3,-2.8 -13.4,-2.8 -19.7,0l-3.9,-6.7c-0.2,-0.4 -0.7,-0.5 -1.1,-0.3C38.8,38.328 38.7,38.828 38.9,39.228l3.8,6.6C36.2,49.428 31.7,56.028 31,63.928h46C76.3,56.028 71.8,49.428 65.3,45.828zM43.4,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2c-0.3,-0.7 -0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C45.3,56.528 44.5,57.328 43.4,57.328L43.4,57.328zM64.6,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2s-0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C66.5,56.528 65.6,57.328 64.6,57.328L64.6,57.328z\"\n        android:strokeWidth=\"1\"\n        android:strokeColor=\"#00000000\" />\n</vector>"
  },
  {
    "path": "Android/testlac/app/src/main/res/layout/activity_main.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:gravity=\"center_horizontal\"\n    android:orientation=\"vertical\"\n    tools:context=\".MainActivity\">\n\n    <TextView\n        android:id=\"@+id/sample_text\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:text=\"测试Lac\"\n        android:layout_marginTop=\"80dp\"\n        android:textSize=\"24dp\" />\n\n    <EditText\n        android:id=\"@+id/input_text\"\n        android:layout_marginTop=\"60dp\"\n        android:layout_width=\"300dp\"\n        android:layout_height=\"50dp\"\n        android:hint=\"在这里输入文字\"\n        android:textSize=\"20sp\"\n        />\n\n    <TextView\n        android:id=\"@+id/cut_result\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"30dp\"\n        android:text=\"测试\"\n        android:textSize=\"20sp\" />\n    <Button\n        android:id=\"@+id/cut_button\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"100dp\"\n        android:text=\"分词\"\n        android:textSize=\"20sp\" />\n\n</LinearLayout>"
  },
  {
    "path": "Android/testlac/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <background android:drawable=\"@drawable/ic_launcher_background\" />\n    <foreground android:drawable=\"@drawable/ic_launcher_foreground\" />\n</adaptive-icon>"
  },
  {
    "path": "Android/testlac/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <background android:drawable=\"@drawable/ic_launcher_background\" />\n    <foreground android:drawable=\"@drawable/ic_launcher_foreground\" />\n</adaptive-icon>"
  },
  {
    "path": "Android/testlac/app/src/main/res/values/colors.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"colorPrimary\">#6200EE</color>\n    <color name=\"colorPrimaryDark\">#3700B3</color>\n    <color name=\"colorAccent\">#03DAC5</color>\n</resources>\n"
  },
  {
    "path": "Android/testlac/app/src/main/res/values/strings.xml",
    "content": "<resources>\n    <string name=\"app_name\">testlac</string>\n</resources>\n"
  },
  {
    "path": "Android/testlac/app/src/main/res/values/styles.xml",
    "content": "<resources>\n\n    <!-- Base application theme. -->\n    <style name=\"AppTheme\" parent=\"Theme.AppCompat.Light.DarkActionBar\">\n        <!-- Customize your theme here. -->\n        <item name=\"colorPrimary\">@color/colorPrimary</item>\n        <item name=\"colorPrimaryDark\">@color/colorPrimaryDark</item>\n        <item name=\"colorAccent\">@color/colorAccent</item>\n    </style>\n\n</resources>\n"
  },
  {
    "path": "Android/testlac/app/src/test/java/com/example/testlac/ExampleUnitTest.java",
    "content": "package com.example.testlac;\n\nimport org.junit.Test;\n\nimport static org.junit.Assert.*;\n\n/**\n * Example local unit test, which will execute on the development machine (host).\n *\n * @see <a href=\"http://d.android.com/tools/testing\">Testing documentation</a>\n */\npublic class ExampleUnitTest {\n    @Test\n    public void addition_isCorrect() {\n        assertEquals(4, 2 + 2);\n    }\n}"
  },
  {
    "path": "Android/testlac/build.gradle",
    "content": "// Top-level build file where you can add configuration options common to all sub-projects/modules.\n\nbuildscript {\n    \n    repositories {\n        google()\n        jcenter()\n        \n    }\n    dependencies {\n        classpath 'com.android.tools.build:gradle:3.6.2'\n        \n\n        // NOTE: Do not place your application dependencies here; they belong\n        // in the individual module build.gradle files\n    }\n}\n\nallprojects {\n    repositories {\n        google()\n        jcenter()\n        \n    }\n}\n\ntask clean(type: Delete) {\n    delete rootProject.buildDir\n}\n"
  },
  {
    "path": "Android/testlac/gradle.properties",
    "content": "# Project-wide Gradle settings.\n# IDE (e.g. Android Studio) users:\n# Gradle settings configured through the IDE *will override*\n# any settings specified in this file.\n# For more details on how to configure your build environment visit\n# http://www.gradle.org/docs/current/userguide/build_environment.html\n# Specifies the JVM arguments used for the daemon process.\n# The setting is particularly useful for tweaking memory settings.\norg.gradle.jvmargs=-Xmx1536m\n# When configured, Gradle will run in incubating parallel mode.\n# This option should only be used with decoupled projects. More details, visit\n# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects\n# org.gradle.parallel=true\n# AndroidX package structure to make it clearer which packages are bundled with the\n# Android operating system, and which are packaged with your app's APK\n# https://developer.android.com/topic/libraries/support-library/androidx-rn\nandroid.useAndroidX=true\n# Automatically convert third-party libraries to use AndroidX\nandroid.enableJetifier=true\n\n"
  },
  {
    "path": "Android/testlac/gradlew",
    "content": "#!/usr/bin/env sh\n\n##############################################################################\n##\n##  Gradle start up script for UN*X\n##\n##############################################################################\n\n# Attempt to set APP_HOME\n# Resolve links: $0 may be a link\nPRG=\"$0\"\n# Need this for relative symlinks.\nwhile [ -h \"$PRG\" ] ; do\n    ls=`ls -ld \"$PRG\"`\n    link=`expr \"$ls\" : '.*-> \\(.*\\)$'`\n    if expr \"$link\" : '/.*' > /dev/null; then\n        PRG=\"$link\"\n    else\n        PRG=`dirname \"$PRG\"`\"/$link\"\n    fi\ndone\nSAVED=\"`pwd`\"\ncd \"`dirname \\\"$PRG\\\"`/\" >/dev/null\nAPP_HOME=\"`pwd -P`\"\ncd \"$SAVED\" >/dev/null\n\nAPP_NAME=\"Gradle\"\nAPP_BASE_NAME=`basename \"$0\"`\n\n# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\nDEFAULT_JVM_OPTS=\"\"\n\n# Use the maximum available, or set MAX_FD != -1 to use that value.\nMAX_FD=\"maximum\"\n\nwarn () {\n    echo \"$*\"\n}\n\ndie () {\n    echo\n    echo \"$*\"\n    echo\n    exit 1\n}\n\n# OS specific support (must be 'true' or 'false').\ncygwin=false\nmsys=false\ndarwin=false\nnonstop=false\ncase \"`uname`\" in\n  CYGWIN* )\n    cygwin=true\n    ;;\n  Darwin* )\n    darwin=true\n    ;;\n  MINGW* )\n    msys=true\n    ;;\n  NONSTOP* )\n    nonstop=true\n    ;;\nesac\n\nCLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar\n\n# Determine the Java command to use to start the JVM.\nif [ -n \"$JAVA_HOME\" ] ; then\n    if [ -x \"$JAVA_HOME/jre/sh/java\" ] ; then\n        # IBM's JDK on AIX uses strange locations for the executables\n        JAVACMD=\"$JAVA_HOME/jre/sh/java\"\n    else\n        JAVACMD=\"$JAVA_HOME/bin/java\"\n    fi\n    if [ ! -x \"$JAVACMD\" ] ; then\n        die \"ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\n    fi\nelse\n    JAVACMD=\"java\"\n    which java >/dev/null 2>&1 || die \"ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\nfi\n\n# Increase the maximum file descriptors if we can.\nif [ \"$cygwin\" = \"false\" -a \"$darwin\" = \"false\" -a \"$nonstop\" = \"false\" ] ; then\n    MAX_FD_LIMIT=`ulimit -H -n`\n    if [ $? -eq 0 ] ; then\n        if [ \"$MAX_FD\" = \"maximum\" -o \"$MAX_FD\" = \"max\" ] ; then\n            MAX_FD=\"$MAX_FD_LIMIT\"\n        fi\n        ulimit -n $MAX_FD\n        if [ $? -ne 0 ] ; then\n            warn \"Could not set maximum file descriptor limit: $MAX_FD\"\n        fi\n    else\n        warn \"Could not query maximum file descriptor limit: $MAX_FD_LIMIT\"\n    fi\nfi\n\n# For Darwin, add options to specify how the application appears in the dock\nif $darwin; then\n    GRADLE_OPTS=\"$GRADLE_OPTS \\\"-Xdock:name=$APP_NAME\\\" \\\"-Xdock:icon=$APP_HOME/media/gradle.icns\\\"\"\nfi\n\n# For Cygwin, switch paths to Windows format before running java\nif $cygwin ; then\n    APP_HOME=`cygpath --path --mixed \"$APP_HOME\"`\n    CLASSPATH=`cygpath --path --mixed \"$CLASSPATH\"`\n    JAVACMD=`cygpath --unix \"$JAVACMD\"`\n\n    # We build the pattern for arguments to be converted via cygpath\n    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`\n    SEP=\"\"\n    for dir in $ROOTDIRSRAW ; do\n        ROOTDIRS=\"$ROOTDIRS$SEP$dir\"\n        SEP=\"|\"\n    done\n    OURCYGPATTERN=\"(^($ROOTDIRS))\"\n    # Add a user-defined pattern to the cygpath arguments\n    if [ \"$GRADLE_CYGPATTERN\" != \"\" ] ; then\n        OURCYGPATTERN=\"$OURCYGPATTERN|($GRADLE_CYGPATTERN)\"\n    fi\n    # Now convert the arguments - kludge to limit ourselves to /bin/sh\n    i=0\n    for arg in \"$@\" ; do\n        CHECK=`echo \"$arg\"|egrep -c \"$OURCYGPATTERN\" -`\n        CHECK2=`echo \"$arg\"|egrep -c \"^-\"`                                 ### Determine if an option\n\n        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition\n            eval `echo args$i`=`cygpath --path --ignore --mixed \"$arg\"`\n        else\n            eval `echo args$i`=\"\\\"$arg\\\"\"\n        fi\n        i=$((i+1))\n    done\n    case $i in\n        (0) set -- ;;\n        (1) set -- \"$args0\" ;;\n        (2) set -- \"$args0\" \"$args1\" ;;\n        (3) set -- \"$args0\" \"$args1\" \"$args2\" ;;\n        (4) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" ;;\n        (5) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" ;;\n        (6) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" ;;\n        (7) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" ;;\n        (8) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" ;;\n        (9) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" \"$args8\" ;;\n    esac\nfi\n\n# Escape application args\nsave () {\n    for i do printf %s\\\\n \"$i\" | sed \"s/'/'\\\\\\\\''/g;1s/^/'/;\\$s/\\$/' \\\\\\\\/\" ; done\n    echo \" \"\n}\nAPP_ARGS=$(save \"$@\")\n\n# Collect all arguments for the java command, following the shell quoting and substitution rules\neval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS \"\\\"-Dorg.gradle.appname=$APP_BASE_NAME\\\"\" -classpath \"\\\"$CLASSPATH\\\"\" org.gradle.wrapper.GradleWrapperMain \"$APP_ARGS\"\n\n# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong\nif [ \"$(uname)\" = \"Darwin\" ] && [ \"$HOME\" = \"$PWD\" ]; then\n  cd \"$(dirname \"$0\")\"\nfi\n\nexec \"$JAVACMD\" \"$@\"\n"
  },
  {
    "path": "Android/testlac/gradlew.bat",
    "content": "@if \"%DEBUG%\" == \"\" @echo off\r\n@rem ##########################################################################\r\n@rem\r\n@rem  Gradle startup script for Windows\r\n@rem\r\n@rem ##########################################################################\r\n\r\n@rem Set local scope for the variables with windows NT shell\r\nif \"%OS%\"==\"Windows_NT\" setlocal\r\n\r\nset DIRNAME=%~dp0\r\nif \"%DIRNAME%\" == \"\" set DIRNAME=.\r\nset APP_BASE_NAME=%~n0\r\nset APP_HOME=%DIRNAME%\r\n\r\n@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\r\nset DEFAULT_JVM_OPTS=\r\n\r\n@rem Find java.exe\r\nif defined JAVA_HOME goto findJavaFromJavaHome\r\n\r\nset JAVA_EXE=java.exe\r\n%JAVA_EXE% -version >NUL 2>&1\r\nif \"%ERRORLEVEL%\" == \"0\" goto init\r\n\r\necho.\r\necho ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\r\necho.\r\necho Please set the JAVA_HOME variable in your environment to match the\r\necho location of your Java installation.\r\n\r\ngoto fail\r\n\r\n:findJavaFromJavaHome\r\nset JAVA_HOME=%JAVA_HOME:\"=%\r\nset JAVA_EXE=%JAVA_HOME%/bin/java.exe\r\n\r\nif exist \"%JAVA_EXE%\" goto init\r\n\r\necho.\r\necho ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%\r\necho.\r\necho Please set the JAVA_HOME variable in your environment to match the\r\necho location of your Java installation.\r\n\r\ngoto fail\r\n\r\n:init\r\n@rem Get command-line arguments, handling Windows variants\r\n\r\nif not \"%OS%\" == \"Windows_NT\" goto win9xME_args\r\n\r\n:win9xME_args\r\n@rem Slurp the command line arguments.\r\nset CMD_LINE_ARGS=\r\nset _SKIP=2\r\n\r\n:win9xME_args_slurp\r\nif \"x%~1\" == \"x\" goto execute\r\n\r\nset CMD_LINE_ARGS=%*\r\n\r\n:execute\r\n@rem Setup the command line\r\n\r\nset CLASSPATH=%APP_HOME%\\gradle\\wrapper\\gradle-wrapper.jar\r\n\r\n@rem Execute Gradle\r\n\"%JAVA_EXE%\" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% \"-Dorg.gradle.appname=%APP_BASE_NAME%\" -classpath \"%CLASSPATH%\" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%\r\n\r\n:end\r\n@rem End local scope for the variables with windows NT shell\r\nif \"%ERRORLEVEL%\"==\"0\" goto mainEnd\r\n\r\n:fail\r\nrem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of\r\nrem the _cmd.exe /c_ return code!\r\nif  not \"\" == \"%GRADLE_EXIT_CONSOLE%\" exit 1\r\nexit /b 1\r\n\r\n:mainEnd\r\nif \"%OS%\"==\"Windows_NT\" endlocal\r\n\r\n:omega\r\n"
  },
  {
    "path": "Android/testlac/local.properties",
    "content": "## This file must *NOT* be checked into Version Control Systems,\n# as it contains information specific to your local configuration.\n#\n# Location of the SDK. This is only used by Gradle.\n# For customization when using a Version Control System, please read the\n# header note.\n#Tue Apr 21 15:41:16 CST 2020\nndk.dir=/Users/huangdingbang/Library/Android/sdk/ndk/21.1.6352462\nsdk.dir=/Users/huangdingbang/Library/Android/sdk\n"
  },
  {
    "path": "Android/testlac/settings.gradle",
    "content": "rootProject.name='testlac'\ninclude ':app'\n"
  },
  {
    "path": "Android/testlac/testlac.iml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<module external.linked.project.id=\"testlac\" external.linked.project.path=\"$MODULE_DIR$\" external.root.project.path=\"$MODULE_DIR$\" external.system.id=\"GRADLE\" type=\"JAVA_MODULE\" version=\"4\">\n  <component name=\"FacetManager\">\n    <facet type=\"java-gradle\" name=\"Java-Gradle\">\n      <configuration>\n        <option name=\"BUILD_FOLDER_PATH\" value=\"$MODULE_DIR$/build\" />\n        <option name=\"BUILDABLE\" value=\"false\" />\n      </configuration>\n    </facet>\n  </component>\n  <component name=\"NewModuleRootManager\" LANGUAGE_LEVEL=\"JDK_1_7\" inherit-compiler-output=\"true\">\n    <exclude-output />\n    <content url=\"file://$MODULE_DIR$\">\n      <excludeFolder url=\"file://$MODULE_DIR$/.gradle\" />\n    </content>\n    <orderEntry type=\"inheritedJdk\" />\n    <orderEntry type=\"sourceFolder\" forTests=\"false\" />\n  </component>\n</module>"
  },
  {
    "path": "CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.0)\nproject(lac CXX C)\n\noption(WITH_STATIC_LIB \"Compile demo with static/shared library, default use static.\"  ON)\n\noption(WITH_DEMO \"Compile C++ demo or not, default yes\" ON)\noption(WITH_JNILIB \"Compile jni library for Java or not, default not\" OFF)\n\n# set paddle and java path\n#set(PADDLE_ROOT \"D:/lac/fluid_inference_install_dir\")\n#set(JAVA_HOME \"C:/Program Files/Java/jdk1.8.0_121\")\n\nmessage(STATUS \"CXX compiler: ${CMAKE_CXX_COMPILER}, version: \"\n        \"${CMAKE_CXX_COMPILER_ID} ${CMAKE_CXX_COMPILER_VERSION}\")\nmessage(STATUS \"C compiler: ${CMAKE_C_COMPILER}, version: \"\n        \"${CMAKE_C_COMPILER_ID} ${CMAKE_C_COMPILER_VERSION}\")\n#[[\nif(CMAKE_COMPILER_IS_GNUCXX)\n    execute_process(COMMAND ${CMAKE_CXX_COMPILER} -dumpversion OUTPUT_VARIABLE GCC_VERSION)\n    if (GCC_VERSION VERSION_LESS 8.2)\n        message(FATAL_ERROR \"A gcc compiler with a version >= 8.2 is needed.\")\n    endif()\nelse()\n    message(FATAL_ERROR \"A gcc compiler is needed.\")\nendif(CMAKE_COMPILER_IS_GNUCXX)\n]]\nmacro(safe_set_static_flag)\n    foreach(flag_var\n        CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE\n        CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO)\n      if(${flag_var} MATCHES \"/MD\")\n        string(REGEX REPLACE \"/MD\" \"/MT\" ${flag_var} \"${${flag_var}}\")\n      endif(${flag_var} MATCHES \"/MD\")\n    endforeach(flag_var)\nendmacro()\n\nif(NOT DEFINED PADDLE_ROOT)\n    message(FATAL_ERROR \"please set PADDLE_ROOT with -DPADDLE_ROOT=/path/paddle/lib\")\nendif()\nif (WITH_JNILIB AND NOT DEFINED JAVA_HOME)\n    message(FATAL_ERROR \"please set JAVA_HOME with -DJAVA_HOME=/path/of/java\")\nendif()\n\nif (IS_ABSOLUTE ${PADDLE_ROOT})\n    set(PADDLE_ABS_PATH ${PADDLE_ROOT})\nelse ()\n    get_filename_component(PADDLE_ABS_PATH ${CMAKE_BINARY_DIR}/${PADDLE_ROOT}/ ABSOLUTE)\nendif ()\n\nmessage(STATUS \"paddle include: ${PADDLE_ABS_PATH}/paddle/include\") \nmessage(STATUS \"paddle lib: ${PADDLE_ABS_PATH}/paddle/lib\")\ninclude_directories(${PADDLE_ABS_PATH}/paddle/include)\nset(PADDLE_LIB_THIRD_PARTY_PATH \"${PADDLE_ABS_PATH}/third_party/install/\")\ninclude_directories(\"${PADDLE_LIB_THIRD_PARTY_PATH}protobuf/include\")\ninclude_directories(\"${PADDLE_LIB_THIRD_PARTY_PATH}glog/include\")\ninclude_directories(\"${PADDLE_LIB_THIRD_PARTY_PATH}gflags/include\")\ninclude_directories(\"${PADDLE_LIB_THIRD_PARTY_PATH}xxhash/include\")\n\nlink_directories(\"${PADDLE_LIB_THIRD_PARTY_PATH}protobuf/lib\")\nlink_directories(\"${PADDLE_LIB_THIRD_PARTY_PATH}glog/lib\")\nlink_directories(\"${PADDLE_LIB_THIRD_PARTY_PATH}gflags/lib\")\nlink_directories(\"${PADDLE_LIB_THIRD_PARTY_PATH}xxhash/lib\")\nlink_directories(\"${PADDLE_ABS_PATH}/paddle/lib\")\n\n\n#link_libraries(paddle_fluid)\n\nif (WIN32)\n  add_definitions(\"/DGOOGLE_GLOG_DLL_DECL=\")\n  if (MSVC)\n    option(MSVC_STATIC_CRT \"use static C Runtime library by default\" ON)\n    set(CMAKE_C_FLAGS_DEBUG   \"${CMAKE_C_FLAGS_DEBUG} /bigobj /MTd\")\n    set(CMAKE_C_FLAGS_RELEASE  \"${CMAKE_C_FLAGS_RELEASE} /bigobj /MT\")\n    set(CMAKE_CXX_FLAGS_DEBUG  \"${CMAKE_CXX_FLAGS_DEBUG} /bigobj /MTd\")\n    set(CMAKE_CXX_FLAGS_RELEASE   \"${CMAKE_CXX_FLAGS_RELEASE} /bigobj /MT\")\n    if (WITH_STATIC_LIB)\n      safe_set_static_flag()\n      add_definitions(-DSTATIC_LIB)\n    endif()\n  endif()\nelse()\n    set(CMAKE_CXX_FLAGS \"-O3 -g -pipe -W -Wall -Wno-unused-parameter -fPIC -fpermissive -std=gnu++11\")\nendif()\n\n\n# add mkldnn library if it exitsts\nset (mkldnn_inc_path ${PADDLE_ABS_PATH}/third_party/install/mkldnn/include)\nset (mkldnn_lib_path ${PADDLE_ABS_PATH}/third_party/install/mkldnn/lib)\nif (EXISTS ${mkldnn_inc_path} AND EXISTS ${mkldnn_lib_path})\n    message(STATUS \"MKLDNN lib found.\")\n    include_directories(${PADDLE_ABS_PATH}/third_party/install/mkldnn/include)\n    if (WIN32)\n        set (MKLDNN_LIB ${mkldnn_lib_path}/mkldnn.lib)\n    else (WIN32)\n        set (MKLDNN_LIB ${mkldnn_lib_path}/libmkldnn.so.0)\n    endif (WIN32)\nelse ()\n    message(STATUS \"MKLDNN lib not found.\")\nendif()\n\n# add mklml library if it exists\nset (mklml_inc_path ${PADDLE_ABS_PATH}/third_party/install/mklml/include)\nset (mklml_lib_path ${PADDLE_ABS_PATH}/third_party/install/mklml/lib)\nif (EXISTS ${mklml_inc_path} AND EXISTS ${mklml_lib_path})\n    message(STATUS \"MKLML lib found.\")   \n    include_directories(${PADDLE_ABS_PATH}/third_party/install/mklml/include)\n    if(WIN32)\n        set(MATH_LIB ${mklml_lib_path}/mklml${CMAKE_STATIC_LIBRARY_SUFFIX}\n            ${mklml_lib_path}/libiomp5md${CMAKE_STATIC_LIBRARY_SUFFIX})\n    else()\n        set(MATH_LIB ${mklml_lib_path}/libmklml_intel${CMAKE_SHARED_LIBRARY_SUFFIX}\n            ${mklml_lib_path}/libiomp5${CMAKE_SHARED_LIBRARY_SUFFIX})\n    endif()\nelse ()\n    message(STATUS \"MKLML lib not found.\")\nendif()\n\n# add openblas library if it exists\nset (openblas_inc_path ${PADDLE_ABS_PATH}/third_party/install/openblas/include)\nset (openblas_lib_path ${PADDLE_ABS_PATH}/third_party/install/openblas/lib)\nif (EXISTS ${openblas_inc_path} AND EXISTS ${openblas_lib_path})\n    message(STATUS \"openblas lib found.\")   \n    include_directories(${PADDLE_ABS_PATH}/third_party/install/openblas/include)\n    if(WIN32)\n        set(MATH_LIB ${openblas_lib_path}/openblas${CMAKE_STATIC_LIBRARY_SUFFIX})\n    else()\n        set(MATH_LIB ${openblas_lib_path}/libopenblas${CMAKE_STATIC_LIBRARY_SUFFIX})\n    endif()\nelse ()\n    message(STATUS \"openblas lib not found.\")\nendif()\n\nif(WITH_STATIC_LIB)\n    set(DEPS ${PADDLE_ABS_PATH}/paddle/lib/libpaddle_fluid${CMAKE_STATIC_LIBRARY_SUFFIX})\nelse()\n    if(WIN32)\n        set(DEPS ${PADDLE_ABS_PATH}/paddle/lib/paddle_fluid${CMAKE_SHARED_LIBRARY_SUFFIX})\n    else()\n        set(DEPS ${PADDLE_ABS_PATH}/paddle/lib/libpaddle_fluid${CMAKE_SHARED_LIBRARY_SUFFIX})\n    endif()\nendif()\n\nif (NOT WIN32)\n  set(EXTERNAL_LIB \"-ldl -lpthread\")\n  set(DEPS ${DEPS}\n      ${MATH_LIB} ${MKLDNN_LIB}\n      glog gflags protobuf  xxhash\n      ${EXTERNAL_LIB})\nelse()\n  set(DEPS ${DEPS}\n      ${MATH_LIB} ${MKLDNN_LIB}\n      glog gflags_static libprotobuf  xxhash ${EXTERNAL_LIB})\n  set(DEPS ${DEPS} libcmt shlwapi.lib)\nendif(NOT WIN32)\n\n\ninclude_directories(c++/include)\naux_source_directory(c++/src SOURCE)\n\n\nmessage(STATUS \"'${PROJECT_SOURCE_DIR}' output dir\")\nadd_library(lac ${SOURCE})\n\n# for c++ binary demo\nif (WITH_DEMO)\nadd_executable(lac_demo c++/lac_demo.cpp)\nset_target_properties(lac_demo PROPERTIES INSTALL_RPATH_USE_LINK_PATH TRUE)\ntarget_link_libraries(lac_demo lac ${DEPS})\n\nadd_executable(lac_multi c++/lac_multi.cpp)\nset_target_properties(lac_multi PROPERTIES INSTALL_RPATH_USE_LINK_PATH TRUE)\ntarget_link_libraries(lac_multi lac ${DEPS})\nendif()\n\n# for jni lib\nif (WITH_JNILIB)\ninclude_directories(./java/cpp ${JAVA_HOME}/include ${JAVA_HOME}/include/linux/ ${JAVA_HOME}/include/darwin ${JAVA_HOME}/include/win32)\nadd_library(lacjni SHARED ${SOURCE} ./java/cpp/lac_jni.cpp)\nset_target_properties(lacjni PROPERTIES INSTALL_RPATH_USE_LINK_PATH TRUE)\ntarget_link_libraries(lacjni ${DEPS})\nendif()\n\n\nif(WIN32)\n  if (EXISTS ${mklml_inc_path} AND EXISTS ${mklml_lib_path})\n    add_custom_command(TARGET lac_demo POST_BUILD\n          COMMAND ${CMAKE_COMMAND} -E copy ${mklml_lib_path}/mklml.dll ${CMAKE_BINARY_DIR}/Release\n          COMMAND ${CMAKE_COMMAND} -E copy ${mklml_lib_path}/libiomp5md.dll ${CMAKE_BINARY_DIR}/Release\n          COMMAND ${CMAKE_COMMAND} -E copy ${mkldnn_lib_path}/mkldnn.dll  ${CMAKE_BINARY_DIR}/Release\n    )\n  else()\n    add_custom_command(TARGET lac_demo POST_BUILD\n          COMMAND ${CMAKE_COMMAND} -E copy ${openblas_lib_path}/openblas.dll ${CMAKE_BINARY_DIR}/Release\n    )\n  endif()\n  if(NOT WITH_STATIC_LIB)\n      add_custom_command(TARGET lac_demo POST_BUILD \n        COMMAND ${CMAKE_COMMAND} -E copy \"${PADDLE_ABS_PATH}/paddle/lib/paddle_fluid.dll\" ${CMAKE_BINARY_DIR}/${CMAKE_BUILD_TYPE}\n      )\n  endif()\nendif()\n\n\ninstall(TARGETS lac DESTINATION ${PROJECT_SOURCE_DIR}/output/lib)\ninstall(FILES ${PROJECT_SOURCE_DIR}/c++/include/lac.h\n        DESTINATION ${PROJECT_SOURCE_DIR}/output/include)\n\n\nif (WITH_DEMO)\ninstall(TARGETS lac_demo DESTINATION ${PROJECT_SOURCE_DIR}/output/bin)\ninstall(TARGETS lac_multi DESTINATION ${PROJECT_SOURCE_DIR}/output/bin)\nendif()\n\nif (WITH_JNILIB)\ninstall(TARGETS lacjni DESTINATION ${PROJECT_SOURCE_DIR}/output/java)\n\ninstall(FILES ${PROJECT_SOURCE_DIR}/java/com/baidu/nlp/LAC.java\n        DESTINATION ${PROJECT_SOURCE_DIR}/output/java/com/baidu/nlp/)\ninstall(FILES ${PROJECT_SOURCE_DIR}/java/LacDemo.java\n        DESTINATION ${PROJECT_SOURCE_DIR}/output/java)\ninstall(FILES ${PROJECT_SOURCE_DIR}/java/LacMulti.java\n        DESTINATION ${PROJECT_SOURCE_DIR}/output/java)\nendif()\n\n\n"
  },
  {
    "path": "Changelog",
    "content": "2020-10-25: version 2.1.0\n1. 词性标注模型粒度更新为字词混合，在效果保持不变的情况下，性能提升最高可达20%。\n2. 新增加词语关键度分类功能，在维持LAC词性标注结果下可以标注词语关键程度。\n3. 修复了模型训练速度慢问题。\n"
  },
  {
    "path": "LICENSE",
    "content": "Copyright (c) 2018 Baidu, Inc. All Rights Reserved\n\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright (c) 2018 Baidu, Inc. All Rights Reserved.\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n"
  },
  {
    "path": "README.md",
    "content": "## 工具介绍\nLAC全称Lexical Analysis of Chinese，是百度自然语言处理部研发的一款联合的词法分析工具，实现中文分词、词性标注、专名识别等功能。该工具具有以下特点与优势：\n- **效果好**：通过深度学习模型联合学习分词、词性标注、专名识别任务，词语重要性，整体效果F1值超过0.91，词性标注F1值超过0.94，专名识别F1值超过0.85，效果业内领先。\n- **效率高**：精简模型参数，结合Paddle预测库的性能优化，CPU单线程性能达800QPS，效率业内领先。\n- **可定制**：实现简单可控的干预机制，精准匹配用户词典对模型进行干预。词典支持长片段形式，使得干预更为精准。\n- **调用便捷**：**支持一键安装**，同时提供了Python、Java和C++调用接口与调用示例，实现快速调用和集成。\n- **支持移动端**: 定制超轻量级模型，体积仅为2M，主流千元手机单线程性能达200QPS，满足大多数移动端应用的需求，同等体积量级效果业内领先。\n\n## 安装与使用\n在此我们主要介绍Python安装与使用，其他语言使用：\n- [C++](./c++/README.md)\n- [JAVA](./java/README.md)\n- [Android](./Android/README.md)\n\n### 安装说明\n代码兼容Python2/3\n- 全自动安装: `pip install lac`\n- 半自动下载：先下载[http://pypi.python.org/pypi/lac/](http://pypi.python.org/pypi/lac/)，解压后运行 `python setup.py install`\n- 安装完成后可在命令行输入`lac`或`lac --segonly`,`lac --rank`启动服务，进行快速体验。\n\n  > 国内网络可使用百度源安装，安装速率更快：`pip install lac -i https://mirror.baidu.com/pypi/simple`\n\n### 功能与使用\n#### 分词\n- 代码示例：\n```python\nfrom LAC import LAC\n\n# 装载分词模型\nlac = LAC(mode='seg')\n\n# 单个样本输入，输入为Unicode编码的字符串\ntext = u\"LAC是个优秀的分词工具\"\nseg_result = lac.run(text)\n\n# 批量样本输入, 输入为多个句子组成的list，平均速率会更快\ntexts = [u\"LAC是个优秀的分词工具\", u\"百度是一家高科技公司\"]\nseg_result = lac.run(texts)\n```\n- 输出：\n\n```text\n【单样本】：seg_result = [LAC, 是, 个, 优秀, 的, 分词, 工具]\n【批量样本】：seg_result = [[LAC, 是, 个, 优秀, 的, 分词, 工具], [百度, 是, 一家, 高科技, 公司]]\n```\n\n#### 词性标注与实体识别\n- 代码示例：\n```python\nfrom LAC import LAC\n\n# 装载LAC模型\nlac = LAC(mode='lac')\n\n# 单个样本输入，输入为Unicode编码的字符串\ntext = u\"LAC是个优秀的分词工具\"\nlac_result = lac.run(text)\n\n# 批量样本输入, 输入为多个句子组成的list，平均速率更快\ntexts = [u\"LAC是个优秀的分词工具\", u\"百度是一家高科技公司\"]\nlac_result = lac.run(texts)\n```\n- 输出：\n\n>每个句子的输出其切词结果word_list以及对每个单词的标注tags_list，其格式为（word_list, tags_list)\n```text\n【单样本】： lac_result = ([百度, 是, 一家, 高科技, 公司], [ORG, v, m, n, n])\n【批量样本】：lac_result = [\n                    ([百度, 是, 一家, 高科技, 公司], [ORG, v, m, n, n]),\n                    ([LAC, 是, 个, 优秀, 的, 分词, 工具], [nz, v, q, a, u, n, n])\n                ]\n```\n\n词性和专名类别标签集合如下表，其中我们将最常用的4个专名类别标记为大写的形式：\n\n| 标签 | 含义     | 标签 | 含义     | 标签 | 含义     | 标签 | 含义     |\n| ---- | -------- | ---- | -------- | ---- | -------- | ---- | -------- |\n| n    | 普通名词 | f    | 方位名词 | s    | 处所名词  | nw   | 作品名   |\n| nz   | 其他专名 | v    | 普通动词 | vd   | 动副词   | vn   | 名动词   |\n| a    | 形容词   | ad   | 副形词   | an   | 名形词   | d    | 副词     |\n| m    | 数量词   | q    | 量词     | r    | 代词     | p    | 介词     |\n| c    | 连词     | u    | 助词     | xc   | 其他虚词 | w    | 标点符号 |\n| PER  | 人名     | LOC  | 地名     | ORG  | 机构名   | TIME | 时间     |\n\n#### 词语重要性\n- 代码示例：\n```python\nfrom LAC import LAC\n\n# 装载词语重要性模型\nlac = LAC(mode='rank')\n\n# 单个样本输入，输入为Unicode编码的字符串\ntext = u\"LAC是个优秀的分词工具\"\nrank_result = lac.run(text)\n\n# 批量样本输入, 输入为多个句子组成的list，平均速率会更快\ntexts = [u\"LAC是个优秀的分词工具\", u\"百度是一家高科技公司\"]\nrank_result = lac.run(texts)\n```\n- 输出：\n\n```text\n【单样本】：rank_result = [['LAC', '是', '个', '优秀', '的', '分词', '工具'], \n                        [nz, v, q, a, u, n, n],[3, 0, 0, 2, 0, 3, 1]]\n【批量样本】：rank_result = [\n                    (['LAC', '是', '个', '优秀', '的', '分词', '工具'], \n                     [nz, v, q, a, u, n, n], [3, 0, 0, 2, 0, 3, 1]),  \n                    (['百度', '是', '一家', '高科技', '公司'], \n                     [ORG, v, m, n, n], [3, 0, 2, 3, 1])\n                ]\n```\n词语重要性各类别标签集合如下表，我们使用4-Level梯度进行分类：\n\n| 标签 | 含义       | 常见于词性|\n| ---- | --------  | ----   | \n| 0    | query中表述的冗余词   |  p, w, xc ...    | \n| 1    | query中限定较弱的词   |  r, c, u ...     | \n| 2    | query中强限定的词     |  n, s, v ...     | \n| 3    | query中的核心词       |  nz, nw, LOC ... | \n\n\n#### 定制化功能\n\n在模型输出的基础上，LAC还支持用户配置定制化的切分结果和专名类型输出。当模型预测匹配到词典的中的item时，会用定制化的结果替代原有结果。为了实现更加精确的匹配，我们支持以由多个单词组成的长片段作为一个item。\n\n我们通过装载词典文件的形式实现该功能，词典文件每行表示一个定制化的item，由一个单词或多个连续的单词组成，每个单词后使用'/'表示标签，如果没有'/'标签则会使用模型默认的标签。每个item单词数越多，干预效果会越精准。\n\n- 词典文件示例\n\n  > 这里仅作为示例，展现各种需求情况下的结果。后续还将开放以通配符配置词典的模式，敬请期待。\n```text\n春天/SEASON\n花/n 开/v\n秋天的风\n落 阳\n```\n- 代码示例\n```python\nfrom LAC import LAC\nlac = LAC()\n\n# 装载干预词典, sep参数表示词典文件采用的分隔符，为None时默认使用空格或制表符'\\t'\nlac.load_customization('custom.txt', sep=None)\n\n# 干预后结果\ncustom_result = lac.run(u\"春天的花开秋天的风以及冬天的落阳\")\n```\n\n- 以输入“春天的花开秋天的风以及冬天的落阳”为例，原本输出结果为：\n```text\n春天/TIME 的/u 花开/v 秋天/TIME 的/u 风/n 以及/c 冬天/TIME 的/u 落阳/n\n```\n- 添加示例中的词典文件后的结果为：\n\n```text\n春天/SEASON 的/u 花/n 开/v 秋天的风/n 以及/c 冬天/TIME 的/u 落/n 阳/n\n```\n\n#### 增量训练\n我们也提供了增量训练的接口，用户可以使用自己的数据，进行增量训练，首先需要将数据转换为模型输入的格式，并且所有数据文件均为\"UTF-8\"编码：\n\n##### 1. 分词训练\n\n- 数据样例\n\n  >  与大多数开源分词数据集格式一致，使用空格作为单词切分标记，如下所示：\n\n```text\nLAC 是 个 优秀 的 分词 工具 。\n百度 是 一家 高科技 公司 。\n春天 的 花开 秋天 的 风 以及 冬天 的 落阳 。\n```\n\n- 代码示例\n\n```Python\nfrom LAC import LAC\n\n# 选择使用分词模型\nlac = LAC(mode = 'seg')\n\n# 训练和测试数据集，格式一致\ntrain_file = \"./data/seg_train.tsv\"\ntest_file = \"./data/seg_test.tsv\"\nlac.train(model_save_dir='./my_seg_model/',train_data=train_file, test_data=test_file)\n\n# 使用自己训练好的模型\nmy_lac = LAC(model_path='my_seg_model')\n```\n\n##### 2. 词法分析训练\n\n- 样例数据\n\n  > 在分词数据的基础上，每个单词以“/type”的形式标记其词性或实体类别。值得注意的是，词法分析的训练目前仅支持标签体系与我们一致的数据。后续也会开放支持新的标签体系，敬请期待。\n\n```text\nLAC/nz 是/v 个/q 优秀/a 的/u 分词/n 工具/n 。/w\n百度/ORG 是/v 一家/m 高科技/n 公司/n 。/w\n春天/TIME 的/u 花开/v 秋天/TIME 的/u 风/n 以及/c 冬天/TIME 的/u 落阳/n 。/w\n```\n\n- 代码示例\n```Python\nfrom LAC import LAC\n\n# 选择使用默认的词法分析模型\nlac = LAC()\n\n# 训练和测试数据集，格式一致\ntrain_file = \"./data/lac_train.tsv\"\ntest_file = \"./data/lac_test.tsv\"\nlac.train(model_save_dir='./my_lac_model/',train_data=train_file, test_data=test_file)\n\n# 使用自己训练好的模型\nmy_lac = LAC(model_path='my_lac_model')\n```\n\n文件结构\n---\n\n```text\n.\n├── python                      # Python调用的脚本\n├── c++                         # C++调用的代码\n├── java                        # Java调用的代码\n├── Android                     # Android调用的示例\n├── README.md                   # 本文件\n└── CMakeList.txt               # 编译C++和Java调用的脚本\n```\n\n## 在论文中引用LAC\n\n如果您的学术工作成果中使用了LAC，请您增加下述引用。我们非常欣慰LAC能够对您的学术工作带来帮助。\n\n```text\n@article{jiao2018LAC,\n\ttitle={Chinese Lexical Analysis with Deep Bi-GRU-CRF Network},\n\tauthor={Jiao, Zhenyu and Sun, Shuqi and Sun, Ke},\n\tjournal={arXiv preprint arXiv:1807.01882},\n\tyear={2018},\n\turl={https://arxiv.org/abs/1807.01882}\n}\n```\n\n贡献代码\n---\n我们欢迎开发者向LAC贡献代码。如果您开发了新功能，发现了bug……欢迎提交Pull request与issue到Github。\n"
  },
  {
    "path": "c++/README.md",
    "content": "## LAC的C++调用\n\nC++ 的代码可用于预测使用，除了我们预先提供的模型以外，还可直接调用[Python](../README.md)代码增量训练后保存的模型\n\n### 代码示例\n\n```c\n#include <iostream>\n#include \"lac.h\"\n\n// 选择不同的模型进行装载\nlac = LAC(model_path = \"./lac_model\")\n// lac = LAC(model_path = \"./seg_model\")\n\n// 可选，装载干预词典\nlac.load_customization(\"custom.txt\")\n\n// 执行并返回结果\nauto lac_res = lac.run(\"百度是一家高科技公司\");\n\n// 打印结果\nfor (int i=0; i<lac_res.size(); i++)\n    std::cout<<lac_res[i].word<<\"\\001\"<<lac_res[i].tag<<\" \";\n```\n\n### 编译与运行\n\n<h4 id=\"依赖库准备\">1. 依赖库准备</h4>\n\nLAC是基于Paddle训练所得的模型，需依赖Paddle的预测库，可通过下载预编译好的库或进行源码编译两种形式获取\n\n##### 直接下载\n\n- **Windows**：可于[Paddle官网](https://www.paddlepaddle.org.cn)下载已经编译好的[Windows预测库](https://www.paddlepaddle.org.cn/documentation/docs/zh/advanced_guide/inference_deployment/inference/windows_cpp_inference.html)（`fluid_inference.tgz`），选择合适版本进行下载并解压\n\n- **Linux**：可于[Paddle官网](https://www.paddlepaddle.org.cn)下载已经编译好的[Linux预测库](https://www.paddlepaddle.org.cn/documentation/docs/zh/advanced_guide/inference_deployment/inference/build_and_install_lib_cn.html)（`fluid_inference.tgz`），选择合适版本进行下载并解压\n\n- **MacOS**: 可于[release界面](https://github.com/baidu/lac/releases/)下载已经编译好的Mac预测库（`paddle_library_mac.zip`），下载并解压\n\n  > 因官网未提供预编译好的MacOS预测库，为了方便开发者使用，我们自行编译并上传该库。如有需要亦可参考源码编译的内容进行自行编译。\n\n##### 源码编译\n\n对于**上述预编译库无法适配**的系统，可基于源码进行编译。\n\n下面提供了**编译预测库的脚本**，需要安装[cmake](https://cmake.org/download/)，并修改脚本中的`PADDLE_ROOT`变量为保存路径后可直接运行。如果有什么问题，可参照[Paddle官网](https://www.paddlepaddle.org.cn/documentation/docs/zh/advanced_guide/inference_deployment/inference/index_cn.html)中关于此部分内容的介绍。\n\n```sh\n# 下载源码\ngit clone https://github.com/PaddlePaddle/Paddle.git\n\n# 选择其中一个稳定的分支\ncd Paddle\ngit checkout v1.6.2\n\n# 创建并进入build目录\nmkdir build\ncd build\n\n# 编译结果保存路径，需要需改\nPADDLE_ROOT=/path/of/paddle\n\n# 编译运行\ncmake -DFLUID_INFERENCE_INSTALL_DIR=$PADDLE_ROOT \\\n      -DCMAKE_BUILD_TYPE=Release \\\n      -DWITH_PYTHON=OFF \\\n      -DWITH_MKL=OFF \\\n      -DWITH_GPU=OFF  \\\n      -DON_INFER=ON \\\n      ../\n      \n make\n make inference_lib_dist\n```\n\n#### 2. 运行测试\n> 此处介绍主要面向Mac和Linux用户，Windows系统下的编译依赖于[Visual Studio](https://visualstudio.microsoft.com/zh-hans/)【大于或等于2015版本】，可参考[Windows编译文档](../compile4windows.md)进行编译运行\n\n我们写了一个单线程调用示例lac_demo.cpp和多线程调用示例lac_multi.cpp，下面展示了编译和运行示例的方法\n\n##### 编译\n\n通过[cmake](https://cmake.org/download/)去完成编译，修改下列脚本中的`PADDLE_ROOT`变量为[1.依赖库准备](#依赖库准备)中得到的预测库文件夹的路径，然后直接执行该脚本即可\n\n```sh\n# 代码下载\ngit clone https://github.com/baidu/lac.git\ncd lac\n\n# /path/to/paddle是第1步中获取的Paddle依赖库路径\n# 即下载解压后的文件夹路径或编译产出的文件夹路径\nPADDLE_ROOT=/path/of/paddle\n\n# 编译\nmkdir build\ncd build\ncmake -DPADDLE_ROOT=$PADDLE_ROOT \\\n      -DWITH_DEMO=ON \\\n      -DWITH_JNILIB=OFF \\\n      ../\n\nmake install # 编译产出在 ../output 下\n```\n\n##### 运行\n\n- 下载模型文件：\n\n  在[release界面](https://github.com/baidu/lac/releases/)下载模型文件`models_general.zip`，解压文件夹中包含两个模型\n\n  - `seg_model`：仅实现分词的模型\n  - `lac_model`：实现分词、词性标注、实体识别于一体的词法分析模型\n\n- 执行demo程序：\n\n  - `output/bin/lac_demo`是一个单线程的demo程序，其源码请参考`c++/lac_demo.cpp`\n  - `output/bin/lac_multi`是一个多线程的demo程序，其源码请参考`c++/lac_multi.cpp`\n\n```sh\n# 运行测试\n./lac_demo <model_dir> \n./lac_multi <model_dir> <thread_num>\n# model_dir: 模型文件路径，即上述下载解压后的路径，如 \"./models_general/lac_model\"\n# thread_num: 线程数\n```\n\n程序从标准输入逐行读取句子，然后给出句子的分析结果。\n\n示例输入：\n`百度是一家高科技公司`\n\n示例输出：\n`百度/ORG 是/v 一家/m 高科技/n 公司/n`\n\n"
  },
  {
    "path": "c++/include/ahocorasick.h",
    "content": "/* Copyright (c) 2020 Baidu, Inc. All Rights Reserved.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License. */\n\n#ifndef BAIDU_LAC_AHOCORASICK_H\n#define BAIDU_LAC_AHOCORASICK_H\n\n#include<vector>\n#include<utility>\n#include<string>\n\n/* AC自动机树结点 */\nstruct Node{\n    std::vector<Node*> next;    \n    std::string key;            // 当前结点的字符\n    int value;                  // 结点对应的value，-1表示无\n    Node* fail;                 // ac自动机的fail指针\n\n    Node():value(-1),fail(NULL){}\n\n    /* 返回子结点中，字符为str的结点，找不到返回NULL */\n    Node* get_child(const std::string &str);\n\n    /* 添加字符为str的子结点并返回，若已存在则直接返回原子结点 */\n    Node* add_child(const std::string &str);\n};\n\n/* AC自动机 */\nclass AhoCorasick{\n    private:\n    Node * _root;\n\n    public:\n    AhoCorasick(){\n        _root = new Node();\n    }\n\n    ~AhoCorasick();\n    \n    /* 添加AC自动机item */\n    void insert(const std::vector<std::string> &chars, int value);\n\n    /* 生成AC自动机的fail指针 */\n    void make_fail();\n\n    /* 查询返回多模匹配结果 */\n    int search (const std::vector<std::string> &sentence, std::vector<std::pair<int, int>> &res, bool backtrack = false);\n};\n\n#endif  // BAIDU_LAC_AHOCORASICK_H"
  },
  {
    "path": "c++/include/lac.h",
    "content": "/* Copyright (c) 2020 Baidu, Inc. All Rights Reserved.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License. */\n\n#ifndef BAIDU_LAC_LAC_H\n#define BAIDU_LAC_LAC_H\n\n#include <unordered_map>\n#include <memory>\n#include <string>\n#include <vector>\n#include \"paddle_inference_api.h\"\n\n/* 编码设置 */\nenum CODE_TYPE\n{\n    CODE_GB18030 = 0,\n    CODE_UTF8 = 1,\n};\n\n/* 模型输出的结构 */\nstruct OutputItem\n{\n    std::string word;   // 分词结果\n    std::string tag;    // 单词类型\n};\n\n\n#ifndef LAC_CLASS\n#define LAC_CLASS\n\n// 前向声明, 去除头文件依赖\nclass Customization;\n\nclass LAC\n{\npublic:\n    /* 初始化：装载模型和词典 */\n    LAC(LAC &lac);      // \n    LAC(const std::string& model_path, CODE_TYPE type = CODE_UTF8);\n\n    /* 调用程序 */\n    std::vector<OutputItem> run(const std::string &query);                           // 单个query\n    std::vector<std::vector<OutputItem>> run(const std::vector<std::string> &query); // 批量query\n\n    /* 装载用户词典 */\n    int load_customization(const std::string& filename);\n\nprivate:\n    /* 将字符串输入转为Tensor */\n    int feed_data(const std::vector<std::string> &querys);\n\n    /* 将模型标签结果转换为模型输出格式 */\n    int parse_targets(\n        const std::vector<std::string> &tag_ids,\n        const std::vector<std::string> &words,\n        std::vector<OutputItem> &result);\n\n    // 编码类型，需要同时修改字典文件的编码\n    CODE_TYPE _codetype;\n\n    // 中间变量\n    std::vector<std::string> _seq_words;\n    std::vector<std::vector<std::string>> _seq_words_batch;\n    std::vector<std::vector<size_t>> _lod;\n    std::vector<std::string> _labels;\n    std::vector<OutputItem> _results;\n    std::vector<std::vector<OutputItem>> _results_batch;\n\n    // 数据转换词典\n    std::shared_ptr<std::unordered_map<int64_t, std::string>> _id2label_dict;\n    std::shared_ptr<std::unordered_map<std::string, std::string>> _q2b_dict;\n    std::shared_ptr<std::unordered_map<std::string, int64_t>> _word2id_dict;\n    int64_t _oov_id;\n\n    // paddle数据结构\n    paddle::PaddlePlace _place;                             //PaddlePlace::kGPU，KCPU\n    std::unique_ptr<paddle::PaddlePredictor> _predictor;    // 预测器\n    std::unique_ptr<paddle::ZeroCopyTensor> _input_tensor;  // 输入空间\n    std::unique_ptr<paddle::ZeroCopyTensor> _output_tensor; // 输出空间\n\n\n    // 人工干预词典\n    std::shared_ptr<Customization> custom;\n};\n#endif  // LAC_CLASS\n\n#endif  // BAIDU_LAC_LAC_H\n"
  },
  {
    "path": "c++/include/lac_custom.h",
    "content": "/* Copyright (c) 2020 Baidu, Inc. All Rights Reserved.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License. */\n\n#ifndef BAIDU_LAC_CUSTOM_H\n#define BAIDU_LAC_CUSTOM_H\n\n#include<vector>\n#include<string>\n#include <memory>\n\n#include \"lac_util.h\"\n#include \"ahocorasick.h\"\n\n/* 干预的item */\nstruct customization_term{\n    std::vector<std::string> tags;\n    std::vector<int> split;\n    customization_term(const std::vector<std::string>& tags, \n            const std::vector<int>& split):\n        tags(tags),\n        split(split){}\n};\n\n/* 干预使用的类 */\nclass Customization{\n    private:\n        // 记录每个item的标签和分词信息\n        std::vector<customization_term> _customization_dic;  \n\n        // AC自动机用于item的查询\n        AhoCorasick _ac_dict;\n\n    public:\n    Customization(const std::string &customization_dic_path){\n        load_dict(customization_dic_path);\n    }\n\n    /* 从用户词典中进行装载 */\n    RVAL load_dict(const std::string &customization_dic_path);\n\n    /* 对lac的预测结果进行干预 */\n    RVAL parse_customization(const std::vector<std::string> &seq_chars, std::vector<std::string> &tag_ids);\n};\n\n#endif  //BAIDU_LAC_CUSTOM_H\n"
  },
  {
    "path": "c++/include/lac_util.h",
    "content": "/* Copyright (c) 2020 Baidu, Inc. All Rights Reserved.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License. */\n\n#ifndef BAIDU_LAC_LAC_UTIL_H\n#define BAIDU_LAC_LAC_UTIL_H\n\n#include <vector>\n#include <string>\n#include <fstream>\n#include <unordered_map>\n\n#include \"lac.h\"\n/* 函数返回值 */\nenum RVAL\n{\n        _SUCCESS = 0,\n        _FAILD = -1,\n};\n\n/* 以pattern作为切割符，对line进行切分并放入tokens中 */\nRVAL split_tokens(const std::string &line, const std::string &pattern,\n                  std::vector<std::string> &tokens);\n\n/* 装载字符串输入转为数字的词典 */\nRVAL load_word2id_dict(const std::string &filepath,\n                       std::unordered_map<std::string, int64_t> &kv_dict);\n\n/* 装载字符正则化的词典 */\nRVAL load_q2b_dict(const std::string &filepath,\n                   std::unordered_map<std::string, std::string> &kv_dict);\n\n/* 装载label解码用的词典 */\nRVAL load_id2label_dict(const std::string &filepath,\n                        std::unordered_map<int64_t, std::string> &kv_dict);\n\n/* 获取下一个字的长度 */\nint get_next_gb18030(const char *str);\nint get_next_utf8(const char *str);\nint get_next_word(const char *str, CODE_TYPE codetype);\n\n/* 将字符串按照单字切分 */\nRVAL split_words(const char *input, int len, CODE_TYPE codetype, std::vector<std::string> &words);\nRVAL split_words(const std::string &input, CODE_TYPE codetype, std::vector<std::string> &words);\n\n#endif  // BAIDU_LAC_LAC_UTIL_H\n\n\n"
  },
  {
    "path": "c++/lac_demo.cpp",
    "content": "/* Copyright (c) 2020 Baidu, Inc. All Rights Reserved.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License. */\n\n#include <string>\n#include <iostream>\n#include \"lac.h\"\n\nusing namespace std;\n\nint main(int argc, char* argv[]){\n    // 读取命令行参数\n    string model_path = \"lac_model\";\n    string dict_path = \"\";\n    if (argc > 1){\n        model_path = argv[1];\n    }\n    if (argc > 2){\n        dict_path = argv[2];\n    }\n\n    // 装载模型和用户词典\n    LAC lac(model_path);\n    if (dict_path.length() > 1){\n        lac.load_customization(dict_path);\n    }\n\n    string query;\n    while (true)\n    {\n        if(!getline(cin, query)){\n            break;\n        }\n\n        // 执行与打印输出结果\n        auto result = lac.run(query);\n        for (size_t i = 0; i < result.size(); i ++){\n            if(result[i].tag.length() == 0){\n                cout << result[i].word << \" \";\n            }else{\n                cout << result[i].word << \"/\" << result[i].tag << \" \";\n            }\n        }\n        cout << endl;\n    }\n}\n"
  },
  {
    "path": "c++/lac_multi.cpp",
    "content": "/* Copyright (c) 2018 Baidu, Inc. All Rights Reserved.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License. */\n\n#include <vector>\n#include <string>\n#include <thread>\n#include <mutex>\n#include <iostream>\n\n#include \"lac.h\"\n\nusing namespace std;\n\nmutex g_cin_mutex;\nmutex g_cout_mutex;\n\n\n/* 线程函数 */\nvoid thread_worker(LAC& g_model) {\n    // Clone model\n    LAC lac(g_model);\n\n    string query;    \n    while (true) {\n        // 数据读取\n        g_cin_mutex.lock();\n        if (!getline(cin, query)) {\n            g_cin_mutex.unlock();\n            break;\n        }\n        g_cin_mutex.unlock();\n\n        auto result = lac.run(query);\n        \n        // 打印输出结果\n        g_cout_mutex.lock();\n        for (size_t i = 0; i < result.size(); i++){\n            if(result[i].tag.length() == 0){\n                cout << result[i].word <<\" \";\n            }\n            else{\n                cout << result[i].word << \"/\" << result[i].tag << \" \";\n            }\n        }\n        cout << endl;\n        g_cout_mutex.unlock();\n    }\n}\n\nint main(int argc, char* argv[]) {\n    if (argc < 3) {\n        cout << \"Usage: \" << argv[0]\n                  << \" + model_dir + thread_num\"\n                  << endl;\n        exit(-1);\n    }\n\n    // 默认路径\n    string model_path = argv[1];\n    int thread_num = atoi(argv[2]);\n\n    // 装载模型, 多线程共用\n    LAC g_model(model_path);\n    // 启动多线程\n    std::vector<std::thread> threads;\n    for (int i = 0; i < thread_num; i++) {\n        thread th(thread_worker, ref(g_model));\n        threads.push_back(move(th));\n    }\n\n    for (thread& th : threads) {\n        if (th.joinable()) {\n            th.join();\n        }\n    }\n\n    return 0;\n}\n"
  },
  {
    "path": "c++/src/ahocorasick.cpp",
    "content": "\n/* Copyright (c) 2020 Baidu, Inc. All Rights Reserved.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License. */\n\n#include<queue>\n\n#include \"ahocorasick.h\"\n\nNode* Node::get_child(const std::string &str){\n    for (auto i : next){\n        if (i->key == str){\n            return i;\n        }\n    }\n    return NULL;\n}\n\nNode* Node::add_child(const std::string &str){\n    for (auto i : next){\n        if (i->key == str){\n            return i;\n        }\n    }\n    Node* child = new Node();\n    child->key = str;\n    next.push_back(child);\n    return child;\n}\n\nAhoCorasick::~AhoCorasick(){\n    std::queue <Node*> que;\n    que.push(_root);\n\n    /* 广度遍历删除节点 */\n    while (!que.empty()){\n        Node* tmp = que.front();\n        que.pop();\n        for (auto child: tmp->next){\n            que.push(child);\n        }\n        delete tmp;\n    }\n}\n\n/* 添加AC自动机item */\nvoid AhoCorasick::insert(const std::vector<std::string> &chars, int value){\n    if (chars.size() == 0 || value < 0){\n        return;\n    }\n\n    Node* root = _root;\n    for (auto i : chars){\n        root = root->add_child(i);\n    }\n    root->value = value;\n}\n\n/* 生成AC自动机的fail指针 */\nvoid AhoCorasick::make_fail(){\n    \n    _root->fail = NULL;\n    std::queue <Node*> que;\n    for (auto child : _root->next ){\n        child->fail = _root;\n        que.push(child);\n    }\n\n    /* 以广度优先遍历设置fail指针 */\n    while (!que.empty()){\n        Node* current = que.front();\n        que.pop();\n        for (auto child : current->next){\n            Node* current_fail = current->fail;\n\n            // 若当前节点有fail指针，尝试设置其子结点的fail指针\n            while (current_fail){\n                if (current_fail->get_child(child->key)){\n                    child->fail = current_fail->get_child(child->key);\n                    break;\n                }\n                current_fail = current_fail->fail;\n            }\n\n            // 若当前节点的fail指针不存在子结点，令子结点fail指向根节点\n            if (current_fail == NULL){\n                child->fail = _root;\n            }\n\n            que.push(child);\n        }\n    }\n}\n\n\n/* 查询返回多模匹配结果 */\nint AhoCorasick::search(const std::vector<std::string> &sentence, std::vector<std::pair<int, int>> &res, bool backtrack){\n    // std::vector<std::pair<int, int> > res;\n    Node *child = NULL, *p = _root;\n    for (size_t i=0; i< sentence.size(); i++){\n        child = p->get_child(sentence[i]);\n        while (child == NULL){\n            if (p == _root){\n                break;\n            }\n            p = p->fail;\n            child = p->get_child(sentence[i]);\n        }\n        \n        if (child){\n            p = child;\n\n            while (child != _root){\n                // 命中单词\n                if (child->value >= 0){\n                    res.push_back(std::make_pair(i, child->value));\n                }\n\n                // 不回溯，用于最大长度匹配\n                if (!backtrack){\n                    break;\n                }\n\n                child = child->fail;\n            }\n        }\n    }\n    return 0;\n}\n"
  },
  {
    "path": "c++/src/lac.cpp",
    "content": "/* Copyright (c) 2020 Baidu, Inc. All Rights Reserved.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License. */\n\n#include \"lac.h\"\n#include \"lac_util.h\"\n#include \"lac_custom.h\"\n#include \"paddle_api.h\"\n\n/* LAC构造函数：初始化、装载模型和词典 */\nLAC::LAC(const std::string& model_path, CODE_TYPE type)\n    : _codetype(type),\n      _lod(std::vector<std::vector<size_t> >(1)),\n      _id2label_dict(new std::unordered_map<int64_t, std::string>),\n      _q2b_dict(new std::unordered_map<std::string, std::string>),\n      _word2id_dict(new std::unordered_map<std::string, int64_t>),\n      custom(NULL)\n{\n\n    // 装载词典\n    std::string word_dict_path = model_path + \"/conf/word.dic\";\n    load_word2id_dict(word_dict_path, *_word2id_dict);\n    std::string q2b_dict_path = model_path + \"/conf/q2b.dic\";\n    load_q2b_dict(q2b_dict_path, *_q2b_dict);\n    std::string label_dict_path = model_path + \"/conf/tag.dic\";\n    load_id2label_dict(label_dict_path, *_id2label_dict);\n\n    // 使用AnalysisConfig装载模型，会进一步优化模型\n    this->_place = paddle::PaddlePlace::kCPU;\n    paddle::AnalysisConfig config;\n    // config.SwitchIrOptim(false);       // 关闭优化\n    config.EnableMKLDNN();\n    config.DisableGpu();\n    config.DisableGlogInfo();\n    config.SetModel(model_path + \"/model\");\n    config.SetCpuMathLibraryNumThreads(1);\n    config.SwitchUseFeedFetchOps(false);\n    this->_predictor = paddle::CreatePaddlePredictor<paddle::AnalysisConfig>(config);\n\n    // 初始化输入输出变量\n    auto input_names = this->_predictor->GetInputNames();\n    this->_input_tensor = this->_predictor->GetInputTensor(input_names[0]);\n    auto output_names = this->_predictor->GetOutputNames();\n    this->_output_tensor = this->_predictor->GetOutputTensor(output_names[0]);\n    this->_oov_id = this->_word2id_dict->size() - 1;\n    auto word_iter = this->_word2id_dict->find(\"OOV\");\n    if (word_iter != this->_word2id_dict->end())\n    {\n        this->_oov_id = word_iter->second;\n    }\n}\n\n/* 拷贝构造函数，用于多线程重载 */\nLAC::LAC(LAC &lac)\n    : _codetype(lac._codetype),\n      _lod(std::vector<std::vector<size_t> >(1)),\n      _id2label_dict(lac._id2label_dict),\n      _q2b_dict(lac._q2b_dict),\n      _word2id_dict(lac._word2id_dict),\n      _oov_id(lac._oov_id),\n      _place(lac._place),\n      _predictor(lac._predictor->Clone()),\n      custom(lac.custom)\n{\n    auto input_names = this->_predictor->GetInputNames();\n    this->_input_tensor = this->_predictor->GetInputTensor(input_names[0]);\n    auto output_names = this->_predictor->GetOutputNames();\n    this->_output_tensor = this->_predictor->GetOutputTensor(output_names[0]);\n}\n\n/* 装载用户词典 */\nint LAC::load_customization(const std::string& filename){\n    /* 多线程热加载时容易出问题，多个线程共享custom\n    if (custom){\n        return custom->load_dict(filename);\n    }\n    */\n    custom = std::make_shared<Customization>(filename);\n    return 0;\n}\n\n/* 将字符串输入转为Tensor */\nint LAC::feed_data(const std::vector<std::string> &querys)\n{\n    this->_seq_words_batch.clear();\n    this->_lod[0].clear();\n\n    this->_lod[0].push_back(0);\n    int shape = 0;\n    for (size_t i = 0; i < querys.size(); ++i)\n    {\n        split_words(querys[i], this->_codetype, this->_seq_words);\n        this->_seq_words_batch.push_back(this->_seq_words);\n        shape += this->_seq_words.size();\n        this->_lod[0].push_back(shape);\n    }\n    this->_input_tensor->SetLoD(this->_lod);\n    this->_input_tensor->Reshape({shape, 1});\n\n    int64_t *input_d = this->_input_tensor->mutable_data<int64_t>(this->_place);\n    int index = 0;\n    for (size_t i = 0; i < this->_seq_words_batch.size(); ++i)\n    {\n        for (size_t j = 0; j < this->_seq_words_batch[i].size(); ++j)\n        {\n            // normalization\n            std::string word = this->_seq_words_batch[i][j];\n            auto q2b_iter = this->_q2b_dict->find(word);\n            if (q2b_iter != this->_q2b_dict->end())\n            {\n                word = q2b_iter->second;\n            }\n\n            // get word_id\n            int64_t word_id = this->_oov_id;\n            auto word_iter = this->_word2id_dict->find(word);\n            if (word_iter != this->_word2id_dict->end())\n            {\n                word_id = word_iter->second;\n            }\n            input_d[index++] = word_id;\n        }\n    }\n    return 0;\n}\n\n/* 对输出的标签进行解码转换为模型输出格式 */\nint LAC::parse_targets(\n    const std::vector<std::string> &tags,\n    const std::vector<std::string> &words,\n    std::vector<OutputItem> &result)\n{\n    result.clear();\n    for (size_t i = 0; i < tags.size(); ++i)\n    {\n        // 若新词，则push_back一个新词，否则append到上一个词中\n        if (result.empty() || tags[i].rfind(\"B\") == tags[i].length() - 1 || tags[i].rfind(\"S\") == tags[i].length() - 1)\n        {\n            OutputItem output_item;\n            output_item.word = words[i];\n            output_item.tag = tags[i].substr(0, tags[i].length() - 2);\n            result.push_back(output_item);\n        }\n        else\n        {\n            result[result.size() - 1].word += words[i];\n        }\n    }\n    return 0;\n}\n\nstd::vector<OutputItem> LAC::run(const std::string &query)\n{\n    std::vector<std::string> query_vector = std::vector<std::string>({query});\n    auto result = run(query_vector);\n    return result[0];\n}\n\nstd::vector<std::vector<OutputItem>> LAC::run(const std::vector<std::string> &querys)\n{\n\n    this->feed_data(querys);\n    this->_predictor->ZeroCopyRun();\n\n    // 对模型输出进行解码\n    int output_size = 0;\n    int64_t *output_d = this->_output_tensor->data<int64_t>(&(this->_place), &output_size);\n    this->_labels.clear();\n    this->_results_batch.clear();\n    for (size_t i = 0; i < this->_lod[0].size() - 1; ++i)\n    {\n        for (size_t j = 0; j < _lod[0][i + 1] - _lod[0][i]; ++j)\n        {\n\n            int64_t cur_label_id = output_d[_lod[0][i] + j];\n            auto it = this->_id2label_dict->find(cur_label_id);\n            this->_labels.push_back(it->second);\n        }\n\n        // 装载了用户干预词典，先进行干预处理\n        if (custom){\n            custom->parse_customization(this->_seq_words_batch[i], this->_labels);\n        }\n\n        parse_targets(this->_labels, this->_seq_words_batch[i], this->_results);\n        this->_labels.clear();\n        this->_results_batch.push_back(this->_results);\n    }\n\n    return this->_results_batch;\n}\n"
  },
  {
    "path": "c++/src/lac_custom.cpp",
    "content": "/* Copyright (c) 2020 Baidu, Inc. All Rights Reserved.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License. */\n\n#include<iostream>\n#include \"lac_custom.h\"\n\n/* 从用户词典中进行装载 */\nRVAL Customization::load_dict(const std::string &customization_dic_path){\n    std::ifstream fin;\n    fin.open(customization_dic_path.c_str());\n    if (!fin) {\n        std::cerr << \"Load customization dic failed ! -- \" << customization_dic_path\n                << \" not exist\" << std::endl;\n        return _FAILD;\n    }\n\n    std::string line;\n    \n    // 中文字符处理临时变量\n    std::vector<std::string> line_vector;\n    \n    while (getline(fin, line))\n    {\n        if (line.length() < 1){\n                continue;\n        }\n        if (split_tokens(line, \" \", line_vector) < _SUCCESS) {\n            std::cerr << \"Load customization dic failed ! -- format error \"\n                    << line << std::endl;\n            return _FAILD;\n        }\n        \n        // 读取用户字典文件并存入相应数据结构\n        std::vector<std::string> chars;\n        std::vector<std::string> phrase;\n        std::vector<std::string> tags;\n        std::vector<int> split;\n        int length = 0;\n        for (auto kv : line_vector){\n            if (kv.length() < 1){\n                continue;\n            }\n            // 将中文字符串拆分为字\n            std::string word = kv.substr(0, kv.rfind(\"/\"));\n            if (kv.length()>1){\n                split_words(word, CODE_UTF8, chars);\n            }else{\n                split_words(kv, CODE_UTF8, chars);\n            }\n            \n            phrase.insert(phrase.end(), chars.begin(), chars.end());\n            length += chars.size();\n            std::string tag = (word.length() < kv.size()) ? kv.substr(kv.rfind(\"/\") + 1) : \"\";\n            tags.push_back(tag);\n            split.push_back(length);\n        }\n        int value = _customization_dic.size();\n        _customization_dic.push_back(customization_term(tags, split));\n        _ac_dict.insert(phrase, value);\n    }\n    _ac_dict.make_fail();\n\n    fin.close();\n    \n    std::cerr << \"Loaded customization dic -- num = \" << _customization_dic.size()\n            << std::endl;\n    return _SUCCESS;\n}\n\n/* 对lac的预测结果进行干预 */\nRVAL Customization::parse_customization(const std::vector<std::string> &seq_chars, std::vector<std::string> &tag_ids){\n    // AC自动机查询返回结果\n    std::vector<std::pair<int, int>> ac_res;\n    _ac_dict.search(seq_chars, ac_res);\n    \n    int pre_begin = -1, pre_end = -1;\n    for (auto ac_pair : ac_res){\n        int value = ac_pair.second;\n        int length = _customization_dic[value].split.back();\n        int begin = ac_pair.first - length + 1;\n\n        // 对查询结果进行预处理\n        if (pre_begin < begin && pre_end >= begin){\n            continue;\n        }\n        pre_begin = begin;\n        pre_end = ac_pair.first;\n\n        // 修正标注中的标签\n        for (size_t i=0; i<_customization_dic[value].split.size(); i++){\n            std::string tag = _customization_dic[value].tags[i];\n            for (int j=0; j<_customization_dic[value].split[i]; j++){\n                if (tag.length() < 1){\n                    tag_ids[begin][tag_ids[begin].length()-1] = 'I';\n                }\n                else{\n                    tag_ids[begin] = tag + \"-I\";\n                }\n                begin ++;\n            }\n        }\n\n        // 修正标注中的分词\n        begin = ac_pair.first - length + 1;\n        tag_ids[begin][tag_ids[begin].length()-1] = 'B';\n        for (size_t i=0; i<_customization_dic[value].split.size(); i++){\n            size_t ind = begin+_customization_dic[value].split[i];\n            if (ind < tag_ids.size()){\n                tag_ids[ind][tag_ids[ind].length()-1] = 'B';\n            }\n        }\n    }\n    return _SUCCESS;\n}\n"
  },
  {
    "path": "c++/src/lac_util.cpp",
    "content": "/* Copyright (c) 2020 Baidu, Inc. All Rights Reserved.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License. */\n\n#include \"lac_util.h\"\n\n/* 以pattern作为切割符，对line进行切分并放入tokens中 */\nRVAL split_tokens(const std::string &line, const std::string &pattern,\n                  std::vector<std::string> &tokens)\n{\n    if (\"\" == line || \"\" == pattern)\n    {\n        return _FAILD;\n    }\n\n    tokens.clear();\n    int pos = 0;\n    int size = line.size();\n\n    for (int i = 0; i < size; i++)\n    {\n        pos = line.find(pattern, i);\n\n        if (-1 != pos)\n        {\n            tokens.push_back(line.substr(i, pos - i));\n            i = pos + pattern.size() - 1;\n        }\n        else\n        {\n            tokens.push_back(line.substr(i));\n            break;\n        }\n    } // end of for\n    return _SUCCESS;\n}\n\n/* 装载字符转为数字index的词典 */\nRVAL load_word2id_dict(const std::string &filepath,\n                       std::unordered_map<std::string, int64_t> &kv_dict)\n{\n    kv_dict.clear();\n    std::ifstream infile(filepath);\n    if (infile.fail())\n    {\n        return _FAILD;\n    }\n\n    std::string line = \"\";\n    std::vector<std::string> tokens;\n    while (std::getline(infile, line) && infile.good())\n    {\n        split_tokens(line, \"\\t\", tokens);\n        if (\"\" == line || 2 != tokens.size())\n        {\n            continue;\n        }\n        int64_t val = std::stoll(tokens[0]);\n        std::string key = tokens[1];\n        kv_dict[key] = val;\n    }\n    infile.close();\n    return _SUCCESS;\n}\n\n/* 装载字符正则化的词典 */\nRVAL load_q2b_dict(const std::string &filepath,\n                   std::unordered_map<std::string, std::string> &kv_dict)\n{\n    kv_dict.clear();\n    std::ifstream infile(filepath);\n    if (infile.fail())\n    {\n        return _FAILD;\n    }\n\n    std::string line = \"\";\n    std::vector<std::string> tokens;\n    while (std::getline(infile, line) && infile.good())\n    {\n        split_tokens(line, \"\\t\", tokens);\n        if (\"\" == line || 2 != tokens.size())\n        {\n            continue;\n        }\n        kv_dict[tokens[0]] = tokens[1];\n    }\n    infile.close();\n    return _SUCCESS;\n}\n\n/* 装载label解码用的词典 */\nRVAL load_id2label_dict(const std::string &filepath,\n                        std::unordered_map<int64_t, std::string> &kv_dict)\n{\n    kv_dict.clear();\n    std::ifstream infile(filepath);\n    if (infile.fail())\n    {\n        return _FAILD;\n    }\n\n    std::string line = \"\";\n    std::vector<std::string> tokens;\n    while (std::getline(infile, line) && infile.good())\n    {\n        split_tokens(line, \"\\t\", tokens);\n        if (\"\" == line || 2 != tokens.size())\n        {\n            continue;\n        }\n        int64_t key = std::stoll(tokens[0]);\n        std::string val = tokens[1];\n        kv_dict[key] = val;\n    }\n    infile.close();\n    return _SUCCESS;\n}\n\n/* 获取下一个gb18030字符的长度 */\nint get_next_gb18030(const char *str)\n{\n    unsigned char *str_in = (unsigned char *)str;\n    if (str_in[0] < 0x80)\n    {\n        return 1;\n    }\n    if (str_in[0] >= 0x81 && str_in[0] <= 0xfe &&\n        str_in[1] >= 0x40 && str_in[1] <= 0xFE && str_in[1] != 0x7F)\n    {\n        return 2;\n    }\n    if (str_in[0] >= 0x81 && str_in[0] <= 0xfe &&\n        str_in[1] >= 0x30 && str_in[1] <= 0x39 &&\n        str_in[2] >= 0x81 && str_in[2] <= 0xfe &&\n        str_in[3] >= 0x30 && str_in[3] <= 0x39)\n    {\n        return 4;\n    }\n    return 0;\n}\n\n/* 获取下一个UTF8字符的长度 */\nint get_next_utf8(const char *str)\n{\n    unsigned char *str_in = (unsigned char *)str;\n    if (str_in[0] < 0x80)\n    {\n        return 1;\n    }\n    if (str_in[0] >= 0xC2 && str_in[0] < 0xE0 &&\n        str_in[1] >> 6 == 2)\n    {\n        return 2;\n    }\n    if (str_in[0] >> 4 == 14 && str_in[1] >> 6 == 2 &&\n        str_in[2] >> 6 == 2 && (str_in[0] > 0xE0 || str_in[1] >= 0xA0))\n    {\n        return 3;\n    }\n    if (str_in[0] >> 3 == 30 && str_in[1] >> 6 == 2 && str_in[2] >> 6 == 2 &&\n        str_in[3] >> 6 == 2 && str_in[0] <= 0xF4 && (str_in[0] > 0xF0 || str_in[1] >= 0x90))\n    {\n        return 4;\n    }\n    return 0;\n}\n\n/* 获取下一个codetype字符的长度 */\nint get_next_word(const char *str, CODE_TYPE codetype)\n{\n    int len = 0;\n    switch (codetype)\n    {\n    case CODE_GB18030:\n        len = get_next_gb18030(str);\n        break;\n    case CODE_UTF8:\n        len = get_next_utf8(str);\n        break;\n    default:\n        len = 0;\n        break;\n    }\n    len = len == 0 ? 1 : len;\n    return len;\n}\n\n/* 将字符串按照中文字符的单字切分 */\nRVAL split_words(const char *input, int len, CODE_TYPE codetype, std::vector<std::string> &words)\n{\n    words.clear();\n    char *p = (char *)input;\n    int temp_len = 0;\n    std::string key;\n    for (int i = 0; i < len; i += temp_len)\n    {\n        temp_len = get_next_word(p, codetype);\n        key.assign(p, temp_len);\n        words.push_back(key);\n        p += temp_len;\n    }\n    return _SUCCESS;\n}\n\n/* 将字符串按照中文字符的单字切分 */\nRVAL split_words(const std::string &input, CODE_TYPE codetype, std::vector<std::string> &words)\n{\n    const char *p = input.c_str();\n    int len = input.length();\n    return split_words(p, len, codetype, words);\n}\n"
  },
  {
    "path": "compile4windows.md",
    "content": "## 在Windows系统编译LAC\n\n本文档详细介绍如何在Windows上使用Visual Studio和Visual Studio Code 完成LAC的C++ demo 及 Java链接库编译的过程。\n\n### 1. 环境准备\n\n##### 1. 安装 Visual Studio和Visual Studio Code \n\n- 官网下载地址：[https://visualstudio.microsoft.com/zh-hans/](https://visualstudio.microsoft.com/zh-hans/)\n-  Visual Studio安装可参考：[VS安装文档](https://docs.microsoft.com/zh-cn/visualstudio/install/install-visual-studio?view=vs-2019)，工作负载中勾选`C++桌面开发`的选项\n\n##### 2. 下载Paddle相关的依赖库\n\n- 可于[Paddle官网](https://www.paddlepaddle.org.cn)下载已经编译好的[Windows预测库](https://www.paddlepaddle.org.cn/documentation/docs/zh/advanced_guide/inference_deployment/inference/windows_cpp_inference.html)（`fluid_inference.tgz`），选择`cpu_avx_mkl`或`cpu_avx_openblas`版本进行下载并解压\n\n### 2. 编译运行\n\n编译过程使用`Visual Studio Code`进行，该工具能够帮助我们完成cmake编译等过程，并且在众多系统中表现出较好的兼容性，该流程同样适用于Mac和Linux系统。\n\n##### 1. 在VS Code中安装Cmake相关插件\n\n<img src=\"./image/cmake_install.png\" alt=\"cmake_install\" style=\"zoom:80%;\" />\n\n##### 2. 打开GitHub中clone下来的文件夹\n\n<img src=\"./image/open_lac.png\" alt=\"open_lac\" style=\"zoom:80%;\" />\n\n##### 3. 设置编译选项\n\n- 设置`PADDLE_ROOT`为[Windows预测库](https://www.paddlepaddle.org.cn/documentation/docs/zh/advanced_guide/inference_deployment/inference/windows_cpp_inference.html)下载解压后的文件夹路径\n- 若需编译**JAVA的链接库**，需将`WITH_JNILIB`选项设为`ON`，同时设置`JAVA_HOME`路径，如下图所示\n- CMake选择Release模式\n- 编译器选项选择Visual Studio amd64【若无该选项则选择`扫描工具包`或检查`Visual Studio`安装情况】\n\n<img src=\"./image/modify_cmakelists.png\" alt=\"open_lac\" style=\"zoom:80%;\" />\n\n##### 4. 执行编译\n\n- 完成上述步骤后，如果lac目录下已生产build目录，先删除该build目录，否则option中的选项不会更新\n\n- 打开CMakeLists.txt，执行保存，会触发CMake构建命令，生产build目录。\n\n- CMake构建完成后运行`生成`，既可触发编译\n\n  <img src=\"./image/run_cmake.png\" alt=\"run_cmake\" style=\"zoom:80%;\" />\n\n##### 5. 运行示例\n\n- 编译完成后，会在build/Release 生成相应的文件产出：\n\n  - `lac_demo.exe`和`lac_multi.exe`：lac的单线程和多线程执行程序，从命令行中读取**UTF8**编码的输入，执行预测\n  - `lacjni.dll`：JAVA调用lac使用的动态库\n  - `*.dll`：运行lac所依赖的算法库，MKLNN库(mklnn.dll、mklml.dll、libiomp5md.dll)或OPENBLAS库（openblas.dll）\n\n- 下载模型文件：\n\n  在[release界面](https://github.com/baidu/lac/releases/)下载模型文件`models_general.zip`，解压文件夹中包含两个模型\n\n  - `seg_model`：仅实现分词的模型\n  - `lac_model`：实现分词、词性标注、实体识别于一体的词法分析模型\n\n-  `lac_demo.exe`和`lac_multi.exe`运行测试\n\n  - 修改CMD编码为**utf8**\n  - 在命令行中运行以下指令\n\n  ```sh\n  # 运行测试\n  ./lac_demo.exe <model_dir> \n  ./lac_multi.exe <model_dir> <thread_num>\n  # model_dir: 模型文件路径，即上述下载解压后的路径，如 \"./models_general/lac_model\"\n  # thread_num: 线程数\n  ```\n\n- JAVA调用运行测试\n\n  - 将`lacjni.dll`和依赖的算法库拷贝到`lac/java`目录下\n\n  - 在命令行工具中运行测试如下所示\n\n    <img src=\"./image/run_lacjava.png\" alt=\"run_lacjava\" style=\"zoom:70%;\" />\n\n"
  },
  {
    "path": "java/LacDemo.java",
    "content": "import java.util.ArrayList;\nimport java.io.InputStreamReader;\nimport java.io.BufferedReader;\n\nimport com.baidu.nlp.LAC;\n\npublic class LacDemo {\n\n    static {\n        // 装载LAC链接库，需要lacjni的链接库文件放到当前目录下\n        // System.setProperty(\"java.library.path\", \".\");\n        System.loadLibrary(\"lacjni\");\n    }\n\n    public static void main(String[] args) {\n\n        // 默认模型路径\n        String model_path = new String(\"./lac_model\");\n        \n        if (args.length > 0) {\n            model_path = args[0];\n        }\n\n        LAC lac = new LAC(model_path);\n\n        // 装载用户词典\n        if (args.length > 1) {\n            lac.loadCustomization(args[1]);\n        }\n\n        ArrayList<String> words = new ArrayList<>();\n        ArrayList<String> tags = new ArrayList<>();\n        BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in));\n        String query = null;\n        \n        try {\n            while ((query = stdin.readLine()) != null) {\n                lac.run(query, words, tags);\n                System.out.println(words);\n                System.out.println(tags);\n            }\n        } catch (Exception e) {\n            System.out.println(e.getMessage());\n        }\n    }\n}\n"
  },
  {
    "path": "java/LacMulti.java",
    "content": "import java.util.ArrayList;\nimport java.io.InputStreamReader;\nimport java.io.BufferedReader;\nimport java.util.concurrent.locks.Lock;\nimport java.util.concurrent.locks.ReentrantLock;\n\nimport com.baidu.nlp.LAC;\n\npublic class LacMulti {\n    static {\n        // 装载LAC链接库，需要lacjni的链接库文件放到当前目录下\n        // System.setProperty(\"java.library.path\", \".\");\n        System.loadLibrary(\"lacjni\");\n    }\n\n    public static void main(String[] args) {\n\n        // 默认模型路径\n        String model_path = new String(\"./lac_model\");\n        if (args.length < 2){\n            System.out.println(\"Usage: \"+argv[0]+ \" + model_dir + thread_num\");\n            System.exit(1);\n        }\n \n        model_path = args[0];\n        int thread_num = Integer.parseInt(args[1]);\n\n        LAC lac = new LAC(model_path);\n        LacRunnable lacrunner = new LacRunnable(lac);\n\n        Thread threads[]=new Thread[thread_num];\n        for (int i = 0; i< thread_num; i++){\n            threads[i] = new Thread(lacrunner);\n            threads[i].start();\n        }\n    }\n    \n}\n\nclass LacRunnable implements Runnable{\n\n    \n    public LacRunnable(LAC lac){\n        g_lac = lac;\n    }\n\n    // share model and lock\n    private LAC g_lac;\n    private Lock printLock = new ReentrantLock();\n    private Lock readLock = new ReentrantLock();\n\n    public void run() {\n        ArrayList<String> words = new ArrayList<>();\n        ArrayList<String> tags = new ArrayList<>();\n        BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in));\n        String query = null;\n        \n        try {\n            LAC thread_lac = new LAC(g_lac);\n            while (true) {\n                readLock.lock();\n                if ((query = stdin.readLine()) == null){\n                    readLock.unlock();\n                    break;\n                }\n                readLock.unlock();\n                thread_lac.run(query, words, tags);\n \n                printLock.lock();\n                System.out.println(words);\n                System.out.println(tags);\n                printLock.unlock();\n            }\n        } catch (Exception e) {\n            System.out.println(e.getMessage());\n        }\n    }\n}"
  },
  {
    "path": "java/README.md",
    "content": "## LAC的Java调用\n\nJAVA的接口是通过jni的形式调用[C++的接口](../c++/README.md)，除了我们预先提供的模型之外，还可直接调用[Python](../README.md)进行增量训练后保存的模型。因为使用的是[C++的接口](../c++/README.md)的jni调用，故而在使用前需要准备Paddle依赖库，并产出lacjni的动态库\n\n#### 代码示例\n\n```java\n// 选择不同的模型进行装载\nLAC lac = new LAC(\"lac_model\");\n\n// 可选，装载干预词典\nlac.loadCustomization(\"custom.txt\")\n\n// 声明返回结果的变量\nArrayList<String> words = new ArrayList<>();\nArrayList<String> tags = new ArrayList<>();\n\n// 执行并返回结果\nlac.run(\"百度是一家高科技公司\", words, tags);\nSystem.out.println(words);\nSystem.out.println(tags);\n```\n\n### 编译与运行\n\n<h4 id=\"依赖库准备\">1. 依赖库准备</h4>\n\nLAC是基于Paddle训练所得的模型，需依赖Paddle的预测库，可通过下载预编译好的库或进行源码编译两种形式获取\n\n##### 直接下载\n\n- **Windows**：可于[Paddle官网](https://www.paddlepaddle.org.cn)下载已经编译好的[Windows预测库](https://www.paddlepaddle.org.cn/documentation/docs/zh/advanced_guide/inference_deployment/inference/windows_cpp_inference.html)（`fluid_inference.tgz`），选择合适版本进行下载并解压\n\n- **Linux**：可于[Paddle官网](https://www.paddlepaddle.org.cn)下载已经编译好的[Linux预测库](https://www.paddlepaddle.org.cn/documentation/docs/zh/advanced_guide/inference_deployment/inference/build_and_install_lib_cn.html)（`fluid_inference.tgz`），选择合适版本进行下载并解压\n\n- **MacOS**: 可于[release界面](https://github.com/baidu/lac/releases/)下载已经编译好的Mac预测库（`paddle_library_mac.zip`），下载并解压\n\n  > 因官网未提供预编译好的MacOS预测库，为了方便开发者使用，我们自行编译并上传该库。如有需要亦可参考源码编译的内容进行自行编译。\n\n##### 源码编译\n\n对于**上述预编译库无法适配**的系统，可基于源码进行编译。\n\n下面提供了**编译预测库的脚本**，需要安装[cmake](https://cmake.org/download/)，并修改脚本中的`PADDLE_ROOT`变量为保存路径后可直接运行。如果有什么问题，可参照[Paddle官网](https://www.paddlepaddle.org.cn/documentation/docs/zh/advanced_guide/inference_deployment/inference/index_cn.html)中关于此部分内容的介绍。\n\n```sh\n# 下载源码\ngit clone https://github.com/PaddlePaddle/Paddle.git\n\n# 选择其中一个稳定的分支\ncd Paddle\ngit checkout v1.6.2\n\n# 创建并进入build目录\nmkdir build\ncd build\n\n# 编译结果保存路径，需要需改\nPADDLE_ROOT=/path/of/paddle\n\n# 编译运行\ncmake -DFLUID_INFERENCE_INSTALL_DIR=$PADDLE_ROOT \\\n      -DCMAKE_BUILD_TYPE=Release \\\n      -DWITH_PYTHON=OFF \\\n      -DWITH_MKL=OFF \\\n      -DWITH_GPU=OFF  \\\n      -DON_INFER=ON \\\n      ../\n      \n make\n make inference_lib_dist\n```\n\n#### 2. jni编译，生成Java调用包\n\n> 此处介绍主要面向Mac和Linux用户，Windows系统下的编译依赖于[Visual Studio](https://visualstudio.microsoft.com/zh-hans/)【大于或等于2015版本】，可参考[Windows编译文档](../compile4windows.md)进行编译，我们也在[release](https://github.com/baidu/lac/releases/)中提供了一个基于mkldnn编译好的库`lac4javawin.zip`，以便大家使用。\n\n我们编写了jni调用c++库的接口，需要先编译生成Java可直接调用的包，通过[cmake](https://cmake.org/download/)去完成该过程。安装[cmake](https://cmake.org/download/)后，修改下列脚本中`PADDLE_ROOT`变量和`JAVA_HMOE`变量后，直接运行即可完成该过程：\n\n- `PADDLE_ROOT`为[1.依赖库准备](#依赖库准备)中得到的依赖库文件夹的路径\n- `JAVA_HMOE`为JAVA安装所在路径，该目录中应有`include/jni.h`文件\n\n```sh\n# 代码下载\ngit clone https://github.com/baidu/lac.git\ncd lac\n\n# /path/to/paddle是第1步中获取的Paddle依赖库路径\n# 即下载解压后的文件夹路径或编译产出的文件夹路径\nPADDLE_ROOT=/path/of/paddle\n\n# JAVA的HOME目录，应存在文件${JAVA_HOME}/include/jni.h\nJAVA_HOME=/path/of/java\n\n# 编译\nmkdir build \ncd build\ncmake -DPADDLE_ROOT=$PADDLE_ROOT \\\n      -DJAVA_HOME=$JAVA_HOME \\\n      -DWITH_JNILIB=ON \\\n      -DWITH_DEMO=OFF \\\n      ../\n\nmake install # 编译产出在 ../output/java 下\n```\n\n#### 3. 运行测试\n\n执行完上述编译后，我们可以在`output/java`目录下查看到`com.baidu.nlp`的Java库以及单线程调用示例LacDemo.java及多线程调用示例LacMulti.java，我们可以直接运行这两个示例进行调用测试\n\n- 下载模型文件：\n\n  在[release界面](https://github.com/baidu/lac/releases/)下载模型文件`models_general.zip`，解压文件夹中包含两个模型\n\n  - `seg_model`：仅实现分词的模型\n  - `lac_model`：实现分词、词性标注、实体识别于一体的词法分析模型\n\n- 运行Java的demo：\n\n```sh\n# 运行单线程测试\njavac LacDemo.java\njava LacDemo <model_dir>\n\n# 运行多线程测试\njavac LacMulti.java\njava LacMulti <model_dir> <thread_num>\n# model_dir: 模型文件路径，即上述下载解压后的路径，如 \"./models_general/lac_model\"\n```\n\n程序从标准输入逐行读取句子，然后给出句子的分析结果。\n\n示例输入：\n`百度是一家高科技公司`\n\n示例输出：\n`百度/ORG 是/v 一家/m 高科技/n 公司/n`\n"
  },
  {
    "path": "java/com/baidu/nlp/LAC.java",
    "content": "package com.baidu.nlp;\n\nimport java.util.ArrayList;\n\npublic class LAC {\n\n    // as c++ self pointer\n    private long self_ptr;\n\n    public LAC(String model_dir) {\n        init(model_dir);\n    }\n\n    public LAC(LAC model){\n        copy(model.self_ptr);\n    }\n\n    @Override\n    protected void finalize() throws Throwable {\n        close();\n        super.finalize();\n    }\n\n    public void close() {\n        if(self_ptr != 0) {\n            release(self_ptr);\n            self_ptr = 0;\n        }\n    }\n\n    // load model from model_path\n    private native void init(String model_path);\n\n    // load model from existing model's self_ptr\n    private native void copy(long self_ptr);\n\n    // release lac model\n    private static native void release(long self_ptr);\n\n    // load dict from dict_path\n    public native int loadCustomization(String dict_path);\n\n    // run lac, results save in words and tags\n    public native int run(String sentence, ArrayList<String> words, ArrayList<String> tags);\n\n}\n"
  },
  {
    "path": "java/cpp/lac_jni.cpp",
    "content": "#include \"lac.h\"\n#include \"lac_jni.h\"\n#include <string>\n#include <cstring>\n#include <iostream>\n\n#ifdef __cplusplus\nextern \"C\"\n{\n#endif\n \n  // 返回Java类别中的self_ptr地址，用于指向创建的LAC对象\n  static jfieldID _get_self_id(JNIEnv *env, jobject thisObj)\n  {\n    static int init = 0;\n    static jfieldID fidSelfPtr;\n    if (!init)\n    {\n      jclass thisClass = env->GetObjectClass(thisObj);\n      fidSelfPtr = env->GetFieldID(thisClass, \"self_ptr\", \"J\");\n    }\n    return fidSelfPtr;\n  }\n\n  // 设置self_ptr地址，指向创建的LAC对象\n  static void _set_self(JNIEnv *env, jobject thisObj, LAC *self)\n  {\n    jlong selfPtr = *(jlong *)&self;\n    env->SetLongField(thisObj, _get_self_id(env, thisObj), selfPtr);\n  }\n\n  // 返回LAC对象的指针\n  static LAC *_get_self(JNIEnv *env, jobject thisObj)\n  {\n    jlong selfPtr = env->GetLongField(thisObj, _get_self_id(env, thisObj));\n    return *(LAC **)&selfPtr;\n  }\n\n\n  /*\n * Class:     LAC\n * Method:    init\n * Signature: (Ljava/lang/String;)V\n */\n  JNIEXPORT void JNICALL Java_com_baidu_nlp_LAC_init(JNIEnv *env, jobject thisObj, jstring model_dir)\n  {\n\n    LAC *self = new LAC(env->GetStringUTFChars(model_dir, 0));\n    _set_self(env, thisObj, self);\n  }\n\n  /*\n * Class:     LAC\n * Method:    copy\n * Signature: (Jlong)V\n */\n  JNIEXPORT void JNICALL Java_com_baidu_nlp_LAC_copy(JNIEnv *env, jobject thisObj, jlong selfPtr)\n  {\n    LAC *self  = *(LAC **)&selfPtr;\n    if (self){\n      _set_self(env, thisObj, new LAC(*self));\n    }\n  }\n\n  /*\n * Class:     LAC\n * Method:    release\n * Signature: (Jlong)V\n */\n  JNIEXPORT void JNICALL Java_com_baidu_nlp_LAC_release(JNIEnv *env, jobject thisObj, jlong selfPtr)\n  {\n    if (selfPtr){\n      delete (LAC *)selfPtr;\n    }\n  }\n\n  /*\n * Class:     LAC\n * Method:    load_customization\n * Signature: (Ljava/lang/String;)Jint\n */\nJNIEXPORT jint JNICALL Java_com_baidu_nlp_LAC_loadCustomization\n  (JNIEnv *env, jobject thisObj, jstring dict_path)\n  {\n    LAC *self = _get_self(env, thisObj);\n    return self->load_customization(env->GetStringUTFChars(dict_path, 0));\n  }\n\n/*\n * Class:     LAC\n * Method:    run\n * Signature: (Ljava/lang/String;Ljava/lang/ArrayList;Ljava/lang/ArrayList)Jint\n */\nJNIEXPORT jint JNICALL Java_com_baidu_nlp_LAC_run\n  (JNIEnv *env, jobject thisObj, jstring sentence, jobject words, jobject tags)\n  {\n    jclass list_jcs = env->FindClass(\"java/util/ArrayList\");\n    if (list_jcs == NULL) {\n        std::cerr<<\"JNICALL Java_com_baidu_nlp_LAC_run: ArrayList Not Found\"<<std::endl;\n        return -1;\n    }\n    \n    //获取ArrayList构造函数id，用于Return使用\n    // jmethodID list_init = env->GetMethodID(list_jcs, \"<init>\", \"()V\");\n    //创建一个ArrayList对象\n    // jobject list_obj = env->NewObject(list_jcs, list_init, \"\");\n\n    //获取ArrayList对象的add()的methodID\n    jmethodID list_add = env->GetMethodID(list_jcs, \"add\",\n              \"(Ljava/lang/Object;)Z\");\n\n    //获取ArrayList对象的clear()的methodID\n    jmethodID list_clear = env->GetMethodID(list_jcs, \"clear\", \"()V\");\n    env->CallVoidMethod(words, list_clear);\n    env->CallVoidMethod(tags, list_clear);\n\n    LAC *self = _get_self(env, thisObj);\n    std::string input = env->GetStringUTFChars(sentence, 0);\n    auto result = self->run(input);\n\n    for (size_t i = 0; i < result.size(); i++)\n    {\n      env->CallBooleanMethod(words, list_add, env->NewStringUTF(result[i].word.c_str()));\n      env->CallBooleanMethod(tags, list_add, env->NewStringUTF(result[i].tag.c_str()));\n    }\n  \n    return 0;\n\n  }\n\n#ifdef __cplusplus\n}\n#endif"
  },
  {
    "path": "java/cpp/lac_jni.h",
    "content": "/* DO NOT EDIT THIS FILE - it is machine generated */\n#include <jni.h>\n/* Header for class LAC */\n\n#ifndef _Included_lacjni\n#define _Included_lacjni\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n/*\n * Class:     LAC\n * Method:    init\n * Signature: (Ljava/lang/String;)V\n */\nJNIEXPORT void JNICALL Java_com_baidu_nlp_LAC_init\n  (JNIEnv *, jobject, jstring);\n\n/*\n * Class:     LAC\n * Method:    loadCustomization\n * Signature: (Ljava/lang/String;)Jint\n */\nJNIEXPORT jint JNICALL Java_com_baidu_nlp_LAC_loadCustomization\n  (JNIEnv *, jobject, jstring);\n\n\n\n/*\n * Class:     LAC\n * Method:    run\n * Signature: (Ljava/lang/String;Ljava/lang/String[];Ljava/lang/String[])Jint\n */\nJNIEXPORT jint JNICALL Java_com_baidu_nlp_LAC_run\n  (JNIEnv *, jobject, jstring, jobject, jobject);\n\n#ifdef __cplusplus\n}\n#endif\n#endif\n"
  },
  {
    "path": "python/LAC/__init__.py",
    "content": "# -*- coding: UTF-8 -*-\n################################################################################\n#\n#   Copyright (c) 2020  Baidu.com, Inc. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\"\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n################################################################################\n\nname = 'lac'\nversion = \"2.1.2\"\nversion_info = (2, 1, 2, 0)\n\nfrom .lac import LAC\n"
  },
  {
    "path": "python/LAC/_compat.py",
    "content": "# -*- coding: UTF-8 -*-\n################################################################################\n#\n#   Copyright (c) 2020  Baidu, Inc. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\"\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#################################################################################\n\n\"\"\"\n本模块定义了兼容Python2和Python3的部分操作和函数。\n\"\"\"\n\nimport sys\n\nPY2 = sys.version_info[0] == 2\n\ndefault_encoding = sys.getfilesystemencoding()\n\nif PY2:\n    text_type = unicode\n    string_types = (str, unicode)\n\n    def iterkeys(d): return d.iterkeys()\n\n    def itervalues(d): return d.itervalues()\n\n    def iteritems(d): return d.iteritems()\n\nelse:\n    text_type = str\n    string_types = (str,)\n    xrange = range\n\n    def iterkeys(d): return iter(d.keys())\n\n    def itervalues(d): return iter(d.values())\n\n    def iteritems(d): return iter(d.items())\n\n\ndef strdecode(sentence):\n    \"\"\"string to unicode\n\n    Args:\n        sentence:  a string of utf-8 or gbk\n\n    Returns:\n        input's unicode result\n\n    \"\"\"\n    if not isinstance(sentence, text_type):\n        try:\n            sentence = sentence.decode('utf-8')\n        except UnicodeDecodeError:\n            sentence = sentence.decode('gbk', 'ignore')\n    return sentence\n"
  },
  {
    "path": "python/LAC/ahocorasick.py",
    "content": "# -*- coding: UTF-8 -*-\n################################################################################\n#\n#   Copyright (c) 2020  Baidu, Inc. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\"\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#################################################################################\n\n\"\"\"\n本模块实现AC自动机封装为Ahocorasick类，用于进行词典的多模匹配。\n\"\"\"\n\nimport logging\n\n\nclass Node(object):\n    \"\"\"AC自动机的树结点.\n\n    Attributes:\n        next: dict类型，指向子结点\n        fail: Node类型，AC自动机的fail指针\n        length: int类型，判断节点是否为单词\n    \"\"\"\n    __slots__ = ['next', 'fail', 'length']\n\n    def __init__(self):\n        \"\"\"初始化空节点.\"\"\"\n        self.next = {}\n        self.fail = None  # fail指针默认为None\n        self.length = -1\n\n\nclass Ahocorasick(object):\n    \"\"\"实现AC自动机的类\n\n    Attributes:\n        __root: Node类型，AC自动机根节点\n    \"\"\"\n\n    def __init__(self):\n        \"\"\"初始化Ahocorasick的根节点__root\"\"\"\n        self.__root = Node()\n\n    def add_word(self, word):\n        \"\"\"添加单词word到Trie树中\"\"\"\n        current = self.__root\n        for char in word:\n            current = current.next.setdefault(char, Node())\n        current.length = len(word)\n\n    def make(self):\n        \"\"\"构建fail指针路径\"\"\"\n\n        queue = list()\n        for key in self.__root.next:\n            self.__root.next[key].fail = self.__root\n            queue.append(self.__root.next[key])\n\n        # 广度优先算法遍历设置fail指针\n        while len(queue) > 0:\n            # 基于当前节点的fail指针设置其子结点的fail指针\n            current = queue.pop(0)\n\n            for k in current.next:\n                current_fail = current.fail\n\n                # 若当前节点有fail指针，尝试设置其子结点的fail指针\n                while current_fail is not None:\n                    if k in current_fail.next:\n                        current.next[k].fail = current_fail.next[k]\n                        break\n                    current_fail = current_fail.fail\n\n                # 若当前节点的fail指针不存在该子结点，令子结点fail指向根节点\n                if current_fail is None:\n                    current.next[k].fail = self.__root\n\n                queue.append(current.next[k])\n\n    def search(self, content):\n        \"\"\"后向最大匹配.\n\n        对content的文本进行多模匹配，返回后向最大匹配的结果.\n\n        Args:\n            content: string类型, 用于多模匹配的字符串\n\n        Returns:\n            list类型, 最大匹配单词列表，每个元素为匹配的模式串在句中的起止位置，比如：\n            [(0, 2), [4, 7]]\n\n        \"\"\"\n        result = []\n        p = self.__root\n        for current_position in range(len(content)):\n            word = content[current_position]\n\n            #\n            while word not in p.next:\n                if p == self.__root:\n                    break\n                p = p.fail\n            else:\n                p = p.next[word]\n                if p.length > 0:\n                    result.append(\n                        (current_position - p.length + 1, current_position))\n\n        return result\n\n    def search_all(self, content):\n        \"\"\"多模匹配的完全匹配.\n\n        对content的文本进行多模匹配，返回所有匹配结果\n\n        Args:\n            content: string类型, 用于多模匹配的字符串\n\n        Returns:\n            list类型, 所有匹配单词列表，每个元素为匹配的模式串在句中的起止位置，比如：\n            [(0, 2), [4, 7]]\n\n        \"\"\"\n        result = []\n        p = self.__root\n        for current_position in range(len(content)):\n            word = content[current_position]\n\n            while word not in p.next:\n                if p == self.__root:\n                    break\n                p = p.fail\n            else:\n                p = p.next[word]\n\n                # 回溯查看是否存在以当前字符结尾的单词\n                tmp = p\n                while tmp != self.__root:\n                    if tmp.length > 0:\n                        result.append(\n                            (current_position - tmp.length + 1, current_position))\n                    tmp = tmp.fail\n\n        return result\n\n\nif __name__ == '__main__':\n\n    ah = Ahocorasick()\n    x = [\"百度\", \"家\", \"高科技\", \"科技\", \"科技公司\"]\n    for i in x:\n        ah.add_word(i)\n    ah.make()\n    string = '百度是家高科技公司'\n    for begin, end in ah.search_all(string):\n        print('all:', string[begin:end + 1])\n\n    for begin, end in ah.search(string):\n        print('search:', string[begin:end + 1])\n"
  },
  {
    "path": "python/LAC/cmdline.py",
    "content": "# -*- coding: UTF-8 -*-\n################################################################################\n#\n#   Copyright (c) 2020  Baidu, Inc. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\"\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#################################################################################\n\n\"\"\"\n本文件提供了命令行工具的入口逻辑。\n\"\"\"\n\nfrom __future__ import absolute_import\nfrom __future__ import print_function\nfrom __future__ import unicode_literals\n\nimport argparse\nparser = argparse.ArgumentParser(description='LAC Init Argments')\nparser.add_argument('--segonly', action='store_true', \n                    help='run segment only if setting')\nparser.add_argument('--rank', action='store_true', \n                    help='run rank model if setting')\nargs = parser.parse_args()\n\n__all__ = [\n    'main',\n]\n\n\ndef main(args=args):\n    \"\"\"主程序入口\"\"\"\n    from LAC import LAC\n    from LAC._compat import strdecode\n    import sys\n\n    if args.segonly:\n        lac = LAC(mode='seg')\n    elif args.rank:\n        lac = LAC(mode='rank')\n    else:\n        lac = LAC()\n\n\n    while True:\n        line = sys.stdin.readline()\n        if not line:\n            break\n\n        line = strdecode(line.strip())\n        if args.segonly:\n            print(u\" \".join(lac.run(line)))\n        elif args.rank:\n            words, tags, words_rank = lac.run(line)\n            print(u\" \".join(u\"%s/%s\" % (word, rank)\n                            for word, tag, rank in zip(words, tags, words_rank)))\n        else :\n            words, tags = lac.run(line)\n            print(u\" \".join(u\"%s/%s\" % (word, tag)\n                            for word, tag in zip(words, tags)))\n\n    return 0"
  },
  {
    "path": "python/LAC/custom.py",
    "content": "# -*- coding: UTF-8 -*-\n################################################################################\n#\n#   Copyright (c) 2020  Baidu, Inc. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\"\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#################################################################################\n\n\"\"\"\n该模块实现用户自定义词典的功能\n\"\"\"\n\nfrom io import open\nimport logging\n\ntry:\n    from ._compat import strdecode\n    from .prefix_tree import TriedTree\nexcept:\n    from _compat import strdecode\n    from prefix_tree import TriedTree\n\n\nclass Customization(object):\n    \"\"\"\n    基于AC自动机实现用户干预的功能\n    \"\"\"\n\n    def __init__(self):\n        self.dictitem = {}\n        self.ac = None\n        pass\n    \n    def add_word(self, words, sep=None):\n        \"\"\"装载人工干预词典（单词输入）\"\"\"\n        if self.ac is None:\n            self.ac = TriedTree()\n        words = strdecode(words)\n        if sep == None:\n            words = words.strip().split()\n        else:\n            sep = strdecode(sep)\n            words = words.strip().split(sep)\n\n        if len(words) == 0:\n            return\n\n        phrase = \"\"\n        tags = []\n        offset = []\n        for word in words:\n            if word.rfind('/') < 1:\n                phrase += word\n                tags.append('')\n            else:\n                phrase += word[:word.rfind('/')]\n                tags.append(word[word.rfind('/') + 1:])\n            offset.append(len(phrase))\n\n        if len(phrase) < 2 and tags[0] == '':\n            return\n\n        self.dictitem[phrase] = (tags, offset)\n        self.ac.add_word(phrase)\n\n    def load_customization(self, filename, sep=None):\n        \"\"\"装载人工干预词典\"\"\"\n        self.ac = TriedTree()\n        with open(filename, 'r', encoding='utf8') as f:\n            for line in f:\n                if sep == None:\n                    words = line.strip().split()\n                else:\n                    sep = strdecode(sep)\n                    words = line.strip().split(sep)\n\n                if len(words) == 0:\n                    continue\n\n                phrase = \"\"\n                tags = []\n                offset = []\n                for word in words:\n                    if word.rfind('/') < 1:\n                        phrase += word\n                        tags.append('')\n                    else:\n                        phrase += word[:word.rfind('/')]\n                        tags.append(word[word.rfind('/') + 1:])\n                    offset.append(len(phrase))\n\n                if len(phrase) < 2 and tags[0] == '':\n                    continue\n\n                self.dictitem[phrase] = (tags, offset)\n                self.ac.add_word(phrase)\n        self.ac.make()\n\n    def parse_customization(self, query, lac_tags):\n        \"\"\"使用人工干预词典修正lac模型的输出\"\"\"\n        if not self.ac:\n            logging.warning(\"customization dict is not load\")\n            return\n\n        # FMM前向最大匹配\n        ac_res = self.ac.search(query)\n\n        for begin, end in ac_res:\n            phrase = query[begin:end]\n            index = begin\n\n            tags, offsets = self.dictitem[phrase]\n            for tag, offset in zip(tags, offsets):\n                while index < begin + offset:\n                    if len(tag) == 0:\n                        lac_tags[index] = lac_tags[index][:-1] + 'I'\n                    else:\n                        lac_tags[index] = tag + \"-I\"\n                    index += 1\n\n            lac_tags[begin] = lac_tags[begin][:-1] + 'B'\n            for offset in offsets:\n                index = begin + offset\n                if index < len(lac_tags):\n                    lac_tags[index] = lac_tags[index][:-1] + 'B'\n\n\nif __name__ == '__main__':\n\n    custom = Customization()\n    custom.load_customization('./icwb2_gold/pku_training_words.utf8')\n    query = u\"共同创造美好的新世纪——二○○一年新年贺词\"\n    tags = ['O'] * len(query)\n    custom.parse_customization(query, tags)\n    print('after parse: ', tags)\n"
  },
  {
    "path": "python/LAC/lac.py",
    "content": "# -*- coding: UTF-8 -*-\n################################################################################\n#\n#   Copyright (c) 2020  Baidu, Inc. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\"\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#################################################################################\n\n\"\"\"\n本文件定义了LAC类，实现其调用分词，词性标注，训练模型的接口。\n\"\"\"\n\nimport os\nimport shutil\nimport logging\n\nimport numpy as np\nimport paddle.fluid as fluid\nfrom paddle.fluid.core import PaddleTensor\nfrom paddle.fluid.core import AnalysisConfig\nfrom paddle.fluid.core import create_paddle_predictor\n\nfrom . import nets\nfrom . import utils\nfrom . import reader\nfrom ._compat import *\nfrom .custom import Customization\nfrom .models import Model, SegModel, LacModel, RankModel\n\ndef _get_abs_path(path): return os.path.normpath(\n    os.path.join(os.getcwd(), os.path.dirname(__file__), path))\n\nDEFAULT_LAC = _get_abs_path('lac_model')\nDEFAULT_SEG = _get_abs_path('seg_model')\nDEFAULT_RANK = _get_abs_path('rank_model')\n\nPATH_DICT = {\n                \"lac\": DEFAULT_LAC,\n                \"seg\": DEFAULT_SEG,\n                \"rank\":DEFAULT_RANK\n             }\n\nclass LAC(object):\n    \"\"\"Docstring for LAC\"\"\"\n    def __init__(self, model_path=None, mode='lac', use_cuda=False):\n        super(LAC, self).__init__()\n        utils.check_cuda(use_cuda)\n\n        assert mode in PATH_DICT, 'The mode should be in \"lac\", \"seg\" or \"rank\"'\n        model_path = model_path if model_path else PATH_DICT[mode]\n\n        if mode == 'seg':\n            model = SegModel(model_path, mode, use_cuda)\n        elif mode == 'lac':\n            model = LacModel(model_path, mode, use_cuda)\n        elif mode == 'rank':\n            model = RankModel(model_path, mode, use_cuda)\n\n        self.model = model\n\n    def run(self, texts):\n        \"\"\"执行模型预测过程\n        Args:\n            texts: 模型输入的文本，一个Unicode编码的字符串或者\n                   由Unicode编码字符串组成的List\n        Returns:\n            if mode=='seg',  返回分词结果\n            if mode=='lac',  返回分词,词性结果\n            if mode=='rank', 返回分词,词性,词语重要性结果\n        \"\"\"\n        return self.model.run(texts)\n    \n    def train(self, model_save_dir, train_data, test_data=None, iter_num=10, thread_num=10):\n        \"\"\"执行模型增量训练\n        Args:\n            model_save_dir: 训练结束后模型保存的路径\n            train_data: 训练数据路径\n            test_data: 测试数据路径，若为None则不进行测试\n            iter_num: 训练数据的迭代次数\n            thread_num: 执行训练的线程数\n        \"\"\"\n        self.model.train(model_save_dir, train_data, test_data, iter_num, thread_num)\n    \n    def load_customization(self, customization_file, sep=None):\n        \"\"\"装载用户词典\n\n        Args:\n            texts: 用户词典路径\n            sep: 表示词典中，短语片段的分隔符，默认为空格' '或制表符'\\t'\n        \"\"\"\n        self.model.custom = Customization()\n        self.model.custom.load_customization(customization_file, sep)\n    \n    def add_word(self, word, sep=None):\n        \"\"\"添加单词，格式与用户词典一致\n        Args:\n            texts: 用户定义词典，如：\"春天\"、\"花 开\"、\"春天/SEASON\"、\"花/n 开/v\"、\n            sep: 表示词典中，短语片段的分隔符，默认为空格' '或制表符'\\t'\n        \"\"\"\n        if self.model.custom is None:\n            self.model.custom = Customization()\n        self.model.custom.add_word(word, sep)\n\nif __name__ == \"__main__\":\n    print('######### mode = lac ##############')\n    lac = LAC('lac_model')\n\n    test_data = [u'百度是一家高科技公司', u'LAC是一个优秀的分词工具', '']\n\n    print('######### run:list ##############')\n    result = lac.run(test_data)\n    for res in result:\n        print(' '.join(res))\n\n    print('######### run:str ##############')\n    result = lac.run(test_data[0])\n    print(' '.join(result))\n\n    print('######### run:tag ##############')\n    result = lac.run(test_data)\n    for i, (sent, tags) in enumerate(result):\n        result_list = ['(%s, %s)' % (ch, tag) for ch, tag in zip(sent, tags)]\n        print(''.join(result_list))\n\n    print('######### mode = rank ##############')\n    lac = LAC('lac_model', mode='rank')\n\n    print('######### run:list ##############')\n    result = lac.run(test_data)\n    for res in result:\n        print(' '.join(res))\n\n    print('######### run:str ##############')\n    result = lac.run(test_data[0])\n    print(' '.join(result))\n\n    print('######### run:tag ##############')\n    result = lac.run(test_data)\n    for i, (sent, tags, word_rank) in enumerate(result):\n        result_list = ['(%s, %s, %s)' % (ch, tag, rank) for ch, tag, rank in zip(sent, tags, word_rank)]\n        print(''.join(result_list))\n\n\n    # 重训模型\n    lac.train(model_save_dir='models_test',\n              train_data='./data/train.tsv', test_data='./data/test.tsv')\n\n    print('######### run:list ##############')\n    result = lac.run(test_data)\n    for res in result:\n        print(' '.join(res))\n    print('######### run:str ##############')\n    result = lac.run(test_data[0])\n    print(' '.join(result))\n    print('######### run:tag ##############')\n    result = lac.run(test_data, mode='lac')\n    for i, (sent, tags) in enumerate(result):\n        result_list = ['(%s, %s)' % (ch, tag) for ch, tag in zip(sent, tags)]\n        print(''.join(result_list))\n"
  },
  {
    "path": "python/LAC/models.py",
    "content": "# -*- coding: UTF-8 -*-\n################################################################################\n#\n#   Copyright (c) 2020  Baidu, Inc. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\"\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#################################################################################\n\"\"\"\n本文件定义了Model基类以及它的子类:LacModel, SegModel, RankModel\n\"\"\" \nimport os\nimport shutil\nimport logging\n\nimport numpy as np\nimport paddle.fluid as fluid\nfrom paddle.fluid.core import PaddleTensor\nfrom paddle.fluid.core import AnalysisConfig\nfrom paddle.fluid.core import create_paddle_predictor\n\nfrom . import nets\nfrom . import utils\nfrom . import reader\nfrom .segment import Segment\nfrom .custom import Customization\n\nclass Model(object):\n    \"\"\"Docstring for Model\"\"\"\n    def __init__(self, model_path, mode, use_cuda):\n        super(Model, self).__init__()\n\n        self.mode = mode\n        self.model_path = model_path\n\n        self.args = utils.DefaultArgs(self.model_path)\n        self.args.use_cuda = use_cuda\n\n        utils.check_cuda(self.args.use_cuda)\n\n        config = AnalysisConfig(self.args.init_checkpoint)\n        config.disable_glog_info()\n\n        if self.args.use_cuda:\n            self.place = fluid.CUDAPlace(\n                int(os.getenv('FLAGS_selected_gpus', '0')))\n            config.enable_use_gpu(memory_pool_init_size_mb=500,\n                                  device_id=int(\n                                      os.getenv('FLAGS_selected_gpus', '0')),\n                                  )\n        else:\n            self.place = fluid.CPUPlace()\n\n        # init executor\n        self.exe = fluid.Executor(self.place)\n        self.dataset = reader.Dataset(self.args)\n        self.predictor = create_paddle_predictor(config)\n        self.segment_tool = None\n        self.custom = None\n        self.batch = False\n        \n    def run(self, texts):\n        \"\"\"文本输入经过模型转为运行结果Tensor\"\"\"\n        self.empty_string = []\n        self.empty_return = {\n                            \"empty\": [[], [], []],\n                            \"crf_result\": [[[], [], []]]\n                            }\n        if isinstance(texts, list) or isinstance(texts, tuple):\n            self.batch = True\n        else:\n            if len(texts) == 0:\n                return self.empty_return\n            texts = [texts]\n            self.batch = False\n        \n        for i in range(len(texts)-1, -1, -1):\n            if len(texts[i]) == 0:\n                self.empty_string.append(i)\n                texts.pop(i)\n            \n        if len(texts) == 0:\n            return {\n                    \"crf_result\": self.empty_return[\"crf_result\"] * len(self.empty_string)\n                    }\n\n        tensor_words, words_length = self.texts2tensor(texts)\n        crf_decode = self.predictor.run([tensor_words])\n        crf_result = self.parse_result(texts, crf_decode[0], self.dataset, words_length)\n\n        for _ in self.empty_string:\n            crf_result.insert(_, self.empty_return[\"empty\"])\n\n        return {\n                \"crf_decode\": crf_decode,\n                \"crf_result\": crf_result,\n                \"tensor_words\": tensor_words,\n                \"words_length\": words_length\n                }   \n\n    def to_tensor(self, data, lod, dtype=\"int64\"):\n        \"\"\"Ids to Tensor\"\"\"\n        data_np = np.array(data, dtype)\n        tensor = fluid.core.PaddleTensor(data_np)\n        tensor.lod = [lod]\n        tensor.shape = [lod[-1], 1]\n        return tensor\n\n    def texts2tensor(self, texts):\n        \"\"\"文本输入转为Paddle输入的Tensor,适用于lac与rank\n        Args:\n            texts: 由string组成的list，模型输入的文本     \n        Returns:\n            tensor: Paddle模型输入用的文本Tensor\n            words_length: 记录送入模型的每一个单词的长度\n        \"\"\"\n        lod, data, words_length = [0], [], []\n        for i, text in enumerate(texts):  \n\n            text = self.segment_tool.fast_cut(text)\n            text_inds, word_length = self.dataset.text_to_ids(text)\n            words_length.append(word_length)\n\n            data += text_inds\n            lod.append(len(text_inds) + lod[i])\n\n        tensor = self.to_tensor(data, lod) if len(data) != 0 else None\n\n        return tensor, words_length\n\n    def parse_result(self, lines, crf_decode, dataset, words_length):\n        \"\"\"将LAC模型输出的Tensor转为明文\"\"\"\n        offset_list = crf_decode.lod[0]\n        crf_decode = crf_decode.data.int64_data()\n        batch_size = len(offset_list) - 1\n\n        batch_out = []\n        for sent_index in range(batch_size):\n            begin, end = offset_list[sent_index], offset_list[sent_index + 1]\n\n            sent = lines[sent_index]\n            tags = [dataset.id2label_dict[str(id)]\n                    for id in crf_decode[begin:end]]\n\n            # 重新填充被省略的单词的char部分\n            word_length = words_length[sent_index]\n            for current in range(len(word_length)-1, -1, -1):\n                for offset in range(1, word_length[current]):\n                    tags.insert(current + offset, tags[current][:-2] + '-I')\n\n            if self.custom:\n                self.custom.parse_customization(sent, tags)\n\n            sent_out, tags_out = [], []\n            for ind, tag in enumerate(tags):\n                # for the first char\n                if len(sent_out) == 0 or tag.endswith(\"B\") or tag.endswith(\"S\"):\n                    sent_out.append(sent[ind])\n                    tags_out.append(tag[:-2])\n                    continue\n                sent_out[-1] += sent[ind]\n                # 取最后一个tag作为标签\t\n                tags_out[-1] = tag[:-2]\n\n            batch_out.append([sent_out, tags_out, tags])\n        return batch_out\n    \n    def train(self, model_save_dir, train_data, test_data, iter_num, thread_num):\n        \"\"\"执行模型增量训练\n        Args:\n            model_save_dir: 训练结束后模型保存的路径\n            train_data: 训练数据路径\n            test_data: 测试数据路径，若为None则不进行测试\n            iter_num: 训练数据的迭代次数\n            thread_num: 执行训练的线程数\n        \"\"\"\n        self.args.model = self.mode\n        self.args.train_data = train_data\n        self.args.test_data = test_data\n        self.args.epoch = iter_num\n        self.args.cpu_num = thread_num\n        logging.info(\"Start Training!\")\n\n        scope = fluid.core.Scope()\n        with fluid.scope_guard(scope):\n            test_program, fetch_list = nets.do_train(self.args, self.dataset, self.segment_tool)\n\n            fluid.io.save_inference_model(os.path.join(model_save_dir, 'model'),\n                                          ['words'],\n                                          fetch_list,\n                                          self.exe,\n                                          main_program=test_program,\n                                          )\n        # 拷贝配置文件\n        if os.path.exists(os.path.join(model_save_dir, 'conf')):\n            shutil.rmtree(os.path.join(model_save_dir, 'conf'))\n        shutil.copytree(os.path.join(self.model_path, 'conf'),\n                        os.path.join(model_save_dir, 'conf'))\n\n        self.load_model(model_save_dir)\n        logging.info(\"Finish Training!\")\n    \n    def load_model(self, model_dir):\n        \"\"\"装载预训练的模型\"\"\"\n        use_cuda = self.args.use_cuda\n        self.args = utils.DefaultArgs(model_dir)\n        self.args.use_cuda = use_cuda\n        self.dataset = reader.Dataset(self.args)\n        self.model = self.args.model\n\n        self.model_path = model_dir\n        config = AnalysisConfig(os.path.join(model_dir, 'model'))\n        config.disable_glog_info()\n        if self.args.use_cuda:\n            config.enable_use_gpu(memory_pool_init_size_mb=500,\n                                  device_id=int(\n                                      os.getenv('FLAGS_selected_gpus', '0')),\n                                  )\n        self.predictor = create_paddle_predictor(config)\n\nclass LacModel(Model):\n    \"\"\"Docstring for LAC Model\"\"\"\n    def __init__(self, model_path, mode, use_cuda):\n        super(LacModel, self).__init__(model_path, mode, use_cuda) \n\n        seg_dict_path = os.path.join(model_path, \"conf\", \"small_seg.dic\")\n        self.segment_tool = Segment(dict_path=seg_dict_path)\n\n    def run(self, texts):\n        crf_result = super(LacModel, self).run(texts)['crf_result']\n        result = [[word, tag] for word, tag, tag_for_rank in crf_result] if self.batch else crf_result[0][:-1]\n        return result\n\n    def call_run(self, texts):\n        \"\"\"lac被rank模型调用时返回的结果\"\"\"\n        lac_result = super(LacModel, self).run(texts)\n        return lac_result\n\nclass SegModel(Model):\n    \"\"\"Docstring for Seg Model\"\"\"\n    def __init__(self, model_path, mode, use_cuda):\n        super(SegModel, self).__init__(model_path, mode, use_cuda) \n        self.dataset = reader.SegDataset(self.args)\n    \n    def run(self, texts):\n        crf_result = super(SegModel, self).run(texts)[\"crf_result\"]\n        result = [word for word, tag, tag_for_rank in crf_result] if self.batch else crf_result[0][0]\n        return result\n    \n    def texts2tensor(self, texts):\n        \"\"\"文本输入转为Paddle输入的Tensor\"\"\"\n        lod, data, words_length = [0], [], []\n        for i, text in enumerate(texts):\n\n            text_inds = self.dataset.word_to_ids(text)\n            data += text_inds\n            lod.append(len(text_inds) + lod[i])\n\n        tensor = self.to_tensor(data, lod) if len(data) != 0 else None\n\n        return tensor, words_length\n    \n    def parse_result(self, lines, crf_decode, dataset, words_length):\n        \"\"\"将SEG模型输出的Tensor转为明文\"\"\"\n        offset_list = crf_decode.lod[0]\n        crf_decode = crf_decode.data.int64_data()\n        batch_size = len(offset_list) - 1\n\n        batch_out = []\n        for sent_index in range(batch_size):\n            begin, end = offset_list[sent_index], offset_list[sent_index + 1]\n\n            sent = lines[sent_index]\n            tags = [dataset.id2label_dict[str(id)]\n                    for id in crf_decode[begin:end]]\n            tags_for_rank = []\n\n            if self.custom:\n                self.custom.parse_customization(sent, tags)\n\n            sent_out, tags_out = [], []\n            for ind, tag in enumerate(tags):\n                # for the first char\n                if len(sent_out) == 0 or tag.endswith(\"B\") or tag.endswith(\"S\"):\n                    sent_out.append(sent[ind])\n                    tags_out.append(tag[:-2])\n                    continue\n                sent_out[-1] += sent[ind]\n                # 取最后一个tag作为标签\t\n                tags_out[-1] = tag[:-2]\n\n            sent_out = [''] if len(sent_out) == 0 else sent_out\n            batch_out.append([sent_out, tags_out, tags_for_rank])\n        return batch_out\n\nclass RankModel(Model):\n    \"\"\"Docstring for Rank Model\"\"\"\n    def __init__(self, model_path, mode, use_cuda):\n        # init rank model\n        super(RankModel, self).__init__(model_path, mode, use_cuda) \n\n        # parsing the lac model address\n        parent_path = os.path.split(model_path)[0]\n        lac_path = os.path.join(parent_path, 'lac_model')\n\n        # init lac model\n        self.lac = LacModel(model_path=lac_path, mode='lac', use_cuda=use_cuda) \n\n    def run(self, texts):\n        if self.custom is not None:\n            self.lac.custom = self.custom\n            \n        lac_result = self.lac.call_run(texts)\n        self.batch = self.lac.batch\n\n        if len(lac_result) != 4:\n            return lac_result[\"crf_result\"]\n        \n        crf_decode = lac_result[\"crf_decode\"]\n        crf_result = lac_result[\"crf_result\"]\n        tensor_words = lac_result[\"tensor_words\"]\n        words_length = lac_result[\"words_length\"]\n\n        result = [[word, tag] for word, tag, tag_for_rank in crf_result]\n        tags_for_rank = [tag_for_rank for word, tag, tag_for_rank in crf_result if len(tag_for_rank) != 0]\n\n        rank_decode = self.predictor.run([tensor_words, crf_decode[0]])\n        weight = self.parse_result(tags_for_rank, rank_decode[0], words_length)\n\n        for _ in range(len(result)):\n            if len(result[_][0]) == 0:\n                result[_].append([])\n            else:\n                result[_].append(weight.pop(0))\n\n        return result if self.batch else result[0]\n\n    def parse_result(self, tags_for_rank, result, words_length):\n        \"\"\"将RANK模型输出的Tensor转为明文\"\"\"\n        offset_list = result.lod[0]\n        rank_weight = result.data.int64_data()\n        batch_size = len(offset_list) - 1\n\n        batch_out = []\n        for sent_index in range(batch_size):\n            begin, end = offset_list[sent_index], offset_list[sent_index + 1]\n\n            tags = tags_for_rank[sent_index]\n            word_length = words_length[sent_index]\n            weight = rank_weight[begin:end]\n\n            # 重新填充被省略的单词的char部分\n            for current in range(len(word_length)-1, -1, -1):\n                for offset in range(1, word_length[current]):\n                    weight.insert(current + offset, weight[current])\n\n            weight_out = []\n            for ind, tag in enumerate(tags):\n                if len(weight_out) == 0 or tag.endswith(\"B\") or tag.endswith(\"S\"):\n                    weight_out.append(weight[ind])\n                    continue\n                weight_out[-1] = max(weight_out[-1], weight[ind])\n\n            batch_out.append(weight_out)\n        return batch_out\n\n    def train(self, model_save_dir, train_data, test_data, iter_num, thread_num):\n        logging.info(\"To be continued...\")\n        return\n"
  },
  {
    "path": "python/LAC/nets.py",
    "content": "# -*- coding: UTF-8 -*-\n################################################################################\n#\n#   Copyright (c) 2020  Baidu, Inc. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\"\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#################################################################################\n\n\"\"\"\n本模块定义了模型的网络结构\n\"\"\"\n\nimport os\nimport math\n\nimport paddle\nimport multiprocessing\nimport paddle.fluid as fluid\n\nfrom . import utils\nfrom .reader import Dataset\n\n\ndef lex_net(word, args, vocab_size, num_labels, target=None):\n    \"\"\"定义LAC的网络结构\n\n    Args:\n        word: 模型输入的tensor\n        args: 模型参数\n        vocab_size: 词表大小\n        num_labels: 标签的数量\n        target: 标签结果，如果为None则只返回decode不返回loss\n\n    Returns:\n        loss: 模型的loss，如果target为None则不返回\n        decode: 模型的输出结果\n    \"\"\"\n\n    word_emb_dim = args.word_emb_dim\n    grnn_hidden_dim = args.grnn_hidden_dim\n    emb_lr = args.emb_learning_rate if 'emb_learning_rate' in dir(\n        args) else 1.0\n    crf_lr = args.emb_learning_rate if 'crf_learning_rate' in dir(\n        args) else 1.0\n    bigru_num = args.bigru_num\n    init_bound = 0.1\n    IS_SPARSE = True\n\n    def _bigru_layer(input_feature):\n        \"\"\"定义Bi-GRU层\"\"\"\n\n        pre_gru = fluid.layers.fc(\n            input=input_feature,\n            size=grnn_hidden_dim * 3,\n            param_attr=fluid.ParamAttr(\n                initializer=fluid.initializer.Uniform(\n                    low=-init_bound, high=init_bound),\n                regularizer=fluid.regularizer.L2DecayRegularizer(\n                    regularization_coeff=1e-4)))\n        gru = fluid.layers.dynamic_gru(\n            input=pre_gru,\n            size=grnn_hidden_dim,\n            param_attr=fluid.ParamAttr(\n                initializer=fluid.initializer.Uniform(\n                    low=-init_bound, high=init_bound),\n                regularizer=fluid.regularizer.L2DecayRegularizer(\n                    regularization_coeff=1e-4)))\n\n        pre_gru_r = fluid.layers.fc(\n            input=input_feature,\n            size=grnn_hidden_dim * 3,\n            param_attr=fluid.ParamAttr(\n                initializer=fluid.initializer.Uniform(\n                    low=-init_bound, high=init_bound),\n                regularizer=fluid.regularizer.L2DecayRegularizer(\n                    regularization_coeff=1e-4)))\n        gru_r = fluid.layers.dynamic_gru(\n            input=pre_gru_r,\n            size=grnn_hidden_dim,\n            is_reverse=True,\n            param_attr=fluid.ParamAttr(\n                initializer=fluid.initializer.Uniform(\n                    low=-init_bound, high=init_bound),\n                regularizer=fluid.regularizer.L2DecayRegularizer(\n                    regularization_coeff=1e-4)))\n\n        bi_merge = fluid.layers.concat(input=[gru, gru_r], axis=1)\n        return bi_merge\n\n    def _net_conf(word, target=None):\n        \"\"\"设置网络参数和结构\"\"\"\n\n        word_embedding = fluid.layers.embedding(\n            input=word,\n            size=[vocab_size, word_emb_dim],\n            dtype='float32',\n            is_sparse=IS_SPARSE,\n            param_attr=fluid.ParamAttr(\n                learning_rate=emb_lr,\n                name=\"word_emb\",\n                initializer=fluid.initializer.Uniform(\n                    low=-init_bound, high=init_bound)))\n\n        input_feature = word_embedding\n        for i in range(bigru_num):\n            bigru_output = _bigru_layer(input_feature)\n            input_feature = bigru_output\n\n        emission = fluid.layers.fc(\n            size=num_labels,\n            input=bigru_output,\n            param_attr=fluid.ParamAttr(\n                initializer=fluid.initializer.Uniform(\n                    low=-init_bound, high=init_bound),\n                regularizer=fluid.regularizer.L2DecayRegularizer(\n                    regularization_coeff=1e-4)))\n\n        if target is not None:\n            crf_cost = fluid.layers.linear_chain_crf(\n                input=emission,\n                label=target,\n                param_attr=fluid.ParamAttr(\n                    name='crfw',\n                    learning_rate=crf_lr))\n            avg_cost = fluid.layers.mean(x=crf_cost)\n            crf_decode = fluid.layers.crf_decoding(\n                input=emission, param_attr=fluid.ParamAttr(name='crfw'))\n            return avg_cost, crf_decode\n\n        else:\n            size = emission.shape[1]\n            fluid.layers.create_parameter(shape=[size + 2, size],\n                                          dtype=emission.dtype,\n                                          name='crfw')\n            crf_decode = fluid.layers.crf_decoding(\n                input=emission, param_attr=fluid.ParamAttr(name='crfw'))\n\n        return crf_decode\n\n    return _net_conf(word, target)\n\n\ndef create_model(args, vocab_size, num_labels, mode='train'):\n    \"\"\"创建LAC的模型\"\"\"\n\n    # 模型输入定义\n    words = fluid.layers.data(\n        name='words', shape=[-1, 1], dtype='int64', lod_level=1)\n    targets = fluid.layers.data(\n        name='targets', shape=[-1, 1], dtype='int64', lod_level=1)\n\n    # 生成预测用的网络\n    if mode == 'infer':\n        crf_decode = lex_net(words, args, vocab_size,\n                             num_labels, target=None)\n        return {\"feed_list\": [words],\n                \"words\": words,\n                \"crf_decode\": crf_decode, }\n\n    # 生成测试和训练用网络\n    avg_cost, crf_decode = lex_net(\n        words, args, vocab_size, num_labels, target=targets)\n\n    (precision, recall, f1_score, num_infer_chunks, num_label_chunks,\n     num_correct_chunks) = fluid.layers.chunk_eval(\n        input=crf_decode,\n        label=targets,\n        chunk_scheme=\"IOB\",\n        num_chunk_types=int(math.ceil((num_labels - 1) / 2.0)))\n    chunk_evaluator = fluid.metrics.ChunkEvaluator()\n    chunk_evaluator.reset()\n\n    ret = {\n        \"feed_list\": [words, targets],\n        \"words\": words,\n        \"targets\": targets,\n        \"avg_cost\": avg_cost,\n        \"crf_decode\": crf_decode,\n        \"chunk_evaluator\": chunk_evaluator,\n        \"num_infer_chunks\": num_infer_chunks,\n        \"num_label_chunks\": num_label_chunks,\n        \"num_correct_chunks\": num_correct_chunks\n    }\n    return ret\n\n\ndef create_pyreader(args, file_name, feed_list, place,\n                    reader=None, iterable=True, for_test=False):\n    \"\"\"创建PyReader用于Paddle读取数据\n\n    Args:\n        args: 模型参数，定义于utils.DefaultArgs\n        file_name: string类型，数据文件路径\n        feed_list: list类型，模型输入的列表\n        place: Paddle执行的空间，即GPU和CPU\n        reader: 读取数据用的类，定义与reader.py\n        iterable: 是否返回可迭代的PyReader\n        for_test: 是否用于测试，如果测试则不shuffle\n\n    Returns:\n        PyReader对象，用于迭代读取数据\n    \"\"\"\n    # init reader\n    pyreader = fluid.io.PyReader(\n        feed_list=feed_list,\n        capacity=50,\n        use_double_buffer=True,\n        iterable=iterable\n    )\n    if reader is None:\n        reader = Dataset(args)\n\n    if for_test:\n        pyreader.decorate_sample_list_generator(\n            paddle.batch(\n                reader.file_reader(file_name, mode='test'),\n                batch_size=args.batch_size\n            ),\n            places=place\n        )\n    else:\n        pyreader.decorate_sample_list_generator(\n            paddle.batch(\n                paddle.reader.shuffle(\n                    reader.file_reader(file_name),\n                    buf_size=args.traindata_shuffle_buffer\n                ),\n                batch_size=args.batch_size\n            ),\n            places=place\n        )\n\n    return pyreader\n\n\ndef test_process(exe, program, reader, test_ret):\n    \"\"\"执行测试过程\n\n    Args:\n        exe: 执行空间，即CPU和GPU\n        program: 用于测试用的program\n        reader: PyReader类型，读取数据\n\n    Returns:\n\n    \"\"\"\n    test_ret[\"chunk_evaluator\"].reset()\n    for data in reader():\n        nums_infer, nums_label, nums_correct = exe.run(\n            program,\n            fetch_list=[\n                test_ret[\"num_infer_chunks\"],\n                test_ret[\"num_label_chunks\"],\n                test_ret[\"num_correct_chunks\"],\n            ],\n            feed=data,\n        )\n\n        test_ret[\"chunk_evaluator\"].update(\n            nums_infer, nums_label, nums_correct)\n    precision, recall, f1 = test_ret[\"chunk_evaluator\"].eval()\n    print(\"[test] P: %.5f, R: %.5f, F1: %.5f\"\n          % (precision, recall, f1))\n\n\ndef do_train(args, dataset, segment_tool):\n    \"\"\"执行训练过程\n\n    Args:\n        args: DefaultArgs对象，在utils.py中定义，\n             存储模型训练的所有参数,\n\n    Returns:\n        训练产出的program及模型输出变量\n    \"\"\"\n    train_program = fluid.Program()\n    startup_program = fluid.Program()\n\n    # init executor\n    if args.use_cuda:\n        place = fluid.CUDAPlace(int(os.getenv('FLAGS_selected_gpus', '0')))\n        dev_count = fluid.core.get_cuda_device_count()\n    else:\n        dev_count = min(multiprocessing.cpu_count(), args.cpu_num)\n        os.environ['CPU_NUM'] = str(dev_count)\n        place = fluid.CPUPlace()\n\n    dataset.args = args\n    dataset.dev_count = dev_count\n    dataset.segment_tool = segment_tool\n\n    with fluid.program_guard(train_program, startup_program):\n        train_program.random_seed = args.random_seed\n        startup_program.random_seed = args.random_seed\n\n        with fluid.unique_name.guard():\n            train_ret = create_model(\n                args, dataset.vocab_size, dataset.num_labels, mode='train')\n            test_program = train_program.clone(for_test=True)\n\n            optimizer = fluid.optimizer.Adam(\n                learning_rate=args.base_learning_rate)\n            optimizer.minimize(train_ret[\"avg_cost\"])\n\n\n    train_reader = create_pyreader(args, file_name=args.train_data,\n                                   feed_list=train_ret['feed_list'],\n                                   place=place,\n                                   reader=dataset)\n    if args.test_data:\n        test_reader = create_pyreader(args, file_name=args.test_data,\n                                  feed_list=train_ret['feed_list'],\n                                  place=place,\n                                  reader=dataset,\n                                  iterable=True)\n\n    exe = fluid.Executor(place)\n    exe.run(startup_program)\n\n    if args.init_checkpoint:\n        utils.init_pretraining_params(exe, args.init_checkpoint, train_program)\n\n    if args.test_data:\n        test_process(exe, test_program, test_reader, train_ret)\n    if dev_count > 1:\n        # multi cpu/gpu config\n        exec_strategy = fluid.ExecutionStrategy()\n        build_strategy = fluid.compiler.BuildStrategy()\n\n        compiled_prog = fluid.compiler.CompiledProgram(train_program).with_data_parallel(\n            loss_name=train_ret['avg_cost'].name,\n            build_strategy=build_strategy,\n            exec_strategy=exec_strategy\n        )\n    else:\n        compiled_prog = fluid.compiler.CompiledProgram(train_program)\n\n    fetch_list = []\n    for epoch_id in range(args.epoch):\n        for data in train_reader():\n            outputs = exe.run(\n                compiled_prog,\n                fetch_list=fetch_list,\n                feed=data[0],\n            )\n\n    if args.test_data:\n        test_process(exe, test_program, test_reader, train_ret)\n    return test_program, train_ret['crf_decode']\n"
  },
  {
    "path": "python/LAC/prefix_tree.py",
    "content": "# -*- coding: UTF-8 -*-\n################################################################################\n#\n#   Copyright (c) 2020  Baidu, Inc. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\"\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#################################################################################\n\nclass TriedTree(object):\n    \"\"\"实现Tried树的类\n    Attributes:\n        __root: Node类型，Tried树根节点\n    \"\"\"\n\n    def __init__(self):\n        \"\"\"使用单个dict存储tried\"\"\"\n        self.tree = {}\n        \n    def add_word(self, word):\n        \"\"\"添加单词word到Trie树中\"\"\"\n        self.tree[word] = len(word)\n        for i in range(1,len(word)):\n            wfrag = word[:i]\n            self.tree[wfrag] = self.tree.get(wfrag, None)\n\n    def make(self):\n        \"\"\"nothing to do\"\"\"\n        pass\n\n    def search(self, content):\n        \"\"\"后向最大匹配.\n        对content的文本进行多模匹配，返回后向最大匹配的结果.\n        Args:\n            content: string类型, 用于多模匹配的字符串\n        Returns:\n            list类型, 最大匹配单词列表，每个元素为匹配的模式串在句中的起止位置，比如：\n            [(0, 2), [4, 7]]\n        \"\"\"\n        result = []\n        length = len(content)\n        for start in range(length):\n            for end in range(start+1, length+1):\n                pos = self.tree.get(content[start:end], -1)\n                if pos == -1:\n                    break\n                if pos and (len(result)==0 or end > result[-1][1]):\n                    result.append((start, end))\n\n        return result\n\n    def search_all(self, content):\n        \"\"\"多模匹配的完全匹配.\n        对content的文本进行多模匹配，返回所有匹配结果\n        Args:\n            content: string类型, 用于多模匹配的字符串\n        Returns:\n            list类型, 所有匹配单词列表，每个元素为匹配的模式串在句中的起止位置，比如：\n            [(0, 2), [4, 7]]\n        \"\"\"\n        result = []\n        \n        length = len(content)\n        for start in range(length):\n            for end in range(start+1, length+1):\n                pos = self.tree.get(content[start:end], -1)\n                if pos == -1:\n                    break\n                if pos:\n                    result.append((start, end))\n        return result\n\n\nif __name__ == \"__main__\":\n    words = [\"百度\", \"家\", \"家家\", \"高科技\", \"技公\", \"科技\", \"科技公司\"]\n    string = '百度是家高科技公司'\n    tree = TriedTree()\n    for word in words:\n        tree.add_word(word)\n    \n    for begin, end in tree.search(string):\n        print(string[begin:end])"
  },
  {
    "path": "python/LAC/reader.py",
    "content": "# -*- coding: UTF-8 -*-\n################################################################################\n#\n#   Copyright (c) 2020  Baidu, Inc. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\"\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#################################################################################\n\n\"\"\"\nThe file_reader converts raw corpus to input.\n\"\"\"\nimport io\nimport logging\nimport argparse\nimport __future__\n\n\n\ndef load_kv_dict(dict_path,\n                 reverse=False, delimiter=\"\\t\", key_func=None, value_func=None):\n    \"\"\"\n    Load key-value dict from file\n    \"\"\"\n    result_dict = {}\n    with io.open(dict_path, \"r\", encoding='utf8') as file:\n        for line in file:\n            terms = line.strip(\"\\n\").split(delimiter)\n            if len(terms) != 2:\n                continue\n            if reverse:\n                value, key = terms\n            else:\n                key, value = terms\n            # if key in result_dict:\n            #     raise KeyError(\"key duplicated with [%s]\" % (key))\n            if key_func:\n                key = key_func(key)\n            if value_func:\n                value = value_func(value)\n            result_dict[key] = value\n    return result_dict\n\nclass Dataset(object):\n    \"\"\"data reader\"\"\"\n\n    def __init__(self, args, dev_count=10):\n        # read dict\n        self.word2id_dict = load_kv_dict(\n            args.word_dict_path, reverse=True, value_func=int)\n        self.id2word_dict = load_kv_dict(args.word_dict_path)\n        self.label2id_dict = load_kv_dict(\n            args.label_dict_path, reverse=True, value_func=int)\n        self.id2label_dict = load_kv_dict(args.label_dict_path)\n        self.word_replace_dict = load_kv_dict(args.word_rep_dict_path)\n        self.oov_id = self.word2id_dict['OOV']\n        self.model = args.model\n\n        self.args = args\n        self.dev_count = dev_count\n        self.segment_tool = None\n\n    @property\n    def vocab_size(self):\n        \"\"\"vocabuary size\"\"\"\n        return max(self.word2id_dict.values()) + 1\n\n    @property\n    def num_labels(self):\n        \"\"\"num_labels\"\"\"\n        return max(self.label2id_dict.values()) + 1\n\n    def get_num_examples(self, filename):\n        \"\"\"num of line of file\"\"\"\n        return sum(1 for line in open(filename, \"rb\"))\n\n    def parse_tag(self, line):\n        \"\"\"convert tagging data to lac data format\"\"\"\n        tags = []\n        words = []\n\n        items = line.strip().split()\n        for item in items:\n            word = item[:item.rfind('/')]\n            tag = item[item.rfind('/') + 1:]\n            if '/' not in item or len(word) == 0 or len(tag) == 0:\n                logging.warning(\"Data type error: %s\" % line.strip())\n                return [], []\n            tags += [tag + '-B'] + [tag + '-I'] * (len(word) - 1)\n            words.append(word)\n\n        return self.segment_tool.fast_cut(\"\".join(words)), tags\n    \n    def word_to_ids(self, words):\n        \"\"\"convert words to word index\"\"\"\n\n        word_ids = []\n        for word in words:\n            word = self.word_replace_dict.get(word, word)\n            word_id = self.word2id_dict.get(word, self.oov_id)\n            word_ids.append(word_id)\n        return word_ids\n\n    def text_to_ids(self, text):\n        \"\"\"convert text to word index \n           lac/rank using mix char and word granularity\n           seg using char granularity\n        \"\"\"\n        word_ids, word_length = [], []\n\n        for word in text: \n            if word in self.word2id_dict:\n                word_ids += self.word_to_ids([word])\n                word_length.append(len(word))\n            else:\n                word_ids += self.word_to_ids(word)\n                word_length += [1] * len(word)\n\n        return word_ids, word_length\n\n    def label_to_ids(self, labels):\n        \"\"\"convert label to label index\"\"\"\n        label_ids = []\n        for label in labels:\n            if label not in self.label2id_dict:\n                label = \"O\"\n            label_id = self.label2id_dict[label]\n            label_ids.append(label_id)\n        return label_ids\n\n    def file_reader(self, filename, mode=\"train\"):\n        \"\"\"\n        yield (word_idx, target_idx) one by one from file,\n            or yield (word_idx, ) in `infer` mode\n        \"\"\"\n        def wrapper():\n            \"\"\"the wrapper of data generator\"\"\"\n            fread = io.open(filename, \"r\", encoding=\"utf-8\")\n            if mode == \"infer\":\n                for line in fread:\n                    words = line.strip()\n                    word_ids = self.word_to_ids(words)\n                    yield (word_ids,)\n            else:\n                cnt = 0\n                for line in fread:\n                    if (len(line.strip()) == 0):\n                        continue\n                        \n                    texts, labels = self.parse_tag(line)\n                    word_ids, word_length = self.text_to_ids(texts)\n\n                    # 删掉以词粒度处理的多余的词性标签\n                    if len(word_length) != 0:\n                        for current in range(len(word_ids)):\n                            if word_length[current] > 1:\n                                for _ in range(1, word_length[current]):\n                                    labels.pop(current+1)\n                    \n                    label_ids = self.label_to_ids(labels)\n\n                    assert len(word_ids) == len(label_ids)\n                    yield word_ids, label_ids\n                    cnt += 1\n\n                if mode == 'train':\n                    pad_num = self.dev_count - \\\n                        (cnt % self.args.batch_size) % self.dev_count\n                    for i in range(pad_num):\n                        if self.model == 'seg':\n                            yield [self.oov_id], [self.label2id_dict['-S']]\n                        elif self.model == 'lac':\n                            yield [self.oov_id], [self.label2id_dict['O']]\n            fread.close()\n\n        return wrapper\n\nclass SegDataset(Dataset):\n    \"\"\"seg model data reader\"\"\"\n    def __init__(self, args, dev_count=10):\n        Dataset.__init__(self, args, dev_count)\n    \n    def parse_tag(self, line):\n        \"\"\"convert segment data to lac data format\"\"\"\n        tags = []\n        words = line.strip().split()\n\n        for word in words:\n            if len(word) == 1:\n                tags.append('-S')\n            else:\n                tags += ['-B'] + ['-I'] * (len(word) - 2) + ['-E']\n\n        return \"\".join(words), tags\n\nif __name__ == \"__main__\":\n    parser = argparse.ArgumentParser(__doc__)\n    parser.add_argument(\"--word_dict_path\", type=str,\n                        default=\"./conf/word.dic\", help=\"word dict\")\n    parser.add_argument(\"--label_dict_path\", type=str,\n                        default=\"./conf/tag.dic\", help=\"label dict\")\n    parser.add_argument(\"--word_rep_dict_path\", type=str,\n                        default=\"./conf/q2b.dic\", help=\"word replace dict\")\n    args = parser.parse_args()\n    dataset = Dataset(args)\n    data_generator = dataset.file_reader(\"data/train.tsv\")\n    for word_idx, target_idx in data_generator():\n        print(word_idx, target_idx)\n        print(len(word_idx), len(target_idx))\n        break\n"
  },
  {
    "path": "python/LAC/segment.py",
    "content": "# -*- coding: UTF-8 -*-\n################################################################################\n#\n#   Copyright (c) 2020  Baidu, Inc. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\"\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#################################################################################\n\"\"\"\n本文件定义了分词及其实现\n\"\"\"\nimport io\nimport re\nimport sys\nimport logging\nfrom math import log\n\nfrom .prefix_tree import TriedTree\n\n\nre_eng = re.compile('[a-zA-Z0-9]', re.U)\n\ndef load_seg_dict(dict_path):\n    \"\"\"\n    Load profile dict from file and calculate word frequency\n    \"\"\"\n    result_dict = TriedTree()\n    result_total = 0\n\n    with io.open(dict_path, 'r', encoding='utf-8') as f:\n        for line in f:\n            word, count = line.strip().split(' ')\n            result_dict.add_word(word)\n            result_total += int(count)\n\n    return result_dict.tree, log(result_total)\n\nclass Segment(object):\n    def __init__(self, dict_path):\n        super(Segment, self).__init__()\n        \"\"\"\n        Args:\n            self.dict_path: 字典地址\n            self.f_dict   : 前缀字典\n            self.logtotal : 词频总数取log\n            self.length   : 句子长度\n            self.dag      : DAG\n        \"\"\"\n\n        self.dict_path = dict_path\n        self.dag = {} \n        self.length = 0\n\n        self.f_dict, self.logtotal = load_seg_dict(self.dict_path)\n    \n    def fast_get_DAG(self, text):  \n        \"\"\"生成DAG\"\"\"\n        self.length = len(text)\n        self.dag = {_:[_] for _ in range(self.length)}\n\n        for head_word in range(self.length):\n            end_word = head_word + 1\n            word = text[head_word:end_word]\n\n            while end_word <= self.length and word in self.f_dict:\n                if self.f_dict[word]:\n                    self.dag[head_word].append(end_word-1)\n                end_word += 1\n                word = text[head_word:end_word]\n    \n    def fast_cut(self, text):\n        \"\"\"\n        分词\n        Args:\n            route   : 最大路径字典\n            buf     : 临时分词结果\n        Return:\n            segment : 分词结果\n        \"\"\"\n        self.fast_get_DAG(text)\n        route = dict()\n\n        route[self.length] = (0, 0)\n        \n        for idx in range(self.length-1, -1, -1):\n            # 取log防止向下溢出,取过log后除法变为减法\n            route[idx] = max((log(self.f_dict.get(text[idx: _+1]) or 1) -\n                            self.logtotal + route[_+1][0], _) for _ in self.dag[idx])\n\n        incept_idx = 0\n        buf = \"\"\n        segment = []\n        while incept_idx < self.length:\n            end_idx = route[incept_idx][1] + 1\n            l_word = text[incept_idx:end_idx]\n            \n            if re_eng.match(l_word) and len(l_word) == 1:\n                buf += l_word\n                incept_idx = end_idx\n            else:\n                if buf:\n                    segment.append(buf)\n                    buf = \"\"\n                segment.append(l_word)\n                incept_idx = end_idx\n        if buf:\n            segment.append(buf)\n            buf = \"\"\n        return segment"
  },
  {
    "path": "python/LAC/tests/__init__.py",
    "content": ""
  },
  {
    "path": "python/LAC/tests/lac_test.py",
    "content": "from LAC import LAC\n\"\"\"\n本文件测试LAC的分词,词性标注及重要性功能\n\"\"\"\nos.environ['PYTHONIOENCODING'] = 'UTF-8'\n\ndef fun_seg():\n    # 装载分词模型\n    lac = LAC(\"models_general/seg_model\",mode='seg')\n\n    # 单个样本输入，输入为Unicode编码的字符串\n    text = u\"LAC是个优秀的分词工具\"\n    seg_result = lac.run(text)\n    print(seg_result)\n\n    # 批量样本输入, 输入为多个句子组成的list，平均速率会更快\n    texts = [u\"LAC是个优秀的分词工具\", u\"百度是一家高科技公司\"]\n    seg_result = lac.run(texts)\n    print(seg_result)\n\ndef fun_add_word():\n    lac = LAC(model_path='models_general/seg_model', mode='seg')\n    lac.add_word('红红 火火', sep=None)\n    seg_result = lac.run(\"他这一生红红火火了一把\")\n    print(seg_result)\n\ndef run():\n    # 选择使用lac模型\n    lac = LAC(model_path='models_general/lac_model', mode='lac')\n    result = lac.run('百度是一家很好的公司')\n    print(result)\n\ndef rank():\n    # 选择使用rank模型\n    lac = LAC(model_path='models_general/rank_model', mode='rank')\n    result = lac.run('百度是一家很好的公司')\n    print(result)\n\n\n"
  },
  {
    "path": "python/LAC/utils.py",
    "content": "# -*- coding: UTF-8 -*-\n################################################################################\n#\n#   Copyright (c) 2020  Baidu.com, Inc. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\"\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#################################################################################\n\n\"\"\"\n本模块定义了LAC中使用到的工具类函数\n\"\"\"\n\nfrom __future__ import print_function\nimport os\nimport sys\nimport numpy as np\nimport paddle.fluid as fluid\n\ntry:\n    import configparser\nexcept ImportError:\n    import ConfigParser as configparser\n\n\ndef abs_path(path): return os.path.join(\n    os.path.dirname(sys._getframe().f_code.co_filename), path)\n\n\ndef check_cuda(use_cuda):\n    \"\"\"check environment for cuda's using\"\"\"\n\n    err = (\"\\nYou can not set use_cuda = True in the model \"\n           \"because you are using paddlepaddle-cpu.\\n\"\n           \"Please: 1. Install paddlepaddle-gpu to run your models on GPU\"\n           \"or 2. Set use_cuda = False to run models on CPU.\\n\")\n    try:\n        if use_cuda == True and fluid.is_compiled_with_cuda() == False:\n            print(err)\n            sys.exit(1)\n    except Exception as e:\n        pass\n\n\nclass DefaultArgs(object):\n    \"\"\"the default args of model\"\"\"\n\n    def __init__(self, model_path):\n        \"\"\"load config file and init args\"\"\"\n        config = configparser.ConfigParser()\n        conf_path = os.path.join(model_path, \"conf\", \"args.ini\")\n        config.read(conf_path)\n\n        # model's parameter\n        self.word_emb_dim = config.getint(\"NETWORK_CONFIG\", \"word_emb_dim\")\n        self.grnn_hidden_dim = config.getint(\n            \"NETWORK_CONFIG\", \"grnn_hidden_dim\")\n        self.bigru_num = config.getint(\"NETWORK_CONFIG\", \"bigru_num\")\n\n        # train's parameter\n        self.model = config.get(\"TRAIN_CONFIG\", \"model\")\n        self.random_seed = config.getint(\"TRAIN_CONFIG\", \"random_seed\")\n        self.batch_size = config.getint(\"TRAIN_CONFIG\", \"batch_size\")\n        self.epoch = config.getint(\"TRAIN_CONFIG\", \"epoch\")\n        self.use_cuda = config.getboolean(\"TRAIN_CONFIG\", \"use_cuda\")\n        self.traindata_shuffle_buffer = config.getint(\n            \"TRAIN_CONFIG\", \"traindata_shuffle_buffer\")\n        self.base_learning_rate = config.getfloat(\n            \"TRAIN_CONFIG\", \"base_learning_rate\")\n        self.emb_learning_rate = config.getfloat(\n            \"TRAIN_CONFIG\", \"emb_learning_rate\")\n        self.crf_learning_rate = config.getfloat(\n            \"TRAIN_CONFIG\", \"crf_learning_rate\")\n        self.cpu_num = config.getint(\"TRAIN_CONFIG\", \"cpu_num\")\n        self.init_checkpoint = os.path.join(\n            model_path, config.get(\"TRAIN_CONFIG\", \"init_checkpoint\"))\n        self.model_save_dir = os.path.join(model_path, abs_path(\n            config.get(\"TRAIN_CONFIG\", \"model_save_dir\")))\n\n        # data path\n        self.word_dict_path = os.path.join(\n            model_path, config.get(\"DICT_FILE\", \"word_dict_path\"))\n        self.label_dict_path = os.path.join(\n            model_path, config.get(\"DICT_FILE\", \"label_dict_path\"))\n        self.word_rep_dict_path = os.path.join(\n            model_path, config.get(\"DICT_FILE\", \"word_rep_dict_path\"))\n\n\ndef print_arguments(args):\n    \"\"\"none\"\"\"\n    print('-----------  Configuration Arguments -----------')\n    for arg, value in sorted(vars(args).items()):\n        print('%s: %s' % (arg, value))\n    print('------------------------------------------------')\n\n\ndef to_str(string, encoding=\"utf-8\"):\n    \"\"\"convert to str for print\"\"\"\n    if sys.version_info.major == 3:\n        if isinstance(string, bytes):\n            return string.decode(encoding)\n    elif sys.version_info.major == 2:\n        if isinstance(string, unicode):\n            if os.name == 'nt':\n                return string\n            else:\n                return string.encode(encoding)\n    return string\n\n\ndef to_lodtensor(data, place):\n    \"\"\"Convert data in list into lodtensor.\"\"\"\n    seq_lens = [len(seq) for seq in data]\n    cur_len = 0\n    lod = [cur_len]\n    for l in seq_lens:\n        cur_len += l\n        lod.append(cur_len)\n    flattened_data = np.concatenate(data, axis=0).astype(\"int64\")\n    flattened_data = flattened_data.reshape([len(flattened_data), 1])\n    res = fluid.Tensor()\n    res.set(flattened_data, place)\n    res.set_lod([lod])\n    return res\n\n\ndef init_checkpoint(exe, init_checkpoint_path, main_program):\n    \"\"\"Init CheckPoint\"\"\"\n    assert os.path.exists(\n        init_checkpoint_path), \"[%s] cann't be found.\" % init_checkpoint_path\n\n    def existed_persitables(var):\n        \"\"\"If existed presitabels\"\"\"\n        if not fluid.io.is_persistable(var):\n            return False\n        return os.path.exists(os.path.join(init_checkpoint_path, var.name))\n\n    fluid.io.load_vars(\n        exe,\n        init_checkpoint_path,\n        main_program=main_program,\n        predicate=existed_persitables)\n    print(\"Load model from {}\".format(init_checkpoint_path))\n\n\ndef init_pretraining_params(exe,\n                            pretraining_params_path,\n                            main_program):\n    \"\"\"load params of pretrained model, NOT including moment, learning_rate\"\"\"\n    assert os.path.exists(pretraining_params_path\n                          ), \"[%s] cann't be found.\" % pretraining_params_path\n\n    def _existed_params(var):\n        if not isinstance(var, fluid.framework.Parameter):\n            return False\n        return os.path.exists(os.path.join(pretraining_params_path, var.name))\n\n    fluid.io.load_vars(\n        exe,\n        pretraining_params_path,\n        main_program=main_program,\n        predicate=_existed_params)\n    print(\"Load pretraining parameters from {}.\".format(\n        pretraining_params_path))\n"
  },
  {
    "path": "python/README.md",
    "content": "## 工具介绍\nLAC全称Lexical Analysis of Chinese，是百度自然语言处理部研发的一款联合的词法分析工具，实现中文分词、词性标注、专名识别等功能。该工具具有以下特点与优势：\n- **效果好**：通过深度学习模型联合学习分词、词性标注、专名识别任务，词语重要性，整体效果F1值超过0.91，词性标注F1值超过0.94，专名识别F1值超过0.85，效果业内领先。\n- **效率高**：精简模型参数，结合Paddle预测库的性能优化，CPU单线程性能达800QPS，效率业内领先。\n- **可定制**：实现简单可控的干预机制，精准匹配用户词典对模型进行干预。词典支持长片段形式，使得干预更为精准。\n- **调用便捷**：**支持一键安装**，同时提供了Python、Java和C++调用接口与调用示例，实现快速调用和集成。\n- **支持移动端**: 定制超轻量级模型，体积仅为2M，主流千元手机单线程性能达200QPS，满足大多数移动端应用的需求，同等体积量级效果业内领先。\n\n## 安装与使用\n在此我们主要介绍Python安装与使用，其他语言使用：\n- [C++](./c++/README.md)\n- [JAVA](./java/README.md)\n- [Android](./Android/README.md)\n\n### 安装说明\n代码兼容Python2/3\n- 全自动安装: `pip install lac`\n- 半自动下载：先下载[http://pypi.python.org/pypi/lac/](http://pypi.python.org/pypi/lac/)，解压后运行 `python setup.py install`\n- 安装完成后可在命令行输入`lac`或`lac --segonly`,`lac --rank`启动服务，进行快速体验。\n\n  > 国内网络可使用百度源安装，安装速率更快：`pip install lac -i https://mirror.baidu.com/pypi/simple`\n\n### 功能与使用\n#### 分词\n- 代码示例：\n```python\nfrom LAC import LAC\n\n# 装载分词模型\nlac = LAC(mode='seg')\n\n# 单个样本输入，输入为Unicode编码的字符串\ntext = u\"LAC是个优秀的分词工具\"\nseg_result = lac.run(text)\n\n# 批量样本输入, 输入为多个句子组成的list，平均速率会更快\ntexts = [u\"LAC是个优秀的分词工具\", u\"百度是一家高科技公司\"]\nseg_result = lac.run(texts)\n```\n- 输出：\n\n```text\n【单样本】：seg_result = [LAC, 是, 个, 优秀, 的, 分词, 工具]\n【批量样本】：seg_result = [[LAC, 是, 个, 优秀, 的, 分词, 工具], [百度, 是, 一家, 高科技, 公司]]\n```\n\n#### 词性标注与实体识别\n- 代码示例：\n```python\nfrom LAC import LAC\n\n# 装载LAC模型\nlac = LAC(mode='lac')\n\n# 单个样本输入，输入为Unicode编码的字符串\ntext = u\"LAC是个优秀的分词工具\"\nlac_result = lac.run(text)\n\n# 批量样本输入, 输入为多个句子组成的list，平均速率更快\ntexts = [u\"LAC是个优秀的分词工具\", u\"百度是一家高科技公司\"]\nlac_result = lac.run(texts)\n```\n- 输出：\n\n>每个句子的输出其切词结果word_list以及对每个单词的标注tags_list，其格式为（word_list, tags_list)\n```text\n【单样本】： lac_result = ([百度, 是, 一家, 高科技, 公司], [ORG, v, m, n, n])\n【批量样本】：lac_result = [\n                    ([百度, 是, 一家, 高科技, 公司], [ORG, v, m, n, n]),\n                    ([LAC, 是, 个, 优秀, 的, 分词, 工具], [nz, v, q, a, u, n, n])\n                ]\n```\n\n词性和专名类别标签集合如下表，其中我们将最常用的4个专名类别标记为大写的形式：\n\n| 标签 | 含义     | 标签 | 含义     | 标签 | 含义     | 标签 | 含义     |\n| ---- | -------- | ---- | -------- | ---- | -------- | ---- | -------- |\n| n    | 普通名词 | f    | 方位名词 | s    | 处所名词  | nw   | 作品名   |\n| nz   | 其他专名 | v    | 普通动词 | vd   | 动副词   | vn   | 名动词   |\n| a    | 形容词   | ad   | 副形词   | an   | 名形词   | d    | 副词     |\n| m    | 数量词   | q    | 量词     | r    | 代词     | p    | 介词     |\n| c    | 连词     | u    | 助词     | xc   | 其他虚词 | w    | 标点符号 |\n| PER  | 人名     | LOC  | 地名     | ORG  | 机构名   | TIME | 时间     |\n\n#### 词语重要性\n- 代码示例：\n```python\nfrom LAC import LAC\n\n# 装载词语重要性模型\nlac = LAC(mode='rank')\n\n# 单个样本输入，输入为Unicode编码的字符串\ntext = u\"LAC是个优秀的分词工具\"\nrank_result = lac.run(text)\n\n# 批量样本输入, 输入为多个句子组成的list，平均速率会更快\ntexts = [u\"LAC是个优秀的分词工具\", u\"百度是一家高科技公司\"]\nrank_result = lac.run(texts)\n```\n- 输出：\n\n```text\n【单样本】：rank_result = [['LAC', '是', '个', '优秀', '的', '分词', '工具'], \n                        [nz, v, q, a, u, n, n],[3, 0, 0, 2, 0, 3, 1]]\n【批量样本】：rank_result = [\n                    (['LAC', '是', '个', '优秀', '的', '分词', '工具'], \n                     [nz, v, q, a, u, n, n], [3, 0, 0, 2, 0, 3, 1]), \n                    (['百度', '是', '一家', '高科技', '公司'], \n                     [ORG, v, m, n, n], [3, 0, 2, 3, 1])\n                ]\n```\n词语重要性程度各类别标签集合如下表，我们使用4-Level梯度进行分类：\n\n| 标签 | 含义       | 常见于词性|\n| ---- | --------  | ----   | \n| 0    | query中表述的冗余词   |  p, w, xc ...    | \n| 1    | query中限定较弱的词   |  r, c, u ...     | \n| 2    | query中强限定的词     |  n, s, v ...     | \n| 3    | query中的核心词       |  nz, nw, LOC ... | \n\n\n#### 定制化功能\n\n在模型输出的基础上，LAC还支持用户配置定制化的切分结果和专名类型输出。当模型预测匹配到词典的中的item时，会用定制化的结果替代原有结果。为了实现更加精确的匹配，我们支持以由多个单词组成的长片段作为一个item。\n\n我们通过装载词典文件的形式实现该功能，词典文件每行表示一个定制化的item，由一个单词或多个连续的单词组成，每个单词后使用'/'表示标签，如果没有'/'标签则会使用模型默认的标签。每个item单词数越多，干预效果会越精准。\n\n- 词典文件示例\n\n  > 这里仅作为示例，展现各种需求情况下的结果。后续还将开放以通配符配置词典的模式，敬请期待。\n```text\n春天/SEASON\n花/n 开/v\n秋天的风\n落 阳\n```\n- 代码示例\n```python\nfrom LAC import LAC\nlac = LAC()\n\n# 装载干预词典, sep参数表示词典文件采用的分隔符，为None时默认使用空格或制表符'\\t'\nlac.load_customization('custom.txt', sep=None)\n\n# 干预后结果\ncustom_result = lac.run(u\"春天的花开秋天的风以及冬天的落阳\")\n```\n\n- 以输入“春天的花开秋天的风以及冬天的落阳”为例，原本输出结果为：\n```text\n春天/TIME 的/u 花开/v 秋天/TIME 的/u 风/n 以及/c 冬天/TIME 的/u 落阳/n\n```\n- 添加示例中的词典文件后的结果为：\n\n```text\n春天/SEASON 的/u 花/n 开/v 秋天的风/n 以及/c 冬天/TIME 的/u 落/n 阳/n\n```\n\n#### 增量训练\n我们也提供了增量训练的接口，用户可以使用自己的数据，进行增量训练，首先需要将数据转换为模型输入的格式，并且所有数据文件均为\"UTF-8\"编码：\n\n##### 1. 分词训练\n\n- 数据样例\n\n  >  与大多数开源分词数据集格式一致，使用空格作为单词切分标记，如下所示：\n\n```text\nLAC 是 个 优秀 的 分词 工具 。\n百度 是 一家 高科技 公司 。\n春天 的 花开 秋天 的 风 以及 冬天 的 落阳 。\n```\n\n- 代码示例\n\n```Python\nfrom LAC import LAC\n\n# 选择使用分词模型\nlac = LAC(mode = 'seg')\n\n# 训练和测试数据集，格式一致\ntrain_file = \"./data/seg_train.tsv\"\ntest_file = \"./data/seg_test.tsv\"\nlac.train(model_save_dir='./my_seg_model/',train_data=train_file, test_data=test_file)\n\n# 使用自己训练好的模型\nmy_lac = LAC(model_path='my_seg_model')\n```\n\n##### 2. 词法分析训练\n\n- 样例数据\n\n  > 在分词数据的基础上，每个单词以“/type”的形式标记其词性或实体类别。值得注意的是，词法分析的训练目前仅支持标签体系与我们一致的数据。后续也会开放支持新的标签体系，敬请期待。\n\n```text\nLAC/nz 是/v 个/q 优秀/a 的/u 分词/n 工具/n 。/w\n百度/ORG 是/v 一家/m 高科技/n 公司/n 。/w\n春天/TIME 的/u 花开/v 秋天/TIME 的/u 风/n 以及/c 冬天/TIME 的/u 落阳/n 。/w\n```\n\n- 代码示例\n```Python\nfrom LAC import LAC\n\n# 选择使用默认的词法分析模型\nlac = LAC()\n\n# 训练和测试数据集，格式一致\ntrain_file = \"./data/lac_train.tsv\"\ntest_file = \"./data/lac_test.tsv\"\nlac.train(model_save_dir='./my_lac_model/',train_data=train_file, test_data=test_file)\n\n# 使用自己训练好的模型\nmy_lac = LAC(model_path='my_lac_model')\n```\n\n文件结构\n---\n\n```text\n.\n├── python                      # Python调用的脚本\n├── c++                         # C++调用的代码\n├── java                        # Java调用的代码\n├── Android                     # Android调用的示例\n├── README.md                   # 本文件\n└── CMakeList.txt               # 编译C++和Java调用的脚本\n```\n\n## 在论文中引用LAC\n\n如果您的学术工作成果中使用了LAC，请您增加下述引用。我们非常欣慰LAC能够对您的学术工作带来帮助。\n\n```text\n@article{jiao2018LAC,\n\ttitle={Chinese Lexical Analysis with Deep Bi-GRU-CRF Network},\n\tauthor={Jiao, Zhenyu and Sun, Shuqi and Sun, Ke},\n\tjournal={arXiv preprint arXiv:1807.01882},\n\tyear={2018},\n\turl={https://arxiv.org/abs/1807.01882}\n}\n```\n\n贡献代码\n---\n我们欢迎开发者向LAC贡献代码。如果您开发了新功能，发现了bug……欢迎提交Pull request与issue到Github。\n"
  },
  {
    "path": "python/setup.cfg",
    "content": "[metadata]\nname = lac\nauthor = Baidu NLP\nauthor_email = nlp-fenci@baidu.com\nversion = 2.1.2\ndescription = A chinese lexical analysis tool by Baidu NLP.\nlong_description = file: README.md\nlong_description_content_type = text/markdown\nhome_page = https://github.com/baidu/lac\n\n[options]\npackages = find:\ninclude_package_data = True\nzip_safe = False\n\n[options.entry_points]\nconsole_scripts = \n\tlac = LAC.cmdline:main\n\n[sdist]\ndist_dir = output/dist\n\n[bdist_wheel]\nuniversal = 1\ndist_dir = output/dist\n\n[egg_info]\ntag_build = \ntag_date = 0\ntag_svn_revision = 0\n\n"
  },
  {
    "path": "python/setup.py",
    "content": "# -*- coding: UTF-8 -*-\n################################################################################\n#\n#   Copyright (c) 2020  Baidu, Inc. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\"\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#################################################################################\n\n\"\"\"\nSetup script.\n\"\"\"\n\nfrom setuptools import setup\nimport pkg_resources\nfrom io import open\n\n# 判断paddle安装版本，对版本进行设置\ninstall_requires = []\ntry:\n    import paddle\n\n    # 若版本太低，设置版本的更新\n    if paddle.__version__ < '1.6.0':\n        installed_packages = pkg_resources.working_set\n        paddle_pkgs = [i.key for i in installed_packages if \"paddle\" in i.key]\n\n        if \"paddlepaddle-gpu\" in paddle_pkgs:\n            install_requires = ['paddlepaddle-gpu>=1.6']\n        elif \"paddlepaddle-tiny\" in paddle_pkgs:\n            install_requires = ['paddlepaddle-tiny>=1.6']\n        else:\n            install_requires = ['paddlepaddle>=1.6']\n\n\nexcept ImportError:\n    install_requires = ['paddlepaddle>=1.6']\n\n\nwith open(\"README.md\", \"r\", encoding='utf8') as fh:\n    long_description = fh.read()\n\nsetup(\n    name=\"LAC\",\n    version=\"2.1.2\",\n    author=\"Baidu NLP\",\n    author_email=\"nlp-fenci@baidu.com\",\n    description=\"A chinese lexical analysis tool by Baidu NLP.\",\n    long_description=long_description,\n    long_description_content_type=\"text/markdown\",\n    url=\"https://github.com/baidu/lac\",\n    install_requires=install_requires,\n    packages=['LAC'],\n    package_dir={'LAC': 'LAC'},\n    package_data={'LAC': ['*.py', 'lac_model/*/*', 'seg_model/*/*', 'rank_model/*/*']},\n    platforms=\"any\",\n    license='Apache 2.0',\n    keywords=('lac chinese lexical analysis'),\n    classifiers=[\n            'License :: OSI Approved :: Apache Software License',\n            'Programming Language :: Python',\n            'Programming Language :: Python :: 2',\n            'Programming Language :: Python :: 2.7',\n            'Programming Language :: Python :: 3',\n            'Programming Language :: Python :: 3.5',\n            'Programming Language :: Python :: 3.6',\n            'Programming Language :: Python :: 3.7',\n    ],\n)\n"
  }
]