diff --git a/README.md b/README.md index 05d6aee..6137396 100644 --- a/README.md +++ b/README.md @@ -85,6 +85,7 @@ That is why I wanted to create my own project, in a language I understand, and t - Newtonsoft.JSON - [PuppeteerSharp](https://www.puppeteersharp.com/) - [Html Agility Pack (HAP)](https://html-agility-pack.net/) +- [Soenneker.Utils.String.NeedlemanWunsch](https://github.com/soenneker/soenneker.utils.string.needlemanwunsch) - 💙 Blåhaj 🦈

(back to top)

diff --git a/Tranga/MangaConnectors/Mangasee.cs b/Tranga/MangaConnectors/Mangasee.cs index e1ce0c2..067f840 100644 --- a/Tranga/MangaConnectors/Mangasee.cs +++ b/Tranga/MangaConnectors/Mangasee.cs @@ -4,6 +4,7 @@ using System.Text.RegularExpressions; using System.Xml.Linq; using HtmlAgilityPack; using Newtonsoft.Json; +using Soenneker.Utils.String.NeedlemanWunsch; using Tranga.Jobs; namespace Tranga.MangaConnectors; @@ -41,14 +42,6 @@ public class Mangasee : MangaConnector SearchResult[] filteredResults = FilteredResults(publicationTitle, searchResults); Log($"Total available manga: {searchResults.Length} Filtered down to: {filteredResults.Length}"); - /* - Dictionary levenshteinRelation = filteredResults.ToDictionary(result => result, - result => - { - Log($"Levenshtein {result.s}"); - return LevenshteinDistance(publicationTitle.Replace(" ", "").ToLower(), result.s.Replace(" ", "").ToLower()); - }); - Log($"After levenshtein: {levenshteinRelation.Count}");*/ string[] urls = filteredResults.Select(result => $"https://mangasee123.com/manga/{result.i}").ToArray(); List searchResultManga = new(); @@ -70,42 +63,19 @@ public class Mangasee : MangaConnector private SearchResult[] FilteredResults(string publicationTitle, SearchResult[] unfilteredSearchResults) { - string[] bannedStrings = {"a", "the", "of", "as", "to", "no", "for", "on", "with", "be", "and", "in", "wa", "at"}; - string[] cleanSplitPublicationTitle = publicationTitle.Split(' ') - .Where(part => part.Length > 0 && !bannedStrings.Contains(part.ToLower())).ToArray(); - - return unfilteredSearchResults.Where(usr => + Dictionary similarity = new(); + foreach (SearchResult sr in unfilteredSearchResults) { - string cleanSearchResultString = string.Join(' ', usr.s.Split(' ').Where(part => part.Length > 0 && !bannedStrings.Contains(part.ToLower()))); - foreach(string splitPublicationTitlePart in cleanSplitPublicationTitle) - if (cleanSearchResultString.Contains(splitPublicationTitlePart, StringComparison.InvariantCultureIgnoreCase) || - cleanSearchResultString.Contains(splitPublicationTitlePart, StringComparison.InvariantCultureIgnoreCase)) - return true; - return false; - }).ToArray(); - } - - private int LevenshteinDistance(string a, string b) - { - if (b.Length == 0) - return a.Length; - if (a.Length == 0) - return b.Length; - if (a[0] == b[0]) - return LevenshteinDistance(a[1..], b[1..]); - - int case1 = LevenshteinDistance(a, b[1..]); - int case2 = LevenshteinDistance(a[1..], b[1..]); - int case3 = LevenshteinDistance(a[1..], b); - - if (case1 < case2) - { - return 1 + (case1 < case3 ? case1 : case3); - } - else - { - return 1 + (case2 < case3 ? case2 : case3); + List scores = new(); + foreach (string se in sr.a) + scores.Add(NeedlemanWunschStringUtil.CalculateSimilarity(se.ToLower(), publicationTitle.ToLower())); + scores.Add(NeedlemanWunschStringUtil.CalculateSimilarity(sr.s.ToLower(), publicationTitle.ToLower())); + similarity.Add(sr, scores.Sum() / scores.Count); } + + SearchResult[] similarity90 = similarity.Where(s => s.Value < 10).Select(s => s.Key).ToArray(); + + return similarity90; } public override Manga? GetMangaFromId(string publicationId) diff --git a/Tranga/Tranga.csproj b/Tranga/Tranga.csproj index 2e4242b..47b765f 100644 --- a/Tranga/Tranga.csproj +++ b/Tranga/Tranga.csproj @@ -11,6 +11,7 @@ +