<?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: Martin Yovchevski</title>
    <description>The latest articles on DEV Community by Martin Yovchevski (@martinyovchevski).</description>
    <link>https://dev.to/martinyovchevski</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%2F4221004%2Faa585a79-96f6-49a3-86a0-2abf9cf9c1a1.PNG</url>
      <title>DEV Community: Martin Yovchevski</title>
      <link>https://dev.to/martinyovchevski</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/martinyovchevski"/>
    <language>en</language>
    <item>
      <title>A similarity score is a starting point, not a verdict</title>
      <dc:creator>Martin Yovchevski</dc:creator>
      <pubDate>Sun, 01 Nov 2026 19:26:30 +0000</pubDate>
      <link>https://dev.to/martinyovchevski/a-similarity-score-is-a-starting-point-not-a-verdict-2152</link>
      <guid>https://dev.to/martinyovchevski/a-similarity-score-is-a-starting-point-not-a-verdict-2152</guid>
      <description>&lt;p&gt;When a document-review tool reports a percentage, it is tempting to treat that number as the answer. But a similarity score can only describe matches found under a particular set of rules and against a particular collection of sources. Whether a passage is properly attributed, common terminology, a quotation, or a problem needs context.&lt;/p&gt;

&lt;p&gt;I work on &lt;a href="https://www.unplag.bg/" rel="noopener noreferrer"&gt;Unplag.bg&lt;/a&gt;, a Bulgarian platform for text review and academic integrity. One design question matters to me: how can a report make the next human decision easier without pretending to make that decision itself?&lt;/p&gt;

&lt;h2&gt;
  
  
  Start with the evidence
&lt;/h2&gt;

&lt;p&gt;A useful report should let a reviewer move from an overall figure to the actual matched passages and their sources. Seeing the surrounding text helps distinguish a referenced quotation from a passage whose attribution needs further review. A source link is useful only if the reviewer can inspect the relevant material.&lt;/p&gt;

&lt;h2&gt;
  
  
  Make the boundaries visible
&lt;/h2&gt;

&lt;p&gt;A report is shaped by the sources available to the system, the text extracted from the document and the matching rules used. No match is not proof that every possible source has been checked. Likewise, a match is not proof of misconduct. Where possible, a report should explain which sources were checked and note extraction problems instead of hiding those limitations behind one number.&lt;/p&gt;

&lt;h2&gt;
  
  
  Leave room for human judgement
&lt;/h2&gt;

&lt;p&gt;A teacher may need to consider the assignment, quotation conventions and an opportunity for the student to explain their work. A responsible workflow supports that review and documents its reasoning. It does not equate text similarity with plagiarism or a potential AI signal with proof of authorship.&lt;/p&gt;

&lt;p&gt;For developers, this means thinking beyond a single threshold: show the evidence, communicate limitations, and make it possible to review context. These are design principles, not claims about the accuracy of any particular system.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Generated with AI based on the author’s topic and instructions; not reviewed by the author before publication. I am Martin Yovchevski (Мартин Йовчевски), co-founder and technical lead of Unplag.bg.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>education</category>
      <category>tools</category>
      <category>writing</category>
    </item>
    <item>
      <title>Three text-processing tests to run before comparing Bulgarian documents</title>
      <dc:creator>Martin Yovchevski</dc:creator>
      <pubDate>Sun, 01 Nov 2026 18:20:20 +0000</pubDate>
      <link>https://dev.to/martinyovchevski/three-text-processing-tests-to-run-before-comparing-bulgarian-documents-2f9h</link>
      <guid>https://dev.to/martinyovchevski/three-text-processing-tests-to-run-before-comparing-bulgarian-documents-2f9h</guid>
      <description>&lt;p&gt;When a comparison system misses a passage, the matching algorithm is not the only place to look. It may be comparing a different sequence of characters from the one a reader sees. Before interpreting a similarity result, test what happens to the text on its way into the matcher.&lt;/p&gt;

&lt;p&gt;I work on Unplag.bg as a co-founder and technical lead. The examples below are general test ideas, not a description of Unplag's internal implementation or measurements of its performance.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Equivalent Unicode representations
&lt;/h2&gt;

&lt;p&gt;The Cyrillic letter &lt;code&gt;й&lt;/code&gt; can be represented as a single code point or as &lt;code&gt;и&lt;/code&gt; followed by a combining breve. They can look the same while a direct string comparison returns false. Normalizing both strings to NFC before comparison is one possible policy:&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;import&lt;/span&gt; &lt;span class="n"&gt;unicodedata&lt;/span&gt;

&lt;span class="n"&gt;composed&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;decomposed&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="se"&gt;\u0306&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;composed&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;decomposed&lt;/span&gt;
&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;unicodedata&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;normalize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;NFC&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;composed&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;unicodedata&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;normalize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;NFC&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;decomposed&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is a test for equivalent encodings, not a general spelling correction. The normalization policy should be documented and applied consistently to both sides. Keep the original text for display and check that highlights can be mapped back to it.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Lookalikes across writing systems
&lt;/h2&gt;

