{"id":28220768,"url":"https://github.com/plnech/never2late","last_synced_at":"2025-06-10T09:30:39.829Z","repository":{"id":288487263,"uuid":"968279330","full_name":"PLNech/never2late","owner":"PLNech","description":"Never 2 Late - a reinterpretation of Everest Pipkin's 'i've never picked a protected flower'","archived":false,"fork":false,"pushed_at":"2025-04-20T18:30:13.000Z","size":211,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-05-18T04:16:19.420Z","etag":null,"topics":["dada","dada-science","data","generative-art","glitch-art","installation","nlp","poetry","spacy","vector-similarity","wallpaper"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/PLNech.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-04-17T20:02:19.000Z","updated_at":"2025-04-20T18:30:17.000Z","dependencies_parsed_at":"2025-04-18T10:29:24.144Z","dependency_job_id":null,"html_url":"https://github.com/PLNech/never2late","commit_stats":null,"previous_names":["plnech/never2late"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/PLNech%2Fnever2late","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/PLNech%2Fnever2late/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/PLNech%2Fnever2late/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/PLNech%2Fnever2late/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/PLNech","download_url":"https://codeload.github.com/PLNech/never2late/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/PLNech%2Fnever2late/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":259047880,"owners_count":22797614,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["dada","dada-science","data","generative-art","glitch-art","installation","nlp","poetry","spacy","vector-similarity","wallpaper"],"created_at":"2025-05-18T04:16:15.407Z","updated_at":"2025-06-10T09:30:39.643Z","avatar_url":"https://github.com/PLNech.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# ₦∃⋁∃ℝ²ᒪΔͲ∃ ▓░▒ d⍜t⍜ unicode poetry ▒▓▓░\r\n\r\n\u003e *\"the day she picked a p̕͜r̀o̸tec̀͝t̨ed̷͞ f͟͡l̀o̵͢w͜͝e̕r̀͝ the sky ͡҉͜҉͢f̡͘e҉͠ļ̷̵̴̵͘͟͟ļ̷̵̴̵͘͟͟\"*\r\n\r\n## ᓚᘏᗢ A B̶r̴o̴k̶e̶n̷ I̴ and A B̶r̴o̴k̶e̶n̷ Y̵o̷u̶ ᓚᘏᗢ\r\n\r\n*Never2Late* 𝓲𝓼 an ██████ poetry-██████ making machine ████████ from what is ████████ lost. \r\nIn the spaces between ███ █████ on WordReference.com, ███████ oblivion, we find the ██████████ of language \r\nfrom ███████ our collective ████.\r\n\r\nDeveloped for la _Fête des Fleurs_, 2025 edition.\r\n\r\n![image](https://github.com/user-attachments/assets/a362785c-3a4e-467f-900f-8ead1ad03761)\r\n\r\n----\r\n## *\"𝔻𝕖𝕒𝕥𝕙 𝕚𝕤 𝕟𝕠𝕥 𝕥𝕙𝕖 𝕖𝕟𝕕 𝕠𝕗 𝕓𝕖𝕒𝕦𝕥𝕪. ℙ𝕠𝕖𝕥𝕣𝕪 𝕚𝕤 𝕥𝕙𝕖 𝕣𝕖𝕤𝕦𝕣𝕣𝕖𝕔𝕥𝕚𝕠𝕟 𝕠𝕗 𝕞𝕖𝕒𝕟𝕚𝕟𝕘.\"*\r\n\r\n▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\r\n\r\n## ℂ𝕣𝕖𝕕𝕚𝕥𝕤 𝕒𝕟𝕕 𝔸𝕔𝕜𝕟𝕠𝕨𝕝𝕖𝕕𝕘𝕖𝕞𝕖𝕟𝕥𝕤 ⌬⎰◊⠬⠃↤☘\r\n\r\n- **Profuse thanks to everest pipkin**, whose work [\"i've never picked a protected flower\"](https://github.com/everestpipkin/never/blob/master/never.pdf) inspired this project.  \r\nTheir 400-page generative glitch poetry PDF is IMO a masterpiece of digital art and concrete poetry \u003c3 \r\n- The [original forum thread](https://forum.wordreference.com/threads/ive-never-picked-a-protected-flower.644138/) which inspired the projects' names\r\n\r\n\u003e *\"i've never picked a protected flower\"* \r\nSee the source at [github.com/everestpipkin/never](https://github.com/everestpipkin/never)\r\n\r\n\r\n## 🅼🅰🅽🅸🅵🅴🆂🆃🅾\r\n\r\nInstead of relying on external APIs for conceptual relationships, we use local NLP models with [spaCy + vector similarity computations](https://spacy.io/usage/linguistic-features#vectors-similarity) to retrieve semantically proximate words directly from the corpus, based on English NLP pre-trained [word models](https://spacy.io/usage/models).\r\n\r\nThe project is composed of four independent yet interconnected parts:\r\n\r\n1. `scraper.py` - ɨצɬཞąƈɬʂ raw language from the collective unconscious\r\n2. `clean.py` - ꎇꀤ꒒꓄ꏂꋪꌗ the noise from the signal\r\n3. `generator.py` - ੮гคຖŞ৲๏гຖŞ random words into semantic poetry\r\n4. `wallpaper.py` - єη¢α∂єѕ the poems into unicode patterns\r\n\r\n▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\r\n\r\n## 🄸🄽🅂🅃🄰🄻🄻🄰🅃🄸🄾🄽 ╜◊⎼▲▅⠌◇╯◆\r\n\r\n```bash\r\n# Clone the repository\r\ngit clone https://github.com/PLNech/never2.git\r\ncd never2\r\n\r\n# Optional but recommended: create a virtual environment\r\npython -m venv venv\r\nsource venv/bin/activate  # On Windows: venv\\Scripts\\activate\r\n\r\n# Install dependencies\r\npip install spacy beautifulsoup4 requests numpy\r\npython -m spacy download en_core_web_lg\r\n```\r\n\r\n## 🆄🆂🅰🅶🅴\r\n\r\n### 1. 𝕊𝕔𝕣𝕒𝕡𝕚𝕟𝕘 ℙ𝕠𝕖𝕥𝕣𝕪 𝕀𝕟𝕘𝕣𝕖𝕕𝕚𝕖𝕟𝕥𝕤\r\n\r\n```bash\r\npython scraper.py --start 1 --end 100 --delay 2 --batch 20\r\n```\r\n\r\nOptions:\r\n- `--start START` - Starting page number\r\n- `--end END` - Ending page number\r\n- `--delay DELAY` - Delay between requests (seconds)\r\n- `--batch BATCH` - Save to disk after this many pages\r\n\r\n![image](https://github.com/user-attachments/assets/502d359c-6bd9-4eec-b5f1-8ca31ed5b07f)\r\n\r\n\u003e *\"In the gaps between forum words, I found sentences that never existed.\"*\r\n\r\n### 2. ᶜˡᵉᵃⁿⁱⁿᵍ ᵗʰᵉ ᴰᵃᵗᵃ\r\n\r\n```bash\r\npython clean.py -i english4.csv -o clean4.csv\r\n```\r\n\r\nOptions:\r\n- `-i INPUT, --input INPUT` - Input CSV file (default: english4.csv)\r\n- `-o OUTPUT, --output OUTPUT` - Output CSV file (default: derived from input)\r\n\r\n\u003e *\"Language is a virus 𝒇𝒓𝒐𝒎 𝒐𝒖𝒕𝒆𝒓 𝒔𝒑𝒂𝒄𝒆.\"*\r\n\r\n### 3. 𝔾𝕖𝕟𝕖𝕣𝕒𝕥𝕚𝕟𝕘 ℙ𝕠𝕖𝕞𝕤\r\n\r\n```bash\r\npython generator.py -i clean4.csv -n 20 -l 5 -f html --feet 575 --cache vectors_cache.pkl\r\n```\r\n\r\nOptions:\r\n- `-i INPUT, --input INPUT` - Input CSV file with cleaned sentences\r\n- `-n NUM_POEMS, --num-poems NUM_POEMS` - Number of poems to generate\r\n- `-l LENGTH, --length LENGTH` - Maximum number of lines per poem\r\n- `-m MODEL, --model MODEL` - spaCy model to use (default: en_core_web_lg)\r\n- `-o OUTPUT_DIR, --output-dir OUTPUT_DIR` - Directory to save generated poems\r\n- `-f {txt,html,json}, --format {txt,html,json}` - Output format\r\n- `-s SEED, --seed SEED` - Initial seed word for poem generation\r\n- `-p PORT, --port PORT` - Run as HTTP server on specified port\r\n- `-b BATCH, --batch BATCH` - Generate a large batch of poems (specify count)\r\n- `-w WORKERS, --workers WORKERS` - Number of worker processes for batch generation\r\n- `--cache CACHE` - Cache file for word vectors and similarity\r\n- `-r RELATED, --related RELATED` - Test related words\r\n- `--feet FEET` - Pattern for syllable counts (e.g., \"575\" for haiku, \"12x4\" for alexandrines)\r\n- `--test` - Run tests for word similarity\r\n\r\n#### Example - `python generator.py -i clean.csv -b 100 -f txt --feet \"575\" --cache .poem_cache.bin`\r\n```commandline\r\nLoading spaCy model: en_core_web_lg...\r\nLoading cache from .poem_cache.bin...\r\nLoaded 1545 word vectors, 310284 similarity pairs, and 216 related words sets\r\nLoading data from clean.csv...\r\nLoaded 10268 sentences from 2166 users\r\nFound 15 words related to 'thought': ['think', 'believed', 'probably', 'because', 'something', 'understanding', 'knowing', 'deliberately', 'remember', 'imperceptibly']\r\nUsing cached related words for 'blush'\r\nFound 15 words related to 'trail': ['road', 'mountainside', 'roadway', 'mountain', 'route', 'canyon', 'path', 'ridge', 'mountains', 'outcropping']\r\nUsing cached related words for 'flame'\r\nUsing cached related words for 'decay'\r\nUsing cached related words for 'sky'\r\n[...]\r\nUsing cached related words for 'brick'\r\nUsing cached related words for 'boundary'\r\nSaved 100 poems to poems\r\nSaving cache to .poem_cache.bin...\r\nSaved 1545 word vectors, 322200 similarity pairs, and 225 related words sets\r\n```\r\n\r\n![image](https://github.com/user-attachments/assets/95a96503-2e5c-47e0-b45b-fc13549e592e)\r\n\r\n\r\n\u003e *\"Every poem is an epitaph. ／人◕ ‿‿ ◕人＼\"*\r\n\r\n### 4. 💮 Creating Unicode Wallpaper 💮\r\n\r\n```bash\r\npython wallpaper.py -W 80 -H 24 -g pmm --poem poems/poem_1.txt -f html -o pattern.html\r\n```\r\n\r\nOptions:\r\n- `-W WIDTH, --width WIDTH` - Width of the pattern in characters\r\n- `-H HEIGHT, --height HEIGHT` - Height of the pattern in characters\r\n- `-s SEED, --seed SEED` - Random seed for pattern generation\r\n- `-g {p1,pm,pmm,...}, --group {p1,pm,pmm,...}` - Specific wallpaper group to use\r\n- `-p PORT, --port PORT` - Run as web server on specified port\r\n- `-o OUTPUT, --output OUTPUT` - Output file path\r\n- `-f {txt,html}, --format {txt,html}` - Output format\r\n- `--poem POEM` - Text file containing poem to embed\r\n- `-D DENSITY, --density DENSITY` - Character density (higher = more characters)\r\n- `-b {white,black}, --background {white,black}` - Background color for HTML output\r\n- `-i [INTERACTIVE], --interactive [INTERACTIVE]` - Run in interactive mode with auto-updates\r\n- `--chaos` - Run in chaos mode with varying density and update intervals\r\n\r\n## Examples ⌯◓▀⌂┣⎺◊\r\n\r\nThe `-D` parameter controls the density of Unicode characters in the output. Here are examples with increasing density values:\r\n\r\n| Command                    | Results                                          |\r\n|----------------------------| ------------------------------------------------ |\r\n| `-D 50 -H 10 -W 40`        | ![image](https://github.com/user-attachments/assets/8b7fda22-1ec2-4a00-84ba-5b268ecf672e) |\r\n| `-D 100 -H 12 -W 40`       | ![image](https://github.com/user-attachments/assets/0b553bc9-841e-41ca-9138-996ddd6f87b2) |\r\n| `-D 500 -H 28 -W 80`       | ![image](https://github.com/user-attachments/assets/bf542700-bf62-404a-b4ce-25adcd46d9f4) |\r\n| `-D 1000 -H 10 -W 40`      | ![image](https://github.com/user-attachments/assets/15452188-3f58-4df8-8064-9742013f6fa1) |\r\n\r\n## 🅣🅞🅓🅞 ▒▓▒▓▒▓▒▓▒▓▒▓▒\r\n\r\n- **Rework wallpaper.py**: Current implementation is far from the unicode magic of everest's original project. Needs significant upgrades to achieve bolder aesthetic impact.\r\n- Add support for more output formats and embedding options\r\n- Improve interactive visualization modes\r\n- Rework web interface\r\n- Enhance thematic poem generation\r\n- Fine-tune feet/syllable matching logic\r\n\r\n▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\r\n\r\n\r\n## ℓιƈєηѕє ╛╝╜┶⌧┊\r\n\r\nThis project is free software. Take it, use it, modify it, reshare it. Just add/download your own dataset!\r\n\r\n🅛🅘🅒🅔🅝🅢🅔🅓 🅤🅝🅓🅔🅡 🅣🅗🅔 🅖🅝🅤 🅖🅟🅛-𝟹.𝟶\r\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fplnech%2Fnever2late","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fplnech%2Fnever2late","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fplnech%2Fnever2late/lists"}