/* Zet alle data uit /net/corpora/LassyDevelop/Sonar/SONAR500/DATA in MongoDB. Server: 127.0.0.1:27047 Database: sonar500 Collecties: 1 per directory, zonder de beschrijving, bijvoorbeeld: WR-P-E-E Items, per zin: i : id, bijvoorbeeld: WR-P-E-E-0000000018.p.1.s.1 s : alle woorden aan elkaar, alles wat geen a-z of A-Z is verwijderd, daarna omgezet naar kleine letters, voorbeeld: ditisnvoorbeeld k : als s, maar ingekort tot de eerste 100 bytes w : alle woorden ongewijzigd aan elkaar, met spaties ertussen, voorbeeld: Dit is één voorbeeld . Indexen aangemaakt op elementen i en k. */ package main import ( "bytes" "encoding/xml" "github.com/pebbe/util" "io/ioutil" "labix.org/v2/mgo" "os" "regexp" "strings" ) // voor invoer vanuit XML type Word struct { T string `xml:"t"` } // voor invoer vanuit XML type Sentence struct { XMLName xml.Name `xml:"s"` ID string `xml:"id,attr"` Words []Word `xml:"w"` } // voor uitvoer naar JSON type Record struct { I string // ID S string // zin: alleen letters a-z K string // zin: alleen letters a-z, eerste 100 tekens W string // complete zin } var ( servers = "127.0.0.1:27047" ) func main() { noalpha := regexp.MustCompile("[^a-zA-Z]+") session, err := mgo.Dial(servers) util.CheckErr(err) defer session.Close() util.CheckErr(os.Chdir("/net/corpora/LassyDevelop/Sonar/SONAR500/DATA")) // voor alle directory's dirinfos, err := ioutil.ReadDir(".") util.CheckErr(err) for _, dirinfo := range dirinfos { if !dirinfo.IsDir() { continue } dirname := dirinfo.Name() // open collectie met sonar ID als naam van collectie colname := strings.Split(dirname, "_")[0] collection := session.DB("sonar500").C(colname) collection.DropCollection() // voor alle bestanden in de directory fileinfos, err := ioutil.ReadDir(dirname) util.CheckErr(err) for _, fileinfo := range fileinfos { filename := fileinfo.Name() if !strings.HasSuffix(filename, ".folia.xml") { continue } // bestand inlezen data, err := ioutil.ReadFile(dirname + "/" + filename) util.CheckErr(err) // voor alle zinnen in het bestand parts := bytes.SplitAfter(data, []byte("")) parts = parts[:len(parts)-1] // stuk na laatste bevat geen zin for _, p := range parts { part := p[bytes.Index(p, []byte(" 100 { kort = kort[:100] } // record maken, en opslaan in mongo r := Record{ I: sentence.ID, S: text, K: kort, W: strings.Join(words, " "), } util.CheckErr(collection.Insert(r)) } } // directory is klaar, nu indexen aanmaken util.CheckErr(collection.EnsureIndexKey("i")) util.CheckErr(collection.EnsureIndexKey("k")) } }