<?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: Peter Abolins</title>
    <description>The latest articles on DEV Community by Peter Abolins (@peterabolins).</description>
    <link>https://dev.to/peterabolins</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%2F3885970%2F5f3eb978-3030-436c-96b0-a7da7fe1cda7.jpg</url>
      <title>DEV Community: Peter Abolins</title>
      <link>https://dev.to/peterabolins</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/peterabolins"/>
    <language>en</language>
    <item>
      <title>What /analyze actually returns for Romanian — and what it gets wrong</title>
      <dc:creator>Peter Abolins</dc:creator>
      <pubDate>Sun, 30 Aug 2026 15:06:51 +0000</pubDate>
      <link>https://dev.to/peterabolins/what-analyze-actually-returns-for-romanian-and-what-it-gets-wrong-2al9</link>
      <guid>https://dev.to/peterabolins/what-analyze-actually-returns-for-romanian-and-what-it-gets-wrong-2al9</guid>
      <description>&lt;p&gt;If you need Romanian morphology in production — lemma, part of speech, case, number, gender, person, tense, for arbitrary text — the first decision is not which tool to use, but what kind of answer you want back.&lt;/p&gt;

&lt;p&gt;A dictionary lookup is fast and predictable and, by construction, cannot use context: the same surface form gets the same answer wherever it appears. A hand-rolled rule set works until your corpus changes shape. A general-purpose model does use context, and answers as an oracle — you get a result, not a record of how it was reached, and no way to tell a lookup from a guess.&lt;/p&gt;

&lt;p&gt;LexicRo is a fourth shape: a hosted HTTP contract you can call without shipping a model yourself, that stamps the model version it answered with, and that tells you, per token, whether the answer came from a lexicon or from a prediction.&lt;/p&gt;

&lt;h2&gt;
  
  
  The thing context buys you
&lt;/h2&gt;

&lt;p&gt;Two Romanian sentences containing the identical word form &lt;code&gt;sare&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Pune sare în mâncare.   →  "Put salt in the food."
Pisica sare pe masă.    →  "The cat jumps on the table."
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;/analyze&lt;/code&gt; returns lemma &lt;code&gt;sare&lt;/code&gt;, UPOS &lt;code&gt;NOUN&lt;/code&gt; for the first, and lemma &lt;code&gt;sări&lt;/code&gt;, UPOS &lt;code&gt;VERB&lt;/code&gt; for the second. You do not need any Romanian to check that: the two lemmas are visibly different words. A dictionary lists both readings; only the sentence says which one you are looking at.&lt;/p&gt;

&lt;p&gt;The same holds for &lt;code&gt;port&lt;/code&gt;. In &lt;code&gt;un port mare&lt;/code&gt; — "a large harbour" — it is the noun &lt;code&gt;port&lt;/code&gt;. In &lt;code&gt;Eu port o cămașă&lt;/code&gt; — "I wear a shirt" — it is the verb &lt;code&gt;purta&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Every token says where its answer came from
&lt;/h2&gt;

&lt;p&gt;For each token, &lt;code&gt;/analyze&lt;/code&gt; returns lemma, UPOS, Universal Features, and a &lt;code&gt;source&lt;/code&gt; field carrying exactly one of three values: &lt;code&gt;lexicon&lt;/code&gt;, &lt;code&gt;suffix&lt;/code&gt;, &lt;code&gt;model&lt;/code&gt;. A lexicon hit, a suffix rule, or a prediction from the model.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;source&lt;/code&gt; is provenance, not confidence. The guide says so in its own words: &lt;em&gt;"&lt;code&gt;source&lt;/code&gt; is not a trust signal."&lt;/em&gt; A &lt;code&gt;model&lt;/code&gt; answer is not less trustworthy than a &lt;code&gt;lexicon&lt;/code&gt; one — it is a different kind of fact, arrived at a different way. When a lemma comes back wrong, the first question you have is which of those three produced it, and here that is a field to read rather than an investigation to run.&lt;/p&gt;

&lt;h2&gt;
  
  
  The readings it did not pick
&lt;/h2&gt;

&lt;p&gt;Where the lexicon knows more than one reading for a form, the response does not quietly pick one and drop the rest. It returns the competing readings in &lt;code&gt;candidates&lt;/code&gt;, alongside the one the model chose. About &lt;strong&gt;35.68%&lt;/strong&gt; of tokens in running text carry a &lt;code&gt;candidates&lt;/code&gt; list.&lt;/p&gt;

