python - 使用 pandas 我们如何制作不同的文本组(来自 PDF 输出)并给他们特定的组 ID?
问题描述
我使用了一些逻辑来迭代我的 tsv 文件,这样每个文本组都将被赋予一个组号。您可以在答案中找到此代码,我已经更改了之前的问题,在@Jeril 的帮助下,我能够获得此代码。
import pandas as pd
import numpy as np
main_df = pd.read_csv('sampleOutput.tsv', delimiter='\t')
main_df = main_df.dropna(subset=['text'], axis=0)
final_df = pd.DataFrame()
for page_no in main_df['page_num'].unique():
df = main_df[main_df['page_num'] == page_no].copy(deep=True)
df['top'] = df['top'].astype(int)
df['bool'] = (df['top'] - df['top'].shift(-1)) < -50
df.loc[df['bool'] == True, 'group'] = range(
1, (df['bool'] == True).sum() + 1)
df['group'] = df['group'].replace({0: np.nan}).bfill()
df['group'] = df['group'].fillna((df['bool'] == True).sum() + 1)
final_df = pd.concat([final_df, df])
print(final_df)
所以这是我必须得到输出的表,我使用的逻辑假设阈值为(300,50),每个文本组都会有一个不同的组不,我这样做是为了我可以显示我的输出一种更明智的方式。句子分组:a) 如果 x 距离 < 阈值,则对同一行上的单词进行分组 b) 如果 y 距离 < 阈值,则将下一行上的单词与上一个单词分组
x = current_left - previous_left(左指“左”列)
y = current_line_top - previous_line_top(top 指的是“top”列)
EXPECTED OUTPUT:-这是一个例子,因为要再次编写整个输入很困难,基本上每个逻辑句子都会在同一组中,逻辑是不变的
x = 'left' 列上的当前行 - 'left' 列上的前一行(left 指的是“left” 列)
x < 阈值 (300)
y = current_line_top_column - previous_line_top_column(top 指的是“top”列)
y < 阈值 (50)
如果有人可以提供帮助,我无法实现此逻辑!
page_num block_num line_num word_num left top width text groupNo
1 27 1 1 405 420 129 Property 1
1 27 1 2 543 420 31 of 1
1 27 1 3 578 420 159 Accenture 1
1 27 4 1 409 581 105 INTERPRET 2
1 27 4 2 520 581 90 DRAWING 2
1 27 4 3 616 581 38 PER 2
1 27 4 4 659 581 113 APPLICABLE 2
1 27 4 5 779 581 267 STANDARD: 2
1 27 5 1 411 603 114 Accenture 2
1 27 5 2 532 603 84 ACCOO1 2
2 46 1 1 480 800 114 yoyoyo 3
2 46 1 2 550 800 84 heloo 3
请问问题是否不清楚。
解决方案
您可以尝试以下方法:
main_df = pd.read_csv('codebeautify.tsv', delimiter='\t')
final_df = pd.DataFrame()
for page_no in main_df['page_num'].unique():
df = main_df[main_df['page_num'] == page_no].copy(deep=True)
df['top'] = df['top'].astype(int)
df['bool'] = ((df['top'] - df['top'].shift(-1)).abs() >
50) != ((df['left'] - df['left'].shift(-1)).abs() > 350)
df.loc[df['bool'] == True, 'group'] = range(
1, (df['bool'] == True).sum() + 1)
final_df = pd.concat([final_df, df])
final_df['group'] = final_df['group'].replace({0: np.nan}).bfill()
final_df['group'] = final_df['group'].fillna((final_df['bool'] == True).sum() + 1)
样本输出:
left top text bool group
0 405 420 Property False 1.0
1 543 420 of False 1.0
2 578 420 Accenture True 1.0
3 409 581 INTERPRET False 2.0
4 520 581 DRAWING False 2.0
5 616 581 PER False 2.0
6 659 581 APPLICABLE False 2.0
7 779 581 STANDARD True 2.0
8 411 603 Accenture False 3.0
9 532 603 ACCOO1 True 3.0
10 480 800 yoyoyo False 4.0
11 550 800 heloo False 4.0
推荐阅读
- java - 具有单例/原型范围的 Spring 异步执行
- python - 比较文件 A 和 B 中的值的 Python 方法,如果 A 匹配,则从 B 打印整行
- amazon-s3 - 来自 Terraform 的畸形 S3 策略
- perl - 如何获取被调用的别名子程序的名称?
- c# - 如何使用自定义节点结构将 C# DataSet 对象写入 XML?
- javascript - 使用 jQuery 的简单 POST 请求导致意外重定向
- php - php array_keys 按数组搜索值?
- kubernetes - 在 kubernetes GKE 中更改 cockroachDB 的运行参数
- angularjs - 量角器 e2e | 元素在点错误处不可点击 | Angular 混合应用程序
- c++ - CMake:什么是可能的目标源类型,它们可以扩展吗?