利用二叉检索树将文章中的单词建立索引(正则表达式)

news2024/11/26 23:51:08

知识储备

链接: 【二叉检索树的实现——增删改查、读取命令文件、将结果写入新文件】

1、正则表达式的处理

(1)r’'前缀的作用

r’'前缀的用于定义原始字符串,特点是不会处理反斜杠\作为转义字符
在这里插入图片描述

(2)正则表达式中元字符的用法总结

\d代表任意一个数字,+代表前面的任意数字可以出现多次

在这里插入图片描述

\w代表任意一个字母数字下划线字符,+代表前面的任意可以出现多次

在这里插入图片描述

总结:
.:匹配除了换行符之外的任意单个字符。

例子:正则表达式 a.b 可以匹配到 “axb”、“a1b”、“a-b” 等,但不能匹配到 “aab” 或 “a\nb”(除非设置了多行模式)。

*:匹配前面的子表达式零次或多次。

例子:正则表达式 zo* 可以匹配到 “z” 以及 “zoo”。

+:匹配前面的子表达式一次或多次。

例子:正则表达式 zo+ 匹配 “zoo”,但不匹配 “z”。

?:匹配前面的子表达式零次或一次,也可以用在限定符后面表示非贪婪模式。

例子:正则表达式 do(es)? 可以匹配到 “do” 或 “does”。

^:匹配输入字符串的开始位置。

例子:正则表达式 ^Hello 匹配以 “Hello” 开始的字符串。

$:匹配输入字符串的结束位置。

例子:正则表达式 world$ 匹配以 “world” 结束的字符串。

{}:用大括号 {n} 表示恰好匹配 n 次,{n,} 表示至少匹配 n 次,{n,m} 表示匹配至少 n 次但不超过 m 次。

例子:正则表达式 o{2} 匹配 “oo”,o{2,} 匹配 “oo”、“ooo”、“oooo” 等,o{2,4} 匹配 “oo”、“ooo”、“oooo”。

[]:字符集,匹配方括号中列出的任意一个字符。

例子:正则表达式 [abc] 匹配 “a”、“b” 或 “c”。

^(在字符集中):在字符集中表示取非,匹配未列出的字符。

例子:正则表达式 [^abc] 匹配除了 “a”、“b” 和 “c” 以外的任意字符。

\:转义字符,用于匹配那些具有特殊意义的字符,如 . 匹配点字符本身。

例子:正则表达式 . 匹配点字符本身,而不是任意字符。

\d:匹配一个数字字符,等价于 [0-9]。

例子:正则表达式 \d\d\d 匹配三位数,如 “123”。

\D:匹配一个非数字字符,等价于 [^0-9]。

例子:正则表达式 \D\D\D 匹配三个非数字字符。

\w:匹配任意一个字母数字字符或下划线,等价于 [a-zA-Z0-9_]。

例子:正则表达式 \w+ 匹配一个或多个字母、数字或下划线组成的字符串,如 “hello”、“12345” 或 “hello_world”。

\W:匹配任意一个非字母数字字符或非下划线字符,等价于 [ ^a-zA-Z0-9_ ]。

例子:正则表达式 \W+ 匹配一个或多个非字母、非数字或非下划线的字符。

\s:匹配任何空白字符,包括空格、制表符、换页符等。

例子:正则表达式 \s+ 匹配一个或多个空白字符,如空格、制表符或换行符。

\S:匹配任何非空白字符。

例子:正则表达式 \S+ 匹配一个或多个非空白字符。

\b:匹配一个单词边界,即单词和空格之间的位置。

例子:正则表达式 \bcat\b 匹配独立的单词 “cat”,而不是 “concatenate” 中的 “cat”。

\B:匹配非单词边界的位置。
|:或运算符,匹配 | 符号前后的任意一个表达式。
():捕获括号,用于定义一个子表达式,并获取匹配的文本。

例子:正则表达式 (ab)+ 匹配一个或多个 “ab”,并且可以通过捕获括号提取匹配的内容。

(?..):非捕获括号,用于对匹配进行一些额外的操作,如前向和后向查找。
[…]:字符集内可以使用连字符 - 来表示字符范围,例如 [a-z] 表示小写字母范围。

(3)替换字符串中的模式

在这里插入图片描述

(4)注意:正则表达式中,点号 “.” 代表除了换行符外的任意单个字符,因此要转义,只能通过反斜杠\转义,r’'前缀达不到目的

在这里插入图片描述
同理,?也一样
在这里插入图片描述

2、利用正则表达式分离文本中的单词

利用正则表达式去掉符号、数字等

(1)文本文件

在这里插入图片描述

(2)处理结果

在这里插入图片描述

