> # ♻️ 资源
> **大小:** 13.7MB
> **文档链接:**[**https://www.yuque.com/sxbn/ks/100010924**](https://www.yuque.com/sxbn/ks/100010924)
> **➡️ 资源下载:**[**https://download.csdn.net/download/s1t16/87484807**](https://download.csdn.net/download/s1t16/87484807)
> **注:更多内容可关注微信公众号【神仙别闹】,如当前文章或代码侵犯了您的权益,请私信作者删除!**
> ![qrcode_for_gh_d52056803b9a_344.jpg](https://cdn.nlark.com/yuque/0/2023/jpeg/2469055/1692147256036-49ec7e0c-5434-4963-b805-47e7295c9cbc.jpeg#averageHue=%23a3a3a3&clientId=u8fb96484-770e-4&from=paste&height=140&id=u237e511a&originHeight=344&originWidth=344&originalType=binary&ratio=1.25&rotation=0&showTitle=false&size=8270&status=done&style=none&taskId=ud96bf5f7-fe85-4848-b9c2-82251181297&title=&width=140.1999969482422)
# YSearch信息检索系统
## 1 分词与词性标注
选用thulac c++版本对数据进行分词和词性标注。使用人民日报数据和一份搜狗数据共39,024,052条,每条为一个句子。
- 其中搜狗数据需要预处理,运行./data/sogou.py将原本的分词空格去除,并替换<N>为0。
- 下载thulac c++版本,运行./thulac -t2s -input [inputfile.txt] -output [outputfile.txt],对数据进行分词和词性标注。生成的文件为sogou_output.txt,rmrb_output.txt,格式为每行一句,每句以空格分词,每个词后接‘_'和相对应的词性。例如其中一行为:我_r 不悦_a 地_u 道_v 。_w
## 2 索引构建
在本地运行elastic search,端口9200,运行./data/add2es.py对分词结果进行处理,连接elastic search,并批量加入数据,由es生成索引。
es中index名称为”sentences“,每条数据对应一句话,由三个字段组成,分别对应词汇、词性、词汇加词性。例如其中一条数据如下:
```
{
"content": "石头 与 石头 相击",
"part": "n c n v",
"mix": "石头_n 与_c 石头_n 相击_v"
}
```
由于数据已经分好词,es中三个字段的analyzer即分词器都设置为whitespace。
## 3 搜索实现
./flask文件夹下为基于flask的demo项目。在该文件夹下运行python ysearch.py,在浏览器中打开http://localhost:5000/即可。
### 3.1 Demo说明
Demo包含首页和搜索结果页两个页面,预览如下。
![](https://cdn.nlark.com/yuque/0/2024/png/2469055/1716965146070-9455e648-f484-4905-b82b-e2b0d8535c40.png#averageHue=%23f5f5f5&from=url&id=E5OsX&originHeight=1574&originWidth=2878&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=)
![](https://cdn.nlark.com/yuque/0/2024/png/2469055/1716965146181-c4e6b260-390b-41d5-98f9-220c0ede1655.png#averageHue=%23f7f7f7&from=url&id=l8rtp&originHeight=1572&originWidth=2878&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=)
![](https://cdn.nlark.com/yuque/0/2024/png/2469055/1716965146252-0c56d9fb-b825-487e-80ec-8f4fc0d7a72c.png#averageHue=%23f6f6f6&from=url&id=d7EUq&originHeight=1574&originWidth=2878&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=)
- 点击YSearch图标可回到首页
- 每页显示50条数据,支持分页功能
- 最大搜索结果为300条
- query格式错误会回到首页,并给出提示
### 3.2 搜索格式
支持的搜索格式:
- 词汇1(词性1) 词汇2(词性2) ... 词汇n(词性n) [+a]
- +a为可选项,表示n个词必须按顺序相邻。
- 如果没有相邻限制,那么n个词必须输入词汇,可以不限制词性;
- 如果有相邻限制,那么不输入词汇,仅限制词性也是被允许的。特别地,仅搜索一串相邻的词性序列也是支持的,如下面的举例中第四条。
搜索举例:
- 我 笑
- 我 笑(v)
- 我(r) (v) +a
- (r) (v) (u) +a
### 3.3 具体实现
查询使用python的elasticsearch库实现。
1. 无相邻条件的搜索:根据有无词性要求,分别在content和mix两个字段进行查询,使用es的bool查询,条件为should,即只要满足其中一个条件就好。例如query为“我 笑(v) 了”,那么查询的body为:
```
body = {
"from": from_,
"size": size_,
"query": {
"bool": {
"should": [{"match": { "content": "我 了"}},
{"match": { "mix" : "笑_v"}}]
}
}
}
```
from和size用来分页。搜索平均耗时在60ms左右。
2. 有相邻条件的搜索:首先按照无相邻条件的情况来搜索,es返回500条数据后,对数据进行筛选。筛选方法如下:
- 对每个句子,首先定位query中的一个词,即找出所有可能的该词出现的位置。这个词选择的优先度为词汇+词性>词汇>词性,为了得到尽可能少的位置。
- 对每个可能的位置,检查query中其它每个词汇或词性要求,是否符合相对位置,如果不符合则删去该位置。检查的优先度同上,为了快速过滤掉不可能的位置。
- 如果最后不存在这样的位置,则过滤掉该条数据。
3. 最后返回符合要求的数据。搜索平均耗时在500ms左右。
## 4 问题与解决
1. Elastic search的写入问题。一开始为了测试,我在同一个程序里先写入再查询一批少量数据,结果发现查询结果为空。实际上数据库的写入也需要一点时间,两个进程是并行的,不能这么测试。写入后直接用postman查询即可。
2. 批量写入。我发现数据的写入非常慢,很少量的数据就需要耗费一秒的时间,所以必须用python elasticsearch库的helpers.bulk(),打包数据后批量写入。
3. 为了提高有词性限制的查找速度,我在数据库中新增了一个"mix"字段,同时记录词汇和词性信息,这样查找有词性限制的词汇时,只需要直接在该字段查找"词性_词汇"即可。
4. 相邻条件限制如果直接用es搜索,实现起来比较麻烦。由于数据要求量不大,在这里直接使用搜索后过滤的办法,对相邻词汇进行过滤。但这个算法的耗时较长。
## 5 demo演示
录屏见附件[screenrecord.mov](https://drive.google.com/file/d/1PbVAdU13siuza3AnmgpQo9TOy04tVlAB/view?usp=sharing)。
部分搜索结果截图如下:
![](https://cdn.nlark.com/yuque/0/2024/png/2469055/1716965146352-a41f9f19-e7d5-4bc3-b0c0-302688e5cb08.png#averageHue=%23ededed&from=url&id=Z0yKp&originHeight=1572&originWidth=2878&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=)
![](https://cdn.nlark.com/yuque/0/2024/png/2469055/1716965146436-65aac27a-7d5e-4dee-9623-be4e1d2e6262.png#averageHue=%23f1f1f1&from=url&id=Q5QyN&originHeight=1574&originWidth=2878&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=)
![](https://cdn.nlark.com/yuque/0/2024/png/2469055/1716965146559-6a279ca5-a361-4dd2-bacf-7ae29a672098.png#averageHue=%23f6f6f6&from=url&id=o3sKt&originHeight=1570&originWidth=2878&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=)
![](https://cdn.nlark.com/yuque/0/2024/png/2469055/1716965146657-e32ac801-02d7-425a-9a43-ba54182d1f92.png#averageHue=%23f8f8f8&from=url&id=cWkUE&originHeight=1574&originWidth=2878&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=)
![](https://cdn.nlark.com/yuque/0/2024/png/2469055/1716965146759-05749fdf-8c35-452b-91e4-2171d9d9adb0.png#averageHue=%23f9f9f9&from=url&id=yxndS&originHeight=1574&originWidth=2878&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=)
![](https://cdn.nlark.com/yuque/0/2024/png/2469055/1716965146853-d7a96b94-e98e-4816-a73b-05fa795a2013.png#averageHue=%23f5f5f5&from=url&id=hKzaL&originHeight=1572&originWidth=2878&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=)
![](https://cdn.nlark.com/yuque/0/2024/png/2469055/1716965146999-0c304e41-5a10-43ab-99f5-130478c63c20.png#averageHue=%23eaeaea&from=url&id=IwXx3&originHeight=1574&originWidth=2878&origi
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
详情介绍:https://www.yuque.com/sxbn/ks/100010924 1.使用人民日报数据和一份搜狗数据共39,024,052条,每条为一个句子。 2.选用thulac c++版本对数据进行分词和词性标注,标注后的格式为每句一行,以空格分词,每个词后接‘_'和相对应的词性,如其中一行为:石头_n 与_c 石头_n 相击_v 3.在本地运行elastic search,端口9200,运行./data/add2es.py对分词结果进行处理、连接elastic search并批量加入数据。每条数据对应一句话,由三个字段组成,分别对应词汇、词性、词汇加词性。
资源推荐
资源详情
资源评论
收起资源包目录
100010924-基于Python实现信息检索系统.zip (43个子文件)
ysearch
.DS_Store 10KB
image
image-20201116222514540.png 304KB
image-20201116221959068.png 455KB
image-20201213234255799.png 637KB
image-20201116215404329.png 224KB
image-20201116222052507.png 375KB
image-20201116222721954.png 561KB
image-20201213234331056.png 239KB
image-20201116215420606.png 287KB
image-20201213234516675.png 511KB
image-20201116215236306.png 1.06MB
image-20201116222431173.png 336KB
image-20201213235705856.png 572KB
image-20201213234218105.png 433KB
image-20201116222347026.png 313KB
image-20201213234453791.png 438KB
image-20201116222302721.png 419KB
image-20201116222624938.png 345KB
image-20201116222541668.png 295KB
image-20201116215312949.png 306KB
image-20201213235619286.png 483KB
image-20201116215347481.png 304KB
reportv1.pdf 4.02MB
src
.DS_Store 8KB
flask
.DS_Store 8KB
app
__init__.py 70B
.DS_Store 10KB
templates
result.html 5KB
search.html 2KB
__init__.pyc 260B
static
.DS_Store 6KB
bg.jpg 187KB
cow-not-full.txt 1.67MB
icon.png 347KB
routes.py 9KB
ysearch.py 158B
data
.DS_Store 6KB
add2es.py 2KB
sogou.py 230B
README.md 2KB
LICENSE 1KB
README.md 8KB
reportv2.pdf 2.84MB
共 43 条
- 1
资源评论
- m0_523344822023-06-10资源内容详细全面,与描述一致,对我很有用,有一定的使用价值。
神仙别闹
- 粉丝: 3706
- 资源: 7461
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功