~ubuntu-branches/ubuntu/trusty/sunpinyin/trusty-proposed

« back to all changes in this revision

Viewing changes to src/slm/getWordFreq/getWordFreq.cpp

  • Committer: Bazaar Package Importer
  • Author(s): Zhengpeng Hou
  • Date: 2010-09-06 12:23:46 UTC
  • Revision ID: james.westby@ubuntu.com-20100906122346-yamofztk2j5p85fs
Tags: upstream-2.0.2
ImportĀ upstreamĀ versionĀ 2.0.2

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
 
3
 * 
 
4
 * Copyright (c) 2007 Sun Microsystems, Inc. All Rights Reserved.
 
5
 * 
 
6
 * The contents of this file are subject to the terms of either the GNU Lesser
 
7
 * General Public License Version 2.1 only ("LGPL") or the Common Development and
 
8
 * Distribution License ("CDDL")(collectively, the "License"). You may not use this
 
9
 * file except in compliance with the License. You can obtain a copy of the CDDL at
 
10
 * http://www.opensource.org/licenses/cddl1.php and a copy of the LGPLv2.1 at
 
11
 * http://www.opensource.org/licenses/lgpl-license.php. See the License for the 
 
12
 * specific language governing permissions and limitations under the License. When
 
13
 * distributing the software, include this License Header Notice in each file and
 
14
 * include the full text of the License in the License file as well as the
 
15
 * following notice:
 
16
 * 
 
17
 * NOTICE PURSUANT TO SECTION 9 OF THE COMMON DEVELOPMENT AND DISTRIBUTION LICENSE
 
18
 * (CDDL)
 
19
 * For Covered Software in this distribution, this License shall be governed by the
 
20
 * laws of the State of California (excluding conflict-of-law provisions).
 
21
 * Any litigation relating to this License shall be subject to the jurisdiction of
 
22
 * the Federal Courts of the Northern District of California and the state courts
 
23
 * of the State of California, with venue lying in Santa Clara County, California.
 
24
 * 
 
25
 * Contributor(s):
 
26
 * 
 
27
 * If you wish your version of this file to be governed by only the CDDL or only
 
28
 * the LGPL Version 2.1, indicate your decision by adding "[Contributor]" elects to
 
29
 * include this software in this distribution under the [CDDL or LGPL Version 2.1]
 
30
 * license." If you don't indicate a single choice of license, a recipient has the
 
31
 * option to distribute your version of this file under either the CDDL or the LGPL
 
32
 * Version 2.1, or to extend the choice of license to its licensees as provided
 
33
 * above. However, if you add LGPL Version 2.1 code and therefore, elected the LGPL
 
34
 * Version 2 license, then the option applies only if the new code is made subject
 
35
 * to such option by the copyright holder. 
 
36
 */
 
37
 
 
38
#ifdef HAVE_CONFIG_H
 
39
#include "config.h"
 
40
#endif
 
41
 
 
42
#include <stdio.h>
 
43
#include <string.h>
 
44
#include <math.h>
 
45
#include <unistd.h>
 
46
#include <stdlib.h>
 
47
 
 
48
#include <vector>
 
49
#include <iostream>
 
50
 
 
51
#include "../slm.h"
 
52
 
 
53
using namespace std;
 
54
 
 
55
static void
 
56
showUsage()
 
57
{
 
58
    cerr << "Usage:\n";
 
59
    cerr << "getWordFreq [-s corpus_size] [-v] [-e] -m slm_file -l lexicon\n";
 
60
    cerr << "    default corpus_size is 300000000 if not given\n";
 
61
    cerr << "    -v means output other information after word and freq for each line\n";
 
62
    cerr << "    -e give format for ervin\n";
 
63
    exit(10);
 
64
}
 
65
 
 
66
static char* slm_file = NULL;
 
67
static char* lexicon_file = NULL;
 
68
static int   corpus_size = 300000000;
 
69
static bool  verbose = false;
 
70
static bool  ervin   = false;
 
71
 
 
72
static bool
 
73
getParameters(int argc, char* argv[])
 
74
{
 
75
    int ch;
 
76
    while ((ch = getopt(argc, argv, "m:l:s:ve")) != -1) {
 
77
        switch (ch) {
 
78
        case 'm':
 
79
            slm_file = strdup(optarg); break;
 
80
        case 'l':
 
81
            lexicon_file = strdup(optarg); break;
 
82
        case 's':
 
83
            corpus_size = atoi(optarg); break;
 
84
        case 'v':
 
85
            verbose = true; break;
 
86
        case 'e':
 
87
            ervin = true; break;
 
88
        default:
 
89
            return false;
 
90
        }
 
91
    }
 
92
    return (slm_file && lexicon_file && corpus_size > 10);
 
93
}
 
94
 
 
95
static char buf[8192];
 
96
 
 
97
static void
 
98
tagFile(FILE *fp, CThreadSlm& slm)
 
99
{
 
100
    int freq = 0;
 
101
    while (fgets(buf, sizeof(buf), fp) != NULL) {
 
102
        freq = 0;
 
103
        char* wrd = strtok(buf, "\n\r \t");
 
104
        char* idstr = strtok(NULL, "\n\r \t");
 
105
        char* info = strtok(NULL, "\n\r");
 
106
        if (wrd && idstr) {
 
107
            int id = atoi(idstr);
 
108
            if (id > 0) {
 
109
                CThreadSlm::TState st;
 
110
                double neglogpr = slm.transfer(st, (unsigned int)id, st);
 
111
                if (st.getLevel() == 1) {
 
112
                    freq = int(exp(-neglogpr) * corpus_size);
 
113
                }
 
114
            }
 
115
        }
 
116
        if (wrd) {
 
117
            if (ervin) {
 
118
                vector<char* > pyv;
 
119
                if (info) {
 
120
                    for (char *p = strtok(info, " \t\n\r"); p != NULL; p = strtok(NULL, " \t\n\t"))
 
121
                        pyv.push_back(p);
 
122
                }
 
123
                for (int i=0, sz=pyv.size(); i < sz; ++i) {
 
124
                    cout << wrd << " " << pyv[i] <<  " " << freq << "\n";
 
125
                }
 
126
            } else if (idstr && verbose) {
 
127
                cout << wrd << " " << idstr <<  " " << freq;
 
128
                if (info)
 
129
                    cout << " " << info;
 
130
                cout << "\n";
 
131
            } else {
 
132
                cout << wrd << " " << freq << "\n";
 
133
            }
 
134
        }
 
135
    }
 
136
}
 
137
 
 
138
int
 
139
main(int argc, char*argv[])
 
140
{
 
141
    if (!getParameters(argc, argv))
 
142
        showUsage();
 
143
 
 
144
    FILE *fp;
 
145
    CThreadSlm slm;
 
146
    if (slm.load(slm_file, true) && (fp = fopen(lexicon_file, "r")) != NULL) {
 
147
        tagFile(fp, slm);
 
148
        slm.free();
 
149
        fclose(fp);
 
150
        return 0;
 
151
    } else {
 
152
        slm.free();
 
153
        return 20;
 
154
    }
 
155
}
 
156
 
 
157
 
 
158
 
 
159