Stichworte(Tags) Liste aus einem heraus Text erstellen

    • C#

    Es gibt 1 Antwort in diesem Thema. Der letzte Beitrag () ist von Acr0most.

      Stichworte(Tags) Liste aus einem heraus Text erstellen

      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#)

      C#-Quellcode

      1. using System;
      2. using System.Collections.Generic;
      3. using System.Linq;
      4. namespace WindowsFormsApplication3
      5. {
      6. public class CreateTagList
      7. {
      8. /// <summary>
      9. /// Neue Instanz
      10. /// </summary>
      11. /// <param name="textToDecode">Text aus dem die Schlüsselworte (Tags) herausgefiltert werden sollen</param>
      12. /// <param name="badWords">Liste von Wörtern die keine Stichworte (Tags) sein können</param>
      13. public CreateTagList(string textToDecode, IEnumerable<string> badWords)
      14. {
      15. this.TextToDecode = textToDecode;
      16. this.BadWords = badWords != null ? badWords : new List<string>();
      17. }
      18. /// <summary>
      19. /// Tag-Liste erstellen
      20. /// </summary>
      21. /// <param name="Result">Rückgabe des Ergebnisses</param>
      22. /// <returns>Anzahl der Tags</returns>
      23. public int FindTags(out IEnumerable<string> Result )
      24. {
      25. // String Splitten
      26. string [] tempAfterSplitting = this.TextToDecode.Split(new string[] { " ", ".", ",", ";", ":", Environment.NewLine}, StringSplitOptions.RemoveEmptyEntries);
      27. // Alle Elemente entfernen die länger als 4 sind
      28. this.Tags = tempAfterSplitting.Where(x => x.Length > 4 && Char.IsUpper(x[0]));
      29. // Alle doppelten Elemente entfernen
      30. this.Tags = this.Tags.Union(this.Tags);
      31. List<string> result = new List<string>();
      32. // Liste nach 'verbotenen' Wörtern filtern
      33. foreach (string s in this.Tags)
      34. {
      35. if (this.BadWords.FirstOrDefault(x => x.Equals(s, StringComparison.OrdinalIgnoreCase)) == null)
      36. {
      37. result.Add(s);
      38. }
      39. }
      40. // Ähnliche Wörter ausblenden
      41. for(int i = result.Count() -1; i > 0; i--)
      42. {
      43. IEnumerable<string> ret = this.Tags.Where(x => x.LevenshteinDistance(result[i]) <= 2);
      44. if (ret.Count() > 1)
      45. {
      46. // Wort doppelt vorhanden
      47. result.Remove(result[i]);
      48. }
      49. }
      50. // Ergebnis ausgeben
      51. this.Tags = result;
      52. // Weitere Ausgabe des Ergebnisses
      53. Result = this.Tags;
      54. return Result.Count();
      55. }
      56. /// <summary>
      57. /// Text aus dem die Schlüsselworte (Tags) herausgefiltert werden sollen
      58. /// </summary>
      59. public string TextToDecode { get; private set; }
      60. /// <summary>
      61. /// Rückgabe des Ergebnisses
      62. /// </summary>
      63. public IEnumerable<string> Tags { get; private set; }
      64. /// <summary>
      65. /// Liste von Wörtern die keine Stichworte (Tags) sein können
      66. /// </summary>
      67. public IEnumerable<string> BadWords { get; private set; }
      68. }
      69. public static class Levenshtein
      70. {
      71. public static int LevenshteinDistance(this string source, string target)
      72. {
      73. if (String.IsNullOrEmpty(source))
      74. {
      75. if (String.IsNullOrEmpty(target)) return 0;
      76. return target.Length;
      77. }
      78. if (String.IsNullOrEmpty(target)) return source.Length;
      79. if (source.Length > target.Length)
      80. {
      81. var temp = target;
      82. target = source;
      83. source = temp;
      84. }
      85. var m = target.Length;
      86. var n = source.Length;
      87. var distance = new int[2, m + 1];
      88. // Initialize the distance 'matrix'
      89. for (var j = 1; j <= m; j++) distance[0, j] = j;
      90. var currentRow = 0;
      91. for (var i = 1; i <= n; ++i)
      92. {
      93. currentRow = i & 1;
      94. distance[currentRow, 0] = i;
      95. var previousRow = currentRow ^ 1;
      96. for (var j = 1; j <= m; j++)
      97. {
      98. var cost = (target[j - 1] == source[i - 1] ? 0 : 1);
      99. distance[currentRow, j] = Math.Min(Math.Min(
      100. distance[previousRow, j] + 1,
      101. distance[currentRow, j - 1] + 1),
      102. distance[previousRow, j - 1] + cost);
      103. }
      104. }
      105. return distance[currentRow, m];
      106. }
      107. }
      108. }


      Der Aufruf kann wie folgt erfolgen

      C#-Quellcode

      1. private void Form1_Load(object sender, EventArgs e)
      2. {
      3. string text = string.Empty;
      4. using (StreamReader sr = new StreamReader("..\\Examples\\Example.txt"))
      5. {
      6. text = sr.ReadToEnd();
      7. }
      8. CreateTagList sw = new CreateTagList(text, new List<string>() { "wenige", "viele", "seitdem", "jedes" });
      9. IEnumerable<string> ret;
      10. int count = sw.FindTags(out ret);
      11. }

      Quellen:
      1. Hier im Forum Stichwortverzeichnis aus Text erstellen
      2. Im Internet - die Klasse 'Class Levenshtein'
        en.wikibooks.org/wiki/Algorith…ings/Levenshtein_distance
      Projektmappe:

      ​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
      Dateien

      Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „mikeb69“ ()

      Werde ich bald mal verwenden und testen.
      Bitte vorher den Titel anpassen, denke das ist ein Schreibfehler.

      Stichworte(Tags) Liste aus einem heraus Text erstellen <-> Stichworte(Tags) Liste aus einem Text heraus erstellen


      LG Acr0most
      Wenn das Leben wirklich nur aus Nullen und Einsen besteht, dann laufen sicherlich genügen Nullen frei herum. :D
      Signature-Move 8o
      kein Problem mit privaten Konversationen zu Thema XY :thumbup: