diff options
Diffstat (limited to 'sphinx/search/ja.py')
-rw-r--r-- | sphinx/search/ja.py | 531 |
1 files changed, 531 insertions, 0 deletions
diff --git a/sphinx/search/ja.py b/sphinx/search/ja.py new file mode 100644 index 0000000..de221ce --- /dev/null +++ b/sphinx/search/ja.py @@ -0,0 +1,531 @@ +"""Japanese search language: includes routine to split words.""" + +# Python Version of TinySegmenter +# (http://chasen.org/~taku/software/TinySegmenter/) +# TinySegmenter is super compact Japanese tokenizer. +# +# TinySegmenter was originally developed by Taku Kudo <taku(at)chasen.org>. +# Python Version was developed by xnights <programming.magic(at)gmail.com>. +# For details, see http://programming-magic.com/?id=170 + +from __future__ import annotations + +import os +import re +import sys +from typing import TYPE_CHECKING, Any, Dict, List + +try: + import MeCab + native_module = True +except ImportError: + native_module = False + +try: + import janome.tokenizer + janome_module = True +except ImportError: + janome_module = False + +from sphinx.errors import ExtensionError, SphinxError +from sphinx.search import SearchLanguage +from sphinx.util import import_object + + +class BaseSplitter: + def __init__(self, options: dict) -> None: + self.options = options + + def split(self, input: str) -> list[str]: + """ + :param str input: + :return: + :rtype: list[str] + """ + raise NotImplementedError + + +class MecabSplitter(BaseSplitter): + def __init__(self, options: dict) -> None: + super().__init__(options) + self.ctypes_libmecab: Any = None + self.ctypes_mecab: Any = None + if not native_module: + self.init_ctypes(options) + else: + self.init_native(options) + self.dict_encode = options.get('dic_enc', 'utf-8') + + def split(self, input: str) -> list[str]: + if native_module: + result = self.native.parse(input) + else: + result = self.ctypes_libmecab.mecab_sparse_tostr( + self.ctypes_mecab, input.encode(self.dict_encode)) + return result.split(' ') + + def init_native(self, options: dict) -> None: + param = '-Owakati' + dict = options.get('dict') + if dict: + param += ' -d %s' % dict + self.native = MeCab.Tagger(param) + + def init_ctypes(self, options: dict) -> None: + import ctypes.util + + lib = options.get('lib') + + if lib is None: + if sys.platform.startswith('win'): + libname = 'libmecab.dll' + else: + libname = 'mecab' + libpath = ctypes.util.find_library(libname) + elif os.path.basename(lib) == lib: + libpath = ctypes.util.find_library(lib) + else: + libpath = None + if os.path.exists(lib): + libpath = lib + if libpath is None: + raise RuntimeError('MeCab dynamic library is not available') + + param = 'mecab -Owakati' + dict = options.get('dict') + if dict: + param += ' -d %s' % dict + + fs_enc = sys.getfilesystemencoding() or sys.getdefaultencoding() + + self.ctypes_libmecab = ctypes.CDLL(libpath) + self.ctypes_libmecab.mecab_new2.argtypes = (ctypes.c_char_p,) + self.ctypes_libmecab.mecab_new2.restype = ctypes.c_void_p + self.ctypes_libmecab.mecab_sparse_tostr.argtypes = (ctypes.c_void_p, ctypes.c_char_p) + self.ctypes_libmecab.mecab_sparse_tostr.restype = ctypes.c_char_p + self.ctypes_mecab = self.ctypes_libmecab.mecab_new2(param.encode(fs_enc)) + if self.ctypes_mecab is None: + raise SphinxError('mecab initialization failed') + + def __del__(self) -> None: + if self.ctypes_libmecab: + self.ctypes_libmecab.mecab_destroy(self.ctypes_mecab) + + +class JanomeSplitter(BaseSplitter): + def __init__(self, options: dict) -> None: + super().__init__(options) + self.user_dict = options.get('user_dic') + self.user_dict_enc = options.get('user_dic_enc', 'utf8') + self.init_tokenizer() + + def init_tokenizer(self) -> None: + if not janome_module: + raise RuntimeError('Janome is not available') + self.tokenizer = janome.tokenizer.Tokenizer(udic=self.user_dict, udic_enc=self.user_dict_enc) + + def split(self, input: str) -> list[str]: + result = ' '.join(token.surface for token in self.tokenizer.tokenize(input)) + return result.split(' ') + + +class DefaultSplitter(BaseSplitter): + patterns_ = {re.compile(pattern): value for pattern, value in { + '[一二三四五六七八九十百千万億兆]': 'M', + '[一-龠々〆ヵヶ]': 'H', + '[ぁ-ん]': 'I', + '[ァ-ヴーア-ン゙ー]': 'K', + '[a-zA-Za-zA-Z]': 'A', + '[0-90-9]': 'N', + }.items()} + BIAS__ = -332 + BC1__ = {'HH': 6, 'II': 2461, 'KH': 406, 'OH': -1378} + BC2__ = {'AA': -3267, 'AI': 2744, 'AN': -878, 'HH': -4070, 'HM': -1711, + 'HN': 4012, 'HO': 3761, 'IA': 1327, 'IH': -1184, 'II': -1332, + 'IK': 1721, 'IO': 5492, 'KI': 3831, 'KK': -8741, 'MH': -3132, + 'MK': 3334, 'OO': -2920} + BC3__ = {'HH': 996, 'HI': 626, 'HK': -721, 'HN': -1307, 'HO': -836, 'IH': -301, + 'KK': 2762, 'MK': 1079, 'MM': 4034, 'OA': -1652, 'OH': 266} + BP1__ = {'BB': 295, 'OB': 304, 'OO': -125, 'UB': 352} + BP2__ = {'BO': 60, 'OO': -1762} + BQ1__ = {'BHH': 1150, 'BHM': 1521, 'BII': -1158, 'BIM': 886, 'BMH': 1208, + 'BNH': 449, 'BOH': -91, 'BOO': -2597, 'OHI': 451, 'OIH': -296, + 'OKA': 1851, 'OKH': -1020, 'OKK': 904, 'OOO': 2965} + BQ2__ = {'BHH': 118, 'BHI': -1159, 'BHM': 466, 'BIH': -919, 'BKK': -1720, + 'BKO': 864, 'OHH': -1139, 'OHM': -181, 'OIH': 153, 'UHI': -1146} + BQ3__ = {'BHH': -792, 'BHI': 2664, 'BII': -299, 'BKI': 419, 'BMH': 937, + 'BMM': 8335, 'BNN': 998, 'BOH': 775, 'OHH': 2174, 'OHM': 439, 'OII': 280, + 'OKH': 1798, 'OKI': -793, 'OKO': -2242, 'OMH': -2402, 'OOO': 11699} + BQ4__ = {'BHH': -3895, 'BIH': 3761, 'BII': -4654, 'BIK': 1348, 'BKK': -1806, + 'BMI': -3385, 'BOO': -12396, 'OAH': 926, 'OHH': 266, 'OHK': -2036, + 'ONN': -973} + BW1__ = {',と': 660, ',同': 727, 'B1あ': 1404, 'B1同': 542, '、と': 660, + '、同': 727, '」と': 1682, 'あっ': 1505, 'いう': 1743, 'いっ': -2055, + 'いる': 672, 'うし': -4817, 'うん': 665, 'から': 3472, 'がら': 600, + 'こう': -790, 'こと': 2083, 'こん': -1262, 'さら': -4143, 'さん': 4573, + 'した': 2641, 'して': 1104, 'すで': -3399, 'そこ': 1977, 'それ': -871, + 'たち': 1122, 'ため': 601, 'った': 3463, 'つい': -802, 'てい': 805, + 'てき': 1249, 'でき': 1127, 'です': 3445, 'では': 844, 'とい': -4915, + 'とみ': 1922, 'どこ': 3887, 'ない': 5713, 'なっ': 3015, 'など': 7379, + 'なん': -1113, 'にし': 2468, 'には': 1498, 'にも': 1671, 'に対': -912, + 'の一': -501, 'の中': 741, 'ませ': 2448, 'まで': 1711, 'まま': 2600, + 'まる': -2155, 'やむ': -1947, 'よっ': -2565, 'れた': 2369, 'れで': -913, + 'をし': 1860, 'を見': 731, '亡く': -1886, '京都': 2558, '取り': -2784, + '大き': -2604, '大阪': 1497, '平方': -2314, '引き': -1336, '日本': -195, + '本当': -2423, '毎日': -2113, '目指': -724, 'B1あ': 1404, 'B1同': 542, + '」と': 1682} + BW2__ = {'..': -11822, '11': -669, '――': -5730, '−−': -13175, 'いう': -1609, + 'うか': 2490, 'かし': -1350, 'かも': -602, 'から': -7194, 'かれ': 4612, + 'がい': 853, 'がら': -3198, 'きた': 1941, 'くな': -1597, 'こと': -8392, + 'この': -4193, 'させ': 4533, 'され': 13168, 'さん': -3977, 'しい': -1819, + 'しか': -545, 'した': 5078, 'して': 972, 'しな': 939, 'その': -3744, + 'たい': -1253, 'たた': -662, 'ただ': -3857, 'たち': -786, 'たと': 1224, + 'たは': -939, 'った': 4589, 'って': 1647, 'っと': -2094, 'てい': 6144, + 'てき': 3640, 'てく': 2551, 'ては': -3110, 'ても': -3065, 'でい': 2666, + 'でき': -1528, 'でし': -3828, 'です': -4761, 'でも': -4203, 'とい': 1890, + 'とこ': -1746, 'とと': -2279, 'との': 720, 'とみ': 5168, 'とも': -3941, + 'ない': -2488, 'なが': -1313, 'など': -6509, 'なの': 2614, 'なん': 3099, + 'にお': -1615, 'にし': 2748, 'にな': 2454, 'によ': -7236, 'に対': -14943, + 'に従': -4688, 'に関': -11388, 'のか': 2093, 'ので': -7059, 'のに': -6041, + 'のの': -6125, 'はい': 1073, 'はが': -1033, 'はず': -2532, 'ばれ': 1813, + 'まし': -1316, 'まで': -6621, 'まれ': 5409, 'めて': -3153, 'もい': 2230, + 'もの': -10713, 'らか': -944, 'らし': -1611, 'らに': -1897, 'りし': 651, + 'りま': 1620, 'れた': 4270, 'れて': 849, 'れば': 4114, 'ろう': 6067, + 'われ': 7901, 'を通': -11877, 'んだ': 728, 'んな': -4115, '一人': 602, + '一方': -1375, '一日': 970, '一部': -1051, '上が': -4479, '会社': -1116, + '出て': 2163, '分の': -7758, '同党': 970, '同日': -913, '大阪': -2471, + '委員': -1250, '少な': -1050, '年度': -8669, '年間': -1626, '府県': -2363, + '手権': -1982, '新聞': -4066, '日新': -722, '日本': -7068, '日米': 3372, + '曜日': -601, '朝鮮': -2355, '本人': -2697, '東京': -1543, '然と': -1384, + '社会': -1276, '立て': -990, '第に': -1612, '米国': -4268, '11': -669} + BW3__ = {'あた': -2194, 'あり': 719, 'ある': 3846, 'い.': -1185, 'い。': -1185, + 'いい': 5308, 'いえ': 2079, 'いく': 3029, 'いた': 2056, 'いっ': 1883, + 'いる': 5600, 'いわ': 1527, 'うち': 1117, 'うと': 4798, 'えと': 1454, + 'か.': 2857, 'か。': 2857, 'かけ': -743, 'かっ': -4098, 'かに': -669, + 'から': 6520, 'かり': -2670, 'が,': 1816, 'が、': 1816, 'がき': -4855, + 'がけ': -1127, 'がっ': -913, 'がら': -4977, 'がり': -2064, 'きた': 1645, + 'けど': 1374, 'こと': 7397, 'この': 1542, 'ころ': -2757, 'さい': -714, + 'さを': 976, 'し,': 1557, 'し、': 1557, 'しい': -3714, 'した': 3562, + 'して': 1449, 'しな': 2608, 'しま': 1200, 'す.': -1310, 'す。': -1310, + 'する': 6521, 'ず,': 3426, 'ず、': 3426, 'ずに': 841, 'そう': 428, + 'た.': 8875, 'た。': 8875, 'たい': -594, 'たの': 812, 'たり': -1183, + 'たる': -853, 'だ.': 4098, 'だ。': 4098, 'だっ': 1004, 'った': -4748, + 'って': 300, 'てい': 6240, 'てお': 855, 'ても': 302, 'です': 1437, + 'でに': -1482, 'では': 2295, 'とう': -1387, 'とし': 2266, 'との': 541, + 'とも': -3543, 'どう': 4664, 'ない': 1796, 'なく': -903, 'など': 2135, + 'に,': -1021, 'に、': -1021, 'にし': 1771, 'にな': 1906, 'には': 2644, + 'の,': -724, 'の、': -724, 'の子': -1000, 'は,': 1337, 'は、': 1337, + 'べき': 2181, 'まし': 1113, 'ます': 6943, 'まっ': -1549, 'まで': 6154, + 'まれ': -793, 'らし': 1479, 'られ': 6820, 'るる': 3818, 'れ,': 854, + 'れ、': 854, 'れた': 1850, 'れて': 1375, 'れば': -3246, 'れる': 1091, + 'われ': -605, 'んだ': 606, 'んで': 798, 'カ月': 990, '会議': 860, + '入り': 1232, '大会': 2217, '始め': 1681, '市': 965, '新聞': -5055, + '日,': 974, '日、': 974, '社会': 2024, 'カ月': 990} + TC1__ = {'AAA': 1093, 'HHH': 1029, 'HHM': 580, 'HII': 998, 'HOH': -390, + 'HOM': -331, 'IHI': 1169, 'IOH': -142, 'IOI': -1015, 'IOM': 467, + 'MMH': 187, 'OOI': -1832} + TC2__ = {'HHO': 2088, 'HII': -1023, 'HMM': -1154, 'IHI': -1965, + 'KKH': 703, 'OII': -2649} + TC3__ = {'AAA': -294, 'HHH': 346, 'HHI': -341, 'HII': -1088, 'HIK': 731, + 'HOH': -1486, 'IHH': 128, 'IHI': -3041, 'IHO': -1935, 'IIH': -825, + 'IIM': -1035, 'IOI': -542, 'KHH': -1216, 'KKA': 491, 'KKH': -1217, + 'KOK': -1009, 'MHH': -2694, 'MHM': -457, 'MHO': 123, 'MMH': -471, + 'NNH': -1689, 'NNO': 662, 'OHO': -3393} + TC4__ = {'HHH': -203, 'HHI': 1344, 'HHK': 365, 'HHM': -122, 'HHN': 182, + 'HHO': 669, 'HIH': 804, 'HII': 679, 'HOH': 446, 'IHH': 695, + 'IHO': -2324, 'IIH': 321, 'III': 1497, 'IIO': 656, 'IOO': 54, + 'KAK': 4845, 'KKA': 3386, 'KKK': 3065, 'MHH': -405, 'MHI': 201, + 'MMH': -241, 'MMM': 661, 'MOM': 841} + TQ1__ = {'BHHH': -227, 'BHHI': 316, 'BHIH': -132, 'BIHH': 60, 'BIII': 1595, + 'BNHH': -744, 'BOHH': 225, 'BOOO': -908, 'OAKK': 482, 'OHHH': 281, + 'OHIH': 249, 'OIHI': 200, 'OIIH': -68} + TQ2__ = {'BIHH': -1401, 'BIII': -1033, 'BKAK': -543, 'BOOO': -5591} + TQ3__ = {'BHHH': 478, 'BHHM': -1073, 'BHIH': 222, 'BHII': -504, 'BIIH': -116, + 'BIII': -105, 'BMHI': -863, 'BMHM': -464, 'BOMH': 620, 'OHHH': 346, + 'OHHI': 1729, 'OHII': 997, 'OHMH': 481, 'OIHH': 623, 'OIIH': 1344, + 'OKAK': 2792, 'OKHH': 587, 'OKKA': 679, 'OOHH': 110, 'OOII': -685} + TQ4__ = {'BHHH': -721, 'BHHM': -3604, 'BHII': -966, 'BIIH': -607, 'BIII': -2181, + 'OAAA': -2763, 'OAKK': 180, 'OHHH': -294, 'OHHI': 2446, 'OHHO': 480, + 'OHIH': -1573, 'OIHH': 1935, 'OIHI': -493, 'OIIH': 626, 'OIII': -4007, + 'OKAK': -8156} + TW1__ = {'につい': -4681, '東京都': 2026} + TW2__ = {'ある程': -2049, 'いった': -1256, 'ころが': -2434, 'しょう': 3873, + 'その後': -4430, 'だって': -1049, 'ていた': 1833, 'として': -4657, + 'ともに': -4517, 'もので': 1882, '一気に': -792, '初めて': -1512, + '同時に': -8097, '大きな': -1255, '対して': -2721, '社会党': -3216} + TW3__ = {'いただ': -1734, 'してい': 1314, 'として': -4314, 'につい': -5483, + 'にとっ': -5989, 'に当た': -6247, 'ので,': -727, 'ので、': -727, + 'のもの': -600, 'れから': -3752, '十二月': -2287} + TW4__ = {'いう.': 8576, 'いう。': 8576, 'からな': -2348, 'してい': 2958, + 'たが,': 1516, 'たが、': 1516, 'ている': 1538, 'という': 1349, + 'ました': 5543, 'ません': 1097, 'ようと': -4258, 'よると': 5865} + UC1__ = {'A': 484, 'K': 93, 'M': 645, 'O': -505} + UC2__ = {'A': 819, 'H': 1059, 'I': 409, 'M': 3987, 'N': 5775, 'O': 646} + UC3__ = {'A': -1370, 'I': 2311} + UC4__ = {'A': -2643, 'H': 1809, 'I': -1032, 'K': -3450, 'M': 3565, + 'N': 3876, 'O': 6646} + UC5__ = {'H': 313, 'I': -1238, 'K': -799, 'M': 539, 'O': -831} + UC6__ = {'H': -506, 'I': -253, 'K': 87, 'M': 247, 'O': -387} + UP1__ = {'O': -214} + UP2__ = {'B': 69, 'O': 935} + UP3__ = {'B': 189} + UQ1__ = {'BH': 21, 'BI': -12, 'BK': -99, 'BN': 142, 'BO': -56, 'OH': -95, + 'OI': 477, 'OK': 410, 'OO': -2422} + UQ2__ = {'BH': 216, 'BI': 113, 'OK': 1759} + UQ3__ = {'BA': -479, 'BH': 42, 'BI': 1913, 'BK': -7198, 'BM': 3160, + 'BN': 6427, 'BO': 14761, 'OI': -827, 'ON': -3212} + UW1__ = {',': 156, '、': 156, '「': -463, 'あ': -941, 'う': -127, 'が': -553, + 'き': 121, 'こ': 505, 'で': -201, 'と': -547, 'ど': -123, 'に': -789, + 'の': -185, 'は': -847, 'も': -466, 'や': -470, 'よ': 182, 'ら': -292, + 'り': 208, 'れ': 169, 'を': -446, 'ん': -137, '・': -135, '主': -402, + '京': -268, '区': -912, '午': 871, '国': -460, '大': 561, '委': 729, + '市': -411, '日': -141, '理': 361, '生': -408, '県': -386, '都': -718, + '「': -463, '・': -135} + UW2__ = {',': -829, '、': -829, '〇': 892, '「': -645, '」': 3145, 'あ': -538, + 'い': 505, 'う': 134, 'お': -502, 'か': 1454, 'が': -856, 'く': -412, + 'こ': 1141, 'さ': 878, 'ざ': 540, 'し': 1529, 'す': -675, 'せ': 300, + 'そ': -1011, 'た': 188, 'だ': 1837, 'つ': -949, 'て': -291, 'で': -268, + 'と': -981, 'ど': 1273, 'な': 1063, 'に': -1764, 'の': 130, 'は': -409, + 'ひ': -1273, 'べ': 1261, 'ま': 600, 'も': -1263, 'や': -402, 'よ': 1639, + 'り': -579, 'る': -694, 'れ': 571, 'を': -2516, 'ん': 2095, 'ア': -587, + 'カ': 306, 'キ': 568, 'ッ': 831, '三': -758, '不': -2150, '世': -302, + '中': -968, '主': -861, '事': 492, '人': -123, '会': 978, '保': 362, + '入': 548, '初': -3025, '副': -1566, '北': -3414, '区': -422, '大': -1769, + '天': -865, '太': -483, '子': -1519, '学': 760, '実': 1023, '小': -2009, + '市': -813, '年': -1060, '強': 1067, '手': -1519, '揺': -1033, '政': 1522, + '文': -1355, '新': -1682, '日': -1815, '明': -1462, '最': -630, '朝': -1843, + '本': -1650, '東': -931, '果': -665, '次': -2378, '民': -180, '気': -1740, + '理': 752, '発': 529, '目': -1584, '相': -242, '県': -1165, '立': -763, + '第': 810, '米': 509, '自': -1353, '行': 838, '西': -744, '見': -3874, + '調': 1010, '議': 1198, '込': 3041, '開': 1758, '間': -1257, '「': -645, + '」': 3145, 'ッ': 831, 'ア': -587, 'カ': 306, 'キ': 568} + UW3__ = {',': 4889, '1': -800, '−': -1723, '、': 4889, '々': -2311, '〇': 5827, + '」': 2670, '〓': -3573, 'あ': -2696, 'い': 1006, 'う': 2342, 'え': 1983, + 'お': -4864, 'か': -1163, 'が': 3271, 'く': 1004, 'け': 388, 'げ': 401, + 'こ': -3552, 'ご': -3116, 'さ': -1058, 'し': -395, 'す': 584, 'せ': 3685, + 'そ': -5228, 'た': 842, 'ち': -521, 'っ': -1444, 'つ': -1081, 'て': 6167, + 'で': 2318, 'と': 1691, 'ど': -899, 'な': -2788, 'に': 2745, 'の': 4056, + 'は': 4555, 'ひ': -2171, 'ふ': -1798, 'へ': 1199, 'ほ': -5516, 'ま': -4384, + 'み': -120, 'め': 1205, 'も': 2323, 'や': -788, 'よ': -202, 'ら': 727, + 'り': 649, 'る': 5905, 'れ': 2773, 'わ': -1207, 'を': 6620, 'ん': -518, + 'ア': 551, 'グ': 1319, 'ス': 874, 'ッ': -1350, 'ト': 521, 'ム': 1109, + 'ル': 1591, 'ロ': 2201, 'ン': 278, '・': -3794, '一': -1619, '下': -1759, + '世': -2087, '両': 3815, '中': 653, '主': -758, '予': -1193, '二': 974, + '人': 2742, '今': 792, '他': 1889, '以': -1368, '低': 811, '何': 4265, + '作': -361, '保': -2439, '元': 4858, '党': 3593, '全': 1574, '公': -3030, + '六': 755, '共': -1880, '円': 5807, '再': 3095, '分': 457, '初': 2475, + '別': 1129, '前': 2286, '副': 4437, '力': 365, '動': -949, '務': -1872, + '化': 1327, '北': -1038, '区': 4646, '千': -2309, '午': -783, '協': -1006, + '口': 483, '右': 1233, '各': 3588, '合': -241, '同': 3906, '和': -837, + '員': 4513, '国': 642, '型': 1389, '場': 1219, '外': -241, '妻': 2016, + '学': -1356, '安': -423, '実': -1008, '家': 1078, '小': -513, '少': -3102, + '州': 1155, '市': 3197, '平': -1804, '年': 2416, '広': -1030, '府': 1605, + '度': 1452, '建': -2352, '当': -3885, '得': 1905, '思': -1291, '性': 1822, + '戸': -488, '指': -3973, '政': -2013, '教': -1479, '数': 3222, '文': -1489, + '新': 1764, '日': 2099, '旧': 5792, '昨': -661, '時': -1248, '曜': -951, + '最': -937, '月': 4125, '期': 360, '李': 3094, '村': 364, '東': -805, + '核': 5156, '森': 2438, '業': 484, '氏': 2613, '民': -1694, '決': -1073, + '法': 1868, '海': -495, '無': 979, '物': 461, '特': -3850, '生': -273, + '用': 914, '町': 1215, '的': 7313, '直': -1835, '省': 792, '県': 6293, + '知': -1528, '私': 4231, '税': 401, '立': -960, '第': 1201, '米': 7767, + '系': 3066, '約': 3663, '級': 1384, '統': -4229, '総': 1163, '線': 1255, + '者': 6457, '能': 725, '自': -2869, '英': 785, '見': 1044, '調': -562, + '財': -733, '費': 1777, '車': 1835, '軍': 1375, '込': -1504, '通': -1136, + '選': -681, '郎': 1026, '郡': 4404, '部': 1200, '金': 2163, '長': 421, + '開': -1432, '間': 1302, '関': -1282, '雨': 2009, '電': -1045, '非': 2066, + '駅': 1620, '1': -800, '」': 2670, '・': -3794, 'ッ': -1350, 'ア': 551, + 'グ': 1319, 'ス': 874, 'ト': 521, 'ム': 1109, 'ル': 1591, 'ロ': 2201, 'ン': 278} + UW4__ = {',': 3930, '.': 3508, '―': -4841, '、': 3930, '。': 3508, '〇': 4999, + '「': 1895, '」': 3798, '〓': -5156, 'あ': 4752, 'い': -3435, 'う': -640, + 'え': -2514, 'お': 2405, 'か': 530, 'が': 6006, 'き': -4482, 'ぎ': -3821, + 'く': -3788, 'け': -4376, 'げ': -4734, 'こ': 2255, 'ご': 1979, 'さ': 2864, + 'し': -843, 'じ': -2506, 'す': -731, 'ず': 1251, 'せ': 181, 'そ': 4091, + 'た': 5034, 'だ': 5408, 'ち': -3654, 'っ': -5882, 'つ': -1659, 'て': 3994, + 'で': 7410, 'と': 4547, 'な': 5433, 'に': 6499, 'ぬ': 1853, 'ね': 1413, + 'の': 7396, 'は': 8578, 'ば': 1940, 'ひ': 4249, 'び': -4134, 'ふ': 1345, + 'へ': 6665, 'べ': -744, 'ほ': 1464, 'ま': 1051, 'み': -2082, 'む': -882, + 'め': -5046, 'も': 4169, 'ゃ': -2666, 'や': 2795, 'ょ': -1544, 'よ': 3351, + 'ら': -2922, 'り': -9726, 'る': -14896, 'れ': -2613, 'ろ': -4570, + 'わ': -1783, 'を': 13150, 'ん': -2352, 'カ': 2145, 'コ': 1789, 'セ': 1287, + 'ッ': -724, 'ト': -403, 'メ': -1635, 'ラ': -881, 'リ': -541, 'ル': -856, + 'ン': -3637, '・': -4371, 'ー': -11870, '一': -2069, '中': 2210, '予': 782, + '事': -190, '井': -1768, '人': 1036, '以': 544, '会': 950, '体': -1286, + '作': 530, '側': 4292, '先': 601, '党': -2006, '共': -1212, '内': 584, + '円': 788, '初': 1347, '前': 1623, '副': 3879, '力': -302, '動': -740, + '務': -2715, '化': 776, '区': 4517, '協': 1013, '参': 1555, '合': -1834, + '和': -681, '員': -910, '器': -851, '回': 1500, '国': -619, '園': -1200, + '地': 866, '場': -1410, '塁': -2094, '士': -1413, '多': 1067, '大': 571, + '子': -4802, '学': -1397, '定': -1057, '寺': -809, '小': 1910, '屋': -1328, + '山': -1500, '島': -2056, '川': -2667, '市': 2771, '年': 374, '庁': -4556, + '後': 456, '性': 553, '感': 916, '所': -1566, '支': 856, '改': 787, + '政': 2182, '教': 704, '文': 522, '方': -856, '日': 1798, '時': 1829, + '最': 845, '月': -9066, '木': -485, '来': -442, '校': -360, '業': -1043, + '氏': 5388, '民': -2716, '気': -910, '沢': -939, '済': -543, '物': -735, + '率': 672, '球': -1267, '生': -1286, '産': -1101, '田': -2900, '町': 1826, + '的': 2586, '目': 922, '省': -3485, '県': 2997, '空': -867, '立': -2112, + '第': 788, '米': 2937, '系': 786, '約': 2171, '経': 1146, '統': -1169, + '総': 940, '線': -994, '署': 749, '者': 2145, '能': -730, '般': -852, + '行': -792, '規': 792, '警': -1184, '議': -244, '谷': -1000, '賞': 730, + '車': -1481, '軍': 1158, '輪': -1433, '込': -3370, '近': 929, '道': -1291, + '選': 2596, '郎': -4866, '都': 1192, '野': -1100, '銀': -2213, '長': 357, + '間': -2344, '院': -2297, '際': -2604, '電': -878, '領': -1659, '題': -792, + '館': -1984, '首': 1749, '高': 2120, '「': 1895, '」': 3798, '・': -4371, + 'ッ': -724, 'ー': -11870, 'カ': 2145, 'コ': 1789, 'セ': 1287, 'ト': -403, + 'メ': -1635, 'ラ': -881, 'リ': -541, 'ル': -856, 'ン': -3637} + UW5__ = {',': 465, '.': -299, '1': -514, 'E2': -32768, ']': -2762, '、': 465, + '。': -299, '「': 363, 'あ': 1655, 'い': 331, 'う': -503, 'え': 1199, + 'お': 527, 'か': 647, 'が': -421, 'き': 1624, 'ぎ': 1971, 'く': 312, + 'げ': -983, 'さ': -1537, 'し': -1371, 'す': -852, 'だ': -1186, 'ち': 1093, + 'っ': 52, 'つ': 921, 'て': -18, 'で': -850, 'と': -127, 'ど': 1682, + 'な': -787, 'に': -1224, 'の': -635, 'は': -578, 'べ': 1001, 'み': 502, + 'め': 865, 'ゃ': 3350, 'ょ': 854, 'り': -208, 'る': 429, 'れ': 504, + 'わ': 419, 'を': -1264, 'ん': 327, 'イ': 241, 'ル': 451, 'ン': -343, + '中': -871, '京': 722, '会': -1153, '党': -654, '務': 3519, '区': -901, + '告': 848, '員': 2104, '大': -1296, '学': -548, '定': 1785, '嵐': -1304, + '市': -2991, '席': 921, '年': 1763, '思': 872, '所': -814, '挙': 1618, + '新': -1682, '日': 218, '月': -4353, '査': 932, '格': 1356, '機': -1508, + '氏': -1347, '田': 240, '町': -3912, '的': -3149, '相': 1319, '省': -1052, + '県': -4003, '研': -997, '社': -278, '空': -813, '統': 1955, '者': -2233, + '表': 663, '語': -1073, '議': 1219, '選': -1018, '郎': -368, '長': 786, + '間': 1191, '題': 2368, '館': -689, '1': -514, 'E2': -32768, '「': 363, + 'イ': 241, 'ル': 451, 'ン': -343} + UW6__ = {',': 227, '.': 808, '1': -270, 'E1': 306, '、': 227, '。': 808, + 'あ': -307, 'う': 189, 'か': 241, 'が': -73, 'く': -121, 'こ': -200, + 'じ': 1782, 'す': 383, 'た': -428, 'っ': 573, 'て': -1014, 'で': 101, + 'と': -105, 'な': -253, 'に': -149, 'の': -417, 'は': -236, 'も': -206, + 'り': 187, 'る': -135, 'を': 195, 'ル': -673, 'ン': -496, '一': -277, + '中': 201, '件': -800, '会': 624, '前': 302, '区': 1792, '員': -1212, + '委': 798, '学': -960, '市': 887, '広': -695, '後': 535, '業': -697, + '相': 753, '社': -507, '福': 974, '空': -822, '者': 1811, '連': 463, + '郎': 1082, '1': -270, 'E1': 306, 'ル': -673, 'ン': -496} + + # ctype_ + def ctype_(self, char: str) -> str: + for pattern, value in self.patterns_.items(): + if pattern.match(char): + return value + return 'O' + + # ts_ + def ts_(self, dict: dict[str, int], key: str) -> int: + if key in dict: + return dict[key] + return 0 + + # segment + def split(self, input: str) -> list[str]: + if not input: + return [] + + result = [] + seg = ['B3', 'B2', 'B1'] + ctype = ['O', 'O', 'O'] + for t in input: + seg.append(t) + ctype.append(self.ctype_(t)) + seg.append('E1') + seg.append('E2') + seg.append('E3') + ctype.append('O') + ctype.append('O') + ctype.append('O') + word = seg[3] + p1 = 'U' + p2 = 'U' + p3 = 'U' + + for i in range(4, len(seg) - 3): + score = self.BIAS__ + w1 = seg[i-3] + w2 = seg[i-2] + w3 = seg[i-1] + w4 = seg[i] + w5 = seg[i+1] + w6 = seg[i+2] + c1 = ctype[i-3] + c2 = ctype[i-2] + c3 = ctype[i-1] + c4 = ctype[i] + c5 = ctype[i+1] + c6 = ctype[i+2] + score += self.ts_(self.UP1__, p1) + score += self.ts_(self.UP2__, p2) + score += self.ts_(self.UP3__, p3) + score += self.ts_(self.BP1__, p1 + p2) + score += self.ts_(self.BP2__, p2 + p3) + score += self.ts_(self.UW1__, w1) + score += self.ts_(self.UW2__, w2) + score += self.ts_(self.UW3__, w3) + score += self.ts_(self.UW4__, w4) + score += self.ts_(self.UW5__, w5) + score += self.ts_(self.UW6__, w6) + score += self.ts_(self.BW1__, w2 + w3) + score += self.ts_(self.BW2__, w3 + w4) + score += self.ts_(self.BW3__, w4 + w5) + score += self.ts_(self.TW1__, w1 + w2 + w3) + score += self.ts_(self.TW2__, w2 + w3 + w4) + score += self.ts_(self.TW3__, w3 + w4 + w5) + score += self.ts_(self.TW4__, w4 + w5 + w6) + score += self.ts_(self.UC1__, c1) + score += self.ts_(self.UC2__, c2) + score += self.ts_(self.UC3__, c3) + score += self.ts_(self.UC4__, c4) + score += self.ts_(self.UC5__, c5) + score += self.ts_(self.UC6__, c6) + score += self.ts_(self.BC1__, c2 + c3) + score += self.ts_(self.BC2__, c3 + c4) + score += self.ts_(self.BC3__, c4 + c5) + score += self.ts_(self.TC1__, c1 + c2 + c3) + score += self.ts_(self.TC2__, c2 + c3 + c4) + score += self.ts_(self.TC3__, c3 + c4 + c5) + score += self.ts_(self.TC4__, c4 + c5 + c6) +# score += self.ts_(self.TC5__, c4 + c5 + c6) + score += self.ts_(self.UQ1__, p1 + c1) + score += self.ts_(self.UQ2__, p2 + c2) + score += self.ts_(self.UQ1__, p3 + c3) + score += self.ts_(self.BQ1__, p2 + c2 + c3) + score += self.ts_(self.BQ2__, p2 + c3 + c4) + score += self.ts_(self.BQ3__, p3 + c2 + c3) + score += self.ts_(self.BQ4__, p3 + c3 + c4) + score += self.ts_(self.TQ1__, p2 + c1 + c2 + c3) + score += self.ts_(self.TQ2__, p2 + c2 + c3 + c4) + score += self.ts_(self.TQ3__, p3 + c1 + c2 + c3) + score += self.ts_(self.TQ4__, p3 + c2 + c3 + c4) + p = 'O' + if score > 0: + result.append(word.strip()) + word = '' + p = 'B' + p1 = p2 + p2 = p3 + p3 = p + word += seg[i] + + result.append(word.strip()) + return result + + +class SearchJapanese(SearchLanguage): + """ + Japanese search implementation: uses no stemmer, but word splitting is quite + complicated. + """ + lang = 'ja' + language_name = 'Japanese' + + def init(self, options: dict) -> None: + dotted_path = options.get('type', 'sphinx.search.ja.DefaultSplitter') + try: + self.splitter = import_object(dotted_path)(options) + except ExtensionError as exc: + raise ExtensionError("Splitter module %r can't be imported" % + dotted_path) from exc + + def split(self, input: str) -> list[str]: + return self.splitter.split(input) + + def word_filter(self, stemmed_word: str) -> bool: + return len(stemmed_word) > 1 + + def stem(self, word: str) -> str: + return word |