Hallo Forum,
bin nun seit einigen Monaten Informatiker bei meinem Arbeitgeber ohne diesen Job gelernt zu haben.
Vieles stammt aus dem Lesen und Beitrage im Forum !!!!
Durch Gespräche im Betrieb bin ich auf ein Problem gestoßen welches ich bisher nicht als Problem wahrgenommen habe.
Aufgrund dessen hab ich mir das Thema Stichworte(Tags) aus einem beliebigen Text erstellen angenommen.
Hier mein Code (C#)
Der Aufruf kann wie folgt erfolgen
Quellen:
Im Anhang findet Ihr die versprochene Projektmappe (VS 2017, C#), diese werde ich immer wieder mal gegen den aktuellen Stand austauschen.
Viel Spaß damit.
Kommentare erwünscht
Gruss
mikeb69
bin nun seit einigen Monaten Informatiker bei meinem Arbeitgeber ohne diesen Job gelernt zu haben.
Vieles stammt aus dem Lesen und Beitrage im Forum !!!!
Durch Gespräche im Betrieb bin ich auf ein Problem gestoßen welches ich bisher nicht als Problem wahrgenommen habe.
Aufgrund dessen hab ich mir das Thema Stichworte(Tags) aus einem beliebigen Text erstellen angenommen.
Hier mein Code (C#)
C#-Quellcode
- using System;
- using System.Collections.Generic;
- using System.Linq;
- namespace WindowsFormsApplication3
- {
- public class CreateTagList
- {
- /// <summary>
- /// Neue Instanz
- /// </summary>
- /// <param name="textToDecode">Text aus dem die Schlüsselworte (Tags) herausgefiltert werden sollen</param>
- /// <param name="badWords">Liste von Wörtern die keine Stichworte (Tags) sein können</param>
- public CreateTagList(string textToDecode, IEnumerable<string> badWords)
- {
- this.TextToDecode = textToDecode;
- this.BadWords = badWords != null ? badWords : new List<string>();
- }
- /// <summary>
- /// Tag-Liste erstellen
- /// </summary>
- /// <param name="Result">Rückgabe des Ergebnisses</param>
- /// <returns>Anzahl der Tags</returns>
- public int FindTags(out IEnumerable<string> Result )
- {
- // String Splitten
- string [] tempAfterSplitting = this.TextToDecode.Split(new string[] { " ", ".", ",", ";", ":", Environment.NewLine}, StringSplitOptions.RemoveEmptyEntries);
- // Alle Elemente entfernen die länger als 4 sind
- this.Tags = tempAfterSplitting.Where(x => x.Length > 4 && Char.IsUpper(x[0]));
- // Alle doppelten Elemente entfernen
- this.Tags = this.Tags.Union(this.Tags);
- List<string> result = new List<string>();
- // Liste nach 'verbotenen' Wörtern filtern
- foreach (string s in this.Tags)
- {
- if (this.BadWords.FirstOrDefault(x => x.Equals(s, StringComparison.OrdinalIgnoreCase)) == null)
- {
- result.Add(s);
- }
- }
- // Ähnliche Wörter ausblenden
- for(int i = result.Count() -1; i > 0; i--)
- {
- IEnumerable<string> ret = this.Tags.Where(x => x.LevenshteinDistance(result[i]) <= 2);
- if (ret.Count() > 1)
- {
- // Wort doppelt vorhanden
- result.Remove(result[i]);
- }
- }
- // Ergebnis ausgeben
- this.Tags = result;
- // Weitere Ausgabe des Ergebnisses
- Result = this.Tags;
- return Result.Count();
- }
- /// <summary>
- /// Text aus dem die Schlüsselworte (Tags) herausgefiltert werden sollen
- /// </summary>
- public string TextToDecode { get; private set; }
- /// <summary>
- /// Rückgabe des Ergebnisses
- /// </summary>
- public IEnumerable<string> Tags { get; private set; }
- /// <summary>
- /// Liste von Wörtern die keine Stichworte (Tags) sein können
- /// </summary>
- public IEnumerable<string> BadWords { get; private set; }
- }
- public static class Levenshtein
- {
- public static int LevenshteinDistance(this string source, string target)
- {
- if (String.IsNullOrEmpty(source))
- {
- if (String.IsNullOrEmpty(target)) return 0;
- return target.Length;
- }
- if (String.IsNullOrEmpty(target)) return source.Length;
- if (source.Length > target.Length)
- {
- var temp = target;
- target = source;
- source = temp;
- }
- var m = target.Length;
- var n = source.Length;
- var distance = new int[2, m + 1];
- // Initialize the distance 'matrix'
- for (var j = 1; j <= m; j++) distance[0, j] = j;
- var currentRow = 0;
- for (var i = 1; i <= n; ++i)
- {
- currentRow = i & 1;
- distance[currentRow, 0] = i;
- var previousRow = currentRow ^ 1;
- for (var j = 1; j <= m; j++)
- {
- var cost = (target[j - 1] == source[i - 1] ? 0 : 1);
- distance[currentRow, j] = Math.Min(Math.Min(
- distance[previousRow, j] + 1,
- distance[currentRow, j - 1] + 1),
- distance[previousRow, j - 1] + cost);
- }
- }
- return distance[currentRow, m];
- }
- }
- }
Der Aufruf kann wie folgt erfolgen
C#-Quellcode
- private void Form1_Load(object sender, EventArgs e)
- {
- string text = string.Empty;
- using (StreamReader sr = new StreamReader("..\\Examples\\Example.txt"))
- {
- text = sr.ReadToEnd();
- }
- CreateTagList sw = new CreateTagList(text, new List<string>() { "wenige", "viele", "seitdem", "jedes" });
- IEnumerable<string> ret;
- int count = sw.FindTags(out ret);
- }
Quellen:
- Hier im Forum Stichwortverzeichnis aus Text erstellen
- Im Internet - die Klasse 'Class Levenshtein'
en.wikibooks.org/wiki/Algorith…ings/Levenshtein_distance
Im Anhang findet Ihr die versprochene Projektmappe (VS 2017, C#), diese werde ich immer wieder mal gegen den aktuellen Stand austauschen.
Viel Spaß damit.
Kommentare erwünscht
Gruss
mikeb69
Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „mikeb69“ ()