3、利用二叉树将文章中的所有单词建立索引

(1)具体描述

当一本书的文字量很大时,为其创建索引表是一个繁琐的事情。利用任务 2 中构建的 BST 数据结构,
可以很轻松的创建书稿的索引表。方法如下:将文稿中出现的每个单词都插入到用 BST 构建的搜索表中,
记录每个单词在文章中出现的行号。对于如下的文本段 (左侧列表为行号),构建一个 BST,当调用了该
BST 的 printInOrder 方法之后,输出的内容如图 3 所示,一个按字典排序的索引表就创建好了。
1 Dudley’s birthday – how could he have forgotten? Harry got slowly
2 out of bed and started looking for socks. He found a pair under
3 his bed and, after pulling a spider off one of them, put them on.
4 Harry was used to spiders, because the cupboard under the stairs
5 was full of them, and that was where he slept.
6 When he was dressed he went down the hall into the kitchen. The
7 table was almost hidden beneath all Dudley’s birthday presents. It
8 looked as though Dudley had gotten the new computer he wanted, not
9 to mention the second television and the racing bike. Exactly why
10 Dudley wanted a racing bike was a mystery to Harry, as Dudley was
11 very fat and hated exercise – unless of course it involved
12 punching somebody. Dudley’s favorite punching bag was Harry, but
13 he couldn’t often catch him.
实验材料中准备了一篇英文文稿,文件名为 article.txt1,请按照上面的样例根据该 article.txt 中的内
容构建索引表,并将索引表的内容按照单词的字典序列输出到 indexResult.txt 文件中。构建 BST 中的结点数据时,请认真思考记录行号的数据类型,如果可能,尽量使用之前实验中已构建的数据结构,也是对
已创建的数据结构的一种验证
在这里插入图片描述

(2)article(进展示部分全文共有三万多行)

在这里插入图片描述
在这里插入图片描述

(3)代码实现

对Elem()类、BST()中序遍历方法做了修改
增加了添加索引的函数
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(4)代码注意点

(1)

在这里插入图片描述

