532 lines
30 KiB
Python
532 lines
30 KiB
Python
"""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
|