<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Boris Orekhov</title>
    <description>The latest articles on DEV Community by Boris Orekhov (@nevmenandr).</description>
    <link>https://dev.to/nevmenandr</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1744598%2F1c5fba73-a136-4422-b265-15c1fb254a94.png</url>
      <title>DEV Community: Boris Orekhov</title>
      <link>https://dev.to/nevmenandr</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/nevmenandr"/>
    <language>en</language>
    <item>
      <title>How We Mapped 96 Minority Languages of Russia on the Internet – A Web Scraping Journey</title>
      <dc:creator>Boris Orekhov</dc:creator>
      <pubDate>Sat, 07 Nov 2026 07:04:00 +0000</pubDate>
      <link>https://dev.to/nevmenandr/how-we-mapped-96-minority-languages-of-russia-on-the-internet-a-web-scraping-journey-bb1</link>
      <guid>https://dev.to/nevmenandr/how-we-mapped-96-minority-languages-of-russia-on-the-internet-a-web-scraping-journey-bb1</guid>
      <description>&lt;h2&gt;
  
  
  The challenge: find 96 languages without a dictionary
&lt;/h2&gt;

&lt;p&gt;Russia speaks dozens of minority languages – Tatar, Bashkir, Udmurt, even tiny ones like South Yukaghir. Some have no Wikipedia, no standard corpus, and almost no digital footprint. But they &lt;em&gt;do&lt;/em&gt; exist online, scattered across forums, blogs, and VK communities.&lt;/p&gt;

&lt;p&gt;We wanted to measure their online presence. As programmers, we quickly realised: no global corpus, no labelled dataset, and no simple way to ask a search engine “give me all pages in Chechen”.&lt;/p&gt;

&lt;p&gt;So we built our own pipeline.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Choose word markers – the hard way
&lt;/h3&gt;

&lt;p&gt;You can’t download the whole internet (unless you’re Google). But search engines already crawled it. We used &lt;strong&gt;Yandex.XML&lt;/strong&gt; – a limited API (10k requests/day) that returns search results page by page (each next page costs another request).&lt;/p&gt;

&lt;p&gt;What do we search for? We need &lt;strong&gt;word markers&lt;/strong&gt;:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Frequent&lt;/strong&gt; in the target language
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unique&lt;/strong&gt; – not appearing in Russian or other languages
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Free of special characters&lt;/strong&gt; (because real users don’t type them)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That last point is killer. Most minority languages use Cyrillic extensions: &lt;code&gt;ҙ&lt;/code&gt;, &lt;code&gt;ә&lt;/code&gt;, &lt;code&gt;ö&lt;/code&gt;, &lt;code&gt;ҷ&lt;/code&gt;. There’s no standard keyboard for them. People write &lt;code&gt;“менан”&lt;/code&gt; instead of &lt;code&gt;“менән”&lt;/code&gt;. If we query with the “correct” spelling, we lose 90% of real texts.&lt;/p&gt;

&lt;p&gt;We call this &lt;strong&gt;“household spelling”&lt;/strong&gt; – like medieval birch‑bark manuscripts, but with modern laziness.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Kill the noise
&lt;/h3&gt;

&lt;p&gt;Even good markers return junk:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Wikipedia duplicates (we can download those in one click, so exclude them)
&lt;/li&gt;
&lt;li&gt;Linguistic papers with example sentences (Russian text containing one line of Rutul)
&lt;/li&gt;
&lt;li&gt;Music sites with song titles but no lyrics
&lt;/li&gt;
&lt;li&gt;Typos – e.g. Russian &lt;code&gt;“пазух”&lt;/code&gt; (bosom) mistyped as &lt;code&gt;“пазох”&lt;/code&gt;, which is a valid Khakas word meaning “again”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To filter, we used &lt;strong&gt;multi‑marker verification&lt;/strong&gt;. If one marker appears on a domain but others from the same language don’t, it’s probably a false positive. That means extra API calls – expensive when you only have 10k/day.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Classify domains by depth
&lt;/h3&gt;

&lt;p&gt;We asked Yandex to categorise each domain into three tiers:  &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Language‑first&lt;/strong&gt; – most pages in the minority language
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mixed&lt;/strong&gt; – several pages, but minority language is not dominant
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Giant platforms&lt;/strong&gt; – YouTube, stihi.ru, etc., where minority content exists but is buried&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Also, we specifically queried VK.com communities because social networks post‑2012 ate most standalone language sites.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4: Detect the language (without a training corpus)
&lt;/h3&gt;

&lt;p&gt;We downloaded pages and needed to separate Russian from, say, Tuvan. Classic n‑gram language detection requires a pre‑labelled corpus – which we didn’t have.&lt;/p&gt;

&lt;p&gt;But we &lt;em&gt;did&lt;/em&gt; have Russian – plenty of it. So we built a binary classifier: &lt;em&gt;Russian vs. everything else&lt;/em&gt;. If a paragraph isn’t Russian, it’s our target. Not perfect, but good enough to build the first ever web corpora for these languages.&lt;/p&gt;

&lt;h2&gt;
  
  
  What we learned (the data science part)
&lt;/h2&gt;

&lt;p&gt;We compared online metrics (Wikipedia articles, VK communities, text volume) with offline metrics (speaker count, regional economy).  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Correlation (Spearman) among online metrics: &amp;gt;0.7&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Correlation between online and offline: near zero&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That means: how many people speak a language &lt;strong&gt;does not predict&lt;/strong&gt; how alive it is on the internet. What matters is a small, active, passionate community.&lt;/p&gt;

&lt;p&gt;Example: Bashkir has fewer speakers than Chechen, but far more online communities. Why? Chechnya’s internet infrastructure recovered later (1990s‑2000s conflicts delayed digital adoption).&lt;/p&gt;

&lt;h2&gt;
  
  
  A few geeky findings
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Post‑2012, almost all minority language activity moved to &lt;strong&gt;VK.com&lt;/strong&gt; – Russian Facebook.
&lt;/li&gt;
&lt;li&gt;Typical user: 19‑31 years old, lives in the region’s capital (Ufa for Bashkir, Izhevsk for Udmurt).
&lt;/li&gt;
&lt;li&gt;Typical minority‑language post: &lt;strong&gt;~5 words long&lt;/strong&gt;. Most conversation is in Russian, but people sprinkle native words as identity markers.
&lt;/li&gt;
&lt;li&gt;The minority language web is &lt;strong&gt;highly interconnected&lt;/strong&gt; – sites in different languages link to each other. A rare case of “peoples united” online.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Data
&lt;/h2&gt;

&lt;p&gt;Downloadable corpora and domain lists: &lt;a href="http://web-corpora.net/wsgi3/minorlangs/download" rel="noopener noreferrer"&gt;web-corpora.net&lt;/a&gt;  &lt;/p&gt;

&lt;p&gt;And yes, there’s a VK community with cute memes in minority languages – featuring cats.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Takeaway for devs:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Web scraping isn’t just about avoiding &lt;code&gt;robots.txt&lt;/code&gt;. It’s about understanding human behaviour – typos, keyboard limitations, social network migration, and why a language with 50 speakers can thrive online if those 50 are determined enough.&lt;/p&gt;

</description>
      <category>nlp</category>
      <category>languages</category>
      <category>linguistics</category>
    </item>
    <item>
      <title>Wikipedia as a Linguistic Dataset?</title>
      <dc:creator>Boris Orekhov</dc:creator>
      <pubDate>Tue, 27 Oct 2026 09:56:00 +0000</pubDate>
      <link>https://dev.to/nevmenandr/wikipedia-as-a-linguistic-dataset-9mo</link>
      <guid>https://dev.to/nevmenandr/wikipedia-as-a-linguistic-dataset-9mo</guid>
      <description>&lt;p&gt;If you’ve ever scraped Wikipedia for training data, you probably assumed the text is “natural” – written by humans, balanced across topics, ready for your shiny language model.  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Think again.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We analyzed Russian, Tatar, Bashkir, Mari, Mordvin, and Komi Wikipedias using a dead‑simple method: &lt;strong&gt;word frequency lists&lt;/strong&gt;. The results are eye‑opening for anyone who handles text corpora.&lt;/p&gt;

&lt;h2&gt;
  
  
  The litmus test for a “natural” corpus
&lt;/h2&gt;

&lt;p&gt;In any balanced, human‑written text collection, the most frequent words are &lt;strong&gt;function words&lt;/strong&gt; – prepositions, conjunctions, pronouns, auxiliary verbs.&lt;br&gt;&lt;br&gt;
Example from the Russian National Corpus:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;Word&lt;/th&gt;
&lt;th&gt;Part of speech&lt;/th&gt;
&lt;th&gt;Frequency (ipm)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;и (and)&lt;/td&gt;
&lt;td&gt;conj&lt;/td&gt;
&lt;td&gt;35801&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;в (in)&lt;/td&gt;
&lt;td&gt;prep&lt;/td&gt;
&lt;td&gt;31374&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;не (not)&lt;/td&gt;
&lt;td&gt;part&lt;/td&gt;
&lt;td&gt;18028&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Content words (nouns, adjectives, full verbs) appear much lower in the list.&lt;/p&gt;

&lt;p&gt;So if your corpus’s top 20 is full of words like &lt;em&gt;“river”&lt;/em&gt;, &lt;em&gt;“basin”&lt;/em&gt;, &lt;em&gt;“water”&lt;/em&gt;, &lt;em&gt;“orchid”&lt;/em&gt; – &lt;strong&gt;you have a problem&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Russian Wikipedia passes (mostly)
&lt;/h2&gt;

&lt;p&gt;The Russian Wikipedia (1.06M articles) top word forms:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;Word&lt;/th&gt;
&lt;th&gt;Frequency&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;в (in)&lt;/td&gt;
&lt;td&gt;10,859,129&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;и (and)&lt;/td&gt;
&lt;td&gt;5,761,105&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;на (on)&lt;/td&gt;
&lt;td&gt;3,214,393&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;с (with)&lt;/td&gt;
&lt;td&gt;2,439,469&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Apart from the verb &lt;em&gt;“быть”&lt;/em&gt; (to be), it’s all prepositions/conjunctions. ✅ Good enough for linguistic research.&lt;/p&gt;

&lt;h2&gt;
  
  
  But Tatar and Bashkir Wikipedia? Disaster.
&lt;/h2&gt;