(2)
  1. lambda x: int(x.strip(‘"’))
    这是一个匿名函数,它接受一个参数 x,并返回 int(x.strip(‘"’)) 的结果。在 lambda 函数内部,x.strip(‘"’) 用于去除字符串 x 两端的双引号,然后 int() 函数将其转换为整数。
  2. map(lambda x: int(x.strip(‘"’)), arr)
    这里使用了 map 函数,它将 lambda 函数应用于列表 arr 中的每个元素。即对于列表 arr 中的每个字符串元素,都会执行 lambda 函数,将其转换为整数。
  3. list(…)
    最后,list 函数用于将 map 函数的结果转换为列表,这样我们就得到了包含转换后整数的列表。
    在这里插入图片描述
对比:

在这里插入图片描述

全部代码

import re
class Elem():
    def __init__(self,val):
        if val is not None:#把要插入的元素提取出来
            self._key = val[1:-1].strip().split(',')[0]
            #这里由于要把行号全部记录下来,因此要建立一个数组把后面的行号也append进来
            self._value=[val[1:-1].strip().split(',')[1]]
        else:
            self._key=None
    def key(self):#获取key()
        return self._key
    def value(self):
        return self._value
    def set_key(self, key):
        self._key = key
    def set_value(self, value):#将后面的行号append进来
        for x in value:
            self._value.append(x)

class BinNode:
    def __init__(self, val):
        self.left = None
        self.right = None
        self.val = val

class BST():
    def __init__(self):
        self.root=None
    def search_node(self, root, key):
        if root is None:
            return None
        it = root.val
        if it.key() > key:
            return self.search_node(root.left, key)
        elif it.key() < key:
            return self.search_node(root.right, key)
        return root.val  # 返回节点对象

    def insert(self,elem):
        self.root=self._insert(self.root,elem)
    # _代表私有函数 辅助insert函数实现插入操作
    def _insert(self,root,elem):
        if root is None:
            return BinNode(elem)
        it=root.val#rooot.val是一个Elem()对象
        if it.key()>elem.key():
            root.left=self._insert(root.left,elem)
        elif it.key()<elem.key():
            root.right=self._insert(root.right,elem)
        if it.key()==elem.key():#如果key值相同就替换
            self.update(elem.key(),elem.value())
            # root.val=elem
        return root
    def update(self, key, value):
        node = self.search_node(self.root, key)
        if node is not None:
            node.set_value(value)
            return True
        else:
            return False
    def printInorder(self, outputFile):
        with open(outputFile, 'w', encoding='utf-8') as f:
            self._printInorder(self.root, f)
    def _printInorder(self, root, outputFile):
        if root is not None:
            self._printInorder(root.left, outputFile)
            # outputFile.write(f'[{root.val.key()} ---- < {root.val.value() } >]\n')
            #这里做了修改,把数组中的元素放出来
            outputFile.write(f'[{root.val.key()} ---- < {" ".join(x for x in root.val.value())} >]\n')
            self._printInorder(root.right, outputFile)

bst=BST()
with open('article.txt','r')as f:
    line_numb=1#创建标签——行号
    for line in f:
        line_strip=line.strip()#去掉前后空格
        line_opt=re.sub(r'\d+|\.|,|:|;|!|\?|"|&|-|\'|\*|\(|\)|','',line_strip)#去掉无用符号和数字
        # print(line_opt)
        words=line_opt.split()
        # print(words)
        for word in words:#将元素插入二叉树
            bst.insert(Elem(f'({word},{line_numb})'))
        line_numb+=1
    bst.printInorder('indexResult.txt')  # 将结果打印出来

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1631824.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

335GB,台北地区倾斜摄影OSGB数据V0.2版介绍!

前几天发布了台北地区倾斜摄影OSGB数据第一个版本(139GB,台北倾斜摄影OSGB数据V0.1版),虽然数据还是一个半成品&#xff0c;完全没想到热度很高&#xff0c;很多读者对这份数据都有比较浓厚的兴趣&#xff0c;在这里首先感谢各位读者的大力支持与鼓励&#xff0c;给了我持续更新…

Arm Linux 移植 Air724UG 4G模块-USB方式

目录 一、开发环境二、连接方式三、4G模组的 VID 和 PID四、Linux kernel 的配置五、ppp的编译六、测试 一、开发环境 开发板&#xff1a;NUC980 iot开发板 4G模块&#xff1a;银尔达 Core-Air724 二、连接方式 micro usb线&#xff0c;一端连接4G模组&#xff0c;一端连接N…

亚马逊云科技AWS将推出数据工程师全新认证(有资料)

AWS认证体系最近更新&#xff0c;在原有12张的基础上&#xff0c;将在2023年11月27日添加第13张&#xff0c;数据工程师助理级认证(Data Engineer Associate)&#xff0c;并且在2024/1/12前半价(省75刀&#xff1d;544人民币。 原有的数据分析专家级认证(Data Analytics Specia…

Spark-机器学习(7)分类学习之决策树

在之前的文章中&#xff0c;我们学习了分类学习之支持向量机&#xff0c;并带来简单案例&#xff0c;学习用法。想了解的朋友可以查看这篇文章。同时&#xff0c;希望我的文章能帮助到你&#xff0c;如果觉得我的文章写的不错&#xff0c;请留下你宝贵的点赞&#xff0c;谢谢。…

java-链表排序

需求 思路 排序&#xff1a;讲所有的值都取出来&#xff0c;存储到ArrayList中&#xff0c;然后排序&#xff0c;将排序之后的元素依次使用add方法添加到自定义链表合并排序&#xff1a;先合并&#xff0c;然后调用刚才写的排序算法合并&#xff1a;将表一的头结点作为新链表的…

kerberos-hive-dbeaver问题总结

一、kerberos安装windows客户端 1、官方下载地址 http://web.mit.edu/kerberos/dist/ 2、环境变量配置 下载msi安装包&#xff0c;无需重启计算机&#xff0c;调整环境变量在jdk的前面&#xff0c;尽量靠前&#xff0c;因为jdk也带了kinit、klist等命令 C:\Program Files\…

[动画+注释详解]数据结构 - 直接插入排序

一. 直接插入排序算法的实现 1.1 基本思想 直接插入排序&#xff08;Straight Insertion Sort&#xff09;是一种简单直观的排序算法&#xff0c;它的基本思想是将一个待排序的记录插入到已经排序好的有序表中&#xff0c;从而得到一个新的、记录数增加1的有序表。 实际中&am…

Oracle对空值(NULL)的 聚合函数 排序

除count之外sum、avg、max、min都为null&#xff0c;count为0 Null 不支持加减乘除&#xff0c;大小比较&#xff0c;相等比较&#xff0c;否则只能为空&#xff1b;只能用‘is [not] null’来进行判断&#xff1b; Max等聚合函数会自动“过滤null” null排序默认最大&#xf…

特别的时钟特别的倒计时

念念不忘的歌曲&#xff1a;Thats Why You Go Away <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title&…

线上线下交友社区系统,支持打包小程序/公众号/H5,源码交付!

上网交友的好处有很多&#xff0c;以下是一些主要的好处&#xff1a; 1. 拓展人际关系&#xff1a;通过上网交友可以认识更多的人&#xff0c;拓展自己的社交圈。这有助于扩大自己的视野、增加人生经验和开阔心胸。 2. 找到志同道合的朋友&#xff1a;在网络上&#xff0c;我们…

《面向云计算的零信任体系第1部分:总体架构》行业标准正式发布

中华人民共和国工业和信息化部公告2024年第4号文件正式发布行业标准&#xff1a;YD/T 4598.1-2024《面向云计算的零信任体系 第1部分&#xff1a;总体架构》&#xff08;后简称“总体架构”&#xff09;&#xff0c;并于2024年7月1日正式施行。 该标准由中国信通院牵头&#xf…

装饰器模式、代理模式、适配器模式对比

装饰器模式、代理模式和适配器模式都是结构型设计模式&#xff0c;它们的主要目标都是将将类或对象按某种布局组成更大的结构&#xff0c;使得程序结构更加清晰。这里将装饰器模式、代理模式和适配器模式进行比较&#xff0c;主要是因为三个设计模式的类图结构相似度较高、且功…

如何讲好ppt演讲技巧(4篇)

如何讲好ppt演讲技巧&#xff08;4篇&#xff09; 如何讲好PPT演讲技巧&#xff08;四篇&#xff09; **篇&#xff1a;精心准备&#xff0c;奠定演讲基础 一个成功的PPT演讲&#xff0c;离不开精心的准备。首先&#xff0c;要确定演讲的主题和目标&#xff0c;确保演讲内容清…

SpringMVC进阶(自定义拦截器以及异常处理)

文章目录 1.自定义拦截器1.基本介绍1.说明2.自定义拦截器的三个方法3.流程图 2.快速入门1.Myinterceptor01.java2.FurnHandler.java3.springDispatcherServlet-servlet.xml配置拦截器4.单元测试 3.拦截特定路径1.拦截指定路径2.通配符配置路径 4.细节说明5.多个拦截器1.执行流程…

七彩虹(Colorful)隐星P16 2023款笔记本电脑原装出厂Win11系统镜像下载 带建Recovery一键还原功能

七彩虹原厂Windows预装OEM专用系统&#xff0c;恢复出厂开箱状态一模一样 适用型号&#xff1a;隐星P16 23 链接&#xff1a;https://pan.baidu.com/s/1Ig5MQMiC8k4VSuCOZRQHUw?pwdak5l 提取码&#xff1a;ak5l 原厂W11系统自带所有驱动、出厂时自带的主题与专用壁纸、系…

第 4 篇 : Netty客户端互发图片和音/视频

说明 因为图片和音/视频不能确定其具体大小, 故引入MinIO。客户端之间只发送消息, 通过上传/下载来获取额外信息 1. MinIO搭建(参考前面文章), 并启动 2. 登录MinIO创建3个Bucket: image、voice、video 3. 客户端改造 3.1 修改 pom.xml <?xml version"1.0" …

浅谈OpenCV 粗略计算工件轮廓面积和外接圆直径(Emgu.CV)

前言 最近领导在做库房工具管理这块的功能&#xff0c;希望能集成OpenCV 粗略的计算出工具的长度&#xff0c;以方便用户再归还工具的时候&#xff0c;提示用户该放在那种尺寸的盒子里面&#xff0c;这便是这篇文章的由来。 我们的系统是基于.net开发的&#xff0c;所以采用的是…

Memory augment is All You Need for image restoration 论文翻译

目录 一.介绍 二.实际工作 A.图像阴影去除 B.图像去雨 C.存储模块的开发 三.网络结构 A.内存扩充 B.损失函数设计 四.实验 A.与最先进方法的比较 B.MemoryNet消融研究 五.结论 CVPR2023 MemoryNet 记忆增强是图像恢复所需要的一切 论文地址https://arxiv.org/abs/…

就业班 第三阶段(nginx) 2401--4.26 day5 nginx5 nginx https部署实战

三、HTTPS 基本原理 1、https 介绍 HTTPS&#xff08;全称&#xff1a;HyperText Transfer Protocol over Secure Socket Layer&#xff09;&#xff0c;其实 HTTPS 并不是一个新鲜协议&#xff0c;Google 很早就开始启用了&#xff0c;初衷是为了保证数据安全。 近些年&…

大型零售企业,适合什么样的企业邮箱大文件解决方案?

大型零售企业通常指的是在全球或特定地区内具有显著市场影响力和知名度的零售商。这些企业不仅在零售业务收入上达到了惊人的规模&#xff0c;而且在全球范围内拥有广泛的销售网络和实体店铺。它们在快速变化的零售行业中持续创新&#xff0c;通过实体店、电商平台等多种渠道吸…