首页 > 解决方案 > 使用 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

请问问题是否不清楚。

标签: pythonpandasdataframe

解决方案


您可以尝试以下方法:

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

推荐阅读