以下の内容はhttps://paper.hatenadiary.jp/entry/2021/04/25/234442より取得しました。


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




以上の内容はhttps://paper.hatenadiary.jp/entry/2021/04/25/234442より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14