&lt;p&gt;Latin &lt;code&gt;a&lt;/code&gt; and Cyrillic &lt;code&gt;а&lt;/code&gt; look similar but are different characters. The word &lt;code&gt;папа&lt;/code&gt; written entirely in Cyrillic is not the same character sequence as &lt;code&gt;пaпa&lt;/code&gt;, where the two a-shaped characters are Latin. A test suite should include both. A warning about mixed scripts can help a reviewer notice unexpected input; it is not evidence of deliberate manipulation. Mixed scripts occur legitimately too, for example in product names and quotations. Avoid silently replacing every lookalike: that can change meaning and create false matches. Unicode's security guidance discusses confusables and their limitations.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Extraction before matching
&lt;/h2&gt;

&lt;p&gt;Use a small set of documents with a known reference transcription: a digital PDF, a scan requiring OCR, and a DOCX file. Compare the extracted text with the reference and inspect whitespace, punctuation, page breaks, hyphenation and Cyrillic characters. A failure here should be visible to a reviewer; it should not quietly become a low similarity score. Include examples with correctly attributed quotations and common phrases, because a match still requires contextual interpretation.&lt;/p&gt;

&lt;p&gt;These checks cover input quality, not the accuracy of a full plagiarism or authorship assessment. A useful report should show the matching passages and sources, and leave the final judgment to people following the institution's procedure.&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.python.org/3/library/unicodedata.html#unicodedata.normalize" rel="noopener noreferrer"&gt;Python: Unicode database and normalization&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.unicode.org/reports/tr15/" rel="noopener noreferrer"&gt;Unicode: Unicode normalization forms&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.unicode.org/reports/tr39/" rel="noopener noreferrer"&gt;Unicode: Security mechanisms and confusable characters&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Disclosure: this article was generated with AI assistance for Martin Yovchevski's professional profile. Martin is co-founder of &lt;a href="https://www.unplag.bg/" rel="noopener noreferrer"&gt;Unplag.bg&lt;/a&gt;. It describes general test ideas, not results from an experiment.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>algorithms</category>
      <category>computerscience</category>
      <category>softwaredevelopment</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>Designing text-review tools around evidence</title>
      <dc:creator>Martin Yovchevski</dc:creator>
      <pubDate>Sun, 01 Nov 2026 18:18:31 +0000</pubDate>
      <link>https://dev.to/martinyovchevski/designing-text-review-tools-around-evidence-35fp</link>
      <guid>https://dev.to/martinyovchevski/designing-text-review-tools-around-evidence-35fp</guid>
      <description>&lt;p&gt;A similarity score is easy to display. A review interface is harder to design: it must help a person find relevant evidence, understand its limits, and make a decision that can be explained later.&lt;/p&gt;

&lt;p&gt;At Unplag.bg, where I work as co-founder and technical lead, this question matters because educational institutions need more than a single number. Here are practical design questions I consider useful when building systems for reviewing documents.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep the source close to the match
&lt;/h2&gt;

&lt;p&gt;A highlighted passage should make it clear what was compared and where the corresponding source can be found. The reviewer needs enough surrounding text to understand a quotation, a reference, or a common phrase. A link to the source is a starting point for inspection, not proof that the passage is inappropriate.&lt;/p&gt;

&lt;h2&gt;
  
  
  Preserve the original and expose extraction problems
&lt;/h2&gt;

&lt;p&gt;Document processing starts before comparison. PDF extraction, formatting, and character encodings can change what a system reads. For Bulgarian, Cyrillic text, mixed scripts, and word forms add practical cases to test. A reviewer should be able to return to the original document when extracted text looks wrong.&lt;/p&gt;

&lt;h2&gt;
  
  
  Separate different kinds of evidence
&lt;/h2&gt;

&lt;p&gt;Text overlap and a signal about possible AI-generated writing answer different questions. Neither should be presented as a definitive conclusion about intent or authorship. Label what each signal measures, explain its limitations, and keep decisions with the people responsible for review.&lt;/p&gt;

&lt;h2&gt;
  
  
  Make the review understandable later
&lt;/h2&gt;

&lt;p&gt;A useful workflow lets an authorised reviewer trace the relevant passages, sources and decisions. This supports consistency without pretending that every case has the same rules. Institutions can then apply their own policies and give students a fair opportunity to respond.&lt;/p&gt;

&lt;p&gt;Designing for context is a product choice: it makes the limits of automation visible and gives educators a better basis for judgment.&lt;/p&gt;

&lt;p&gt;Originally published on &lt;a href="https://martinyovchevski.hashnode.dev/designing-text-review-tools-around-evidence" rel="noopener noreferrer"&gt;my Hashnode blog&lt;/a&gt;. Prepared with AI assistance. I am co-founder of &lt;a href="https://www.unplag.bg/" rel="noopener noreferrer"&gt;Unplag.bg&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>design</category>
      <category>softwaredevelopment</category>
      <category>softwareengineering</category>
    </item>
  </channel>
</rss>
