快速识别并分组大型数据集中的相似文本字符串
项目描述
这是什么?
TextPack高效地将大型(或小型)数据集中的相似值分组。在内部,它构建一个分配TF-IDF分数的n-gram文档词矩阵。然后它使用矩阵乘法来计算这些值之间的余弦相似度。有关技术解释,请参阅我写的博客文章。
关于分支
从这个原始项目https://github.com/lukewhyte/textpack的分支增加了对向awesome_cossim_topn调用添加topn大小的支持。分支发布到https://pypi.ac.cn/project/textpack2/。
为什么我关心?
如果您是分析师、记者、数据科学家或类似人员,并且曾经有过这样的电子表格、SQL表或JSON字符串,其中包含不规则的输入,例如
行 | 全名 |
---|---|
1 | John F. Doe |
2 | Esquivel, Mara |
3 | Doe, John F |
4 | Whyte, Luke |
5 | Doe, John Francis |
并且您想执行某种分析——可能在数据透视表或分组语句中——但受到拼写和格式差异的限制,您可以使用TextPack在几秒钟内扫描数千个单元格,并创建一个像这样的第三列
行 | 全名 | 名称组 |
---|---|---|
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
进行分组,并进行我们的分析。
您也可以跨多列进行分组。例如,给定以下
行 | 制造 | 型号 |
---|---|---|
1 | 丰田 | 凯美瑞 |
2 | 丰田 | 丰田凯美瑞DXV |
3 | 福特 | F-150 |
4 | 丰田 | 坦达 |
5 | 本田 | 雅阁 |
您可以根据 制造
和 型号
进行分组以创建
行 | 制造 | 型号 | car_groups |
---|---|---|---|
1 | 丰田 | 凯美瑞 | 丰田凯美瑞 |
2 | 丰田 | 丰田凯美瑞DXV | 丰田凯美瑞 |
3 | 福特 | F-150 | 福特F-150 |
4 | 丰田 | 坦达 | 丰田坦达 |
5 | 本田 | 雅阁 | 本田雅阁 |
如何使用它?
安装
pip install textpack
导入模块
from textpack import tp
实例化 TextPack
tp.TextPack(df, columns_to_group, match_threshold=0.75, ngram_remove=r'[,-./]', ngram_length=3)
类参数
df
(必需):包含要分组的数据集的 Pandas DataFramecolumns_to_group
(必需):一个列表或字符串,匹配您想要解析和分组的列标题match_threshold
(可选):这是一个介于 0 和 1 之间的浮点数,表示我们将用于确定两个字符串是否应该分组的余弦相似度阈值。阈值越接近 1,相似度越高才被认为是匹配。ngram_remove
(可选):您可以使用正则表达式过滤我们在构建 n-gram 时从字符串中移除的字符。ngram_length
(可选):我们的 n-gram 的长度。这可以与match_threshold
一起使用,以找到分组数据集的最佳点。如果 TextPack 运行缓慢,通常是一个提高 n-gram 长度的信号。
TextPack 还可以使用以下辅助程序进行实例化,每个辅助程序都是一个转换数据格式到 Pandas DataFrame 的包装器,然后将它传递给 TextPack。因此,它们都需要文件路径、columns_to_group
并接受与直接调用 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 内部使用的 DataFrame - 根据您的需要进行操作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
将值映射到组,并将新列添加到 DataFrame 中。可以通过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')
故障排除
我遇到了内存错误!
一些用户在解析大数据集时触发了内存错误。 这篇 StackOverflow 文章 已被证明很有用。
它是如何工作的?
如上所述,在底层,我们正在构建一个具有 TF-IDF 分数的 n-gram 文档词矩阵。然后我们使用矩阵乘法快速计算这些值之间的余弦相似度。
我写了一篇关于 TextPack 在幕后如何工作的 博客文章。查看它!
项目详情
下载文件
下载适合您平台的文件。如果您不确定选择哪一个,请了解更多关于安装包的信息。
源代码分发
构建分发
textpack2-0.1.3.tar.gz的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | a685e6f0a60d2e0bc18d5ea3c962d602dcb139d03b9dc9adb0a787c9dbf13991 |
|
MD5 | 8b9ffd9fa5fa92b44e0a4c02dbeb05b1 |
|
BLAKE2b-256 | 044ab89338e1ecc342950cb73d2b8b9c93b488d0d6a6001e70ccb04301e1434e |
textpack2-0.1.3-py3-none-any.whl的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | e561fccb18d8eb6b4ea40db5e1b8edf04ac405000906f1fbb24a4a815b2c2893 |
|
MD5 | ec9cdf43c7872fa3ff05078c6a7428e5 |
|
BLAKE2b-256 | 72103a4b19efe25750d8cfeb7dee79f2286e6cd1ba20ce271b35501ac6467eca |