Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[MSSQL] Reverse Stemming

Pagina: 1
Acties:

  • Mir
  • Registratie: Maart 2001
  • Niet online
Hoi,

De titel dekt de lading, maar zal wel wat vragen oproepen :)

MsSQL heeft heel mooi de mogelijkheid tot stemming (eten, at, gegeten, ...). Met de volgende SQL query kan je dat mooi doen:


SQL:
1
Select Woord from StemmingTabel where FREETEXT(*,'eten')


Als er in 'Woord' zich "eten", "at" en "lopen" staat, zal het resultaat zijn:
code:
1
2
eten
at


Maar ik wil het andersom. Ik wil aan MsSQL kunnen vragen "wat zijn de mogelijkheden voor 'eten' ?".
Dan zou hij terug kunnen geven:
code:
1
2
3
4
5
eten
gegeten
at
eet
...


Kan dit?

-Dit zou eventueel ook in C# mogen (een library, third party class, ...)

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Ik heb even geen MSSQL bij de hand, maar staan in C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\FTData niet van die stemming files?

edit: hmmmmm.... en het blijkt dat je in HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\ContentIndex\Language de stemmers kunt vinden. Wellicht dat je daar weer de dll kunt opsporen etc.
edit:

Jup: C:\windows\system32\infosoft.dll :Y) Of je er wat mee kan moet je maar even zien ;)


En na wat nader onderzoek: http://sqljunkies.com/WebLog/acencini/articles/616.aspx

En na wat devven:

In: Eten
Out:
code:
1
2
3
4
5
6
7
PutAltWord Buffer: eten
PutAltWord Buffer: etend
PutAltWord Buffer: etende
PutAltWord Buffer: at
PutAltWord Buffer: aten
PutAltWord Buffer: gegeten
PutWord Buffer: eet

*O*

[ Voor 91% gewijzigd door RobIII op 28-02-2008 15:42 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • Mir
  • Registratie: Maart 2001
  • Niet online
Te gek tnx!

Nu kan ik fijn 2 kanten opwerken! :)

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Dat wordt dus zoiets dan:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
using System;
using System.Collections.Generic;
using System.Reflection;
using System.Runtime.InteropServices;

namespace Devcorner.FullText.Stemming
{
    #region COM
    [ComImport, Guid("fe77c330-7f42-11ce-be57-00aa0051fe20")]
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    public interface IWordFormSink
    {
        void PutAltWord([MarshalAs(UnmanagedType.LPWStr)] string pwcInBuf, [MarshalAs(UnmanagedType.U4)] int cwc);
        void PutWord([MarshalAs(UnmanagedType.LPWStr)] string pwcInBuf, [MarshalAs(UnmanagedType.U4)] int cwc);
    }

