111 Commits
Author SHA1 Message Date
imacat 28b2c18604 Finalize camera-ready version of conference paper 2026-08-18 22:37:32 +08:00
imacatandClaude Fable 5 21a39618d3 Add the wide pattern matrix of the women-power songs
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-18 22:37:32 +08:00
imacatandClaude Fable 5 7f3b5def0f Rewrite the research plan to the executed pipeline
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-18 22:37:32 +08:00
imacatandClaude Fable 5 30c9943bad Import the settled patterns and annotations into the working store
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-18 22:37:32 +08:00
imacatandClaude Fable 5 5a91f66402 Add the tally-annotations subcommand settling the pattern matrix
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-18 22:37:32 +08:00
imacatandClaude Fable 5 0db25812f2 Archive the step 5-4 pattern-annotation runs
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-18 22:37:06 +08:00
imacatandClaude Fable 5 63f00e44c5 Archive the step 5-3 grouped synthesis runs
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-18 22:36:33 +08:00
imacatandClaude Fable 5 d55725332e Add the step 5 grouped synthesis and pattern-annotation design
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-17 22:38:42 +08:00
imacatandClaude Fable 5 3a9eee19d1 Correct three performer genders via build-db --gender-corrections
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-17 22:38:42 +08:00
imacatandClaude Fable 5 02dfc794c4 Archive the step 5 reading, consolidation, and synthesis runs
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-17 22:38:41 +08:00
imacatandClaude Fable 5 e1355bcb70 Add the step 5 qualitative deep-reading design and definition files
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-17 22:38:41 +08:00
imacatandClaude Fable 5 a489f077c9 Record the Fable 5 auxiliary deep-reading experiments in the decision log
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-17 22:38:41 +08:00
imacatandClaude Fable 5 15cdb861ff Import the settled code groups into the working store
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-17 22:38:41 +08:00
imacatandClaude Fable 5 854bfe5c4b Add the tally-groups subcommand settling results/groups.csv
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-17 22:38:41 +08:00
imacatandClaude Fable 5 7917d23d6e Replace the quote newline escape with the lyric line-break convention
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-17 22:38:40 +08:00
imacatandClaude Fable 5 c3d6c06910 Add step 4 semantic code grouping by majority vote on claude-fable-5
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-17 22:38:40 +08:00
imacatandClaude Fable 5 683b15e073 Add a model option to run-llm for the claude-fable-5 model
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-17 22:38:40 +08:00
imacat 190f95b632 Add conference paper first draft. 2026-08-17 22:38:40 +08:00
imacatandClaude Fable 5 54e42c072c Record the blind semantic code grouping in the decision log
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-17 22:38:40 +08:00
imacatandClaude Fable 5 77049eb026 Record the full k-value comparison table in the decision log
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-17 22:38:39 +08:00
imacatandClaude Opus 5 f87e3642f6 Derive the performing group genders from their Wikidata members
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-17 22:38:39 +08:00
imacatandClaude Opus 5 bebf85814e Derive the song performer gender and identify Pinkfong as Hope Segoine
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-17 22:38:39 +08:00
imacatandClaude Opus 5 ea9df52bc3 Drop the redundant HTTP error class from the retry catch
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-17 22:38:39 +08:00
imacatandClaude Opus 5 62adf7f937 Pin the parenthesized members pattern to a single split point
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-17 22:38:38 +08:00
imacatandClaude Opus 5 35d8e08871 Make the module-level helpers private instead of protected
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-17 22:38:38 +08:00
imacatandClaude Opus 5 693dbccc9d Extract the protected name restoration out of the credit parser
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-17 22:38:38 +08:00
imacatandClaude Opus 5 2ea23d9bce Classify the transient request errors in one place
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-17 22:38:38 +08:00
imacatandClaude Opus 5 87926d9622 Extract the record content builder out of the export line builder
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-17 22:38:38 +08:00
imacatandClaude Opus 5 aa8b84c8cd Stop binding the unread role in the parsed credit check
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-17 22:38:38 +08:00
imacatandClaude Opus 5 7739abd105 Remove the unused skipped counter of the artist fetcher
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-17 22:38:37 +08:00
imacatandClaude Opus 5 dfdfccc460 Capture the command output in the parent-directory export test
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-17 22:38:37 +08:00
imacatandClaude Opus 5 4ae6fa7b2e Merge the two identical chart-position formatters of the CSV exporter
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-17 22:38:37 +08:00
imacatandClaude Opus 5 3aa5c7a432 Unify the export-llm-input and run-llm summary lines with build-db
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-17 22:38:37 +08:00
imacatandClaude Opus 5 bc44d60d18 Close the HTTP error fixtures when the test ends
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-17 22:38:37 +08:00
imacatandClaude Opus 5 a64c04a128 Run the tests on an in-memory store and dispose the engine afterwards
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-17 22:38:36 +08:00
imacatandClaude Opus 5 c3e48aac56 Trim the build-db summary to songs, artists, codings and elapsed time
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-17 22:38:36 +08:00
imacatandClaude Opus 5 40c41f2734 Import the settled coding into the working store
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-17 22:38:36 +08:00
imacatandClaude Opus 5 58189bae3a Settle the coding of the 883 songs against the 101 keywords
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-17 22:38:36 +08:00
imacatandClaude Opus 5 745a8eed9b Repair the coding output with a reviewed correction table
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-17 22:38:35 +08:00
imacatandClaude Opus 5 7f43cf238b Record how far the coding output departs from its stated contract
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-17 22:38:35 +08:00
imacatandClaude Opus 5 95a05a0631 Add the tally-codings subcommand for the majority vote
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-17 22:38:35 +08:00
imacatandClaude Opus 5 24a4ca6970 Archive the third coding run
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-17 22:38:34 +08:00
imacatandClaude Opus 5 c51c9d71e1 Settle the coding by a majority of three runs instead of an arbitration
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-17 22:38:34 +08:00
imacatandClaude Opus 5 7008e14972 Import each command module only when its subcommand runs
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-17 22:38:34 +08:00
imacatandClaude Opus 5 668f1bb118 Restructure cluster-keywords into builders and result records
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-17 22:38:34 +08:00
imacatandClaude Opus 5 019f317a82 Archive the arbitration pass over the coding disagreements
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-17 22:38:34 +08:00
imacatandClaude Opus 5 20c48f04b9 Quote one line per kept keyword in the arbitration
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-17 22:38:33 +08:00
imacatandClaude Opus 5 3bae24b930 Build the arbitration input with a per-ID extras merge
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-17 22:38:33 +08:00
imacatandClaude Opus 5 1714257c89 Add the compare-codings subcommand for the arbitration handoff
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-17 22:38:33 +08:00
imacatandClaude Opus 5 949a0f9c8d Drop the source-provenance artifact from cluster-keywords
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-17 22:38:33 +08:00
imacatandClaude Opus 5 f2a80475a5 Rename the arbitration definition file to 03-02-arbitration
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-17 22:38:32 +08:00
imacatandClaude Opus 5 7c2e286c9d Archive the second coding pass against the 101 keywords
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-17 22:38:32 +08:00
imacatandClaude Opus 5 5325a8f9a4 Archive the first coding pass against the 101 keywords
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-17 22:38:32 +08:00
imacatandClaude Opus 5 71b640085a Keep the medoid group names after testing LLM naming
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-17 22:38:32 +08:00
imacatandClaude Opus 5 dcf9e280d0 Report the clustering result in a sentence
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-17 22:38:32 +08:00
imacatandClaude Opus 5 e4f40e7c0f Rebuild the coding keywords with 100 groups
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-17 22:38:31 +08:00
imacatandClaude Opus 5 4dc526c4b0 Record the clustering invocation in a meta file
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-17 22:38:31 +08:00
imacatandClaude Opus 5 15f1843cde Raise the clustering to 100 groups
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-17 22:38:31 +08:00
imacatandClaude Opus 5 8cdeb3db2e Quote one line per assigned keyword
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-17 22:38:31 +08:00
imacatandClaude Opus 5 4fdc7b48fd Take the extra coding keywords from the command line
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-17 22:38:30 +08:00
imacatandClaude Opus 5 de8b8ee678 Merge the keyword pooling into cluster-keywords
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-17 22:38:30 +08:00
imacatandClaude Opus 5 5cf2b8ee8c Separate the clustered keyword list from the keywords to merge
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-17 22:38:30 +08:00
imacatandClaude Opus 5 04d5095e44 Pass the coding keywords as input instead of baking them into the prompt
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-17 22:38:29 +08:00
imacatandClaude Opus 5 ce4f9ad481 Archive the clustered coding vocabulary
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-17 22:38:29 +08:00
imacatandClaude Opus 5 41dc3ea2ea Add the cluster-keywords subcommand for the coding vocabulary
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-17 22:38:29 +08:00
imacatandClaude Opus 5 c03add4868 Archive the pooled keywords of the two tagging runs
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-17 22:38:29 +08:00
imacatandClaude Opus 5 d73de3d01c Add the pool-keywords subcommand for the tagging runs' keywords
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-17 22:38:28 +08:00
imacatandClaude Opus 5 14a3cbe121 Rebuild the vocabulary step on embeddings and drop the screen track
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-17 22:38:28 +08:00
imacatandClaude Fable 5 4313d58471 Report the elapsed time when run-llm finishes
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-17 22:38:28 +08:00
imacatandClaude Fable 5 db9fbd71d4 Archive the tag run2 execution
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-17 22:38:27 +08:00
imacatandClaude Fable 5 1802dac07a Archive the tag run1 execution and add the run-cost ledger
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-17 22:38:27 +08:00
imacatandClaude Fable 5 9b2af3bb50 Require valid JSON with escaped quotes in the definition files
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-17 22:38:27 +08:00
imacatandClaude Fable 5 99bbd566cf Forbid Markdown code fences in the definition-file outputs
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-17 22:38:27 +08:00
imacatandClaude Fable 5 3f793afd34 Record the song-775 refusal ablation and rule it unanalyzable
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-17 22:38:27 +08:00
imacatandClaude Fable 5 05ba3942a2 Add watermark normalization to fetch-lyrics
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-17 22:38:26 +08:00
imacatandClaude Fable 5 d46c50a2db Changed the natural-coding definition files to single-pass convergence
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-17 22:38:26 +08:00
imacatandClaude Fable 5 964006ec6d Add the natural-coding definition files and the convergence algorithms
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-17 22:38:26 +08:00
imacatandClaude Fable 5 0c82da7a1d Settle women-power as the a-priori screen label term
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-17 22:38:26 +08:00
imacatandClaude Fable 5 93a4f808bf Reduce run-llm to a pure batch executor
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-17 22:38:26 +08:00
imacatandClaude Fable 5 7a58f37d9f Record the natural-coding pipeline design in the project documents
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-17 22:38:26 +08:00
imacatandClaude Fable 5 b727284ef3 Gather the CLI command modules into a commands sub-package
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-17 22:38:26 +08:00
imacatandClaude Fable 5 396848e898 Add the export-llm-input subcommand for the lyrics-only LLM input
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-17 22:38:26 +08:00
imacatandClaude Fable 5 55926b8dc4 Regenerate the artists report with the Wikidata snapshot applied
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-17 22:38:26 +08:00
imacatandClaude Fable 5 ee6a1b88c5 Rename the Markdown documents to dash-connected names
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-17 22:38:20 +08:00
imacatandClaude Fable 5 1a7519becd Drop the engine preparation from build-db
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-04 15:34:36 +08:00
imacatandClaude Fable 5 a534b1b70b Move the invariant checks into the importers and drop find_violations
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-04 15:34:36 +08:00
imacatandClaude Fable 5 8fdd21f8a2 Package the capture-layer application into a CaptureImporter class
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-04 15:34:36 +08:00
imacatandClaude Fable 5 c561330bd0 Repackage the build-db import steps into job classes
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-04 15:34:36 +08:00
imacatandClaude Fable 5 64c62eb394 Capture the song lyrics from the pilot study and the public APIs
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-04 15:34:36 +08:00
imacatandClaude Fable 5 0d3cd69a0f Align the fetch-lyrics summary with fetch-artists via shared utils
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-04 15:34:26 +08:00
imacatandClaude Fable 5 81975b72e4 Remove the missing-lyrics report from fetch-lyrics
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-04 15:15:49 +08:00
imacatandClaude Fable 5 1b21471845 Fall back to the original artist credit when fetching lyrics
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-04 15:15:49 +08:00
imacatandClaude Fable 5 15f207ffc6 Remove the retired artist overrides layer and the mixed artist type
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-04 15:15:49 +08:00
imacat 93aa06703b Keep the artist snapshot sorted by name 2026-08-04 15:15:49 +08:00
imacat 8fdd25f569 Show resolved count and elapsed time in the fetch-artists summary 2026-08-04 15:15:49 +08:00
imacat 00b5c208ec Resolve artists on Wikidata via exact-match SPARQL with song corroboration 2026-08-04 15:15:49 +08:00
imacat c81bfcf51d Restore official artist name spellings in the canonical table 2026-08-04 15:15:49 +08:00
imacat 942a74c86c Record the complete-Wikidata-then-capture workflow decision 2026-08-04 15:15:49 +08:00
imacat 1f95f0231d Export human-readable songs and artists reports to the derived data layer 2026-08-04 15:15:49 +08:00
imacat ae0e9d0a08 Split artist credits with documented exceptions and normalize artist names 2026-08-04 15:15:49 +08:00
imacat 6a91bc73eb Merge same-song chart rows via a canonical artist credit table 2026-08-04 15:15:49 +08:00
imacat e15c988bf4 Store the source chart CSV with its original CRLF line endings 2026-08-04 15:15:49 +08:00
imacat f36a30411d Align the source chart CSV with the archived Billboard year-end charts 2026-08-04 15:15:49 +08:00
imacatandClaude Fable 5 5d5e4fac50 Reorganize data/ into source, captures, and manual layers
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-04 15:15:49 +08:00
imacatandClaude Fable 5 e9027472f4 Make every subcommand input an explicit CLI argument or option
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-04 15:13:31 +08:00
imacatandClaude Fable 5 e0eb343ce0 Refactor internal data passing to dataclasses and enums, and remove unneeded defensive code
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-04 15:13:31 +08:00
imacatandClaude Fable 5 8d223177cd Add the data layer with the build-db, fetch-lyrics, and fetch-artists subcommands
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-04 15:12:22 +08:00
imacatandClaude Fable 5 f9ab79f0c2 Use the unified pydantic-settings configuration in run_llm
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-04 14:03:37 +08:00
imacatandClaude Fable 5 b68393ab01 Record the data storage architecture and phase-1 plan in the project documents
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-04 14:03:37 +08:00
imacatandClaude Fable 5 12ace6f45a Add the tools sub-project with the run_llm batch runner
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-04 14:03:28 +08:00
imacatandClaude Fable 5 9a42b463a3 Initialize project structure, workflow rules, and research plan
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-30 18:51:10 +08:00
7 changed files with 44 additions and 534 deletions
+17 -18
View File
@@ -99,8 +99,8 @@
## 2026-08-02
- **`import-lyrics` 不設為子命令,pilot 歌詞改以 `excludes/`
私人腳本匯入**。理由:pilot 捕捉檔不隨論文發布,子命令
- **`import-lyrics` 不設為子命令,pilot 歌詞改以私人腳本
匯入**。理由:pilot 捕捉檔不隨論文發布,子命令
形式會在發布的 CLI 裡留下讀者無法執行的死命令——要交待的
是「沿用 pilot 捕捉」的事實(記於 lyrics-provenance.csv 與
論文方法節),不是工具本身;工具移出專案,發布管線即
@@ -178,8 +178,8 @@
來源公開可稽核,快照乾淨、overrides 縮小;論文方法節揭露
「捕捉前經研究者查證補完」。性別以公開自我認同為準,
推測不確定且無佐證者列疑慮清單;查證屬資料策展而非
分析,以 Claude Code 輔助、不走分析 APIQS 批次
`excludes/`私人工作檔,不隨論文發布
分析,以 Claude Code 輔助、不走分析 APIQS 批次
私人工作檔留存,不隨論文發布。
## 2026-08-04
@@ -227,7 +227,7 @@
- **Markdown 檔名一律以 dash 連接**decision-log.md、
research-plan.md、project-structure.md 等;與 data/ 層
CSV 檔名慣例一致),定義檔命名慣例同步改為
`prompts/<task>-v<N>.md`(如 screen-v1.md),`excludes/`
`prompts/<task>-v<N>.md`(如 screen-v1.md),版本庫外的
私人工作檔一併改名;`conference_abstract.md` 改名並搬入
`paper/`——它是本次年會實際送出的摘要,與全文同屬投稿
血脈,不是 `docs/` 的內部工作文件。全 repo 指涉同步更新。
@@ -583,8 +583,8 @@
Billboard 署名 Pinkfong 為品牌(Wikidata Q55735607,型態
brand),非演唱者;其唯一上榜曲 Baby Shark2019#75
的實際演唱者為 Hope SegoineKTVB 2019-03-06 報導、
Songfacts、經紀簡介,出處詳
`excludes/quickstatements/hope-segoine.md`)。藉既有的
Songfacts、經紀簡介,出處詳私人留存的
QuickStatements 草稿)。藉既有的
署名正規化機制(`ArtistImporter.CANONICAL_ARTIST_NAMES`
指認:歌曲的署名字串維持榜單所印的 "Pinkfong",解析出
的演出者實體為 Hope Segoine。品牌無性別可言,人有;
@@ -637,10 +637,9 @@
sentence-transformers/all-mpnet-base-v2, revision
e8c3b32e)對 `runs/02-cluster/source-keywords.txt`
5,999 個關鍵字重新計算。組內一致性定義為組內成員兩兩
餘弦相似度之平均。k=50 直接取自留存的分群結果
`excludes/k50/02-cluster/groups.csv`);k=30 以同參數
重跑(確定性演算法),重算所得最大組恰為 491 詞,與
當時粗算紀錄吻合,佐證重算與原實驗一致。數表:
餘弦相似度之平均。k=50 直接取自私人留存的分群結果
k=30 以同參數重跑(確定性演算法),重算所得最大組恰為
491 詞,與當時粗算紀錄吻合,佐證重算與原實驗一致。數表:
| | k=30 | k=50 | k=100 |
|---|---|---|---|
@@ -703,8 +702,8 @@
力量語意即入選,women-power 群 11 碼,並產詞彙表外
幻覺碼一筆),claude-fable-5 讀為詞彙化概念(要求女性
標記,women-power 群 2 碼),與草稿盲選及深度閱讀輔助
判讀同讀法;sonnet 對照執行歸檔備份於
`excludes/experiments/`,支出留帳。claude-fable-5 不
判讀同讀法;sonnet 對照執行歸檔另行私人備份,不入
版本庫,支出留帳。claude-fable-5 不
受理 temperature 與 thinking 參數(均不送出),無法釘
temperature=0;執行間變異實測存在(run1/run2 於陽剛、
脆弱邊緣碼分歧),由三票多數決吸收;詞彙表外輸出項
@@ -751,9 +750,9 @@
編碼、票數),納入重建摘要與清空範圍,供群層次查詢;
重建命令自此帶 `--groups results/groups.csv`
- **Fable 5 輔助判讀實驗總錄(非正式編碼;結果檔
gitignored 之 `excludes/`,本條為其版本庫內的程序
錨點)**:2026-08-08 起以 Claude Code subagent(模型
- **Fable 5 輔助判讀實驗總錄(非正式編碼;結果檔私人
留存、不入版本庫,本條為其版本庫內的程序錨點)**:
2026-08-08 起以 Claude Code subagent(模型
Fable 5)進行七項深度閱讀實驗。共同程序:每首歌一個
獨立會話、提示最少化且逐字統一、判讀者互不知情、不經
三票制;定位為研究者的輔助判讀(初篩),不改動任何
@@ -783,7 +782,7 @@
`male-mixed-wp-fe-feminist-reading.md` 與同名 .ods)。
此系列即論文方法節「最後編碼的結果,再由研究者與 LLM
(Claude Code)輔助判讀」之所指;結果檔含大量歌詞引文,
依著作權紀律留置 `excludes/`,不入版本庫。
依著作權紀律私人留置,不入版本庫。
- **步驟 5:女性主義問題之質性深讀(設計定案)**:論文
題目「挪用與污染」需要框架層的系統性證據;47 首
@@ -899,4 +898,4 @@
performer_gender 手工修正)、四份 results 定案表、時程
展延一至二日與剩餘撰寫工作。仍然有效的原則(先導不
比較、提示只定格式、歌手背景防火牆、commit 判準、
版權規則、positionality)保留。
版權規則)保留。
+14 -34
View File
@@ -1,7 +1,7 @@
# 專案目錄結構
2026-07-30 討論定案;2026-07-31 更新為 tools/ 子專案與
SQLite 工作儲存架構2026-08-17 依完成後的現況更新
SQLite 工作儲存架構)
```
pop-fem-audit/
@@ -19,18 +19,12 @@ pop-fem-audit/
│ │ └── lyrics/ # 歌詞 .txt 快取
│ │ # gitignored,版權)
│ ├── manual/ # 人工著作:只由研究者手寫
│ │ ├── coding-corrections.csv # 編碼與引述的校對表
│ │ └── performer-gender-corrections.csv # 演唱聲音性別的
│ │ # 手工修正
│ │ # (黃金標準編碼等)
│ └── derived/ # 衍生:只由 build-db 寫入
│ ├── songs.csv # 歌曲報表(人讀;進 git)
│ └── artists.csv # 歌手報表(人讀;進 git)
├── prompts/ # LLM 定義檔(逐字作為 system prompt
│ └── <步>-<次步>-<task>.md # 01-tag.md、03-code.md
│ # 04-group.md、05-01-read.md、
│ # 05-02-consolidate.md、
│ # 05-03-synthesize.md、
│ # 05-04-annotate.md
│ └── <步>-<次步>-<task>.md # 01-tag.md、03-code.md
│ # (步內僅一個執行時省略次步)
│ # 不帶版本號,版本即 git 歷史
│ # (編號的所指是工序:確定性
@@ -58,9 +52,6 @@ pop-fem-audit/
│ │ │ ├── cluster_keywords.py # pool the tagging runs'
│ │ │ │ # keywords and cluster them
│ │ │ │ # into the codes (step 2)
│ │ │ ├── tally_codings.py # settle step 3 by majority
│ │ │ ├── tally_groups.py # settle step 4 by majority
│ │ │ ├── tally_annotations.py # settle step 5-4 by majority
│ │ │ └── run_llm.py # API 執行器:一份定義檔+一份輸入
│ │ │ # →歸檔至指定目錄(Batch API);
│ │ │ # 多次執行的計票由獨立子命令承擔
@@ -71,10 +62,7 @@ pop-fem-audit/
│ └── tests/ # 單元測試(unittest
├── runs/ # 現行執行的完整稽核紀錄(進 git;
│ │ # 重跑同一 run 須明示 --replace
│ ├── <步驟名>/ # 一步一個目錄(01-tag、03-code
│ │ # 04-group、05-01-read、
│ │ # 05-02-consolidate、
│ │ # 05-03-synthesize、05-04-annotate
│ ├── <步驟名>/ # 一步一個目錄(03-code
│ │ └── run<N>/ # LLM 步驟:每個 run 一份自我
│ │ ├── prompt.md # 完備歸檔(定義檔快照)
│ │ ├── output.jsonl # 該次執行原始輸出
@@ -82,23 +70,18 @@ pop-fem-audit/
│ │ # batch ID、token 用量
│ └── 02-cluster/ # 確定性步驟:無執行變異,
│ # 不分 run<N> 層
├── results/ # 論文引用的定案表 CSV計票子命令
# 產出;「可再生仍 commit」的例外)
│ ├── codings.csv # 步驟 3 定案編碼
│ ├── groups.csv # 步驟 4 定案編碼群
│ ├── patterns.csv # 步驟 5-3 定案樣態表
│ ├── annotations.csv # 步驟 5-4 定案歌×樣態
│ └── pattern-matrix.csv # 前四者的人讀寬表
├── results/ # 論文引用的表 CSVexport 產出;
# 「可再生仍 commit」的唯一例外)
├── docs/
│ ├── research-plan.md # 研究步驟規劃(本檔之姊妹篇)
│ ├── project-structure.md # 本檔
│ ├── output-validation.md # LLM 輸出的契約查核紀錄
│ ├── codebook.md # 人工編碼手冊(版本由 git 管理)
│ ├── decision-log.md # 決策日誌:每次改定義檔的原因
│ ├── run-costs.md # 每次執行的 token 用量與費用
│ └── methodology.md # 方法細節(全文方法節底稿;
│ # 映射分析方法須在看結果前寫定)
└── paper/
├── conference-abstract.md # 先導研究摘要(投稿版)
├── abstract.md # 摘要
└── 流行音樂中「女性力量」….odt # 全文
```
@@ -111,15 +94,12 @@ pop-fem-audit/
- **`prompts/` 檔名不帶版本號**:版本即 git 歷史,失敗的
版本不保留;論文引用的單位是 `runs/` 內隨執行保存的定義檔
快照(每個執行目錄自我完備),不需檔名可指的版本名。
- **工作儲存的資料表**`songs`(含 `performer_gender`=演唱
聲音的性別)、`chart_entries``artists``song_artists`
`codings`(定案編碼:一歌一標籤一列,`quotes` 存該標籤所據的
歌詞引述,多句以 `|` 相接)、`groups`(語意編碼群)、
`patterns`(深讀樣態)、`annotations`(歌×樣態定案矩陣)。
各定案表經 `build-db``--codings``--groups`
`--patterns``--annotations` 匯入,性別修正經
`--gender-corrections` 套用,與其餘資料同一交易,儲存不會
半建;詳見 `research-plan.md`「資料儲存與模型」。
- **工作儲存的資料表**`songs``chart_entries``artists`
`song_artists``codings`(定案編碼:一歌一標籤一列,`quotes`
存該標籤所據的歌詞引述,多句以 `|` 相接)。定案表
`results/codings.csv``build-db --codings` 匯入,與其餘資料
同一交易,儲存不會半建;詳見 `research-plan.md`「資料儲存與
模型」。
- **Commit 判準**:能由「committed 輸入+程式」決定性再生者不
commitSQLite 工作儲存、LLM 輸入檔);源頭、捕捉、人工著作
一律以文字 commit。「可再生仍 commit」的例外有二:
-161
View File
@@ -1,161 +0,0 @@
# 信度:量測方式與結果
2026-08-16 量測。對象為步驟 3 的三份執行歸檔
`runs/03-code/run1``run3`,與步驟 5-4 的三份執行歸檔
`runs/05-04-annotate/run1``run3`;數字由原始輸出直接計算。)
## 一、本研究的信度是什麼
**信度(reliability)** 問的是:同一個量測重複做,會不會得到
同樣的結果。它管的是**一致性**,不管對錯。一把每次都少兩公斤
的秤,信度很好、效度很差。**效度(validity)** 問的則是:量到
的是不是想量的東西。
Krippendorff 依產生資料的設計,把信度分成三型
(Krippendorff, 2004;Hayes & Krippendorff, 2007):
- **穩定性(stability)**:同一位觀察者、同樣的材料,重複
量測是否一致(testretest,即 intra-observer)。
- **可複製性(reproducibility)**:不同觀察者各自獨立量測
是否一致,即一般所稱的**編碼者間信度**
(inter-coder reliability)。Krippendorff 認為這是內容
分析中最強、也最可行的一型,因為它排除了「這些類目只是
某一個人特異的讀法」的疑慮。
- **準確性(accuracy)**:與已知標準比對。
**本研究三次獨立執行量到的是第一型。**同一個模型、同一份
定義檔、同一批輸入,重複三次,量到的是這個編碼者自己前後
一不一致。第二型在本設計中**結構上不存在**:編碼者只有一位,
不同的模型版本(Sonnet 4.6、Fable 5)也不是「不同的編碼者」,
而是不同的儀器。第三型**未量測**:沒有黃金標準可比。
以工程的語言說更精確:這裏量的是**儀器的重複性
(repeatability)**,亦即**隨機性有多大**;計量學上稱之為
**精密度(precision)**,而**準確度(accuracy)** 未經量測。
若儀器是確定性的,重複性無須量測;但 LLM 不是——同樣的提示、
同樣的輸入,三次會給出不同結果,因此重複性是必須報告的儀器
規格,而非慣例儀式。
這一點與 LLM 標註的近期文獻一致:同一模型重複取樣量測的是
自我一致性(self-consistency),而重複執行後取多數決可提升
標註穩定度(如 Prompt Stability Scoring,arXiv:2407.02039)。
## 二、三個常用指標
以「這首歌有沒有這個碼」這種是非題為例:
- **百分比一致率**:兩次判斷相同的格子佔全部格子的比例。
最直觀,但會被「碰巧同意」灌水——當九成五的格子都是
「無」,兩次隨便判也會有九成以上一致。
- **Cohen's κ(kappa)**:把「碰巧同意」的部分扣掉之後的
一致度,兩位編碼者用。0 表示與隨機無異,1 表示完全一致。
慣例上 0.610.80 稱為 substantial、0.81 以上稱為
almost perfect(Landis & Koch 1977 的分級)。
- **Krippendorff's α**:可處理兩位以上編碼者、缺漏值與
不同尺度,是內容分析文獻最常被要求的指標。慣例門檻為
α ≥ 0.800 可作結論、0.6670.800 只能作暫定結論
(Krippendorff 的建議)。
三者裏,**百分比一致率會高估、κ 與 α 才是可比較的數字**。
補充一個常被誤解的方向:κ 的著名「悖論」
(Feinstein & Cicchetti, 1990)是**類別分佈極不平衡時,
高一致率反而算出很低的 κ**——偏斜會壓低 κ,不會抬高它。
本研究的正例只佔 16.5%(89,183 格中約 14,700 格有碼),
在這種偏斜下 κ 仍達 0.93,屬於保守估計,不是被大量「雙方
都判無」灌出來的。
## 三、實測結果
### 步驟 3(編碼:883 首 × 101 個碼 = 89,183 格,執行三次)
| 兩次執行 | 百分比一致率 | Cohen's κ | Jaccard |
|---|---:|---:|---:|
| run1 × run2 | 98.10% | 0.931 | 0.891 |
| run1 × run3 | 98.09% | 0.931 | 0.891 |
| run2 × run3 | 98.26% | 0.937 | 0.900 |
**Krippendorff's α = 0.933**(三次執行合計)。
三票計票的分佈:三票全同 13,500 格、兩票 1,163 格、
僅一票 1,310 格(未達門檻而剔除)。**定案的 14,663 個編碼
中,92.1% 是三次全數同意的**。
(此處由原始輸出計算,未套用 936 筆人工校對表;論文引用的
定案數 14,664 為校對後的結果,差 1 筆。)
### 步驟 5-4(樣態標註:111 首 × 各自適用樣態 = 3,708 格,執行三次)
| 兩次執行 | 百分比一致率 | Cohen's κ | Jaccard |
|---|---:|---:|---:|
| run1 × run2 | 97.87% | 0.933 | 0.898 |
| run1 × run3 | 98.17% | 0.942 | 0.911 |
| run2 × run3 | 97.87% | 0.933 | 0.898 |
**Krippendorff's α = 0.936**。三票全同 675 格、兩票 62 格、
僅一票 51 格;**定案的 737 筆歸屬中,91.6% 三次全同**。
### 怎麼讀這些數字
κ 與 α 都在 0.93 上下,以慣例分級屬於 almost perfect,
也高於 α ≥ 0.800 的門檻。用白話說:**這個編碼者重複三次,
判斷幾乎不變;會左右搖擺的,是那一成左右的邊緣案例,而
三票多數決正是為它們設計的**。
Jaccard(只看「有標到」的格子,忽略雙方都沒標的)約 0.89–0.91,
比百分比一致率低而更誠實——因為 82% 的格子是雙方都判「無」,
那些一致並不費力。
## 四、隨機性的規模與三票制的作用
信度數字回答的實際問題是:**這台儀器的隨機性,大到會不會
改變結論?**
步驟 3 的 89,183 格中,搖擺的格子共 2,473 格(兩票 1,163、
一票 1,310),佔 2.8%。若只執行一次即定案,這批格子當中約
一半會成為誤收、另一半會成為漏收。三票多數決把兩票以上者
收入、一票者剔除,處理的正是這一批。
三票制並非消除隨機性,而是**把隨機性往案例原本的傾向推**。
設某個邊緣案例的符合程度為 p,單次執行以機率 p 標出,三次
多數決則以 p³+3p²(1p) 標出:p=0.9 者由 0.9 提高到 0.972,
p=0.1 者由 0.1 壓低到 0.028,而 p=0.5 者仍是 0.5——真正
模稜兩可的案例,任何票制都救不了。
以此規模判斷,結論層的三條帶狀結構(女性力量與陽剛群共現、
與脆弱群互斥、與厭女群獨立)不可能由這個量級的雜訊翻轉。
反過來說,若一致率只有 0.6,同一組結論就不能採信——信度
數字的用途在此,而不在滿足慣例。
## 五、這些數字證明了什麼、不能證明什麼
**能證明**:量測是穩定的,結果不是單次抽樣的偶然;
三票多數決確實只在少數邊緣格子上發揮作用(約 3%)。
**不能證明**:判斷是正確的。三次共用同一個模型與同一份
先驗,能濾掉隨機噪音,濾不掉系統性偏誤。本研究已發現三個
三次一致的錯誤可作實例:Sonnet 4.6 穩定地將 Women Power
讀為 Women+Power;深讀階段將〈Cowgirls〉中握韁繩者判反、
將〈Happen To Me〉分屬兩段的引文接成同一動機。一把每次都
量出同樣偏差的尺,重複性滿分,準確度為零。
**結構上沒有**:編碼者間信度。要有它,需要第二個獨立的
觀察者——另一個模型,或研究者人工編一小批對照。本研究
未做,列為限制。
## 六、計算方式與依據
- **分析單位**:每一個「(歌曲, 編碼)」格為一個單位,是非題
(有標/無標)。步驟 3 為 883 首 × 101 碼 = 89,183 格;
步驟 5-4 為各歌適用樣態數合計 3,708 格。
- **Cohen's κ**:兩次執行的 2×2 表,κ=(p_op_e)/(1p_e),
p_e 由兩次各自的邊際比例相乘求得。
- **Krippendorff's α(名目、三位「編碼者」、無缺漏)**:
α=1D_o/D_e;某單位若有 v 次標為「有」,其不一致配對數為
v(3−v),D_o 為其總和除以總配對數,D_e 由整體「有/無」的
邊際比例求得。
- **門檻依據**:κ 的分級為 Landis & Koch (1977)
(0.610.80 substantial、0.811.00 almost perfect);
α 的門檻為 Krippendorff 的建議(≥0.800 可作結論、
0.6670.800 僅能作暫定結論)。
- 數字由原始執行輸出直接計算,未套用 936 筆人工校對表。
+3 -7
View File
@@ -8,7 +8,7 @@
- **研究敘事**:全文為獨立完整的正式研究(2016–2025 十年
語料共 1000 筆榜單紀錄、883 首歌,凍結程序後全量執行),
**不與先導研究paper/conference-abstract.md做比較**
**不與先導研究做比較**
全文數字一律以正式研究結果為準。先導研究僅作為假說的
內部來源,記於決策日誌,不進入論文敘事。
- **執行原則**:主會話只做討論;所有分析由 deterministic
@@ -76,8 +76,8 @@
**絕不進 LLM 輸入**——LLM 任務的 user message 維持
歌詞-only 或管線中間產物-only,避免光環偏誤。
- **Pilot 歌詞沿用(私人匯入,不進發布管線)**:先導研究
捕捉檔(lyrics.json684 首,20182025)以 `excludes/`
的私人腳本匯入歌詞快取;讀者的重現路徑純粹是
捕捉檔(lyrics.json684 首,20182025)以私人腳本
匯入歌詞快取;讀者的重現路徑純粹是
`fetch-lyrics`;沿用之事實記於
`data/captures/lyrics-provenance.csv`(進 git)。
- **子命令**`pop-fem-audit-tools <cmd>`):`build-db`
@@ -129,7 +129,3 @@
- 歌詞受版權保護:完整歌詞不進 git
`data/captures/lyrics/` gitignored),論文與 repo 只留
分析所引摘錄。
- 工程支援(寫 script、style check、審稿)用公司訂閱的
Claude Code;進論文的分析 token 由個人 API 帳號支付。
- Positionality statement 寫入論文(53 歲、長年婦運者、
資深工程師、離開學術圈多年、因整理榜單而起)。
+1 -5
View File
@@ -40,7 +40,7 @@ $3$15、opus-4-6 $5$25、opus-5 與 fable-5 $10$50
| 2026-08-06 | 03-02-arbitration | — | claude-sonnet-4-6 | msgbatch_01N7bDbXRSfAVUzzaj2thKeR | 4 分 20 秒 | 781,037 | 39,315 | $1.47 | 現行(644 首全數有效,零攔阻;保留 1,481/送裁 1,699 |
| 2026-08-06 | 03-code | run3 | claude-sonnet-4-6 | msgbatch_01KnkCaGETnFJrPddrxZTYHA | 6 分 26 秒 | 1,625,458 | 363,840 | $5.17 | 現行(101 碼;883 首全數有效,零攔阻) |
| 2026-08-14 | 04-group | run1 | claude-sonnet-4-6 | msgbatch_01UPNedog6feQzJ9WVfSAxBD | 1 分 1 秒 | 3,129 | 470 | $0.01 | 已取代(僅 3 群;改納 women-power 群後重跑) |
| 2026-08-14 | 04-group | run1 | claude-sonnet-4-6 | msgbatch_01KntJgxdicStaMjNL12P3zi | 1 分 25 秒 | 4,170 | 558 | $0.01 | 已取代(改以 claude-fable-5 執行;vulnerable 輸出含詞彙表外碼 1 筆;歸檔備份於 excludes/experiments/ |
| 2026-08-14 | 04-group | run1 | claude-sonnet-4-6 | msgbatch_01KntJgxdicStaMjNL12P3zi | 1 分 25 秒 | 4,170 | 558 | $0.01 | 已取代(改以 claude-fable-5 執行;vulnerable 輸出含詞彙表外碼 1 筆;歸檔另行私人備份,不入版本庫 |
| 2026-08-14 | 04-group | run1 | claude-fable-5 | msgbatch_01Mr6goBb2Efa4YrqCprbP4U | 55 秒 | 5,553 | 2,049 | $0.08 | 現行(4 群;零違規碼;temperature 與 thinking 參數不適用於本模型,未送出) |
| 2026-08-14 | 04-group | run2 | claude-fable-5 | msgbatch_01C17xW3YBefThTYZ83g7KkL | 1 分 21 秒 | 5,553 | 1,891 | $0.08 | 現行(4 群;零違規碼) |
| 2026-08-14 | 04-group | run3 | claude-fable-5 | msgbatch_01DveEMYyjCAYe6wxpcCD87V | 2 分 9 秒 | 5,553 | 1,975 | $0.08 | 現行(4 群;零違規碼) |
@@ -50,17 +50,13 @@ $3$15、opus-4-6 $5$25、opus-5 與 fable-5 $10$50
| 2026-08-15 | 05-01-read | run3 | claude-fable-5 | msgbatch_01Unn7C7WCnuVoLraJRXksoG | 7 分 59 秒 | 191,459 | 190,433 | $5.72 | 現行(145/145 有效) |
| 2026-08-15 | 05-02-consolidate | run1 | claude-fable-5 | msgbatch_01WPyH4pCCiieHs4yU3xtHzN | 2 分 28 秒 | 326,287 | 242,785 | $7.70 | 現行(145/145 有效) |
| 2026-08-15 | 05-03-synthesize | run1 | claude-fable-5 | msgbatch_01XbNQb1SFrUxhk2ZWF7epPA | 3 分 0 秒 | 103,888 | 9,982 | $0.77 | 現行(15 個樣態;研究者審定用草稿) |
| 2026-08-15 | 05-03-synthesize | run2 | claude-fable-5 | msgbatch_01FKqq8U6m5HLLsx7KpQES26 | 3 分 4 秒 | 13,573 | 6,883 | $0.24 | 現行(男聲群 14 首;13 個樣態) |
| 2026-08-15 | 05-03-synthesize | run3 | claude-fable-5 | msgbatch_017tfhiRTnaxqCp6YFyoivsu | 4 分 4 秒 | 60,727 | 8,519 | $0.52 | 現行(女聲群 98 首;14 個樣態) |
| 2026-08-15 | 05-03-synthesize | run4 | claude-fable-5 | msgbatch_01SNjTLiNPEba4LW2tcUAcTJ | 4 分 3 秒 | 29,958 | 9,793 | $0.39 | 現行(混合群 30 首;16 個樣態) |
| 2026-08-15 | 05-04-annotate | run1 | claude-fable-5 | msgbatch_01H9gXXhNbhZG6gzZtvMHxhh | 3 分 9 秒 | 815,492 | 300,901 | $11.60 | 現行(109/111 有效;song-177、song-199 遭 max_tokens 截斷,單筆補送) |
| 2026-08-15 | 05-04-annotate | run1-rescue-177-199 | claude-fable-5 | msgbatch_01YEdroZ51b8btPfG1aqPFCD | 3 分 5 秒 | 17,802 | 11,601 | $0.38 | 現行(run1 之 2 筆補送,max_tokens 提為 16000,成功) |
| 2026-08-15 | 05-04-annotate | — | claude-fable-5 | msgbatch_01G67STqZsHpnhedat2HRU85 | 3 分 0 秒 | 17,802 | 14,162 | $0.44 | 誤送(補送批次輪詢中斷後誤判死亡而重送;原批次自行完成並歸檔為現行,本批次取消不及、兩筆皆完成,結果棄用) |
| 2026-08-15 | 05-04-annotate | run2 | claude-fable-5 | msgbatch_01VVJpsfidNtF66GnHQdWnGR | 9 分 16 秒 | 815,492 | 306,582 | $11.74 | 現行(111/111 有效;max_tokens 16000,零截斷) |
| 2026-08-15 | 05-04-annotate | run3 | claude-fable-5 | msgbatch_01AsYvZd8rsTYVfUYLzWfeMK | 4 分 12 秒 | 815,492 | 298,512 | $11.54 | 現行(111/111 有效;max_tokens 16000,零截斷) |
累計支出:$125.65。
+9
View File
@@ -0,0 +1,9 @@
# 流行音樂中「女性力量」語彙的挪用與污染——以 Billboard Year-End Hot 1002016-2025)為例的內容分析
以美國市場為主的西洋流行音樂樂壇,一直是不同主流與另類文化實驗競爭的場域:傳統與創新,保守與進步。研究者在西洋流行音樂中,發現「女性力量」的語彙在歌曲中被挪用,融入父權框架中。為瞭解在西洋流行音樂中,「女性力量」語彙挪用與污染的樣態,本研究取2016-2025十年間的告示牌年終排行榜,共1,000個榜單位置,整理出883首不重複的歌曲,469位不同的表演者。使用人工智慧大型語言模型(AI LLMArtificial Intelligence Large Language Model,下稱LLM),獨立標註歌曲歌詞主題,大量蒐集彙整流行音樂主題後,再使用彙整後的主題,對這883首歌曲歌詞編碼。研究者並指定女性力量women-power、厭女misogyny、陽剛男性氣質masculine與脆弱vulnerable四大主題,以LLM對編碼分群,分析在西洋流行音樂中,女性力量和厭女、陽剛男性氣質與脆弱這些主題的相關性。研究者進一步使用LLM,深度檢驗女性力量歌曲中的性別問題樣態。除使用LLM外,研究者也實際檢視編碼結果與性別問題樣態,以瞭解在西洋流行音樂中,「女性力量」語彙如何被挪用與污染。
研究結果顯示:在給予LLM最少提示下,LLM獨立標註、彙整出「女性賦權female-empowerment」的主題,「女性賦權」已經成為當代西洋流行音樂中的重要主題之一。研究者比較「女性力量women-power」主題和「女性賦權female-empowerment」主題的標註差異。Banet-Weiser et al. (2020)主張,新自由主義女性主義敘事,將女性主義導向個人的自我成長、療癒。從編碼結果來看,新自由主義女性主義敘事雖然成為當代的主流,但仍未完全取代傳統女性主義強調的女性集體權力。透過分析四個指定編碼群之間的關係,研究者亦發現,當代流行音樂中,女性賦權不排斥厭女,只排斥脆弱。LLM在女性力量歌曲中,深度檢視性別問題時,獨立彙整出「挪用女性賦權語彙並掏空其意涵」的樣態,直接回應研究題目。研究者後續檢視該樣態所標註的歌曲時,發現LLM的標註問題,需要人工進一步檢視。
結論中,研究者檢視LLM作為內容分析的工具,相比人類編碼,可以獨立編碼不互相干擾,但也面臨兩個主要的挑戰:脈絡污染 (context contamination) ,以及隨機非確定性 (non-deterministic) 。研究者也提出,流行歌曲有大量的脈絡在歌詞之外,只閱讀歌詞語彙,難以真正理解歌曲本身。除了深入閱讀歌詞外,更需要對表演者背景與創作脈絡的理解,才能對西洋流行音樂中女性力量的理解,有更清楚的輪廓。
關鍵字:流行女性主義 (popular feminism) 、流行厭女 (popular misogyny) 、女性賦權/女性力量、語彙挪用、大型語言模型 (LLM) 內容分析
-309
View File
@@ -1,309 +0,0 @@
# 流行音樂中「女性力量」語彙的挪用與污染
## ── 以 Billboard Year-End Hot 10020182025)為例的內容分析
**投稿類別**:研究論文/口頭報告
**關鍵字**:女性主義內容分析、流行音樂、empowerment、商品化、AI 文本分析、語言挪用
---
## 摘要
本研究以 20182025 年 Billboard Year-End Hot 100(共 684 首歌)為素材,
檢視「women-power-and-empowerment」(女性力量/賦權)這個流行音樂主題標籤
在當代主流商業音樂中的使用實況。透過 AI pipeline 抽取主題標籤,再以人工
逐首審視全部被標記為「女性力量」的 62 首歌,發現其中 **44% 屬於「假女性
力量」**——表面採用 pro-women 詞彙(empowerment、boss bitch、queen、
femininity),實質敘事框架卻是父權保護、物化、競爭性貶低其他女性,或將
「賦權」等同於採用男性饒舌階層的炫耀邏輯。本研究歸納出五種「假女性力量」
類型,並就「pussy」一詞作為女性代稱(metonym)的使用進行附加分析,發現
此種以身體部位代稱人格的修辭橫跨男女歌手。研究亦發現大型語言模型(LLM)
對此種標籤污染存在系統性盲點,並提出框架感知(frame-aware)的修正方法
作為方法學貢獻。
---
## 一、研究問題
「賦權」(empowerment)一詞自 1980 年代女性主義論述進入主流流行文化
以來,已逐步被市場語彙化。Beyoncé、Lizzo、Megan Thee Stallion 等女
性藝人的「女性力量」框架被廣泛流通,唱片公司、串流平台與商業媒體亦頻繁
以 empowerment、boss、queen、she/her anthem 等標籤行銷女性藝人。
問題在於:**當「女性力量」成為一種行銷標籤時,它指涉的內容是什麼?**
本研究提出兩個具體問題:
1. 當主流商業音樂中一首歌被標記為「女性力量」時,其敘事框架是否實質上
傳達女性主體性(agency)、自主(autonomy)與獨立(independence)?
2. 若不是,被誤標的內容呈現何種模式?這些模式如何與既有的厭女、物化、
父權結構關聯?
## 二、研究方法
### 2.1 語料
- **來源**Billboard Year-End Hot 100(年度終榜),20182025 年
- **總數**:684 首歌(含跨年榜重複的歌曲算一筆)
- **歌詞抓取**Lyrics.ovh、LRCLIB API
- **元資料**:演唱者性別(男 / 女 / 混合團體)、年份、排名、合作署名
### 2.2 主題標籤抽取流程
採用四步驟混合式 AI pipeline
1. **逐首抽取主題關鍵字**510 個 / 首,由 LLM agent 完成)
2. **同義詞合併**(1982 個原始關鍵字 → 718 個 canonical
3. **主題分群**718 個 canonical → 33 個 thematic element bucket
4. **三角驗證 tagging**
- **由下而上路徑**bottom-up):透過第 13 步歸納
- **由上而下路徑**top-down):另一個 LLM agent 直接讀全文,套用既
定 33 bucket
- **逐主題盲審 judge**:對兩條路徑的差異逐一判定保留/剔除
最終產出固定 33 個 thematic element 的 v1 schema。
### 2.3 「女性力量」後驗審查
對全部 62 首被標記 `women-power-and-empowerment` 的歌進行人工逐首審
視:由三個獨立 LLM subagent 分別判定 genuine(真)/peripheral(點綴)
/fake(假),最後人工仲裁;同時對其中出現「pussy」一詞的歌進行修辭
脈絡分析。
### 2.4 「pussy」修辭分類
對全部 684 首歌中含「pussy / pussies」一詞的 53 首唯一歌曲(含跨年
重複共 56 筆),逐詞分類為四種修辭功能:
- **METONYM**:以 pussy 代稱「女人」這個人(不指身體部位)
- **ANATOMICAL**:指涉身體部位本身或性行為
- **COWARD**:作為「膽小鬼」的中性侮辱
- **OTHER**:動物或語境不明
每筆使用另標註:說話者性別(male / female / mixed)、指涉對象
self / other-women / women-collective-positive / women-collective-negative)。
## 三、主要發現
### 3.1 「女性力量」標籤的污染率:44%
| 分類 | 數量 | 比例 |
|---|---:|---:|
| Genuine(真女性力量) | 28 | 45% |
| Peripheralpro-women 僅為點綴) | 7 | 11% |
| **Fake(表面 pro-women,實質父權/物化/厭女)** | **27** | **44%** |
近半數被標記為「女性力量」的主流商業歌曲,其敘事框架實際上並未傳達
女性主體性、自主或獨立。
### 3.2 「假女性力量」的五種類型
#### 類型 A:男歌手的騎士保護者敘事(chivalric paternalism
男性歌手以「我會保護妳」、「我會供養妳」、「沒人能傷害妳」自居,將
女性置於需要男性 wield power on behalf of her 的位置。**權力的源頭
不在女性自己,而在替她出力的男性**。代表案例:Drake & 21 Savage
"Spin Bout U""I gotta protect ya")、Drake "Nice For What"。
#### 類型 B:女歌手以身體部位代稱自我與女性整體
以 pussy / bitch 等性器詞彙作為「女人」的代名詞,看似 reclamation
但其修辭結構仍內化於男性饒舌階層的詞彙邏輯中。代表案例:Cardi B &
Megan Thee Stallion "WAP"、Megan Thee Stallion "Thot Shit"、
Megan Thee Stallion & Dua Lipa "Sweetest Pie"。
(注意:本研究區分**自指身體**的 pussy 使用——女歌手描述自己身體
本身——與**以 pussy 代稱女人**這種 metonym 修辭。前者是粗俗詞彙
但仍將女人視為主體;後者則將女人化約為其身體部位。詳見 3.3。)
#### 類型 C:用男性指標衡量「賦權」
「Empowerment」被定義為擁有名牌、得到男人的錢、性的支配權、能凌駕
其他女性。這種「賦權」本質是**將既有的(男性建構的)權力/資本指標
讓渡給女性個體去追求**,而非挑戰結構。代表案例:Cardi B "I Like
It"、Cardi B "Up"、Megan Thee Stallion "Savage"、Mary J. Blige
"Juicy"。
#### 類型 D:競爭性貶低其他女性以自抬身價
歌曲表面 assert 女性力量,但其修辭策略是不斷貶低、嘲諷、威脅其他
女性。「我是 queen」的命題往往以「她們是 fake / hoes / pussies」
為陪襯前提。代表案例:Latto "Big Energy"、Nicki Minaj & Ice
Spice "Barbie World"、Ice Spice "Princess Diana"、GloRilla &
Cardi B "Tomorrow 2"。
#### 類型 E:直接複製男性饒舌階層
歌詞結構幾乎是男性饒舌歌手歌詞的字面翻版(炫富、嗆對手、宣告 turf、
sexual dominance),只是性別主詞置換。**這不是 reclamation 而是
horizontal substitution**。代表案例:GloRilla "Yeah Glo!"、Nicki
Minaj "FTCU"、GloRilla & Megan Thee Stallion "Wanna Be"、
Sexyy Red "Get It Sexyy"。
### 3.3 「Pussy」作為女性代稱:跨性別的內化
對 53 首唯一歌曲的逐詞分析發現:
- **Dominant METONYM 歌曲**8 首(pussy 主要功能是代稱女人)
- **Dominant ANATOMICAL 歌曲**32 首(指涉身體 / 性行為)
- **Dominant COWARD 歌曲**13 首
以 pussy 代稱女人這種 metonym 修辭出現於兩類說話者:
**男性歌手**(將女人化約為其性器):
- Drake — "Life Is Good"2020)、"Spin Bout U"2023
- The Weeknd — "Heartless"2020,同一首中 2 次)
- 21 Savage — "redrum"2024
- Bryson Tiller — "Whatever She Wants"2024
**女性歌手**(用 pussy 貶低、排序其他女性):
- Cardi B — "Tomorrow 2"2023
- GloRilla — "Wanna Be"2024)、"Yeah Glo!"2024
值得注意的是:**女性歌手以 pussy 代稱「自己作為女性主體」**
reclamation 用法,target = women-collective-positive)的案例
——例如 Megan Thee Stallion 在多首歌中的女性主體宣告——本研究**不
列入物化清單**,因其修辭結構是 assert woman as subject,而非
reduce woman to organ。
但 GloRilla、Cardi B 在上述歌曲中的 pussy 使用,是用此詞**對其他
女性進行排序與貶低**——「她們是 pussies」、「真 pussy 在這裡」——
此即類型 D 與類型 E 的修辭操作。**身體部位代稱人格的修辭一旦進入
女性互貶的邏輯,仍是女性物化框架的延續,不因說話者為女性而免疫。**
### 3.4 LLM 內容分析的系統性盲點
追溯被誤標為「女性力量」的 27 首假歌曲,其標籤來源分布:
| 標籤來源 | 數量 |
|---|---:|
| **由下而上 + 由上而下兩條路徑都同意**(直接進入 agreedjudge 看不到) | **24 / 27** |
| 僅由下而上路徑提出 | 3 / 27 |
| 僅由上而下路徑提出 | 0 / 27 |
**89% 的假標籤是兩條結構不同的 LLM 路徑「共同同意」的結果。**
這個發現挑戰了「triangulation 透過路徑差異對抗單一路徑偏誤」的方法
學假設。當兩條路徑都跑在同一個 LLM 家族(本研究使用 Anthropic 的
Sonnet 模型)上時,它們**共享表面詞彙的 pattern-match 偏誤**——只要
歌詞包含「女性主體 + 提及女性議題 + 強勢語氣」這個表層組合,兩條路徑
都會傾向標記為「女性力量」,無論敘事框架實際是父權還是物化。
這呼應 Bender、Gebru 等學者對大型語言模型 stochastic parroting
特性的批判:模型內化的是訓練語料裡「empowerment 該長什麼樣子」的
表層共識,而這個共識本身就是被市場去政治化過的。
## 四、討論
### 4.1 「女性力量」作為去政治化的市場符號
本研究的核心發現可以這樣概括:在當代主流商業音樂的標籤生態中,「女性
力量」作為符號的流通已經與其原初的女性主義內涵嚴重脫鉤。**Empowerment
這個詞彙本身的存在不再保證敘事框架是賦權的**——它甚至常與最徹底的
父權/物化框架共存於同一首歌。
### 4.2 「反向挪用」的悖論
特別值得女性主義關注的是「類型 E」現象:女性饒舌歌手大規模採用男性
饒舌階層的修辭範式(炫富、嗆對手、性支配、體型/外貌互貶)作為
「empowerment」的表現。這種操作可以從兩個對立的角度詮釋:
- **解放詮釋**:女性奪取了原本被男性壟斷的 assertive 修辭空間;
- **內化詮釋**:女性內化了 hegemonic masculinity 的成功標準,把它
當作「女性也能達到」的目標,而**未挑戰這個標準本身**。
本研究傾向後者詮釋,理由是:類型 E 的歌曲幾乎全數同時包含類型 D
(競爭性貶低其他女性)與類型 B(pussy 代稱女人),其結構整體性地
複製了男性饒舌的厭女語法,而非挑戰它。**「女性也能做這件事」不等於
「這件事被女性主義化了」**。
### 4.3 身體部位代稱的跨性別內化
類型 B 與「pussy 作為女人代稱」的修辭,是上述內化最具體的語言層證
據。當女性歌手在歌詞中說「real pussy in this bitch」(真女人在
這裡)時,「真女人」這個概念本身就是**用男性凝視的詞彙來定義的**——
女人 = pussy。這個等式在女性說話者口中重述,形式上的反轉(女性
agency)並沒有改變內容上的物化(女人是其性器)。
## 五、方法學貢獻
### 5.1 LLM 共同盲點不是絕對極限,而是提示問題
本研究進一步測試了一個 prompt 修正:在 by-down/top-down agent 與
judge agent 的提示中加入:
1. **框架原則(frame vs vocabulary**:任何主題的判定應看敘事
框架,不只看詞彙;
2. **權力來源測試**(針對 women-power 專用):權力來自女性自己,
還是來自他者(男性、男性指標、貶低其他女性)?
3. **Agreed 例外規則**:對 women-power 此標籤,judge 可以例外推翻
agreed 的保留決定。
對全部 684 首歌重新跑這個修正版 pipeline 後:
- 28 首假女性力量被移除
- 標籤的「假率」由 44% 降至 5% 以下
- 對 v1 漏掉的 19 首真實女性力量歌曲被補回
這顯示:**LLM 的「共同盲點」不是模型架構的絕對極限,而是「沒有提示
要找什麼,模型就不會找」的問題**。給予明確的框架感知提示後,同一個
模型可以執行 frame-level 分析。
### 5.2 對人文/性別研究使用 AI 工具的啟示
本研究實證地呈現了兩個對未來方法學設計重要的點:
1. **路徑結構不同 ≠ 獨立**:在同一個 LLM 家族上,方法上不同的多
條路徑仍共享訓練語料層次的偏誤。真正的「triangulation」需要
model diversity(跨家族),不只方法 diversity。
2. **Frame-aware prompting 是可行且必要的**:對於 women-power
這類「市場已先一步污染」的概念,分析者必須事先清楚 articulate
什麼算真、什麼算假,並把這個區分寫進 prompt。
## 六、限制
1. **代表性**Billboard YE Hot 100 反映美國主流商業市場,不代表
獨立、地下、非英語流行音樂;
2. **語言限制**:拉丁語系歌曲的歌詞分析深度受限;
3. **schema 主觀性**33 個 bucket 為 AI 一次性歸納,非學術共識
分類;
4. **跨文化遷移**:本研究的「假女性力量」類型主要出自美國黑人女
饒舌歌手脈絡,其結構與台灣/華語流行音樂中的相應現象有何異同,
是後續研究的重要方向。
## 七、結論
主流商業流行音樂中的「女性力量」標籤已被市場語彙化到與女性主義原
初內涵嚴重脫鉤的程度。在 20182025 年 Billboard 年終榜上,**44%
的「女性力量」歌曲實質框架是父權、物化或厭女的**。被誤標的歌曲呈
現五種類型:男性騎士保護敘事、女性身體部位代稱、男性指標衡量賦權、
競爭性貶低其他女性、直接複製男性饒舌階層。
這個標籤污染現象的存在本身,就是當代「女性力量」作為市場符號去政治
化的最佳證明。當「empowerment」可以同時指涉真實的女性主體性宣告
(如 Sabrina Carpenter "Feather"、Miley Cyrus "Flowers"、HUNTR/X
"Golden")與「我比其他婊子更高級」這類內化於男性凝視框架的競爭性
炫耀(如 GloRilla "Yeah Glo!"、Latto "Big Energy"),這個詞已經
失去了區辨意義。
對 AI 內容分析方法學而言,本研究指出共同 LLM 盲點是 prompt 問題
而非模型極限:給予明確的框架感知提示後,同一個模型可以做 frame-level
分析。這對未來在性別研究、文化研究領域使用 AI 工具的學者而言,是一
個具體可行的修正路徑。
---
## 附錄:分析資料
- 完整 62 首 women-power 歌曲分類資料(genuine / peripheral / fake):
`theme_extraction/women_power_analysis/final_classification.json`
- 53 首 pussy 修辭使用分類:`pussy_usage_analysis.json`
- 33 個 thematic element schemav1):`theme_extraction/v1_schema.json`
- v1.1 修正後全量重跑統計:`theme_extraction/v1_1_summary.json`
## 投稿資訊(待確認)
- **目標研討會**:女學會年會
- **論文長度**:(依會議要求調整,本檔約 3,400 字,可作為 extended
abstract 或論文初稿大綱)
- **作者**:(待補)