PolyFuzz执行模糊字符串匹配、分组和评估。
polyfuzz的Python项目详细描述
^{str1}$PolyFuzz
执行模糊字符串匹配、字符串分组,并包含广泛的求值函数。
PolyFuzz旨在将模糊字符串匹配技术整合到一个框架中。在
目前的方法包括多种编辑距离度量、基于字符的n-gram TF-IDF、单词嵌入等 技术,如FastText和手套,以及变压器嵌入。在
可找到相应的媒体帖子here。在
或继续使用没有sparse_dot_topn
的PolyFuzz。在
Getting Started
For an in-depth overview of the possibilities of ^{
快速启动
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
。在
精确召回曲线
接下来,我们想看看我们的模型在数据上的表现如何。我们将结果表示为
precision
和recall
其中精度定义为匹配正确之前的最小相似性分数,并且
回想在某个最小相似度得分处找到的匹配项的百分比。在
创建可视化效果非常简单:
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
:
- https://github.com/jamesturk/jellyfish
- https://github.com/ztane/python-Levenshtein
- https://github.com/seatgeek/fuzzywuzzy
- https://github.com/maxbachmann/rapidfuzz
- https://github.com/roy-ht/editdistance
其他有趣的回购:
- https://github.com/ing-bank/sparse_dot_topn
- 用于PolyFuzz中稀疏矩阵间的快速余弦相似性
- 项目
标签: