Skip to content

Commit

Permalink
住居表示の先頭部分が大字と同じ場合に、大字の方がマッチングしてしまうケースを回避する (#132)
Browse files Browse the repository at this point in the history
* 住居表示の先頭部分が大字と同じ場合に、大字の方がマッチングしてしまうケースを回避する
* テストケース追加

Co-authored-by: Keitaroh Kobayashi <[email protected]>
  • Loading branch information
champierre and keichan34 authored Nov 8, 2021
1 parent 5cdf439 commit 9d13b72
Show file tree
Hide file tree
Showing 4 changed files with 56 additions and 5 deletions.
24 changes: 20 additions & 4 deletions src/lib/cacheRegexes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,9 @@ let cachedPrefecturePatterns: [string, string][] | undefined = undefined
const cachedCityPatterns: { [key: string]: [string, string][] } = {}
let cachedPrefectures: PrefectureList | undefined = undefined
const cachedTowns: { [key: string]: TownList } = {}
let cachedSameNamedPrefectureCityRegexPatterns: [string, string][] | undefined = undefined
let cachedSameNamedPrefectureCityRegexPatterns:
| [string, string][]
| undefined = undefined

export const getPrefectures = async () => {
if (typeof cachedPrefectures !== 'undefined') {
Expand Down Expand Up @@ -99,7 +101,15 @@ export const getTownRegexPatterns = async (pref: string, city: string) => {

// 少ない文字数の地名に対してミスマッチしないように文字の長さ順にソート
towns.sort((a, b) => {
return b.town.length - a.town.length
let aLen = a.town.length
let bLen = b.town.length

// 大字で始まる場合、優先度を低く設定する。
// 大字XX と XXYY が存在するケースもあるので、 XXYY を先にマッチしたい
if (a.town.startsWith('大字')) aLen -= 2
if (b.town.startsWith('大字')) bLen -= 2

return bLen - aLen
})

const patterns = towns.map((town) => {
Expand Down Expand Up @@ -155,7 +165,10 @@ export const getTownRegexPatterns = async (pref: string, city: string) => {
return patterns
}

export const getSameNamedPrefectureCityRegexPatterns = (prefs: string[], prefList: PrefectureList) => {
export const getSameNamedPrefectureCityRegexPatterns = (
prefs: string[],
prefList: PrefectureList,
) => {
if (typeof cachedSameNamedPrefectureCityRegexPatterns !== 'undefined') {
return cachedSameNamedPrefectureCityRegexPatterns
}
Expand All @@ -172,7 +185,10 @@ export const getSameNamedPrefectureCityRegexPatterns = (prefs: string[], prefLis
// 「福島県石川郡石川町」のように、市の名前が別の都道府県名から始まっているケースも考慮する。
for (let j = 0; j < _prefs.length; j++) {
if (city.indexOf(_prefs[j]) === 0) {
cachedSameNamedPrefectureCityRegexPatterns.push([`${pref}${city}`, `^${city}`])
cachedSameNamedPrefectureCityRegexPatterns.push([
`${pref}${city}`,
`^${city}`,
])
}
}
}
Expand Down
11 changes: 10 additions & 1 deletion test/addresses.csv
Original file line number Diff line number Diff line change
Expand Up @@ -663,6 +663,7 @@
埼玉県さいたま市緑区美園4丁目1-2,埼玉県,さいたま市緑区,美園四丁目,1-2
埼玉県さいたま市西区宮前町175-14,埼玉県,さいたま市西区,宮前町,175-14
埼玉県さいたま市西区西大宮3丁目56-18,埼玉県,さいたま市西区,西大宮三丁目,56-18
埼玉県さいたま市見沼区丸ヶ崎町9-1,埼玉県,さいたま市見沼区,丸ヶ崎町,9-1
埼玉県さいたま市見沼区南中丸745-22,埼玉県,さいたま市見沼区,大字南中丸,745-22
埼玉県さいたま市見沼区東大宮2丁目55-5,埼玉県,さいたま市見沼区,東大宮二丁目,55-5
埼玉県さいたま市見沼区東大宮5丁目24-3,埼玉県,さいたま市見沼区,東大宮五丁目,24-3
Expand Down Expand Up @@ -710,6 +711,7 @@
埼玉県川口市南鳩ヶ谷3丁目18-36,埼玉県,川口市,南鳩ヶ谷三丁目,18-36
埼玉県川口市南鳩ヶ谷5丁目15-4,埼玉県,川口市,南鳩ヶ谷五丁目,15-4
埼玉県川口市在家町29-12,埼玉県,川口市,在家町,29-12
埼玉県川口市大字芝字宮根3938-5,埼玉県,川口市,大字芝,字宮根3938-5
埼玉県川口市川口2丁目3-19,埼玉県,川口市,川口二丁目,3-19
埼玉県川口市川口3丁目2-1,埼玉県,川口市,川口三丁目,2-1
埼玉県川口市川口3丁目2-6,埼玉県,川口市,川口三丁目,2-6
Expand Down Expand Up @@ -737,12 +739,14 @@
埼玉県川口市芝新町12-24,埼玉県,川口市,芝新町,12-24
埼玉県川口市芝新町13-12,埼玉県,川口市,芝新町,13-12
埼玉県川口市芝新町6-21,埼玉県,川口市,芝新町,6-21
埼玉県川口市芝東町9-12,埼玉県,川口市,芝東町,9-12
埼玉県川口市芝1丁目23-5,埼玉県,川口市,芝一丁目,23-5
埼玉県川口市金山町7-6,埼玉県,川口市,金山町,7-6
埼玉県川口市青木1丁目18-5,埼玉県,川口市,青木一丁目,18-5
埼玉県川口市飯塚1丁目12番31号,埼玉県,川口市,飯塚一丁目,12-31
埼玉県川口市鳩ヶ谷本町2丁目11-8,埼玉県,川口市,鳩ヶ谷本町二丁目,11-8
埼玉県川口市鳩ヶ谷本町3丁目8-3,埼玉県,川口市,鳩ヶ谷本町三丁目,8-3
埼玉県川越市富士見町9-2,埼玉県,川越市,富士見町,9-2
埼玉県川越市小仙波町2丁目44-11,埼玉県,川越市,小仙波町二丁目,44-11
埼玉県川越市新宿町6丁目12-27,埼玉県,川越市,新宿町六丁目,12-27
埼玉県川越市新富町1丁目12-3,埼玉県,川越市,新富町一丁目,12-3
Expand Down Expand Up @@ -853,9 +857,14 @@
埼玉県越谷市大沢3丁目6-1,埼玉県,越谷市,大沢三丁目,6-1
埼玉県越谷市大沢4丁目15,埼玉県,越谷市,大沢四丁目,15
埼玉県越谷市宮本町5丁目133-15,埼玉県,越谷市,宮本町五丁目,133-15
埼玉県越谷市蒲生本町1-10,埼玉県,越谷市,大字蒲生,本町1-10
埼玉県越谷市登戸町8-34,埼玉県,越谷市,登戸町,8-34
埼玉県越谷市蒲生旭町8-31,埼玉県,越谷市,蒲生旭町,8-31
埼玉県越谷市蒲生本町1-10,埼玉県,越谷市,蒲生本町,1-10
埼玉県越谷市蒲生東町4-48,埼玉県,越谷市,蒲生東町,4-48
埼玉県越谷市蒲生茜町9-3,埼玉県,越谷市,蒲生茜町,9-3
埼玉県越谷市谷中町1丁目122-1,埼玉県,越谷市,谷中町一丁目,122-1
埼玉県越谷市赤山町1丁目278-4,埼玉県,越谷市,赤山町一丁目,278-4
埼玉県飯能市南町8-35,埼玉県,飯能市,南町,8-35
埼玉県鴻巣市人形2丁目2-45,埼玉県,鴻巣市,人形二丁目,2-45
埼玉県鴻巣市雷電1丁目1-27,埼玉県,鴻巣市,雷電一丁目,1-27
埼玉県鶴ヶ島市大字藤金880-1,埼玉県,鶴ヶ島市,大字藤金,880-1
Expand Down
9 changes: 9 additions & 0 deletions test/list.txt
Original file line number Diff line number Diff line change
Expand Up @@ -7247,3 +7247,12 @@
神奈川県川崎市中原区上丸子八幡町1491-5
神奈川県藤沢市辻堂元町2丁目19-13
神奈川県横浜市港北区菊名1丁目17-6
埼玉県越谷市蒲生茜町9-3
埼玉県川越市富士見町9-2
埼玉県さいたま市見沼区丸ヶ崎町9-1
埼玉県飯能市南町8-35
埼玉県越谷市登戸町8-34
埼玉県川口市芝東町9-12
埼玉県越谷市蒲生東町4-48
埼玉県越谷市蒲生旭町8-31
埼玉県川口市大字芝字宮根3938-5
17 changes: 17 additions & 0 deletions test/main.test.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
/* eslint-disable prettier/prettier */

import { normalize } from '../src/main'

test('大阪府堺市北区新金岡町4丁1−8', async () => {
Expand Down Expand Up @@ -812,3 +814,18 @@ test('福井県三方上中郡若狭町若狭テクノバレー1-1', async () =>
const res = await normalize('福井県三方上中郡若狭町若狭テクノバレー1-1')
expect(res).toStrictEqual({"pref": "福井県", "city": "三方上中郡若狭町", "town": "若狭テクノバレー", "addr": "1-1", "level": 3, "lat": 35.477349, "lng": 135.859423})
})

test('埼玉県越谷市大字蒲生3795-1', async () => {
const res = await normalize('埼玉県越谷市大字蒲生3795-1')
expect(res).toStrictEqual({"pref": "埼玉県", "city": "越谷市", "town": "大字蒲生", "addr": "3795-1", "level": 3, "lat": 35.860429, "lng": 139.790945})
})

test('埼玉県越谷市蒲生茜町9-3', async () => {
const res = await normalize('埼玉県越谷市蒲生茜町9-3')
expect(res).toStrictEqual({"pref": "埼玉県", "city": "越谷市", "town": "蒲生茜町", "addr": "9-3", "level": 3, "lat": 35.866741, "lng": 139.7888})
})

test('埼玉県川口市大字芝字宮根3938-5', async () => {
const res = await normalize('埼玉県川口市大字芝字宮根3938-5')
expect(res).toStrictEqual({"pref": "埼玉県", "city": "川口市", "town": "大字芝", "addr": "字宮根3938-5", "level": 3, "lat": 35.843399, "lng": 139.690803})
})

0 comments on commit 9d13b72

Please sign in to comment.