[groonga-dev,04839] Re: 参照されることが多い記事のスコアを上げたい

Back to archive index
Sutou Kouhei kou****@clear*****
2021年 3月 23日 (火) 11:18:19 JST


須藤です。

In <20210****@jcom*****>
  "[groonga-dev,04838] Re: 参照されることが多い記事のスコアを上げたい" on Tue, 23 Mar 2021 06:55:02 +0900,
  shinonon <shino****@jcom*****> wrote:

>> そうですねぇ、この方向性だと必要なものは 参照側の Message-Id 毎の重み
>> ではないかと思いました。まずは Count にすると思います。
> 
> なるほど。
> 今まで Mail テーブル内で実現することしか考えていませんでしたが、
> Messageidテーブルを別に作ってそちらで重みをカウントするということですね。
> 目からウロコです。
> 
> Mail 検索時に Messageid テーブルの重みを活用するには、何かしら関数を駆使
> して Messageid(Mail.messageid).weight というような感じで参照することにな
> るのでしょうか?

Message-Idをキーにするならこんな感じです。

table_create MessageIDs TABLE_HASH_KEY ShortText
column_create MessageIDs count COLUMN_SCALAR UInt32

table_create Mails TABLE_HASH_KEY MessageIDs
column_create Mails in_reply_to COLUMN_SCALAR Mails

load --table Mails
[
{"_key": "<aaa @ zzz>"},
{"_key": "<bbb @ zzz>", "in_reply_to": "<aaa @ zzz>"},
{"_key": "<ccc @ zzz>", "in_reply_to": "<bbb @ zzz>"},
{"_key": "<ddd @ zzz>", "in_reply_to": "<aaa @ zzz>"}
]

load --table MessageIDs
[
{"_key": "<aaa @ zzz>", "count": 3},
{"_key": "<bbb @ zzz>", "count": 1},
{"_key": "<ccc @ zzz>", "count": 0},
{"_key": "<ddd @ zzz>", "count": 0}
]

select Mails \
  --filter true \
  --scorer '_score+=count' \
  --output_columns '_key,_score' \
  --output_pretty yes

# ...
#     [
#       [
#         4
#       ],
#       [
#         [
#           "_key",
#           "ShortText"
#         ],
#         [
#           "_score",
#           "Int32"
#         ]
#       ],
#       [
#         "<aaa @ zzz>",
#         4 # --filter trueの分(1)+_key.count(3)
#       ],
#       [
#         "<bbb @ zzz>",
#         2 # --filter trueの分(1)+_key.count(1)
#       ],
#       [
#         "<ccc @ zzz>",
#         1
#       ],
#       [
#         "<ddd @ zzz>",
#         1
#       ]
#     ]
# ...

インクリメント・デクリメントは--scorerでできます。

select MessageIDs \
  --filter '_key=="<aaa @ zzz>"' \
  --scorer 'count+=1'

>> P.S
>> > Web掲示板やコミュニケーションツールでよくある
>> 
>> view や click 取る方が確実ではありますね。
>> gmail だと重要とかお気に入りとか。
> 
> そうですね。
> 実は今回、「参照されることが多い記事のスコアを上げたい」ということを考え
> たのは、以前(今でも基本は同じだと思いますが) Google では「リンクが貼られ
> た記事のスコアは高い」ということを行っていたのがキッカケではありますが、
> もう一つ理由があります。
> それは、主にビジネスメールでは返信時に全文引用が行われることが多いため、
> メール内の言葉で検索すると、全文引用内で引っかかった言葉が全て引っかかり、
> それがいわゆる"ノイズ"になってしまうので、それをなんとか排除できないか、
> ということも考えています。
> したがって、「検索条件で検索したメールの中で、トップのメールのみを集め、
> そのトップに対して返信されたメールを除去」ということができればいいなぁ、
> ということも考えています。ただこれは、重み付けだけではなかなか実現できな
> く、select した結果を元にさらに個別に select する、という作業が必要にな
> ると思われるため、どうすればいいか悩んでいるところではあります。

メールの場合は2レベル以上の引用を除いたものを検索対象にした
ほうがよいと思います。


ところで、ページランク的には直接参照されているものが重要だと
思うので、In-Reply-Toで参照されているメールだけスコアが高く
なるので十分じゃないかと思いました。(現実にはそんなにみんな
キレイに返信してくれませんが。。。)

In-Reply-Toの参照だけを加味するならこんな感じでいけます。
Message-IdとIn-Reply-Toの値を入れるだけで別の情報を追加・削
除しなくても大丈夫です。
インデックス(Mails.referred_mails)の値を参照すると、そのレ
コードのためにどのくらい領域が使われているかわかります。今回
のケースではインデックスのソースはMails.in_reply_toですが、
より多く参照されているレコード(<aaa @ zzz>とか)ほど少ししか
参照されていないレコード(<bbb @ zzz>より)も大きくなることが
多いです。Groonga内部ではどのくらいヒットしそうかの見積に使っ
ている値です。(見積ヒット件数ではないのですが、ヒット件数が
増えるほど大きくなりやすいとか同じような傾向があります。)

table_create Mails TABLE_HASH_KEY ShortText
column_create Mails in_reply_to COLUMN_SCALAR Mails

column_create Mails referred_mails COLUMN_INDEX Mails in_reply_to

load --table Mails
[
{"_key": "<aaa @ zzz>"},
{"_key": "<bbb @ zzz>", "in_reply_to": "<aaa @ zzz>"},
{"_key": "<ccc @ zzz>", "in_reply_to": "<bbb @ zzz>"},
{"_key": "<ddd @ zzz>", "in_reply_to": "<aaa @ zzz>"}
]

select \
  Mails \
  --filter true \
  --scorer '_score+=referred_mails' \
  --output_columns '_key,_score,referred_mails' \
  --output_pretty yes

# ...
#     [
#       [
#         4
#       ],
#       [
#         [
#           "_key",
#           "ShortText"
#         ],
#         [
#           "_score",
#           "Int32"
#         ],
#         [
#           "referred_mails",
#           "Mails"
#         ]
#       ],
#       [
#         "<aaa @ zzz>",
#         5,
#         4
#       ],
#       [
#         "<bbb @ zzz>",
#         2,
#         1
#       ],
#       [
#         "<ccc @ zzz>",
#         1,
#         0
#       ],
#       [
#         "<ddd @ zzz>",
#         1,
#         0
#       ]
#     ]
# ...

篠田さんのケースはローカルのメーラーの検索だと思うので、自分
が何回参照したかとかどのくらい真面目に読んだメール(表示時間
から算出とか)かとかユーザーの行動からわかるメタデータも活用
できると面白そうだなぁと思いました。


groonga-dev メーリングリストの案内
Back to archive index