geonlp-platform / pygeonlp

pygeonlp, A python module for geotagging Japanese texts.
https://geonlp.ex.nii.ac.jp/
BSD 2-Clause "Simplified" License
19 stars 1 forks source link

「緑区おゆみ野三丁目15番地3」の住所抽出に失敗する #4

Closed t-sagara closed 3 years ago

t-sagara commented 3 years ago
>>> import pygeonlp.api as api
>>> from pygeonlp.api.devtool import pp_geojson
>>> import jageocoder
>>> api.init()
>>> dbdir = api.get_jageocoder_db_dir()
>>> jageocoder.init(f'sqlite:///{dbdir}/address.db', f'{dbdir}/address.trie')
>>> result = api.geoparse('緑区おゆみ野三丁目15番地3', jageocoder=jageocoder)
>>> pp_geojson(result)
【緑区おゆみ野三丁目15番:['千葉県', '千葉市', '緑区', 'おゆみ野', '三丁目', '15番']】 番地 3 EOS

上の結果の通り「15番」の「番」が「番地」の一部と重複している。

期待される正解:

【緑区おゆみ野三丁目15番地:['千葉県', '千葉市', '緑区', 'おゆみ野', '三丁目', '15番']】 3 EOS
t-sagara commented 3 years ago

住所ジオコーダーが返す「番地」と「番」は正確ではないので、 parser.py で形態素単位での分割結果をチェックする際に 「番」で終わる場合は「番地」として処理する暫定的な対応を行なった。

    def get_addresses(self, lattice, pos):
        ...
        address_string = geocoding_result[0][1]  # 変換できた住所文字列
        check_address = re.sub(r'番$', '番地', address_string)

        # 一致した文字列が形態素ノード列のどの部分に当たるかチェック
        surface = ''
        i = pos
        while i < len(lattice):
            new_surface = surface + lattice[i][0].surface
            if len(new_surface) > len(check_address):
                # 形態素 lattice[i] は住所の区切りと一致しないので
                # lattice[0:i] までを利用してジオコーディングをやり直す
                return self.get_addresses(lattice[0:i], pos)

            i += 1
            surface = new_surface
            if len(surface) == len(check_address):
                break
        ...