跳转到主要内容

快速识别并分组大型数据集中的相似文本字符串

项目描述

这是什么?

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 DataFrame
  • columns_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 (5.8 kB 查看哈希值)

上传时间 源代码

构建分发

textpack2-0.1.3-py3-none-any.whl (6.1 kB 查看哈希值)

上传时间 Python 3

由以下组织支持