チュートリアル
プレインランゲージをフィルタリングクエリに変換する
はじめに
プラットフォームに適切なデータのみを取り込むには、Twitterプレミアム演算子でルールを作成し、ツイートFirehoseを絞り込むことが鍵となります。アプリが価値のある分析またはインサイトを生成できるかどうかは、ニーズに合致するデータを取得できるかどうかにかかっており、フィルタリングルールがその方程式の要となります。Twitterプレミアム演算子には、ストリームのコンテンツ定義に関して幅広い選択肢があります。その選択肢には、単純なキーワード一致、特定のユーザー属性の指定、ユーザー位置情報、言語など多岐にわたり、すべてにおいて複雑なブール論理が使われています。
必要とするデータを抽出するルールを定義する際、もっとも難しいことの1つは、プレインランゲージで表現された要件を正確に演算子およびフィルタリング構文に置き換えることです。この記事では、英語で表現されたルールを取り上げ、適切なプレミアム演算子および構文を使って、フィルタリングルールに置き換えていきます。
例1
「Tesla Model 3を話題にしているツイートが欲しい」
簡単なのは、シンプルなキーワードである「tesla」を使うことです。しかし、これは最初のステップにすぎません。この方法では「tesla」が入ったツイートをすべて抽出できますが、十分に絞り込めません。また、車ではなくテスラコイルや二コラ・テスラ、さらにニコラ・テスラのライバルであったトーマス・エジソンに関するツイートも合致するかもしれません。会話のなかからより正確に絞り込む基本的な方法が2つあります。
- 有益なキーワード要件を補足で追加する
- 除外する特定のキーワードを指定する
有益なキーワードを補足で追加した場合、一般的に結果の精度は大幅に向上するため、こちらから見てみましょう。こちらはかなり簡単です。「tesla」の一致結果を「model 3」も含まれるフレーズのみに限定します。それを表すフィルタリングルールは次のようになります。
tesla "model 3"
「model 3」というフレーズの外側にある二重引用符によって、フレーズの完全一致になります。つまり、テキスト内にまったく同じフレーズがその順番で含まれるツイートのみ一致するようになります。
しかし、「model 3」ではなく「model-3」または「model three」を使っているケースも見たことがあるかもしれません。こういったケースも考慮に入れる場合には、次のルールを使います。
tesla ("model 3" OR "model-3" OR "model three" )
こちらではグルーピングおよびブール論理ORを使っています。上のルールを読み解くと、「tesla」を含み、かつ「model 3」、「model-3」、「model three」のいずれかを含むツイートが一致します。
この考え方はさらに発展できます。このようなツイートの中で「angry」、「happy」、「love」など、感情がこもったキーワードを使ったもののみ抽出するケースを考えてみましょう。これらは「and any of these」ロジックを使って、追加のグループとして含められます。
tesla ("model 3" OR "model-3" OR "model three" ) (angry OR happy OR love)
これで最初のteslaルールに比べて、大幅に絞り込まれたルールができました。しかし、除外する必要がある特定のタイプのツイートが指定した要件に合致してしまう場合、確実にそのツイートを除外できるようになる必要があります。
除外するには、対象外として特定した種類の用語の前に-記号を入れます。
tesla ("model 3" OR "model-3" OR "model three" ) (angry OR happy OR love) -nikola -edison -coil -coils
注: ベストプラクティスでは、OR論理と括弧を使い、否定演算子はグループ化しません。グループ化せず、それぞれを個別に否定します。たとえば、先ほどの否定を以下のようにグループ化しないようにします。
-(nikola OR edison OR coil OR coils)
これで、細かく絞り込まれたルールができ、必要なテキストフレーズのタイプのツイートのみが抽出されるようになります。まとめとして、どのようなツイートが抽出されるかをプレインランゲージで表すと以下のようになります。
- テキストに「tesla」が含まれる。
- かつ、「model 3」、「model-3」、「model three」のいずれかがテキストに含まれる。
- かつ、「angry」、「happy」、「love」のいずれかがテキストに含まれる。
- テキストに「nikola」、「edison」、「coil」、「coils」が含まれない。
続いて、プレーンテキストマッチング以外で、ソーシャルデータ独自の側面からの絞り込みを反映した例を見てみましょう。
例2
「当社はフードネットワークの『Cutthroat Kitchen』というテレビ番組に関するコメントと、番組の司会をするアルトン・ブラウンに関するコメントに興味があります」
最初の例で学んだことを使うと、次のようなツイートを絞り込むルールが作成できます。
"cutthroat kitchen" OR cutthroatkitchen OR (("alton brown" OR altonbrown) host OR show)
このルールでは次のようなものを抽出します。
- テキストに「cutthroat kitchen」というフレーズが含まれるツイート。
- テキストに「cutthroatkitchen」というフレーズが含まれるツイート(同上、スペースなし)。
- 「alton brown」(またはスペースのない「altonbrown」)と、「host」または「show」が含まれるツイート。
続いて、この会社はこのルールを使って1週間ツイートを収集しましたが、顧客はその絞り込み結果の質に満足しておらず、コンテンツをより厳密に絞り込みたいと考えているとしましょう。今回は、結果をさらに絞り込むことに加え、前回漏れていた特定のツイートを抽出できるようにしたいと考えています。
「当社のプロモーションハッシュタグ(#cutthroatkitchen)を使っているツイート、番組司会者をそのTwitterユーザー名(@altonbrown)で番組と関連付けて@ツイートしているもの、フードネットワークのアルトン・ブラウンのオンラインページにリンクしているツイートのみを絞り込みたいと考えています。さらに、アメリカ合衆国在住としているユーザーからのツイートのみを対象にします」
まず、1つ目の要件から取り掛かりましょう。
最初に作成したルールでは、プロモーションハッシュタグを使っているツイートは、「cutthroatkitchen」という単語のおかげで抽出できています。「#cutthroatkitchen」、「@cutthroatkitchen」、単に「cutthroatkitchen」のみを使っている場合でも一致しています。これらは句読点を使ってトークン化する、トークン化一致の使用によって一致しています。しかし、お客様はこれを「#cutthroatkitchen」を使用しているものにのみ限定することを希望しています。それに対応するには、#演算子を次のように使います。
#cutthroatkitchen
最初の「cutthroatkitchen」という単語はツイートの一般テキスト内での一致を探しますが、このルールではその手法が変更され、Twitterがツイートそのものから抽出したハッシュタグのリストから一致を探します(情報を付加したネイティブ形式を使用し、twitter_entities.hashtagsフィールドでマッチングします)。これにより、フレーズ内にハッシュタグが入ったもののみを確実に抽出できる、大幅に的を絞る方法をお客様に提供できます。
同じ考え方を使って、アルトン・ブラウンに関するツイートから、Twitterユーザー名を使っているもののみに限定できます。先ほど使った単語(「altonbrown」)では、この特定の文字列のテキストが含まれるものすべてが抽出されます。しかし、@演算子を使うことによって、明確にTwitterユーザー名を使ったもののみに限定できます。
@altonbrown
つまり、ルールはTwitterが抽出したユーザーの@ツイート(情報を付加したネイティブ形式を使用し、twitter_entities.mentionsフィールドでマッチング)に適用され、ツイート内の一般テキストには適用されません。これにより、番組司会のTwitterアカウントで、認証済みの@altonbrownアカウントを明確に参照できているため、「host」および「show」というキーワードは不要になります。
次に、先ほどまではお客様の会社のアルトン・ブラウンに関するウェブページのリンクが入ったツイートは、ツイートのテキストに含まれるURLなど、テキスト内にアルトン・ブラウンの名前が含まれていることを基準に抽出されていました。しかし、これではTwitterユーザーが投稿前にbit.lyのようなサービスを使ってURLを短縮していた場合、そのツイートは抽出されませんでした。このニーズに対応するため、url_contains:演算子をお客様が追跡を希望する特定のURLに使う必要があります。
url_contains:"foodnetwork.com/chefs/alton-brown"
url_contains:演算子は、Twitterによる付加情報としてツイート内に存在する完全に展開されたURLから一致を探します。つまり、URLがbit.lyを使用していたり短縮リンクだったりしても、Twitterは完全なURLに戻して、そこで一致を探します。
最後に、お客様はアメリカ合衆国のユーザーによるツイートのみに結果を限定することを希望しています。そのためには、Twitterのプロフィールのジオエンリッチメントとそれに対応するプレミアム演算子を使って、以前に定義した用語すべてに対して制限を適用します。
注: ジオ演算子は現在Twitter Developer Labsでは使用できません。
profile_country:us
以上の変更を反映すると、お客様が満足できる次のようなルールができあがります。
profile_country:us (#cutthroatkitchen OR @altonbrown OR url_contains:"foodnetwork.com/chefs/alton-brown")
この規則では次のようなものが抽出されます。
- 会社のプロモーションハッシュタグを使っているツイート、ただし、キーワードがハッシュタグなしで使われているものは除く。
- @altonbrownの@ツイート、ただし@ツイート構文を使っていないプレーンテキストは除く。
- フードネットワークのアルトン・ブラウンのページへのリンクを含むツイート、bit.lyなどのサービスを使って短縮している場合も含む。
- さらに、上記の要件に一致するツイートでも、Twitterのプロフィールのジオエンリッチメントに基づき、プロフィールの国コードがアメリカ合衆国でない場合は抽出しない。
使用する構文が重要となります。必要に応じて括弧を使うことにより、求めるブール論理が作成でき、profile_country:us演算子を全体に適用できます。判断がつかない場合は括弧を使い、ルールの演算子の順序により想定していない結果が出ないようにします。
これらの例以外にも、演算子とキーワードを組み合わせて、分析に必要なデータを抽出する方法はいくつもあります。これらの考え方をさらに発展させて、プロフィール情報、フォロー数、ツイート位置情報、テキストで使われている言語などに基づき、検索を絞り込んでみましょう。こちらで取り上げたトピックに加え、制限のある文字およびルールサイズに関する制限など、演算子とルールに関する完全版ドキュメントについてよく知っておく必要があります。これらの詳細については、以下のリソースでご参照ください。
- プレミアムおよびエンタープライズ演算子とクエリ構築方法
- Twitter Developer Labsのフィルタリングされたストリームと最新の検索用にクエリを構築する
ソリューション作成の準備が整った方は