3

dtSearchを使用して、いくつかの外部 Web ページのインデックスを作成しています。ページの HTML コンテンツ全体を取得します。

Web サイトの検索結果のリストにページが表示されるとき、結果の一部として強調表示された/太字の検索用語を含むコンテンツの抜粋を表示したいと考えています(つまり、誰もが慣れ親しんでいるのと同じことです)。各 Google 検索結果の下に表示されます)。

これを達成するための最良の方法は何ですか?HTML タグを解析して削除する必要がありますか? もしそうなら、どのようにそれを効果的に行うのですか?

概念実証は機能しており、検索用語が強調表示された抜粋が表示されていますが、タグをレンダリングするか、(私たちが試みたように) それらを取り除こうとする必要があり、最終的には実際にはコンテンツではない不要な情報が得られます。

dtSearch を使用しているのは偶然だと思います。別の検索ツールでこの種のことを実行できる場合は、代わりにそれを使用することを検討します.

基本的に、これを達成するために独自の正規表現を作成する必要があるのか​​、それともライブラリやツールによって既に解決されている既知の問題なのかを判断しようとしています。

たまたま .NET/C# を使用しています。問題の中心ではないと思いますが、使用できるライブラリに影響を与える可能性があります。

4

3 に答える 3

3

Google はmeta、存在する場合は説明タグを使用し、利用可能な場合はリッチ スニペット情報も使用します。

さらに、カスタム解析を実行する必要があるかもしれませんが、タスク全体を実行するために正規表現を使用しないでください。むしろ、適切なパーサー ( HTML Aglity Packなど) を使用して、セマンティックな意味を持つタグ (おそらく見出し、段落など) を見つけます。そのような要素を見つけたら、正規表現を使用して、一致したタグのどれが最適なスニペット、切り詰める場所など。

簡単な流れ:

  1. ドキュメントを解析し、大量のテキスト コンテンツを含むすべての要素を見つけます。
  2. 内側のタグを取り除く (例: stronga の内側p)
  3. ドキュメントの先頭近くの要素を優先します。
  4. アルゴリズムを実行して(おそらく正規表現を使用し、おそらくカルチャを意識して)文を抽出しようとします。
  5. 1 つ以上の検索用語に一致する単語を含む文を強く優先します (指定された要件に基づく)。
  6. ノイズワードの少ない文章を好む。
  7. (高度な) ドキュメント内で定期的に出現する単語を含む文を好みます。
  8. (高度な) 複数の潜在的に有用な文を 1 つの説明スニペットに結合します。

Google にとっても、正確な科学ではありません。

于 2013-02-01T18:26:46.060 に答える
0

これは、dtsearch を使用してアイテムの検索概要を生成するために使用するものです (ドキュメント テキストのキャッシュ保存バージョンを使用)。

ここでの問題の重要な点はrj.OutputFormat = dtSearch.Engine.OutputFormats.itUTF8;(デフォルトの html 形式を上書きする) です。太字で強調表示されたクリーンアップされた要約が得られるはずです。

これが役立つことを願っています

public string GetSumary(String ItemEncoded)
{
    using (var res = new dtSearch.Engine.SearchResults())
    {
        res.UrlDecodeItem(ItemEncoded);
        res.GetNthDoc(0);

        using (var rj = res.NewSearchReportJob())
        {
            // next line asumes you store your document text version in cache. remove if not 
            rj.Flags |= dtSearch.Engine.ReportFlags.dtsReportGetFromCache;
            rj.Flags |= dtSearch.Engine.ReportFlags.dtsReportByWordExact;
            rj.Flags |= dtSearch.Engine.ReportFlags.dtsReportLimitContiguousContext;
            rj.OutputToString = true;
            rj.OutputFormat = dtSearch.Engine.OutputFormats.itUTF8;
            rj.OutputStringMaxSize = 2000;
            rj.MaxContextBlocks = 1;
            rj.WordsOfContext = 12;

            rj.Header = "";
            rj.FileHeader = "";
            rj.ContextHeader = "";
            rj.BeforeHit = "<b>";
            rj.AfterHit = "</b>";
            rj.ContextFooter = "";
            rj.ContextSeparator = " ... ";
            rj.FileFooter = "";
            rj.Footer = "";

            rj.SelectItems(0, 0);
            rj.Execute();

            // some final clean-up
            return
                    new Regex(@"[\t\r\n]+|[\.;\,\*]{2,}").Replace(rj.OutputString, "&nbsp; &nbsp;");            }
    }
}
于 2013-02-05T12:50:55.207 に答える