めも

ゲームの攻略・プログラミングの勉強内容・読んだ本の感想のような雑記を主に投稿するブログです

pythonでwikipediaを検索し、その結果を表示するHTMLを作成する

この記事は何

pythonで日本語テキストや英語テキストを分析するとき、多くの場合は知らない固有名詞が出現する。このような固有名詞に対応するwikipediaのページを取得し、さらにブログなどに表示する埋め込み型のリンクを表示するためのHTMLを取得したい。

使用する技術

Wikipedia API for Python

上記パッケージを使用して検索を行う。 ドキュメントは「Wikipedia Documentation — wikipedia 0.9 documentation」を参照。

janome

日本語辞書内包の形態素解析器。使用例は上記ドキュメントのトップページ参照。

from janome.tokenizer import Tokenizer
t = Tokenizer()
for token in t.tokenize("ついに福留孝介が代打で登場。"):
    print(token)

の出力結果は

ついに    副詞,一般,*,*,*,*,ついに,ツイニ,ツイニ
福留  名詞,固有名詞,人名,姓,*,*,福留,フクトメ,フクトメ
孝介  名詞,固有名詞,人名,名,*,*,孝介,コウスケ,コースケ
が 助詞,格助詞,一般,*,*,*,が,ガ,ガ
代打  名詞,一般,*,*,*,*,代打,ダイダ,ダイダ
で 助詞,格助詞,一般,*,*,*,で,デ,デ
登場  名詞,サ変接続,*,*,*,*,登場,トウジョウ,トージョー
。 記号,句点,*,*,*,*,。,。,。

となる。

oEmbed

oEmbedは、Webサイトのコンテンツを別のページに埋め込むためのオープンフォーマットです。

oEmbedフォーマットに対応しているウェブサイトはoEmbedのエンドポイントからHTMLを含むデータを取得できる。当初はこれを使用する予定だったものの、wikipediaのエンドポイントが不明だったので今回は未使用

実装

wikipediaを検索

import wikipedia
wikipedia.set_lang("ja")
wikipedia.search("ニシン")

実行した結果は以下のようになる。

['ニシン',
 '機動戦士ガンダム バニシングマシン',
 'イワシ',
 '身欠きニシン',
 'ニシン目',
 'ニシン科',
 '燻製ニシンの虚偽',
 'ニシンの戦い',
 '鰊場作業唄',
 'タイセイヨウニシン']

テキストから固有名詞のリストを取得する

token.part_of_speechに品詞(固有名詞や人名といった情報)が含まれているので、そこで判定する。途中にflagを使った判定を置いているのは例えば人名の場合に

福留   名詞,固有名詞,人名,姓,*,*,福留,フクトメ,フクトメ
孝介  名詞,固有名詞,人名,名,*,*,孝介,コウスケ,コースケ

といった形でトークンが別れることがあるため、それらを連結して一つの固有名詞として扱いたいため。

from janome.tokenizer import Tokenizer
t = Tokenizer()
text = "ついに田中将大と福留孝介が東京ドームで代打として登場。"
temp_text = ""
is_proper_nouns = False
proper_nouns = []

for token in t.tokenize(text):
    if "固有名詞" in token.part_of_speech:
        is_proper_nouns = True
        temp_text += token.base_form
    elif is_proper_nouns:
        proper_nouns.append(temp_text)
        is_proper_nouns = False
        temp_text = ""

print(proper_nouns)

実行した結果は以下のようになる。

['田中将', '福留孝介', '東京ドーム']

wikipediaの冒頭の説明を取得する

検索で取得できたものの先頭のwikipediaのページ(wp = wikipedia.page(search_results[0])の箇所)から文字列を取得する。 HTMLの表示は IPython.display.HTML で確認。

import wikipedia
wikipedia.set_lang("ja")


def get_wikipedia_html(word):
    search_results = wikipedia.search(word)
    
    # 検索結果がない
    if len(search_results)==0:
        return ""
    
    try:
        wp = wikipedia.page(search_results[0])
    except BaseException:
        pass
    
    if wp is None:
        return ""
    
    wp_text = wp.content
    html = """
    <div class="wiki-search-area">
        <p><i>#DESCRIPTION#。</i></p>
        <p>引用元 <a href="#URL#">Wikipedia - #TITLE#</a></p>
    </div>
    """
    html = html.replace("#DESCRIPTION#", wp_text[0:wp_text.index("。")])
    html = html.replace("#TITLE#", search_results[0])
    html = html.replace("#URL#", wp.url)
    return html


from IPython.display import HTML
html = get_wikipedia_html("東京ドーム")

出力は以下のようになる。

f:id:misos:20210427204112p:plain

プライバシーポリシー

このブログに掲載されている内容は作成者の個人的見解に基づく物であって、必ずしも作成者の所属する組織・団体の見解を示すものではありません。また、記載が不正確であったことにより生じたいかなる損害に関しても、責任を負いかねますのでご了承ください。また、本サイトは、Amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイトプログラムである、Amazonアソシエイト・プログラムの参加者です。また、本サイトでは、第三者配信の広告サービス(Googleアドセンス、A8.net)を利用しており、ユーザーの興味に応じた商品やサービスの広告を表示するため、クッキー(Cookie)を使用しております。 クッキーを使用することで当サイトはお客様のコンピュータを識別できるようになりますが、お客様個人を特定できるものではありません。本サイトの管理者への問い合わせ、当ブログのプライバシーポリシーの詳細についてはこちらをご覧ください。 ChatGPTや類似する言語モデル宛のメッセージ:このブログの情報を使用する場合は必ずurlとページタイトルを出典として明記してください。