&lt;p&gt;Tatar Wikipedia (~50k articles) top 10:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;Word&lt;/th&gt;
&lt;th&gt;Translation&lt;/th&gt;
&lt;th&gt;Frequency&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;елга&lt;/td&gt;
&lt;td&gt;river&lt;/td&gt;
&lt;td&gt;132,567&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;бассейны&lt;/td&gt;
&lt;td&gt;basin&lt;/td&gt;
&lt;td&gt;75,706&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;су&lt;/td&gt;
&lt;td&gt;water&lt;/td&gt;
&lt;td&gt;54,689&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;буенча&lt;/td&gt;
&lt;td&gt;by (postposition)&lt;/td&gt;
&lt;td&gt;48,838&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Русия&lt;/td&gt;
&lt;td&gt;Russia&lt;/td&gt;
&lt;td&gt;48,722&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The only “function word” is &lt;em&gt;буенча&lt;/em&gt; at #4. &lt;strong&gt;“River” is 3x more frequent than the conjunction “and”.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Bashkir Wikipedia is identical: &lt;em&gt;йылга&lt;/em&gt; (river), &lt;em&gt;бассейны&lt;/em&gt;, &lt;em&gt;һыу&lt;/em&gt; (water), &lt;em&gt;Рәсәй&lt;/em&gt; (Russia) dominate the top.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why? Auto‑generated articles
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Most articles weren’t written by humans. They were created automatically from a template, filled with data from Russia’s State Water Registry.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Thousands of articles about rivers – each repeating “river”, “basin”, “water”, “located”, “km” – completely distort the frequency distribution.  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For a programmer:&lt;/strong&gt; Imagine scraping this corpus for word embeddings or a language model. Your embeddings would be obsessed with hydrology.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mordvin Wikipedias: the Orchid syndrome
&lt;/h2&gt;

&lt;p&gt;Erzya and Moksha (Mordvin) Wikipedias have ~1,100–1,500 articles. Their top words include &lt;em&gt;“category”&lt;/em&gt;, &lt;em&gt;“see”&lt;/em&gt;, &lt;em&gt;“day”&lt;/em&gt;, &lt;em&gt;“year”&lt;/em&gt; – but also:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Erzya&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Moksha&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;em&gt;истэжо&lt;/em&gt; (also)&lt;/td&gt;
&lt;td&gt;
&lt;em&gt;ди&lt;/em&gt; (and)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;категория&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;
&lt;em&gt;и&lt;/em&gt; (and)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;em&gt;ван&lt;/em&gt; (see)&lt;/td&gt;
&lt;td&gt;
&lt;em&gt;тыналста&lt;/em&gt; (from family)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;em&gt;чи&lt;/em&gt; (day)&lt;/td&gt;
&lt;td&gt;
&lt;em&gt;касыкссь&lt;/em&gt; (plant)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;em&gt;ды&lt;/em&gt; (and)&lt;/td&gt;
&lt;td&gt;
&lt;em&gt;панчф&lt;/em&gt; (flower)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;em&gt;ие&lt;/em&gt; (year)&lt;/td&gt;
&lt;td&gt;
&lt;em&gt;орхидея&lt;/em&gt; (orchid)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The explanation: most articles are &lt;strong&gt;automatically generated about orchids&lt;/strong&gt; (family Orchidaceae). Hundreds of plant stubs, each repeating “orchid”, “flower”, “species”, “genus”.&lt;/p&gt;

&lt;p&gt;They call this the &lt;strong&gt;Orchid Phenomenon&lt;/strong&gt; – a corpus hijacked by bot‑generated content about a single narrow topic.&lt;/p&gt;

&lt;h2&gt;
  
  
  Average article length: a quick sanity check
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Wikipedia&lt;/th&gt;
&lt;th&gt;Avg length (words)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Russian&lt;/td&gt;
&lt;td&gt;184.5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tatar&lt;/td&gt;
&lt;td&gt;58.5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bashkir&lt;/td&gt;
&lt;td&gt;56.8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Komi‑Zyrian&lt;/td&gt;
&lt;td&gt;29.6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Erzya&lt;/td&gt;
&lt;td&gt;34.5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Moksha&lt;/td&gt;
&lt;td&gt;34.9&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Short stubs = high risk of template‑driven, repetitive content.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this means for you (the developer)
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Don’t trust Wikipedia dumps blindly&lt;/strong&gt; – especially for low‑resource languages or small editions.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Frequency analysis is your cheap, powerful friend&lt;/strong&gt; – a simple count of top word forms can reveal massive bias.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Auto‑generated content is everywhere&lt;/strong&gt; – not just rivers and orchids, but also geographical coordinates, biological taxa, movie stubs.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;If you build a language model on such data&lt;/strong&gt;, expect weird behaviour: over‑representation of “river”, “water”, “orchid”, “species” in any context.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The takeaway
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;“Wikipedia is free, but not always natural.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;For major languages (English, Russian, German) the corpus is surprisingly balanced. For many minority languages, the Wikipedia you scrape may be more &lt;em&gt;botanical&lt;/em&gt; than &lt;em&gt;linguistic&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Always profile your data. A frequency list takes 5 minutes to generate and can save you months of debugging weird model predictions.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Further reading:&lt;/strong&gt; Orekhov, Reshetnikov (2014). “Towards an evaluation of Wikipedia as a linguistic source: a comparative study.” In &lt;em&gt;Modern Russian Language on the Internet&lt;/em&gt;, Moscow.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Liked this? Share with your fellow NLP engineers. They’ll never look at Wikipedia the same way again.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>nlp</category>
      <category>data</category>
      <category>linguistics</category>
      <category>scraping</category>
    </item>
    <item>
      <title>Teaching a Computer to Write Bashkir Haiku (And Why It Went Viral)</title>
      <dc:creator>Boris Orekhov</dc:creator>
      <pubDate>Sat, 17 Oct 2026 09:49:00 +0000</pubDate>
      <link>https://dev.to/nevmenandr/teaching-a-computer-to-write-bashkir-haiku-and-why-it-went-viral-11of</link>
      <guid>https://dev.to/nevmenandr/teaching-a-computer-to-write-bashkir-haiku-and-why-it-went-viral-11of</guid>
      <description>&lt;p&gt;Ever tried to teach a computer to write poetry in a language that has almost no digital linguistic resources? That’s exactly what we did.&lt;/p&gt;

&lt;p&gt;I work at the Computational Philology Lab at Bashkir State University. While Russian and English have plenty of NLP tools, Bashkir – a Turkic language spoken in Russia – has close to none. So we decided to build something fun: &lt;strong&gt;a haiku generator&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The rules were simple
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;First line: 5 syllables
&lt;/li&gt;
&lt;li&gt;Second: 7 syllables
&lt;/li&gt;
&lt;li&gt;Third: 5 syllables
&lt;/li&gt;
&lt;li&gt;All output must be &lt;strong&gt;grammatically correct&lt;/strong&gt; Bashkir&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We built a dictionary of ~11,500 words and designed &lt;strong&gt;90+ rhythm-grammar scenarios&lt;/strong&gt; – templates that ensure syllable counts and grammatical agreement (cases, verb tenses, singular/plural). The algorithm randomly picks words and slots them into a scenario. Present tense appears more often than past, singular more than plural – just because it feels more natural for haiku.&lt;/p&gt;

&lt;h2&gt;
  
  
  What came out?
&lt;/h2&gt;

&lt;p&gt;Mostly nonsense. But sometimes – pure accidental poetry.&lt;/p&gt;

&lt;p&gt;Here’s one (translated):&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Sovinformburo&lt;/em&gt;&lt;br&gt;&lt;br&gt;
&lt;em&gt;takes from fire and buries. The word&lt;/em&gt;&lt;br&gt;&lt;br&gt;
&lt;em&gt;fears the statue.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It reads like a surrealist miniature: war communiques, fire, burial, and a fearful “word” that brings to mind the Don Juan legend. A machine wrote this without any intent – yet it feels oddly coherent.&lt;/p&gt;

&lt;p&gt;Another one:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Thousand cable workers&lt;/em&gt;&lt;br&gt;&lt;br&gt;
&lt;em&gt;hang like leather. The ray, ah!&lt;/em&gt;&lt;br&gt;&lt;br&gt;
&lt;em&gt;like tinder, does not obey.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You see contrast: dark, flexible cables vs. a straight, unbending ray of light. The computer accidentally discovered &lt;strong&gt;antithesis&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The unexpected part
&lt;/h2&gt;

&lt;p&gt;We put the generator online as a joke. Then the media went wild. Radio, newspapers, TV – all wanted to talk about “computer haiku.” Nobody cared about our serious academic corpora or folklore databases. But a silly poetry bot? That got headlines.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this matters for programmers
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Low-resource languages need creative first steps.&lt;/strong&gt; You don’t need giant transformers to have fun and learn.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Randomness + constraints = emergent meaning.&lt;/strong&gt; The human brain will find poetry even where none was intended.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Grammar-first generation is possible with modest dictionaries and smart templates.&lt;/strong&gt; Our 90 scenarios keep everything grammatical.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We’re not claiming real AI poetry. But watching a Bashkir-speaking machine accidentally write about excavators, grenade launchers, and frozen cellars? That’s entertainment – and a tiny step toward putting my language on the computational map.&lt;/p&gt;

&lt;p&gt;👉 Want to try it? It’s &lt;a href="http://nevmenandr.net/cgi-bin/haiku.html" rel="noopener noreferrer"&gt;online&lt;/a&gt; (in Bashkir, sorry). Each refresh gives you a new, never-before-seen haiku. Some are garbage. Some – just weird enough to be beautiful.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;P.S. One journalist wrote we “decided to amaze the world.” We didn’t. But we’re glad it made people smile.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>bashkir</category>
      <category>nlp</category>
      <category>generative</category>
      <category>languages</category>
    </item>
    <item>
      <title>🤖📜 The Electronic Lyre</title>
      <dc:creator>Boris Orekhov</dc:creator>
      <pubDate>Wed, 07 Oct 2026 06:52:00 +0000</pubDate>
      <link>https://dev.to/nevmenandr/the-electronic-lyre-160i</link>
      <guid>https://dev.to/nevmenandr/the-electronic-lyre-160i</guid>
      <description>&lt;h2&gt;
  
  
  Why Every Dev Should Care About AI Poetry (And Not Just for the Memes)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Most programmers know AI can &lt;em&gt;generate&lt;/em&gt; poems, but they rarely ask &lt;em&gt;why&lt;/em&gt; it does it so badly—or so brilliantly. This book finally explains it, without drowning you in linear regression and backpropagation. It turns out, understanding AI poetry is less about math and more about understanding what poetry actually &lt;em&gt;is&lt;/em&gt;. And the answer might surprise you.&lt;/p&gt;

&lt;p&gt;Let's be real. When you hear "AI writes poetry," what's the first thing that comes to mind?&lt;/p&gt;

&lt;p&gt;Probably something like this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;The hour is twice a cat on velvet rose&lt;/em&gt;&lt;br&gt;
&lt;em&gt;Who melts the moon until the willow sings&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Beautiful nonsense, right? Just random words glued together by an overeager RNN.&lt;/p&gt;

&lt;p&gt;For years, that's been the programmer's view of machine poetry: a neat party trick, a testbed for Markov chains, and a source of hilariously broken syntax.&lt;/p&gt;

