Li, Kai, Mai, Feng, Shen, Rui, Yang, Chelsea, and Zhang, Tengfei. "Dissecting Corporate Culture Using Generative AI." The Review of Financial Studies, Volume 39, Issue 1, January 2026, Pages 253–296, https://doi.org/10.1093/rfs/hhaf081
This package contains example Python code and data for extracting and analyzing corporate culture from analyst reports using generative AI.
code/ # Processing modules
├── preprocessing/ # Phase 1: Text processing and segmentation
│ ├── segment_and_embed.py # Text segmentation and embedding generation
│ ├── compute_boilerplate_prob.py # Boilerplate detection
│ ├── pdf2text.py # PDF text extraction utilities
│ └── SegMethods.py # Text segmentation algorithms
│
├── culture_identification/ # Phase 2: Culture segment identification
│ ├── train_culture_classifier.py # Model training
│ ├── search_culture_segments.py # Culture segment detection
│ ├── gpt_filter_culture.py # GPT-based filtering
│ ├── solr/ # Optional Apache Solr integration
│ ├── cls_heads.py # Classification model components
│ └── config.py # Configuration settings
│
├── information_extraction/ # Phase 3: Information extraction and analysis
│ ├── extract_culture.py # Two-round GPT extraction pipeline
│ ├── normalize_culture.py # Normalization and standardization
│ ├── visualize_culture.py # Sankey diagram visualization
│ ├── context_utils.py # RAG context utilities
│ └── config.py # Configuration settings
│
├── report_funcs.py # Database access utilities
└── gpt_funcs.py # GPT processing utilities
data/ # Data storage
├── raw/analyst_reports/ # Example input analyst reports (PDF files + metadata)
├── database/ # SQLite databases (reports, embeddings, segment boundaries)
└── processed/ # Intermediate and final results
├── text/ # Processed text files
├── xml/ # XML processing outputs
├── boilerplate/ # Boilerplate detection results
├── culture_segments/ # Identified culture segments
└── culture_extraction/ # Final extraction results and visualizations
├── Normalized_Results/ # Standardized results
└── visualizations/ # Generated charts and diagrams
models/ # Trained models and weights
└── culture_cls_model/ # Culture classification model
├── checkpoints/ # Training checkpoints
└── final_model_weights/ # Final trained weights
The package implements three sequential processing phases. You can run the full pipeline or start at any phase if previous outputs exist.
Location: code/preprocessing/
Purpose: Convert raw analyst reports into segmented, embedded text ready for analysis.
Execution:
cd code/preprocessing
python pdf2text.py run_full_pipeline
python segment_and_embed.py convert_emb_direct
python segment_and_embed.py convert_seg_boundary_direct
python compute_boilerplate_prob.py run_boilerplate_pipelineInputs: Raw analyst reports (PDF files) in data/raw/analyst_reports/
Outputs:
data/database/reports.db- Processed text databasedata/database/embeddings.db- Sentence embeddingsdata/database/seg_boundaries.db- Segmentation boundariesdata/processed/boilerplate/prob.csv- Boilerplate probabilities
Location: code/culture_identification/
Purpose: Identify segments containing corporate culture discussions.
Execution:
cd ../culture_identification
# Stage 1: Keyword search with Word Sense Disambiguation
# Default search:
python search_culture_segments.py run_stage1_pipeline
# OR Optional Solr search (requires setup, see code/culture_identification/README.md):
# python search_culture_segments.py run_stage1_pipeline --engine=solr
# Stage 2: Classifier training
python train_culture_classifier.py run_stage2_pipeline
# Stage 3: GPT filtering and final combination
python gpt_filter_culture.py run_stage3_pipelineInputs: Processed text and embeddings from Phase 1
Outputs:
data/processed/culture_segments/all_culture_segments.csv- Final culture segmentsdata/processed/culture_segments/culture_segments_stage1.csv- Initial model predictionsdata/processed/culture_segments/high_probability_segments_gpt_filtered.csv- GPT-filtered segmentsdata/processed/culture_segments/training_data.csv- Training data for model
Location: code/information_extraction/
Purpose: Extract structured culture information using GPT and generate analysis.
Execution:
cd ../information_extraction
python extract_culture.py run_extraction_pipeline
python normalize_culture.py run_normalization_pipeline
python visualize_culture.pyInputs: Culture segments from Phase 2
Outputs:
data/processed/culture_extraction/combined_extraction_results.csv- Raw extraction resultsdata/processed/culture_extraction/round1_results.csv- Direct GPT processing resultsdata/processed/culture_extraction/round2_results.csv- RAG-enhanced resultsdata/processed/culture_extraction/extracted_causal_relationships.csv- Exploded causal relationshipsdata/processed/culture_extraction/Normalized_Results/normalized_results.csv- Final normalized resultsdata/processed/culture_extraction/Normalized_Results/causes_normalized.csv- Normalized causesdata/processed/culture_extraction/Normalized_Results/consequences_normalized.csv- Normalized consequencesdata/processed/culture_extraction/visualizations/sankey_diagram_top_2.png- Cause-effect visualization
For detailed instructions on each phase:
- Phase 1: See
code/preprocessing/README.md - Phase 2: See
code/culture_identification/README.md - Phase 3: See
code/information_extraction/README.md
- Install required Python dependencies:
pip install -r requirements.txt- GPT API: Set
OPENAI_API_KEYenvironment variable. See OpenAI documentation for more information. - OpenRouter (Alternative):
- Set
OPENROUTER_API_KEYenvironment variable. - Update
BASE_URLincode/culture_identification/config.pyandcode/information_extraction/config.pyto"https://openrouter.ai/api/v1". - Update
GPT_MODELto your desired model (e.g.,"google/gemini-2.0-flash-001").
- Set
- Model Settings: Configure GPT model and parameters in phase-specific
config.pyfiles. - File Paths: All paths are configured relative to the package root directory.
Final Results:
data/processed/culture_extraction/Normalized_Results/normalized_results.csv- Complete normalized culture analysisdata/processed/culture_extraction/Normalized_Results/causes_normalized.csv- Standardized causesdata/processed/culture_extraction/Normalized_Results/consequences_normalized.csv- Standardized consequencesdata/processed/culture_extraction/visualizations/sankey_diagram_top_2.png- Cause-effect visualization
Key Intermediate Files:
data/processed/culture_segments/all_culture_segments.csv- Identified culture segmentsdata/processed/culture_extraction/combined_extraction_results.csv- Raw GPT extraction resultsdata/processed/culture_extraction/extracted_causal_relationships.csv- Exploded causal relationshipsdata/database/reports.db- Processed text databasedata/database/embeddings.db- Sentence embeddingsdata/processed/boilerplate/prob.csv- Boilerplate probabilities