&lt;p&gt;If your pipeline needs to know a token was ambiguous — to flag it, to route it to a human — you can read that off the response instead of inferring it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you are pinned to
&lt;/h2&gt;

&lt;p&gt;Every response stamps &lt;code&gt;model_version&lt;/code&gt;. The weights, the lexicon snapshot and the MSD→UD conversion table version together as &lt;strong&gt;one unit&lt;/strong&gt;, and the engine itself is pinned by tag. So when you pin against a &lt;code&gt;model_version&lt;/code&gt;, you know exactly what you are pinned to, and a change to any of the three artefacts is a change to the version string you are reading.&lt;/p&gt;

&lt;p&gt;That is the mechanism, stated as a mechanism: it lets you build against a stated version rather than against whatever answered you today.&lt;/p&gt;

&lt;h2&gt;
  
  
  The second endpoint, and what it refuses to do
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;GET /conjugate/{verb}&lt;/code&gt; returns a verb's conjugation table: seven moods, &lt;code&gt;condițional&lt;/code&gt; included. The conditional is one LexicRo synthesises rather than one the upstream library ships, and the response says so — those forms carry &lt;code&gt;source: "derived"&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Conjugation itself comes from &lt;strong&gt;verbecc&lt;/strong&gt;, an open-source library that does a great deal of work across several languages. It also contains a contradiction worth walking through, because what the API does about it is the same argument as everything above.&lt;/p&gt;

&lt;p&gt;Take &lt;code&gt;a ninge&lt;/code&gt;, "to snow". Its &lt;code&gt;indicativ prezent&lt;/code&gt; correctly marks every person absent except the third singular — nobody snows. Its compound tenses then supply forms for all of them anyway, so the same paradigm offers &lt;code&gt;eu am nins&lt;/code&gt;: &lt;em&gt;"I have snowed."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Seventeen Romanian templates in verbecc have that shape, covering &lt;strong&gt;267 lemmas&lt;/strong&gt; out of roughly 6,864: the present marks five of six persons absent while the compound tenses supply forms for exactly those persons. It is filed upstream as &lt;a href="https://github.com/bretttolbert/verbecc/issues/53" rel="noopener noreferrer"&gt;verbecc#53&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The obvious fix is to mirror the present into the compound tenses and suppress the impossible forms. I checked five of the affected verbs before implementing that, and it went both ways. The 17 templates are not one kind of verb. For &lt;code&gt;a ninge&lt;/code&gt; the compound tenses are the wrong side. But &lt;code&gt;a aprova&lt;/code&gt;, &lt;code&gt;a aporta&lt;/code&gt;, &lt;code&gt;a abeceda&lt;/code&gt; and &lt;code&gt;a agrega&lt;/code&gt; are ordinary transitive verbs that have simply been marked third-person-only — for those, &lt;strong&gt;the present&lt;/strong&gt; is the wrong side, and suppressing the compound forms would delete correct ones. Their two largest templates cover 146 of the 267 lemmas between them: the size of the population that needs looking at, not a count of confirmed errors. Five verbs is all anyone has triaged.&lt;/p&gt;

&lt;p&gt;So &lt;code&gt;/conjugate&lt;/code&gt; does not adjudicate. It reports the contradiction and names the persons affected, in a note that reads:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This verb's present tense marks these persons as non-existent, while its compound tenses supply forms for them. One of the two is wrong, and this response cannot tell you which.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;An API that corrected the paradigm quietly would be making a claim about everything it left uncorrected, and that claim would be false.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three things I would rather you heard from me first
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Skewed ambiguities collapse to the frequent reading.&lt;/strong&gt; The disambiguation above is not uniform. The form &lt;code&gt;era&lt;/code&gt; was measured across five contexts on 2026-08-21 and resolved to the lemma &lt;code&gt;fi&lt;/code&gt; — the verb — in five of five, including one where a finite verb is syntactically impossible. That is a real limitation, and it is the case &lt;code&gt;candidates&lt;/code&gt; exists for.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The accuracy figures are gold-tokenisation figures.&lt;/strong&gt; On the UD Romanian RRT test split — 16,311 tokens, gold tokenisation — &lt;code&gt;/analyze&lt;/code&gt; scores 98.14% UPOS, 98.43% FEATS-F1, 95.50% lemma and 93.31% all three correct on the same token. That 95.50% is the full pipeline, not the model on its own: the guide slices it by dictionary coverage, and lemma accuracy is 96.34% for tokens the lexicon knows against 93.25% for tokens it does not. End-to-end accuracy on raw text is a different quantity, and it is not measured. And this is a tagger, not a parser: it returns no syntax tree.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Three endpoints my older posts list are gone.&lt;/strong&gt; &lt;code&gt;/lookup&lt;/code&gt;, &lt;code&gt;/inflect&lt;/code&gt; and &lt;code&gt;/difficulty&lt;/code&gt; went offline on 2026-08-17 and have not come back. All three read third-party dictionary data whose terms of use I had not settled, and the surface is deliberately two endpoints until that is resolved.&lt;/p&gt;