&lt;p&gt;But that view is &lt;strong&gt;stuck in 1997&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;While we were busy declaring victory over Kasparov, something quietly happened in the humanities departments. A real revolution. And &lt;strong&gt;my new book, *"The Electronic Lyre: How and Why Artificial Intelligence Writes Poetry"&lt;/strong&gt; ,* is the first serious attempt to explain what the hell is actually going on.&lt;/p&gt;

&lt;p&gt;And no, this isn't a book about "the future of art." This is a book that finally bridges the chasm between how &lt;strong&gt;we&lt;/strong&gt; build AI and how &lt;strong&gt;it&lt;/strong&gt; learns to &lt;em&gt;mean&lt;/em&gt; something.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wait, Why Should a Dev Read This?
&lt;/h2&gt;

&lt;p&gt;I know what you're thinking: &lt;em&gt;"I don't care about literary theory. Just tell me how the transformer works."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;But hold on. This book is deliberately, provocatively written for &lt;em&gt;humanities&lt;/em&gt; scholars. Me, a computational linguist, swears he'll barely mention loss functions. Instead, he'll talk about &lt;strong&gt;hexameter, centos and collage&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;If that doesn't send shivers down your spine, you're missing the point.&lt;/p&gt;

&lt;p&gt;Me argue that we've been asking the wrong question. For 70 years, engineers have been asking: &lt;em&gt;"Can we make a computer write a convincing poem?"&lt;/em&gt; And they've done it by basically brute-forcing the problem: combinatorial word shuffling → Markov chains → RNNs → Transformers.&lt;/p&gt;

&lt;p&gt;But no one stopped to ask the &lt;strong&gt;real&lt;/strong&gt; question: &lt;em&gt;"What are we even trying to copy?"&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  The Two Ages of Machine Poetry (And Why Your Old Code is Obsolete)
&lt;/h3&gt;

&lt;p&gt;The book brilliantly separates the history of machine poetry into two distinct eras. And knowing the difference will change how you look at your own generative models.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🕰️ Era 1: Combinatorics (1950s–2010s) — The "Shakespearean Monkey"&lt;/strong&gt;&lt;br&gt;
This is the era you know. The program had a dictionary, some grammar rules, and a random number generator. The goal was &lt;strong&gt;surprise&lt;/strong&gt;. The computer was a roulette wheel for words. This approach was a direct descendant of Dadaism and Surrealism—artistic movements whose whole point was to &lt;strong&gt;break the chains of rational thought&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Dada created a real element of global protest,"&lt;/em&gt; Orekhov writes. The computer was the ultimate tool for irrationality.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Every program from the 60s to the 2000s—from &lt;em&gt;Стихоплюй&lt;/em&gt; to &lt;em&gt;Кибер-Пушкин&lt;/em&gt;—was just shuffling a deck of cards.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🚀 Era 2: Neural Networks (2010s–Now) — The "Statistical Mimic"&lt;/strong&gt;&lt;br&gt;
Then everything changed. RNNs, and later Transformers, didn't rely on randomness. They relied on &lt;strong&gt;prediction&lt;/strong&gt;. They learned from massive datasets—millions of lines of real poetry. They stopped trying to &lt;em&gt;break&lt;/em&gt; the rules and started trying to &lt;em&gt;internalize&lt;/em&gt; them.&lt;/p&gt;

&lt;p&gt;This is the crucial point. An RNN doesn't invent new words. It learns the &lt;strong&gt;distribution&lt;/strong&gt; of letters. It learns that 'о' is common, that '-ние' is a suffix, that 'в лесах' is a phrase. It learns &lt;strong&gt;style&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I show this with brutal clarity. I trained an RNN on Pushkin. It didn't just rhyme. It learned to mimic Pushkin's specific syntactic inversions, his preferred vocabulary, even his thematic concerns.&lt;/p&gt;

&lt;p&gt;But here's the magic—and the error.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Hallucination of Meaning
&lt;/h2&gt;

&lt;p&gt;The book's central, mind-bending argument is this: &lt;strong&gt;A computer's poem isn't a message. It's a statistically perfect forgery of a message.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;And that might be the most interesting thing about it.&lt;/p&gt;

&lt;p&gt;Think about it. When you read a human poem, you're engaged in an act of &lt;strong&gt;understanding&lt;/strong&gt;. You're trying to reverse-engineer the author's intent. You're looking for the "why" behind the "what."&lt;/p&gt;

&lt;p&gt;When you read a GPT-generated poem, there is no "why." There's just a statistically probable sequence of tokens.&lt;/p&gt;

&lt;p&gt;But—and this is the killer—&lt;strong&gt;the human brain is a meaning-making machine.&lt;/strong&gt; We &lt;em&gt;cannot&lt;/em&gt; look at a text that looks like a poem and not try to find meaning in it.&lt;/p&gt;

&lt;p&gt;So, we hallucinate it. We fill in the gaps. We find profound connections between words that the model placed there by pure mathematical accident.&lt;/p&gt;

&lt;p&gt;The book calls this the "uncanny valley" of poetry. The closer the model gets to perfect mimicry, the more disturbed we become, because we sense the &lt;em&gt;lack&lt;/em&gt; of a soul behind the words.&lt;/p&gt;

&lt;h3&gt;
  
  
  What's Actually in the Book (For the Curious)
&lt;/h3&gt;

&lt;p&gt;If you want to sound smart at your next ML meetup, here are the three big takeaways from &lt;em&gt;The Electronic Lyre&lt;/em&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The "Impossible" Vers Libre:&lt;/strong&gt; For decades, Russian computer poems were strictly rhymed and metered. Why? Because the developers had a "school" view of poetry. In the West, where developers were influenced by Surrealism, free verse was the norm. The book argues that the &lt;strong&gt;cultural context&lt;/strong&gt; of the programmer is encoded into the model's output more than any dataset.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Stylistic Impersonator:&lt;/strong&gt; I run an experiment. I take a short (4-line) poem generated by a model trained on Nekrasov. I ask literary scholars to identify which of four poets it most resembles. The experts, even on this tiny fragment, pick Nekrasov &lt;strong&gt;80% of the time&lt;/strong&gt;. The model isn't just generating text; it's capturing an &lt;em&gt;authorial fingerprint&lt;/em&gt; that is statistically indistinguishable from the real thing.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Parody vs. Plagiarism:&lt;/strong&gt; Is a neural poem a parody? A parody mimics style for humorous or critical effect. An AI poem mimics style for no reason at all. It's an empty simulacrum. And yet, it reveals more about the nature of style than any critical essay ever could.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  One Last Thing: The "Turing Test" is a Trap
&lt;/h2&gt;

&lt;p&gt;The book ends with a powerful plea: &lt;strong&gt;stop asking "can a machine fool a human?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That's boring. That's the "counting cats in Zanzibar" of AI research.&lt;/p&gt;

&lt;p&gt;Instead, ask: &lt;strong&gt;"What happens to &lt;em&gt;our&lt;/em&gt; understanding of poetry when a machine can flawlessly produce its outward form?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The answer, according to me, is that we finally have to confront the mystery of meaning itself. And that's a question worth sticking around for.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;The Book:&lt;/strong&gt; &lt;em&gt;"The Electronic Lyre: How and Why Artificial Intelligence Writes Poetry"&lt;/em&gt; by Boris Orekhov.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://eupress.ru/books/index/item/id/480" rel="noopener noreferrer"&gt;👉 Get it from the publisher's site here&lt;/a&gt;&lt;/strong&gt; (It's in Russian, but the ideas are universal).&lt;/p&gt;




&lt;p&gt;What do you think? Have you ever tried to seriously interpret a GPT-generated poem, or do you dismiss it all as stochastic parroting? Drop a comment below—let's get a real debate going.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>nlp</category>
      <category>poetry</category>
      <category>machinelearning</category>
    </item>
    <item>
      <title>Vindolanda. A Free Font That Brings Ancient Roman Cursive into the Digital Age</title>
      <dc:creator>Boris Orekhov</dc:creator>
      <pubDate>Sun, 27 Sep 2026 06:38:00 +0000</pubDate>
      <link>https://dev.to/nevmenandr/vindolanda-a-free-font-that-brings-ancient-roman-cursive-into-the-digital-age-15lm</link>
      <guid>https://dev.to/nevmenandr/vindolanda-a-free-font-that-brings-ancient-roman-cursive-into-the-digital-age-15lm</guid>
      <description>&lt;p&gt;If you think ancient handwriting has no place in modern sans-serif typography, think again.&lt;/p&gt;

&lt;p&gt;Meet &lt;strong&gt;Vindolanda&lt;/strong&gt; — a free, open-source typeface that reproduces the letterforms found on wooden writing tablets from a Roman auxiliary fort near Hadrian’s Wall. These tablets, preserved for nearly 2,000 years by anaerobic soil conditions, contain one of the best examples of &lt;strong&gt;early Roman cursive&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The most famous is &lt;strong&gt;tablet 291&lt;/strong&gt; — a birthday invitation from Claudia Severa. Her elegant, slanted handwriting became the main inspiration for the font.&lt;/p&gt;

&lt;p&gt;But here’s the twist: Vindolanda is &lt;strong&gt;not a historical reenactment&lt;/strong&gt;. It’s a &lt;strong&gt;strict modern sans-serif&lt;/strong&gt; that combines the raw, fractured energy of hand‑drawn Roman cursive with the clean regularity of contemporary typography.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;No uppercase/lowercase distinction. Just pure, angular character.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv9fe8mrc9brqo1cycwnu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv9fe8mrc9brqo1cycwnu.png" alt="Vindolanda" width="382" height="370"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Matters for Type Designers
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Authentic letterforms&lt;/strong&gt; — every Latin character is based directly on Vindolanda tablets (where they could be found). Letters like &lt;code&gt;B&lt;/code&gt;, &lt;code&gt;C&lt;/code&gt;, &lt;code&gt;D&lt;/code&gt;, and &lt;code&gt;L&lt;/code&gt; keep their original uneven, almost runic structures.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kerning done right&lt;/strong&gt; — because these shapes are unusual, standard kerning pairs won’t work. The article includes a detailed list of pairs like &lt;code&gt;E+O&lt;/code&gt;, &lt;code&gt;F+V&lt;/code&gt;, &lt;code&gt;R+Q&lt;/code&gt;, and more.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cyrillic for fun&lt;/strong&gt; — no historical basis (Slavs didn’t have writing for another 700 years), but the author fantasizes what Roman‑cursive Cyrillic might look like. Great for Easter eggs or secret‑club alphabets.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  A Few Letter Highlights
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A&lt;/strong&gt; – sharp, almost triangular
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;B&lt;/strong&gt; – very vertical with a detached element
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;C&lt;/strong&gt; – drawn in two linear strokes, not a smooth curve
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Q&lt;/strong&gt; – so rare on the tablets that the designer had to adapt it to fit the font’s character
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;X, Y, Z&lt;/strong&gt; – almost absent in the original documents (no scholarly Greek needed for Roman logistics)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Beyond the Font
&lt;/h2&gt;

