代码整个运行流程
- 參数设置
- input数据,设置数据格式
- batchFinished(),处理数据(Tokenzier,Stemming,Stopwords)
- determineDictionary(); 统计计算(TF,IDF)
- 归一化
- output
一些变量和方法的作用
- m_Dictionary , m_DocsCounts 变量与 m_OutputCounts变量
意义
//TreeMap类型成员变量m_Dictionary 记录<word,新属性index>对;详细类型为TreeMap<String,Integer>, 每个String 的word所映射的index。
// 计算每一个单词在多少个文档中出现过,保存在这个数组。
数组index是word相应映射的index(与m_Dictionary相应)。
//控制m_Dictionary 中的Integer是输出0/1(表示单词是否在文档中出现),还是count单词在文档中出现的次数。
一般要将它设置为true。
- m_minTermFreq 和 m_WordsToKeep
- 内部类Count 类及变量的意义
- 改动详细的TF*IDF公式:
if (m_TFTransform == true) {
|D| / |{d \in D : t\ind}| ). D表示全部的文档集。
log(value)中的value肯定大于等于1 //当然这里需保证分母不为0,即word至少在一个文档中出现过,否则可idf(t,D)= log(
|D| / |{d \in D : t\ind}|+1 ).
|D| / |{d \in D : t\ind}| )
当然也能够依据须要详细改动(TFIDF详细信息wiki就可以)
/
(double) m_DocsCounts[index.intValue()] ),也即把原先记录的词频fij变成fij*log(文档数/该单词在多少个文档中出现过)。就是我们用的TF-IDF。
注意假设要达到这个效果仅仅有把m_IDFTransform
以及m_OutputCounts同一时候设置成true,并保持m_TFTransform为false(否则的话就是两个log相乘了)。
- Normalization
归一化主要针对TF(t,d_单词频率(单词t在文档d中出现的次数)的来进行归一化。
经常用法:
//FILTER_NORMALIZE_ALL 能够换位 FILTER_NORMALIZE_TEST_ONLY
或 FILTER_NONE
//-N 1 表示採用FILTER_NORMALIZE_ALL=1 归一化方法。
public static final int FILTER_NORMALIZE_TEST_ONLY = 2;
忽略nominal类型的列。
- Tokenzier
StringToWordVector中。默认的tokenzier。 -tokenizer weka.core.tokenizers.WordTokenizer -delimiters " \r\n\t.,;:\'\"()?!"
Tokenzier的作用就是对于一个长的String,遍历扫描一遍。按那些字符进行切分。
若须要按句子为单位进行切分,能够新建新的Tokenzier,选择- delimiters 为". ! \n ? "或中文句子结束符号“。!
?”等
- Stemmer
若须要按句子为单位进行切分,能够新建新的Tokenzier,选择- delimiters 为". ! \n ? "或中文句子结束符号“。!
?”等
morphology and information
retrieval, stemming is
the process for reducing inflected (or sometimes derived) words to their stem,
base or rootform—generally
a written word form. 如能将cats,catlike。catty等word都转化为词根cat。
by Martin Porter1980,extend at 2000,建议用这个。但不可直接使用,须要下载包。)两类。这Weka里面自带的Stemmer都是针对英语语言的。自己能够依据须要进行更改。
此外还有PTStemmer等,下载对应的jar包都能够使用。详细使用參考http://weka.wikispaces.com/Stemmers
特点:简单易用,但table表量比較大。
derived words 去掉。
②对于汉语的话。就相当于把同义词转换为同一个词? 这样也不太好,应该是把类型”吃了吗”,“吃饭了吗”,“吃饭了没”转化为同一个词。
如将以ed。ing,ly结尾的词去掉其后缀,生成词根。动词的时态大部分有规则。一部分没规则,对于没规则的能够建一个lookup表。二者相结合。
- StopWords
当然对于派生词或中午近义词等。在这里进行过滤会stoplist会更短一点(由于word已经经过Stemming了)。
- StringToWordVector默认不採用不论什么停止词。
- 设置採用默认停止词rainbow(英文)m_useStoplist。
- 自己定义停止词。覆盖默认停止词File m_Stopwords
通过StringToWordVector.setStopwords(new File(stopwordfile));方法能够设置自己定义的停止词。同一时候默认的停止词不在生效。
(知道这样的效果就先用着,详细实现代码待细看^_^)
- Tokenizer、Stemming与 Stopwords的顺序:
- 首先Tokenizer。依据单词切割符取出word。
若默认的 WordTokenizer
採用" \r\n\t.,;:\'\"()?!" 等英文切割符。这一部会把"boy."等后面的‘.'句号或感叹号等都去掉。也可弥补IKAnalyzer中文分词不足。
- 然后Stemming。取出词根。
- 最后在轮到Stopwords。
stopwords.is(word)做词根word在stopword的list中,则取出。应该不会对此单词进行map映射和在vector出现。
filter.setStopwords(new File(stopwordfile));
这样设置一下,就能够将stopwordfile中的word(一行一个)当成stopword啦。
- SparseInstance
:
{0 class3,2 2,3 3,6 1,7 1,13 1}
。 如3 ?
. Note that the omitted values in a sparse instance are 0, they are not "missing" values! If a value is unknown, you must explicitly represent it with a question mark (?).
都会把第一个string或nominal的值存储为0。 SparseInstances这里这样表示并非一个bug,能够视为一个‘display’bug。你保存arff数据会发现和你读取的数据是一样的。
- 其它
- StrngToWordVector默认仅仅对全部的属性进行字符串转word向量,你能够设置指定的属性进行转换。
- StringToWordVector会将全部的非转换的属性放在处理后的Instances的前面, 当中firstCopy 在函数中的意思是表明前面有多少个非处理的属性。
如有3个不用处理的属性。firstCopy就是3.