|
using System;
using System.Text;
using System.Collections;
namespace Fuzzy_Logic_Library
{
/// <summary>
/// Summary description for FuzzyWord.
/// </summary>
public class FuzzyWord : FuzzyBasic
{
private string strWord;
private double dMinMaxDifference;
private double dComparedMembership;
private char[] punctuationArray;
private int nMinimumLetters;
private int nValueDifference;
private bool bAcceptPlurals;
private int nMaximumIncorrectLetters;
private bool bLowerCase;
public string Word
{
get
{
return strWord;
}
set
{
strWord = value;
/// get the value for the word
double dValue = 0;
for( int i=0; i<strWord.Length; i++ )
{
dValue += strWord[ i ];
}
/// default to 10 if no minmax difference supplied
if( dMinMaxDifference == 0.0 )
{
dMinMaxDifference = 10.0;
}
this.Maximum = dValue + dMinMaxDifference;
this.Minimum = dValue - dMinMaxDifference;
this.Number = dValue;
}
}
public double ComparedMembership
{
get
{
return dComparedMembership;
}
set
{
dComparedMembership = value;
}
}
public int MinimumMatchingLetters
{
get
{
return nMinimumLetters;
}
set
{
nMinimumLetters = value;
}
}
public int ValueDifference
{
get
{
return nValueDifference;
}
set
{
nValueDifference = value;
}
}
public bool AcceptPlurals
{
get
{
return bAcceptPlurals;
}
set
{
bAcceptPlurals = value;
}
}
public int MaximumIncorrectLetters
{
get
{
return nMaximumIncorrectLetters;
}
set
{
nMaximumIncorrectLetters = value;
}
}
public bool LowerCase
{
get
{
return bLowerCase;
}
set
{
bLowerCase = value;
}
}
public FuzzyWord() : base()
{
//
// TODO: Add constructor logic here
//
dMinMaxDifference = 0.0;
dComparedMembership = 0.0;
strWord = null;
nMinimumLetters = 3;
nValueDifference = 10;
bAcceptPlurals = true;
nMaximumIncorrectLetters = 2;
bLowerCase = false;
punctuationArray = new char[ 5 ];
punctuationArray[ 0 ] = ';';
punctuationArray[ 1 ] = ',';
punctuationArray[ 2 ] = '.';
punctuationArray[ 3 ] = ':';
punctuationArray[ 4 ] = '?';
}
public FuzzyWord( string word ) : base()
{
dMinMaxDifference = 0.0;
dComparedMembership = 0.0;
Word = word;
nMinimumLetters = 3;
nValueDifference = 10;
bAcceptPlurals = true;
nMaximumIncorrectLetters = 2;
bLowerCase = false;
punctuationArray = new char[ 5 ];
punctuationArray[ 0 ] = ';';
punctuationArray[ 1 ] = ',';
punctuationArray[ 2 ] = '.';
punctuationArray[ 3 ] = ':';
punctuationArray[ 4 ] = '?';
}
public FuzzyWord( string word, double minMaxDifference )
{
dMinMaxDifference = minMaxDifference;
Word = word;
dComparedMembership = 0.0;
nMinimumLetters = 3;
nValueDifference = 10;
bAcceptPlurals = true;
nMaximumIncorrectLetters = 2;
bLowerCase = false;
punctuationArray = new char[ 5 ];
punctuationArray[ 0 ] = ';';
punctuationArray[ 1 ] = ',';
punctuationArray[ 2 ] = '.';
punctuationArray[ 3 ] = ':';
punctuationArray[ 4 ] = '?';
}
/// <summary>
/// compare two fuzzy words
/// </summary>
/// <param name="comparison"></param>
/// <returns></returns>
public FuzzyWord Compare( string comparison )
{
if( comparison == "" || comparison == null )
{
return null;
}
/// check the passed in string for any punctuation marks if they exist
/// remove them
if( comparison.IndexOfAny( punctuationArray ) != -1 )
{
/// special case Origin of the species has the punctuation " ,- " which gives a bad value
if( comparison.LastIndexOf( '-' ) != -1 )
comparison = comparison.Remove( comparison.Length -1, 1 );
comparison = comparison.Remove( comparison.Length -1, 1 );
if( comparison == "" || comparison == null )
return null;
}
/// check if not case sensitive
if( LowerCase == true )
{
comparison = comparison.ToLower();
}
/// check if plurals are accepted.
if( AcceptPlurals == true )
{
/// treat plurals as acceptable
if( comparison[ comparison.Length -1 ] == 's' || comparison[ comparison.Length - 1 ] == 'S' )
{
string strTest = comparison.Remove( comparison.Length -1, 1 );
if( strTest == "" || strTest == null )
return null;
/// check for apostrophy s
if( strTest[ strTest.Length -1 ] == '\'' )
{
strTest = strTest.Remove( strTest.Length -1, 1 );
}
if( strTest == Word )
{
FuzzyWord temp = new FuzzyWord( comparison );
temp.ComparedMembership = 1.0;
return temp;
}
}
}
if( comparison == Word )
{
FuzzyWord temp = new FuzzyWord( comparison );
temp.ComparedMembership = 1.0;
return temp;
}
/// get the value for the comparison
double dValue = 0;
for( int i=0; i<comparison.Length; i++ )
{
dValue += comparison[ i ];
}
/// get the comparison between the two ( the number of letters the same )
int nCount = 0;
for( int i=0; i<Word.Length; i++ )
{
if( i < Word.Length && i < comparison.Length )
{
if( Word[ i ] == comparison[ i ] )
{
nCount++;
}
}
}
/// allow a minimum number of correct letters
if( nCount >= this.MinimumMatchingLetters )
{
if( comparison.Length > Word.Length && nCount + this.MaximumIncorrectLetters >= comparison.Length )
{
FuzzyWord temp = new FuzzyWord( comparison );
/// set the membership value
if( dValue >= this.Number - nValueDifference && dValue <= this.Number + nValueDifference )
temp.ComparedMembership = 1.12;
else if( dValue >= this.Number - ( nValueDifference * 2 ) && dValue <= this.Number + ( nValueDifference * 2 ) )
temp.ComparedMembership = 1.25;
else if( dValue >= this.Number - ( nValueDifference * 3 ) && dValue <= this.Number + ( nValueDifference * 3 ) )
temp.ComparedMembership = 1.37;
else if( dValue >= this.Number - ( nValueDifference * 4 ) && dValue <= this.Number + ( nValueDifference * 4 ) )
temp.ComparedMembership = 1.50;
else if( dValue >= this.Number - ( nValueDifference * 5 ) && dValue <= this.Number + ( nValueDifference * 5 ) )
temp.ComparedMembership = 1.63;
else if( dValue >= this.Number - ( nValueDifference * 6 ) && dValue <= this.Number + ( nValueDifference * 6 ) )
temp.ComparedMembership = 1.75;
else
temp.ComparedMembership = 1.87;
return temp;
}
if( comparison.Length <= Word.Length && Word.Length - this.MaximumIncorrectLetters > 0 )
{
FuzzyWord temp = new FuzzyWord( comparison );
/// set the membership value
if( dValue >= this.Number - nValueDifference && dValue <= this.Number + nValueDifference )
temp.ComparedMembership = 0.87;
else if( dValue >= this.Number - ( nValueDifference * 2 ) && dValue <= this.Number + ( nValueDifference * 2 ) )
temp.ComparedMembership = 0.75;
else if( dValue >= this.Number - ( nValueDifference * 3 ) && dValue <= this.Number + ( nValueDifference * 3 ) )
temp.ComparedMembership = 0.63;
else if( dValue >= this.Number - ( nValueDifference * 4 ) && dValue <= this.Number + ( nValueDifference * 4 ) )
temp.ComparedMembership = 0.50;
else if( dValue >= this.Number - ( nValueDifference * 5 ) && dValue <= this.Number + ( nValueDifference * 5 ) )
temp.ComparedMembership = 0.37;
else if( dValue >= this.Number - ( nValueDifference * 6 ) && dValue <= this.Number + ( nValueDifference * 6 ) )
temp.ComparedMembership = 0.25;
else
temp.ComparedMembership = 0.12;
return temp;
}
}
return null;
}
}
/// <summary>
/// Class for holding complete sentences
/// </summary>
public class FuzzySentence : FuzzyBasic
{
private ArrayList arraySentence;
private char finalPunctuation;
public string Sentence
{
get
{
StringBuilder strTemp = new StringBuilder();
for( int i=0; i<arraySentence.Count; i++ )
{
strTemp.Append( ( ( FuzzyWord )arraySentence[ i ] ).Word );
if( i != arraySentence.Count )
strTemp.Append( " " );
else
strTemp.Append( finalPunctuation );
}
return strTemp.ToString();
}
}
/// <summary>
/// Basic Constructor
/// </summary>
public FuzzySentence() : base()
{
arraySentence = new ArrayList();
}
/// <summary>
/// Constructor that takes the string for the sentence
/// </summary>
/// <param name="strSentence"></param>
public FuzzySentence( string strSentence ) : base()
{
arraySentence = new ArrayList();
AddSentence( strSentence );
}
/// <summary>
/// add a single word to the sentence
/// </summary>
/// <param name="fuzzyWord"></param>
public void AddWord( FuzzyWord fuzzyWord )
{
arraySentence.Add( fuzzyWord );
}
/// <summary>
/// add a single word to the sentence
/// </summary>
/// <param name="strWord"></param>
public void AddWord( string strWord )
{
arraySentence.Add( strWord );
}
/// <summary>
/// Add the sentence
/// </summary>
/// <param name="strSentence"></param>
public void AddSentence( string strSentence )
{
/// clear out any current sentence
arraySentence.Clear();
int nCount = 0;
/// extract the words
for( int i=0; i<strSentence.Length; i++ )
{
/// if space found a word
if( strSentence[ i ] == ' ' )
{
arraySentence.Add( new FuzzyWord( strSentence.Substring( nCount, i-nCount ) ) );
nCount = i;
}
/// check if found the end of the sentence
if( strSentence[ i ] == '.' || strSentence[ i ] == '?' )
{
arraySentence.Add( new FuzzyWord( strSentence.Substring( nCount, i-1-nCount ) ) );
finalPunctuation = strSentence[ i ];
}
}
}
}
/// <summary>
/// A paragraph is a collection of sentences
/// </summary>
public class FuzzyParagraph : FuzzyBasic
{
ArrayList arrayParagraph;
public string Paragraph
{
get
{
StringBuilder strTemp = new StringBuilder();
for( int i=0; i<arrayParagraph.Count; i++ )
{
strTemp.Append( ( ( FuzzySentence )arrayParagraph[ i ] ).Sentence );
if( i != arrayParagraph.Count )
strTemp.Append( " " );
}
return strTemp.ToString();
}
}
/// <summary>
/// basic constructor
/// </summary>
public FuzzyParagraph() : base()
{
arrayParagraph = new ArrayList();
}
/// <summary>
/// constructor taking the paragraph as a string
/// </summary>
/// <param name="strParagraph"></param>
public FuzzyParagraph( string strParagraph ) : base()
{
arrayParagraph = new ArrayList();
AddParagraph( strParagraph );
}
/// <summary>
/// build the paragraph string by string
/// </summary>
/// <param name="fuzzySentence"></param>
public void AddSentence( FuzzySentence fuzzySentence )
{
arrayParagraph.Add( fuzzySentence );
}
/// <summary>
/// add a whole paragraph
/// </summary>
/// <param name="strParagragh"></param>
public void AddParagraph( string strParagraph )
{
arrayParagraph.Clear();
StringBuilder strString = new StringBuilder();
for( int i=0; i<strParagraph.Length; i++ )
{
/// add each sentence to the paragraph
if( strParagraph[ i ] == '.' || strParagraph[ i ] == '?' )
{
strString.Append( strParagraph[ i ] );
arrayParagraph.Add( new FuzzySentence( strString.ToString() ) );
}
strString.Append( strParagraph[ i ] );
}
}
}
/// <summary>
/// A set to hold a collection of fuzzy paragraphs
/// Not sure if this should inherit from fuzzy set at the moment see how things work out
/// </summary>
public class FuzzyParagraphSet : FuzzySet
{
public FuzzyParagraphSet() : base()
{
}
public FuzzyParagraphSet( string strName ) : base()
{
this.Name = strName;
}
}
}
|
By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.
If a file you wish to view isn't highlighted, and is a text file (not binary), please
let us know and we'll add colourisation support for it.
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.