Avatar billede jps6kb Novice
04. august 2009 - 21:50 Der er 5 kommentarer og
1 løsning

"mente du"-funktion - som Google

Hey,

Er der nogen der kender til den "nemme" måde, at lave en "Mente du"-funktion? ligesom ex. Google hvis en søgning ikke giver et resultat? Graciás
Avatar billede arne_v Ekspert
04. august 2009 - 23:11 #1
Nu skal du jo nok ikke forvente at få noget kode som gør at du kan udkonkurrere Google i næste uge.

:-)

Men prøv og se om ikke følgende kode (som er hacket sammen udfra lidt Java kode jeg havde på lageret og lidt adhoc kode) kan give nogle ideer:

using System;
using System.Collections.Generic;
using System.Text;
using System.Text.RegularExpressions;

namespace E
{
    public static class Fonetic
    {
        public static string Convert(string s)
        {
            string s2 = s.ToLower();
            s2 = s2.Replace("æ", "ae");
            s2 = s2.Replace("ø", "oe");
            s2 = s2.Replace("å", "aa");
            s2 = s2.Replace("u", "v");
            s2 = s2.Replace("ph", "f");
            s2 = s2.Replace("ch", "k");
            s2 = Regex.Replace(s2, "([gkrst])(h)", "$1");
            s2 = s2.Replace("ds", "s");
            s2 = s2.Replace("nd", "n");
            s2 = s2.Replace("c", "k");
            s2 = s2.Replace("d", "t");
            s2 = s2.Replace("w", "v");
            s2 = s2.Replace("z", "s");
            s2 = s2.Replace("x", "s");
            StringBuilder sb = new StringBuilder();
            sb.Append(s2[0]);
            for(int i = 1; i < s2.Length & sb.Length <= 4; i++) {
                if("aeiouyæøå".IndexOf(s2[i]) < 0
                  && s2[i] != s2[i-1]) {
                    sb.Append(s2[i]);
                }
            }
            return sb.ToString();
        }
    }
    public class TeraByteDatabaseSimulator
    {
        private static readonly char[] WORD_DELIM = { ' ', ',', '.', '!', '?', '"', '\'' };
        private Dictionary<string, string> map = new Dictionary<string, string>();
        public void InsertText(string txt)
        {
            foreach(string word in txt.Split(WORD_DELIM, StringSplitOptions.RemoveEmptyEntries))
            {
                string key = Fonetic.Convert(word);
                if(!map.ContainsKey(key))
                {
                    map.Add(key, word);
                }
                else
                {
                    map[key] = word;
                }
            }
        }
        public string Suggest(string txt)
        {
            StringBuilder sb = new StringBuilder();
            int ix = 0;
            foreach(string word in txt.Split(WORD_DELIM, StringSplitOptions.RemoveEmptyEntries))
            {
                string key = Fonetic.Convert(word);
                if(!map.ContainsKey(key))
                {
                    sb.Append(word);
                }
                else
                {
                    sb.Append(map[key]);
                }
                ix = txt.IndexOf(word, ix) + word.Length;
                if(ix < txt.Length) sb.Append(txt[ix]);
            }
            return sb.ToString();
        }
    }
    public class Program
    {
        private static TeraByteDatabaseSimulator db = new TeraByteDatabaseSimulator();
        public static void Test(string s)
        {
            Console.WriteLine(s);
            Console.WriteLine(db.Suggest(s));
        }
        public static void Main(string[] args)
        {
            db.InsertText("Snehvide og de syv dværge, Tornerose og den grimme ælling er alle tre eventyr.");
            db.InsertText("Hej, Er der nogen der kender til den nemme måde, at lave en \"Mente du\"-funktion? ligesom f.eks. Google hvis en søgning ikke giver et resultat?");
            db.InsertText("Efter besøg fra Bill Clinton har Nordkoreas diktator benådet to amerikanske journalister, der var idømt strafarbejde. Nordkoreas diktator Kim Jong Il har besluttet at løslade to amerikanske journalister, skriver nyhedsbureauerne.");
            Test("Er Bil Klinton's success et eventor eller et result af hårdt arbejde?");
            Console.ReadKey();
        }
    }
}
Avatar billede jps6kb Novice
05. august 2009 - 09:01 #2
Nej, en måned er også fint. :)
Tak for det... jeg kigger lige på det og vender tilbage.
Avatar billede hojgaard Nybegynder
13. august 2009 - 19:50 #3
Du kunne også vælge at lave en fonetisk søgning.
Flere databaser har funktion til dette indbygget - prøv søg efter 'soundex'.

Desværre er databaserne ikke så gode til "dansk", men det er helt sikkert en super måde at komme hurtigt i gang :)
Avatar billede arne_v Ekspert
14. august 2009 - 00:49 #4
Har du lagt mærke til hvad klassenavnet er på min første klasse ?
Avatar billede hojgaard Nybegynder
14. august 2009 - 09:41 #5
Hej Arne - nej, det havde jeg ikke set :)

Jeg ville såmænd bare gøre opmærksom på at flere databaser har indbygget funktion til fonetisk søgning (soundex).
Avatar billede arne_v Ekspert
13. september 2009 - 03:39 #6
all set ?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester