Windows Azure Cloud Storage ermöglicht es Ihnen bereits ab 0,10€ pro GB/Monat die Vorteile der Cloud zu nutzen.
Willkommen bei dotnet-snippets.de! Snippet hinzufügen Login Registrieren
Snippets in der Datenbank: 1549 | Anzahl registrierter User: 1833 | Besucher online: 11
Hauptmenü
Home
Top Ten
Zufälliger Snippet
FAQs
.NET Community
dotnet-forum.de
dotnet-kicks.de
Social

RSS Feeds
Rss Alle Snippets
Rss C#
Rss VB.NET
Rss C++
Rss ASP.NET
Partner
Member of Microsoft Community Leader/Insider Program (CLIP)

Fuzzy Suche


Autor: Günther Foidl
Sprache: C#
Bewertung:
7.88 (6 votes)
Anzahl der Aufrufe: 7436
  
Kick it on dotnet-kicks.de  

Beschreibung:

Dieses Snippet zeigt eine einfache Implementierung zur Fuzzy Suche (unscharfe Suche). Informationen darüber zB in http://de.wikipedia.org/wiki/Fuzzy-Suche.

Beispiel:

static void Main(string[] args)
{
string word = "Waidring";
List wordList = new List
{
"Waidring",
"Woadring",
"Weitharing",
"waidring",
"woadring",
"Waidring "
};

List foundWords = StringSearching.FuzzySearch(word, wordList, 0.65);
foreach (string s in foundWords)
Console.WriteLine(s);

Console.ReadKey();
}


Abgelegt unter: Fuzzy, Fuzzy Suche, Fuzzy Search, String, Suchfunktion, Suche, unscharfe Suche.



C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
using System;
using System.Collections.Generic;

namespace gfoidl.Tools
{
	/// <summary>
	/// Stellt Methoden für String-Suchalgorithmen bereit.
	/// </summary>
	public class StringSearching
	{
		/// <summary>
		/// Ermittelt die Levenshtein-Distanz von zwei Zeichenfolgen.
		/// </summary>
		/// <param name="src">
		/// 1. Zeichenfolge
		/// </param>
		/// <param name="dest">
		/// 2. Zeichenfolge
		/// </param>
		/// <returns>
		/// Levenshstein-Distanz
		/// </returns>
		/// <remarks>
		/// Siehe http://de.wikipedia.org/wiki/Levenshtein-Distanz
		/// </remarks>
		public static int LevenshteinDistance(string src, string dest)
		{
			int[,] d = new int[src.Length + 1, dest.Length + 1];
			int i, j, cost;
			char[] str1 = src.ToCharArray();
			char[] str2 = dest.ToCharArray();

			for (i = 0; i <= str1.Length; i++)
			{
				d[i, 0] = i;
			}
			for (j = 0; j <= str2.Length; j++)
			{
				d[0, j] = j;
			}
			for (i = 1; i <= str1.Length; i++)
			{
				for (j = 1; j <= str2.Length; j++)
				{

					if (str1[i - 1] == str2[j - 1])
						cost = 0;
					else
						cost = 1;

					d[i, j] =
						Math.Min(
							d[i - 1, j] + 1,					// Deletion
							Math.Min(
								d[i, j - 1] + 1,				// Insertion
								d[i - 1, j - 1] + cost));		// Substitution

					if ((i > 1) && (j > 1) && (str1[i - 1] == str2[j - 2]) && (str1[i - 2] == str2[j - 1]))
					{
						d[i, j] = Math.Min(d[i, j], d[i - 2, j - 2] + cost);
					}
				}
			}

			return d[str1.Length, str2.Length];
		}
		//---------------------------------------------------------------------
		/// <summary>
		/// Sucht strings nach dem Prinzip der Fuzzy-Suche.
		/// </summary>
		/// <param name="word">
		/// Eingabe
		/// </param>
		/// <param name="wordList">
		/// Liste mit den Wörtern in denen gesucht werden soll.
		/// </param>
		/// <param name="fuzzyness">
		/// Paremeter für die Unschärfe. Ein Wert von 0.8 bedeutet zB
		/// dass der Unterschied zwischen der Eingbe und den gefundenen
		/// Wörtern nicht mehr als 20% betragen darf.
		/// </param>
		/// <returns>
		/// Eine Liste mit den gefundenen Wörtern.
		/// </returns>
		public static List<string> FuzzySearch(
			string word,
			List<string> wordList,
			double fuzzyness)
		{
			List<string> foundWords = new List<string>();

			foreach (string s in wordList)
			{
				// Levenshtein-Distanz berechnen:
				int levenshteinDistance =
					StringSearching.LevenshteinDistance(word, s);

				// Länge des längeren Strings:
				int length = Math.Max(word.Length, s.Length);

				// Trefferquote errechnen und der Liste hinzufügen:
				double score = 1.0 - (double)levenshteinDistance / length;

				// Treffer?
				if (score > fuzzyness)
					foundWords.Add(s);
			}

			return foundWords;
		}
	}
}
Sie haben Fragen zu diesem Snippet oder brauchen Hilfe bei der .NET Entwicklung?
Freundliche und kompetente Entwickler helfen Ihnen gern weiter im Forum für .NET Entwicklung.



Kommentare:
(Zum Schreiben von Kommentaren bitte anmelden.)

klaus_b schrieb am:  30.07.2009 08:40:37

Sehr schöner Ansatz, den ich mir mal in aller Ruhe zu Gemüte führen muss.
Rainer Hilmer schrieb am:  30.07.2009 12:07:58

