信息检索¶
信息检索¶
在 书籍和课程推荐 里已经推荐过一些内容了,这里重新总结一下,毕竟大家都懒,懒惰使人进步。这里介绍的主要是编程用到的信息检索,对,cs自学中那段也是我写的,我懒,就直接扒过来一部分。
前言¶
信息检索,就是通过一切办法方便快捷的搜到需要的信息。最常见的是看文档,用搜索引擎查,现在也可以用AI。
碰到问题,记住第一件事是 翻阅文档 ,不要一开始就直接搜索或者找人问,翻阅FAQ可能会快速找到答案。
编程最重要的,就是 STFW(search the fucking web) 和 RTFM(read the fucking Manual) ,首先要读文档,第二要学会搜索,网上那么多资源,怎么用,就需要信息检索。
要搜索,我们首先要搞清楚搜索引擎是如何工作的:
搜索引擎工作原理¶
搜索引擎的工作过程大体可以分成三阶段:[1]
爬行和抓取:搜索引擎蜘蛛通过跟踪链接访问网页,获取网页 HTML 代码存入数据库。
预处理:索引程序对抓取来的网页数据进行文字提取,中文分词,索引等处理,以备排名程序调用。
排名:用户输入关键词后,排名程序调用索引库数据,计算相关性,然后按一定格式生成搜索结果页面。
第一步,就是大家经常听说的网络爬虫,一般 Python 卖课的都会吹这个东西。简单可以理解为,我用一个自动的程序,下载网站中的所有文本、图片等相关信息,然后存入本地的磁盘。
第二步是搜索引擎的核心,但是对于我们使用来说,并不是特别关键,大致可以理解为洗干净数据,然后入库页面,每个页面加入关键字等信息方便我们查询。
第三步跟我们息息相关,不管是什么搜索网站, google 、百度、 Bing ,都一样,输入关键字或者需要查询的内容,搜索引擎会给你返回结果。本文就是教你如何获取更好的结果。
基础搜索技巧¶
根据上述的工作原理,我们大致就能明白,其实可以把搜索引擎当作一个比较聪明的数据库,更好的使用查询条件就能更快速的找到你想要的信息,下面介绍一些搜索的技巧:
使用英文¶
首先我们要知道一件事,编程中,最好使用英文搜索。原因主要有几点:
编程和各种软件操作中,英文资料质量比中文资料和其他语言资料高,英文通用性还是更好些
因为翻译问题,英文的名词比中文准确通用
中文搜索中,分词系统不准会导致歧义,比如 Google 搜中文可能会搜不出几条有用结果
如果你英文不好,用百度翻译或者搜狗翻译,足够了。
当然下面的文档为了举例方便,都还是用中文例子。
提炼关键词¶
搜索时不要搜索整句话,虽然搜索引擎会自动帮助我们分词检索,但是整句和关键字搜索出来的结果再准确度和顺序上会有很大差别。搜索引擎是机器,并不是你的老师或者同事,看上面的流程,搜索实际上是去检索搜索引擎爬出来的数据库,你可以理解为关键字比模糊检索要快而且准确。
我们需要提炼问题,确定我们到底需要解决什么问题。
例如,我想知道 vcpkg 如何集成到工程上而不是全局中,那么搜索 vcpkg如何集成到工程上而不是全局中 这种长句可能无法找到相关的结果,最好是拆分成单词,vcpkg 集成到 工程 全局 这样的搜索。其实这里只是举个例子,针对本条其实都能搜索出相关信息,但是越具体的问题,机器分词越可能出问题,所以最好是拆分关键字,使用词组或者断句来进行搜索。
替换关键字¶
还是上面那个例子,如果搜不出来,可以试试把工程换成项目,或者移出集成,如果不行,试一下高级搜索。
高级搜索¶
普通搜索引擎一般都支持高级搜索,包括 google , bing ,百度, ecosia ,等等,大部分都支持,不过可能语法不同,一般通用的表示:
精准匹配: 精准匹配能保证搜索关键词完全被匹配上,一般是用双引号括起来
比如搜索线性代数,可以在输入框内输入 "线性代数",搜索引擎将只匹配完整包含 “线性代数” 的页面,而不会搜索拆分成线性和代数两个词的页面
不包含关键字: 用 - 减号连接关键字,用于排除某些干扰词
包含关键字: 用 + 加号连接关键字
搜索特定文件类型:
filetype:pdf直接搜索 pdf 文件搜索特定网址:
site:stackoverflow.com只搜索特定网站内的页面
一般可以参照网站说明,比如百度可以参照 高级搜索 ,Bing 可以参照 高级搜索关键字 和 高级搜索选项 。
GitHub 的高级搜索¶
可以直接用 高级搜索页面 进行搜索,也可以参照 Github查询语法 进行查找,简单说几个:
in:name <关键字>仓库名称带关键字查询in:description <关键字>仓库描述带关键字查询in:readme <关键字>README 文件带关键字查询stars(fork): >(=) <数字> <关键字>star 或 fork 数大于(或等于)指定数字的带关键字查询stars(fork): 10..20 <关键词>star 或 fork 数在 10 到 20 之间的带关键字查询size:>=5000 <关键词>限定仓库大于等于 5000K 的带关键字查询pushed(created):>2019-11-15 <关键字>更新 或 创建 日期在 2019 年 11 月 16 日之后的带关键字查询license:apache-2.0 <关键字>LICENSE 为 apache-2.0 的带关键字查询language:java <关键词>仓库语言为 Java 的带关键字查询user:<用户名>查询某个用户的项目org:<组织名>查询某个组织的项目
这些可以混合使用,也可以先查找某一类的 awesome 仓库,然后从 awesome 库里找相关的资源,github 里有很多归纳仓库,可以先看看已有的收集,有时候会节省很多时间
更多技巧¶
使用中,实际上我会去特定网站找一些问题:
如果是语言本身相关,比如 c++/Qt/OpenGL 如何实现什么功能,可以直接加上
site:stackoverflow.com如果是具体的业务/开发环境或者软件相关,可以先在 BugList 、IssueList ,或者相关论坛里先找一下,比如 Qt 的问题就可以直接去 Qt 论坛,QGis 或者 GDAL 相关问题可以在 stackExchange 里去搜
QQ 群也是一个提问的地方,但是需要你提的问题有意义,否则大部分人不会回你,而且 QQ 群回复并不及时。
知乎专栏、简书、博客园、 CSDN 中有大量中文笔记,这些都是别人嚼烂了的东西,基本是别人踩坑的经验
关于百度¶
大部分编程人都会告诉你别用百度,用 Google 或者 Bing 国际版,但是 Bing 中文搜索的准确率并不高, Google 需要科学上网,如果真的需要,可以使用 Ecosia 、 Yandex 之类的搜索引擎。而且中文搜索来说,百度可能还真是比较好的选择。
百度的问题主要在于排序算法,可能两页都没啥对的内容,但是收录比 Bing 还是好一些的(百度以前并不遵守 robots.txt,会抓取所有页面,所以有些个人网站甚至专门对百度做了屏蔽),甚至有时候比 Google 好。从数据库来说,百度比 Google 和 Bing 收录的中文内容要多,如果你碰到的时中文相关的问题而且确实找不到相关内容,那么就用百度,搜索引擎是工具,能用好用才是王道。
这里讲点我自己碰到的,文心一言刚开放的时候,搜内容是会直接出现微信公众号xxx的,明显是数据没洗干净,但是也说明,它抓的东西还真的是多。
代码搜索¶
我们除了搜索引擎查找问题,还有可能会搜一些代码,可能是自己写的,也可能是项目中的,下面推荐一些工具:
代码检索有两种,第一是本地的代码检索,第二是要写个啥算法,需要在网上搜索
本地代码搜索¶
ACK 或者 ACK2,老牌搜索工具,perl 写的
The Silver Searcher c 实现的
The Platinum Searcher go 实现的
ripgrep :rust实现的,这个速度还挺快
FreeCommander 自带的搜索,如果是固态硬盘速度还不错
IDE 自带的,搜索有些时候并不太好用
开源代码搜索¶
Searchcode 搜索开源代码,速度比较快
一行代码 国产的,有些国产工具很好用
AI:下面会介绍AI,一般通用算法,限定词足够的话,AI能给出正确答案。
ChatGPT等生成式AI¶
可以先看看 WTF is AI ,了解一下AI工作原理。
本部分不会涉及具体如何去注册或者如何访问,只说一下如何运用,和其优劣。
现在 ChatGPT 比较火,我试用过,然后国内的文心一言,通义千问,kimi、豆包等都试过,以下用ChatGPT作为示例,说一下我自己的使用经验。
ChartGpt3.5 和 ChatGpt4 对于解决具体问题其实帮助没有总结或整理效果好,也就是它大部分时候无法真的像 stackoverflow 中的问答一样解决你的问题。但是如果你需要学习一些新内容或者需要整理一些文档,它是一个很方便的工具。当然它进化的很快,可能之后的版本会好一些。
查询时可以进行连续对话,给它更多信息和错误反馈,更新答案,但是除非你输入整理过的笔记或者知识,否则它瞎编的概率超过8成。
举一个例子,我需要使用 GDAL 库将shp数据转换为 gpkg 数据,实际阅读文档后,会了解到,应该使用 GDALVectorTranslate 接口,但是 ChatGPT 会虚构 GDALDriver 有 CopyLayer 接口让你使用,反馈没有这个接口后,它会逐条拷贝数据(其中的代码能编译过但是效果是错的),这在实际使用中其实比较危险,因为没有编译错误但是实际是无效代码,如果你完全不理解也没看文档的话,几乎是一个死胡同,无法下手排查错误。我测试过,具体的 C/C++ 库使用,包括 GDAL , OSG , eigen
等库,它的回答都很有逻辑,但是基本无法编译过,即使通过连续对话纠正了所有编译错误代码也是无效的。
但是如果是写python脚本处理文件,或者直接调用STL库做处理,只要你的逻辑写清楚,它基本能返回正确的答案,甚至包括一些基础的算法,它也能帮你找到基本正确的思路。
而且当你询问,处理地理数据有哪些开源库,或者解决一些具体问题所需要空间分析方法,这类比较概括的问题中,它能正确回答的概率就会大大提升,它基本可以正确回答比较抽象和概括类的问题。
如果你确实想用其解决实际问题,那么把问题拆分,拆分的越细致越好,你可以先让其叙述实现步骤,然后判断逻辑是否正确,手动修正后,分步重新输入 AI 中,让它帮你写,具体方案是:你给出具体的输入,输出,以及实现逻辑,让其帮你生成函数,直到所有内容完成。这种方式正确率会比较高,但是效率跟自己写其实差不多。
所以如果你需要解决具体的问题,请参考本文的第一句话,认真研读文档,你可以用AI辅助总结文档,然后去查询文档实现细节,如果你需要学习新内容或者碰到一些无从下手的新知识,可以使用 ChatGPT 来整理和开阔思路,AI是工具,并不是万能的。
使用技巧¶
尽量具体的描述需要处理的问题,ChatGPT 自动会提炼关键字,所以依然可以参照前面基础搜索技巧,但是不需要自己分词和提炼关键字,只需要尽可能的描述清晰你的问题。
ChatGPT 可能一次没有生成完,你可以直接输入继续让它继续生成
如果你觉得回答有什么遗漏或者回答中有什么问题,可以连续对话,让它修改答案,它可以有逻辑的补充
它可以提炼和整理一些文本内容,方便做笔记,也可以让它整理格式(输出 MarkDown 等格式),方便复制粘贴
针对部分具体的问题, ChatGPT 可能无法给出正确答案,但是思路基本是对的,你可以参照它的思路去读文档然后找到正确的方式处理
一些基础概念问题,不涉及具体库的,AI大部分能给出正确答案,例如写排序,或者stl库中的操作
基于以上原理,如果是需要做一些单纯的逻辑判断等工作,可以写逻辑然后让AI写代码,正确率还比较高,但是如果涉及专用库,大部分代码无法直接使用。
Python代码正确率比其他代码高
可以用AI根据思路绘制流程图(mermaid或者plainUML),或者给出python代码绘制函数曲线图等,打开思路,可以辅助做文档
ChatGPT 有可能陷入死循环,它只是AI,只负责给出逻辑通顺的答案,而不保证答案正确性
记住,没有什么万能的工具,如果 ChatGPT 回答错误,请查看文档,灵活使用搜索引擎,查找专业论坛或者问答网站,自己做笔记,解决问题。