`
datamachine
  • 浏览: 163964 次
社区版块
存档分类
最新评论

用集算器实现文本比对

阅读更多

       控制台命令、JAVA、python、perl都可以进行简单的文本比对,但这些工具不擅长集合运算、结构化运算,编写多线程代码较复杂,处理多字段对比、大文件对比、异构文件对比等情况时很繁琐。

       免费的集算器支持集合运算、游标运算、结构化运算,简化了多线程代码,可以弥补上述不足。集算器应用简单,支持独立使用、控制台执行、JAVA代码调用,详情参考【集算器实现文本处理的应用方法】。

下面用若干例子说明集算器实现文件对比的过程。

找到两个文件相同的列值

有两个文件:f1.txt和f2.txt,都有Name和Dept这两个列,第一行是列名,现在需要在这两个文件里找到相同的Name。部分数据如下:

       文件f1.txt:


       文件f2.txt:


 

       集算器代码:

 

用import函数将文件读入内存,再用函数isect进行交集运算。默认的分隔符是tab。@t表示将第一行读为列名,后续的计算就可以直接用Name和Dept来引用相应的列,如果第一行不是列名,则应当用_1和_2这种默认列名来引用。

函数isect等价于交集运算符,代码可写作:A1.(Name) ^ B1.(Name) 。

 

结果如下:


 

引申:

<!--[if !supportLists]-->1.           1、用交集运算可找到相同的字段值,类似的还有并集、差集、合集。

       找到f1.txt和f2.txt共同的Name(合并重复值),可用函数union或并集运算符”&”,结果如下:

 

 

找到在f1.txt但不在f2.txt的Name,可用函数diff或差集运算符”\”,结果如下:



 

       将f1.txt和f2.txt中的Name合并起来,允许重复,可用函数conj或和集运算符”|”,结果如下:



 

 

<!--[if !supportLists]-->1.  2       2、进行整行对比时,可用@ts将文件读为字符串集合。如下:



 

找到CSV中修改过的记录

         old.csv是原始文件,new.csv是对old.csv进行增删改操作后的文件,两者的逻辑主键是userName和date,需要找出old.csv文件中哪些记录被修改过。

 

         部分数据如下:



 

       可以看到new.csv中的第2、3行是新增的记录,第4行是修改的记录,old.csv中第3行是删除的记录。

         集算器代码:

 

       以逗号为分隔符读入文件,将数据按照关键字排序。之后先求出新增的记录(主键不同),存在变量new中,再找到old.txt和new.txt有差异的记录(任意字段不同),存在变量diff中,最后计算diff和new的差集,也就是被修改过的记录(主键相同,其他字段不同)。结果如下:

 

       引申:被删除的记录可以这样计算:[A2,B2].merge@d(userName,date)

 

找到两个大文件相同的行

       文件file1.txt和file2.txt存储着大量的字符串,找出两者共同的行数据(交集)。部分数据如下:

 

集算器代码:


 

       函数cursor以游标形式打开文件,并不会将数据全部读入内存。默认以tab为列分割符读入全部的字段,自动命名为_1、_2、_3…_n。函数sortx可对游标进行排序,函数merge可对有序数据进行归并计算,@x表示对游标归并,@i表示归并结果为交集。函数export可将游标写入文件,结果如下:

C:\Windows\System32\0409

C:\Windows\System32\2052\VSJitDebuggerUI.dll

C:\Windows\System32\2hps.ico

C:\Windows\System32\ACCTRES.dll

C:\Windows\System32\ARP.EXE

引申:函数merge使用@i时表示交集,使用@u表示并集,使用@d表示差集,默认为归并,即将两个文件按字符顺序进行合并,并允许重复。

 

一大一小文件比较

文件File1.txt体积较大,但file2.txt可读入内存,现在需要找到两者相同的行。

集算器代码如下:


 

可以将小文件读入内存,再用Hash查找的方法来进行集合运算,这样可以显著提高效率。函数primary可设置主键,index可建立hash索引。函数find可用来查询出游标A1和B1相同的数据,即求交集。

引申:求差集可将A3代码写作=A1.select(!B1.find(~._1))

 

求并集可先计算出file1和file2的差集,再和file2做合并:



 

用并行计算提高文件比较的性能

前面的算法是串行,改成并行可以进一步提高性能,具体做法是用多个线程并行读取文件,每个线程都用游标访问文件的一部分,并同时进行集合计算,最后再将每个游标的结果合并。

在相同的硬件环境下对2.77G大文件和39.93M的小文件进行测试,串行时平均耗时85秒,并行时平均耗时47秒,性能提高接近一倍。由于集合运算的复杂度较小,瓶颈会产生在硬盘读取上,如果进一步加大运算的复杂度,性能提升的幅度将会更大。

         集算器并行计算的代码如下:


 

       将文件分为4段,生成4个游标同时计算,计算完成后合并游标。

      分段数量不宜过多,一般应该等于系统并行数量,否则会排队等待。并行数量可以在配置文件中设置。函数cursor使用了选项@z,这表示将文件分段,用游标取其中的某一段。之所以是“大致分”,是因为精确分会出现半行数据的情况,而集算器会去头补位,自动取出整行数据。

异构文件比较

       Data.txt是tab分隔的文本,共有6个字段,其中here字段是分号分隔的字符串。文件list是单列数据。现在要比较两个文件,如果某条记录的here字段拆分后和List.txt中的任意一行匹配,则将这条记录输出到result.txt中。

      源数据如下:



 

       集算器代码:



 

       代码中函数select可进行查询,函数array可拆分字符串,”^”表示求交集,”[]”表示空集。

         结果如下:



 

根据HTML排除字符串列表

         找出列表tagList里哪些字符串不在文件a.html中。TagList="Marketing","sales","human resource","Finance","R&D","commerce"。a.html如下:



 

       集算器代码:



 

       先用函数read将文件读为字符串,再用函数select进行查询,条件是:A2(大字符串)中是否包含~(A1的当前成员),最后计算差集,结果如下:



 

  • 大小: 8.5 KB
  • 大小: 8.5 KB
  • 大小: 14.2 KB
  • 大小: 6.4 KB
  • 大小: 9 KB
  • 大小: 3.1 KB
  • 大小: 13.3 KB
  • 大小: 13.6 KB
  • 大小: 73.5 KB
  • 大小: 41.5 KB
  • 大小: 9.1 KB
  • 大小: 85.6 KB
  • 大小: 20.2 KB
  • 大小: 21.8 KB
  • 大小: 23.3 KB
  • 大小: 26.5 KB
  • 大小: 25.7 KB
  • 大小: 20.4 KB
  • 大小: 19.7 KB
  • 大小: 13.4 KB
  • 大小: 63.1 KB
  • 大小: 22.9 KB
  • 大小: 6.1 KB
0
0
分享到:
评论

相关推荐

    java文本相似度对比

    本项目聚焦于使用Java编程语言结合HanLP分词器来实现这一功能。下面我们将深入探讨相关知识点。 首先,**文本比对**是文本挖掘中的基础操作,它旨在确定两段或多段文本之间的相似性或差异性。通常,我们可以通过...

    人工智能大作业:关于计算文本相似度的深度神经网络模型与算法研究分析(BERT、SentenceBERT、SimCSE).zip

    通过使用深度神经网络模型,尤其是BERT(Bidirectional Encoder Representations from Transformers)、SentenceBERT以及SimCSE(Similarity Comparison of Sentence Embeddings)等算法,我们可以构建出强大的文本...

    比较强大的序列比对(C++)

    “bowtie-0.11.3”是一个被提及的文件名,它是Bowtie序列比对器的一个版本。Bowtie是一个广泛使用的、专门用于比对短读测序数据到参考基因组的开源工具。它依赖于高效的算法,如 Burrows-Wheeler Transform (BWT) 和...

    oracle比对工具

    这通常是一个包含工具使用说明、注意事项、版本信息或者更新日志的文本文件。在Oracle比对工具中,`ReadMe.txt`会详细介绍如何运行ocidiff.exe,包括命令行语法、选项、示例以及可能遇到的问题和解决方案。用户在...

    Excel比对工具C#源码.rar

    对于开发者来说,这是一个很好的学习资源,他们可以查看和理解如何使用C#来实现Excel文件的读取、解析以及内容比对。通过研究源码,开发者可以了解如何利用.NET Framework或.NET Core中的Microsoft.Office.Interop....

    bbb.rar_数据比对

    数据比对,也被称为数据匹配或数据对比,是检查两个或更多数据集之间相似性或差异性的过程。在这个场景中,描述中提到的“两张十位数的表”可能是指表格中的每一行都有一个十位数的字段,可能是序列号、ID或者其他...

    基于gb2312字符点阵比对的光学图片字符识别的测试程序1

    GB2312是中国大陆广泛使用的汉字字符集,包含了6763个常用汉字,对于中文字符识别具有重要意义。 点阵字体是由像素点构成的字符图形,通常用于低分辨率的显示设备。在OCR中,点阵比对是通过比较图像中的字符形状与...

    java实现各语种检测的工具,多语种混合的按比例最高的语种返回,中文(zh-cn/zh-tw)、日本语(ja)、韩国语(ko)

    3. **机器学习方法**:利用训练好的分类器(如朴素贝叶斯、决策树等)对文本进行分类。这需要大量的标注数据集来训练模型,以学习每种语言的特征。 4. **预处理步骤**:在进行语种识别前,可能需要进行诸如去除标点...

    论文研究-高激励项集的挖掘研究.pdf

    提出了基于模糊集的文本搜索的聚类分析的方法,通过模糊技术对异构数据进行处理,可以改善算法实现的时间和空间的复杂度,减少文本处理的维度,提高算法的鲁棒性,对算法的实现给出了实例分析。通过与其他聚类算法的...

    文本编辑器NotePad++

    Notepad++是一款非常受欢迎的免费源代码编辑器,尤其在编程领域中被广泛使用。它基于微软的Windows操作系统,支持多种编程语言,并且是用C++编写的,以提升性能和减少内存消耗。Notepad++的主要特点在于其轻量级、高...

    A11_Trace比对机制使用说明_v11

    2. **设计myCPU**:使用文本编辑器编写CPU核心的Verilog代码,注意顶层模块的命名和接口信号需遵循规定。 3. **加入myCPU**:根据CPU接口类型(SRAM或AXI),将代码复制到相应的rtl/myCPU目录。 4. **编译Func**:在...

    mobilenet模型-基于深度学习对运动员动作比对识别-不含数据集图片-含逐行注释和说明文档.zip

    运行02CNN训练数据集.py,会自动读取txt文本内的内容进行训练,这里是适配了数据集的分类文件夹个数,即使增加了分类文件夹,也不需要修改代码即可训练 训练过程中会有训练进度条,可以查看大概训练的时长,每个epoch...

    Windows平台开源代码比对软件winmerge

    5. **合并操作**:如果需要合并更改,可以通过拖动差异块或者使用工具栏上的按钮来实现。 6. **保存结果**:完成合并后,记得保存更改,以免丢失工作。 ### 3. 应用场景 - **代码审查**:在代码审查过程中,开发...

    文件夹比较,文本比较,mp3比较,版本比较,数据比较,16进制比较,注册表比较,文本合并,同步文件夹等

    它能整合多个版本的文本文件,解决冲突,并生成一个统一的结果,这对于版本控制系统如Git的使用尤为方便。 最后,同步文件夹功能可以实现两个文件夹的双向或单向同步,确保多设备间的数据一致性,对于备份和资源...

    WM(Wu-Manber)算法详解及C语言实现

    WM算法的核心在于使用一个"小表"(small table)和两个"大表"(big tables),通过预处理模式串来构建这些表格,然后在文本中进行快速匹配。主要步骤如下: 1. **预处理**:对每个模式串P,计算其后缀的最大公共...

    KNN.rar_KNN 分类_knn_knn算法_答案比对

    在本案例中,"KNN.rar"文件包含的可能是一个KNN算法的实现或示例,用户可以通过比对提供的答案来检验自己的理解和应用。 总的来说,掌握KNN算法不仅需要理解其基本原理,还需要熟悉距离度量、数据预处理、模型评估...

    Text-Similarity-Checker:80 行基于 LINQ 的文本相似性检查器

    总的来说,这个基于LINQ的文本相似性检查器利用了C#的强大功能,结合了有效的字符串相似度算法,实现了简洁而高效的文本比对。通过深入研究这个80行的代码,开发者不仅可以学习到如何使用LINQ处理文本数据,还能掌握...

    启智畅想集装箱号码识别技术在理货系统中的应用

    集装箱号码OCR识别技术是一种基于图像处理和人工智能的先进技术,通过拍摄集装箱号码,对图像进行预处理(如去噪、纠偏、二值化),然后进行字符分割和识别,最终将数字和字母转换为可编辑的文本形式。这项技术的...

    带拼音的简单搜索引擎的实现

    在JavaScript中实现一个带拼音的简单搜索引擎涉及到多个技术层面,包括字符串处理、拼音库的使用以及搜索算法的设计。首先,我们需要理解搜索引擎的基本原理,它主要通过关键字匹配来找到相关的信息。在JavaScript...

Global site tag (gtag.js) - Google Analytics