>>> import ahocorasick
>>> # patterns = ['中国', '山东省', '威海市', '山东大学', '威海校区'] # 词典
>>> from pathlib import Path
>>> intext = Path('xx_ciku.txt')
>>> patterns = [x.strip() for x in intext.read_text().splitlines()]
>>> text = '''广州—广州市—三国吴永安七年(264年)分交州置广州,辖境兼有今广西一部。以后辖境逐渐缩小。今广州市即古广州治所番禺。
>>> 广武——古城在今河南荣阳东北广武山上,有东西二城,中隔一涧。为刘邦、项羽对峙处。
>>>
>>> 广信——明广信府,洽上饶(今属江西)。民国废。
>>>
>>> 广陵——秦县在今江苏扬州西北。隋改江阳,治今扬州。南唐恢复广陵原名。宋熙宁五年(1072年)并入江都。
>>>
>>> 广固城一—今山东益都西北。南燕都城,为刘裕所毁。
>>>
>>> 义兴——古县名,原称阳羡,隋改义兴,宋避太宗讳改宜兴。又东晋时曾设义兴郡,治阳羡,辖今江苏宜兴、溧阳,隋废。
>>>
>>> 义阳三关一—南北朝义阳郡(治今河南信阳)南有平靖(今信阳西南)、黄岘(今信阳南,宋以后名九里关)、武阳(今罗山县南)三关。
>>>
>>> 卫国一一西周初封时都朝歌(今河南淇县)。公元前660年迁楚丘(今滑县),后再迁帝丘(今濮阳)。最后迁野王(今沁阳)。公元前209年并于秦。
>>>
>>> 卫辉路(府)——北周置卫州,治朝歌,唐移治汲县。1260年,元升为卫辉路,辖今豫北新乡等地。明改卫辉府。清兼辖今封丘、兰考一带。民国废。
>>>
>>> 卫藏——西藏旧时别称。西藏旧分阿里、藏(后藏)、卫(前藏)、康(喀木)四部。故称。
>>>
>>> 飞狐口——在河北涞源县北、蔚县南。又涞源县在隋唐辽、宋、金、元时名飞狐县。
>>>
>>> 小沛——汉沛县(今属江苏)别称。
>>>
>>> 小金川——发源于邛崃山,向西流到丹巴附近人大金川。又为土司名,治今四川小金,清乾隆间改土归流,为懋功屯务厅。
>>>
>>> 小雁塔——在西安城南大荐福寺内。唐景龙元年至三年(707—709年)建。原十五层,今存十三层,高43.3米。
>>>
>>> 马邑——秦汉马邑县在今山西朔县。唐置马邑县在今朔县东北。清嘉庆时废。又隋唐马邑郡即朔州,治善阳,即今朔县。
>>>
>>> 马陵——在今河北大名东南,一说在今河南范县西南,战国时田忌、孙膑破魏庞娟于此。
>>>
>>> 马嵬坡——在陕西兴平西。
>>>
>>> 子午道——从杜陵(今西安东南)穿南山(秦岭)到汉中的通道,南口在安康县。西汉末开。南北朝时西移,自今西安向南至宁陕县。
>>>
>>>
>>> '''
>>>
>>> trie = ahocorasick.Automaton()
>>> for index, word in enumerate(patterns):
>>> trie.add_word(word, (index, word))
>>> trie.make_automaton()
iter(string, [start, [end]])
使用提供的输入执行 Aho-Corasick
搜索过程string。为在字符串中找到的键返回元组 (end_index, value)
的迭代器。
>>> for each in trie.iter_long(text):
>>> print(each)
>>> idx = each[0]
>>> text_len = len(each[1][1])
>>> print(text[ idx + 1 - text_len: idx + 1])
(1, (12731, '广州'))
广州
(5, (12728, '广州市'))
广州市
(11, (11100, '永安'))
永安
(25, (12731, '广州'))
广州
(33, (13539, '广西'))
广西
(49, (12728, '广州市'))
广州市
(53, (12731, '广州'))
广州
(57, (12885, '番禺'))
番禺
(69, (13519, '河南'))
河南
(76, (5251, '武山'))
武山
(115, (9648, '上饶'))
上饶
(120, (13529, '江西'))
江西
(142, (13360, '江苏扬州'))
江苏扬州
(154, (13359, '扬州'))
扬州
(180, (6510, '江都'))
江都
(193, (13517, '山东'))
山东
(219, (4168, '古县'))
古县
(239, (7245, '宜兴'))
宜兴
(260, (7246, '江苏宜兴'))
江苏宜兴
(263, (7197, '溧阳'))
溧阳
(290, (13366, '河南信阳'))
河南信阳
(299, (13365, '信阳'))
信阳
(309, (13365, '信阳'))
信阳
(327, (7017, '罗山县'))
罗山县
(354, (4616, '河南淇县'))
河南淇县
(370, (4720, '滑县'))
滑县
(381, (4639, '濮阳'))
濮阳
(392, (5056, '沁阳'))
沁阳
(411, (4750, '卫辉'))
卫辉
(444, (4750, '卫辉'))
卫辉
(452, (4948, '新乡'))
新乡
(459, (4750, '卫辉'))
卫辉
(467, (5062, '封丘'))
封丘
(470, (5212, '兰考'))
兰考
(487, (13515, '西藏'))
西藏
(494, (13515, '西藏'))
西藏
(537, (2421, '河北涞源县'))
河北涞源县
(541, (2222, '蔚县'))
蔚县
(547, (2420, '涞源县'))
涞源县
(574, (5227, '沛县'))
沛县
(579, (13521, '江苏'))
江苏
(589, (7263, '小金'))
小金
(597, (8262, '邛崃'))
邛崃
(605, (7497, '丹巴'))
丹巴
(611, (7056, '金川'))
金川
(624, (7264, '四川小金'))
四川小金
(653, (5727, '西安'))
西安
(716, (13511, '山西'))
山西
(746, (2960, '朔州'))
朔州
(770, (4199, '河北大名'))
河北大名
(781, (4565, '河南范县'))
河南范县
(813, (5710, '陕西兴平'))
陕西兴平
(831, (5727, '西安'))
西安
(844, (6363, '汉中'))
汉中
(853, (6429, '安康'))
安康
(871, (5727, '西安'))
西安
(877, (6063, '宁陕县'))
宁陕县
iter_long(string, [start, [end]])
返回搜索最长、非重叠匹配的迭代器(AutomatonSearchIterLong 类的对象)。
>>> for each in trie.iter_long(text):
>>> print(each)
(1, (12731, '广州'))
(8, (11100, '永安'))
(22, (12731, '广州'))
(30, (13539, '广西'))
(46, (12728, '广州市'))
(50, (12731, '广州'))
(54, (12885, '番禺'))
(66, (13519, '河南'))
(73, (5251, '武山'))
(112, (9648, '上饶'))
(117, (13529, '江西'))
(139, (13360, '江苏扬州'))
(151, (13359, '扬州'))
(177, (6510, '江都'))
(190, (13517, '山东'))
(216, (4168, '古县'))
(236, (7245, '宜兴'))
(257, (7246, '江苏宜兴'))
(260, (7197, '溧阳'))
(287, (13366, '河南信阳'))
(296, (13365, '信阳'))
(306, (13365, '信阳'))
(324, (7017, '罗山县'))
(351, (4616, '河南淇县'))
(367, (4720, '滑县'))
(378, (4639, '濮阳'))
(389, (5056, '沁阳'))
(408, (4750, '卫辉'))
(441, (4750, '卫辉'))
(449, (4948, '新乡'))
(456, (4750, '卫辉'))
(464, (5062, '封丘'))
(467, (5212, '兰考'))
(484, (13515, '西藏'))
(491, (13515, '西藏'))
(534, (2421, '河北涞源县'))
(538, (2222, '蔚县'))
(544, (2420, '涞源县'))
(571, (5227, '沛县'))
(576, (13521, '江苏'))
(586, (7263, '小金'))
(594, (8262, '邛崃'))
(602, (7497, '丹巴'))
(608, (7056, '金川'))
(621, (7264, '四川小金'))
(650, (5727, '西安'))
(713, (13511, '山西'))
(743, (2960, '朔州'))
(767, (4199, '河北大名'))
(778, (4565, '河南范县'))
(810, (5710, '陕西兴平'))
(828, (5727, '西安'))
(841, (6363, '汉中'))
(850, (6429, '安康'))
(868, (5727, '西安'))
(874, (6063, '宁陕县'))
>>> text[0:3]
'广州—'
>>> text[3:5]
'—三'
>>> text
'广州——三国吴永安七年(264年)分交州置广州,辖境兼有今广西一部。以后辖境逐渐缩小。今广州市即古广州治所番禺。n广武——古城在今河南荣阳东北广武山上,有东西二城,中隔一涧。为刘邦、项羽对峙处。nnu3000u3000广信——明广信府,洽上饶(今属江西)。民国废。nnu3000u3000广陵——秦县在今江苏扬州西北。隋改江阳,治今扬州。南唐恢复广陵原名。宋熙宁五年(1072年)并入江都。nnu3000u3000广固城一—今山东益都西北。南燕都城,为刘裕所毁。nnu3000u3000义兴——古县名,原称阳羡,隋改义兴,宋避太宗讳改宜兴。又东晋时曾设义兴郡,治阳羡,辖今江苏宜兴、溧阳,隋废。nnu3000u3000义阳三关一—南北朝义阳郡(治今河南信阳)南有平靖(今信阳西南)、黄岘(今信阳南,宋以后名九里关)、武阳(今罗山县南)三关。nnu3000u3000卫国一一西周初封时都朝歌(今河南淇县)。公元前660年迁楚丘(今滑县),后再迁帝丘(今濮阳)。最后迁野王(今沁阳)。公元前209年并于秦。nnu3000u3000卫辉路(府)——北周置卫州,治朝歌,唐移治汲县。1260年,元升为卫辉路,辖今豫北新乡等地。明改卫辉府。清兼辖今封丘、兰考一带。民国废。nnu3000u3000卫藏——西藏旧时别称。西藏旧分阿里、藏(后藏)、卫(前藏)、康(喀木)四部。故称。nnu3000u3000飞狐口——在河北涞源县北、蔚县南。又涞源县在隋唐辽、宋、金、元时名飞狐县。nnu3000u3000小沛——汉沛县(今属江苏)别称。nnu3000u3000小金川——发源于邛崃山,向西流到丹巴附近人大金川。又为土司名,治今四川小金,清乾隆间改土归流,为懋功屯务厅。nnu3000u3000小雁塔——在西安城南大荐福寺内。唐景龙元年至三年(707—709年)建。原十五层,今存十三层,高43.3米。nnu3000u3000马邑——秦汉马邑县在今山西朔县。唐置马邑县在今朔县东北。清嘉庆时废。又隋唐马邑郡即朔州,治善阳,即今朔县。nnu3000u3000马陵——在今河北大名东南,一说在今河南范县西南,战国时田忌、孙膑破魏庞娟于此。nnu3000u3000马嵬坡——在陕西兴平西。nnu3000u3000子午道——从杜陵(今西安东南)穿南山(秦岭)到汉中的通道,南口在安康县。西汉末开。南北朝时西移,自今西安向南至宁陕县。nnn'
>>> intext = text
>>> outtext = ''
>>> idx_q = 0
>>> idx_h = 0
>>> wlen_hou =0
>>> wd_old = ''
>>>
>>> idx_info_hou = []
>>> idx_info = []
>>>
>>> cnts = open('xx_idx.txt').readlines()
>>>
>>> for each in trie.iter_long(text):
>>> # print(each)
>>>
>>> if idx_h >0 :
>>> idx_q = idx_h
>>> wd_old = wd
>>> wlen_hou = wlen
>>> idx_info_hou = idx_info
>>>
>>>
>>> wd = each[1][1]
>>>
>>> print(idx_info)
>>> wlen = len(each[1][1])
>>> idx_h = each[0]
>>>
>>> idx_info = cnts[each[1][0] ].strip().split(';')
>>> # print(type(each))
>>> # print(type(each[0]))
>>> # print(text[idx_h - wlen + 1: idx_h + 1])
>>> text_seq = text[idx_q + wlen_hou -1 :idx_h + 1 - wlen]
>>> # print( '=' * 40)
>>> # print(idx_q + wlen,idx_h - wlen)
>>> # print(text_seq)
>>>
>>> # outtext = outtext + ' <<' + wd_old + '>> ' + text_seq
>>> try:
>>> outtext = outtext + f' :geofea:`{wd_old} <{idx_info_hou[2]}:{idx_info_hou[3]}>` ' + text_seq
>>> except:
>>> pass
>>>
>>> outtext = outtext + text[idx_h:]
>>>
>>>
>>> print(outtext)
>>>
>>>
>>>
[]
['12731', '广州', 'vt5697', '2256']
['11100', '永安', 'vt5697', '1963']
['12731', '广州', 'vt5697', '2256']
['13539', '广西', 'vt3142', '17']
['12728', '广州市', 'vt5697', '2256']
['12731', '广州', 'vt5697', '2256']
['12885', '番禺', 'vt5697', '2285']
['13519', '河南', 'vt3142', '7']
['5251', '武山', 'vt5697', '946']
['9648', '上饶', 'vt5697', '1712']
['13529', '江西', 'vt3142', '12']
['13360', '江苏扬州', 'vt5697', '2366']
['13359', '扬州', 'vt5697', '2366']
['6510', '江都', 'vt5697', '1169']
['13517', '山东', 'vt3142', '6']
['4168', '古县', 'vt5697', '752']
['7245', '宜兴', 'vt5697', '1296']
['7246', '江苏宜兴', 'vt5697', '1296']
['7197', '溧阳', 'vt5697', '1288']
['13366', '河南信阳', 'vt5697', '2367']
['13365', '信阳', 'vt5697', '2367']
['13365', '信阳', 'vt5697', '2367']
['7017', '罗山县', 'vt5697', '1257']
['4616', '河南淇县', 'vt5697', '831']
['4720', '滑县', 'vt5697', '850']
['4639', '濮阳', 'vt5697', '835']
['5056', '沁阳', 'vt5697', '908']
['4750', '卫辉', 'vt5697', '855']
['4750', '卫辉', 'vt5697', '855']
['4948', '新乡', 'vt5697', '890']
['4750', '卫辉', 'vt5697', '855']
['5062', '封丘', 'vt5697', '909']
['5212', '兰考', 'vt5697', '937']
['13515', '西藏', 'vt3142', '5']
['13515', '西藏', 'vt3142', '5']
['2421', '河北涞源县', 'vt5697', '440']
['2222', '蔚县', 'vt5697', '404']
['2420', '涞源县', 'vt5697', '440']
['5227', '沛县', 'vt5697', '941']
['13521', '江苏', 'vt3142', '8']
['7263', '小金', 'vt5697', '1299']
['8262', '邛崃', 'vt5697', '1470']
['7497', '丹巴', 'vt5697', '1340']
['7056', '金川', 'vt5697', '1264']
['7264', '四川小金', 'vt5697', '1299']
['5727', '西安', 'vt5697', '1031']
['13511', '山西', 'vt3142', '3']
['2960', '朔州', 'vt5697', '539']
['4199', '河北大名', 'vt5697', '757']
['4565', '河南范县', 'vt5697', '822']
['5710', '陕西兴平', 'vt5697', '1028']
['5727', '西安', 'vt5697', '1031']
['6363', '汉中', 'vt5697', '1144']
['6429', '安康', 'vt5697', '1155']
['5727', '西安', 'vt5697', '1031']
:geofea:`广州 <vt5697:2256>` ——三国吴 :geofea:`永安 <vt5697:1963>` 七年(264年)分交州置 :geofea:`广州 <vt5697:2256>` ,辖境兼有今 :geofea:`广西 <vt3142:17>` 一部。以后辖境逐渐缩小。今 :geofea:`广州市 <vt5697:2256>` 古 :geofea:`广州 <vt5697:2256>` 治所 :geofea:`番禺 <vt5697:2285>` 。
广武——古城在今 :geofea:`河南 <vt3142:7>` 荣阳东北广 :geofea:`武山 <vt5697:946>` 上,有东西二城,中隔一涧。为刘邦、项羽对峙处。
广信——明广信府,洽 :geofea:`上饶 <vt5697:1712>` (今属 :geofea:`江西 <vt3142:12>` )。民国废。
广陵——秦县在今 :geofea:`江苏扬州 <vt5697:2366>` 。隋改江阳,治今 :geofea:`扬州 <vt5697:2366>` 。南唐恢复广陵原名。宋熙宁五年(1072年)并入 :geofea:`江都 <vt5697:1169>` 。
广固城一—今 :geofea:`山东 <vt3142:6>` 益都西北。南燕都城,为刘裕所毁。
义兴—— :geofea:`古县 <vt5697:752>` 名,原称阳羡,隋改义兴,宋避太宗讳改 :geofea:`宜兴 <vt5697:1296>` 。又东晋时曾设义兴郡,治阳羡,辖今 :geofea:`江苏宜兴 <vt5697:1296>` :geofea:`溧阳 <vt5697:1288>` ,隋废。
义阳三关一—南北朝义阳郡(治今 :geofea:`河南信阳 <vt5697:2367>` 有平靖(今 :geofea:`信阳 <vt5697:2367>` 西南)、黄岘(今 :geofea:`信阳 <vt5697:2367>` 南,宋以后名九里关)、武阳(今 :geofea:`罗山县 <vt5697:1257>` )三关。
卫国一一西周初封时都朝歌(今 :geofea:`河南淇县 <vt5697:831>` 公元前660年迁楚丘(今 :geofea:`滑县 <vt5697:850>` ),后再迁帝丘(今 :geofea:`濮阳 <vt5697:835>` )。最后迁野王(今 :geofea:`沁阳 <vt5697:908>` )。公元前209年并于秦。
:geofea:`卫辉 <vt5697:855>` 路(府)——北周置卫州,治朝歌,唐移治汲县。1260年,元升为 :geofea:`卫辉 <vt5697:855>` 路,辖今豫北 :geofea:`新乡 <vt5697:890>` 等地。明改 :geofea:`卫辉 <vt5697:855>` 府。清兼辖今 :geofea:`封丘 <vt5697:909>` 、 :geofea:`兰考 <vt5697:937>` 一带。民国废。
卫藏—— :geofea:`西藏 <vt3142:5>` 旧时别称。 :geofea:`西藏 <vt3142:5>` 旧分阿里、藏(后藏)、卫(前藏)、康(喀木)四部。故称。
飞狐口——在 :geofea:`河北涞源县 <vt5697:440>` :geofea:`蔚县 <vt5697:404>` 南。又 :geofea:`涞源县 <vt5697:440>` 隋唐辽、宋、金、元时名飞狐县。
小沛——汉 :geofea:`沛县 <vt5697:941>` (今属 :geofea:`江苏 <vt3142:8>` )别称。
:geofea:`小金 <vt5697:1299>` 川——发源于 :geofea:`邛崃 <vt5697:1470>` 山,向西流到 :geofea:`丹巴 <vt5697:1340>` 附近人大 :geofea:`金川 <vt5697:1264>` 。又为土司名,治今 :geofea:`四川小金 <vt5697:1299>` 乾隆间改土归流,为懋功屯务厅。
小雁塔——在 :geofea:`西安 <vt5697:1031>` 城南大荐福寺内。唐景龙元年至三年(707—709年)建。原十五层,今存十三层,高43.3米。
马邑——秦汉马邑县在今 :geofea:`山西 <vt3142:3>` 朔县。唐置马邑县在今朔县东北。清嘉庆时废。又隋唐马邑郡即 :geofea:`朔州 <vt5697:539>` ,治善阳,即今朔县。
马陵——在今 :geofea:`河北大名 <vt5697:757>` ,一说在今 :geofea:`河南范县 <vt5697:822>` ,战国时田忌、孙膑破魏庞娟于此。
马嵬坡——在 :geofea:`陕西兴平 <vt5697:1028>`
子午道——从杜陵(今 :geofea:`西安 <vt5697:1031>` 东南)穿南山(秦岭)到 :geofea:`汉中 <vt5697:1144>` 的通道,南口在 :geofea:`安康 <vt5697:1155>` 县。西汉末开。南北朝时西移,自今 :geofea:`西安 <vt5697:1031>` 向南至县。
>>> print(text)
广州——三国吴永安七年(264年)分交州置广州,辖境兼有今广西一部。以后辖境逐渐缩小。今广州市即古广州治所番禺。
广武——古城在今河南荣阳东北广武山上,有东西二城,中隔一涧。为刘邦、项羽对峙处。
广信——明广信府,洽上饶(今属江西)。民国废。
广陵——秦县在今江苏扬州西北。隋改江阳,治今扬州。南唐恢复广陵原名。宋熙宁五年(1072年)并入江都。
广固城一—今山东益都西北。南燕都城,为刘裕所毁。
义兴——古县名,原称阳羡,隋改义兴,宋避太宗讳改宜兴。又东晋时曾设义兴郡,治阳羡,辖今江苏宜兴、溧阳,隋废。
义阳三关一—南北朝义阳郡(治今河南信阳)南有平靖(今信阳西南)、黄岘(今信阳南,宋以后名九里关)、武阳(今罗山县南)三关。
卫国一一西周初封时都朝歌(今河南淇县)。公元前660年迁楚丘(今滑县),后再迁帝丘(今濮阳)。最后迁野王(今沁阳)。公元前209年并于秦。
卫辉路(府)——北周置卫州,治朝歌,唐移治汲县。1260年,元升为卫辉路,辖今豫北新乡等地。明改卫辉府。清兼辖今封丘、兰考一带。民国废。
卫藏——西藏旧时别称。西藏旧分阿里、藏(后藏)、卫(前藏)、康(喀木)四部。故称。
飞狐口——在河北涞源县北、蔚县南。又涞源县在隋唐辽、宋、金、元时名飞狐县。
小沛——汉沛县(今属江苏)别称。
小金川——发源于邛崃山,向西流到丹巴附近人大金川。又为土司名,治今四川小金,清乾隆间改土归流,为懋功屯务厅。
小雁塔——在西安城南大荐福寺内。唐景龙元年至三年(707—709年)建。原十五层,今存十三层,高43.3米。
马邑——秦汉马邑县在今山西朔县。唐置马邑县在今朔县东北。清嘉庆时废。又隋唐马邑郡即朔州,治善阳,即今朔县。
马陵——在今河北大名东南,一说在今河南范县西南,战国时田忌、孙膑破魏庞娟于此。
马嵬坡——在陕西兴平西。
子午道——从杜陵(今西安东南)穿南山(秦岭)到汉中的通道,南口在安康县。西汉末开。南北朝时西移,自今西安向南至宁陕县。