summaryrefslogtreecommitdiffstats
path: root/sphinx/search/ja.py
diff options
context:
space:
mode:
Diffstat (limited to 'sphinx/search/ja.py')
-rw-r--r--sphinx/search/ja.py531
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