質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Q&A

解決済

2回答

1378閲覧

wikipediaダンプデータからのカテゴリ情報の取得するsql文

asunaro11

総合スコア5

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

0グッド

0クリップ

投稿2019/08/30 02:38

前提・実現したいこと

皆様

wikipediaのダンプデータを使って,各単語のカテゴリ情報を抽出するプログラムを作成しているのですが,カテゴリ情報をうまく抜き出せずに困っています.プログラミング初心者で,ぜひ,ご教授ください.

例えば,wikipediaで「日本」という単語を調べると,該当ページの一番下に「カテゴリ:日本|島国|現存する君主国|G8加盟国」と表示されます(https://ja.wikipedia.org/wiki/%E6%97%A5%E6%9C%AC).

ある単語を入力したときに,「日本」,「島国」,「現存する君主国」,「G8加盟国」にあたるカテゴリ情報を自動的に取得するプログラムを作りたいと考えております.

使用しているwikipediaのダンプデータは,https://dumps.wikimedia.org/jawiki/20190801/ にあるjawiki-20190801-categorylinks.sql.gzというファイルです.解凍して,mysqlにインポートをしました.

categorylinks.sqlには,以下のカラムがあります.

cl_from,cl_to,cl_sortkey,cl_timestamp,cl_sortkey_prefix,cl_collation,cl_typeです.

cl_fromは番号で,別のダンプデータに収録されている各ページのIDを指すpage_idの番号と対応しています.例えば,「日本」のpage_idは1864744です.また,cl_toは文字で,cl_fromに該当するpage_idが属するカテゴリを表します.

発生している問題

以上のことをふまえて,日本のカテゴリ情報を抽出しようと,mysqlで以下のsql文を実行しました.cl_type = 'page'は,cl_fromがページの時に設定するようです.

mysql> select cl_to from categorylinks where cl_from = 1864744 and cl_type = 'page';

しかし,結果は以下の通りで,取得したい「日本」,「島国」,「現存する君主国」,「G8加盟国」以外のカテゴリも表示されました.「日本」,「島国」,「現存する君主国」,「G8加盟国」だけを抜き出すには,どうすればいいのでしょうか.

+----------------------------------------------------------------------------+ | cl_to | +----------------------------------------------------------------------------+ | Div_colで3列を指定しているページ | G8加盟国 | ISBNマジックリンクを使用しているページ | Reflistで3列を指定しているページ | Webarchiveテンプレートのarchiveisリンク | Webarchiveテンプレートのウェイバックリンク | グラフのあるページ | 出典を必要とする記事/2018年2月 | 出典を必要とする記述のある記事/2016年5月 | 出典を必要とする記述のある記事/2016年9月 | 外部リンクがリンク切れになっている記事/2010年1月-4月 | 外部リンクがリンク切れになっている記事/2018年3月 | 島国 | 日本 | 書きかけの節のある項目 | 正確性 | 現存する君主国 | 編集半保護中の記事 | 言葉を濁した記述のある記事_(いつ)/2011年 +----------------------------------------------------------------------------+ 19 rows in set (0.00 sec)

試したこと

・categorylinks.sqlのcl_typeは,’page’,’subcat’,’file’を選ぶことができますが,’subcat’,'file'でもうまくいきませんでした.

・ページ情報をまとめたjawiki-page.sqlやjawiki-pagelinks.sql,またカテゴリ一覧をまとめたcategory.sqlのダンプデータも見てみましたが,各ページがどのカテゴリに所属しているかを表すカラムはありませんでした.

どうすれば,「日本」のページが属する4つのカテゴリを正確に抜く出すことができるのでしょうか.

ぜひ,どなたか教えてください.よろしくお願いいたします.

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

FKM

2019/08/30 02:46 編集

カラム一つがその情報の塊だとしても、プログラムを作ろうとしているのだったら、まずはDBからその該当カラムを抜き出して、あとはプログラム上で分割、抽出処理すればいいだけですが。 使う言語はどれでも同じことはできますが、使おうとしている言語を教えて下さい。
asunaro11

2019/08/30 04:27

FKMさん,ご回答ありがとうございます. 言語はpython3.6.7を使っております.ご指摘いただいて気が付きましたが,プログラムというよりは,データベースから該当カラムを抜き出すSQL文についての質問だったかもしれません.説明が不十分で,申し訳ありません.
t_obara

2019/08/30 04:38

貴殿が想定する検索キーだけでは余分な情報も抽出してしまうということですよね。 であれば、他のカラム情報を見ながら、所望の抽出ができるかを検討する必要があると思います。もし適切なキーが見つからないということであれば、機械的に抽出することが困難という結論になるのではないかと。
asunaro11

2019/08/30 04:52

t_obaraさん,ご回答ありがとうございます. 適切なキーがないということも,あり得るということを考えていませんでした.そうなのかもしれません.ほかのデータの当たりながら,調べてみます.
guest

回答2

0

ベストアンサー

提示されている結果を見る限り、そこに出力されている「余計なカテゴリ」は、wikimediaで「隠しカテゴリ」と言われるものだと思います。
普通に閲覧していると表示されない(ユーザー設定を変更すれば見ることができます)が、記事にしっかりくっつけてあるものです。
隠しカテゴリはある特定のカテゴリの配下に入ることになっているようですから、それを利用してフィルタリングする必要があると思います。
https://meta.wikimedia.org/wiki/Help:Category#Hidden_categories

投稿2019/08/30 04:56

KojiDoi

総合スコア13671

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

asunaro11

2019/08/30 06:24

KojiDoiさん,ありがとうございます. 隠しカテゴリがあることを,知りませんでした.隠しカテゴリを特定して,さらにフィルタリングする方法を試してみます.
asunaro11

2019/08/31 07:06

KojiDoiさん 隠しカテゴリに含まれるカテゴリは「隠しカテゴリ」と「追跡カテゴリ」に含まれているようで,この一覧を作成することで,余計なカテゴリをさらにフィルタリングできそうです.ありがとうございました.
guest

0

SQL内でどうしてもやりたいって理由でなかったら、Python内で操作した方が早いですが、それだと質問通りじゃないので、あえて、SQL内で操作したいのなら**substring_index('対象のカラム','デリミタ',抜き取りたい開始インデックス)**という方法はありますので、それを二重に使うと一応、文字列を分割して、その中から指定した部分を抽出できるようです。

SQL

1select sbstring_index(substring_index(cl_to,'改行コード',12),'改行コード',-1) as simaguni,2

改行コードはどれが適切か試してみてください(\r,\n,\r\n)
MySQL/splitのように文字列の一部を抜き出す

ですが、仮に全部の国を取得するとしても、すべての国が日本と全く同じインデックス数と順序で成り立っている保障がないのと、改行コードを使って、うまく抜き取れるとは限らないので、一度試してみて使えるかどうか検証してみるべきでしょうね。

投稿2019/08/30 04:44

編集2019/08/30 05:58
FKM

総合スコア3633

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

asunaro11

2019/08/30 06:21

FKMさん,ありがとうございます.教えていただいたコードを,試してみます.
FKM

2019/08/31 08:07 編集

今回は仕方ないですけど、BAの取り消しは本来マナー違反になるので注意してください(相手に取り消された履歴が残り、評価対象に関連付けられます) なので、納得のいく答えを得られるか、きちんと解決するまで安易に選択するべきものではないです。
asunaro11

2019/10/06 05:18

FKMさん サイトの使い方が不慣れで,コメントを確認させていただくのが,大変遅れてしまいました. BAの件も,到らない点があり申し訳ありません. ご助言,大変参考になりました.ありがとうございます.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問