&lt;p&gt;Which brings me to those older posts, because this one is about provenance and it would be poor form to overstate my own. There are two: &lt;a href="https://dev.to/peterabolins/building-the-romanian-nlp-api-that-should-already-exist-2gg7"&gt;April 2026&lt;/a&gt; and &lt;a href="https://dev.to/peterabolins/lexicro-phase-1-is-live-romanian-nlp-api-now-callable-2hg1"&gt;May 2026&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Both carried claims I would not make today: client libraries that do not exist, a licence for the model weights that had been withdrawn and never replaced, &lt;em&gt;"self-hostable"&lt;/em&gt; attached to a project whose weights are not distributed, a latency comparison against LLMs in which neither number had ever been measured, and the three endpoints above presented as live months after they went.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;In August I posted correction comments under both, and that was not enough.&lt;/strong&gt; A comment is annotation, not correction. The bodies still said what they said, and someone reading a post does not necessarily read the comments beneath it. Those comments had aged badly on their own account, too: both explained the withdrawn endpoints as awaiting a permission request that had in fact been withdrawn the same day the comments went up.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;On 2026-08-30 I edited both bodies and deleted the comments.&lt;/strong&gt; The claims above are gone from the posts themselves, the withdrawn endpoints are named as withdrawn with the date they went, and what each post now says about versioning matches what this one says. The correction lives in the thing that was wrong rather than underneath it.&lt;/p&gt;

&lt;p&gt;I am spelling this out because a post arguing that provenance should be checkable, which quietly tidied its own history, would be making the opposite case.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it before you sign up for anything
&lt;/h2&gt;

&lt;p&gt;The demo is at &lt;a href="https://demo.lexicro.com" rel="noopener noreferrer"&gt;demo.lexicro.com&lt;/a&gt;. It puts the two readings side by side and shows the response behind each, &lt;code&gt;candidates&lt;/code&gt; included, and its second tab does the same for &lt;code&gt;/conjugate&lt;/code&gt;, note included. No key, and no form in front of it.&lt;/p&gt;

&lt;p&gt;When you want to call the API yourself, the free tier is real and permanent, not a trial: 1,000 requests/day with a key, 10/day anonymous. The full request and response shapes, the rate limits and the known limitations are in the guides — &lt;a href="https://api.lexicro.com/guide" rel="noopener noreferrer"&gt;api.lexicro.com/guide&lt;/a&gt; for &lt;code&gt;/analyze&lt;/code&gt;, and &lt;a href="https://api.lexicro.com/guide/conjugate" rel="noopener noreferrer"&gt;api.lexicro.com/guide/conjugate&lt;/a&gt; for &lt;code&gt;/conjugate&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;If you find a token it gets wrong, send me the sentence — a wrong answer with its context attached is the most useful thing anyone can send me.&lt;/p&gt;

</description>
      <category>nlp</category>
      <category>api</category>
      <category>opensource</category>
      <category>romanian</category>
    </item>
    <item>
      <title>LexicRo Phase 1 is live — Romanian NLP API now callable</title>
      <dc:creator>Peter Abolins</dc:creator>
      <pubDate>Sun, 10 May 2026 11:54:53 +0000</pubDate>
      <link>https://dev.to/peterabolins/lexicro-phase-1-is-live-romanian-nlp-api-now-callable-2hg1</link>
      <guid>https://dev.to/peterabolins/lexicro-phase-1-is-live-romanian-nlp-api-now-callable-2hg1</guid>
      <description>&lt;p&gt;A few weeks ago I wrote about building the Romanian NLP API that should already exist. Today Phase 1 is live.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What shipped in Phase 1:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;GET /conjugate/{verb}&lt;/code&gt;&lt;br&gt;
