diff --git a/bin/scrape-chakuwiki.ts b/bin/scrape-chakuwiki.ts new file mode 100644 index 00000000..96d30708 --- /dev/null +++ b/bin/scrape-chakuwiki.ts @@ -0,0 +1,152 @@ +import { prefectures } from '../room-gacha/prefectures'; +import qs from 'querystring'; +import fs from 'fs/promises'; +import path from 'path'; + +interface City { + pref: string, + city: string, +} + +const fetchChakuwiki = async (title: string) => { + const url = `https://chakuwiki.org/w/api.php?${qs.encode({ + format: 'json', + action: 'query', + prop: 'revisions', + rvprop: 'content', + titles: title, + })}`; + + await new Promise((resolve) => setTimeout(resolve, 5000)); + const res = await fetch(url); + const json = await res.json(); + + const page: any = Object.values(json?.query?.pages)?.[0]; + const content = page?.revisions?.[0]?.['*']; + if (!content) { + console.error(`Failed to fetch ${title}`); + return null; + } + + return content; +}; + +(async () => { + console.log('Fetching cities...'); + + await new Promise((resolve) => setTimeout(resolve, 5000)); + const citiesRes = await fetch('https://code4fukui.github.io/localgovjp/localgovjp.json'); + const cities: City[] = await citiesRes.json(); + + console.log('Scraping chakuwiki...'); + const cityTitleMap = new Map(); + + for (const prefecture of Object.keys(prefectures)) { + const prefectureCities = cities.filter((city) => city.pref === prefecture); + console.log(`${prefecture}: ${prefectureCities.length} cities`); + + const prefectureCitiesRegex = new RegExp(prefectureCities.map((city) => city.city).join('|'), 'g'); + + const prefectureTitle = prefecture.replace(/[都府県]$/, ''); + const areas: string[] = []; + console.log(`Fetching ${prefectureTitle}...`); + const prefectureContent = await fetchChakuwiki(prefectureTitle); + + if (!prefectureContent) { + continue; + } + + let isArea = false; + for (const line of prefectureContent.split('\n')) { + if (line.startsWith('=') && line.includes('地域')) { + isArea = true; + } else if (isArea && line.startsWith('=')) { + break; + } + + if (isArea) { + const links = line.matchAll(/\[\[([^|\]]+)(\|[^|\]]+)?\]\]/g); + for (const link of links) { + const area = link[1].replace(/#.+$/, ''); + console.log(`Found ${area}`); + areas.push(area); + } + } + } + + for (const area of areas) { + console.log(`Fetching ${area}...`); + await new Promise((resolve) => setTimeout(resolve, 5000)); + const areaContent = await fetchChakuwiki(area); + if (!areaContent) { + continue; + } + + let cityName: string | null = null; + let cityRumors: string[] = []; + for (const line of areaContent.split('\n')) { + if (line.startsWith('=')) { + if (cityName !== null) { + // console.log(`${cityName} rumors: ${cityRumors.join(' / ')}`); + } + + if (line.includes('の噂')) { + const cityNameMatches = line.match(prefectureCitiesRegex); + if (cityNameMatches) { + cityName = cityNameMatches[0]; + if (!cityName?.includes('区') && line.includes('区')) { + cityName = null; + } else { + console.log(`Found ${cityName}`); + } + } else { + cityName = null; + console.error(`Invalid city: ${line}`); + } + } else { + cityName = null; + } + + cityRumors = []; + } else { + if (cityName !== null && line.startsWith('#')) { + const indentLevel = line.match(/^#\**/)[0].length - 1; + if (indentLevel === 0) { + const cityFullname = `${prefecture}${cityName}`; + const overwrittenArea = cityTitleMap.get(cityFullname); + if (overwrittenArea !== undefined && overwrittenArea !== area) { + console.error(`Overwritten area: ${cityFullname} (${overwrittenArea} -> ${area})`); + } else { + // console.log(`Set ${cityFullname} to ${area}`); + } + cityTitleMap.set(cityFullname, area); + cityRumors.push(line.replace(/^#\**/, '').trim()); + } + } + } + } + } + + for (const city of prefectureCities) { + const cityFullname = `${prefecture}${city.city}`; + if (!cityTitleMap.has(cityFullname) && !city.city.includes('区')) { + console.error(`Missing city: ${cityFullname}`); + + await new Promise((resolve) => setTimeout(resolve, 5000)); + const cityContent = await fetchChakuwiki(city.city); + if (cityContent) { + cityTitleMap.set(cityFullname, city.city); + } else { + cityTitleMap.set(cityFullname, null); + console.error(`No content: ${cityFullname}`); + } + } + } + + console.log('Saving progress...'); + const cityTitleMapJson = JSON.stringify(Object.fromEntries(cityTitleMap.entries()), null, ' '); + await fs.writeFile(path.join(__dirname, '..', 'city-symbol', 'chakuwiki-title-map.json'), cityTitleMapJson); + } + + console.log('Done'); +})(); \ No newline at end of file diff --git a/city-symbol/chakuwiki-title-map.json b/city-symbol/chakuwiki-title-map.json new file mode 100644 index 00000000..cc8bc3ab --- /dev/null +++ b/city-symbol/chakuwiki-title-map.json @@ -0,0 +1,1743 @@ +{ + "北海道北斗市": "北海道/渡島", + "北海道松前町": "北海道/渡島", + "北海道福島町": "北海道/渡島", + "北海道知内町": "北海道/渡島", + "北海道木古内町": "北海道/渡島", + "北海道七飯町": "北海道/渡島", + "北海道鹿部町": "北海道/渡島", + "北海道森町": "北海道/渡島", + "北海道長万部町": "北海道/渡島", + "北海道八雲町": "北海道/渡島", + "北海道函館市": "函館市", + "北海道江差町": "北海道/檜山", + "北海道上ノ国町": "北海道/檜山", + "北海道厚沢部町": "北海道/檜山", + "北海道乙部町": "北海道/檜山", + "北海道せたな町": "北海道/檜山", + "北海道奥尻町": "北海道/檜山", + "北海道今金町": "北海道/檜山", + "北海道島牧村": "北海道/後志", + "北海道寿都町": "北海道/後志", + "北海道黒松内町": "北海道/後志", + "北海道蘭越町": "北海道/後志", + "北海道ニセコ町": "北海道/後志", + "北海道真狩村": "北海道/後志", + "北海道留寿都村": "北海道/後志", + "北海道喜茂別町": "北海道/後志", + "北海道京極町": "北海道/後志", + "北海道倶知安町": "北海道/後志", + "北海道共和町": "北海道/後志", + "北海道岩内町": "北海道/後志", + "北海道泊村": "北海道/後志", + "北海道神恵内村": "北海道/後志", + "北海道積丹町": "北海道/後志", + "北海道古平町": "北海道/後志", + "北海道仁木町": "北海道/後志", + "北海道余市町": "北海道/後志", + "北海道赤井川村": "北海道/後志", + "北海道小樽市": "小樽市", + "北海道美唄市": "北海道/空知", + "北海道赤平市": "北海道/空知", + "北海道三笠市": "北海道/空知", + "北海道深川市": "北海道/空知", + "北海道南幌町": "北海道/空知", + "北海道奈井江町": "北海道/空知", + "北海道上砂川町": "北海道/空知", + "北海道由仁町": "北海道/空知", + "北海道長沼町": "北海道/空知", + "北海道栗山町": "北海道/空知", + "北海道月形町": "北海道/空知", + "北海道浦臼町": "北海道/空知", + "北海道新十津川町": "北海道/空知", + "北海道妹背牛町": "北海道/空知", + "北海道秩父別町": "北海道/空知", + "北海道雨竜町": "北海道/空知", + "北海道北竜町": "北海道/空知", + "北海道沼田町": "北海道/空知", + "北海道夕張市": "夕張市", + "北海道岩見沢市": "岩見沢市", + "北海道芦別市": "芦別市", + "北海道滝川市": "滝川市", + "北海道砂川市": "砂川市", + "北海道歌志内市": "歌志内市", + "北海道恵庭市": "北海道/石狩", + "北海道北広島市": "北海道/石狩", + "北海道当別町": "北海道/石狩", + "北海道新篠津村": "北海道/石狩", + "北海道札幌市": "札幌市", + "北海道江別市": "江別市", + "北海道千歳市": "千歳市", + "北海道石狩市": "石狩市", + "北海道士別市": "北海道/上川", + "北海道鷹栖町": "北海道/上川", + "北海道東神楽町": "北海道/上川", + "北海道当麻町": "北海道/上川", + "北海道比布町": "北海道/上川", + "北海道愛別町": "北海道/上川", + "北海道上川町": "北海道/上川", + "北海道東川町": "北海道/上川", + "北海道美瑛町": "北海道/上川", + "北海道上富良野町": "北海道/上川", + "北海道中富良野町": "北海道/上川", + "北海道南富良野町": "北海道/上川", + "北海道占冠村": "北海道/上川", + "北海道和寒町": "北海道/上川", + "北海道剣淵町": "北海道/上川", + "北海道下川町": "北海道/上川", + "北海道美深町": "北海道/上川", + "北海道音威子府村": "北海道/上川", + "北海道中川町": "北海道/上川", + "北海道幌加内町": "北海道/上川", + "北海道旭川市": "旭川市", + "北海道名寄市": "名寄市", + "北海道留萌市": "北海道/留萌", + "北海道増毛町": "北海道/留萌", + "北海道小平町": "北海道/留萌", + "北海道苫前町": "北海道/留萌", + "北海道羽幌町": "北海道/留萌", + "北海道初山別村": "北海道/留萌", + "北海道遠別町": "北海道/留萌", + "北海道天塩町": "北海道/留萌", + "北海道猿払村": "北海道/宗谷", + "北海道浜頓別町": "北海道/宗谷", + "北海道中頓別町": "北海道/宗谷", + "北海道豊富町": "北海道/宗谷", + "北海道幌延町": "北海道/宗谷", + "北海道礼文町": "北海道/宗谷", + "北海道利尻町": "北海道/宗谷", + "北海道利尻富士町": "北海道/宗谷", + "北海道稚内市": "稚内市", + "北海道枝幸町": "枝幸町", + "北海道美幌町": "北海道/オホーツク", + "北海道津別町": "北海道/オホーツク", + "北海道大空町": "北海道/オホーツク", + "北海道斜里町": "北海道/オホーツク", + "北海道清里町": "北海道/オホーツク", + "北海道小清水町": "北海道/オホーツク", + "北海道訓子府町": "北海道/オホーツク", + "北海道置戸町": "北海道/オホーツク", + "北海道佐呂間町": "北海道/オホーツク", + "北海道湧別町": "北海道/オホーツク", + "北海道滝上町": "北海道/オホーツク", + "北海道興部町": "北海道/オホーツク", + "北海道西興部村": "北海道/オホーツク", + "北海道雄武町": "北海道/オホーツク", + "北海道北見市": "北見市", + "北海道網走市": "網走市", + "北海道紋別市": "紋別市", + "北海道遠軽町": "遠軽町", + "北海道登別市": "北海道/胆振", + "北海道伊達市": "北海道/胆振", + "北海道豊浦町": "北海道/胆振", + "北海道洞爺湖町": "北海道/胆振", + "北海道壮瞥町": "北海道/胆振", + "北海道白老町": "北海道/胆振", + "北海道厚真町": "北海道/胆振", + "北海道安平町": "北海道/胆振", + "北海道室蘭市": "室蘭市", + "北海道苫小牧市": "苫小牧市", + "北海道日高町": "北海道/日高", + "北海道平取町": "北海道/日高", + "北海道新冠町": "北海道/日高", + "北海道浦河町": "北海道/日高", + "北海道様似町": "北海道/日高", + "北海道えりも町": "北海道/日高", + "北海道新ひだか町": "北海道/日高", + "北海道音更町": "北海道/十勝", + "北海道士幌町": "北海道/十勝", + "北海道上士幌町": "北海道/十勝", + "北海道鹿追町": "北海道/十勝", + "北海道新得町": "北海道/十勝", + "北海道清水町": "北海道/十勝", + "北海道芽室町": "北海道/十勝", + "北海道中札内村": "北海道/十勝", + "北海道更別村": "北海道/十勝", + "北海道大樹町": "北海道/十勝", + "北海道広尾町": "北海道/十勝", + "北海道幕別町": "北海道/十勝", + "北海道池田町": "北海道/十勝", + "北海道豊頃町": "北海道/十勝", + "北海道本別町": "北海道/十勝", + "北海道足寄町": "北海道/十勝", + "北海道陸別町": "北海道/十勝", + "北海道浦幌町": "北海道/十勝", + "北海道帯広市": "帯広市", + "北海道釧路町": "北海道/釧路", + "北海道厚岸町": "北海道/釧路", + "北海道浜中町": "北海道/釧路", + "北海道標茶町": "北海道/釧路", + "北海道弟子屈町": "北海道/釧路", + "北海道鶴居村": "北海道/釧路", + "北海道白糠町": "北海道/釧路", + "北海道釧路市": "釧路市", + "北海道別海町": "北海道/根室", + "北海道中標津町": "北海道/根室", + "北海道標津町": "北海道/根室", + "北海道羅臼町": "北海道/根室", + "北海道根室市": "根室市", + "北海道富良野市": "富良野市", + "北海道むかわ町": "むかわ町", + "青森県黒石市": "青森/津軽", + "青森県つがる市": "青森/津軽", + "青森県平川市": "青森/津軽", + "青森県平内町": "青森/津軽", + "青森県今別町": "青森/津軽", + "青森県蓬田村": "青森/津軽", + "青森県外ヶ浜町": "青森/津軽", + "青森県鰺ヶ沢町": "青森/津軽", + "青森県深浦町": "青森/津軽", + "青森県西目屋村": "青森/津軽", + "青森県藤崎町": "青森/津軽", + "青森県大鰐町": "青森/津軽", + "青森県田舎館村": "青森/津軽", + "青森県板柳町": "青森/津軽", + "青森県鶴田町": "青森/津軽", + "青森県中泊町": "青森/津軽", + "青森県青森市": "青森市", + "青森県弘前市": "弘前市", + "青森県五所川原市": "五所川原市", + "青森県大間町": "青森/下北", + "青森県東通村": "青森/下北", + "青森県風間浦村": "青森/下北", + "青森県佐井村": "青森/下北", + "青森県むつ市": "むつ市", + "青森県野辺地町": "青森/南部", + "青森県七戸町": "青森/南部", + "青森県六戸町": "青森/南部", + "青森県横浜町": "青森/南部", + "青森県東北町": "青森/南部", + "青森県六ヶ所村": "青森/南部", + "青森県おいらせ町": "青森/南部", + "青森県三戸町": "青森/南部", + "青森県五戸町": "青森/南部", + "青森県田子町": "青森/南部", + "青森県南部町": "青森/南部", + "青森県階上町": "青森/南部", + "青森県新郷村": "青森/南部", + "青森県八戸市": "八戸市", + "青森県十和田市": "十和田市", + "青森県三沢市": "三沢市", + "岩手県雫石町": "岩手/内陸北部", + "岩手県葛巻町": "岩手/内陸北部", + "岩手県岩手町": "岩手/内陸北部", + "岩手県紫波町": "岩手/内陸北部", + "岩手県矢巾町": "岩手/内陸北部", + "岩手県一戸町": "岩手/内陸北部", + "岩手県盛岡市": "盛岡市", + "岩手県二戸市": "二戸市", + "岩手県八幡平市": "八幡平市", + "岩手県滝沢市": "滝沢市", + "岩手県山田町": "岩手/沿岸北部", + "岩手県岩泉町": "岩手/沿岸北部", + "岩手県田野畑村": "岩手/沿岸北部", + "岩手県普代村": "岩手/沿岸北部", + "岩手県軽米町": "岩手/沿岸北部", + "岩手県野田村": "岩手/沿岸北部", + "岩手県九戸村": "岩手/沿岸北部", + "岩手県洋野町": "岩手/沿岸北部", + "岩手県宮古市": "宮古市", + "岩手県久慈市": "久慈市", + "岩手県西和賀町": "岩手/内陸南部", + "岩手県金ケ崎町": "岩手/内陸南部", + "岩手県平泉町": "岩手/内陸南部", + "岩手県花巻市": "花巻市", + "岩手県北上市": "北上市", + "岩手県一関市": "一関市", + "岩手県奥州市": "奥州市", + "岩手県釜石市": "岩手/沿岸南部", + "岩手県住田町": "岩手/沿岸南部", + "岩手県大槌町": "岩手/沿岸南部", + "岩手県大船渡市": "大船渡市", + "岩手県遠野市": "遠野市", + "岩手県陸前高田市": "陸前高田市", + "秋田県能代市": "秋田/北部", + "秋田県鹿角市": "秋田/北部", + "秋田県藤里町": "秋田/北部", + "秋田県三種町": "秋田/北部", + "秋田県八峰町": "秋田/北部", + "秋田県小坂町": "秋田/北部", + "秋田県上小阿仁村": "秋田/北部", + "秋田県大館市": "大館市", + "秋田県北秋田市": "北秋田市", + "秋田県男鹿市": "秋田/中部", + "秋田県潟上市": "秋田/中部", + "秋田県にかほ市": "秋田/中部", + "秋田県五城目町": "秋田/中部", + "秋田県八郎潟町": "秋田/中部", + "秋田県井川町": "秋田/中部", + "秋田県大潟村": "秋田/中部", + "秋田県秋田市": "秋田市", + "秋田県由利本荘市": "由利本荘市", + "秋田県仙北市": "秋田/南部", + "秋田県美郷町": "秋田/南部", + "秋田県羽後町": "秋田/南部", + "秋田県東成瀬村": "秋田/南部", + "秋田県横手市": "横手市", + "秋田県湯沢市": "湯沢市", + "秋田県大仙市": "大仙市", + "宮城県仙台市": "仙台市", + "宮城県角田市": "宮城/仙南", + "宮城県蔵王町": "宮城/仙南", + "宮城県七ヶ宿町": "宮城/仙南", + "宮城県大河原町": "宮城/仙南", + "宮城県柴田町": "宮城/仙南", + "宮城県川崎町": "宮城/仙南", + "宮城県丸森町": "宮城/仙南", + "宮城県亘理町": "宮城/仙南", + "宮城県山元町": "宮城/仙南", + "宮城県白石市": "白石市", + "宮城県名取市": "名取市", + "宮城県岩沼市": "岩沼市", + "宮城県村田町": "村田町", + "宮城県多賀城市": "宮城/中部", + "宮城県富谷市": "宮城/中部", + "宮城県松島町": "宮城/中部", + "宮城県七ヶ浜町": "宮城/中部", + "宮城県大和町": "宮城/中部", + "宮城県大郷町": "宮城/中部", + "宮城県大衡村": "宮城/中部", + "宮城県塩竈市": "塩竈市", + "宮城県利府町": "利府町", + "宮城県登米市": "宮城/仙北", + "宮城県栗原市": "宮城/仙北", + "宮城県色麻町": "宮城/仙北", + "宮城県加美町": "宮城/仙北", + "宮城県涌谷町": "宮城/仙北", + "宮城県美里町": "宮城/仙北", + "宮城県大崎市": "大崎市", + "宮城県東松島市": "宮城/南三陸", + "宮城県女川町": "宮城/南三陸", + "宮城県南三陸町": "宮城/南三陸", + "宮城県石巻市": "石巻市", + "宮城県気仙沼市": "気仙沼市", + "山形県寒河江市": "山形/村山", + "山形県上山市": "山形/村山", + "山形県村山市": "山形/村山", + "山形県天童市": "山形/村山", + "山形県東根市": "山形/村山", + "山形県尾花沢市": "山形/村山", + "山形県山辺町": "山形/村山", + "山形県中山町": "山形/村山", + "山形県河北町": "山形/村山", + "山形県西川町": "山形/村山", + "山形県朝日町": "山形/村山", + "山形県大江町": "山形/村山", + "山形県大石田町": "山形/村山", + "山形県山形市": "山形市", + "山形県金山町": "山形/最上", + "山形県最上町": "山形/最上", + "山形県舟形町": "山形/最上", + "山形県真室川町": "山形/最上", + "山形県大蔵村": "山形/最上", + "山形県鮭川村": "山形/最上", + "山形県戸沢村": "山形/最上", + "山形県新庄市": "新庄市", + "山形県三川町": "山形/庄内", + "山形県庄内町": "山形/庄内", + "山形県遊佐町": "山形/庄内", + "山形県鶴岡市": "鶴岡市", + "山形県酒田市": "酒田市", + "山形県長井市": "山形/置賜", + "山形県南陽市": "山形/置賜", + "山形県高畠町": "山形/置賜", + "山形県川西町": "山形/置賜", + "山形県小国町": "山形/置賜", + "山形県白鷹町": "山形/置賜", + "山形県飯豊町": "山形/置賜", + "山形県米沢市": "米沢市", + "福島県下郷町": "福島/会津", + "福島県只見町": "福島/会津", + "福島県南会津町": "福島/会津", + "福島県北塩原村": "福島/会津", + "福島県西会津町": "福島/会津", + "福島県磐梯町": "福島/会津", + "福島県猪苗代町": "福島/会津", + "福島県会津坂下町": "福島/会津", + "福島県湯川村": "福島/会津", + "福島県柳津町": "福島/会津", + "福島県三島町": "福島/会津", + "福島県金山町": "福島/会津", + "福島県昭和村": "福島/会津", + "福島県会津美里町": "福島/会津", + "福島県会津若松市": "会津若松市", + "福島県喜多方市": "喜多方市", + "福島県檜枝岐村": "檜枝岐村", + "福島県二本松市": "福島/県北", + "福島県本宮市": "福島/県北", + "福島県桑折町": "福島/県北", + "福島県国見町": "福島/県北", + "福島県川俣町": "福島/県北", + "福島県大玉村": "福島/県北", + "福島県福島市": "福島市", + "福島県伊達市": "伊達市_(福島)", + "福島県田村市": "福島/県中・県南", + "福島県鏡石町": "福島/県中・県南", + "福島県天栄村": "福島/県中・県南", + "福島県西郷村": "福島/県中・県南", + "福島県泉崎村": "福島/県中・県南", + "福島県中島村": "福島/県中・県南", + "福島県矢吹町": "福島/県中・県南", + "福島県棚倉町": "福島/県中・県南", + "福島県矢祭町": "福島/県中・県南", + "福島県塙町": "福島/県中・県南", + "福島県鮫川村": "福島/県中・県南", + "福島県石川町": "福島/県中・県南", + "福島県玉川村": "福島/県中・県南", + "福島県平田村": "福島/県中・県南", + "福島県浅川町": "福島/県中・県南", + "福島県古殿町": "福島/県中・県南", + "福島県三春町": "福島/県中・県南", + "福島県小野町": "福島/県中・県南", + "福島県郡山市": "郡山市", + "福島県白河市": "白河市", + "福島県須賀川市": "須賀川市", + "福島県相馬市": "福島/浜通り", + "福島県広野町": "福島/浜通り", + "福島県楢葉町": "福島/浜通り", + "福島県富岡町": "福島/浜通り", + "福島県川内村": "福島/浜通り", + "福島県大熊町": "福島/浜通り", + "福島県双葉町": "福島/浜通り", + "福島県浪江町": "福島/浜通り", + "福島県葛尾村": "福島/浜通り", + "福島県新地町": "福島/浜通り", + "福島県飯舘村": "福島/浜通り", + "福島県いわき市": "いわき市", + "福島県南相馬市": "南相馬市", + "東京都千代田区": "東京/千代田区", + "東京都中央区": "東京/中央区", + "東京都港区": "東京/港区", + "東京都新宿区": "東京/新宿区", + "東京都文京区": "東京/文京区", + "東京都台東区": "東京/台東区", + "東京都墨田区": "東京/墨田区", + "東京都江東区": "東京/江東区", + "東京都品川区": "東京/品川区", + "東京都目黒区": "東京/目黒区", + "東京都大田区": "東京/大田区", + "東京都世田谷区": "東京/世田谷区", + "東京都渋谷区": "東京/渋谷区", + "東京都中野区": "東京/中野区", + "東京都杉並区": "東京/杉並区", + "東京都豊島区": "東京/豊島区", + "東京都北区": "東京/北区", + "東京都荒川区": "東京/荒川区", + "東京都板橋区": "東京/板橋区", + "東京都練馬区": "東京/練馬区", + "東京都足立区": "東京/足立区", + "東京都葛飾区": "東京/葛飾区", + "東京都江戸川区": "東京/江戸川区", + "東京都八王子市": "八王子市", + "東京都立川市": "立川市", + "東京都武蔵野市": "武蔵野市", + "東京都三鷹市": "三鷹市", + "東京都青梅市": "青梅市", + "東京都府中市": "府中市", + "東京都昭島市": "昭島市", + "東京都調布市": "調布市", + "東京都町田市": "町田市", + "東京都小金井市": "小金井市", + "東京都小平市": "小平市", + "東京都日野市": "日野市", + "東京都東村山市": "東村山市", + "東京都国分寺市": "国分寺市", + "東京都国立市": "国立市", + "東京都福生市": "福生市", + "東京都狛江市": "狛江市", + "東京都東大和市": "東大和市", + "東京都清瀬市": "清瀬市", + "東京都東久留米市": "東久留米市", + "東京都武蔵村山市": "武蔵村山市", + "東京都多摩市": "多摩市", + "東京都稲城市": "稲城市", + "東京都羽村市": "羽村市", + "東京都あきる野市": "あきる野市", + "東京都西東京市": "西東京市", + "東京都瑞穂町": "瑞穂町", + "東京都日の出町": "日の出町", + "東京都檜原村": "檜原村", + "東京都奥多摩町": "奥多摩町", + "東京都大島町": "大島町", + "東京都利島村": "利島村", + "東京都新島村": "新島村", + "東京都神津島村": "神津島村", + "東京都三宅村": "三宅村", + "東京都御蔵島村": "御蔵島村", + "東京都八丈町": "八丈町", + "東京都青ヶ島村": "青ヶ島村", + "東京都小笠原村": "小笠原村", + "神奈川県横浜市": "横浜市", + "神奈川県川崎市": "川崎市", + "神奈川県鎌倉市": "鎌倉市", + "神奈川県逗子市": "逗子市", + "神奈川県三浦市": "三浦市", + "神奈川県葉山町": "葉山町", + "神奈川県愛川町": "神奈川/県央", + "神奈川県清川村": "神奈川/県央", + "神奈川県相模原市": "相模原市", + "神奈川県秦野市": "秦野市", + "神奈川県厚木市": "厚木市", + "神奈川県大和市": "大和市", + "神奈川県伊勢原市": "伊勢原市", + "神奈川県海老名市": "海老名市", + "神奈川県座間市": "座間市", + "神奈川県綾瀬市": "綾瀬市", + "神奈川県寒川町": "寒川町", + "神奈川県平塚市": "平塚市", + "神奈川県藤沢市": "藤沢市", + "神奈川県茅ヶ崎市": "茅ヶ崎市", + "神奈川県大磯町": "大磯町", + "神奈川県二宮町": "二宮町", + "神奈川県南足柄市": "神奈川/足柄", + "神奈川県中井町": "神奈川/足柄", + "神奈川県大井町": "神奈川/足柄", + "神奈川県松田町": "神奈川/足柄", + "神奈川県山北町": "神奈川/足柄", + "神奈川県開成町": "神奈川/足柄", + "神奈川県真鶴町": "神奈川/足柄", + "神奈川県湯河原町": "神奈川/足柄", + "神奈川県小田原市": "小田原市", + "神奈川県箱根町": "箱根町", + "神奈川県横須賀市": "横須賀市", + "千葉県千葉市": "千葉市", + "千葉県松戸市": "松戸市", + "千葉県野田市": "野田市", + "千葉県柏市": "柏市", + "千葉県流山市": "流山市", + "千葉県我孫子市": "我孫子市", + "千葉県鎌ケ谷市": "鎌ケ谷市", + "千葉県市川市": "市川市", + "千葉県船橋市": "船橋市", + "千葉県習志野市": "習志野市", + "千葉県八千代市": "八千代市", + "千葉県浦安市": "浦安市", + "千葉県四街道市": "千葉/北総", + "千葉県富里市": "千葉/北総", + "千葉県酒々井町": "千葉/北総", + "千葉県栄町": "千葉/北総", + "千葉県成田市": "成田市", + "千葉県佐倉市": "佐倉市", + "千葉県八街市": "八街市", + "千葉県印西市": "印西市", + "千葉県白井市": "白井市", + "千葉県旭市": "千葉/東総", + "千葉県匝瑳市": "千葉/東総", + "千葉県神崎町": "千葉/東総", + "千葉県多古町": "千葉/東総", + "千葉県東庄町": "千葉/東総", + "千葉県銚子市": "銚子市", + "千葉県香取市": "香取市", + "千葉県東金市": "千葉/外房", + "千葉県いすみ市": "千葉/外房", + "千葉県九十九里町": "千葉/外房", + "千葉県芝山町": "千葉/外房", + "千葉県横芝光町": "千葉/外房", + "千葉県一宮町": "千葉/外房", + "千葉県睦沢町": "千葉/外房", + "千葉県長生村": "千葉/外房", + "千葉県白子町": "千葉/外房", + "千葉県長柄町": "千葉/外房", + "千葉県長南町": "千葉/外房", + "千葉県大多喜町": "千葉/外房", + "千葉県御宿町": "千葉/外房", + "千葉県茂原市": "茂原市", + "千葉県勝浦市": "勝浦市", + "千葉県山武市": "山武市", + "千葉県大網白里市": "大網白里市", + "千葉県君津市": "千葉/内房", + "千葉県富津市": "千葉/内房", + "千葉県袖ケ浦市": "千葉/内房", + "千葉県木更津市": "木更津市", + "千葉県市原市": "市原市", + "千葉県館山市": "千葉/安房", + "千葉県鴨川市": "千葉/安房", + "千葉県鋸南町": "千葉/安房", + "千葉県南房総市": "南房総市", + "埼玉県さいたま市": "さいたま市/桜区", + "埼玉県川口市": "川口市", + "埼玉県蕨市": "蕨市", + "埼玉県戸田市": "戸田市", + "埼玉県鴻巣市": "鴻巣市", + "埼玉県上尾市": "上尾市", + "埼玉県桶川市": "桶川市", + "埼玉県北本市": "北本市", + "埼玉県伊奈町": "伊奈町", + "埼玉県八潮市": "埼玉/東部", + "埼玉県吉川市": "埼玉/東部", + "埼玉県松伏町": "埼玉/東部", + "埼玉県春日部市": "春日部市", + "埼玉県草加市": "草加市", + "埼玉県越谷市": "越谷市", + "埼玉県三郷市": "三郷市", + "埼玉県蓮田市": "埼玉/利根", + "埼玉県白岡市": "埼玉/利根", + "埼玉県杉戸町": "埼玉/利根", + "埼玉県行田市": "行田市", + "埼玉県加須市": "加須市", + "埼玉県羽生市": "羽生市", + "埼玉県久喜市": "久喜市", + "埼玉県幸手市": "幸手市", + "埼玉県宮代町": "宮代町", + "埼玉県日高市": "埼玉/西部", + "埼玉県三芳町": "埼玉/西部", + "埼玉県越生町": "埼玉/西部", + "埼玉県川越市": "川越市", + "埼玉県所沢市": "所沢市", + "埼玉県飯能市": "飯能市", + "埼玉県狭山市": "狭山市", + "埼玉県入間市": "入間市", + "埼玉県朝霞市": "朝霞市", + "埼玉県志木市": "志木市", + "埼玉県和光市": "和光市", + "埼玉県新座市": "新座市", + "埼玉県富士見市": "富士見市", + "埼玉県坂戸市": "坂戸市", + "埼玉県鶴ヶ島市": "鶴ヶ島市", + "埼玉県ふじみ野市": "ふじみ野市", + "埼玉県毛呂山町": "毛呂山町", + "埼玉県滑川町": "埼玉/比企", + "埼玉県嵐山町": "埼玉/比企", + "埼玉県小川町": "埼玉/比企", + "埼玉県川島町": "埼玉/比企", + "埼玉県吉見町": "埼玉/比企", + "埼玉県鳩山町": "埼玉/比企", + "埼玉県ときがわ町": "埼玉/比企", + "埼玉県東松山市": "東松山市", + "埼玉県美里町": "埼玉/北部", + "埼玉県神川町": "埼玉/北部", + "埼玉県上里町": "埼玉/北部", + "埼玉県寄居町": "埼玉/北部", + "埼玉県熊谷市": "熊谷市", + "埼玉県本庄市": "本庄市", + "埼玉県深谷市": "深谷市", + "埼玉県横瀬町": "埼玉/秩父", + "埼玉県皆野町": "埼玉/秩父", + "埼玉県長瀞町": "埼玉/秩父", + "埼玉県小鹿野町": "埼玉/秩父", + "埼玉県東秩父村": "埼玉/秩父", + "埼玉県秩父市": "秩父市", + "茨城県高萩市": "茨城/県北", + "茨城県常陸大宮市": "茨城/県北", + "茨城県那珂市": "茨城/県北", + "茨城県東海村": "茨城/県北", + "茨城県大子町": "茨城/県北", + "茨城県日立市": "日立市", + "茨城県常陸太田市": "常陸太田市", + "茨城県北茨城市": "北茨城市", + "茨城県笠間市": "茨城/県央", + "茨城県茨城町": "茨城/県央", + "茨城県大洗町": "茨城/県央", + "茨城県城里町": "茨城/県央", + "茨城県水戸市": "水戸市", + "茨城県ひたちなか市": "ひたちなか市", + "茨城県小美玉市": "小美玉市", + "茨城県潮来市": "茨城/鹿行", + "茨城県行方市": "茨城/鹿行", + "茨城県鹿嶋市": "鹿嶋市", + "茨城県神栖市": "神栖市", + "茨城県鉾田市": "鉾田市", + "茨城県龍ケ崎市": "茨城/県南", + "茨城県守谷市": "茨城/県南", + "茨城県稲敷市": "茨城/県南", + "茨城県かすみがうら市": "茨城/県南", + "茨城県美浦村": "茨城/県南", + "茨城県阿見町": "茨城/県南", + "茨城県河内町": "茨城/県南", + "茨城県利根町": "茨城/県南", + "茨城県土浦市": "土浦市", + "茨城県石岡市": "石岡市", + "茨城県取手市": "取手市", + "茨城県牛久市": "牛久市", + "茨城県つくば市": "つくば市", + "茨城県結城市": "茨城/県西", + "茨城県常総市": "茨城/県西", + "茨城県坂東市": "茨城/県西", + "茨城県桜川市": "茨城/県西", + "茨城県八千代町": "茨城/県西", + "茨城県五霞町": "茨城/県西", + "茨城県境町": "茨城/県西", + "茨城県古河市": "古河市", + "茨城県下妻市": "下妻市", + "茨城県筑西市": "筑西市", + "茨城県つくばみらい市": "つくばみらい市", + "栃木県さくら市": "栃木/北部", + "栃木県那須烏山市": "栃木/北部", + "栃木県塩谷町": "栃木/北部", + "栃木県高根沢町": "栃木/北部", + "栃木県那珂川町": "栃木/北部", + "栃木県日光市": "日光市", + "栃木県大田原市": "大田原市", + "栃木県矢板市": "矢板市", + "栃木県那須塩原市": "那須塩原市", + "栃木県上三川町": "栃木/東部", + "栃木県益子町": "栃木/東部", + "栃木県茂木町": "栃木/東部", + "栃木県市貝町": "栃木/東部", + "栃木県芳賀町": "栃木/東部", + "栃木県宇都宮市": "宇都宮市", + "栃木県真岡市": "真岡市", + "栃木県下野市": "下野市", + "栃木県壬生町": "栃木/西部", + "栃木県野木町": "栃木/西部", + "栃木県足利市": "足利市", + "栃木県栃木市": "栃木市", + "栃木県佐野市": "佐野市", + "栃木県鹿沼市": "鹿沼市", + "栃木県小山市": "小山市", + "栃木県那須町": "那須町", + "群馬県玉村町": "群馬/中毛", + "群馬県前橋市": "前橋市", + "群馬県伊勢崎市": "伊勢崎市", + "群馬県藤岡市": "群馬/西毛", + "群馬県富岡市": "群馬/西毛", + "群馬県上野村": "群馬/西毛", + "群馬県神流町": "群馬/西毛", + "群馬県下仁田町": "群馬/西毛", + "群馬県南牧村": "群馬/西毛", + "群馬県甘楽町": "群馬/西毛", + "群馬県高崎市": "高崎市", + "群馬県安中市": "安中市", + "群馬県榛東村": "群馬/北毛", + "群馬県吉岡町": "群馬/北毛", + "群馬県片品村": "群馬/北毛", + "群馬県川場村": "群馬/北毛", + "群馬県昭和村": "群馬/北毛", + "群馬県中之条町": "群馬/北毛", + "群馬県長野原町": "群馬/北毛", + "群馬県嬬恋村": "群馬/北毛", + "群馬県草津町": "群馬/北毛", + "群馬県高山村": "群馬/北毛", + "群馬県東吾妻町": "群馬/北毛", + "群馬県渋川市": "渋川市", + "群馬県みどり市": "群馬/東毛", + "群馬県板倉町": "群馬/東毛", + "群馬県明和町": "群馬/東毛", + "群馬県千代田町": "群馬/東毛", + "群馬県大泉町": "群馬/東毛", + "群馬県邑楽町": "群馬/東毛", + "群馬県桐生市": "桐生市", + "群馬県太田市": "太田市", + "群馬県館林市": "館林市", + "群馬県沼田市": "沼田市", + "群馬県みなかみ町": "みなかみ町", + "山梨県韮崎市": "山梨/巨摩", + "山梨県南アルプス市": "山梨/巨摩", + "山梨県早川町": "山梨/巨摩", + "山梨県身延町": "山梨/巨摩", + "山梨県南部町": "山梨/巨摩", + "山梨県富士川町": "山梨/巨摩", + "山梨県昭和町": "山梨/巨摩", + "山梨県北杜市": "北杜市", + "山梨県山梨市": "山梨/国中", + "山梨県甲斐市": "山梨/国中", + "山梨県笛吹市": "山梨/国中", + "山梨県甲州市": "山梨/国中", + "山梨県中央市": "山梨/国中", + "山梨県市川三郷町": "山梨/国中", + "山梨県甲府市": "甲府市", + "山梨県都留市": "山梨/郡内", + "山梨県富士吉田市": "山梨/郡内", + "山梨県大月市": "山梨/郡内", + "山梨県道志村": "山梨/郡内", + "山梨県西桂町": "山梨/郡内", + "山梨県忍野村": "山梨/郡内", + "山梨県山中湖村": "山梨/郡内", + "山梨県鳴沢村": "山梨/郡内", + "山梨県富士河口湖町": "山梨/郡内", + "山梨県小菅村": "山梨/郡内", + "山梨県丹波山村": "山梨/郡内", + "山梨県上野原市": "上野原市", + "長野県須坂市": "長野/長野", + "長野県小布施町": "長野/長野", + "長野県高山村": "長野/長野", + "長野県信濃町": "長野/長野", + "長野県小川村": "長野/長野", + "長野県飯綱町": "長野/長野", + "長野県坂城町": "長野/長野", + "長野県長野市": "長野市", + "長野県千曲市": "千曲市", + "長野県中野市": "長野/北信", + "長野県飯山市": "長野/北信", + "長野県山ノ内町": "長野/北信", + "長野県木島平村": "長野/北信", + "長野県野沢温泉村": "長野/北信", + "長野県栄村": "長野/北信", + "長野県東御市": "長野/上小", + "長野県青木村": "長野/上小", + "長野県長和町": "長野/上小", + "長野県上田市": "上田市", + "長野県小諸市": "長野/佐久", + "長野県小海町": "長野/佐久", + "長野県川上村": "長野/佐久", + "長野県南牧村": "長野/佐久", + "長野県南相木村": "長野/佐久", + "長野県北相木村": "長野/佐久", + "長野県佐久穂町": "長野/佐久", + "長野県御代田町": "長野/佐久", + "長野県立科町": "長野/佐久", + "長野県佐久市": "佐久市", + "長野県軽井沢町": "軽井沢町", + "長野県大町市": "長野/北安曇", + "長野県池田町": "長野/北安曇", + "長野県松川村": "長野/北安曇", + "長野県白馬村": "長野/北安曇", + "長野県小谷村": "長野/北安曇", + "長野県麻績村": "長野/松本", + "長野県生坂村": "長野/松本", + "長野県山形村": "長野/松本", + "長野県朝日村": "長野/松本", + "長野県筑北村": "長野/松本", + "長野県松本市": "松本市", + "長野県塩尻市": "塩尻市", + "長野県安曇野市": "安曇野市", + "長野県上松町": "長野/木曽", + "長野県南木曽町": "長野/木曽", + "長野県木祖村": "長野/木曽", + "長野県王滝村": "長野/木曽", + "長野県大桑村": "長野/木曽", + "長野県木曽町": "長野/木曽", + "長野県茅野市": "長野/諏訪", + "長野県富士見町": "長野/諏訪", + "長野県原村": "長野/諏訪", + "長野県岡谷市": "岡谷市", + "長野県諏訪市": "諏訪市", + "長野県下諏訪町": "下諏訪町", + "長野県駒ヶ根市": "長野/上伊那", + "長野県辰野町": "長野/上伊那", + "長野県箕輪町": "長野/上伊那", + "長野県飯島町": "長野/上伊那", + "長野県南箕輪村": "長野/上伊那", + "長野県中川村": "長野/上伊那", + "長野県宮田村": "長野/上伊那", + "長野県伊那市": "伊那市", + "長野県松川町": "長野/下伊那", + "長野県高森町": "長野/下伊那", + "長野県阿南町": "長野/下伊那", + "長野県阿智村": "長野/下伊那", + "長野県平谷村": "長野/下伊那", + "長野県根羽村": "長野/下伊那", + "長野県下條村": "長野/下伊那", + "長野県売木村": "長野/下伊那", + "長野県天龍村": "長野/下伊那", + "長野県泰阜村": "長野/下伊那", + "長野県喬木村": "長野/下伊那", + "長野県豊丘村": "長野/下伊那", + "長野県大鹿村": "長野/下伊那", + "長野県飯田市": "飯田市", + "石川県かほく市": "石川/加賀", + "石川県野々市市": "石川/加賀", + "石川県川北町": "石川/加賀", + "石川県津幡町": "石川/加賀", + "石川県内灘町": "石川/加賀", + "石川県金沢市": "金沢市", + "石川県小松市": "小松市", + "石川県加賀市": "加賀市", + "石川県白山市": "白山市", + "石川県能美市": "能美市", + "石川県珠洲市": "石川/能登", + "石川県羽咋市": "石川/能登", + "石川県志賀町": "石川/能登", + "石川県宝達志水町": "石川/能登", + "石川県中能登町": "石川/能登", + "石川県穴水町": "石川/能登", + "石川県能登町": "石川/能登", + "石川県七尾市": "七尾市", + "石川県輪島市": "輪島市", + "新潟県新潟市": "新潟市", + "新潟県五泉市": "新潟/下越", + "新潟県阿賀野市": "新潟/下越", + "新潟県胎内市": "新潟/下越", + "新潟県聖籠町": "新潟/下越", + "新潟県弥彦村": "新潟/下越", + "新潟県阿賀町": "新潟/下越", + "新潟県関川村": "新潟/下越", + "新潟県粟島浦村": "新潟/下越", + "新潟県新発田市": "新発田市", + "新潟県村上市": "村上市", + "新潟県燕市": "燕市", + "新潟県見附市": "新潟/中越", + "新潟県田上町": "新潟/中越", + "新潟県出雲崎町": "新潟/中越", + "新潟県刈羽村": "新潟/中越", + "新潟県長岡市": "長岡市", + "新潟県三条市": "三条市", + "新潟県柏崎市": "柏崎市", + "新潟県加茂市": "加茂市", + "新潟県小千谷市": "新潟/魚沼", + "新潟県魚沼市": "新潟/魚沼", + "新潟県南魚沼市": "新潟/魚沼", + "新潟県津南町": "新潟/魚沼", + "新潟県十日町市": "十日町市", + "新潟県湯沢町": "湯沢町", + "新潟県妙高市": "新潟/上越", + "新潟県糸魚川市": "糸魚川市", + "新潟県上越市": "上越市", + "新潟県佐渡市": "新潟/佐渡", + "富山県舟橋村": "富山/呉東", + "富山県上市町": "富山/呉東", + "富山県立山町": "富山/呉東", + "富山県入善町": "富山/呉東", + "富山県朝日町": "富山/呉東", + "富山県富山市": "富山市", + "富山県魚津市": "魚津市", + "富山県滑川市": "滑川市", + "富山県黒部市": "黒部市", + "富山県氷見市": "富山/呉西", + "富山県小矢部市": "富山/呉西", + "富山県高岡市": "高岡市", + "富山県砺波市": "砺波市", + "富山県南砺市": "南砺市", + "富山県射水市": "射水市", + "福井県あわら市": "福井/嶺北", + "福井県永平寺町": "福井/嶺北", + "福井県鯖江市": "福井/嶺北", + "福井県池田町": "福井/嶺北", + "福井県南越前町": "福井/嶺北", + "福井県越前町": "福井/嶺北", + "福井県福井市": "福井市", + "福井県越前市": "越前市", + "福井県坂井市": "坂井市", + "福井県大野市": "大野市", + "福井県勝山市": "勝山市", + "福井県高浜町": "福井/嶺南", + "福井県おおい町": "福井/嶺南", + "福井県若狭町": "福井/嶺南", + "福井県敦賀市": "敦賀市", + "福井県美浜町": "美浜町 (福井)", + "福井県小浜市": "小浜市", + "愛知県新城市": "愛知/東三河", + "愛知県設楽町": "愛知/東三河", + "愛知県東栄町": "愛知/東三河", + "愛知県豊根村": "愛知/東三河", + "愛知県豊橋市": "豊橋市", + "愛知県豊川市": "豊川市", + "愛知県蒲郡市": "蒲郡市", + "愛知県田原市": "田原市", + "愛知県高浜市": "愛知/西三河", + "愛知県碧南市": "愛知/西三河", + "愛知県みよし市": "愛知/西三河", + "愛知県幸田町": "愛知/西三河", + "愛知県豊田市": "豊田市", + "愛知県岡崎市": "岡崎市", + "愛知県安城市": "安城市", + "愛知県刈谷市": "刈谷市", + "愛知県西尾市": "西尾市", + "愛知県知立市": "知立市", + "愛知県大府市": "愛知/知多", + "愛知県知多市": "愛知/知多", + "愛知県阿久比町": "愛知/知多", + "愛知県東浦町": "愛知/知多", + "愛知県南知多町": "愛知/知多", + "愛知県美浜町": "愛知/知多", + "愛知県武豊町": "愛知/知多", + "愛知県半田市": "半田市", + "愛知県常滑市": "常滑市", + "愛知県東海市": "東海市", + "愛知県瀬戸市": "愛知/東尾張", + "愛知県東郷町": "愛知/東尾張", + "愛知県豊山町": "愛知/東尾張", + "愛知県春日井市": "春日井市", + "愛知県小牧市": "小牧市", + "愛知県豊明市": "豊明市", + "愛知県尾張旭市": "尾張旭市", + "愛知県日進市": "日進市", + "愛知県清須市": "清須市", + "愛知県北名古屋市": "北名古屋市", + "愛知県長久手市": "長久手市", + "愛知県名古屋市": "名古屋市", + "愛知県津島市": "愛知/海部", + "愛知県弥富市": "愛知/海部", + "愛知県大治町": "愛知/海部", + "愛知県蟹江町": "愛知/海部", + "愛知県愛西市": "愛西市", + "愛知県あま市": "あま市", + "愛知県飛島村": "飛島村", + "愛知県犬山市": "愛知/西尾張", + "愛知県稲沢市": "愛知/西尾張", + "愛知県大口町": "愛知/西尾張", + "愛知県扶桑町": "愛知/西尾張", + "愛知県一宮市": "一宮市", + "愛知県江南市": "江南市", + "愛知県岩倉市": "岩倉市", + "静岡県静岡市": "静岡市", + "静岡県浜松市": "浜松市", + "静岡県下田市": "静岡/伊豆", + "静岡県東伊豆町": "静岡/伊豆", + "静岡県河津町": "静岡/伊豆", + "静岡県南伊豆町": "静岡/伊豆", + "静岡県松崎町": "静岡/伊豆", + "静岡県西伊豆町": "静岡/伊豆", + "静岡県函南町": "静岡/伊豆", + "静岡県熱海市": "熱海市", + "静岡県三島市": "三島市", + "静岡県伊東市": "伊東市", + "静岡県伊豆市": "伊豆市", + "静岡県伊豆の国市": "伊豆の国市", + "静岡県清水町": "静岡/東部", + "静岡県小山町": "静岡/東部", + "静岡県沼津市": "沼津市", + "静岡県富士宮市": "富士宮市", + "静岡県富士市": "富士市", + "静岡県御殿場市": "御殿場市", + "静岡県裾野市": "裾野市", + "静岡県長泉町": "長泉町", + "静岡県焼津市": "静岡/中部", + "静岡県藤枝市": "静岡/中部", + "静岡県牧之原市": "静岡/中部", + "静岡県吉田町": "静岡/中部", + "静岡県川根本町": "静岡/中部", + "静岡県島田市": "島田市", + "静岡県袋井市": "静岡/遠江", + "静岡県御前崎市": "静岡/遠江", + "静岡県菊川市": "静岡/遠江", + "静岡県森町": "静岡/遠江", + "静岡県磐田市": "磐田市", + "静岡県掛川市": "掛川市", + "静岡県湖西市": "湖西市", + "岐阜県瑞浪市": "岐阜/東濃", + "岐阜県多治見市": "多治見市", + "岐阜県中津川市": "中津川市", + "岐阜県恵那市": "恵那市", + "岐阜県土岐市": "土岐市", + "岐阜県羽島市": "岐阜/中濃", + "岐阜県美濃加茂市": "岐阜/中濃", + "岐阜県山県市": "岐阜/中濃", + "岐阜県岐南町": "岐阜/中濃", + "岐阜県笠松町": "岐阜/中濃", + "岐阜県坂祝町": "岐阜/中濃", + "岐阜県富加町": "岐阜/中濃", + "岐阜県八百津町": "岐阜/中濃", + "岐阜県川辺町": "岐阜/中濃", + "岐阜県七宗町": "岐阜/中濃", + "岐阜県白川町": "岐阜/中濃", + "岐阜県東白川村": "岐阜/中濃", + "岐阜県御嵩町": "岐阜/中濃", + "岐阜県岐阜市": "岐阜市", + "岐阜県関市": "関市", + "岐阜県美濃市": "美濃市", + "岐阜県各務原市": "各務原市", + "岐阜県可児市": "可児市", + "岐阜県郡上市": "郡上市", + "岐阜県瑞穂市": "岐阜/西濃", + "岐阜県本巣市": "岐阜/西濃", + "岐阜県海津市": "岐阜/西濃", + "岐阜県養老町": "岐阜/西濃", + "岐阜県垂井町": "岐阜/西濃", + "岐阜県神戸町": "岐阜/西濃", + "岐阜県輪之内町": "岐阜/西濃", + "岐阜県安八町": "岐阜/西濃", + "岐阜県大野町": "岐阜/西濃", + "岐阜県池田町": "岐阜/西濃", + "岐阜県揖斐川町": "岐阜/西濃", + "岐阜県北方町": "岐阜/西濃", + "岐阜県大垣市": "大垣市", + "岐阜県関ケ原町": "関ケ原町", + "岐阜県白川村": "岐阜/飛騨", + "岐阜県高山市": "高山市", + "岐阜県下呂市": "下呂市", + "岐阜県飛騨市": "飛騨市", + "三重県いなべ市": "三重/北勢", + "三重県木曽岬町": "三重/北勢", + "三重県東員町": "三重/北勢", + "三重県菰野町": "三重/北勢", + "三重県朝日町": "三重/北勢", + "三重県川越町": "三重/北勢", + "三重県四日市市": "四日市市", + "三重県桑名市": "桑名市", + "三重県鈴鹿市": "鈴鹿市", + "三重県亀山市": "亀山市", + "三重県玉城町": "三重/南勢", + "三重県度会町": "三重/南勢", + "三重県大紀町": "三重/南勢", + "三重県南伊勢町": "三重/南勢", + "三重県津市": "津市", + "三重県伊勢市": "伊勢市", + "三重県松阪市": "松阪市", + "三重県名張市": "名張市", + "三重県伊賀市": "伊賀市", + "三重県鳥羽市": "三重/志摩", + "三重県志摩市": "三重/志摩", + "三重県御浜町": "三重/東紀州", + "三重県紀宝町": "三重/東紀州", + "三重県尾鷲市": "尾鷲市", + "三重県熊野市": "熊野市", + "三重県紀北町": "紀北町", + "三重県多気町": "多気町", + "三重県明和町": "明和町", + "三重県大台町": "大台町", + "大阪府大阪市": "大阪市", + "大阪府豊中市": "豊中市", + "大阪府池田市": "池田市", + "大阪府吹田市": "吹田市", + "大阪府高槻市": "高槻市", + "大阪府茨木市": "茨木市", + "大阪府箕面市": "箕面市", + "大阪府摂津市": "摂津市", + "大阪府島本町": "島本町", + "大阪府豊能町": "豊能町", + "大阪府能勢町": "能勢町", + "大阪府八尾市": "八尾市", + "大阪府富田林市": "富田林市", + "大阪府河内長野市": "河内長野市", + "大阪府松原市": "松原市", + "大阪府柏原市": "柏原市", + "大阪府羽曳野市": "羽曳野市", + "大阪府藤井寺市": "藤井寺市", + "大阪府東大阪市": "東大阪市", + "大阪府大阪狭山市": "大阪狭山市", + "大阪府太子町": "太子町 (大阪)", + "大阪府河南町": "河南町", + "大阪府千早赤阪村": "千早赤阪村", + "大阪府守口市": "守口市", + "大阪府枚方市": "枚方市", + "大阪府寝屋川市": "寝屋川市", + "大阪府大東市": "大東市", + "大阪府門真市": "門真市", + "大阪府四條畷市": "四條畷市", + "大阪府交野市": "交野市", + "大阪府高石市": "大阪/泉北", + "大阪府泉大津市": "大阪/泉北", + "大阪府忠岡町": "大阪/泉北", + "大阪府和泉市": "和泉市", + "大阪府堺市": "堺市", + "大阪府泉南市": "大阪/泉南", + "大阪府熊取町": "大阪/泉南", + "大阪府田尻町": "大阪/泉南", + "大阪府岸和田市": "岸和田市", + "大阪府貝塚市": "貝塚市", + "大阪府泉佐野市": "泉佐野市", + "大阪府阪南市": "阪南市", + "大阪府岬町": "岬町", + "兵庫県神戸市": "神戸市", + "兵庫県尼崎市": "尼崎市", + "兵庫県西宮市": "西宮市", + "兵庫県芦屋市": "芦屋市", + "兵庫県伊丹市": "伊丹市", + "兵庫県宝塚市": "宝塚市", + "兵庫県川西市": "川西市", + "兵庫県三田市": "三田市", + "兵庫県稲美町": "兵庫/東播磨", + "兵庫県播磨町": "兵庫/東播磨", + "兵庫県明石市": "明石市", + "兵庫県高砂市": "高砂市", + "兵庫県市川町": "兵庫/西播磨", + "兵庫県福崎町": "兵庫/西播磨", + "兵庫県神河町": "兵庫/西播磨", + "兵庫県太子町": "兵庫/西播磨", + "兵庫県上郡町": "兵庫/西播磨", + "兵庫県佐用町": "兵庫/西播磨", + "兵庫県姫路市": "姫路市", + "兵庫県相生市": "相生市", + "兵庫県赤穂市": "赤穂市", + "兵庫県宍粟市": "宍粟市", + "兵庫県たつの市": "たつの市", + "兵庫県西脇市": "兵庫/北播磨", + "兵庫県小野市": "兵庫/北播磨", + "兵庫県加東市": "兵庫/北播磨", + "兵庫県三木市": "三木市", + "兵庫県加西市": "加西市", + "兵庫県丹波篠山市": "丹波篠山市", + "兵庫県丹波市": "丹波市", + "兵庫県香美町": "兵庫/但馬", + "兵庫県新温泉町": "兵庫/但馬", + "兵庫県豊岡市": "豊岡市", + "兵庫県養父市": "養父市", + "兵庫県朝来市": "朝来市", + "兵庫県洲本市": "洲本市", + "兵庫県南あわじ市": "南あわじ市", + "兵庫県淡路市": "淡路市", + "兵庫県加古川市": "加古川市", + "兵庫県猪名川町": "猪名川町", + "兵庫県多可町": "多可町", + "京都府宇治田原町": "京都/山城", + "京都府笠置町": "京都/山城", + "京都府宇治市": "宇治市", + "京都府城陽市": "城陽市", + "京都府向日市": "向日市", + "京都府長岡京市": "長岡京市", + "京都府八幡市": "八幡市", + "京都府京田辺市": "京田辺市", + "京都府木津川市": "木津川市", + "京都府大山崎町": "大山崎町", + "京都府久御山町": "久御山町", + "京都府井手町": "井手町", + "京都府和束町": "和束町", + "京都府精華町": "精華町", + "京都府南山城村": "南山城村", + "京都府京都市": "京都市", + "京都府綾部市": "京都/丹波", + "京都府福知山市": "福知山市", + "京都府亀岡市": "亀岡市", + "京都府南丹市": "南丹市", + "京都府京丹波町": "京丹波町", + "京都府伊根町": "京都/丹後", + "京都府与謝野町": "京都/丹後", + "京都府舞鶴市": "舞鶴市", + "京都府宮津市": "宮津市", + "京都府京丹後市": "京丹後市", + "滋賀県日野町": "滋賀/湖東", + "滋賀県竜王町": "滋賀/湖東", + "滋賀県愛荘町": "滋賀/湖東", + "滋賀県豊郷町": "滋賀/湖東", + "滋賀県甲良町": "滋賀/湖東", + "滋賀県多賀町": "滋賀/湖東", + "滋賀県彦根市": "彦根市", + "滋賀県近江八幡市": "近江八幡市", + "滋賀県東近江市": "東近江市", + "滋賀県高島市": "滋賀/湖西", + "滋賀県守山市": "滋賀/湖南", + "滋賀県栗東市": "滋賀/湖南", + "滋賀県野洲市": "滋賀/湖南", + "滋賀県大津市": "大津市", + "滋賀県草津市": "草津市", + "滋賀県長浜市": "長浜市", + "滋賀県米原市": "米原市", + "滋賀県甲賀市": "甲賀市", + "滋賀県湖南市": "湖南市", + "奈良県山添村": "奈良/北和・西和", + "奈良県三郷町": "奈良/北和・西和", + "奈良県斑鳩町": "奈良/北和・西和", + "奈良県安堵町": "奈良/北和・西和", + "奈良県上牧町": "奈良/北和・西和", + "奈良県河合町": "奈良/北和・西和", + "奈良県奈良市": "奈良市", + "奈良県大和郡山市": "大和郡山市", + "奈良県天理市": "天理市", + "奈良県生駒市": "生駒市", + "奈良県王寺町": "王寺町", + "奈良県川西町": "奈良/中和・東和", + "奈良県三宅町": "奈良/中和・東和", + "奈良県田原本町": "奈良/中和・東和", + "奈良県曽爾村": "奈良/中和・東和", + "奈良県御杖村": "奈良/中和・東和", + "奈良県高取町": "奈良/中和・東和", + "奈良県明日香村": "奈良/中和・東和", + "奈良県広陵町": "奈良/中和・東和", + "奈良県大和高田市": "大和高田市", + "奈良県橿原市": "橿原市", + "奈良県桜井市": "桜井市", + "奈良県御所市": "御所市", + "奈良県香芝市": "香芝市", + "奈良県葛城市": "葛城市", + "奈良県宇陀市": "宇陀市", + "奈良県吉野町": "奈良/吉野", + "奈良県黒滝村": "奈良/吉野", + "奈良県天川村": "奈良/吉野", + "奈良県野迫川村": "奈良/吉野", + "奈良県川上村": "奈良/吉野", + "奈良県上北山村": "奈良/吉野", + "奈良県下北山村": "奈良/吉野", + "奈良県東吉野村": "奈良/吉野", + "奈良県五條市": "五條市", + "奈良県大淀町": "大淀町", + "奈良県下市町": "下市町", + "奈良県十津川村": "十津川村", + "奈良県平群町": "平群町", + "和歌山県紀の川市": "和歌山/紀北", + "和歌山県岩出市": "和歌山/紀北", + "和歌山県紀美野町": "和歌山/紀北", + "和歌山県かつらぎ町": "和歌山/紀北", + "和歌山県九度山町": "和歌山/紀北", + "和歌山県和歌山市": "和歌山市", + "和歌山県海南市": "海南市", + "和歌山県橋本市": "橋本市", + "和歌山県高野町": "高野町", + "和歌山県有田市": "和歌山/紀中", + "和歌山県御坊市": "和歌山/紀中", + "和歌山県湯浅町": "和歌山/紀中", + "和歌山県広川町": "和歌山/紀中", + "和歌山県有田川町": "和歌山/紀中", + "和歌山県美浜町": "和歌山/紀中", + "和歌山県日高町": "和歌山/紀中", + "和歌山県由良町": "和歌山/紀中", + "和歌山県印南町": "和歌山/紀中", + "和歌山県みなべ町": "和歌山/紀中", + "和歌山県日高川町": "和歌山/紀中", + "和歌山県上富田町": "和歌山/紀南", + "和歌山県すさみ町": "和歌山/紀南", + "和歌山県太地町": "和歌山/紀南", + "和歌山県古座川町": "和歌山/紀南", + "和歌山県北山村": "和歌山/紀南", + "和歌山県田辺市": "田辺市", + "和歌山県新宮市": "新宮市", + "和歌山県白浜町": "白浜町", + "和歌山県串本町": "串本町", + "和歌山県那智勝浦町": "那智勝浦町", + "愛媛県上島町": "愛媛/東予", + "愛媛県今治市": "今治市", + "愛媛県新居浜市": "新居浜市", + "愛媛県西条市": "西条市", + "愛媛県四国中央市": "四国中央市", + "愛媛県伊予市": "愛媛/中予", + "愛媛県東温市": "愛媛/中予", + "愛媛県久万高原町": "愛媛/中予", + "愛媛県松前町": "愛媛/中予", + "愛媛県砥部町": "愛媛/中予", + "愛媛県内子町": "愛媛/中予", + "愛媛県松山市": "松山市", + "愛媛県大洲市": "愛媛/南予", + "愛媛県西予市": "愛媛/南予", + "愛媛県伊方町": "愛媛/南予", + "愛媛県松野町": "愛媛/南予", + "愛媛県鬼北町": "愛媛/南予", + "愛媛県愛南町": "愛媛/南予", + "愛媛県宇和島市": "宇和島市", + "愛媛県八幡浜市": "八幡浜市", + "香川県三木町": "香川/東讃", + "香川県直島町": "香川/東讃", + "香川県高松市": "高松市", + "香川県さぬき市": "さぬき市", + "香川県東かがわ市": "東かがわ市", + "香川県坂出市": "香川/西讃", + "香川県善通寺市": "香川/西讃", + "香川県三豊市": "香川/西讃", + "香川県宇多津町": "香川/西讃", + "香川県綾川町": "香川/西讃", + "香川県琴平町": "香川/西讃", + "香川県多度津町": "香川/西讃", + "香川県まんのう町": "香川/西讃", + "香川県丸亀市": "丸亀市", + "香川県観音寺市": "観音寺市", + "香川県土庄町": "香川/小豆島", + "香川県小豆島町": "香川/小豆島", + "高知県室戸市": "高知/東部", + "高知県安芸市": "高知/東部", + "高知県南国市": "高知/東部", + "高知県香南市": "高知/東部", + "高知県香美市": "高知/東部", + "高知県東洋町": "高知/東部", + "高知県奈半利町": "高知/東部", + "高知県田野町": "高知/東部", + "高知県安田町": "高知/東部", + "高知県北川村": "高知/東部", + "高知県馬路村": "高知/東部", + "高知県芸西村": "高知/東部", + "高知県本山町": "高知/東部", + "高知県大豊町": "高知/東部", + "高知県土佐町": "高知/東部", + "高知県大川村": "高知/東部", + "高知県高知市": "高知市", + "高知県土佐市": "高知/西部", + "高知県須崎市": "高知/西部", + "高知県中土佐町": "高知/西部", + "高知県佐川町": "高知/西部", + "高知県越知町": "高知/西部", + "高知県檮原町": "高知/西部", + "高知県日高村": "高知/西部", + "高知県津野町": "高知/西部", + "高知県四万十町": "高知/西部", + "高知県いの町": "高知/西部", + "高知県仁淀川町": "高知/西部", + "高知県宿毛市": "高知/幡多", + "高知県土佐清水市": "高知/幡多", + "高知県四万十市": "高知/幡多", + "高知県大月町": "高知/幡多", + "高知県三原村": "高知/幡多", + "高知県黒潮町": "高知/幡多", + "徳島県阿波市": "徳島/東部", + "徳島県勝浦町": "徳島/東部", + "徳島県上勝町": "徳島/東部", + "徳島県佐那河内村": "徳島/東部", + "徳島県石井町": "徳島/東部", + "徳島県神山町": "徳島/東部", + "徳島県板野町": "徳島/東部", + "徳島県上板町": "徳島/東部", + "徳島県徳島市": "徳島市", + "徳島県鳴門市": "鳴門市", + "徳島県小松島市": "小松島市", + "徳島県吉野川市": "吉野川市", + "徳島県松茂町": "松茂町", + "徳島県藍住町": "藍住町", + "徳島県北島町": "北島町", + "徳島県美馬市": "徳島/西部", + "徳島県つるぎ町": "徳島/西部", + "徳島県東みよし町": "徳島/西部", + "徳島県三好市": "三好市", + "徳島県那賀町": "徳島/南部", + "徳島県牟岐町": "徳島/南部", + "徳島県美波町": "徳島/南部", + "徳島県海陽町": "徳島/南部", + "徳島県阿南市": "阿南市", + "岡山県瀬戸内市": "岡山/備前", + "岡山県赤磐市": "岡山/備前", + "岡山県和気町": "岡山/備前", + "岡山県岡山市": "岡山市", + "岡山県玉野市": "玉野市", + "岡山県備前市": "備前市", + "岡山県井原市": "岡山/備中", + "岡山県浅口市": "岡山/備中", + "岡山県早島町": "岡山/備中", + "岡山県里庄町": "岡山/備中", + "岡山県矢掛町": "岡山/備中", + "岡山県吉備中央町": "岡山/備中", + "岡山県倉敷市": "倉敷市", + "岡山県笠岡市": "笠岡市", + "岡山県総社市": "総社市", + "岡山県高梁市": "高梁市", + "岡山県新見市": "新見市", + "岡山県真庭市": "岡山/美作", + "岡山県新庄村": "岡山/美作", + "岡山県鏡野町": "岡山/美作", + "岡山県勝央町": "岡山/美作", + "岡山県奈義町": "岡山/美作", + "岡山県西粟倉村": "岡山/美作", + "岡山県久米南町": "岡山/美作", + "岡山県美咲町": "岡山/美作", + "岡山県津山市": "津山市", + "岡山県美作市": "美作市", + "広島県世羅町": "広島/備後", + "広島県神石高原町": "広島/備後", + "広島県三原市": "三原市", + "広島県尾道市": "尾道市", + "広島県福山市": "福山市", + "広島県府中市": "府中市 (広島)", + "広島県三次市": "三次市", + "広島県庄原市": "庄原市", + "広島県大竹市": "広島/安芸", + "広島県安芸高田市": "広島/安芸", + "広島県海田町": "広島/安芸", + "広島県熊野町": "広島/安芸", + "広島県坂町": "広島/安芸", + "広島県安芸太田町": "広島/安芸", + "広島県北広島町": "広島/安芸", + "広島県大崎上島町": "広島/安芸", + "広島県広島市": "広島市", + "広島県呉市": "呉市", + "広島県竹原市": "竹原市", + "広島県東広島市": "東広島市", + "広島県廿日市市": "廿日市市", + "広島県江田島市": "江田島市", + "広島県府中町": "府中町", + "島根県安来市": "島根/出雲", + "島根県雲南市": "島根/出雲", + "島根県飯南町": "島根/出雲", + "島根県松江市": "松江市", + "島根県出雲市": "出雲市", + "島根県益田市": "島根/石見", + "島根県江津市": "島根/石見", + "島根県川本町": "島根/石見", + "島根県美郷町": "島根/石見", + "島根県邑南町": "島根/石見", + "島根県津和野町": "島根/石見", + "島根県吉賀町": "島根/石見", + "島根県浜田市": "浜田市", + "島根県大田市": "大田市", + "島根県海士町": "島根/隠岐", + "島根県西ノ島町": "島根/隠岐", + "島根県知夫村": "島根/隠岐", + "島根県隠岐の島町": "島根/隠岐", + "島根県奥出雲町": "奥出雲町", + "鳥取県岩美町": "鳥取/因幡", + "鳥取県若桜町": "鳥取/因幡", + "鳥取県智頭町": "鳥取/因幡", + "鳥取県八頭町": "鳥取/因幡", + "鳥取県鳥取市": "鳥取市", + "鳥取県倉吉市": "鳥取/伯耆", + "鳥取県境港市": "鳥取/伯耆", + "鳥取県三朝町": "鳥取/伯耆", + "鳥取県湯梨浜町": "鳥取/伯耆", + "鳥取県琴浦町": "鳥取/伯耆", + "鳥取県北栄町": "鳥取/伯耆", + "鳥取県日吉津村": "鳥取/伯耆", + "鳥取県大山町": "鳥取/伯耆", + "鳥取県南部町": "鳥取/伯耆", + "鳥取県伯耆町": "鳥取/伯耆", + "鳥取県日南町": "鳥取/伯耆", + "鳥取県日野町": "鳥取/伯耆", + "鳥取県江府町": "鳥取/伯耆", + "鳥取県米子市": "米子市", + "山口県下松市": "山口/周防", + "山口県光市": "山口/周防", + "山口県柳井市": "山口/周防", + "山口県周防大島町": "山口/周防", + "山口県和木町": "山口/周防", + "山口県上関町": "山口/周防", + "山口県田布施町": "山口/周防", + "山口県平生町": "山口/周防", + "山口県山口市": "山口市", + "山口県防府市": "防府市", + "山口県岩国市": "岩国市", + "山口県周南市": "周南市", + "山口県長門市": "山口/長門", + "山口県阿武町": "山口/長門", + "山口県下関市": "下関市", + "山口県宇部市": "宇部市", + "山口県萩市": "萩市", + "山口県美祢市": "美祢市", + "山口県山陽小野田市": "山陽小野田市", + "福岡県行橋市": "福岡/北九州", + "福岡県豊前市": "福岡/北九州", + "福岡県みやこ町": "福岡/北九州", + "福岡県吉富町": "福岡/北九州", + "福岡県上毛町": "福岡/北九州", + "福岡県築上町": "福岡/北九州", + "福岡県芦屋町": "福岡/北九州", + "福岡県水巻町": "福岡/北九州", + "福岡県岡垣町": "福岡/北九州", + "福岡県遠賀町": "福岡/北九州", + "福岡県北九州市": "北九州市", + "福岡県苅田町": "苅田町", + "福岡県中間市": "中間市", + "福岡県田川市": "福岡/筑豊", + "福岡県宮若市": "福岡/筑豊", + "福岡県嘉麻市": "福岡/筑豊", + "福岡県小竹町": "福岡/筑豊", + "福岡県鞍手町": "福岡/筑豊", + "福岡県桂川町": "福岡/筑豊", + "福岡県香春町": "福岡/筑豊", + "福岡県添田町": "福岡/筑豊", + "福岡県糸田町": "福岡/筑豊", + "福岡県川崎町": "福岡/筑豊", + "福岡県大任町": "福岡/筑豊", + "福岡県赤村": "福岡/筑豊", + "福岡県福智町": "福岡/筑豊", + "福岡県直方市": "直方市", + "福岡県飯塚市": "飯塚市", + "福岡県宇美町": "福岡/福岡", + "福岡県篠栗町": "福岡/福岡", + "福岡県志免町": "福岡/福岡", + "福岡県須恵町": "福岡/福岡", + "福岡県新宮町": "福岡/福岡", + "福岡県久山町": "福岡/福岡", + "福岡県粕屋町": "福岡/福岡", + "福岡県筑前町": "福岡/福岡", + "福岡県東峰村": "福岡/福岡", + "福岡県福岡市": "福岡市", + "福岡県宗像市": "宗像市", + "福岡県太宰府市": "太宰府市", + "福岡県春日市": "春日市", + "福岡県大野城市": "大野城市", + "福岡県古賀市": "古賀市", + "福岡県福津市": "福津市", + "福岡県朝倉市": "朝倉市", + "福岡県糸島市": "糸島市", + "福岡県那珂川市": "那珂川市", + "福岡県八女市": "福岡/筑後", + "福岡県筑後市": "福岡/筑後", + "福岡県小郡市": "福岡/筑後", + "福岡県うきは市": "福岡/筑後", + "福岡県みやま市": "福岡/筑後", + "福岡県大刀洗町": "福岡/筑後", + "福岡県大木町": "福岡/筑後", + "福岡県広川町": "福岡/筑後", + "福岡県大牟田市": "大牟田市", + "福岡県久留米市": "久留米市", + "福岡県柳川市": "柳川市", + "福岡県大川市": "大川市", + "福岡県筑紫野市": "筑紫野市", + "佐賀県多久市": "佐賀/東部", + "佐賀県小城市": "佐賀/東部", + "佐賀県神埼市": "佐賀/東部", + "佐賀県吉野ヶ里町": "佐賀/東部", + "佐賀県基山町": "佐賀/東部", + "佐賀県上峰町": "佐賀/東部", + "佐賀県みやき町": "佐賀/東部", + "佐賀県佐賀市": "佐賀市", + "佐賀県鳥栖市": "鳥栖市", + "佐賀県武雄市": "佐賀/西部", + "佐賀県鹿島市": "佐賀/西部", + "佐賀県嬉野市": "佐賀/西部", + "佐賀県大町町": "佐賀/西部", + "佐賀県江北町": "佐賀/西部", + "佐賀県白石町": "佐賀/西部", + "佐賀県太良町": "佐賀/西部", + "佐賀県玄海町": "佐賀/松浦", + "佐賀県有田町": "佐賀/松浦", + "佐賀県唐津市": "唐津市", + "佐賀県伊万里市": "伊万里市", + "長崎県松浦市": "長崎/北松", + "長崎県小値賀町": "長崎/北松", + "長崎県佐々町": "長崎/北松", + "長崎県佐世保市": "佐世保市", + "長崎県平戸市": "平戸市", + "長崎県西海市": "長崎/彼杵", + "長崎県長与町": "長崎/彼杵", + "長崎県時津町": "長崎/彼杵", + "長崎県東彼杵町": "長崎/彼杵", + "長崎県川棚町": "長崎/彼杵", + "長崎県波佐見町": "長崎/彼杵", + "長崎県長崎市": "長崎市", + "長崎県諫早市": "諫早市", + "長崎県大村市": "大村市", + "長崎県雲仙市": "長崎/島原", + "長崎県南島原市": "長崎/島原", + "長崎県島原市": "島原市", + "長崎県壱岐市": "長崎/壱岐", + "長崎県対馬市": "長崎/対馬", + "長崎県五島市": "長崎/五島", + "長崎県新上五島町": "長崎/五島", + "熊本県玉名市": "熊本/北部", + "熊本県菊池市": "熊本/北部", + "熊本県合志市": "熊本/北部", + "熊本県玉東町": "熊本/北部", + "熊本県南関町": "熊本/北部", + "熊本県長洲町": "熊本/北部", + "熊本県和水町": "熊本/北部", + "熊本県大津町": "熊本/北部", + "熊本県菊陽町": "熊本/北部", + "熊本県荒尾市": "荒尾市", + "熊本県山鹿市": "山鹿市", + "熊本県阿蘇市": "熊本/阿蘇", + "熊本県南小国町": "熊本/阿蘇", + "熊本県小国町": "熊本/阿蘇", + "熊本県産山村": "熊本/阿蘇", + "熊本県高森町": "熊本/阿蘇", + "熊本県西原村": "熊本/阿蘇", + "熊本県南阿蘇村": "熊本/阿蘇", + "熊本県水俣市": "熊本/中南部", + "熊本県宇土市": "熊本/中南部", + "熊本県宇城市": "熊本/中南部", + "熊本県美里町": "熊本/中南部", + "熊本県御船町": "熊本/中南部", + "熊本県嘉島町": "熊本/中南部", + "熊本県益城町": "熊本/中南部", + "熊本県甲佐町": "熊本/中南部", + "熊本県山都町": "熊本/中南部", + "熊本県氷川町": "熊本/中南部", + "熊本県芦北町": "熊本/中南部", + "熊本県津奈木町": "熊本/中南部", + "熊本県熊本市": "熊本市", + "熊本県八代市": "八代市", + "熊本県錦町": "熊本/球磨", + "熊本県多良木町": "熊本/球磨", + "熊本県湯前町": "熊本/球磨", + "熊本県水上村": "熊本/球磨", + "熊本県相良村": "熊本/球磨", + "熊本県五木村": "熊本/球磨", + "熊本県山江村": "熊本/球磨", + "熊本県球磨村": "熊本/球磨", + "熊本県あさぎり町": "熊本/球磨", + "熊本県人吉市": "人吉市", + "熊本県上天草市": "熊本/天草", + "熊本県天草市": "熊本/天草", + "熊本県苓北町": "熊本/天草", + "大分県中津市": "中津市", + "大分県宇佐市": "宇佐市", + "大分県豊後高田市": "大分/国東", + "大分県杵築市": "大分/国東", + "大分県国東市": "大分/国東", + "大分県姫島村": "大分/国東", + "大分県由布市": "大分/中部", + "大分県日出町": "大分/中部", + "大分県大分市": "大分市", + "大分県別府市": "別府市", + "大分県九重町": "大分/西部", + "大分県玖珠町": "大分/西部", + "大分県日田市": "日田市", + "大分県竹田市": "竹田市", + "大分県臼杵市": "大分/南部", + "大分県津久見市": "大分/南部", + "大分県豊後大野市": "大分/南部", + "大分県佐伯市": "佐伯市", + "宮崎県日向市": "宮崎/北部", + "宮崎県門川町": "宮崎/北部", + "宮崎県椎葉村": "宮崎/北部", + "宮崎県諸塚村": "宮崎/北部", + "宮崎県美郷町": "宮崎/北部", + "宮崎県高千穂町": "宮崎/北部", + "宮崎県日之影町": "宮崎/北部", + "宮崎県五ヶ瀬町": "宮崎/北部", + "宮崎県延岡市": "延岡市", + "宮崎県西都市": "宮崎/中部", + "宮崎県高鍋町": "宮崎/中部", + "宮崎県新富町": "宮崎/中部", + "宮崎県西米良村": "宮崎/中部", + "宮崎県木城町": "宮崎/中部", + "宮崎県川南町": "宮崎/中部", + "宮崎県都農町": "宮崎/中部", + "宮崎県串間市": "宮崎/南部", + "宮崎県国富町": "宮崎/南部", + "宮崎県綾町": "宮崎/南部", + "宮崎県宮崎市": "宮崎市", + "宮崎県日南市": "日南市", + "宮崎県小林市": "宮崎/諸県", + "宮崎県えびの市": "宮崎/諸県", + "宮崎県三股町": "宮崎/諸県", + "宮崎県高原町": "宮崎/諸県", + "宮崎県都城市": "都城市", + "鹿児島県枕崎市": "鹿児島/中南薩", + "鹿児島県日置市": "鹿児島/中南薩", + "鹿児島県いちき串木野市": "鹿児島/中南薩", + "鹿児島県三島村": "鹿児島/中南薩", + "鹿児島県十島村": "鹿児島/中南薩", + "鹿児島県鹿児島市": "鹿児島市", + "鹿児島県指宿市": "指宿市", + "鹿児島県南さつま市": "南さつま市", + "鹿児島県南九州市": "南九州市", + "鹿児島県さつま町": "鹿児島/北薩", + "鹿児島県長島町": "鹿児島/北薩", + "鹿児島県阿久根市": "阿久根市", + "鹿児島県出水市": "出水市", + "鹿児島県伊佐市": "伊佐市", + "鹿児島県姶良市": "鹿児島/姶良", + "鹿児島県湧水町": "鹿児島/姶良", + "鹿児島県霧島市": "霧島市", + "鹿児島県大崎町": "鹿児島/大隅", + "鹿児島県東串良町": "鹿児島/大隅", + "鹿児島県錦江町": "鹿児島/大隅", + "鹿児島県南大隅町": "鹿児島/大隅", + "鹿児島県肝付町": "鹿児島/大隅", + "鹿児島県鹿屋市": "鹿屋市", + "鹿児島県垂水市": "垂水市", + "鹿児島県曽於市": "曽於市", + "鹿児島県志布志市": "志布志市", + "鹿児島県西之表市": "鹿児島/熊毛", + "鹿児島県中種子町": "鹿児島/熊毛", + "鹿児島県南種子町": "鹿児島/熊毛", + "鹿児島県屋久島町": "鹿児島/熊毛", + "鹿児島県薩摩川内市": "薩摩川内市", + "鹿児島県奄美市": "奄美市", + "鹿児島県大和村": "大和村", + "鹿児島県宇検村": "宇検村", + "鹿児島県瀬戸内町": "瀬戸内町", + "鹿児島県龍郷町": "龍郷町", + "鹿児島県喜界町": "喜界町", + "鹿児島県徳之島町": "徳之島町", + "鹿児島県天城町": "天城町", + "鹿児島県伊仙町": "伊仙町", + "鹿児島県和泊町": "和泊町", + "鹿児島県知名町": "知名町", + "鹿児島県与論町": "与論町", + "沖縄県那覇市": "那覇市", + "沖縄県宜野湾市": "宜野湾市", + "沖縄県石垣市": "石垣市", + "沖縄県浦添市": "浦添市", + "沖縄県名護市": "名護市", + "沖縄県糸満市": "糸満市", + "沖縄県沖縄市": "沖縄市", + "沖縄県豊見城市": "豊見城市", + "沖縄県うるま市": "うるま市", + "沖縄県宮古島市": "宮古島市", + "沖縄県南城市": "南城市", + "沖縄県国頭村": "国頭村", + "沖縄県大宜味村": "大宜味村", + "沖縄県東村": "東村", + "沖縄県今帰仁村": "今帰仁村", + "沖縄県本部町": "本部町", + "沖縄県恩納村": "恩納村", + "沖縄県宜野座村": "宜野座村", + "沖縄県金武町": "金武町", + "沖縄県伊江村": "伊江村", + "沖縄県読谷村": "読谷村", + "沖縄県嘉手納町": "嘉手納町", + "沖縄県北谷町": "北谷町", + "沖縄県北中城村": "北中城村", + "沖縄県中城村": "中城村", + "沖縄県西原町": "西原町", + "沖縄県与那原町": "与那原町", + "沖縄県南風原町": "南風原町", + "沖縄県渡嘉敷村": "渡嘉敷村", + "沖縄県座間味村": "座間味村", + "沖縄県粟国村": "粟国村", + "沖縄県渡名喜村": "渡名喜村", + "沖縄県南大東村": "南大東村", + "沖縄県北大東村": "北大東村", + "沖縄県伊平屋村": "伊平屋村", + "沖縄県伊是名村": "伊是名村", + "沖縄県久米島町": "久米島町", + "沖縄県八重瀬町": "八重瀬町", + "沖縄県多良間村": "多良間村", + "沖縄県竹富町": "竹富町", + "沖縄県与那国町": "与那国町" +} \ No newline at end of file diff --git a/city-symbol/index.ts b/city-symbol/index.ts index 5726f6dd..a683f1da 100644 --- a/city-symbol/index.ts +++ b/city-symbol/index.ts @@ -1,5 +1,8 @@ +import 'dotenv/config'; + import qs from 'querystring'; import {Mutex} from 'async-mutex'; +import {load as cheerioLoad} from 'cheerio'; import {stripIndent} from 'common-tags'; import {sample} from 'lodash'; import {increment} from '../achievements'; @@ -9,6 +12,9 @@ import openai from '../lib/openai'; import {SlackInterface} from '../lib/slack'; import {Loader} from '../lib/utils'; import {prefectures} from '../room-gacha/prefectures'; +import chakuwikiTitles from './chakuwiki-title-map.json'; + +const chakuwikiTitleMap = new Map(Object.entries(chakuwikiTitles)); const mutex = new Mutex(); @@ -17,7 +23,7 @@ const log = logger.child({bot: 'city-symbol'}); const promptTemplate = stripIndent` # 指示 - {{cityname}}が答えになるクイズを作るとして、答えのヒントになるような短い文章を3つ作成してください。まず、{{cityname}}に関してあなたが知っている情報と、以下に示す{{cityname}}のWikipedia記事の内容をもとに、{{cityname}}に関する基本的な情報に関する辞書的な説明文を作成してください。続いて、{{cityname}}に関するニュースなどをもとに、有名な事実や面白いトリビアなどの情報をまとめてください。特に、この市町村が日本一であるようなことがらや、有名な観光地などについて優先的に列挙してください。次に、これらの情報から適切に取捨選択し、ヒントとして適切になるように組み合わせ、答えに導くような短いヒントを作成してください。ヒントには{{cityname}}に関連する固有名詞をなるべく多く含めてください。最後の行に、作成した3つのヒントを、string[]型を持つJSONの文字列の配列として出力してください。 + {{cityname}}が答えになるクイズを作るとして、答えのヒントになるような短い文章を3つ作成してください。まず、{{cityname}}に関してあなたが知っている情報と、以下に示す{{cityname}}のブリタニカ百科事典・Chakuwiki・Wikipedia記事の内容をもとに、{{cityname}}に関する基本的な情報に関する辞書的な説明文を作成してください。続いて、{{cityname}}に関するニュースなどをもとに、有名な事実や面白いトリビアなどの情報をまとめてください。特に、この市町村が日本一であるようなことがらや、有名な観光地などについて優先的に列挙してください。次に、これらの情報から適切に取捨選択し、ヒントとして適切になるように組み合わせ、答えに導くような短いヒントを作成してください。ヒントには{{cityname}}に関連する固有名詞をなるべく多く含めてください。最後の行に、作成した3つのヒントを、string[]型を持つJSONの文字列の配列として出力してください。 ## ヒントとしての適切である基準 @@ -27,27 +33,35 @@ const promptTemplate = stripIndent` * ヒントの長さが50文字以内程度である。 * ヒントに嘘の情報が含まれていない。 * 知っていることが日々の生活でプラスになるような、面白い情報が含まれている。 - * ヒント1から3に進むにつれて、より答えに近い容易なヒントとなっている。 + * ヒント1がもっとも平易で直接的なヒントであり、ヒント3に進むにつれて、より市町村を連想しにくい難しい情報が含まれている。ヒント3が最も難しい情報を含んでいる。 ## ほかの市町村でのヒントの出題例 ### 「高知県高知市」が答えとなるクイズのヒントの出題例 - ヒント1: この市町村には、東経133度33分33秒・北緯33度33分33秒の通称「地球33番地」と呼ばれる地点が存在します。 + ヒント1: この市町村は、2021年までかつおの消費量で全国1位でしたが、宮崎市に抜かれました。 ヒント2: この市町村では、現存する日本最古の路面電車である土佐電気鉄道が運行しています。 - ヒント3: この市町村は、2021年までかつおの消費量で全国1位でしたが、宮崎市に抜かれました。 + ヒント3: この市町村には、東経133度33分33秒・北緯33度33分33秒の通称「地球33番地」と呼ばれる地点が存在します。 ### 「神奈川県山北町」が答えとなるクイズのヒントの出題例 - ヒント1: この市町村には古くから「お峰入り」という民俗芸能が伝わっており、この伝統文化を含む「風流踊り」は2022年にユネスコ無形文化遺産に登録されました。 + ヒント1: この市町村には、東名高速道路の渋滞ポイントとして有名な都夫良野トンネルがあります。 ヒント2: この市町村には、日本の「ダム湖百選」にも選ばれたことで有名な丹沢湖があります。 - ヒント3: この市町村には、東名高速道路の渋滞ポイントとして有名な都夫良野トンネルがあります。 + ヒント3: この市町村には古くから「お峰入り」という民俗芸能が伝わっており、この伝統文化を含む「風流踊り」は2022年にユネスコ無形文化遺産に登録されました。 ### 「北海道幌加内町」が答えとなるクイズのヒントの出題例 - ヒント1: この市町村は、ソバの作付面積が日本一多いことで知られています。 + ヒント1: この市町村では、非公式ながら1978年に-41.2度の気温を記録し、これは公式の日本最低気温である旭川市の-41.0度を下回る気温です。 ヒント2: この市町村には、日本最大の人造湖である朱鞠内湖があります。 - ヒント3: この市町村では、非公式ながら1978年に-41.2度の気温を記録し、これは公式の日本最低気温である旭川市の-41.0度を下回る気温です。 + ヒント3: この市町村は、ソバの作付面積が日本一多いことで知られています。 + + ## {{cityname}}に関するブリタニカ百科事典の記述 + + {{kotobank_description}} + + ## {{cityname}}に関するChakuwikiの記述 + + {{chakuwiki_description}} ## {{cityname}}のWikipedia記事の内容 @@ -68,10 +82,25 @@ interface CityInformation { placeImage: string; plainText: string; ruby: string; + kotobankDescription: string | null; + chakuwikiDescription: string | null; } type City = CitySymbol & CityInformation; +const extractWikipediaPlaintext = (content: string) => { + const normalizedContent = content + .replaceAll(/]*>.*?<\/ref>/g, '') + .replaceAll(/]*\/>/g, '') + .replaceAll(/\[\[File:[^\]]+\]\]/g, '') + .replaceAll(/\[\[([^\]|]+)\|([^\]]+)\]\]/g, '$2') + .replaceAll(/\[\[([^\]]+)\]\]/g, '$1') + .replaceAll(/^\|/g, '') + .replaceAll(/\{\{.*?\}\}/g, '') + .trim(); + return normalizedContent; +}; + const getWikipediaSource = async (prefName: string) => { const title = `${prefName}の${prefName === '東京都' ? '区' : ''}市町村章一覧`; log.info(`Getting wikipedia ${title}...`); @@ -100,15 +129,7 @@ const getWikipediaSource = async (prefName: string) => { break; } - const normalizedLine = line - .replaceAll(/]*>.*?<\/ref>/g, '') - .replaceAll(/]*\/>/g, '') - .replaceAll(/\[\[File:[^\]]+\]\]/g, '') - .replaceAll(/\[\[([^\]|]+)\|([^\]]+)\]\]/g, '$2') - .replaceAll(/\[\[([^\]]+)\]\]/g, '$1') - .replaceAll(/^\|/g, '') - .replaceAll(/\{\{.*?\}\}/g, '') - .trim(); + const normalizedLine = extractWikipediaPlaintext(line); const files = line.matchAll(/\[\[File:([^\]|]+)(:?\|[^\]]+)?\]\]/g); if (!normalizedLine.includes('||')) { @@ -180,10 +201,51 @@ const getPlaintextWikipedia = async (title: string): Promise => { return content; }; -const getCityInformation = async (title: string): Promise => { - log.info(`Getting wikipedia ${title}...`); +const getKotobankCityDescription = async (city: CitySymbol) => { + log.info(`Getting kotobank britannica information for ${city.cityName}...`); + const response = await fetch(`https://kotobank.jp/word/${city.cityName}`); - const url = `https://ja.wikipedia.org/w/api.php?${qs.encode({ + const text = await response.text(); + const $ = cheerioLoad(text); + const $britannica = $('article.dictype.britannica'); + if ($britannica.length === 0) { + log.warn(`Kotobank britannica information for ${city.cityName} not found`); + return null; + } + const $descriptions = $britannica.find('.description'); + + for (const description of $descriptions.toArray()) { + const $description = $(description); + const descriptionText = $description.text(); + if (!descriptionText) { + continue; + } + + const normalizedDescription = descriptionText + .replaceAll(/\s+/g, ' ') + .replaceAll(',', '、') + .trim(); + if (!normalizedDescription.startsWith(city.prefectureName)) { + continue; + } + + return normalizedDescription; + } + + log.warn(`Kotobank britannica information for ${city.cityName} not found`); + return null; +}; + +const getChakuwikiCityDescription = async (city: CitySymbol) => { + log.info(`Getting chakuwiki information for ${city.cityName}...`); + const fullCityName = `${city.prefectureName}${city.cityName}`; + const title = chakuwikiTitleMap.get(fullCityName); + if (!title) { + log.warn(`Chakuwiki title not found for ${fullCityName}`); + return null; + } + + const url = `https://chakuwiki.org/w/api.php?${qs.encode({ format: 'json', action: 'query', prop: 'revisions', @@ -194,6 +256,47 @@ const getCityInformation = async (title: string): Promise => { const response = await fetch(url); const json = await response.json(); + const pages = json?.query?.pages; + const content = pages?.[Object.keys(pages)[0]]?.revisions?.[0]?.['*']; + if (!content) { + log.warn(`Chakuwiki information for ${city.cityName} not found`); + return null; + } + + let isRumorSection = false; + const rumors: string[] = []; + for (const line of content.split('\n')) { + if (line.startsWith('=')) { + if (line.includes(city.cityName)) { + isRumorSection = true; + } else { + isRumorSection = false; + } + } else if (isRumorSection) { + const matches = line.match(/^#(?!\*)(.+)$/); + if (matches) { + rumors.push(extractWikipediaPlaintext(matches[1].trim())); + } + } + } + + return rumors.map((rumor) => `* ${rumor}`).join('\n'); +}; + +const getCityInformation = async (city: CitySymbol): Promise => { + log.info(`Getting wikipedia ${city.cityWikipediaName}...`); + + const url = `https://ja.wikipedia.org/w/api.php?${qs.encode({ + format: 'json', + action: 'query', + prop: 'revisions', + rvprop: 'content', + titles: city.cityWikipediaName, + })}`; + + const response = await fetch(url); + const json = await response.json(); + const pages = json?.query?.pages; const content = pages?.[Object.keys(pages)[0]]?.revisions?.[0]?.['*']; if (!content) { @@ -202,12 +305,15 @@ const getCityInformation = async (title: string): Promise => { const placeImage = extractPlaceImage(content); - const plainText = await getPlaintextWikipedia(title); + const plainText = await getPlaintextWikipedia(city.cityWikipediaName); const rubyMatches = plainText.match(/((.+?))は/); const ruby = rubyMatches?.[1] ?? ''; - return {placeImage, ruby, plainText}; + const kotobankDescription = await getKotobankCityDescription(city); + const chakuwikiDescription = await getChakuwikiCityDescription(city); + + return {placeImage, ruby, plainText, kotobankDescription, chakuwikiDescription}; }; const getRandomCitySymbol = async (): Promise => { @@ -217,7 +323,9 @@ const getRandomCitySymbol = async (): Promise => { cityName: '博多市', cityWikipediaName: '博多市', reason: '伯方の塩のパッケージに描かれている赤と青のストライプを直方体にあしらったもの', - plainText: '', + plainText: '博多市は、TSG CTF や TSG LIVE! の開催などを行ったTSG部員である。', + kotobankDescription: '博多市は、JavaScriptやTypeScriptなどのプログラミング言語を得意とするプログラマであり、AtCoderの最高レーティングは2309である。', + chakuwikiDescription: '博多市は、加熱した玉ねぎを食べることを苦手としており、麦から作られたウイスキーやビールなどの飲み物を嫌っている。', date: '2020年6月21日', notes: 'なし', files: ['https://raw.githubusercontent.com/hakatashi/icon/master/images/icon_480px.png'], @@ -229,7 +337,7 @@ const getRandomCitySymbol = async (): Promise => { const prefectureChosen = sample(Object.keys(prefectures)); const citySymbols = await getWikipediaSource(prefectureChosen); const citySymbol = sample(citySymbols); - const cityInformation = await getCityInformation(citySymbol.cityWikipediaName); + const cityInformation = await getCityInformation(citySymbol); return {...citySymbol, ...cityInformation}; }; @@ -258,7 +366,9 @@ const generateAiHints = async (city: City): Promise => { const prompt = promptTemplate .replaceAll(/{{cityname}}/g, cityname) .replaceAll(/{{reason}}/g, city.reason) - .replaceAll(/{{wikipedia_content}}/g, city.plainText); + .replaceAll(/{{wikipedia_content}}/g, city.plainText) + .replaceAll(/{{kotobank_description}}/g, city.kotobankDescription ?? '') + .replaceAll(/{{chakuwiki_description}}/g, city.chakuwikiDescription ?? ''); log.info(`Generating AI hints for ${cityname}...`); @@ -287,7 +397,8 @@ const generateAiHints = async (city: City): Promise => { } try { - const hints = JSON.parse(hintJson); + const rawHints = JSON.parse(hintJson); + const hints = rawHints.reverse(); log.info(`Generated hints: ${hints.join(', ')}`); const correctAnswers = getCorrectAnswers(city); const concealedHints = hints.map((hint: string) => {