pygeonlp.api.parser module

class pygeonlp.api.parser.Parser(service=None, jageocoder=None, address_regex=None, scoring_class=None, scoring_options=None)

ベースクラス: object

形態素解析と地名語抽出を行なうパーザ。

service

利用する Service インスタンス。

Type

pygeonlp.service.Service

jageocoder_tree

住所ジオコーダー jageocoder の AddressTree インスタンス。

Type

jageocoder.address.AddressTree

address_regex

住所要素の先頭になりえる固有名クラスの正規表現(コンパイル済み)。

Type

regex

scoring_class

パスのスコアリングに利用するクラス。

Type

class

scoring_options

スコアリングクラスを初期化する際のオプションパラメータ。

Type

any

scorer

スコアリングを行なうクラスインスタンス。

Type

service.ScoringClass instance

__init__(service=None, jageocoder=None, address_regex=None, scoring_class=None, scoring_options=None)

パーザを初期化します。

パラメータ
  • service (pygeonlp.service.Service, optional) -- 拡張形態素解析や地名語の検索を行うための Service インスタンス。 省略した場合、 pygeonlp.api.default_service() を利用します。

  • jageocoder (bool, optional) -- 住所ジオコーダーを利用するかどうかを指定します。 False または省略した場合、ジオコーディング機能は使用しません。

  • address_regex (str, optional) -- 住所表記の開始とみなす地名語の固有名クラスを表す正規表現。 省略した場合、r'^(都道府県|市区町村|行政地域|居住地名)(/.+|)' を利用します。

  • scoring_class (class, optional) -- パスのスコアとノード間のスコアを計算する関数を持つ スコアリングクラス。 指定しない場合、pygeonlp.api.scoring モジュール内の ScoringClass が利用されます。

  • scoring_options (any, optional) -- スコアリングクラスの初期化に渡すオプションパラメータ。

add_address_candidates(lattice, keep_nodes=False, **kwargs)

ラティス表現に住所候補を追加します。

パラメータ
  • lattice (list) -- analyze_sentence の結果のラティス表現(住所を含まない)。

  • keep_nodes (bool, optional) -- 住所以外のノードを維持するかどうかを指示するフラグ。 デフォルトは False (維持しない)。

戻り値

住所候補を追加したラティス表現。

戻り値の型

list

サンプル

>>> import pygeonlp.api as api
>>> from pygeonlp.api.devtool import pp_lattice
>>> from pygeonlp.api.node import Node
>>> api.init()
>>> parser = api.parser.Parser(jageocoder=True)
>>> lattice = parser.analyze_sentence('アメリカ大使館:港区赤坂1-10-5')
>>> lattice_address = parser.add_address_candidates(lattice, True)
>>> pp_lattice(lattice_address)
#0:'アメリカ大使館'
  アメリカ大使館(NORMAL)
#1:':'
  :(NORMAL)
#2:'港区'
  港区(GEOWORD:['東京都'])
  港区(GEOWORD:['愛知県', '名古屋市'])
  港区(GEOWORD:['大阪府', '大阪市'])
  港区赤坂1-10-(ADDRESS:東京都/港区/赤坂/一丁目/10番)[6]
#3:'赤坂'
  赤坂(GEOWORD:['上毛電気鉄道', '上毛線'])
  赤坂(GEOWORD:['東京地下鉄', '9号線千代田線'])
  赤坂(GEOWORD:['富士急行', '大月線'])
  赤坂(GEOWORD:['福岡市', '1号線(空港線)'])
#4:'1'
  1(NORMAL)
#5:'-'
  -(NORMAL)
#6:'10'
  10(NORMAL)
#7:'-'
  -(NORMAL)
#8:'5'
  5(NORMAL)
>>> lattice_address = parser.add_address_candidates(lattice)
>>> pp_lattice(lattice_address)
#0:'アメリカ大使館'
  アメリカ大使館(NORMAL)
#1:':'
  :(NORMAL)
