PolyFuzz执行模糊字符串匹配、分组和评估。

polyfuzz的Python项目详细描述


^{1}$

PyPI - PythonPyPI - LicensePyPI - PyPiBuilddocs
^{str1}$PolyFuzz执行模糊字符串匹配、字符串分组,并包含广泛的求值函数。 PolyFuzz旨在将模糊字符串匹配技术整合到一个框架中。在

目前的方法包括多种编辑距离度量、基于字符的n-gram TF-IDF、单词嵌入等 技术,如FastText和手套,以及变压器嵌入。在

可找到相应的媒体帖子here。在

或继续使用没有sparse_dot_topn的PolyFuzz。在

Getting Started

For an in-depth overview of the possibilities of ^{} you can check the full documentation here或者你可以跟着走 用笔记本here。在

快速启动

PolyFuzz的主要目标是允许用户执行不同的方法来匹配字符串。 我们首先定义两个列表,一个映射到另一个映射到。我们将使用TF-IDF创建 为了比较字符串之间的相似性而在字符级别上的n个gram。然后计算相似度 字符串之间通过计算向量表示之间的余弦相似性。在

我们只需要用TF-IDF实例化PolyFuzz,并匹配列表:

frompolyfuzzimportPolyFuzzfrom_list=["apple","apples","appl","recal","house","similarity"]to_list=["apple","apples","mouse"]model=PolyFuzz("TF-IDF")model.match(from_list,to_list)

结果匹配可以通过model.get_matches()访问:

>>>model.get_matches()FromToSimilarity0appleapple1.0000001applesapples1.0000002applapple0.7837513recalNone0.0000004housemouse0.5879275similarityNone0.000000

NOTE:在实例化PolyFuzz时,我们也可以使用“EditDistance”或“Embeddings”来快速 分别访问Levenshtein和FastText(英语)。在

分组匹配

我们可以对匹配项进行分组To,因为在to\u列表中,字符串可能有明显的重叠。 为此,我们计算tou列表中字符串之间的相似性,然后使用single linkage 将具有高度相似性的字符串分组。在

当我们提取新的匹配项时,我们可以看到一个额外的列Group,其中所有{}匹配被分组为:

>>>model.group(link_min_similarity=0.75)>>>model.get_matches()FromToSimilarityGroup0appleapple1.000000apples1applesapples1.000000apples2applapple0.783751apples3recalNone0.000000None4housemouse0.587927mouse5similarityNone0.000000None

如上所示,我们将apple和apples组合成apple,这样当一个字符串被映射到apple它时 将落在[apples, apple]的集群中,并将映射到集群中的第一个实例apples。在

精确召回曲线

接下来,我们想看看我们的模型在数据上的表现如何。我们将结果表示为 precisionrecall其中精度定义为匹配正确之前的最小相似性分数,并且 回想在某个最小相似度得分处找到的匹配项的百分比。在

创建可视化效果非常简单:

model.visualize_precision_recall()

模型

目前,在PolyFuzz中实现了以下模型:

  • TF-IDF公司
  • EditDistance(可以使用任何距离度量,请参见documentation
  • 快速文本和手套
  • ðŸ-变压器

有了Flair,我们可以使用所有的变压器models。 我们只需实例化任何Flair单词嵌入方法并通过PolyFuzzy传递。在

上面列出的所有模型都可以在polyfuzz.models中找到,并可用于创建和比较不同的模型:

frompolyfuzz.modelsimportEditDistance,TFIDF,Embeddingsfromflair.embeddingsimportTransformerWordEmbeddingsembeddings=TransformerWordEmbeddings('bert-base-multilingual-cased')bert=Embeddings(embeddings,min_similarity=0,model_id="BERT")tfidf=TFIDF(min_similarity=0)edit=EditDistance()string_models=[bert,tfidf,edit]model=PolyFuzz(string_models)model.match(from_list,to_list)

为了访问结果,我们可以再次调用get_matches,但是由于我们有多个模型,所以我们要回一个字典 数据帧返回。在

要访问特定模型的结果,请使用正确的id调用get_matches

>>>model.get_matches("BERT")FromToSimilarity0appleapple1.0000001applesapples1.0000002applapple0.9280453recalapples0.8252684housemouse0.8875245similaritymouse0.791548

最后,将结果可视化以比较模型:

model.visualize_precision_recall(kde=True)

自定义石斑鱼

我们甚至可以使用polyfuzz.models中的一个作为grouper,以防您想使用 除了标准的TF-IDF型号:

model=PolyFuzz("TF-IDF")model.match(from_list,to_list)edit_grouper=EditDistance(n_jobs=1)model.group(edit_grouper)

自定义模型

虽然上面的选项是比较不同模型的一个很好的解决方案,但是如果您已经开发了自己的模型呢? 如果你遵循PolyFuzz的结构BaseMatcher
您可以快速实现您想要的任何模型。在

下面,我们将实现RapidFuzz的比率相似性度量。在

importnumpyasnpimportpandasaspdfromrapidfuzzimportfuzzfrompolyfuzz.modelsimportBaseMatcherclassMyModel(BaseMatcher):defmatch(self,from_list,to_list):# Calculate distancesmatches=[[fuzz.ratio(from_string,to_string)/100forto_stringinto_list]forfrom_stringinfrom_list]# Get best matchesmappings=[to_list[index]forindexinnp.argmax(matches,axis=1)]scores=np.max(matches,axis=1)# Prepare dataframematches=pd.DataFrame({'From':from_list,'To':mappings,'Similarity':scores})returnmatches

然后,我们可以简单地创建MyModel的一个实例并将其传递给throuth PolyFuzz公司:

custom_model=MyModel()model=PolyFuzz(custom_model)

参考文献

在下面,您可以找到开发PolyFuzz时使用过或受到启发的几个资源:

编辑距离算法
这些算法主要集中在编辑距离度量上,可用于polyfuzz.models.EditDistance

其他有趣的回购

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java如何在数据库中插入行时自动发送电子邮件?   从进程输出读取的Java问题   java质疑StyledDocument和JTextPane之间的关系,以及接口的正确使用   java错误getPlayer(args[0]);   java如何使Spring引导在重新打包的WAR中包含清单文件?   Java中的除法与模   java使用2d数组和JfreeChart制作散点图   java扩展SonarQube FindBugs插件和自定义FindBugs插件   javaspring:hibernate+ehcache   具有不正确的equals和HashCode实现的java HashMap   java Jaspersoft报告网。旧金山。jasperreports。发动机例外:net。旧金山。jasperreports。发动机填满JRepressionEvalException:计算表达式时出错   java如果输入与其变量不匹配,如何添加错误   在java中使用简单数组[]实现队列   无法启动上下文路径/hsx上的java FAIL应用程序