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

textpack的Python项目详细描述


这是什么?

textpack有效地将大(或小)数据集中的相似值分组。在引擎盖下,它建立了一个文档项矩阵,其中n个g分配了一个tf-idf分数。然后使用矩阵乘法快速计算这些值之间的余弦相似度。关于技术解释,I wrote a blog post

我为什么在乎?

如果您是分析师、记者、数据科学家或类似人员,并且曾经有过电子表格、SQL表或JSON字符串,其中包含不一致的输入,例如:

rowfullname
1John F. Doe
2Esquivel, Mara
3Doe, John F
4Whyte, Luke
5Doe, John Francis

您希望执行某种类型的分析(可能在透视表或GROUP BY语句中),但由于拼写和格式上的偏差,您可以使用textpack在几秒钟内梳理数百到数千个单元格,然后创建第三列,如下所示:

rowfullnamename_groups
1John F. DoeDoe John F
2Esquivel, MaraEsquivel Mara
3Doe, John FDoe John F
4Whyte, LukeWhyte Luke
5Doe, John FrancisDoe John F

然后我们可以按name_groups分组并执行分析。

也可以跨多个列分组。例如,假设如下:

rowmakemodel
1ToyotaCamry
2toytacamry DXV
3FordF-150
4ToyotaTundra
5HondaAccord

您可以跨makemodel分组以创建:

rowmakemodelcar_groups
1ToyotaCamrytoyotacamry
2toytacamry DXVtoyotacamry
3FordF-150fordf150
4ToyotaTundratoyotatundra
5HondaAccordhondaaccord

砰。

我怎么用?

安装
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')

它是如何工作的?

如前所述,在引擎盖下,我们正在构建一个文件项矩阵,其中n个g分配了一个tf-idf分数。然后我们使用矩阵多重定位快速计算这些值之间的余弦相似性。

我写了this detailed blog post来解释textpack在幕后是如何工作的,以及为什么它很快。过来看!

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

推荐PyPI第三方库


热门话题
java OnResizeListener或OnDrawListener或类似的东西   java Orika映射嵌套子列表   保存时java Heroku请求超时代码H12   数据库在Java中出现socket读取超时异常的原因是什么?   java如何更改来自Sqlite数据库的特定数据在Listview中的行颜色   java JAXB解组器无法正确处理XML中的列表   java Android日期时区让我抓狂   java不透明属性在Swing中如何工作?   eclipse从JavaEE代码生成流程图   java如何在Hibernate中从相关表中获取计数   java Glassfish部署了项目的依赖项库   java使内容适合JavaFx中的WebView   java不满意的链接错误libcrypto。所以1.0.0   循环中java数组的使用   java找出哪个包调用服务