Eine Perle
Günther Foidl schrieb am:  30.07.2009 20:27:28

Danke für die Blumen!
Siehe auch: http://www.codeproject.com/KB/recipes/fuzzysearch.aspx
Das ganze kann noch parallelisiert werden und sonst noch ein wenig optimiert.
Oliver Kremer schrieb am:  18.11.2009 09:43:46

Sehr schön! S. zur Vertiefung auch: http://wwwlgis.informatik.uni-kl.de/archiv/wwwdvs.informatik.uni-kl.de/agdbis/staff/Haustein/DOCS/dahausteintext.pdf


Diese Snippets könnten für Sie interessant sein:
[C#] Hexcode eines Strings ausgeben
[VB.NET] Größe eines Strings berechnen
[C#] String bei bestimmten Zeichen splitten
[C#] Encode To ASCII - Buchstaben in Ascii-Werte umwandeln
[C#] Gibt den MD5 Hash eines Stings als String zurück.
[C#] String in Byte Array und zurück wandeln
[VB.NET] Den SHA1 Hash eines Strings ermitteln
[VB.NET] Den MD5 Hash eines Strings ermitteln
[C#] Wandelt ein Bytearray in einen Binärstring
[VB.NET] Text auf Bild zeichnen
[C#] String auf Emailadresse prüfen
[C#] SHA-1 Hash eines Strings erzeugen
[VB.NET] Strings schnell zählen
[VB.NET] Pfad kürzen
[VB.NET] Einfache Ähnlichkeitssuche (SQL)
[C#] Pfad kürzen
[C#] IsPositiveInteger as Extension Method
[C#] Datum und Zeit als String
[C#] String spiegeln
[VB.NET] String spiegeln
[C#] Erweiterung für Stringumwandlungen
[C#] Image in string wandeln und zurück
[C#] Strings komprimieren und dekomprimieren
[C#] CamelCase in Title Case konvertieren
[C#] Text zentriert in die Konsole schreiben
[VB.NET] Strings komprimieren und dekomprimieren
[VB.NET] Rows eines DataGridView in ein String-Array konvertieren
[C#] kontrolliert ob String eine gültige GUID ist
[C#] HTML aus einem String entfernen
[C#] byte-String in byte wandeln
[C#] Formelevaluierung aus RPN Form
[C#] Erzeugen eines zufälligen Strings
[C#] mehrfach vorkommende Worte entfernen
[C#] Determines whether the specified input is numeric
[C#] Prozentual Textvergleichen
[C#] doppelte Leerzeichen aus einem String entfernen
[C#] Zählt wie oft ein String in einem String vorkommt.
[C#] String kürzen ohne ein Wort abzuschneiden
[C#] String auf erlaubte Zeichen prüfen
[C#] Austauch von kritischen Zeichen in einem String...
[VB.NET] String in Byte Array und zurück wandeln
[C#] Gross- Kleinbuchstaben in String schnell zählen
[VB.NET] Listen, Arrays, Strings konvertieren
[C#] CRC32-Hash eines Strings
[VB.NET] CRC32-Hash eines Strings
[C#] Größe eines Strings berechnen
[VB.NET] String Splitten
[C#] Capitalize the first letter of every word
[VB.NET] Textdatei lesen und schreiben (String, StringArray, etc...)
[C#] Text2Bitmap (String in Bild umwandeln)
[C#] Double in String umwandeln (mit InvariantCulture)
[C#] String in Double umwandeln (mit InvariantCulture)
[C#] Convert MAC string to byte array
[C#] Reverse String
[C#] Stellt fest ob ein String ein Palindrom ist
[VB.NET] String umkehren
[C#] Letztes Wort aus einem String ermitteln
[C#] Erstes Wort aus einem String ermitteln
[VB.NET] List all controls by using the name of the controls
[C#] Alle E-Mail Adressen aus einem String bzw. Text filtern
[C#] StringSplitter
[C#] Fundstelle eines Suchbegriffs markieren
[C#] Initialisiert alle String-Properties
[C#] MD5 Verschlüsselung
[C#] HTML Tags aus String entfernen
[C#] Geschachtelte Methode zur String-Bearbeitung
[C#] Byte Größenangaben als String formatieren (KB, MB, GB, ...)
[VB.NET] Permutation nachweisen
[C#] Implode und Trim für String-Enumerationen (Extension Method)
[C#] String zu MD5
[C#] Tabulatorzeichen durch Leerzeichen ersetzen
[C#] String in einzelne Wörter aufteilen und Wörter zählen
[VB.NET] Passwortgenerator
[C#] Render MVC Action as string
[C#] Namen von Klassenmember als String ermitteln
[C#] IncreaseString
[VB.NET] String uebers Netzwerk oder Internet and einen PC senden
[C#] String to char Tarnung
[C#] C# XOR Crypt
[C#] String-Formatierung für Faule: Erweiterungsmethode
[C#] Stopwörter in einem Text entfernen (Deutsch)
[C#] Stopwörter in einem Text entfernen (Englisch)
[C#] Binärsuche innerhalb einer Liste
[VB.NET] Alle Dateien eines Ordners auflisten
[VB.NET] Klasse für Dateisuche
[C#] Parallele Dateisuche über mehrere Laufwerke
[C#] Searchable ComboBox

schlecht sehr gut
1 2 3 4 5 6 7 8 9 10
Nur angemeldete User können Snippets bewerten.