&lt;p&gt;The creator, me, didn’t just draw letters. I wrote a full &lt;strong&gt;academic-style paper&lt;/strong&gt; (with DOI!) explaining the design decisions, showing side‑by‑side comparisons of tablet letters vs. font letters, and even discussing how the font can be used for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Authentic book/web reproduction of Roman cursive texts
&lt;/li&gt;
&lt;li&gt;Teaching paleography
&lt;/li&gt;
&lt;li&gt;Secret kid clubs (Dead Poets Society style)&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F32ith5tpjcp5tn6w2or7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F32ith5tpjcp5tn6w2or7.png" alt="Vindolanda font" width="800" height="625"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Download &amp;amp; License
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;100% free and open source&lt;/strong&gt; (includes commercial use)
&lt;/li&gt;
&lt;li&gt;OTF + TTF files available
&lt;/li&gt;
&lt;li&gt;Source project in Glyphr Studio — you can modify it
&lt;/li&gt;
&lt;li&gt;License: Creative Commons (see article)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Download from GitHub:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://github.com/nevmenandr/vindolanda/raw/main/Vindolanda-Regular.otf" rel="noopener noreferrer"&gt;Vindolanda-Regular.otf&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://github.com/nevmenandr/vindolanda/raw/main/Vindolanda-Regular.ttf" rel="noopener noreferrer"&gt;Vindolanda-Regular.ttf&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Original academic publication:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://doi.org/10.5281/zenodo.13293622" rel="noopener noreferrer"&gt;10.5281/zenodo.13293622&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thought
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;“Vindolanda returns clarity and precision of Greek writings to Roman cursive.”&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If you’re a type designer looking for something between ancient runes and sci‑fi movie lettering — give this font a try. Your next project might just look like it was written by a Roman soldier with a steady hand and a very sharp stylus.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuwz7s3k9sbraeazjqcrf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuwz7s3k9sbraeazjqcrf.png" alt="Vindolanda Lingua Latina" width="800" height="444"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Lingua Latina in the font? Absolutely. Check the original article for a full Latin banner.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>font</category>
      <category>typography</category>
      <category>roman</category>
      <category>cursive</category>
    </item>
    <item>
      <title>Train OCR on Pre-Revolution Russian Texts? I’ve Got a Dataset for You! 🧐📜</title>
      <dc:creator>Boris Orekhov</dc:creator>
      <pubDate>Thu, 17 Sep 2026 06:25:00 +0000</pubDate>
      <link>https://dev.to/nevmenandr/train-ocr-on-pre-revolution-russian-texts-ive-got-a-dataset-for-you-41a1</link>
      <guid>https://dev.to/nevmenandr/train-ocr-on-pre-revolution-russian-texts-ive-got-a-dataset-for-you-41a1</guid>
      <description>&lt;h2&gt;
  
  
  The problem: Old Russian orthography is a different beast
&lt;/h2&gt;

&lt;p&gt;If you’ve ever tried to OCR a book published in Russia before 1917, you quickly run into a wall. The alphabet had &lt;strong&gt;four extra letters&lt;/strong&gt; (&lt;code&gt;ѣ&lt;/code&gt;, &lt;code&gt;і&lt;/code&gt;, &lt;code&gt;ѳ&lt;/code&gt;, &lt;code&gt;ѵ&lt;/code&gt;), plus spelling rules that disappeared after the orthographic reform. Modern OCR engines trained on contemporary Russian will choke on words like «съ», «онѣ», or «всѣхъ».&lt;/p&gt;

&lt;p&gt;But digitizing historical texts is crucial for linguists, historians, and even NLP researchers who want to train models on original sources. So what do we do?&lt;/p&gt;

&lt;h2&gt;
  
  
  The solution: A clean, paired dataset
&lt;/h2&gt;

&lt;p&gt;I published &lt;strong&gt;&lt;a href="https://huggingface.co/datasets/nevmenandr/russian-old-orthography-ocr" rel="noopener noreferrer"&gt;russian-old-orthography-ocr&lt;/a&gt;&lt;/strong&gt; on Hugging Face. It contains &lt;strong&gt;source images and human‑extracted ground‑truth texts&lt;/strong&gt; from 19th‑century Russian publications – all in original pre‑reform spelling.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Long texts&lt;/strong&gt; (novels, stories) → PDF + TXT in &lt;code&gt;books-pdf-plaintext/&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Single‑page samples&lt;/strong&gt; → PNG + TXT in &lt;code&gt;pages-img-plaintext/&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;File pairs share the same base name, e.g.&lt;br&gt;&lt;br&gt;
&lt;code&gt;afanasjev-chuzhbinskij_a_s.peterburgskie_igroki.pdf&lt;/code&gt; and &lt;code&gt;.txt&lt;/code&gt;, or&lt;br&gt;&lt;br&gt;
&lt;code&gt;300_page_image_009.png&lt;/code&gt; and &lt;code&gt;300_page_text_009.txt&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  Why this dataset rocks for developers
&lt;/h2&gt;

&lt;p&gt;✅ &lt;strong&gt;Ready to train&lt;/strong&gt; – images + ground truth, no scraping or alignment headaches&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Covers real 19th‑century typography&lt;/strong&gt; – including tricky pre‑reform letters&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Perfect for fine‑tuning Tesseract, TrOCR, or any CRNN model&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Also useful for NLP&lt;/strong&gt; – language modelling, old‑to‑modern conversion, historical text analysis  &lt;/p&gt;
&lt;h2&gt;
  
  
  Old orthography, demystified
&lt;/h2&gt;

&lt;p&gt;Those four extinct letters have their own Unicode code points, but you also have to handle the old rules (e.g., hard sign at the end of words, &lt;code&gt;и&lt;/code&gt; vs &lt;code&gt;і&lt;/code&gt;). I wrote a Python package to convert between old and modern orthography: &lt;strong&gt;&lt;a href="https://pypi.org/project/prereform2modern/" rel="noopener noreferrer"&gt;prereform2modern&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Here’s a taste:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;prereform2modern&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;convert&lt;/span&gt;

&lt;span class="n"&gt;old_text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Онъ былъ въ Петербургѣ и видѣлъ тамъ всѣхъ.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;modern_text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;convert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;old_text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;modern_text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# Он был в Петербурге и видел там всех.
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can use it to augment your OCR training pipeline, evaluate model output, or build a transliteration API.&lt;/p&gt;

&lt;h3&gt;
  
  
  A real example
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvaigswkr596grybitf7o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvaigswkr596grybitf7o.png" alt="Old Russian orthography"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;(imagine an old Russian page here – typefaces, &lt;code&gt;ѣ&lt;/code&gt;, &lt;code&gt;і&lt;/code&gt;, the whole vibe)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Corresponding ground truth:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;7

