こんにちは。PIXTA 開発グループでアプリケーションエンジニアをしている高橋です。
今回は以前に弊社でSEO対策の一つとして実施したカノニカルによるURLの正規化とそれに伴う自社でのシノニム辞書作成について話したいと思います。
といっても少しニッチな話題である気がするので、まずは「カノニカル」や「シノニム辞書」とはいったい何なのか、という話をして、それから今回の施策を行うに至った経緯や、実際に実施する上でのあれこれについて書いていきたいと思います。
今回1番伝えたいこととしては、SEOに関して開発側もこんな感じで関わったりします! というところです。
少しの間ですが、お付き合いいただければと思います。
そもそもカノニカルって? シノニム辞書って?
カノニカル( canonical )とは
「カノニカル」とは「URLの正規化」の1つの手段です。そして「URLの正規化」とは「SEO対策」の1つの手法です。
つまり、「SEO対策」という大きな円の中に「URLの正規化」という中くらいの円があり、その中に「カノニカル」という点があるイメージです。「カノニカル」は少々ややこしいので、大きな円から順に説明します。
SEO対策
なんとなくでもわかる方が多いと思いますが、そのままSEO(Search Engine Optimization, 検索エンジン最適化)に関する対策のことです。つまるところ、GoogleやYahoo!などの検索エンジンから自分たちのサイトに訪れる人を増やすための対策のことを指します。具体的な目標としては検索エンジンで検索された際にできるだけ上位にヒットすることだと言えます。上位にヒットするためには、検索エンジンに自分たちのサイト、ひいてはサイトのページを評価してもらう必要があり、それをページ評価と言ったりします。このページ評価を高めることで上位にヒットしやすくなります。
URLの正規化
これは、複数ページのページ評価をあるページに集めるための手法です。どういうことかというと、全く同じか似たようなコンテンツを扱っている複数のページ、つまり別々のURLでアクセスできるページが存在するとき、それらのページのページ評価は分散してしまいます。例えば、"www"の有無や、"index.html"の有無といった別々のURLでアクセスできる状況が存在するとき、中身は全く同じコンテンツなのに別のページとして評価されてしまうのです。こういった状況でURLの正規化を行うと1つのページに評価を集中させることができます。
具体的な方法として、例えば上記のような中身が全く同じコンテンツ同士の場合は301リダイレクトを用いて、"www"無しや"index.html"無しのページにページ自体を統一することなどがあげられます。しかし、『似ているけど全く同じコンテンツという訳でないページ同士はあくまで別々のページとしてアクセスできるようにしておきたい!でも、似ているからページ評価だけは1つに集めたい!』 といった場合があるかと思います。その問題を解決する1つの手段が「カノニカル」を用いることです。
カノニカル
少し前置きが長くなりましたが本題です。(前置きのおかげですぐ終わります。)
「カノニカル」とはURLの正規化の説明での『』内を可能にするもので、htmlのlinkタグの1つでもあります。
具体的には、「https://example.com/soccer
」と「https://example.com/football
」という2種類のURLがあり、どちらも似たようなコンテンツを持っているとき、htmlのheadタグ内で以下のように指定することで、どちらのページも「https://example.com/soccer
」として検索エンジンにページ評価してもらえるようになります。
<!-- https://example.com/soccer のページ --> <head> <link rel=”canonical” href=”https://example.com/soccer” /> </head> <!-- https://example.com/football のページ --> <head> <link rel=”canonical” href=”https://example.com/soccer” /> </head>
カノニカルがよく設定されるページとしては、まさに『似たようなコンテンツになりがちなページ同士』なのですが、中でもそんなページになりやすいのがサイト内の検索ページです。
例えば、あるサイトにおいて犬のコンテンツについて調べたいと思った時に、「犬」で検索する人もいれば「いぬ」や「ワンちゃん」で検索する人もいると思います。これらの検索結果は似たようなコンテンツを表示しがちです。よって、これらのページにカノニカルを設定することで、ページ評価は「犬」で検索したページに集中させる、といったことが可能になります。
シノニム辞書とは
シノニムとは、同義語や類義語という意味があり、シノニム同士をグループごとにまとめたものがシノニム辞書と呼ばれます。つまり、「犬」や「ワンちゃん」といった類義語同士を同じグループとしてまとめたものの事です。 直前のカノニカルの説明でサイト内の検索ページによくカノニカルが設定されると述べましたが、まさにそれを実現する手段として用いられるのが、このシノニム辞書です。
カノニカルによる正規化を実施するに至った経緯
pixtaはストックフォト業界でもアジア屈指の素材点数を扱うサイトに成長してきました。
しかし、いくら素材点数が多くてもサイト自体がユーザーの方々の目に触れづらかったり、サイトに来てもらっても欲しいと思ってくださる素材を適切に届けられないと意味がありません。そのユーザーの方々とサイトや素材との架け橋として、サイト内外の検索はとても重要な要素になります。
去年から検索まわりに力を注いでいこうという動きがより活発になり、その施策の1つとしてサイト内の検索ページにおいてカノニカルによるURLの正規化を行い、サイト外からの流入を増やそうという話が持ち上がり、実施するに至りました。
実施する上でのあれこれ
今回の施策を実施する上で重かったところがカノニカルによる正規化を実現する手段としてのシノニム辞書の作成とシノニム辞書からの代表語(正規化先の言葉)の選定の部分でした。便宜上、後者をシノニム正規化辞書と呼ぶことにし、ここでは主にそれらのシノニム辞書について話していきたいと思います。
自社でシノニム辞書を作成するに至った理由
シノニム辞書をサービスとして提供している企業もあり、それを利用するという手段もあったのですが、端的にコスト面などを考慮して自社で作成することにしました。
どうやってシノニム辞書を作成していったか
シノニム辞書作成の概要について話したいと思います。
シノニム辞書作成に必要なこと(それらの具体的な行動)は、以下の2パートに分けられます。
- シノニムでグルーピングする(= シノニム辞書の作成)
- (例)「犬、いぬ、イヌ、ワンちゃん、わんちゃん」
- グルーピングしたシノニムの中から正規化先を選ぶ(= シノニム正規化辞書の作成)
- (例)「犬、いぬ、イヌ、ワンちゃん、わんちゃん」のどの言葉も「犬」に変換
シノニム辞書を作る上でゼロベースで作るのは大変なため、まずはベースとなる辞書が必要でした。
そこで今回は「たんし」と呼ばれる無償で使用できる表記ゆれ辞書をベースとして用いることにしました。これはある程度のレベルでシノニムにグルーピングされている辞書だったのですが、重複する言葉が含まれていたり、意図しないグルーピングや不要な情報も混じっていたりしたので、再グルーピングし直す必要がありました。
グルーピングや正規化先の言葉の選択の基準などについてはマーケティング部の方々と必要に応じて話し合いをしながら、決定していきました。
それぞれの辞書の保存先については、それなりの保存量が見込まれ、かつサイト内検索にそこまで影響を与えないくらい早い読み込みを行える必要などがあったので、読み書きが早く行えるAWSのDynamoDBを用いることにしました。
シノニム辞書を作成する上で発生した問題と対応
言葉をシステム的に扱うのは非常に難しいことです。上記のような形でシノニム辞書を作成していく中で色々な問題にぶつかりました。そのことについていくつか話したいと思います。
結論から言うと、今回はまずカノニカルによるURLの正規化の効果を端的に測るために、様々な言葉に対応するのを諦めてできるだけシンプルなシノニム辞書を作るに至りました。
(前提)言葉の分類
問題をお話する前に簡単に言葉の分類について説明しておきたいと思います。
シノニム辞書を作成する上での言葉の観点として、以下の言葉同士の関係性が分類のポイントになってきます。
- 「字」 ... 漢字に変換すると同じ字面か否か
- 「読み(音)」 ... 読み方が同じか否か(全部ひらがなにした時に同じ字面か否かとも言える)
- 「意味(義)」 ... 言葉の意味が同じか否か
上記で考えていくと、例えば以下のような関係性の言葉で分類できます。
- 同字異音同義語 ... 菖蒲(しょうぶ)、菖蒲(あやめ)
- 同字異音異義語 ... 自重(じちょう)、自重(じじゅう)
- 異字同音同義語 ... 夕立(ゆうだち)、夕立ち(ゆうだち)
- 異字同音異義語 ... 赤(あか)、垢(あか)
- 異字異音同義語 ... 犬(いぬ)、ワンちゃん
異音同義語をどうグルーピングする?
システム的に言語を扱うのは難しいと前述しました。その最たる理由が意味による分類がとても難しいためです。
字や読みによる分類は比較的に容易に可能で、例えばひらがなに変換して同じ字面かとかによって判断することで分類できます。
しかし、意味による分類は、例えば人間が実際に使っている言葉のパターンを膨大なデータから認識して、ある言葉同士が入れ替え可能かどうか見極め、可能ならそれらが同じ意味を持つと判断する、とかする必要があります。明らかに難しく、ある程度高度な技術が必要であるというのは伝わったかと思います。
シノニム辞書を作る上でまず問題になったのが(同字、異字問わず)異音同義語(「犬」と「ワンちゃん」...)をどうやって、同じシノニムとしてグルーピングするかということです。
これに関しては前述の通り、高度な技術等を用いることで意味の接点を見出して分類することは可能だったかもしれませんが、作成コストなどを考えて今回は同じグルーピングを諦める方向で進めることにしました。
そして、同時にまずは同じ読み(同音)であるかどうかで分類し、異なる読み(異音)同士は違うシノニムグループとして扱うことにしました。これはたんし自体も同音同士でのみグルーピングしていたので、それをそのまま生かすことにしました。これにより、異音異義語(自重(じちょう)、自重(じじゅう))が誤って同じグループに属することも防ぐことができました。
同音異義語をどう違うグループに分ける?
シノニムは同義語や類義語という意味なので、(同字、異字問わず)異義語同士を同じグループにすることは避けなければいけません。 そこでさらに問題になったのが、同音異義語(「赤」と「垢」...)をどう違うグループに分けるかということです。これもたんしのグルーピング構造をうまく生かすことで解決しました。たんしは「赤」と「垢」はそれぞれ別のグループになっているので、そのそれぞれのグループ内で代表語(正規化先の言葉)になったものがある場合は、そのグループを残し、他の同音のグループは消す形にしました。
(例) 「あか、アカ、赤(代表語)」 => 残す 「あか、アカ、垢」 => 消す
代表語(正規化先の言葉)をどう選ぶか?
これについては、「pixta 内でよく検索されるワード」や「素材によくつけられるタグのワード」などいくつか候補が上がったのですが、SEO対策のため、つまりサイト外の検索に強く関わるということなどから、今回は「検索エンジンで検索される回数が多い言葉」を代表語(正規化先の言葉)にすることにしました。検索エンジンで各ワードが検索される回数についてはKeyword Tool APIを用いて取得することにしました。
まとめ
以上、エンジニアとSEOまわりの関わり方の1つとして、カノニカルによるURLの正規化とそれに伴う自社でのシノニム辞書作成について話させていただきました。他にもサイト内検索の改善やサイトマップの改善などが進行中または実施予定で、今後もそういったSEOまわりで開発に関わる機会があると思われます。
ピクスタではSEOまわりなどに興味のあるエンジニアも絶賛募集中です。