    [ComImport, Guid("efbaf140-7f42-11ce-be57-00aa0051fe20"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    public interface IStemmer
    {
        void Init([MarshalAs(UnmanagedType.U4)] int ulMaxTokenSize, [MarshalAs(UnmanagedType.Bool)] out bool pfLicense);
        void GenerateWordForms([MarshalAs(UnmanagedType.LPWStr)] string pwcInBuf, [MarshalAs(UnmanagedType.U4)] int cwc, [MarshalAs(UnmanagedType.Interface)] IWordFormSink pStemSink);
        void GetLicenseToUse([MarshalAs(UnmanagedType.LPWStr)] out string ppwcsLicense);
    }

    public class WordFormSink : IWordFormSink
    {
        private List<string> _altwords = new List<string>();
        private List<string> _words = new List<string>();

        public List<string> AltWords
        {
            get { return _altwords; }
            set { _altwords = value; }
        }

        public List<string> Words
        {
            get { return _words; }
            set { _words = value; }
        }

        public void PutAltWord(string pwcInBuf, int cwc)
        {
            this.AltWords.Add(pwcInBuf.Substring(0, cwc));
            //Trace.WriteLine("PutAltWord Buffer: " + pwcInBuf.Substring(0, cwc));
        }

        public void PutWord(string pwcInBuf, int cwc)
        {
            this.Words.Add(pwcInBuf.Substring(0, cwc));
            //Trace.WriteLine("PutWord Buffer: " + pwcInBuf.Substring(0, cwc));
        }
    }
    #endregion

    #region Stemmers
    [ComImport, Guid("d99f7670-7f1a-11ce-be57-00aa0051fe20")]
    public class UKStemmer { }

    [ComImport, Guid("860d28d0-8bf4-11ce-be59-00aa0051fe20")]
    public class NLStemmer { }

    [ComImport, Guid("eeed4c20-7f1b-11ce-be57-00aa0051fe20")]
    public class USStemmer { }

    [ComImport, Guid("2a6eb050-7f1c-11ce-be57-00aa0051fe20")]
    public class FRStemmer { }

    [ComImport, Guid("510a4910-7f1c-11ce-be57-00aa0051fe20")]
    public class DEStemmer { }

    [ComImport, Guid("6d36ce10-7f1c-11ce-be57-00aa0051fe20")]
    public class ITStemmer { }

    [ComImport, Guid("b0516ff0-7f1c-11ce-be57-00aa0051fe20")]
    public class ESStemmer { }

    [ComImport, Guid("9478f640-7f1c-11ce-be57-00aa0051fe20")]
    public class SEStemmer { }
    #endregion

    public class Stemmer
    {
        private IStemmer _stmr;

        public Stemmer(string LNCode)
        {
            Type T = Assembly.GetExecutingAssembly().GetType("Devcorner.FullText.Stemming." + LNCode + "Stemmer", true, true);
            _stmr = (IStemmer)Activator.CreateInstance(T);
        }

        public WordFormSink GenerateWordForms(string value)
        {
            WordFormSink wfs = new WordFormSink();
            bool pfLicense = false;
            _stmr.Init(1000, out pfLicense);
            string tokStr = value;
            _stmr.GenerateWordForms(tokStr, tokStr.Length, wfs);
            return wfs;
        }
    }
}


En het gebruik:
C#:
1
2
3
4
5
6
7
8
9
10
Stemmer stmr = new Stemmer("nl");
WordFormSink wfs = stmr.GenerateWordForms("eten");

Console.WriteLine("\r\nWords:");
foreach (string s in wfs.Words)
    Console.WriteLine(s);

Console.WriteLine("\r\nAltWords:");
foreach (string s in wfs.AltWords)
    Console.WriteLine(s);

Werkt met nl, uk, us, fr, de, it, es en se :Y)

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
In: Laufen

Words:
laufet

AltWords:
laufen
gelaufen
laufend
lief
liefe
liefen
liefest
liefet
liefst
lieft
läufst
läuft
lauft
laufe
laufest


code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
In: manger

Words:
mangeâtes

AltWords:
manger
mangera
mangerai
mangeraient
mangerais
mangerait
mangeras
mangerez
mangeriez
mangerions
mangerons
mangeront
mangiez
mangions
mangé
mangée
mangées
mangés
mangèrent
mange
mangea
mangeai
mangeaient
mangeais
mangeait
mangeant
mangeante
mangeantes
mangeants
mangeas
mangeasse
mangeassent
mangeasses
mangeassiez
mangeassions
mangent
mangeons
manges
mangez
mangeâmes
mangeât

*O* :Y)

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Verwijderd

Just curious, RobIII, had je die code al liggen, of werd je geprikkeld om 't uit te zoeken?
Nette wrapper die precies doet wat 'ie moet doen, en de applicatie-progger ver houdt van COM en GUIDs en zo, complimenten!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Die code is afgeleid van de url die ik eerder postte (en dan is afgeleid nog slap; het is eerder gejat en verbouwd :P ). Echt netjes vind ik het nog niet, maar 't does the job en was voor een probeerseltje meer dan genoeg :P Ik werd nieuwschierig van de vraag en ben toen zelf wat gaan spitten op google, in het register, in de DLL etc. en kwam toen hierop uit.

Ik mag dan wel met slotjes smijten, ik weet soms ook nog waar ik het over heb :+
Maar thanks voor 't compliment; ook al is het dan niet helemaal zélf verdiend ;)

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij

Pagina: 1