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