[feature](inverted-index) Add Japanese (Kuromoji) morphological analyzer - #64667
Conversation
|
Thank you for your contribution to Apache Doris. Please clearly describe your PR:
|
|
run buildall |
|
@nishant94 have you tried icu analyzer? because I think icu could handle many different languages. |
@yiguolei The ICU Analyzer is not good as the Kuromoji. There is huge difference between icu and kuromoji when it comes to morphology of the Japanese words. So I think it worth it adding this new parser. |
|
Is the code under |
This is original code but it is modeled on Apache Lucene's kuromoji. |
FE UT Coverage ReportIncrement line coverage |
389fcfb to
b79db3c
Compare
|
run buildall |
BE UT Coverage ReportIncrement line coverage Increment coverage report
|
BE UT Coverage ReportIncrement line coverage Increment coverage report
|
BE Regression && UT Coverage ReportIncrement line coverage Increment coverage report
|
FE Regression Coverage ReportIncrement line coverage |
|
run buildall |
FE UT Coverage ReportIncrement line coverage |
FE Regression Coverage ReportIncrement line coverage |
BE UT Coverage ReportIncrement line coverage Increment coverage report
|
BE Regression && UT Coverage ReportIncrement line coverage Increment coverage report
|
db0ee69 to
06b4ef6
Compare
|
run buildall |
FE UT Coverage ReportIncrement line coverage |
BE UT Coverage ReportIncrement line coverage Increment coverage report
|
BE Regression && UT Coverage ReportIncrement line coverage Increment coverage report
|
- Modified CMake configuration to conditionally include the Kuromoji dictionary files only for non-test builds (MAKE_TEST=ON). - Adjusted the custom target for generating the Kuromoji dictionary to reflect the new conditional behavior, ensuring it remains a manual target during unit-test builds.
- Added checks for empty trie and out-of-range category mappings in the Kuromoji dictionary. - Updated tests
- Added logic to return the Kuromoji search mode based on the analyzer property. - Updated unit tests accordingly.
- This enhancement ensures that the necessary Kuromoji dictionary source is available for builds, improving the setup process for users.
- Updated test cases in `test_japanese_analyzer.groovy` to use query-time (qt_) assertions for better readability and maintainability.
- Introduced a penalty calculation mechanism for segmenting words based on the analyzer mode, improving the accuracy of word segmentation. - Added caching for the current same-category run's byte end to optimize processing of grouped unknown words, reducing unnecessary rescans.
- Moved mecab-ipadic staging into a conditional block based on the BUILD_BE flag.
- Refactored the logic for setting the Kuromoji analyzer mode to ensure it defaults to the search mode when the parser mode is empty or set to coarse granularity.
- Introduced sorting of CSV file paths before processing to ensure consistent order. - Enhanced error handling during lexicon parsing, including detailed error messages for failed parses. - Added sorting of BuilderWord entries by cost and IDs.
- Implemented a new utility function to decode the first UTF-8 code point from a given string view, enhancing character processing capabilities. - Updated the KuromojiTokenizer to skip unknown tokens based on their character category, improving tokenization accuracy.
- Introduced a new executable `kuromoji_build_dict` to compile the UTF-8 mecab-ipadic source into binary files. - Added custom commands and targets to generate the Kuromoji dictionary, ensuring it is built as part of the overall project unless in test mode.
- Updated the CMake configuration to prepend the Kuromoji JVM library directory to the DYLD_LIBRARY_PATH and LD_LIBRARY_PATH environment variables during the dictionary generation process.
- Updated CMake configuration to set DYLD_LIBRARY_PATH and LD_LIBRARY_PATH for better library management during dictionary generation. - Improved README documentation for manual dictionary regeneration steps. - Refactored the Kuromoji dictionary loading logic to cache only successful loads, enhancing error handling. - Added assertions in the Japanese analyzer tests to ensure proper configuration and cleanup of the Kuromoji analyzer state.
- Replaced `qt_` queries with direct SQL calls and assertions to validate results in the Japanese analyzer test suite.
- Updated the build script to allow compilation of the Kuromoji dictionary when the COMPILE_BENCH flag is set. - Modified the dictionary building logic to write temporary files before renaming them atomically, improving reliability during the build process. - Ensured that the mecab-ipadic staging in the third-party build script uses a temporary directory for safer file operations.
…d validation - Enhanced the `decode_utf8` function to include additional validation for continuation bytes, ensuring proper handling of malformed UTF-8 input. - Updated the `first_codepoint` function in `KuromojiTokenizer` to align with the new decoding logic, improving consistency in character processing. - Introduced a Unicode-aware lowercasing function that utilizes ICU for better text normalization, ensuring compatibility with other analyzers.
- Added 2-Clause BSD license information for the Darts-clone library in LICENSE.txt and NOTICE.txt. - Updated the Kuromoji analyzer to support the new 'kuromoji' parser type in function_tokenize.cpp. - Improved character category handling in kuromoji_viterbi.cpp to include KANJINUMERIC. - Adjusted CMake configuration to define the source dictionary directory for Kuromoji tests. - Updated test logic to accommodate the new dictionary directory definition. - Enhanced LICENSE-dist.txt to include Darts-clone and mecab-ipadic details.
091be27 to
b91e455
Compare
|
run buildall |
BE UT Coverage ReportIncrement line coverage Increment coverage report
|
BE Regression && UT Coverage ReportIncrement line coverage Increment coverage report
|
|
PR approved by at least one committer and no changes requested. |
…k and SNII_CRC32C_X86 -Wundef (#67451) ### What problem does this PR solve? Issue Number: close #67448, close #67445 Related PR: #64667 (introduced `kuromoji_build_dict`), #66052 (introduced the `SNII_CRC32C_X86` test seam), #66615 (the macOS arm64 allocator workaround this PR reuses) Problem Summary: Two BE build failures on arm64, both found while building on Apple Silicon. **1. `kuromoji_build_dict` fails to link on macOS arm64 (#67448, introduced by #64667)** `sh build.sh --be` fails while linking `bin/kuromoji_build_dict`: ``` ld: fixup error (kind=arm64_b26) at '__ZN8tcmallocL14memalign_pagesEmmbb'+0x1DC from libtcmalloc.a[2](libtcmalloc_la-tcmalloc.o), B/BL out of range (displacement=-135695688, max is +/-128MB), from 0x10816FF98 to 0x100007250 ('___clang_call_terminate') __TEXT addr=0x100000000, size=0x008310000 google_malloc addr=0x10816eac0, size=0x0000014fc malloc_hook addr=0x10816ffbc, size=0x0000001dc ``` The offline dictionary converter only calls the kuromoji builder/parser, but those return `Status`, and `Status` reaches `config.cpp` (-> `ExecEnv`), `status.cpp` (-> thrift/protobuf/`BackendOptions`) and `stack_util.cpp`, so the tool's link closure is effectively the whole BE and its `__TEXT` exceeds arm64's +/-128 MB direct-branch reach. Apple's linker lays tcmalloc's custom `google_malloc` / `malloc_hook` sections out after `__text` and cannot insert branch islands there, so the branch from tcmalloc back to `___clang_call_terminate` at the start of `__TEXT` cannot be relaxed. The failed link leaves the four dictionary files ungenerated, the install-time guard fires, and no `output/` is produced. The triage comment on #67448 reports the same failure on the `macos-15` runner of the `BE UT (macOS)` workflow. Trimming the tool's link line (the issue's first suggestion) is not possible without refactoring `Status`, so this applies the #66615 treatment per target: on macOS arm64 the tool links against the system allocator, and `gperftools_stubs.cpp` supplies the few gperftools symbols that are still referenced unconditionally. `doris_be` keeps tcmalloc, Linux link lines are unchanged, `kuromoji_dict` stays in `ALL` and the install-time file check stays. **2. `SNII_CRC32C_X86` is undefined on non-x86 targets (#67445, introduced by #66052)** `be/src/storage/index/snii/encoding/crc32c.cpp` tests `SNII_CRC32C_X86` with `#if` but only defines it on x86_64. The BE compiles with `-Wundef -Werror`, so on aarch64 the four `#if` sites fail: ``` crc32c.cpp:105:5: error: 'SNII_CRC32C_X86' is not defined, evaluates to 0 [-Werror,-Wundef] ``` The file is `BE_TEST`-only, so `run-be-ut.sh` cannot build on Apple Silicon or Linux aarch64, while CI never sees it (the only aarch64 workflow builds with `MAKE_TEST=OFF`). Define the flag as `0` on the other branch: the x86 branch is unchanged, and the non-x86 build keeps only the portable slice-by-8 reference path, which the `hw_*` seams already fall back to.
What problem does this PR solve?
Issue Number: #64646
Related PR: None
Problem Summary:
Doris has no Japanese-aware tokenizer for the inverted index. Japanese text has no spaces between words, so the existing parsers can't segment it and
MATCH/MATCH_PHRASEon Japanese columns end up with poor recall and precision.This PR adds a built-in
kuromojiparser for Japanese, in the same style as the existing Chinese IK analyzer. It's opt-in per column:After indexing, MATCH, MATCH_PHRASE and TOKENIZE() run against the segmented Japanese terms.
How it works:
be/src/storage/index/inverted/analyzer/kuromoji/, so there's no JVM on the indexing path. KuromojiAnalyzer / KuromojiTokenizer mirror the IK analyzer/tokenizer, with a Viterbi cost-model segmenter over the IPADIC connection-cost matrix.Dictionary source is mecab-ipadic-2.7.0-20070801 (NAIST-2003 license, the same lexicon Lucene kuromoji uses).
Release note
Support Japanese text tokenization in the inverted index via a new kuromoji parser (
PROPERTIES("parser"="kuromoji")), withsearch/normal/extendedmodes.Check List (For Author)
parser="kuromoji".Check List (For Reviewer who merge this PR)