→ conjugation table — seven moods, including perfect simplu and viitor I. For a verb the conjugator does not recognise, returns a predicted paradigm and marks it as predicted.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;GET /lookup/{word}&lt;/code&gt; → definitions from DEXonline (DEX '09, MDA2, DLRLC), HTML stripped, source attributed&lt;/p&gt;

&lt;p&gt;&lt;code&gt;GET /inflect/{word}&lt;/code&gt; → basic inflection info extracted from dictionary headers&lt;/p&gt;

&lt;p&gt;&lt;code&gt;POST /difficulty&lt;/code&gt; → word validation against standard Romanian dictionaries&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Free tier:&lt;/strong&gt; 1,000 requests/day, no credit card, no account required for anonymous use (10 req/day without a key).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Try it:&lt;/strong&gt; &lt;a href="https://api.lexicro.com/docs" rel="noopener noreferrer"&gt;https://api.lexicro.com/docs&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The interactive Swagger UI is live — you can call every endpoint directly from the browser without writing any code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What's next (Phase 2):&lt;/strong&gt; Fine-tuning &lt;code&gt;bert-base-romanian-cased-v1&lt;/code&gt; for morphological analysis — the &lt;code&gt;POST /analyze&lt;/code&gt; endpoint that returns lemma, POS, case, gender, number, person, and tense per token. That's the hard part. Building in public — feedback still very welcome.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update, 2026-08-30:&lt;/strong&gt; /lookup, /inflect and /difficulty were withdrawn on 2026-08-17 and are not currently served. /analyze shipped and is live. Demo, no key required: &lt;a href="https://demo.lexicro.com" rel="noopener noreferrer"&gt;https://demo.lexicro.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;→ Original announcement: &lt;a href="https://dev.to/peterabolins/building-the-romanian-nlp-api-that-should-already-exist-2gg7"&gt;https://dev.to/peterabolins/building-the-romanian-nlp-api-that-should-already-exist-2gg7&lt;/a&gt;&lt;br&gt;
→ Demo: &lt;a href="https://demo.lexicro.com" rel="noopener noreferrer"&gt;https://demo.lexicro.com&lt;/a&gt;&lt;br&gt;
→ GitHub: &lt;a href="https://github.com/LexicRo/lexicro" rel="noopener noreferrer"&gt;https://github.com/LexicRo/lexicro&lt;/a&gt;&lt;/p&gt;

</description>
      <category>nlp</category>
      <category>romanian</category>
      <category>opensource</category>
      <category>api</category>
    </item>
    <item>
      <title>Building the Romanian NLP API that should already exist</title>
      <dc:creator>Peter Abolins</dc:creator>
      <pubDate>Sat, 18 Apr 2026 11:47:45 +0000</pubDate>
      <link>https://dev.to/peterabolins/building-the-romanian-nlp-api-that-should-already-exist-2gg7</link>
      <guid>https://dev.to/peterabolins/building-the-romanian-nlp-api-that-should-already-exist-2gg7</guid>
      <description>&lt;p&gt;If you've tried to do anything programmatic with Romanian text, you've probably hit the same wall I did.&lt;/p&gt;

&lt;p&gt;There's no clean API for it. You end up scraping DEXonline, wrestling with incomplete library support, or calling a general-purpose LLM and hoping it gets the grammar right. None of that is good enough for production.&lt;/p&gt;

&lt;h3&gt;
  
  
  The specific gap
&lt;/h3&gt;

&lt;p&gt;Given an arbitrary Romanian sentence, return for each token: its lemma, part of speech, grammatical case, number, gender, person, and tense.&lt;/p&gt;

&lt;p&gt;This is what spaCy does for English, French, and German in a &lt;code&gt;pip install&lt;/code&gt;. LexicRo is that as a hosted, versioned HTTP contract for Romanian: callable without shipping a model, stamping the version it answered with, and telling you per token whether the answer came from a lexicon or a prediction.&lt;/p&gt;

&lt;p&gt;Romanian NLP tooling lags well behind English. The academic resources are there — DEXonline (313k+ lemmas), RoLEX (330k morphosyntactic entries), the Universal Dependencies Romanian Treebank — they're just not packaged in a way developers can actually use.&lt;/p&gt;

&lt;h3&gt;
  
  
  But why not just use ChatGPT?
&lt;/h3&gt;

&lt;p&gt;Fair question. The short answer: for production, an LLM is not infrastructure — it's an oracle. The accusative form of &lt;em&gt;câine&lt;/em&gt; is always &lt;em&gt;câinele&lt;/em&gt;, regardless of the LLM's mood that day. LexicRo returns structured linguistic data, and every response carries the model_version that produced it. The weights, lexicon and tagset are versioned together as one unit, so you can pin against a version and know exactly what you are pinned to. Beyond that: LLM costs at scale are unpredictable; a dedicated endpoint does one thing and does it the same way every time; and structured output from an LLM requires prompt engineering, validation, and retry logic. LexicRo returns clean JSON, every time.&lt;/p&gt;

&lt;h3&gt;
  
  
  What I'm building
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;LexicRo&lt;/strong&gt; — an open-core, hosted API platform covering the endpoints Romanian developers actually need:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;POST /analyze
→ lemma, POS, case, gender, number, person, tense per token, plus 
  where each answer came from

GET /conjugate/{verb}
→ conjugation table — seven moods, including perfect simplu
  and viitor I. For a verb the conjugator does not recognise,
  returns a predicted paradigm and marks it as predicted.

GET /inflect/{word}
GET /lookup/{word}
POST /difficulty
→ these were withdrawn on 2026-08-17 and are not currently served.
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Technical approach
&lt;/h3&gt;

&lt;p&gt;Not starting from scratch — the data and models are there:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Base model&lt;/strong&gt;: &lt;code&gt;bert-base-romanian-cased-v1&lt;/code&gt; fine-tuned for morphological tagging&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Conjugation&lt;/strong&gt;: verbecc Romanian XML templates&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lexical&lt;/strong&gt;: DEXonline database dump + RoLEX dataset&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Infrastructure&lt;/strong&gt;: FastAPI, Docker, full OpenAPI spec&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Licence and access
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Code: MIT&lt;/li&gt;
&lt;li&gt;Model weights: licensing terms for the model weights are still being worked out&lt;/li&gt;
&lt;li&gt;Free tier: 1,000 req/day, no credit card, all endpoints&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Phase 1 ships first
&lt;/h3&gt;

&lt;p&gt;The conjugation and lexical lookup endpoints are the straightforward part — wrapping verbecc and DEXonline cleanly. That's what ships first (~3 months). The morphological analyser (the hard part, requiring fine-tuned BERT) follows in phase 2.&lt;/p&gt;

&lt;h3&gt;
  
  
  What I'm looking for
&lt;/h3&gt;

&lt;p&gt;I'm in pre-development and genuinely looking for:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Feedback on the endpoint design&lt;/strong&gt; — does this cover what you'd actually need?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Early users&lt;/strong&gt; working with Romanian text at any scale&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Academic connections&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Anyone who's built adjacent to this&lt;/strong&gt; — what did you learn?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Update, 2026-08-30:&lt;/strong&gt; the plan described above changed. /lookup, /inflect and /difficulty were withdrawn on 2026-08-17. /analyze — described here as Phase 2 work — shipped and is live. There is a demo, no key required: &lt;a href="https://demo.lexicro.com" rel="noopener noreferrer"&gt;https://demo.lexicro.com&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Links&lt;/strong&gt;: &lt;a href="https://lexicro.com" rel="noopener noreferrer"&gt;lexicro.com&lt;/a&gt; · &lt;a href="https://demo.lexicro.com" rel="noopener noreferrer"&gt;demo.lexicro.com&lt;/a&gt; · &lt;a href="https://github.com/LexicRo" rel="noopener noreferrer"&gt;github.com/LexicRo&lt;/a&gt; · &lt;a href="mailto:contact@lexicro.com"&gt;contact@lexicro.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Romanian deserves the same NLP infrastructure as French or German. Building it in public — feedback welcome.&lt;/p&gt;

</description>
      <category>nlp</category>
      <category>romanian</category>
      <category>api</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