#2:'港区赤坂1-10-'
  港区赤坂1-10-(ADDRESS:東京都/港区/赤坂/一丁目/10番)[6]
#3:'5'
  5(NORMAL)
>>> node = lattice_address[2][0]
>>> len(node.morphemes)
6
>>> '東京都' in node.morphemes[0].prop['hypernym']
True
>>> node.morphemes[1].node_type == Node.NORMAL
True
analyze_sentence(sentence, **kwargs)

sentence を解析し、全ての地名語候補を含む Node リストを ラティス表現で返します。

パラメータ

sentence (str) -- 解析対象の文字列。

戻り値

ラティス表現。形態素ごとに、対応する地名語候補のリストを含むリストです。

戻り値の型

list

サンプル

>>> import pygeonlp.api as api
>>> api.init()
>>> parser = api.parser.Parser()
>>> for nodes in parser.analyze_sentence('NIIは千代田区一ツ橋2-1-2にあります。'):
...     [x.simple() for x in nodes]
...
['NII(NORMAL)']
['は(NORMAL)']
["千代田区(GEOWORD:['東京都'])"]
['一ツ橋(NORMAL)']
['2(NORMAL)']
['-(NORMAL)']
['1(NORMAL)']
['-(NORMAL)']
['2(NORMAL)']
['に(NORMAL)']
['あり(NORMAL)']
['ます(NORMAL)']
['。(NORMAL)']
geoparse(sentence, filters=None)

文を解析して GeoJSON Feature 形式に変換可能な dict のリストを返します。

パラメータ
  • sentence (str) -- 解析する文字列

  • filters (list) -- 適用するフィルタオブジェクトのリスト

戻り値

GeoJSON Feature 形式に変換可能な dict のリスト。

戻り値の型

list

サンプル

>>> import pygeonlp.api as api
>>> api.init()
>>> parser = api.parser.Parser()
>>> parser.geoparse('国会議事堂前まで歩きました。')
[{'type': 'Feature', 'geometry': {'type': 'Point', 'coordinates': [139.74305333333334, 35.673543333333335]}, 'properties': {'surface': '国会議事堂前', 'node_type': 'GEOWORD', 'morphemes': {'conjugated_form': '*', 'conjugation_type': '*', 'original_form': '国会議事堂前', 'pos': '名詞', 'prononciation': '', 'subclass1': '固有名詞', 'subclass2': '地名語', 'subclass3': 'cE8W4w:国会議事堂前駅', 'surface': '国会議事堂前', 'yomi': ''}, 'geoword_properties': {'body': '国会議事堂前', 'dictionary_id': 3, 'entry_id': '4NFELa', 'geolod_id': 'cE8W4w', 'hypernym': ['東京地下鉄', '9号線千代田線'], 'institution_type': '民営鉄道', 'latitude': '35.673543333333335', 'longitude': '139.74305333333334', 'ne_class': '鉄道施設/鉄道駅', 'railway_class': '普通鉄道', 'suffix': ['駅', ''], 'dictionary_identifier': 'geonlp:ksj-station-N02'}}}, {'type': 'Feature', 'geometry': None, 'properties': {'surface': 'まで', 'node_type': 'NORMAL', 'morphemes': {'conjugated_form': '*', 'conjugation_type': '*', 'original_form': 'まで', 'pos': '助詞', 'prononciation': 'マデ', 'subclass1': '副助詞', 'subclass2': '*', 'subclass3': '*', 'surface': 'まで', 'yomi': 'マデ'}}}, {'type': 'Feature', 'geometry': None, 'properties': {'surface': '歩き', 'node_type': 'NORMAL', 'morphemes': {'conjugated_form': '五段・カ行イ音便', 'conjugation_type': '連用形', 'original_form': '歩く', 'pos': '動詞', 'prononciation': 'アルキ', 'subclass1': '自立', 'subclass2': '*', 'subclass3': '*', 'surface': '歩き', 'yomi': 'アルキ'}}}, {'type': 'Feature', 'geometry': None, 'properties': {'surface': 'まし', 'node_type': 'NORMAL', 'morphemes': {'conjugated_form': '特殊・マス', 'conjugation_type': '連用形', 'original_form': 'ます', 'pos': '助動詞', 'prononciation': 'マシ', 'subclass1': '*', 'subclass2': '*', 'subclass3': '*', 'surface': 'まし', 'yomi': 'マシ'}}}, {'type': 'Feature', 'geometry': None, 'properties': {'surface': 'た', 'node_type': 'NORMAL', 'morphemes': {'conjugated_form': '特殊・タ', 'conjugation_type': '基本形', 'original_form': 'た', 'pos': '助動詞', 'prononciation': 'タ', 'subclass1': '*', 'subclass2': '*', 'subclass3': '*', 'surface': 'た', 'yomi': 'タ'}}}, {'type': 'Feature', 'geometry': None, 'properties': {'surface': '。', 'node_type': 'NORMAL', 'morphemes': {'conjugated_form': '*', 'conjugation_type': '*', 'original_form': '。', 'pos': '記号', 'prononciation': '。', 'subclass1': '句点', 'subclass2': '*', 'subclass3': '*', 'surface': '。', 'yomi': '。'}}}]

