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
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();
}
}
}
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 :)
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).