Weka学习 -- StringToWordVector 源代码学习(1)
代码整个运行流程
- 參数设置
- 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.
Weka学习 -- StringToWordVector 源代码学习(1)的更多相关文章
- 贪吃蛇游戏C语言源代码学习
源代码下载地址为:www.clang.cc 阅读学习了源代码,并做了简单的注释和修改,里面只用了链表数据结构,非常适合C语言入门者学习阅读. 程序可在VS2013下编译运行. #include< ...
- struts2源代码学习之初始化(一)
看struts2源代码已有一段时日,从今天開始,就做一个总结吧. 首先,先看看怎么调试struts2源代码吧,主要是下面步骤: 使用Myeclipse创建一个webproject 导入struts2须 ...
- [Java] LinkedList / Queue - 源代码学习笔记
简单地画了下 LinkedList 的继承关系,如下图.只是画了关注的部分,并不是完整的关系图.本博文涉及的是 Queue, Deque, LinkedList 的源代码阅读笔记.关于 List 接口 ...
- 开源中国安卓client源代码学习(一) 渐变启动界面
开源中国安卓client源代码学习(一) 渐变启动界面 准备学习安卓开发, 看到网上有人推荐开源中国安卓client的源代码, 说里面包括了大部分技术, 于是准备好好研究研究. 特开通此系列博客来记录 ...
- 读Flask源代码学习Python--config原理
读Flask源代码学习Python--config原理 个人学习笔记,水平有限.如果理解错误的地方,请大家指出来,谢谢!第一次写文章,发现好累--!. 起因 莫名其妙在第一份工作中使用了从来没有接 ...
- nginx源代码学习资源(不断更新)
nginx源代码学习是一个痛苦又快乐的过程,以下列出了一些nginx的学习资源. 首先要做的当然是下载一份nginx源代码,能够从nginx官方站点下载一份最新的. 看了nginx源代码,发现这是一份 ...
- JDK源代码学习系列07----Stack
JDK源代码学习系列07----Stack 1.Stack源代码很easy ...
- djangorestframework-jwt自带的认证视图进行用户登录验证源代码学习
Django REST framework JWT djangorestframework-jwt自带的认证视图进行用户登录验证源代码学习 SECRET_KEY = '1)q(f8jrz^edwtr2 ...
- JDK源代码学习系列04----ArrayList
JDK源代码学习系列04----ArrayList 1 ...
随机推荐
- Oracle - java创建Oracle 的触发器
Oracle - java创建Oracle 的触发器 今天碰到这个问题,遇到点问题,到这来 总结一下解决的办法, 需求,为一个用户当中的表增加一个自动增长列,我还没有学Oracle 的这部分,只是简单 ...
- Javascript parseFloat、parseDouble类型转换,数值加减,四舍五入
<script language="JavaScript">var a = "0.11";var b = "0.2801";va ...
- 文本域、bootstrap-table显示以及MySQL三者间的换行符问题
首先,今天在做项目的时候遇到的一个问题,如何实现文本输入换行以及在前台Bootstrap-table中显示也能够换行. 也许你马上就会想到说,用富文本编辑器,然而我们需要实现的只是文本输入以及换行功能 ...
- C语言控制流语句
title: 2017-10-18控制流 tags: binsearch else-if, shellsort, insertsort grammar_cjkRuby: true --- 前段时间忙着 ...
- node使用buffer生成图片
buffer是node里的一个模块,这个模块的出现是因为js没有阅读和操作二进制数据流而出现的 buffer是什么及作用? Buffer顾名思义叫缓冲区,用于存储速度不同步的设备或优先级不同的设备之间 ...
- 书写规范的javaScript
书写可维护的代码 代码的维护,修改以及扩展都是需要时间和人力成本的,所以为了减少浪费不必要的成本,从一开始就要书写可维护的代码,这样给自己也给项目其他人提供便利. 书写可维护的代码意味着你的代码是: ...
- ligerUI---ListBox(列表框可移动)
写在前面: 对于可移动的列表框,ligerui中也对其进行了封装,可以直接照着demo拿来用,不过那都是直接在页面上静态初始化的数据,那么如何从后台获取? 前面有了对ligerui的一些组件的使用经验 ...
- C++ UTF8和GB2312相互转换
#include <Windows.h> #include <string> using std::string; void UTF8_to_GB2312(const char ...
- Maven多模块的开发项目搭建
系统越复杂,所有的业务逻辑都放在一个项目里,各个包之间的业务逻辑相互调用,这样添加了开发成本,同时对之后的系统维护,错误排查带来一定的麻烦. 通过Maven的多模块开发,把一个系统拆分成多个模块,通过 ...
- Python之三目运算符
Python语言不像Java.JavaScript等这些语言有类似: 判段的条件?条件为真时的结果:条件为假时的结果 这样的三目运算,但是Python也有自己的三目运算符: 条件为真时的结果 if 判 ...