メモ

このメソッドは解析結果から適切なフィルタを判断し、 候補の絞り込みやランキングを行ないます。

get_addresses(lattice, pos)

ラティス表現の単語列から住所部分を抽出します。

パラメータ
  • lattice (list) -- analyze_sentence() が返すノードのリスト(ラティス表現)。

  • pos (int) -- 住所抽出を開始するリストのインデックス。

戻り値

以下の要素を持つ dict オブジェクトを返します。

address: jageocoder.address.AddressNode

ジオコーディングの結果, 住所ではなかった場合 None。

pos: int

住所とみなされた形態素ノードの次のインデックス。

戻り値の型

dict

get_processible_lattice_part(lattice)

組み合わせの候補数が MAX_COMBINATIONS 未満になるように ラティスの先頭部分から区切りの良い一部分を抽出するジェネレータ。

パラメータ

lattice (list) -- 入力となるラティス表現。

戻り値

先頭部分から切り出した部分的なラティス表現。

戻り値の型

list

注釈

この関数はジェネレータなので yield で返します。

get_surfaces(lattice, pos_from, limit)

ラティス表現の単語列の pos 番目から、 limit で指定した 文字数を超える位置までの表記のリストを取得します。

単語の surface と original_form の組み合わせを列挙します。

パラメータ
  • lattice (list) -- analyze_sentence() が返すノードのリスト(ラティス表現)。

  • pos_from (int) -- 表記リストの先頭となるノードのインデックス。

  • limit (int) -- 文字列の長さ(limit を超えたノードを含む)

戻り値

単語列(単語表記のリスト)

戻り値の型

list

class pygeonlp.api.parser.Statistics

ベースクラス: object

static count_geowords(lattice)

ラティス表現を高速に粗く解析し、 地名語候補を含む形態素の数や ne_class の分布などを集計します。

詳細な解析を行うためのプランを決定する前処理として利用します。

パラメータ

lattice (list) -- ラティス表現。

戻り値

以下の要素を含む集計結果を返します。

num_geowords: int

地名語候補を1つ以上含む形態素ノードの数。

num_addresses: int

住所候補を1つ以上含む形態素ノードの数。

ne_classes: dict

固有名クラスをキー、そのクラスの地名語を1つ以上含む 形態素ノードの数を値とする dict。

戻り値の型

dict

サンプル

>>> import pygeonlp.api as api
>>> api.init()
>>> parser = api.parser.Parser()
>>> api.parser.Statistics.count_geowords(parser.analyze_sentence('国会議事堂前まで歩きました。'))
{'num_geowords': 1, 'num_addresses': 0,
    'ne_classes': {'鉄道施設/鉄道駅': 1, '鉄道施設': 1}}
class pygeonlp.api.parser.ParseError

ベースクラス: RuntimeError

パージング処理の際に例外が起こると、このクラスが発生します。