快速识别和分组大型数据集中的相似文本字符串
textpack的Python项目详细描述
这是什么?
textpack有效地将大(或小)数据集中的相似值分组。在引擎盖下,它建立了一个文档项矩阵,其中n个g分配了一个tf-idf分数。然后使用矩阵乘法快速计算这些值之间的余弦相似度。关于技术解释,I wrote a blog post。
我为什么在乎?
如果您是分析师、记者、数据科学家或类似人员,并且曾经有过电子表格、SQL表或JSON字符串,其中包含不一致的输入,例如:
row | fullname |
---|---|
1 | John F. Doe |
2 | Esquivel, Mara |
3 | Doe, John F |
4 | Whyte, Luke |
5 | Doe, John Francis |
您希望执行某种类型的分析(可能在透视表或GROUP BY语句中),但由于拼写和格式上的偏差,您可以使用textpack在几秒钟内梳理数百到数千个单元格,然后创建第三列,如下所示:
row | fullname | name_groups |
---|---|---|
1 | John F. Doe | Doe John F |
2 | Esquivel, Mara | Esquivel Mara |
3 | Doe, John F | Doe John F |
4 | Whyte, Luke | Whyte Luke |
5 | Doe, John Francis | Doe John F |
然后我们可以按name_groups
分组并执行分析。
也可以跨多个列分组。例如,假设如下:
row | make | model |
---|---|---|
1 | Toyota | Camry |
2 | toyta | camry DXV |
3 | Ford | F-150 |
4 | Toyota | Tundra |
5 | Honda | Accord |
您可以跨make
和model
分组以创建:
row | make | model | car_groups |
---|---|---|---|
1 | Toyota | Camry | toyotacamry |
2 | toyta | camry DXV | toyotacamry |
3 | Ford | F-150 | fordf150 |
4 | Toyota | Tundra | toyotatundra |
5 | Honda | Accord | hondaaccord |
砰。
我怎么用?
安装
pip install textpack
导入模块
from textpack import tp
实例化文本包
tp.Textpack(df, columns_to_group, match_threshold=0.75, ngram_remove=r'[,-./]', ngram_length=3)
pip install textpack
from textpack import tp
tp.Textpack(df, columns_to_group, match_threshold=0.75, ngram_remove=r'[,-./]', ngram_length=3)
类参数:
df
(必需):熊猫的数据帧,包含要分组的数据集columns_to_group
(必需):与要分析和分组的列标题匹配的列表或字符串match_threshold
(可选):这是一个介于0和1之间的浮点数,表示余弦相似性阈值,我们将使用该阈值来确定是否应将两个字符串分组。阈值越接近1,相似度就越高。ngram_remove
(可选):当我们构建n-grams时,可以使用正则表达式从字符串中筛选字符ngram_length
(可选):n-grams的长度。这可以与match_threshold
一起使用,以找到分组数据集的最佳位置。如果textpack运行缓慢,通常是考虑增加n-gram长度的标志。
还可以使用以下帮助程序实例化textpack,每个帮助程序只是一个包装器,将数据格式转换为pandas数据帧,然后将其传递给textpack。因此,它们都需要一个文件路径columns_to_group
,并直接采用与callin TextPack
相同的三个可选参数。
tp.read_csv(csv_path, columns_to_group, match_threshold=0.75, ngram_remove=r'[,-./]', ngram_length=3)
tp.read_excel(excel_path, columns_to_group, sheet_name=None, match_threshold=0.75, ngram_remove=r'[,-./]', ngram_length=3)
tp.read_json(json_path, columns_to_group, match_threshold=0.75, ngram_remove=r'[,-./]', ngram_length=3)
运行textpack并对值进行分组
textpack对象具有以下公共属性:
df
:textpack在内部使用的数据帧-根据需要操作group_lookup
:由build_group_lookup
构建,然后由add_grouped_column_to_data
使用的python字典,用于查找具有组的每个值。看起来是这样的:
{
'John F. Doe': 'Doe John F',
'Doe, John F': 'Doe John F',
'Doe, John Francis': 'Doe John F'
}
textpack对象还具有以下公共方法:
build_group_lookup()
:运行余弦相似性分析并生成group_lookup
。add_grouped_column_to_data(column_name='Group')
:使用矢量化通过group_lookup
将值映射到组,并将新的Group
列添加到数据帧。列标题可以通过column_name
设置。set_match_threshold(match_threshold)
:在内部修改匹配阈值。set_ngram_remove(ngram_remove)
:在内部修改n-gram正则表达式过滤器。set_ngram_length(ngram_length)
:在内部修改n-gram长度。run(column_name='Group')
:一个助手函数,它调用build_group_lookup
,然后是add_grouped_column_to_data
。
导出分组数据集
export_json(export_path)
export_csv(export_path)
一个简单的例子
from textpack import tp
cars = tp.read_csv('./cars.csv', ['make', 'model'], match_threshold=0.8, ngram_length=5)
cars.run()
cars.export_csv('./cars-grouped.csv')
它是如何工作的?
export_json(export_path)
export_csv(export_path)
from textpack import tp
cars = tp.read_csv('./cars.csv', ['make', 'model'], match_threshold=0.8, ngram_length=5)
cars.run()
cars.export_csv('./cars-grouped.csv')
它是如何工作的?
如前所述,在引擎盖下,我们正在构建一个文件项矩阵,其中n个g分配了一个tf-idf分数。然后我们使用矩阵多重定位快速计算这些值之间的余弦相似性。
我写了this detailed blog post来解释textpack在幕后是如何工作的,以及为什么它很快。过来看!