<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>krivo.net</title>
	<atom:link href="http://krivo.net/blog/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://krivo.net/blog</link>
	<description>Reading this can damage your brain!</description>
	<lastBuildDate>Wed, 24 Mar 2010 15:40:09 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Дупки</title>
		<link>http://krivo.net/blog/?p=34</link>
		<comments>http://krivo.net/blog/?p=34#comments</comments>
		<pubDate>Wed, 24 Mar 2010 15:40:09 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Common nonsense]]></category>
		<category><![CDATA[hate]]></category>
		<category><![CDATA[Дупки]]></category>

		<guid isPermaLink="false">http://krivo.net/blog/?p=34</guid>
		<description><![CDATA[От известно време се каня да ругая по българската народна милиция. Да, именно милиция, защото според мен никак не са си променили манталитета от онова време… Но първо първите неща, както казват англоезичните ни братя. 
 
Миналата събота се изнасях от квартирата (което само по себе си е епохално събитие и заслужава отделен пост по [...]]]></description>
			<content:encoded><![CDATA[<p>От известно време се каня да ругая по българската народна милиция. Да, именно милиция, защото според мен никак не са си променили манталитета от онова време… Но първо първите неща, както казват англоезичните ни братя. </p>
<p> <span id="more-34"></span>
<p>Миналата събота се изнасях от квартирата (което само по себе си е епохално събитие и заслужава отделен пост по темата). Понеже така и не успях да взема голямата кола (разбирай баничарката) реших, че е особено уместно да събера по-дребните неща в чисто новата каручка. Дотук добре, ама кой ти да се сети, че една седмица по-рано на кръговото на 4-ти километър, някаква женица забравила да натисне спирачката и доста грубо се вряза в сивия ми лебед. Проблеми никави, драскотини – също, но от удара пласмасарията, която държи предната регистрационна табеле се натрошила и то точно в частта, която именно заклещва пущината. Та обадих се аз на sell-ера и го подготвих за моето идване, но ме домързя за същия ден и отебах. </p>
<p>Та ще се местя значи&#8230; Станах рано от зарана, хванах един стар приятел и гордо се засилихме да изнасяме багажа, който съм трупал през двете години и половина престой в това кокетно място, наречено моя бърлога квартира. </p>
<p>Понеже аз съм хитър и се сетих да спра пред денонощния и да купя доволно количество найлонови чували. Винаги съм се чудил защо хората от телевизията винаги се преместват с кашони. На мен ми се струва невъзможно да намериш празни кашони. Просто не знам дали изобщо продават. Както и да е, 70 литров чувал с телевизионна реклама, оясняваща ти, че е нерушим поне колкото наметката на Батман се оказа добра идея. Не само насипах всичко, което смятах за личен багаж, достоед за еднократен превоз в лимузината, но можеха да се полват и за изхвърляне на боклука, който се оказа, че съставлява основна част от притежаваните от мен вещи. </p>
<p>Ама аз малко се отплеснах&#8230; </p>
<p>Направихме един курс, оставихме багажа където трябва и на връщане решихме, че е особено разумно да обядваме KFC. Винаги е разумно да се обядва KFC&#8230; </p>
<p>Пътуваме на отворени прозорци. Колата се оглася от Dave Brubeck и от Nina Simone. Кеф. Направих пирует по Раковска и понеже имахме лек спор, дали е отворена Мария Луиза или не, направих най-некадърния завой по Кирил и Методий. ТРЯС! Някакъв мил човечец спрял на аварийни светлини да зареди кварталната бакалия закрива видимостта в завоя, а аз нали съм прост и не поглеждам нечовешкия кратер който е зейнал пред мен. Как да е, с разтреперено сърце ни докарах до Лъвов мост. Преядохме, разбира се. </p>
<p>Излизам гордо да се натоварим за един втори рейс с найлоновите чували и застивам&#8230; Колата е без предния номер! „АМИ СЕГА?!“ прозвучава в главата ми човечето от „Минута е много“. Задния си беше там. Връщаме се по обратния път, спирам като селски бек на кръстовището с дупката и търсим. Там трябва да е, изпаднала заради дупката. Търсим, ама няма. След малко спира патрулка и куката идва да види кой е спрял толкова хубаво. „Така и така“, започвам аз, кършейки ръце „падна ми предния номер тука, опитвам се да го открия“. „Ааа, ние тая дупка я знаеме от два месеца, нормално е да стане тая беля“. Да ама това и аз го знам. „Какво правиме?“ питам, вече видимо притеснен. „Еми отивате до пето районно, и там обяснявате на дежурния за случката“. „А защо точно пето, него не го знам“, питам аз.“Ми по местозагубване&#8230;“ и ми обясни къде точно е районното, към което е зачислена тая дупка-мутант. Кротко го изчаках да ми обясни, разбира се изобщо и не го слушах&#8230; знаели я тая дупка&#8230; от два месеца я знаели&#8230; пичка ви путка! На изпроводяк ме предупредиха, че ако ме спрат могат да ме глобят за предния номер. Колко мило! Аз какво, на гръб ли да я нося? </p>
<p>Тръгнахме приблизително в посоката, където се предполага, че се намира районното. Завиваме по Кракра а главата ми се пълни с кръв. Яд ме е. Яд ме е на мен си, задето съм такова мързеливо копеле. Да я бях сменил тая пласмасария предния ден. Спираме пред английско нещо-си на Оборище и питам някаква униформена охрана къде се намира заветната полицейска сграда.“Заради номерчето ли?“, ухилил се оня. „Очевидно, captain Obvious” си мисля аз, но само кимвам. Разбрах го къде е. На майка си в гъза! </p>
<p>Паркирам някак си. Пред районното не се паркира, както любезно ме уведоми един униформен блюстител на реда. Платих за синя зона. Два пъти. През цялото време се надявах малоумниците от „паркинги и гаражи“ да не решат, че не съм си платил, щото те нямат без-номер в системата. </p>
<p>Пето районно. На входа има бял плакат на който пише „Всеки е невинен до доказване на противното“. Невинен е в червено. Леля с табела „информация“ над главата се опитва да ми снеме показанията. Обяснявам какво се е случило, като не се впускам в подробности. „Ами ще трябва да изчакате дежурния“. Стига бе! Тя щяла да ни извика като се освободял, да сме излезели от фоайето, че да не правим тълпа. Хубаво. Купувам си кутия с цигари. Не бях пушил два дни и си мислех, че като нищо ще ги откажа. Едва ли. Изпуших 5-6 и пак влязох да видя до къде е сме го докарали.“Излезте“, вика лелята, “аз ще ви повикам“. И ние излизаме. </p>
<p>Опитах се да разбера каква е процедурата с изгубените номера от един униформен, който пушеше отпред. „Питайте ей тия“ и сочи една патрулка съшо с униформени, но с флуоресцентни жилетки. “Те са катаджии, те трябва да знаят за какво става въпрос“. Отначало нямах желание да си говоря с „ония“, имайки предвид че не получих никаква информация от жената под табелата информация. Моя приятел обаче реши, че има нерви и ще ги разпитва. Отидох с него от любопитство. „Добър ден“, започва той, стряскайки удобно разплутия катаджия във Вектрата. „Добър ден“, отговаря сконфузено, „какво искате?“ „Ами да ви питаме тука..“, малко несигурно „понеже ни казаха, че сте катаджия&#8230;““Кой ви каза? Аз може да съм пазач на паркинг, вие защо решихте че аз съм катаджия, може и президента на републиката да съм.“ „Ами вашия колега ни каза така“, опитва се да се окопити моя приятел след словестната атака.“&#8230; за една изгубена регистрационна табела ни е въпроса&#8230;“. Полицая ведна засия. “Ами записват ви че сте я загубили, издават ви една бележка и отивате да се разправяте в КАТ. И осем осмици да ви е номера, ще трябва да си пререгистрирате колата. Дубликати не се издават“. Евала, единствения човек, който знаеше за какво говори. Останах почти доволен, въпреки лошото начало. </p>
<p>Малко по малко започна да ми се проясняват нещата в главата. КАТ, пререгистрация, канали, нови номера, нов талон. После застрахователите&#8230; Сигурно щеше да ми прилошее, ако не бях здрав като бизон. Поне щях да си платя за номер 1337&#8230; Което е успокоение до някъде&#8230; </p>
<p>След 2 часа чакане накрая взе да застудява и въпреки протестите на лелята влязохме в чакалнята, защото бях без връхни дрехи. След още половин час се доредих до дежурния. Той се оказа дребен човечец с благ глас, но не от ония хора, които будят доверие. Подаде ми лист. „Пиши“. На листа пишеше с дребен шрифт „обяснение“ и имаше полета за почти всичко. Кой съм, кога съм роден, какво образование има, семеен статус, къде работя и като какъв&#8230; „Ама всичкото ли?“ „Пиши, пиши“. Бога ми, почувствах се като престъпник. Въпреки протестите ми, оказа се, че всички полета за задължителни иначе нама да стане. След краткото ми вербално обяснение какво се е случило се наложи да си направим една диктовка за да не взема да се объркам. Написах всичко и онзи извади една бланка за молба в която имаше само няколко полета като името ми и номера на колата. Ебаси! Тая молба той сам си я попълни. А обяснението?!? Подписах я, подписах и декларация, че ще им се обадя ако намеря номера. Платих 3 лева на някакво гише за нещо си и това била работата. Само толкова!! Аз изпуших една кутия цигари бе!!! След седмица да съм се обадел да ми дадат бележката за пред КАТ, а междувременно да не съм си бил карал колата, щото ако ме спрат – акт.“Не можем да ти издадем нито бележка, нито временен номер. Такива са правилата“. Деба. </p>
<p>На другата сутрин си намерих номера подпрян на малкото трафопостче пред квартирата. Явно не е паднала в дупката. Запътих се отново към районното. Този път много, ама много кисел.&#160; Отново обяснене… пичка ви путка! </p>
<p>ПС </p>
<p>Велин, извинявай за дългото писание, ама ми се отрази доста терапевтично.</p>
]]></content:encoded>
			<wfw:commentRss>http://krivo.net/blog/?feed=rss2&amp;p=34</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Partial string matching, Similarity and Levenshtein distance (C#)</title>
		<link>http://krivo.net/blog/?p=18</link>
		<comments>http://krivo.net/blog/?p=18#comments</comments>
		<pubDate>Wed, 17 Mar 2010 09:16:26 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[snippet]]></category>

		<guid isPermaLink="false">http://krivo.net/wordpress/?p=18</guid>
		<description><![CDATA[A friend of mine recently had a problem. He needed to compare how equal are two strings. We all know how easy is to tell whether two strings are equal, but if they are not exactly equal, then how different are they?
If you google for partial string matching there are tons of resources… but not [...]]]></description>
			<content:encoded><![CDATA[<p>A friend of mine recently had a problem. He needed to compare how equal are two strings. We all know how easy is to tell whether two strings are equal, but if they are not <span style="text-decoration: underline;">exactly</span> equal, then how different are they?</p>
<p>If you google for partial string matching there are tons of resources… but not for C#. We found that most applicable algorithm is the Levenstein distance (also called edit distance). It measures exactly how many edits (insertion, deletion or substitution of a single character) you have to do to get one string from another. You can read more about it at <a href="http://en.wikipedia.org/wiki/Levenshtein_distance" target="_blank">Wikipedia</a>.</p>
<p>Since we are to compare strings, it seems rational to extend <strong>System.String</strong> to support a simple method for getting the edit distance.</p>
<div id="codeSnippetWrapper" style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; width: 97.5%; font-family: 'Courier New', courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; cursor: text; border: silver 1px solid; padding: 4px;">
<div id="codeSnippet" style="text-align: left; line-height: 12pt; background-color: #f4f4f4; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">int</span> GetLevensteinDistance(<span style="color: #0000ff;">this</span> <span style="color: #0000ff;">string</span> firstString, <span style="color: #0000ff;">string</span> secondString)</pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">{</pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">    <span style="color: #0000ff;">if</span> (firstString == <span style="color: #0000ff;">null</span>)</pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">        <span style="color: #0000ff;">throw</span> <span style="color: #0000ff;">new</span> ArgumentNullException(<span style="color: #006080;">"firstString"</span>);</pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">    <span style="color: #0000ff;">if</span> (secondString == <span style="color: #0000ff;">null</span>)</pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">        <span style="color: #0000ff;">throw</span> <span style="color: #0000ff;">new</span> ArgumentNullException(<span style="color: #006080;">"secondString"</span>);</pre>
<p><!--CRLF--></p>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">    <span style="color: #0000ff;">if</span> (firstString == secondString)</pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">        <span style="color: #0000ff;">return</span> 0;</pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"> </pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">    <span style="color: #0000ff;">int</span>[,] matrix = <span style="color: #0000ff;">new</span> <span style="color: #0000ff;">int</span>[firstString.Length + 1, secondString.Length + 1];</pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"> </pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">    <span style="color: #0000ff;">for</span> (<span style="color: #0000ff;">int</span> i = 0; i &lt;= firstString.Length; i++)</pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">        matrix[i, 0] = i; <span style="color: #008000;">// deletion</span></pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">    <span style="color: #0000ff;">for</span> (<span style="color: #0000ff;">int</span> j = 0; j &lt;= secondString.Length; j++)</pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">        matrix[0, j] = j; <span style="color: #008000;">// insertion</span></pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"> </pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">    <span style="color: #0000ff;">for</span> (<span style="color: #0000ff;">int</span> i = 0; i &lt; firstString.Length; i++)</pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">        <span style="color: #0000ff;">for</span> (<span style="color: #0000ff;">int</span> j = 0; j &lt; secondString.Length; j++)</pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">            <span style="color: #0000ff;">if</span> (firstString[i] == secondString[j])</pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">                matrix[i + 1, j + 1] = matrix[i, j];</pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">            <span style="color: #0000ff;">else</span></pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">            {</pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">                matrix[i + 1, j + 1] = Math.Min(matrix[i, j + 1] + 1, matrix[i + 1, j] + 1); <span style="color: #008000;">//deletion or insertion</span></pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">                matrix[i + 1, j + 1] = Math.Min(matrix[i + 1, j + 1], matrix[i, j] + 1); <span style="color: #008000;">//substitution</span></pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">            }</pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">    <span style="color: #0000ff;">return</span> matrix[firstString.Length, secondString.Length];</pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">}</pre>
<p><!--CRLF--></p>
</div>
</div>
<p>Now, I know it is not so readable, but if you really need an explanation of how it works, check <a href="http://en.wikipedia.org/wiki/Levenshtein_distance" target="_blank">Wikipedia</a> page, it is pretty direct implementation.</p>
<p>Okay, now we can compute the edit distance, but the goal is still comparing two strings, so we need some percentage. In order to have constant result regarding whether we are comparing string1 to string2 or vice versa and still get result from 0 to 1, we will compare longer string to shorter.</p>
<div id="codeSnippetWrapper" style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; width: 97.5%; font-family: 'Courier New', courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; cursor: text; border: silver 1px solid; padding: 4px;">
<div id="codeSnippet" style="text-align: left; line-height: 12pt; background-color: #f4f4f4; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">double</span> GetSimilarity(<span style="color: #0000ff;">this</span> <span style="color: #0000ff;">string</span> firstString, <span style="color: #0000ff;">string</span> secondString)</pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">{</pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">    <span style="color: #0000ff;">if</span> (firstString == <span style="color: #0000ff;">null</span>)</pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">        <span style="color: #0000ff;">throw</span> <span style="color: #0000ff;">new</span> ArgumentNullException(<span style="color: #006080;">"firstString"</span>);</pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">    <span style="color: #0000ff;">if</span> (secondString == <span style="color: #0000ff;">null</span>)</pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">        <span style="color: #0000ff;">throw</span> <span style="color: #0000ff;">new</span> ArgumentNullException(<span style="color: #006080;">"secondString"</span>);</pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"> </pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">    <span style="color: #0000ff;">if</span> (firstString == secondString)</pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">        <span style="color: #0000ff;">return</span> 1;</pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"> </pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">    <span style="color: #0000ff;">int</span> longestLenght = Math.Max(firstString.Length, secondString.Length);</pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">    <span style="color: #0000ff;">int</span> distance = GetLevensteinDistance(firstString, secondString);</pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">    <span style="color: #0000ff;">double</span> percent = distance/(<span style="color: #0000ff;">double</span>) longestLenght;</pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">    <span style="color: #0000ff;">return</span> 1 - percent;</pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">}</pre>
<p><!--CRLF--></p>
</div>
</div>
<p>That’s it! I have to advise you though, that it’s a costly operation and running this against a large database with big text is not going to be very fast.</p>
<p>I have to thank <a href="http://www.miroslavov.com/" target="_blank">Miro</a>, for the support. He is an awesome guy!</p>
<p>And finally, I want to thank Velin for reading.</p>
<p><a href="http://krivo.net/wordpress/wp-content/uploads/2010/03/StringSimilarity.zip">StringSimilarity.zip</a></p>
]]></content:encoded>
			<wfw:commentRss>http://krivo.net/blog/?feed=rss2&amp;p=18</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>!Title</title>
		<link>http://krivo.net/blog/?p=22</link>
		<comments>http://krivo.net/blog/?p=22#comments</comments>
		<pubDate>Tue, 16 Mar 2010 21:25:24 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Common nonsense]]></category>
		<category><![CDATA[misc]]></category>

		<guid isPermaLink="false">http://krivo.net/wordpress/?p=22</guid>
		<description><![CDATA[Моя добър приятел Велин, с другарска усмивка и благ тон ме подкани да си направя блог. Имало хора, които видите ли можело и да се зачетат в написаното. Един вид – сея мъдрост, а другите попиват. Идеята е хубава, да видим какво ще последва. Може пък и да почна да сея мъдрост. И все пак, [...]]]></description>
			<content:encoded><![CDATA[<p>Моя добър приятел Велин, с другарска усмивка и благ тон ме подкани да си направя блог. Имало хора, които видите ли можело и да се зачетат в написаното. Един вид – сея мъдрост, а другите попиват. Идеята е хубава, да видим какво ще последва. Може пък и да почна да сея мъдрост. И все пак, познавам се другарю Велин – това е поредната дивотия, която ще ме мързи да продължа.</p>
<p>На всички, които четат това искам да кажа:</p>
<p>Лека нощ, Велин!</p>
]]></content:encoded>
			<wfw:commentRss>http://krivo.net/blog/?feed=rss2&amp;p=22</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

