Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System.Collections.Generic;
- using System.Text;
- using System;
- using System.Linq;
- public class Song
- {
- public List<string> nazev = new List<string>();
- public List<string> title = new List<string>();
- public List<string> remix = new List<string>();
- public Song(string song)
- {
- string n, t, r;
- ManazerNazvuMedii.ci.VratMiNazevTitleRemix(song, out n, out t, out r);
- this.nazev.AddRange(SplitNazevTitle(n));
- this.title.AddRange(SplitNazevTitle(t));
- this.remix.AddRange(SplitRemix(r));
- //if (this.remix.Count != 0)
- //{
- //}
- }
- internal float CalculateSimilarity(string p)
- {
- Song s = new Song(p);
- int psn, prn, pst, prt, psr, prr;
- VratPocetStejnychARozdilnych(s.nazev, this.nazev, out psn, out prn);
- VratPocetStejnychARozdilnych(s.title, this.title, out pst, out prt);
- VratPocetStejnychARozdilnych(s.remix, this.remix, out psr, out prr);
- float n = CalculateSimilarity(psn, prn, s.nazev, this.nazev);
- float t = CalculateSimilarity(pst, prt, s.title, this.title);
- float r = CalculateSimilarity(psr, prr, s.remix, this.remix);
- float vr = (n + t) / 2;
- //if (vr > 0.66f)
- //{
- // if (vr == 1)
- // {
- // }
- // return vr;
- //}
- //
- if (vr == 1)
- {
- vr = (n + t + r) / 3;
- }
- return vr;
- }
- private float CalculateSimilarity(int psn, int prn, List<string> novy, List<string> puvodni)
- {
- if (psn == prn && psn == 0)
- {
- return 1.0f;
- }
- if (psn > prn)
- {
- //prn == 1 ||
- if (prn == 0)
- {
- int uy = 0;
- for (int i = 0; i < novy.Count; i++)
- {
- if (puvodni.Contains(novy[i]))
- {
- uy++;
- }
- }
- if (uy == novy.Count)
- {
- return 1.0f;
- }
- //return 1.0f;
- return (1f / 3f) * 2f;
- }
- if (prn != 0)
- {
- if (prn != 1)
- {
- return psn / prn;
- }
- if (psn > 3)
- {
- float vr = (psn - prn) / 2f;
- return vr;
- }
- else
- {
- float vr = (psn - ((float)psn / ((float)psn - 1f))) / 2;
- int uy = 0;
- for (int i = 0; i < novy.Count; i++)
- {
- if (puvodni.Contains(novy[i]))
- {
- uy++;
- }
- }
- if (uy > 0)
- {
- vr = (float)uy / (float)prn / 2f;
- }
- if (vr > 0.99f)
- {
- vr = vr / 2f;
- }
- return vr;
- }
- //return 0.5f;
- }
- return 0f;
- }
- if (psn + 1 > prn && psn < 3)
- {
- return 0.5f;
- }
- return 0f;
- }
- private void VratPocetStejnychARozdilnych(List<string> list, List<string> list_2, out int psn, out int prn)
- {
- List<string> l1 = new List<string>(list.ToArray());
- List<string> l2 = new List<string>(list_2.ToArray());
- psn = 0;
- for (int i = l1.Count - 1; i >= 0; i--)
- {
- int dex = l2.IndexOf(l1[i]);
- if (dex != -1)
- {
- l1.RemoveAt(i);
- l2.RemoveAt(dex);
- psn++;
- }
- }
- prn = (l1.Count + l2.Count) ;
- }
- public override string ToString()
- {
- StringBuilder vr = new StringBuilder();
- vr.Append(JoinSpace(nazev) + "-" + JoinSpace(title));
- if (remix.Count != 0)
- {
- vr.Append(" [" + JoinSpace(remix) + "]");
- }
- return vr.ToString();
- }
- private IEnumerable<string> SplitRemix(string u)
- {
- //return u.Split(new string[] { " ", "[", "]", "(", ")" }, StringSplitOptions.RemoveEmptyEntries).All(g => g.ToLower()); ;
- List<string> gg = u.Split(new string[] { " ", "[", "]", "(", ")" }, StringSplitOptions.RemoveEmptyEntries).ToList();
- //gg.ForEach(g => g.ToLower());
- for (int i = 0; i < gg.Count; i++)
- {
- gg[i] = gg[i].ToLower();
- }
- return gg;
- }
- private IEnumerable<string> SplitNazevTitle(string u)
- {
- List<string> gg = u.Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries).ToList();
- //gg.ForEach(g => g.ToLower());
- for (int i = 0; i < gg.Count; i++)
- {
- gg[i] = gg[i].ToLower();
- }
- return gg;
- }
- private string JoinSpace(List<string> nazev)
- {
- StringBuilder sb = new StringBuilder();
- foreach (string item in nazev)
- {
- sb.Append(item + " ");
- }
- return sb.ToString().TrimEnd(' ');
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment