syun_nissi
@syun_nissi (syun nissi)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

あるpythonコードの理解不足のため質問です

解決したいこと

python自然言語処理に関する本で、文章の中から「有名」「おいしい」という単語と特定の地名を含むものを探すプログラムが掲載されています。
関数と引数、リストが入り組んでおり、コードの内容が理解できずにいます。
このプログラムは難しいのかそうでもないのか、コードの書き方として一般的なのか、そうでないのか、レベル的にはどれくらいの難易度なのか知りたく、コード自体の問題があるわけではないですが、質問させていただきました。

該当するソースコード

def contain_yumei(tokens):
    for token in tokens:
        if token['lemma'] == '有名':
            return True
    return False


def contain_LOC(tokens):
    for token in tokens:
        if token.get('NE', '').endswith('LOCATION'):
            return True
    return False


def contain_oishii(tokens):
    for token in tokens:
        if token['lemma'] == 'おいしい':
            return True
    return False


def meibutsu_rule(feature):
    if feature['contain_yumei'] and feature['contain_LOC']:
        return 1
    if feature['contain_oishii']:
        return 1
    return 0


def get_rule():
    return {
        'partial': {
            'contain_yumei':  contain_yumei,
            'contain_LOC':    contain_LOC,
            'contain_oishii': contain_oishii,
        },
        'compound': meibutsu_rule
    }


def convert_into_features_using_rules(sentences, rule):
    features = []
    for doc_id, sent, tokens in sentences:
        feature = {}
        for name, func in rule['partial'].items():
            feature[name] = func(tokens)
        features.append(feature)
    return features


def classify(features, rule):
    return [rule['compound'](feature) for feature in features]

上記コードは参考書からそのまま転載しております。もし著作権の侵害などの問題があるようであれば、
この質問自体を削除いたしますので、ご了承ください。

0

Pythonは8年くらい使用していますが、書かれているコードは比較的平易ではないかと思います。個人的には好きな実装で、Pythonを普段から使っている人の実装という印象があります。

難しく見えてしまうのは convert_into_features_using_rules() あたりかと思います。おそらく引数 rule の中に get_rule() の中身が入ってくるのでしょうが、rule の中身が dict で、その中に関数が入っているという実装は、コードの分量が多くなると追うのが大変になってくるかもしれません。ただこのコードに関しては for name, func in rule['partial'].items(): のように展開した後の変数名に func を使って関数が入っていることを示すなど、可読性への配慮がされているのではないかと思います。

1Like

@itkr 様、ご意見いただきありがとうございます。
比較的平易なコードなんですね。pythonを(プログラム自体)学び始めたのが7月からなので4か月程度の実力では、なかなか難しい内容でした。
meibutsu_rule()あたりから私には?マークがついてしまいました。
もっと勉強しないといけないですね。

0Like

Your answer might help someone💌