Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[NEW] Information retrieval tutorial #348

Merged
merged 2 commits into from
Dec 23, 2022
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
119 changes: 119 additions & 0 deletions docs/必学工具/信息检索.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,119 @@
# 信息检索

## 前言

<em>碰到问题,记住第一件事是 **翻阅文档** ,不要一开始就问人或者打开搜索引擎!</em>
PKUFlyingPig marked this conversation as resolved.
Show resolved Hide resolved

信息检索,我的理解来说,实际上就是灵活运用搜索引擎中,方便快捷的搜到需要的信息,包括但不限于编程。

编程最重要的,就是 STFW(search the fucking web)和 RTFM(read the fucking Manual),首先要读文档,第二要学会搜索,网上那么多资源,怎么用,就需要信息检索。
PKUFlyingPig marked this conversation as resolved.
Show resolved Hide resolved

要搜索,我们首先要搞清楚搜索引擎是如何工作的:

## 搜索引擎工作原理

搜索引擎的工作过程大体可以分成三阶段:[^1]

1. 爬行和抓取:搜索引擎蜘蛛通过跟踪链接访问网页,获取网页HTML代码存入数据库。
1. 预处理:索引程序对抓取来的网页数据进行文字提取,中文分词,索引等处理,以备排名程序调用。
1. 排名:用户输入关键词后,排名程序调用索引库数据,计算相关性,然后按一定格式生成搜索结果页面。

第一步,就是大家经常听说的网络爬虫,一般Python卖课的都会吹这个东西。简单可以理解为,我用一个自动的程序,下载网站中的所有文本、图片等相关信息,然后存入本地的磁盘中。

第二步是搜索引擎的核心,但是对于我们使用来说,并不是特别关键。

第三步跟我们息息相关,不管是什么搜索网站,google、百度、Bing,都一样,输入关键字或者需要查询的内容,搜索引擎会给你返回结果。本文就是教你如何获取更好的结果。

## 基础搜索技巧

### 使用英文

首先我们要知道一件事,编程中,最好使用英文搜索。原因主要有几点:

1. 编程和各种软件操作中,英文资料质量比中文资料和其他语言资料高,英文通用性还是更好些
2. 因为翻译问题,英文的名词比中文准确通用
3. 中文搜索中,分词系统不准会导致歧义,比如Google搜中文可能会搜不出几条有用结果

如果你英文不好,用百度翻译或者搜狗翻译,足够了。

当然下面的文档为了举例方便,都还是用中文例子。

### 提炼关键词

搜索时不要搜索整句话,虽然搜索引擎会自动帮助我们分词检索,但是整句和关键字搜索出来的结果再准确度和顺序上会有很大差别。搜索引擎是机器,并不是你的老师或者同事,看上面的流程,搜索实际上是去检索搜索引擎爬出来的数据库,你可以理解为关键字比模糊检索要快而且准确。

我们需要提炼问题,确定我们到底需要解决什么问题。

例如,我想知道vcpkg如何集成到工程上而不是全局中,那么搜索 `vcpkg如何集成到工程上而不是全局中` 这种长句可能无法找到相关的结果,最好是拆分成单词,`vcpkg 集成到 工程 全局` 这样的搜索。其实这里只是举个例子,针对本条其实都能搜索出相关信息,但是越具体的问题,机器分词越可能出问题,所以最好是拆分关键字,使用词组或者断句来进行搜索。

### 替换关键字

还是上面那个例子,如果搜不出来,可以试试把工程换成项目,或者移出集成,如果不行,试一下高级搜索。

### 高级搜索

普通搜索引擎一般都支持高级搜索,包括 google,bing,百度,ecosia,等等,大部分都支持,不过可能语法不同,一般通用的表示:

* 精准匹配 用双引号括起来,比如搜索 线性代数,可以在输入框内输入 "线性代数"
PKUFlyingPig marked this conversation as resolved.
Show resolved Hide resolved
* 不包含关键字 用 - 减号连接关键字
* 包含关键字 用 + 加号连接关键字
* 搜索特定文件类型 filetype:pdf 直接搜索 pdf 文件
* 搜索特定网址 site:stackoverflow.com

一般可以参照网站说明,比如百度可以参照 [高级搜索](https://baike.baidu.com/item/高级搜索/1743887?fr=aladdin) ,Bing 可以参照 [高级搜索关键字](https://help.bing.microsoft.com/#apex/bing/zh-CHS/10001/-1) 和 [高级搜索选项](https://help.bing.microsoft.com/apex/index/18/zh-CHS/10002)


#### GitHub 的高级搜索

可以直接用 [高级搜索页面](https://github.com/search/advanced) 进行搜索,也可以参照 [Github查询语法](https://zhuanlan.zhihu.com/p/273766377) 进行查找,简单说几个:

* `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之类的搜索引擎。而且中文搜索来说,百度可能还真是最好的。
PKUFlyingPig marked this conversation as resolved.
Show resolved Hide resolved

百度的问题主要在于排序算法,可能两页都没啥对的内容,但是收录比Bing还是好一些的,甚至比Google好。从数据库来说,百度比google和Bing收录的中文内容要多,如果你碰到的时中文相关的问题而且确实找不到相关内容,那么就用百度,搜索引擎是工具,能用好用才是王道。

## 代码搜索

我们除了搜索引擎查找问题,还有可能会搜一些代码,可能是自己写的,也可能是项目中的,下面推荐一些工具:

代码检索有两种,第一是本地的代码检索,第二是要写个啥算法,需要在网上搜索

### 本地代码搜索

* ACK 或者 ACK2,老牌搜索工具,perl 写的
* The Silver Searcher c 实现的
* The Platinum Searcher go 实现的
* FreeCommander 自带的搜索,如果是固态硬盘速度还不错
* IDE 自带的,搜索有些时候并不太好用

### 开源代码搜索

* [Searchcode](https://searchcode.com) 搜索开源代码,速度比较快
* [一行代码](https://www.alinecode.com) 国产的,有些国产工具很好用



[^ 1]: [搜索引擎工作原理简介 - 知乎 (zhihu.com)](https://zhuanlan.zhihu.com/p/301641935)
1 change: 1 addition & 0 deletions mkdocs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,7 @@ nav:
- 日常学习工作流: "必学工具/workflow.md"
- 实用工具箱: "必学工具/tools.md"
- 毕业论文: "必学工具/thesis.md"
- 信息检索: "必学工具/信息检索.md"
- 好书推荐: "好书推荐.md"
- 数学基础:
- "MIT18.01/18.02: Calculus": "数学基础/MITmaths.md"
Expand Down