这是本学期所有的实验报告
因为大一上学期学了python,这学期学的java还不是很熟练,所以所有的实验都是用python实现的。
E1词频查询就是对一个英文文档进行词频统计,并实现查询功能。这是容易实现的,因为老师给的文档是处理好的,标点与单词间都有空格,直接读取文件,利用字典操作即可。
E2汉语分词需要利用最大匹配法进行中文分词,并且要对分词算法进行评分。所谓最大匹配法就是到给出的词典中去匹配最长的词,这里给出一个例子:
根据这个很容易就想到利用滑动窗口实现。代码如下:
def sliding_window(line, left, right, length, word_dict, fp2):
"""滑动窗口,可从左到右寻找词的最大匹配"""
while left < length:
current = line[left:right]
# 成立的两种条件,最大匹配在字典中和单个字,成立后窗口左端右移,右端还原
if (current in word_dict) or (left + 1 == right):
fp2.write(current + ' ')
left = right
right = length
# 不成立时窗口右端左移
else:
right -= 1
分词结束后要利用F值对算法进行评价,标准如下:
这就需要把分词得到的文档与正确分词的文档进行对比。
这次实验的任务是从html文件中抽取文本和链接。构建信息检索系统的第一步就是爬取数据(利用爬虫抓取互联网上的网页)以及分析网页(获取文本内容–用于建索引 和 链接–送给爬虫接着抓取新数据)而这次实验就是分析网页。
这个实验一开始有点懵,想直接利用正则表达式对网页进行处理,是但发现工作量太大了。幸亏python有很多牛逼的库,而本次实验我就用了BeautifulSoup,不得不夸一句这个库是真的好用。然后本次实验的重点就成了学习并熟练掌握bs4。
我觉得理解这个库的关键是理解DOM树结构(Document Object Model),这里有个学习网站https://www.jianshu.com/p/0ec77136ec48 简单来说一个html文件就是文档节点,其中的标签是元素节点,元素中的文本是文本节点,每个属性是属性节点,注释属于注释节点。
知道DOM后,bs就好理解了,bs有四种对象Tag,NavigableString,BeautifulSoup和Comment。其中BeautifulSoup对应文档节点,Tag对应标签节点,NavigablesString对应文本节点,Comment对应注释节点。
然后讲一下使用流程,一般三步就行了:
(1) 创建BeautifulSoup对象
soup = BeautifulSoup(open(file_src, encoding=encoding(file_src)), "html.parser")
# 第一个参数传HTML文档字符串,第二个参数传HTML解析器,其他可选参数如编码方式等可自己选择
(2)搜索节点
一种是利用点取属性的方式与find()方法,但只能获取第一个一般不用
二是利用soup.find_all()方法
看个实例:
lst = soup.find_all('a',class_='abc')
# 得到是所有class属性为“abc”的...标签的列表
(3)访问节点信息
接着上面的代码,利用lst[i][‘href’]就可以得到标签的“href”属性
步骤大概是这样,还有些细节的东西需要自己在实践中去体会。
正排索引是依据文档去找符合要求的词,而倒排索引就是依据词得到文档ID(docID)表,这是为布尔查询做铺垫的。
先讲一下实现倒排索引的基本步骤:
(1)词条序列
就是得到每个文档词项及其对应的docID
(2)排序
将每个词项依据docID排序
(3)词典 & 倒排记录表
词典记录的是词项(Key)对应文档频率(Value),词典的用处是在进行布尔查询时能先计算比较短的(And操作的效率和倒排索引表的长度有关)。
倒排记录表记录的是词项(Key)对应docID表(Value)
这里要提一句本身倒排记录表是要用链表实现的,但是数据结构还没学,所以就用列表代替了。于是进行布尔查询中的合并倒排索引表就被忽略了,也就是说这个词典在本次实验中没用到。
在完成倒排索引之后就是进行布尔查询。在本次实验中就是对倒排记录表(列表)进行集合操作,这个就很容易实现了,不多赘述。
E5,E6内容比较多想另外写。
向量空间模型:https://editor.csdn.net/md/articleId=106558192
(第一次写,肯定有很多不足啦。因为这个我是当课程小结来看待的,主要是给自己复习用到。如果有人看了觉得有帮助那最好啦。)