代码之家  ›  专栏  ›  技术社区  ›  karim79

在PHP中如何实现前向索引?

  •  11
  • karim79  · 技术社区  · 17 年前

    我希望在PHP中实现一个简单的前向索引器。是的,我确实理解PHP并不是完成这项任务的最佳工具,但我还是想这样做。它背后的基本原理很简单:我想要一个,用PHP。

    让我们做几个基本假设:

    1. 整个InterWeb包括 大约5000个HTML和/或 纯文本文档。每个文档都位于特定域中 (UID) . 我们想象中的Cavemanesque Interweb中不存在其他专有/神秘格式。

    2. 我们基于PHP的优秀正向索引算法的结果应该是:

      uid1->index.html->海伦,她,曾经,冠军,有,雀斑

      uid1->foo.html->鸡肉、农民、外出、回家、吃饭、绵羊

      uid2->blah.html->下一周,上一周,獾手表

      uid2->gah.txt->一、一、一、是、不是、数字王

    理想情况下,我希望看到的解决方案能够考虑到标记化技术/单词边界消歧/语音标记的一部分这一最基本的概念。 当然,我确实意识到这是一厢情愿的想法,因此,如果有任何有价值的尝试通过以下方式来分析这些虚构的文档:

    1. 提取文档中的真实文本内容 按顺序排列的单词列表 它们被呈现出来。
    2. 一直以来,忽略任何垃圾 如 <script> <html> 标记来计算一个uid列表(例如,域),后跟文档名(域中的资源),最后是该文档的单词列表。我确实意识到HTML标记在文档中文本的语义布局中起着重要的作用,但是在这个阶段,我 不在乎 .
    3. 记住一个可以构建列表的解决方案 阅读文档时的字数 更酷的是需要 首先阅读整个文档。

    在这个阶段,我不关心存储的位置和方式。即使是一组基本的“print”语句也足够了。

    提前谢谢,希望这足够清楚。

    2 回复  |  直到 13 年前
        1
  •  7
  •   Byron Whitlock    17 年前

    看一看

    http://simplehtmldom.sourceforge.net/

    你做什么事

    $p = new Simple_dom_parser();
    $p->load("www.page.com");
    $p->find("body")->plaintext;
    

    这将给你所有的文本。 只想遍历链接

    foreach ($p->find("a") as $link)
    {
        echo $link->innerText;
    }
    

    它是非常有用和强大的。 过来看。

        2
  •  5
  •   Chad Birch    17 年前

    我不认为我完全清楚你想做什么,但你可以很容易地得到一个简单的结果:

    1. 浏览网页 Tidy ( a good introduction )以确保它具有有效的HTML。
    2. 扔掉之前的一切(包括) <body> .
    3. 一步一个字符地浏览文档。
      1. 如果字符是“<”,则在看到“>”之前,不要对以下字符执行任何操作(跳过HTML)
      2. 如果字符是“单词字符”(字母数字、连字符,可能更多),则将其附加到“当前单词”中。
      3. 如果字符是“非单词字符”(标点、空格,可能更多),将“当前单词”添加到前进索引中的单词列表中,并清除“当前单词”。
    4. 做上面的直到你击中 </body> .

    这就是问题所在,您可能需要添加一些异常来处理诸如 <script> 标记(您不希望将javascript视为应该被索引的单词),但这应该为您提供一个基本的正向索引。