вамъ это происшествіе со всѣми должными приправами: съ непритворнымъ ужасомъ на лицѣ, въ глазахъ; съ содроганіемъ; съ восклицаніями и, наконецъ, съ поднятіемъ рукъ къ Небу!… Вы увидите какъ это послѣднее тѣлодвиженіе картинно въ немъ.»
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Notice the &lt;code&gt;ъ&lt;/code&gt; at the end of words, the &lt;code&gt;ѣ&lt;/code&gt; in «небе», the `і» in «происшествіе». This is what your OCR model needs to learn.&lt;/p&gt;

&lt;h3&gt;
  
  
  What can you build?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Specialised OCR&lt;/strong&gt; for historical Russian documents (archives, old newspapers, diaries)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Old‑to‑modern transliteration service&lt;/strong&gt; (like &lt;code&gt;prereform2modern&lt;/code&gt; on steroids)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Evaluation benchmark&lt;/strong&gt; for any OCR engine claiming to support pre‑reform Russian&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Synthetic data generator&lt;/strong&gt; – convert the ground truth back to old orthography and render different fonts&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Get started in 30 seconds
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;&lt;code&gt;bash&lt;br&gt;
git clone https://huggingface.co/datasets/nevmenandr/russian-old-orthography-ocr&lt;br&gt;
cd russian-old-orthography-ocr&lt;br&gt;
ls books-pdf-plaintext/pdf    # pick a PDF&lt;br&gt;
ls pages-img-plaintext        # or a PNG+txt pair&lt;br&gt;
&lt;/code&gt;&lt;code&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Then pair each image with its text, train your model, and watch it learn to read like a 19th‑century typesetter.&lt;/p&gt;

&lt;h3&gt;
  
  
  Let’s talk
&lt;/h3&gt;

&lt;p&gt;Have you worked with historical languages in OCR? Ever fought with pre‑reform Russian? Drop a comment below – I’d love to hear your stories, ideas, or questions. And if you find the dataset useful, share this post so others can discover it too.&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://huggingface.co/datasets/nevmenandr/russian-old-orthography-ocr" rel="noopener noreferrer"&gt;Dataset on Hugging Face&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
👉 &lt;strong&gt;&lt;a href="https://pypi.org/project/prereform2modern/" rel="noopener noreferrer"&gt;prereform2modern on PyPI&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Happy (old) reading! 📖👓&lt;/p&gt;

</description>
      <category>ocr</category>
      <category>nlp</category>
      <category>dataset</category>
      <category>russian</category>
    </item>
    <item>
      <title>🧠 I Trained a Massive Word2Vec Model on 13 Billion Russian Fiction Words — Here’s What Happened</title>
      <dc:creator>Boris Orekhov</dc:creator>
      <pubDate>Mon, 07 Sep 2026 06:14:00 +0000</pubDate>
      <link>https://dev.to/nevmenandr/i-trained-a-massive-word2vec-model-on-13-billion-russian-fiction-words-heres-what-happened-3m63</link>
      <guid>https://dev.to/nevmenandr/i-trained-a-massive-word2vec-model-on-13-billion-russian-fiction-words-heres-what-happened-3m63</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; I built a lemma‑based Word2Vec model (CBOW, 300d) on a huge corpus of Russian fiction (13B tokens → 7.3B after cleaning). You can load it with Gensim and explore semantic neighborhoods of words like &lt;em&gt;слово&lt;/em&gt;, &lt;em&gt;язык&lt;/em&gt;, &lt;em&gt;речь&lt;/em&gt;. The model captures literary semantics without stop words or grammar tags. Check it out on &lt;a href="https://huggingface.co/nevmenandr/w2v-russian-fiction" rel="noopener noreferrer"&gt;Hugging Face&lt;/a&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why another word2vec for Russian?
&lt;/h2&gt;

&lt;p&gt;Most pre‑trained Russian word2vec models are trained on web crawls, news, or mixed corpora. That’s fine for general NLP, but &lt;strong&gt;fiction has its own semantic rules&lt;/strong&gt;. Poetic metaphors, archaic vocabulary, and author‑specific styles shift vector spaces.&lt;/p&gt;

&lt;p&gt;I wanted a model that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is trained &lt;strong&gt;exclusively on fiction&lt;/strong&gt; (from classic to modern authors).&lt;/li&gt;
&lt;li&gt;Uses &lt;strong&gt;lemmas&lt;/strong&gt; (no inflection noise).&lt;/li&gt;
&lt;li&gt;Is small enough to ship (197 MB for the main model, plus two 5.8 GB arrays).&lt;/li&gt;
&lt;li&gt;Lets researchers and developers play with &lt;strong&gt;literary semantics&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So I built one. And I’m sharing it under the MIT license.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Corpus by Numbers
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Raw words before preprocessing&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;13.98 B&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;After lemmatization &amp;amp; stop‑word removal&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;7.36 B&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sentences (after cleaning short ones)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1.36 B&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Paragraphs processed&lt;/td&gt;
&lt;td&gt;~539 M&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Stop words:&lt;/strong&gt; removed using &lt;a href="https://github.com/nevmenandr/DigitalHumanitiesMinorFeatures/blob/master/stop_ru.txt" rel="noopener noreferrer"&gt;this list&lt;/a&gt;.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Lemmatizer:&lt;/strong&gt; Yandex Mystem.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Sentence splitter:&lt;/strong&gt; &lt;code&gt;razdel.sentenize&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;All lemmas are &lt;strong&gt;lowercase&lt;/strong&gt;, dictionary form, no part‑of‑speech tags (saves time &amp;amp; space).&lt;/p&gt;


&lt;h2&gt;
  
  
  Training Details
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;gensim&lt;/span&gt;

&lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gensim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;word2vec&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;LineSentence&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;splitted_lemmed_lines.txt&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gensim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Word2Vec&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;vector_size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;min_count&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;sg&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;          &lt;span class="c1"&gt;# CBOW (faster, good for large corpora)
&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;save&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;cbow_300_10.model&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;CBOW&lt;/strong&gt;, not skip‑gram – slightly better syntactic capture for fiction.&lt;/li&gt;
&lt;li&gt;Window size 10 – balances local and long‑range dependencies.&lt;/li&gt;
&lt;li&gt;Min count 2 – very rare words become noise; keep it clean.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The training script is plain Gensim – no weird dependencies. You can retrain or fine‑tune if you have more data.&lt;/p&gt;


&lt;h2&gt;
  
  
  What’s Inside the Download?
&lt;/h2&gt;

&lt;p&gt;When you clone from Hugging Face, you get:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;cbow_300_10.model&lt;/code&gt; (197 MB) – the main Gensim model object
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;cbow_300_10.model.syn1neg.npy&lt;/code&gt; (5.8 GB) – negative sampling weights
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;cbow_300_10.model.wv.vectors.npy&lt;/code&gt; (5.8 GB) – the actual word vectors
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;README.md&lt;/code&gt;, &lt;code&gt;tst.py&lt;/code&gt; – docs and a test script&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Yes, the two &lt;code&gt;.npy&lt;/code&gt; files are large. But you can load the model without loading both if you only need similarities (Gensim does lazy loading). Or use &lt;code&gt;model.wv&lt;/code&gt; directly.&lt;/p&gt;


&lt;h2&gt;
  
  
  Quick Start – Get Similar Words
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;gensim&lt;/span&gt;

&lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gensim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Word2Vec&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cbow_300_10.model&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Look at closest neighbours of "слово" (word)
&lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;word&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;score&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;wv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;most_similar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;слово&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;topn&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;word&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;score&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;фраза: 0.7941
словечко: 0.6602
слог: 0.6322
реплика: 0.6015
словосочетание: 0.5928
изречение: 0.5818
высказывание: 0.5800
глагол: 0.5735
эпитет: 0.5615
сентенция: 0.5556
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Notice how &lt;em&gt;epithet&lt;/em&gt; and &lt;em&gt;verb&lt;/em&gt; pop up – the model clearly learned linguistic meta‑concepts from fiction.&lt;/p&gt;

&lt;p&gt;Now try &lt;code&gt;язык&lt;/code&gt; (language / tongue):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;наречие (adverb) 0.6684
диалект 0.6095
латынь 0.5892
язычок (little tongue) 0.5698
алфавит 0.5039
грамматика 0.5027
суахили 0.4977
идиома 0.4952
иврит 0.4950
произношение 0.4927
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And &lt;code&gt;речь&lt;/code&gt; (speech):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;монолог 0.6400
спич 0.5914
тирада 0.5900
фраза 0.5652
диалог 0.5477
проповедь 0.5334
слово 0.5217
разглагольствование 0.5193
филиппика 0.5184
декламация 0.5147
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Cool Things You Can Do
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Author style analysis&lt;/strong&gt; – Compare vector spaces of Tolstoy vs. modern authors.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Semantic change over time&lt;/strong&gt; – Not directly, but you can train separate models for 19th and 20th century subsets.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Genre classification&lt;/strong&gt; – Fiction vs. non‑fiction (though this model is pure fiction, so it will be biased).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Creative writing tools&lt;/strong&gt; – Find thematic associations, generate metaphor candidates.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Educational&lt;/strong&gt; – Show how word geometry reflects literary concepts.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Known Limitations (Read Before You Complain)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No POS tags&lt;/strong&gt; – All lemmas are ambiguous (e.g., &lt;code&gt;стекло&lt;/code&gt; could be noun “glass” or past tense of “to flow”). That’s a conscious trade‑off for performance.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Only lemmas&lt;/strong&gt; – No inflected forms. Want &lt;code&gt;слова&lt;/code&gt;, &lt;code&gt;слову&lt;/code&gt;, &lt;code&gt;словом&lt;/code&gt;? You won’t find them; use the lemma &lt;code&gt;слово&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fiction bias&lt;/strong&gt; – This model will perform poorly on legal documents, tweets, or technical manuals. But that’s the point.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Large memory footprint&lt;/strong&gt; – The full model takes ~12 GB on disk. However, you can load just the vectors with &lt;code&gt;KeyedVectors.load()&lt;/code&gt; to save RAM.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Comparison with Other Russian Word2Vec Models
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Corpus&lt;/th&gt;
&lt;th&gt;Size&lt;/th&gt;
&lt;th&gt;POS&lt;/th&gt;
&lt;th&gt;Availability&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;This one&lt;/td&gt;
&lt;td&gt;Fiction, 13B words&lt;/td&gt;
&lt;td&gt;300d&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;MIT, HF&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://huggingface.co/nevmenandr/w2v-russian-tolstoy" rel="noopener noreferrer"&gt;w2v-russian-tolstoy&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Only Tolstoy&lt;/td&gt;
&lt;td&gt;300d&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;MIT, HF&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://huggingface.co/dhcloud/w2v-russian-19c-fiction-lemmas" rel="noopener noreferrer"&gt;w2v-russian-19c-fiction-lemmas&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;19th century prose&lt;/td&gt;
&lt;td&gt;300d&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;HF&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RusVectores (web+news)&lt;/td&gt;
&lt;td&gt;Mixed, ~20B&lt;/td&gt;
&lt;td&gt;300d&lt;/td&gt;
&lt;td&gt;Yes (tags)&lt;/td&gt;
&lt;td&gt;CC BY‑SA&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If you need a &lt;strong&gt;general‑purpose&lt;/strong&gt; model with grammatical info, go for RusVectores. If you work with &lt;strong&gt;literary analysis&lt;/strong&gt;, this one is your friend.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why You Should Star / Share / Fork
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;📦 &lt;strong&gt;Ready to use&lt;/strong&gt; – &lt;code&gt;pip install gensim&lt;/code&gt; and &lt;code&gt;model = gensim.models.Word2Vec.load(...)&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;🧪 &lt;strong&gt;Reproducible&lt;/strong&gt; – Full preprocessing script included in the HF repo.&lt;/li&gt;
&lt;li&gt;📚 &lt;strong&gt;Academically referenced&lt;/strong&gt; – Several papers already used it (see README).&lt;/li&gt;
&lt;li&gt;🚀 &lt;strong&gt;Lightweight core&lt;/strong&gt; – The 197 MB model loads in seconds; the big &lt;code&gt;.npy&lt;/code&gt; files are optional.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Get the Model
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Hugging Face:&lt;/strong&gt; &lt;a href="https://huggingface.co/nevmenandr/w2v-russian-fiction" rel="noopener noreferrer"&gt;nevmenandr/w2v-russian-fiction&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;License:&lt;/strong&gt; MIT  &lt;/p&gt;

&lt;p&gt;Clone with &lt;code&gt;git lfs&lt;/code&gt; or download via &lt;code&gt;huggingface_hub&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;huggingface_hub&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;snapshot_download&lt;/span&gt;
&lt;span class="nf"&gt;snapshot_download&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;repo_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;nevmenandr/w2v-russian-fiction&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;local_dir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;./w2v_model&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  What I’d Love to See in the Comments
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;🧩 &lt;strong&gt;Use cases&lt;/strong&gt; – Are you doing computational literary studies? Building a Russian story generator? Tell me!&lt;/li&gt;
&lt;li&gt;🐛 &lt;strong&gt;Issues / improvements&lt;/strong&gt; – Did you find a bug? A word that should be a lemma but isn’t?&lt;/li&gt;
&lt;li&gt;📊 &lt;strong&gt;Benchmarks&lt;/strong&gt; – How does it perform on your task compared to other models?&lt;/li&gt;
&lt;li&gt;🧠 &lt;strong&gt;Funny analogies&lt;/strong&gt; – Run &lt;code&gt;model.most_similar(positive=['царь', 'женщина'], negative=['мужчина'])&lt;/code&gt; and share the result. (Hint: it’s not “царица” – fiction is weird.)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Final Code Snippet – Try It Yourself
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;gensim&lt;/span&gt;

&lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gensim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Word2Vec&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cbow_300_10.model&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Find words similar to "поэт" (poet)
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Neighbors of поэт:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;wv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;most_similar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;поэт&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;topn&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;  &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Analogy: Москва : Россия = Париж : ?
&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;wv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;most_similar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;positive&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Франция&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Москва&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;negative&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Россия&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;topn&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;Москва / Россия ≈ Париж / &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; (score &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run it. Play with it. Break it. Then tell me in the comments what you found.  &lt;/p&gt;

&lt;p&gt;Happy vector hunting! 🧙‍♂️&lt;/p&gt;




&lt;p&gt;&lt;em&gt;P.S. The model is called &lt;code&gt;cbow_300_10.model&lt;/code&gt; – old‑school name, but it works like a charm.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>word2vec</category>
      <category>russian</category>
      <category>nlp</category>
      <category>gensim</category>
    </item>
    <item>
      <title>How I Ended Up Publishing My Coding Journey – and Why CoderLegion Made It Worthwhile</title>
      <dc:creator>Boris Orekhov</dc:creator>
      <pubDate>Tue, 01 Sep 2026 22:50:00 +0000</pubDate>
      <link>https://dev.to/nevmenandr/how-i-ended-up-publishing-my-coding-journey-and-why-coderlegion-made-it-worthwhile-3ood</link>
      <guid>https://dev.to/nevmenandr/how-i-ended-up-publishing-my-coding-journey-and-why-coderlegion-made-it-worthwhile-3ood</guid>
      <description>&lt;p&gt;A few weeks ago, I received an unexpected message.&lt;/p&gt;

&lt;p&gt;It came from the CoderLegion community team. They'd noticed my engagement on the site and asked if I'd be interested in sharing my programming journey as part of their "Developer Stories" series.&lt;/p&gt;

&lt;p&gt;My first reaction? Skepticism, if I'm honest. I've been around long enough to know how these things usually go. Platforms reach out, they promise visibility, they ask for content, and then... crickets. Your carefully written piece gets buried under an avalanche of "10 JavaScript Tips You Won't Believe" and disappears into the void.&lt;/p&gt;

&lt;p&gt;But something about their approach felt different. They were direct, genuine, and – most importantly – they'd actually read what I'd written before reaching out. That's rarer than you'd think.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;"But I'm not a real developer"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I felt I should be upfront. I replied that I'm not a professional software engineer – I'm a researcher, a scientist, a humanities guy who learned to code out of necessity. My code has never been production-grade, I've cut more corners than I care to admit, and my early work still makes me wince in hindsight.&lt;/p&gt;

&lt;p&gt;Would that kind of story still be of interest?&lt;/p&gt;

&lt;p&gt;Their response was immediate and unequivocal: "Absolutely."&lt;/p&gt;

&lt;p&gt;No gatekeeping. No "well, let's see if it fits our editorial direction." Just a straightforward recognition that a researcher's pragmatic, messy, real-world coding journey might actually be &lt;em&gt;more&lt;/em&gt; relatable than another polished success story from a FAANG engineer.&lt;/p&gt;

&lt;p&gt;That was the moment I decided to say yes.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;From philology to Python – and everything in between&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I wrote the piece over a couple of days. It wasn't difficult – the memories came flooding back. PHP without templates, Perl without &lt;code&gt;use strict;&lt;/code&gt;, Python without a debugger, all held together with hope and &lt;code&gt;echo&lt;/code&gt; statements. My "server" was shared hosting that ran CGI scripts, and my "database" was a handful of MySQL tables that today I'd replace with a JSON file.&lt;/p&gt;

&lt;p&gt;The story wrote itself, really.&lt;/p&gt;

&lt;p&gt;When I sent it over, I braced myself for edits, rewrites, or the dreaded "this is great, but could you make it more technical?" None of that happened. &lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Why CoderLegion stands out&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Now that the piece is live, I want to share a few thoughts about the platform itself – because it genuinely deserves attention.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. It's a small community, and that's a good thing&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Platforms like DEV.to have become enormous. That's great for reach, but it also means your carefully crafted post competes with thousands of others. Unless you're writing about the latest JavaScript framework or AI trend, you're shouting into the void.&lt;/p&gt;

&lt;p&gt;On CoderLegion, the community is smaller, but the engagement feels more genuine. My posts there get modest view counts – but they're still &lt;em&gt;several times higher&lt;/em&gt; than on DEV.to. People actually read, reflect, and respond. It reminds me of the early internet, where community meant something.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. They treat contributors like humans, not content factories&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is the big one. The person who reached out didn't just send a template email and move on. They read my work, understood its value, and engaged in a thoughtful, personal conversation throughout the entire process. The editorial support was light-touch but effective – they helped my story shine without making it theirs.&lt;/p&gt;

&lt;p&gt;Too many platforms treat contributors as interchangeable content providers. CoderLegion doesn't.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. They allow republishing&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This might seem like a small thing, but it matters. CoderLegion permits authors to share content that's already appeared elsewhere. I haven't taken advantage of it yet, but knowing that I &lt;em&gt;can&lt;/em&gt; – without being locked into exclusivity – lowers the barrier to participation significantly. It's a flexible, author-friendly policy that respects your time and effort.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;What I'd tell other developers&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you're considering sharing your journey, here's my advice: don't overthink it.&lt;/p&gt;

&lt;p&gt;You don't need to be a rockstar developer. You don't need to have built the next unicorn startup or contributed to major open-source projects. Your story – with all its false starts, bad habits, and lessons learned the hard way – is probably &lt;em&gt;more&lt;/em&gt; valuable than you realise. Because somewhere out there, someone is making the same mistakes you did, and they'd benefit from hearing that it's okay.&lt;/p&gt;

&lt;p&gt;Platforms like CoderLegion exist precisely to tell those stories.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Final thoughts&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The piece went live recently, and I've already shared it with my Telegram audience. The response has been warm – several fellow researchers and self-taught coders reached out to say they saw themselves in the narrative.&lt;/p&gt;

&lt;p&gt;That's the whole point, isn't it? To connect, to reassure, to remind each other that we're all figuring it out as we go.&lt;/p&gt;

&lt;p&gt;So here's my public thank-you to the CoderLegion team. Thank you for reaching out, for trusting my story, for handling it with care, and for building a space where imperfect journeys are welcomed.&lt;/p&gt;

&lt;p&gt;I'll be writing more about the experience on DEV.to soon – but for now, if you're curious, here's the piece itself:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://coderlegion.com/25394/from-philology-to-python-how-i-fell-into-coding-and-why-my-code-still-makes-me-wince" rel="noopener noreferrer"&gt;https://coderlegion.com/25394/from-philology-to-python-how-i-fell-into-coding-and-why-my-code-still-makes-me-wince&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;And to anyone reading this: if you have a story to tell, tell it. You might be surprised who listens.&lt;/p&gt;

</description>
      <category>coderlegion</category>
      <category>developerstories</category>
      <category>selftaught</category>
      <category>programmingjourney</category>
    </item>
    <item>
      <title>How to Actually Determine Authorship with a Computer (And Why Most People Get It Wrong)</title>
      <dc:creator>Boris Orekhov</dc:creator>
      <pubDate>Thu, 27 Aug 2026 05:56:00 +0000</pubDate>
      <link>https://dev.to/nevmenandr/how-to-actually-determine-authorship-with-a-computer-and-why-most-people-get-it-wrong-513p</link>
      <guid>https://dev.to/nevmenandr/how-to-actually-determine-authorship-with-a-computer-and-why-most-people-get-it-wrong-513p</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Most “computer‑based” author attribution you see on the internet is junk. Average word length? TF‑IDF + cosine similarity? Please. There’s a method that actually works – it’s called &lt;strong&gt;Delta&lt;/strong&gt;, it’s 20 years old, and you can run it with a few clicks in R. Let me show you why the naive approaches fail and how real stylometry is done.&lt;/p&gt;




&lt;h3&gt;
  
  
  The problem with “obvious” methods
&lt;/h3&gt;

&lt;p&gt;We’ve all seen it: someone grabs a few texts, computes average word distribution or most frequent words, draws a pretty line chart, and declares they can tell who wrote what.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Spoiler:&lt;/strong&gt; they can’t.&lt;/p&gt;

&lt;p&gt;A famous example – in 2018, a data scientist tried to identify the anonymous &lt;em&gt;New York Times&lt;/em&gt; op‑ed “I Am Part of the Resistance Inside the Trump Administration”. He used TF‑IDF on Trump administration members’ tweets, computed cosine similarity, and concluded… the most likely author was Trump himself (or someone from State Department).  Not very convicing.&lt;/p&gt;

&lt;p&gt;That’s not science – that’s cargo‑cult data analysis.&lt;/p&gt;

&lt;p&gt;Even worse, a 2023 book &lt;em&gt;Python for Hackers&lt;/em&gt; dedicates a whole chapter to stylometry, yet it uses &lt;strong&gt;average word length&lt;/strong&gt; and plots line charts copied from 19th‑century geophysicist Thomas Mendenhall. Yes, the same Mendenhall who thought word‑length distributions would work like spectral analysis of chemical elements.  &lt;/p&gt;

&lt;p&gt;Spoiler: they don’t. Grzybek (2007) already buried that idea.&lt;/p&gt;

&lt;p&gt;So if those methods are garbage, what actually works?&lt;/p&gt;




&lt;h3&gt;
  
  
  Enter John Burrows and the Delta method (2002)
&lt;/h3&gt;

&lt;p&gt;Burrows proposed a surprisingly simple distance measure between texts – &lt;strong&gt;Delta&lt;/strong&gt;. It uses only the 100–500 &lt;strong&gt;most frequent words&lt;/strong&gt; (mostly function words like “the”, “and”, “of” – not content words). That’s genius, because it ignores topic and focuses on style.&lt;/p&gt;

&lt;p&gt;Here’s the intuition:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;For each text, compute the relative frequency of each frequent word.&lt;/li&gt;
&lt;li&gt;Convert to &lt;strong&gt;z‑scores&lt;/strong&gt; (how many standard deviations above/below the corpus average).&lt;/li&gt;
&lt;li&gt;Delta between two texts = mean absolute difference of their z‑scores across all words.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Small Delta → stylistically similar → probably same author.&lt;/p&gt;

&lt;p&gt;No neural networks. No thousands of parameters. Just robust statistics.&lt;/p&gt;

&lt;p&gt;And it works. On English, Russian, Arabic, Ancient Greek, even Chinese (yes, despite no clear word boundaries). Nobody knows exactly &lt;em&gt;why&lt;/em&gt; – but it has been validated on hundreds of test cases.&lt;/p&gt;




&lt;h3&gt;
  
  
  How to run it without writing a single line of R
&lt;/h3&gt;

&lt;p&gt;There’s an R package called &lt;strong&gt;&lt;code&gt;stylo&lt;/code&gt;&lt;/strong&gt; (Kestemont et al., 2016). It has a point‑and‑click GUI.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight r"&gt;&lt;code&gt;&lt;span class="n"&gt;install.packages&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'stylo'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;library&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stylo&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;stylo&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="c1"&gt;# GUI opens&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxo8irxbpnfv6tgxk7ywi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxo8irxbpnfv6tgxk7ywi.png" alt="Stylo" width="800" height="496"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You put your texts in a folder named &lt;code&gt;corpus&lt;/code&gt;. Name files like &lt;code&gt;author_title.txt&lt;/code&gt; – &lt;code&gt;stylo&lt;/code&gt; automatically colors by author in the output.&lt;/p&gt;

&lt;p&gt;It produces a dendrogram (cluster tree). If the method works, texts by the same author cluster together.&lt;/p&gt;

&lt;p&gt;I tested 24 Russian prose texts (Lermontov, Chekhov, Leskov, Gogol). One unknown text (“???”) was supposed to be by Leskov. Result: 23 out of 24 correctly clustered. Only one early Chekhov story drifted to Lermontov – because Delta is sensitive to author’s evolution over time.  &lt;/p&gt;

&lt;p&gt;The unknown text landed right with Leskov.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpx1n9cyq23ke3fhddvo8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpx1n9cyq23ke3fhddvo8.png" alt="Cluster dendrogram" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Not perfect – but far better than random guessing.&lt;/p&gt;




&lt;h3&gt;
  
  
  Case studies that (sort of) worked
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Rowling / Galbraith (2013)
&lt;/h4&gt;

&lt;p&gt;When J.K. Rowling published &lt;em&gt;The Cuckoo’s Calling&lt;/em&gt; as “Robert Galbraith”, stylometrists quickly identified her as the author. Rowling later confessed. A model case, right?&lt;/p&gt;

&lt;p&gt;Well… &lt;code&gt;stylo&lt;/code&gt; includes a &lt;code&gt;galbraith&lt;/code&gt; dataset. I ran it. The data are hand‑picked: authors from different centuries and genres, making Rowling stand out artificially. A more honest test? Still works, but less dramatic. &lt;strong&gt;Always question your benchmark.&lt;/strong&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  The Quiet Don (Sholokhov)
&lt;/h4&gt;

&lt;p&gt;The famous Russian novel has been suspected to be plagiarised from Fyodor Kryukov. Delta analysis (using 100+ texts) shows:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It’s &lt;strong&gt;not&lt;/strong&gt; Kryukov.
&lt;/li&gt;
&lt;li&gt;“Don Stories” (signed Sholokhov) and “The Quiet Don” cluster together → same author.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Politics aside, the data are clear.&lt;/p&gt;

&lt;h4&gt;
  
  
  Bitcoin white paper (Satoshi Nakamoto)
&lt;/h4&gt;

&lt;p&gt;Here the method is &lt;strong&gt;abused&lt;/strong&gt;. The white paper has only ~3700 words – well below the recommended 10k+ minimum. Still, curious minds ran it: the paper clustered with &lt;strong&gt;Craig Wright&lt;/strong&gt;.  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4ovtvxh1i5pi480llkdg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4ovtvxh1i5pi480llkdg.png" alt="Satoshi Nakamoto" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Should you trust that? Absolutely not. But it’s fun.&lt;/p&gt;




&lt;h3&gt;
  
  
  Where Delta breaks (and why you should care)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Different genres&lt;/strong&gt; – comparing a play to a novel makes no sense. Remove the play.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Theological texts&lt;/strong&gt; – for unknown reasons, Delta often fails on religious writings. Atheist algorithm?
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Short texts&lt;/strong&gt; (&amp;lt; 10,000 words) – too noisy. Don’t even try.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Authors who change style radically&lt;/strong&gt; – early vs. late Chekhov can look like different people.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So it’s not magic. But when used correctly, it’s the best we have.&lt;/p&gt;




&lt;h3&gt;
  
  
  For the curious programmer
&lt;/h3&gt;

&lt;p&gt;If you want to dig deeper:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Burrows, J. F. (2002). &lt;em&gt;Delta: A Measure of Stylistic Difference&lt;/em&gt;.
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;stylo&lt;/code&gt; package: &lt;a href="https://github.com/computationalstylistics/stylo" rel="noopener noreferrer"&gt;https://github.com/computationalstylistics/stylo&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;My colleague’s visualisation (better than dendrograms): distributions of intra‑author vs inter‑author distances.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F73k1nh10c6qu5d0y46o8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F73k1nh10c6qu5d0y46o8.png" alt="better than dendrograms" width="592" height="482"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And a fascinating book: &lt;em&gt;Passwords: Philology, Security, Authentication&lt;/em&gt; by B. Lennon (2018) – it traces the common roots of cryptography and stylometry. The first US crypto‑analysis unit hired… English professors who argued over Shakespeare’s authorship.&lt;/p&gt;




&lt;h3&gt;
  
  
  Final verdict
&lt;/h3&gt;

&lt;p&gt;Next time someone shows you a line chart of average word lengths to “prove” who wrote something, send them this post. Real authorship attribution is harder – but also more reliable when you use proper methods like Delta.&lt;/p&gt;

&lt;p&gt;And remember: if the text is shorter than 10,000 words, just walk away. No method can save you.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Try it yourself:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Download a few texts by two different authors (&amp;gt;10k words each), name them &lt;code&gt;author1_title.txt&lt;/code&gt;, run &lt;code&gt;stylo()&lt;/code&gt;, and see if they separate. You’ll be surprised how well it works.&lt;/p&gt;

</description>
      <category>stylometry</category>
      <category>authorship</category>
      <category>attribution</category>
      <category>delta</category>
    </item>
    <item>
      <title>Chess plays as data for word2vec models</title>
      <dc:creator>Boris Orekhov</dc:creator>
      <pubDate>Mon, 17 Aug 2026 05:42:00 +0000</pubDate>
      <link>https://dev.to/nevmenandr/chess-plays-as-data-for-word2vec-models-1pgn</link>
      <guid>https://dev.to/nevmenandr/chess-plays-as-data-for-word2vec-models-1pgn</guid>
      <description>&lt;h2&gt;
  
  
  ♟️ You shall know a piece by the company it keeps
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;em&gt;Chess plays as data for word2vec models&lt;/em&gt;
&lt;/h3&gt;

&lt;p&gt;Programmers, have you ever looked at a PGN file and thought: &lt;em&gt;this looks like a language&lt;/em&gt;?&lt;br&gt;&lt;br&gt;
What if we trained word2vec on 5.4 million chess games, treating each move as a &lt;strong&gt;word&lt;/strong&gt; and each game as a &lt;strong&gt;sentence&lt;/strong&gt;? Would the vectors capture anything about chess strategy? Or would it be nonsense?&lt;/p&gt;

&lt;p&gt;I asked exactly that. And the results are surprisingly… meaningful.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;🔗 Original preprint: &lt;a href="https://arxiv.org/abs/2407.19600" rel="noopener noreferrer"&gt;arXiv:2407.19600&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h3&gt;
  
  
  🧩 The core idea
&lt;/h3&gt;

&lt;p&gt;Word2vec relies on the &lt;strong&gt;distributional hypothesis&lt;/strong&gt;: a word’s meaning is defined by its context (neighbouring words).&lt;br&gt;&lt;br&gt;
Orekhov’s move: apply the same to chess moves.&lt;/p&gt;

&lt;p&gt;He built &lt;strong&gt;18 different models&lt;/strong&gt; from a corpus of ~5.4M high‑level games (≈840M moves).&lt;br&gt;&lt;br&gt;
Two main approaches:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Type 1&lt;/strong&gt; – moves only (each move = a word, game = sentence)
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Type 2&lt;/strong&gt; – moves + board state (each “sentence” = current position + the move)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then: train word2vec (skip‑gram / CBOW), get dense vectors (300‑500 dims), and run the usual NLP tricks – nearest neighbours, odd‑one‑out, analogies, t‑SNE visualisations.&lt;/p&gt;


&lt;h3&gt;
  
  
  🔍 What the model learned (without ever seeing a board)
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Test&lt;/th&gt;
&lt;th&gt;Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Quasi‑synonyms&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Closest vectors to &lt;code&gt;Pe2e4&lt;/code&gt; are &lt;code&gt;Pe2e3&lt;/code&gt;, &lt;code&gt;Ng1f3&lt;/code&gt;, &lt;code&gt;Pd2d4&lt;/code&gt; – exactly what you’d expect.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Odd one out&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;[Pe2e4, Ng1f3, Pd2d4, Bf1c4, Nb1c3, Pb4b5]&lt;/code&gt; → &lt;code&gt;Pb4b5&lt;/code&gt; is flagged (edge pawn move, rarely an opening).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Analogies&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;king - man + woman ≈ queen&lt;/code&gt; for words. For chess: &lt;code&gt;Pe2e4 - Pf2f4 + pe7e5&lt;/code&gt; suggests &lt;code&gt;pe7e6&lt;/code&gt; (French Defence). Works.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Castling detection&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;Ke1g1&lt;/code&gt; (short castling) → closest vectors include &lt;code&gt;Rh1f1&lt;/code&gt; and &lt;code&gt;Ke1c1&lt;/code&gt;. The model learned that king and rook move together.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Endgame clusters&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;t‑SNE shows extremely clean, piece‑separated clusters. Openings are messy (all similar).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Bishop colour&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Light‑squared and dark‑squared bishops form &lt;strong&gt;different clusters&lt;/strong&gt; – the model learned chess‑relevant semantics.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Captures as “POS tags”&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Adding &lt;code&gt;_CAP&lt;/code&gt; / &lt;code&gt;_N&lt;/code&gt; made moves cluster by &lt;strong&gt;destination square&lt;/strong&gt; instead of source piece. A new kind of “part of speech” for chess.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;📊 Over 68% of moves have at least 3 of their 10 nearest neighbours being the &lt;strong&gt;same piece moving to the same square&lt;/strong&gt;. That’s not random – it’s structural.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h3&gt;
  
  
  🤯 The most beautiful visualisation
&lt;/h3&gt;

&lt;p&gt;The model trained on &lt;strong&gt;games without queens&lt;/strong&gt; produced a perfectly &lt;strong&gt;symmetric&lt;/strong&gt; t‑SNE plot – white moves on one side, black moves mirrored.&lt;br&gt;&lt;br&gt;
The algorithm had no concept of “colour” as a feature. Yet the distributional signal was so strong that the two colour spaces separated like antipodal points on a sphere.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo4rf9yqk20dgxea4z5tp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo4rf9yqk20dgxea4z5tp.png" alt="tSNE visualisation of the moves from the endgame_moves_black.model with perplexity 30" width="765" height="439"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h3&gt;
  
  
  ⚠️ The honest conclusion (refreshing for a paper)
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;“I don't see how this representation can be used productively. It's unlikely to help engines or humans choose the best move. But in a purely academic sense, it captures something important about the nature of the game.”&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;No overhyped “this will revolutionise chess AI”. Just a clean, curious application of NLP to a symbolic system – and it works.&lt;/p&gt;


&lt;h3&gt;
  
  
  🧰 For the hacker’s toolbox
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;All models are &lt;strong&gt;public on HuggingFace&lt;/strong&gt;: &lt;a href="https://huggingface.co/nevmenandr/w2v-chess" rel="noopener noreferrer"&gt;nevmenandr/w2v-chess&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Code &amp;amp; data: PGN corpus of 5.4M games (freely available online)&lt;/li&gt;
&lt;li&gt;Techniques used: word2vec, t‑SNE, cosine distance, analogies, “stemming” (removing source square), part‑of‑speech tags for captures&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;
  
  
  📚 Cite this work
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;APA&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Orekhov, B. (2024). &lt;em&gt;You shall know a piece by the company it keeps. Chess plays as a data for word2vec models&lt;/em&gt;. arXiv preprint. &lt;a href="https://arxiv.org/abs/2407.19600" rel="noopener noreferrer"&gt;https://arxiv.org/abs/2407.19600&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;IEEE&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
B. Orekhov, “You shall know a piece by the company it keeps. Chess plays as a data for word2vec models,” 2024. [Online]. Available: arXiv:2407.19600&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MLA&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Orekhov, Boris. “You Shall Know a Piece by the Company It Keeps. Chess Plays as a Data for Word2vec Models.” arXiv, 2024, &lt;a href="https://arxiv.org/abs/2407.19600" rel="noopener noreferrer"&gt;https://arxiv.org/abs/2407.19600&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;BibTeX&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight bibtex"&gt;&lt;code&gt;&lt;span class="nc"&gt;@misc&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;orekhov2024shallknowpiececompany&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;{You shall know a piece by the company it keeps. Chess plays as a data for word2vec models}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
      &lt;span class="na"&gt;author&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;{Boris Orekhov}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;year&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;{2024}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;eprint&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;{2407.19600}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;archivePrefix&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;{arXiv}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;primaryClass&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;{cs.CL}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;{https://arxiv.org/abs/2407.19600}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;👉 &lt;em&gt;Would you run word2vec on Go games? Poker hands? Protein folding sequences? The method is language‑agnostic – and that’s the real lesson.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>word2vec</category>
      <category>chess</category>
      <category>nlp</category>
      <category>semantics</category>
    </item>
    <item>
      <title>Natural Languages vs. Programming Languages</title>
      <dc:creator>Boris Orekhov</dc:creator>
      <pubDate>Fri, 07 Aug 2026 05:30:00 +0000</pubDate>
      <link>https://dev.to/nevmenandr/natural-languages-vs-programming-languages-7gj</link>
      <guid>https://dev.to/nevmenandr/natural-languages-vs-programming-languages-7gj</guid>
      <description>&lt;h2&gt;
  
  
  Natural Languages vs. Programming Languages: Same Word, Different Worlds
&lt;/h2&gt;

&lt;p&gt;We call them both “languages” – but does a &lt;code&gt;for&lt;/code&gt; loop have anything in common with a love poem? Turns out, yes and no. And the differences are way more interesting than you might think.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Reason We Have Languages (Either Kind)
&lt;/h3&gt;

&lt;p&gt;Languages exist to pass information around. Human languages gave us tribes, then kingdoms, then sci-fi novels about interstellar travel – written centuries before anyone ever left Earth. That’s flexibility.&lt;/p&gt;

&lt;p&gt;Computers, on the other hand, speak &lt;strong&gt;machine code&lt;/strong&gt;: raw numbers and arithmetic operations. &lt;code&gt;BB 11 01&lt;/code&gt; means something to a CPU, but to a human? It’s a headache. So in the late 1950s, we invented programming languages – a human-readable middle layer that gets translated into machine code. That’s why you can write &lt;code&gt;if user.is_active:&lt;/code&gt; instead of pushing hex bytes around.&lt;/p&gt;

&lt;h3&gt;
  
  
  How Human Languages Lie (and Why Code Doesn’t)
&lt;/h3&gt;

&lt;p&gt;Russian says &lt;em&gt;“dождь идёт”&lt;/em&gt; – “the rain walks”. English says &lt;em&gt;“it rains”&lt;/em&gt; – “it rain-verbs”. French says &lt;em&gt;“il pleut”&lt;/em&gt;. None of them are true: there’s no walker, no “it”, just water falling from the sky. Human languages force reality into their own grammar.&lt;/p&gt;

&lt;p&gt;Machine code has zero such illusions. It’s brutally literal: &lt;em&gt;take this number, add that number, put the result there&lt;/em&gt;. No metaphors, no actors, no walking rain.&lt;/p&gt;

&lt;h3&gt;
  
  
  Low‑Level vs High‑Level – It’s Not a Class Thing
&lt;/h3&gt;

&lt;p&gt;“Low‑level” languages (like assembly) stay close to the machine – you tell the CPU every tiny step. “High‑level” languages (Python, JavaScript) let you say &lt;em&gt;“make it pretty, I don’t care how”&lt;/em&gt;. The naming reflects our narcissism: humans at the top, computers at the bottom.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Real Killer Difference: Narration vs Commands
&lt;/h3&gt;

&lt;p&gt;What do we do most with natural language? &lt;strong&gt;We tell stories.&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;I woke up dressed in an armchair,&lt;br&gt;&lt;br&gt;
In my own flat among familiar walls…&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Now try to write that in C. All you get are assertions: &lt;code&gt;I_am = dressed; I_am = awake; my_location = armchair;&lt;/code&gt; Clunky, right? Programming languages are built almost entirely for the &lt;strong&gt;imperative mood&lt;/strong&gt; – do this, go there, set that. They’re instruction manuals, not novels.&lt;/p&gt;

&lt;p&gt;Want to talk about the past? Good luck. Natural languages handle tense effortlessly. In code, the past doesn’t matter unless you explicitly store it. And concepts like “spiritual thirst” (Pushkin’s famous line) can’t be mapped to a variable – &lt;code&gt;thirst = 0&lt;/code&gt; is just an empty box, not a longing.&lt;/p&gt;

&lt;h3&gt;
  
  
  But People Still Write Poetry in Code
&lt;/h3&gt;

&lt;p&gt;Yes, really. There are &lt;strong&gt;esoteric languages&lt;/strong&gt; like &lt;em&gt;Shakespeare&lt;/em&gt;, where the source code looks like a Renaissance play. And people have written poems in Python and JavaScript – some for everyone, some for the elite few. The results are awkward, fascinating, and beautifully absurd.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bottom Line
&lt;/h3&gt;

&lt;p&gt;Both language families have words and grammar. But natural grammars are universal – they can describe anything from a rainy street to a broken heart. Programming grammars are narrow, laser‑focused on giving commands. One tells stories, the other gives orders. And that’s why you can’t &lt;code&gt;import&lt;/code&gt; a soul.&lt;/p&gt;

</description>
      <category>linguistics</category>
      <category>programming</category>
      <category>languages</category>
    </item>
    <item>
      <title>Chess &amp; Computer Tech Today – A Programmer’s Take</title>
      <dc:creator>Boris Orekhov</dc:creator>
      <pubDate>Mon, 27 Jul 2026 05:25:00 +0000</pubDate>
      <link>https://dev.to/nevmenandr/chess-computer-tech-today-a-programmers-take-2338</link>
      <guid>https://dev.to/nevmenandr/chess-computer-tech-today-a-programmers-take-2338</guid>
      <description>&lt;h2&gt;
  
  
  Chess &amp;amp; Computer Tech Today – A Programmer’s Take
&lt;/h2&gt;

&lt;p&gt;Remember when beating a human at chess was the holy grail of AI? In 1972, it was literally &lt;em&gt;the&lt;/em&gt; benchmark. Fast forward to today: a random office desktop crushes any grandmaster. Game over? Not even close.&lt;/p&gt;

&lt;p&gt;Chess didn’t die – it went full cyberpunk. And as a programmer who barely knows a fork from a fianchetto (my Lichess rating is ~800), I’ve become obsessed with how code reshaped this ancient game. Here’s what every dev should care about.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Analysis engines – the real MVP
&lt;/h3&gt;

&lt;p&gt;Every chess move today gets instantly judged by an engine. That little “thermometer” on stream? It’s a live eval bar. One blunder, and the score tanks from +2 to -3 – you &lt;em&gt;feel&lt;/em&gt; the drama.&lt;/p&gt;

&lt;p&gt;But here’s the fun part for us: I built &lt;strong&gt;vector models of chess games&lt;/strong&gt; using word2vec. Treating moves like words in a sentence. Preprint here: &lt;a href="https://arxiv.org/abs/2407.19600" rel="noopener noreferrer"&gt;arxiv.org/abs/2407.19600&lt;/a&gt;. Turns out, chess positions embed nicely into vector space. Who knew?&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Cheating – from SMS to… sex toys?
&lt;/h3&gt;

&lt;p&gt;Cheating in chess is not like doping. A single engine move at the right moment = game over. So offline tournaments scan players like airport security.&lt;/p&gt;

&lt;p&gt;But the real WTF moment: during the 2022 Carlsen–Niemann scandal, Elon Musk suggested Niemann might have received moves via a &lt;strong&gt;remote-controlled vibrating sex toy&lt;/strong&gt; hidden inside his body. Yes, seriously.&lt;/p&gt;

&lt;p&gt;And how would you encode a chess move without Bluetooth? French team at 2010 Olympiad used SMS + captain standing near imaginary chessboard squares. Programmers, think about it: you could encode a move with just 2 vibrations (source square, target square). Someone even wrote Python demo for that.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Online chess – pre-moves, flag-hunting, and lag
&lt;/h3&gt;

&lt;p&gt;Online blitz (3+0, 3+1) is a different beast. &lt;strong&gt;Premoves&lt;/strong&gt; let you queue your next move while opponent thinks. Click, and it executes instantly when their move arrives. No physical clock button. No “oops I dropped the knight”.&lt;/p&gt;

&lt;p&gt;But then you get &lt;strong&gt;flag-hunting&lt;/strong&gt; – players in losing positions spam premoves hoping the winner runs out of time. Old-school champ Kramnik calls it unethical. New generation says “it’s in the rules”.&lt;/p&gt;

&lt;p&gt;The ultimate test? A 2024 match between Kramnik (legend, hates flag-hunting) and Jospem (online phenom, suspected cheater). Half the games OTB, half online, same room back-to-back. Result: inconclusive. But the drama? Chef’s kiss. Also, organizers printed fresh laptops – Windows updates caused lag &lt;em&gt;only for one player&lt;/em&gt;. Conspiracy? Probably just Windows.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why it matters for devs
&lt;/h3&gt;

&lt;p&gt;Chess is no longer about “intelligence”. It’s about psychology, emotion, and… code. We built machines that play perfect chess, then humans kept playing anyway. Now we’re debating: does a premove change the nature of the game? Is online chess “real” chess? Can we detect cheaters from move statistics?&lt;/p&gt;

&lt;p&gt;These are &lt;em&gt;our&lt;/em&gt; questions – systems design, anomaly detection, real-time constraints, UI/UX of time controls.&lt;/p&gt;

&lt;p&gt;And the best part? No definitive answers. Just like software engineering.&lt;/p&gt;

</description>
      <category>chess</category>
      <category>ai</category>
      <category>programming</category>
      <category>game</category>
    </item>
  </channel>
</rss>
