{"about":{"site":"https://codewithpapers.app","non_affiliation":"Code with Papers and Syntology are not affiliated with, endorsed by, or sponsored by Papers with Code, Meta, or the pwc-archive mirror.","licence":"CC BY-SA 4.0","licence_url":"https://creativecommons.org/licenses/by-sa/4.0/legalcode","attribution":"https://codewithpapers.app/attribution","modified":"archive material modified by Syntology; see the attribution page"},"url":"/paper/concept-induction-analyzing-unstructured-text","title":"Concept Induction: Analyzing Unstructured Text with High-Level Concepts Using LLooM","arxiv_id":"2404.12259","date":"2024-04-18","proceeding":null,"authors":["Michelle S. Lam","Janice Teoh","James Landay","Jeffrey Heer","Michael S. Bernstein"],"abstract":"Data analysts have long sought to turn unstructured text data into meaningful concepts. Though common, topic modeling and clustering focus on lower-level keywords and require significant interpretative work. We introduce concept induction, a computational process that instead produces high-level concepts, defined by explicit inclusion criteria, from unstructured text. For a dataset of toxic online comments, where a state-of-the-art BERTopic model outputs \"women, power, female,\" concept induction produces high-level concepts such as \"Criticism of traditional gender roles\" and \"Dismissal of women's concerns.\" We present LLooM, a concept induction algorithm that leverages large language models to iteratively synthesize sampled text and propose human-interpretable concepts of increasing generality. We then instantiate LLooM in a mixed-initiative text analysis tool, enabling analysts to shift their attention from interpreting topics to engaging in theory-driven analysis. Through technical evaluations and four analysis scenarios ranging from literature review to content moderation, we find that LLooM's concepts improve upon the prior art of topic models in terms of quality and data coverage. In expert case studies, LLooM helped researchers to uncover new insights even from familiar datasets, for example by suggesting a previously unnoticed concept of attacks on out-party stances in a political social media dataset.","url_abs":"https://arxiv.org/abs/2404.12259v1","url_pdf":"https://arxiv.org/pdf/2404.12259v1.pdf","source":{"archive":"pwc-archive (Hugging Face), CC BY-SA 4.0","snapshot":"2025-07-28","licence_url":"https://creativecommons.org/licenses/by-sa/4.0/legalcode","row_kind":"abstracts"},"code_links":[{"paper_slug":"concept-induction-analyzing-unstructured-text","repo_url":"https://github.com/michelle123lam/lloom","is_official":1,"mentioned_in_paper":1,"mentioned_in_github":0,"framework":"none","reach":{"status":"ok","spdx":"BSD-3-Clause"}}],"tasks":[{"task_slug":"topic-models","task_name":"Topic Models"}],"methods":[{"method_slug":"focus","method_name":"Focus"}],"datasets_introduced":[],"methods_introduced":[],"results":[],"syntology":{"atlas_url":"https://app.syntology.ai/?focus=2404.12259","mcp":{"get_harvested_code_for_paper":{"arxiv_id":"2404.12259"}},"developers":"https://syntology.ai/developers","read_at":"2026-09-24T18:15:14+00:00","read_at_is":"when the build read Syntology's graph, not when any sample ran","claim":"Per-sample execution status on synthesized fixtures; not a correctness claim about the paper. Samples come from repositories linked to the paper, official or community; repo_kind says which.","repos":[{"provenance":"external:paperswithcode_snapshot_2025-07-28","url":"https://github.com/michelle123lam/lloom","reach":{"status":"ok","spdx":"BSD-3-Clause"}}],"summary":{"ran":9},"by_repo_kind":{"official":{"samples":9,"ran":9,"repositories":1}},"repo_kind_vocabulary":{"official":"The archive marks this repository official for the paper","named_in_paper":"The archive records that the paper mentions this repository; it is not marked official","listed":"In the archive's code links for this paper, not marked official and not recorded as mentioned in the paper","found_in_text":"Syntology found this repository in the paper's own text; whether it is the authors' implementation is not asserted","community":"Not in the archive's code links for this paper; a community repository Syntology harvested"},"n_pointer_only_for_licence":0,"samples":[{"code_sha256_prefix":"fa71a93b3f9cd7c0","entry":"base_api_wrapper","repo":"michelle123lam/lloom","repo_kind":"official","path":"text_lloom/src/text_lloom/llm.py","file_url":"https://github.com/michelle123lam/lloom/blob/HEAD/text_lloom/src/text_lloom/llm.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"BSD-3-Clause","inline_ok":true,"mcp_get_code":{"code_sha256":"fa71a93b3f9cd7c0"}},{"code_sha256_prefix":"1b5f9a2aee2d28ed","entry":"call_llm_fn","repo":"michelle123lam/lloom","repo_kind":"official","path":"text_lloom/src/text_lloom/llm_openai.py","file_url":"https://github.com/michelle123lam/lloom/blob/HEAD/text_lloom/src/text_lloom/llm_openai.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"BSD-3-Clause","inline_ok":true,"mcp_get_code":{"code_sha256":"1b5f9a2aee2d28ed"}},{"code_sha256_prefix":"5473633ba4bbbf1c","entry":"json_load","repo":"michelle123lam/lloom","repo_kind":"official","path":"text_lloom/src/text_lloom/concept_induction.py","file_url":"https://github.com/michelle123lam/lloom/blob/HEAD/text_lloom/src/text_lloom/concept_induction.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"BSD-3-Clause","inline_ok":true,"mcp_get_code":{"code_sha256":"5473633ba4bbbf1c"}},{"code_sha256_prefix":"36827757b54457c0","entry":"multi_query_gpt","repo":"michelle123lam/lloom","repo_kind":"official","path":"text_lloom/src/text_lloom/llm.py","file_url":"https://github.com/michelle123lam/lloom/blob/HEAD/text_lloom/src/text_lloom/llm.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"BSD-3-Clause","inline_ok":true,"mcp_get_code":{"code_sha256":"36827757b54457c0"}},{"code_sha256_prefix":"d0db655db88778ad","entry":"multi_query_gpt_wrapper","repo":"michelle123lam/lloom","repo_kind":"official","path":"text_lloom/src/text_lloom/llm.py","file_url":"https://github.com/michelle123lam/lloom/blob/HEAD/text_lloom/src/text_lloom/llm.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"BSD-3-Clause","inline_ok":true,"mcp_get_code":{"code_sha256":"d0db655db88778ad"}},{"code_sha256_prefix":"006c9246a8fd9b35","entry":"pretty_print_dict","repo":"michelle123lam/lloom","repo_kind":"official","path":"text_lloom/src/text_lloom/concept_induction.py","file_url":"https://github.com/michelle123lam/lloom/blob/HEAD/text_lloom/src/text_lloom/concept_induction.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"BSD-3-Clause","inline_ok":true,"mcp_get_code":{"code_sha256":"006c9246a8fd9b35"}},{"code_sha256_prefix":"8b30d23c7d2d2145","entry":"pretty_print_dict_list","repo":"michelle123lam/lloom","repo_kind":"official","path":"text_lloom/src/text_lloom/concept_induction.py","file_url":"https://github.com/michelle123lam/lloom/blob/HEAD/text_lloom/src/text_lloom/concept_induction.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"BSD-3-Clause","inline_ok":true,"mcp_get_code":{"code_sha256":"8b30d23c7d2d2145"}},{"code_sha256_prefix":"42f160b127b653ce","entry":"setup_embed_fn","repo":"michelle123lam/lloom","repo_kind":"official","path":"text_lloom/src/text_lloom/llm_openai.py","file_url":"https://github.com/michelle123lam/lloom/blob/HEAD/text_lloom/src/text_lloom/llm_openai.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"BSD-3-Clause","inline_ok":true,"mcp_get_code":{"code_sha256":"42f160b127b653ce"}},{"code_sha256_prefix":"42e216402aeed245","entry":"setup_llm_fn","repo":"michelle123lam/lloom","repo_kind":"official","path":"text_lloom/src/text_lloom/llm_openai.py","file_url":"https://github.com/michelle123lam/lloom/blob/HEAD/text_lloom/src/text_lloom/llm_openai.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"BSD-3-Clause","inline_ok":true,"mcp_get_code":{"code_sha256":"42e216402aeed245"}}]},"arxiv_metadata":null,"syntology_extracted_results":null}