随笔 - 109  文章 - 0  评论 - 32 
  2010年3月5日
在用nutch抓取网页的时候,设置了10层,运行5个多小时之后,系统提示内存溢出异常:
java.lang.OutOfMemoryError: Java heap space
fetcher caught:java.lang.OutOfMemoryError: Java heap space
java.lang.OutOfMemoryError: Java heap space
fetcher caught:java.lang.OutOfMemoryError: Java heap space
Exception in thread "main" java.io.IOException: Job failed!
at org.apache.hadoop.mapred.JobClient.runJob(JobClient.java:604)
at org.apache.nutch.fetcher.Fetcher.fetch(Fetcher.java:470)
at org.apache.nutch.crawl.Crawl.main(Crawl.java:124)

问题分析:
 
解决办法1:
Add the following to hadoop-site.xml.  This sets the Java heap size for the
spawned child process.  You can set it to whatever you want.  I believe the
default size is 200 MB which is way too small.

<property>
  <name>mapred.child.java.opts</name>
  <value>-Xmx512m</value>
</property>
 
解决办法2:
 increase the heapsize available to your java VM. Do this using the Run->"Open Run Dialog" menu, clicking the arguments tab and setting the vm arguments to include -Xmx1024m (or something larger, if need be). Obviously, it doesn't really make sense to run jobs over huge datasets on your puny little laptop. You should debug and develop only on a small portion of the actual data.
 
相关资料:
Re: java.lang.OutOfMemoryError: Java heap space
>
>>
>> On Thu, Sep 18, 2008 at 4:19 PM, Edward Quick <edwardquick@...> wrote:
>> >
>> > Hi,
>> >
>> > I'm getting java.lang.OutOfMemoryError: Java heap space errors when running nutch in a hadoop cluster.
>> > I have doubled the heap by setting export HADOOP_HEAPSIZE=2048 in hadoop-env.sh but this doesn't seem to make a difference.
>> >
>> > I'm need to hadoop so appreciate any help.
>> >
>>
>> Are you parsing during fetching? If so try disabling that and run
>> parsing as a separate job. At least, you
>> won't lose the results of fetching :)
>
>
> The threads in nutch-site.xml were set too high (at 50) so I put those down to 10 and it seems ok now.
>
posted @ 2010-03-05 09:27 Myhsg 阅读(293) 评论(0) 编辑
  2010年3月1日

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/forfuture1978/archive/2009/10/22/4711308.aspx

 

一、总论
根据http://lucene.apache.org/java/docs/index.html 定义:

Lucene 是一个高效的,基于Java 的全文检索库。

所以在了解Lucene之前要费一番工夫了解一下全文检索。

那么什么叫做全文检索呢?这要从我们生活中的数据说起。

我们生活中的数据总体分为两种:结构化数据 和非结构化数据 。

结构化数据: 指具有固定格式或有限长度的数据,如数据库,元数据等。
非结构化数据: 指不定长或无固定格式的数据,如邮件,word文档等。
当然有的地方还会提到第三种,半结构化数据,如XML,HTML等,当根据需要可按结构化数据来处理,也可抽取出纯文本按非结构化数据来处理。

非结构化数据又一种叫法叫全文数据。


按照数据的分类,搜索也分为两种:

对结构化数据的搜索 :如对数据库的搜索,用SQL语句。再如对元数据的搜索,如利用windows搜索对文件名,类型,修改时间进行搜索等。
对非结构化数据的搜索 :如利用windows的搜索也可以搜索文件内容,Linux下的grep命令,再如用Google和百度可以搜索大量内容数据。
对非结构化数据也即对全文数据的搜索主要有两种方法:

一种是顺序扫描法 (Serial Scanning): 所谓顺序扫描,比如要找内容包含某一个字符串的文件,就是一个文档一个文档的看,对于每一个文档,从头看到尾,如果此文档包含此字符串,则此文档为我们要找的文件,接着看下一个文件,直到扫描完所有的文件。如利用windows的搜索也可以搜索文件内容,只是相当的慢。如果你有一个80G硬盘,如果想在上面找到一个内容包含某字符串的文件,不花他几个小时,怕是做不到。Linux下的grep命令也是这一种方式。大家可能觉得这种方法比较原始,但对于小数据量的文件,这种方法还是最直接,最方便的。但是对于大量的文件,这种方法就很慢了。

有人可能会说,对非结构化数据顺序扫描很慢,对结构化数据的搜索却相对较快(由于结构化数据有一定的结构可以采取一定的搜索算法加快速度),那么把我们的非结构化数据想办法弄得有一定结构不就行了吗?

这种想法很天然,却构成了全文检索的基本思路,也即将非结构化数据中的一部分信息提取出来,重新组织,使其变得有一定结构,然后对此有一定结构的数据进行搜索,从而达到搜索相对较快的目的。

这部分从非结构化数据中提取出的然后重新组织的信息,我们称之索引 。

这种说法比较抽象,举几个例子就很容易明白,比如字典,字典的拼音表和部首检字表就相当于字典的索引,对每一个字的解释是非结构化的,如果字典没有音节表和部首检字表,在茫茫辞海中找一个字只能顺序扫描。然而字的某些信息可以提取出来进行结构化处理,比如读音,就比较结构化,分声母和韵母,分别只有几种可以一一列举,于是将读音拿出来按一定的顺序排列,每一项读音都指向此字的详细解释的页数。我们搜索时按结构化的拼音搜到读音,然后按其指向的页数,便可找到我们的非结构化数据——也即对字的解释。


这种先建立索引,再对索引进行搜索的过程就叫全文检索(Full-text Search) 。


下面这幅图来自《Lucene in action》,但却不仅仅描述了Lucene的检索过程,而是描述了全文检索的一般过程。

 


全文检索大体分两个过程,索引创建 (Indexing) 和搜索索引 (Search) 。

索引创建:将现实世界中所有的结构化和非结构化数据提取信息,创建索引的过程。
搜索索引:就是得到用户的查询请求,搜索创建的索引,然后返回结果的过程。
于是全文检索就存在三个重要问题:

1. 索引里面究竟存些什么?(Index)

2. 如何创建索引?(Indexing)

3. 如何对索引进行搜索?(Search)

下面我们顺序对每个个问题进行研究。

二、索引里面究竟存些什么
索引里面究竟需要存些什么呢?

首先我们来看为什么顺序扫描的速度慢:

其实是由于我们想要搜索的信息和非结构化数据中所存储的信息不一致造成的。

非结构化数据中所存储的信息是每个文件包含哪些字符串,也即已知文件,欲求字符串相对容易,也即是从文件到字符串的映射。而我们想搜索的信息是哪些文件包含此字符串,也即已知字符串,欲求文件,也即从字符串到文件的映射。两者恰恰相反。于是如果索引总能够保存从字符串到文件的映射,则会大大提高搜索速度。

由于从字符串到文件的映射是文件到字符串映射的反向过程,于是保存这种信息的索引称为反向索引 。

反向索引的所保存的信息一般如下:

假设我的文档集合里面有100篇文档,为了方便表示,我们为文档编号从1到100,得到下面的结构

 


左边保存的是一系列字符串,称为词典 。

每个字符串都指向包含此字符串的文档(Document)链表,此文档链表称为倒排表 (Posting List)。

有了索引,便使保存的信息和要搜索的信息一致,可以大大加快搜索的速度。

比如说,我们要寻找既包含字符串“lucene”又包含字符串“solr”的文档,我们只需要以下几步:

1. 取出包含字符串“lucene”的文档链表。

2. 取出包含字符串“solr”的文档链表。

3. 通过合并链表,找出既包含“lucene”又包含“solr”的文件。

 


看到这个地方,有人可能会说,全文检索的确加快了搜索的速度,但是多了索引的过程,两者加起来不一定比顺序扫描快多少。的确,加上索引的过程,全文检索不一定比顺序扫描快,尤其是在数据量小的时候更是如此。而对一个很大量的数据创建索引也是一个很慢的过程。

然而两者还是有区别的,顺序扫描是每次都要扫描,而创建索引的过程仅仅需要一次,以后便是一劳永逸的了,每次搜索,创建索引的过程不必经过,仅仅搜索创建好的索引就可以了。

这也是全文搜索相对于顺序扫描的优势之一:一次索引,多次使用。

三、如何创建索引
全文检索的索引创建过程一般有以下几步:

第一步:一些要索引的原文档(Document)。
为了方便说明索引创建过程,这里特意用两个文件为例:

文件一:Students should be allowed to go out with their friends, but not allowed to drink beer.

文件二:My friend Jerry went to school to see his students but found them drunk which is not allowed.

第二步:将原文档传给分次组件(Tokenizer)。
分词组件(Tokenizer)会做以下几件事情( 此过程称为Tokenize) :

1. 将文档分成一个一个单独的单词。

2. 去除标点符号。

3. 去除停词(Stop word) 。

所谓停词(Stop word)就是一种语言中最普通的一些单词,由于没有特别的意义,因而大多数情况下不能成为搜索的关键词,因而创建索引时,这种词会被去掉而减少索引的大小。

英语中挺词(Stop word)如:“the”,“a”,“this”等。

对于每一种语言的分词组件(Tokenizer),都有一个停词(stop word)集合。


经过分词(Tokenizer) 后得到的结果称为词元(Token) 。

在我们的例子中,便得到以下词元(Token):

“Students”,“allowed”,“go”,“their”,“friends”,“allowed”,“drink”,“beer”,“My”,“friend”,“Jerry”,“went”,“school”,“see”,“his”,“students”,“found”,“them”,“drunk”,“allowed”。

第三步:将得到的词元(Token)传给语言处理组件(Linguistic Processor)。
语言处理组件(linguistic processor)主要是对得到的词元(Token)做一些同语言相关的处理。

对于英语,语言处理组件(Linguistic Processor) 一般做以下几点:

1. 变为小写(Lowercase) 。

2. 将单词缩减为词根形式,如“cars ”到“car ”等。这种操作称为:stemming 。

3. 将单词转变为词根形式,如“drove ”到“drive ”等。这种操作称为:lemmatization 。

Stemming 和 lemmatization的异同:

相同之处:Stemming和lemmatization都要使词汇成为词根形式。
两者的方式不同:
Stemming采用的是“缩减”的方式:“cars”到“car”,“driving”到“drive”。
Lemmatization采用的是“转变”的方式:“drove”到“drove”,“driving”到“drive”。
两者的算法不同:
Stemming主要是采取某种固定的算法来做这种缩减,如去除“s”,去除“ing”加“e”,将“ational”变为“ate”,将“tional”变为“tion”。
Lemmatization主要是采用保存某种字典的方式做这种转变。比如字典中有“driving”到“drive”,“drove”到“drive”,“am, is, are”到“be”的映射,做转变时,只要查字典就可以了。
Stemming和lemmatization不是互斥关系,是有交集的,有的词利用这两种方式都能达到相同的转换。

语言处理组件(linguistic processor)的结果称为词(Term) 。

在我们的例子中,经过语言处理,得到的词(Term)如下:

“student”,“allow”,“go”,“their”,“friend”,“allow”,“drink”,“beer”,“my”,“friend”,“jerry”,“go”,“school”,“see”,“his”,“student”,“find”,“them”,“drink”,“allow”。

也正是因为有语言处理的步骤,才能使搜索drove,而drive也能被搜索出来。

第四步:将得到的词(Term)传给索引组件(Indexer)。
索引 组件(Indexer)主要做以下几件事情:

1. 利用得到的词(Term)创建一个字典。

在我们的例子中字典如下:

Term Document ID
student 1
allow 1
go 1
their 1
friend 1
allow 1
drink 1
beer 1
my 2
friend 2
jerry 2
go 2
school 2
see 2
his 2
student 2
find 2
them 2
drink 2
allow 2

2. 对字典按字母顺序进行排序。

Term Document ID
allow 1
allow 1
allow 2
beer 1
drink 1
drink 2
find 2
friend 1
friend 2
go 1
go 2
his 2
jerry 2
my 2
school 2
see 2
student 1
student 2
their 1
them 2


3. 合并相同的词(Term) 成为文档倒排(Posting List) 链表。

 

在此表中,有几个定义:

Document Frequency 即文档频次,表示总共有多少文件包含此词(Term)。
Frequency 即词频率,表示此文件中包含了几个此词(Term)。
所以对词(Term) “allow”来讲,总共有两篇文档包含此词(Term),从而词(Term)后面的文档链表总共有两项,第一项表示包含“allow”的第一篇文档,即1号文档,此文档中,“allow”出现了2次,第二项表示包含“allow”的第二个文档,是2号文档,此文档中,“allow”出现了1次。

到此为止,索引已经创建好了,我们可以通过它很快的找到我们想要的文档。

而且在此过程中,我们惊喜地发现,搜索“drive”,“driving”,“drove”,“driven”也能够被搜到。因为在我们的索引中,“driving”,“drove”,“driven”都会经过语言处理而变成“drive”,在搜索时,如果您输入“driving”,输入的查询语句同样经过我们这里的一到三步,从而变为查询“drive”,从而可以搜索到想要的文档。

三、如何对索引进行搜索?
到这里似乎我们可以宣布“我们找到想要的文档了”。

然而事情并没有结束,找到了仅仅是全文检索的一个方面。不是吗?如果仅仅只有一个或十个文档包含我们查询的字符串,我们的确找到了。然而如果结果有一千个,甚至成千上万个呢?那个又是您最想要的文件呢?

打开Google吧,比如说您想在微软找份工作,于是您输入“Microsoft job”,您却发现总共有22600000个结果返回。好大的数字呀,突然发现找不到是一个问题,找到的太多也是一个问题。在如此多的结果中,如何将最相关的放在最前面呢?

 


当然Google做的很不错,您一下就找到了jobs at Microsoft。想象一下,如果前几个全部是“Microsoft does a good job at software industry…”将是多么可怕的事情呀。

如何像Google一样,在成千上万的搜索结果中,找到和查询语句最相关的呢?

如何判断搜索出的文档和查询语句的相关性呢?

这要回到我们第三个问题:如何对索引进行搜索?

搜索主要分为以下几步:

第一步:用户输入查询语句。
查询语句同我们普通的语言一样,也是有一定语法的。

不同的查询语句有不同的语法,如SQL语句就有一定的语法。

查询语句的语法根据全文检索系统的实现而不同。最基本的有比如:AND, OR, NOT等。

举个例子,用户输入语句:lucene AND learned NOT hadoop。

说明用户想找一个包含lucene和learned然而不包括hadoop的文档。

第二步:对查询语句进行词法分析,语法分析,及语言处理。
由于查询语句有语法,因而也要进行语法分析,语法分析及语言处理。

1. 词法分析主要用来识别单词和关键字。

如上述例子中,经过词法分析,得到单词有lucene,learned,hadoop, 关键字有AND, NOT。

如果在词法分析中发现不合法的关键字,则会出现错误。如lucene AMD learned,其中由于AND拼错,导致AMD作为一个普通的单词参与查询。

2. 语法分析主要是根据查询语句的语法规则来形成一棵语法树。

如果发现查询语句不满足语法规则,则会报错。如lucene NOT AND learned,则会出错。

如上述例子,lucene AND learned NOT hadoop形成的语法树如下:

 


3. 语言处理同索引过程中的语言处理几乎相同。

如learned变成learn等。

经过第二步,我们得到一棵经过语言处理的语法树。

 


第三步:搜索索引,得到符合语法树的文档。
此步骤有分几小步:

首先,在反向索引表中,分别找出包含lucene,learn,hadoop的文档链表。
其次,对包含lucene,learn的链表进行合并操作,得到既包含lucene又包含learn的文档链表。
然后,将此链表与hadoop的文档链表进行差操作,去除包含hadoop的文档,从而得到既包含lucene又包含learn而且不包含hadoop的文档链表。
此文档链表就是我们要找的文档。
第四步:根据得到的文档和查询语句的相关性,对结果进行排序。
虽然在上一步,我们得到了想要的文档,然而对于查询结果应该按照与查询语句的相关性进行排序,越相关者越靠前。

如何计算文档和查询语句的相关性呢?

不如我们把查询语句看作一片短小的文档,对文档与文档之间的相关性(relevance)进行打分(scoring),分数高的相关性好,就应该排在前面。

那么又怎么对文档之间的关系进行打分呢?

这可不是一件容易的事情,首先我们看一看判断人之间的关系吧。

首先 看一个人,往往有很多要素 ,如性格,信仰,爱好,衣着,高矮,胖瘦等等。

其次 对于人与人之间的关系,不同的要素重要性不同 ,性格,信仰,爱好可能重要些,衣着,高矮,胖瘦可能就不那么重要了,所以具有相同或相似性格,信仰,爱好的人比较容易成为好的朋友,然而衣着,高矮,胖瘦不同的人,也可以成为好的朋友。

因而判断人与人之间的关系,首先要找出哪些要素对人与人之间的关系最重要 ,比如性格,信仰,爱好。其次要判断两个人的这些要素之间的关系 ,比如一个人性格开朗,另一个人性格外向,一个人信仰佛教,另一个信仰上帝,一个人爱好打篮球,另一个爱好踢足球。我们发现,两个人在性格方面都很积极,信仰方面都很善良,爱好方面都爱运动,因而两个人关系应该会很好。

我们再来看看公司之间的关系吧。

首先 看一个公司,有很多人组成,如总经理,经理,首席技术官,普通员工,保安,门卫等。

其次对于公司与公司之间的关系,不同的人重要性不同 ,总经理,经理,首席技术官可能更重要一些,普通员工,保安,门卫可能较不重要一点。所以如果两个公司总经理,经理,首席技术官之间关系比较好,两个公司容易有比较好的关系。然而一位普通员工就算与另一家公司的一位普通员工有血海深仇,怕也难影响两个公司之间的关系。

因而判断公司与公司之间的关系,首先要找出哪些人对公司与公司之间的关系最重要 ,比如总经理,经理,首席技术官。其次要判断这些人之间的关系 ,不如两家公司的总经理曾经是同学,经理是老乡,首席技术官曾是创业伙伴。我们发现,两家公司无论总经理,经理,首席技术官,关系都很好,因而两家公司关系应该会很好。

分析了两种关系,下面看一下如何判断文档之间的关系 了。

首先,一个文档有很多词(Term)组成 ,如search, lucene, full-text, this, a, what等。

其次对于文档之间的关系,不同的Term重要性不同 ,比如对于本篇文档,search, Lucene, full-text就相对重要一些,this, a , what可能相对不重要一些。所以如果两篇文档都包含search, Lucene,fulltext,这两篇文档的相关性好一些,然而就算一篇文档包含this, a, what,另一篇文档不包含this, a, what,也不能影响两篇文档的相关性。

因而判断文档之间的关系,首先找出哪些词(Term)对文档之间的关系最重要,如search, Lucene, fulltext。然后判断这些词(Term)之间的关系。

找出词(Term) 对文档的重要性的过程称为计算词的权重(Term weight) 的过程。

计算词的权重(term weight)有两个参数,第一个是词(Term),第二个是文档(Document)。

词的权重(Term weight)表示此词(Term)在此文档中的重要程度,越重要的词(Term)有越大的权重(Term weight),因而在计算文档之间的相关性中将发挥更大的作用。

判断词(Term) 之间的关系从而得到文档相关性的过程应用一种叫做向量空间模型的算法(Vector Space Model) 。


下面仔细分析一下这两个过程:

1. 计算权重(Term weight)的过程。
影响一个词(Term)在一篇文档中的重要性主要有两个因素:

Term Frequency (tf):即此Term在此文档中出现了多少次。tf 越大说明越重要。
Document Frequency (df):即有多少文档包含次Term。df 越大说明越不重要。
容易理解吗?词(Term)在文档中出现的次数越多,说明此词(Term)对该文档越重要,如“搜索”这个词,在本文档中出现的次数很多,说明本文档主要就是讲这方面的事的。然而在一篇英语文档中,this出现的次数更多,就说明越重要吗?不是的,这是由第二个因素进行调整,第二个因素说明,有越多的文档包含此词(Term), 说明此词(Term)太普通,不足以区分这些文档,因而重要性越低。

这也如我们程序员所学的技术,对于程序员本身来说,这项技术掌握越深越好(掌握越深说明花时间看的越多,tf越大),找工作时越有竞争力。然而对于所有程序员来说,这项技术懂得的人越少越好(懂得的人少df小),找工作越有竞争力。人的价值在于不可替代性就是这个道理。

道理明白了,我们来看看公式:

 

 

 

这仅仅只term weight计算公式的简单典型实现。实现全文检索系统的人会有自己的实现,Lucene就与此稍有不同。

2. 判断Term之间的关系从而得到文档相关性的过程,也即向量空间模型的算法(VSM)。
我们把文档看作一系列词(Term),每一个词(Term)都有一个权重(Term weight),不同的词(Term)根据自己在文档中的权重来影响文档相关性的打分计算。

于是我们把所有此文档中词(term)的权重(term weight) 看作一个向量。

Document = {term1, term2, …… ,term N}

Document Vector = {weight1, weight2, …… ,weight N}

同样我们把查询语句看作一个简单的文档,也用向量来表示。

Query = {term1, term 2, …… , term N}

Query Vector = {weight1, weight2, …… , weight N}

我们把所有搜索出的文档向量及查询向量放到一个N维空间中,每个词(term)是一维。

如图:

 


我们认为两个向量之间的夹角越小,相关性越大。

所以我们计算夹角的余弦值作为相关性的打分,夹角越小,余弦值越大,打分越高,相关性越大。

有人可能会问,查询语句一般是很短的,包含的词(Term)是很少的,因而查询向量的维数很小,而文档很长,包含词(Term)很多,文档向量维数很大。你的图中两者维数怎么都是N呢?

在这里,既然要放到相同的向量空间,自然维数是相同的,不同时,取二者的并集,如果不含某个词(Term)时,则权重(Term Weight)为0。

相关性打分公式如下:

 


举个例子,查询语句有11个Term,共有三篇文档搜索出来。其中各自的权重(Term weight),如下表格。 
 t1
 t2
 t3
 t4
 t5
 t6
 t7
 t8
 t9
 t10
 t11
 
D1
 0
 0
 .477
 0
 .477
 .176
 0
 0
 0
 .176
 0
 
D2
 0
 .176
 0
 .477
 0
 0
 0
 0
 .954
 0
 .176
 
D3
 0
 .176
 0
 0
 0
 .176
 0
 0
 0
 .176
 .176
 
Q
 0
 0
 0
 0
 0
 .176
 0
 0
 .477
 0
 .176
 


于是计算,三篇文档同查询语句的相关性打分分别为:

 

 

 

 


于是文档二相关性最高,先返回,其次是文档一,最后是文档三。

到此为止,我们可以找到我们最想要的文档了。

说了这么多,其实还没有进入到Lucene,而仅仅是信息检索技术(Information retrieval)中的基本理论,然而当我们看过Lucene后我们会发现,Lucene是对这种基本理论的一种基本的的实践。所以在以后分析Lucene的文章中,会常常看到以上理论在Lucene中的应用。

在进入Lucene之前,对上述索引创建和搜索过程所一个总结,如图:

此图参照http://www.lucene.com.cn/about.htm 中文章《开放源代码的全文检索引擎Lucene》

 


1. 索引过程:

1) 有一系列被索引文件

2) 被索引文件经过语法分析和语言处理形成一系列词(Term) 。

3) 经过索引创建形成词典和反向索引表。

4) 通过索引存储将索引写入硬盘。

2. 搜索过程:

a) 用户输入查询语句。

b) 对查询语句经过语法分析和语言分析得到一系列词(Term) 。

c) 通过语法分析得到一个查询树。

d) 通过索引存储将索引读入到内存。

e) 利用查询树搜索索引,从而得到每个词(Term) 的文档链表,对文档链表进行交,差,并得到结果文档。

f) 将搜索到的结果文档对查询的相关性进行排序。

g) 返回查询结果给用户。

下面我们可以进入Lucene的世界了。

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/forfuture1978/archive/2009/10/22/4711308.aspx

posted @ 2010-03-01 21:04 Myhsg 阅读(107) 评论(0) 编辑
  2010年1月30日

原文地址:http://sjtu.blog.sohu.com/108202346.html

 

------------------------------------------软开开发篇-------------------------
-------------------------- 
 
     在我刚进软开的时候,我想,这有什么啊,泡着茶写点儿JAVA的日子么?最多用JAVA查
个数据库,插个数据库,还有啥?取钱存钱不也就是个人帐户数据的此消彼长么?IDE会帮你
发现任何一个细小的失误,而JAVA的简单语法也不会让你担心有什么疑难杂症.我不知道
跟我想法法一致的人有多少,但这确实就是我刚开始看软开的眼光,安逸,挣闲钱的地方.
 
     然则,就类似于能量守恒的定理,你做的东西少,一定是有人帮你做的东西多,JAVA是
简单,可是那是JVM做的东西多,就如银行,银行的系统之复杂,是任何一个人无法想象的,
然而它的真正目的不是像IBM一样要向别人出卖技术,所以对人才要求很高,它只是要使成
熟的技术造福于自己特色业务的推广,造福于针对业务的系统的开发,说白了,是靠业务的
走红而不是技术的复杂来挣钱,.JAVA虽简单,但是要想彻头彻尾学明白也难,那么银行软
开不允许这种复杂性存在,它简单,但不彻底,那么我们就要让它变得彻底的简单,我们要
继续开发自己的系统,提供一套很容易的开发平台,当这套平台开发出来之后,就招一批能
够泡着茶写JAVA的人去为业务服务,所以这就是软开表面给大家造成这样一种映向的原因
,工作难度是不大,但是绝对不是说银行系统无人,只是那些平台的工作者没有浮出水面,
或者相对来说比较低调而已. 
    回到了我不屑的泡着茶写JAVA,啊,的确,难度是不大,数据库查来查去,日志记来记去
,流程可能够复杂,但不是算法的复杂,只是实现起来很烦而已.但是,这些人真的有足够的
工夫泡茶么?大家喜欢用日新月异来形容当今社会的发展,形势日新月异了,业务需求一样
也是日新月异,于是他们每天都要针对各种业务需求写出不同的程序来,这个时候,他们的
关注点应该从技术转向业务上来.业务需求给他们的压力使他们再无暇关注技术本身,所
以写JAVA的人也有写JAVA的人的难处,只是业务上的繁琐,向来被纯正的喜欢搞底层/搞算
法的人所鄙视,的确,你的脑筋可能是很活,但是物尽其才,如果真的有这样的思维,是应该
去搞一些高深的东西,研究技术的创新,写JAVA,面对各种应用需求,是有些埋没,但是话又
说回来,这样脑筋很活的人能干这样的工作么?工作再枯燥也需要有人做,他们能有耐心应
付这样的枯燥么? 
    现在满大街的小公司,没有几个是真正搞什么底层东西的,大家其实都在针对各种业
务做各种项目,银行的开发之所以显得有些乍眼,主要是因为:1,国企大氛围;2,做出的东
西不用面对销售压力.其开发从技术含量来讲,并无本质区别. 
    所以在银行软开工作,绝大部分人,绝对部分学计算机的人,需要面临的是一个方向的
调整,需要将注意力从技术的深度转到业务的广度上来,一味盲目的觉得人家的工作乏味,
没技术含量是不现实的,这也是我目前一个态度的转变. 
    技术做到最后,就是大同,惟有业务,才能使其中的努力变成钞票,大家(尤其是学计算
机的人,尤其是并不适合搞算法,搞底层的人)如果想进软开,一定要有这样的认识. 
 
----------------------------------------------------------------------------
--------------------------------- 
 
------------------------------软开的压力篇----------------------------------
--------------------------- 
    银行软开之所以有些乍眼,前面说过一条,不用面对销售的压力,是,我们做出来,业务
人员就得用,可是真的没有压力么? 
        我曾经听说过这样一个例子:一个工行网点的客户经理,费尽了口舌,花了半天工
夫,说服了两个客户买基金,终于她们被说动了,坐下来填单子准备签字了,这个时候,系统
出故障了,交易无法进行,没办法,客户经理只能含着泪,带着她们出来,把她们指给旁边的
农行/建行(本人属于工行,这些时候自然偏向工行,其他银行朋友勿怪).这个例子,体现了
银行软开的一点压力吧,不论什么时间,不论什么情况,不论你用什么手段什么方法,请你
给我保持住稳定,如果系统慢,客户经理还可以陪客户聊天,可是如果宕了,什么叫所有努
力付诸东流,这就是. 
    银行在全国的网点,大的数以万计,小的也数以千计吧,各个地方,招来的柜员,那是怎
么样素质的都有,我曾听说过这样的柜员,这辈子她就会干两件事,做取款的交易和存款的
交易,转账怎么办?不会直接转账,先给A做提现的交易,再给B做存现的交易.内部实现怎么
别扭,但是外部的易用性你可得给我做足了,要不人家网点柜员是真不明白.记得唐朝诗人
白居易还是王安石,每写一首诗,都要问老百姓能不能看懂,软开面临的情况也很类似,白
居易王安石历史上就这么两个人,然而你要求每个软开员工每个项目都能做到这样,不觉
得有压力么?尤其是心高气傲的计算机人,那 更是不屑了.可是,这是软开,如果想进来玩,
请放下你的架子,认真/细致的处理好所有细节. 
    还有一个路人皆知的压力,如何保障运营系统的安全,大家存钱的时候按完密码键盘
了,系统没有响应,柜员要求你重新输入你会怎么想?难道不是我的密码被盗了?你怎么能
保证?这样的事情只要发生,只要桶上来,整个银行总部的领导层都会开始关注这个问题,
甚至银监会也要监督你的处理方式.这个时候,软开员工身上的压力将会可想而知,一旦最
后查明是程序的问题,所有一干人等(开发/测试/小组领导/部门领导),全部要受罚,这是
肯定的.网银的运营,得有多少加密措施来保障数据的安全,且不说技术上的加密算法,就
拿业务来说,大家去办个U盾,看那个网点工作人员得填多少单子,就知道银行为保证安全
,得下多少精力了. 
    很多小公司,常年就给一个医院/一个机关做项目,每做一个,挣10几万,然后全组人出
动到现场,花几天时间,解决各种安装遇到的问题,保证没问题后再大家都撤,老总请大家
吃饭.银行是怎么样?做一个项目,全国所有省份所有网点均要投产,如果大家各自全都出
动,人手够么?各种不一致的现象报上来,就是招10倍人也解决不了,所以银行软开压力最
大的时候就是投产前夕,所有人从老总到小兵全部通宵达旦地守在电脑旁,应付各种可能
问题的出现,而且作为高风险机构,银行在投产时候遇到的问题的解决,一定要准,一次性
成功!就如密码键盘来说,出现问题是系统不响应,马上回来改了,自己测过之后没问题,再
发补丁,结果造成系统崩溃,你可以想象一下客户的愤怒和不安!全中国这么大,我们不可
能到处跑过去看问题,所以,怎么样才能保证程序在全国跑都没问题,这是问题,也是巨大
的压力. 
    银行软开的压力,不来自于有没有客户,而来自于客户太多,给我们系统造成的压力,
无人问津的悲哀和无数人目光如炬的质询,后果都一样,让你身心俱疲. 
----------------------------------------------------------------------------
------------------------------------- 
 
------------------------------银行软开的发展篇------------------------------
----------------------------- 
    银行软开的发展,对于学计算机的人来说,是一个不小的难题,也是很多人对于要不
要来这很犹豫的问题,技术和业务上的难以抉择.还有国企多少的一点特色对自己发展造
成的干扰. 
    是的,这些都是问题,值得研究,第一个关于技术和业务的问题,我不想再多说,以挣钱
为终点,那么条条大路通罗马,以境界的追求为终点,软开可能不属于一个好的地方,毕竟
你的心高高在上,不屑于一些简单的活.路是自己选的,怎么走都可以,但是有一点要注意,
软开是有一部分专搞技术的人的,只是因为银行软开的出发点是针对业务做开发,所以为
开发提供更便捷方式的平台方面的人属于少而精的配置.因为一些国企的特色,进来后可
能因为我这篇文章,一些想要进来做平台的计算机人,有可能被领导分配到业务为主的开
发部门,关于这些人我想说的是,软开属于计算机研发为主的企业性质单位,人与人之间的
关系,沾点国企的影子,却远没有那么复杂,关于自己角色的的定位,你可以跟领导好好沟
通你的长处和你希望干的内容,一般来说,领导是会多少考虑的,即便不能百分百满足你需
要,百分之三十/四十/五十等等也能满足一些,只会闷头做技术,不会与人交流的人还是不
要来了,这里不适合你,即便你不跟领导沟通,你也需要跟下面分行的人沟通,交流,是工作
需要. 
    有的人会说,银行软开不挣钱,挣钱的是那些懂业务的人,这里首先要明确,什么样算
挣钱,工资是每个人都挣的,要是拿这个说的话就没意思了.大家说的应该是提成/分红的
那一类人,的确,软开挣不到那样一些钱,那些属于业务部该挣的钱.我觉得大家在讨论这
样一些问题的时候,首先要把自己摆正,软开的人,其实也就相当于一个IT公司的人,IT公
司的那一部分分红,软开一分钱都不会少,而且软开的钱有保证,不随经济危机而起伏.平
时福利也还可以.大家在羡慕业务的人拿得多的时候,是否可曾想到自己公司的销售在谈
好一个项目的时候提成也是远胜于自己工资的呢?只要你自己肯转变思路,专心学业务,借
助于自己的技术优势,以后去业务部分挣钱也不是没可能,关键就在于自己怎么看,不能既
不想作出改变现状的努力,又觉得人家挣钱挣那么多不公平.再者如果你实在干不了业务,
那么就干技术,转管理或者技术做到死当技术经理,总之就是成为领导,软开领导同样挣不
少钱,他们地位也和HP/IBM的高管地位一样,也许钱一年比人家的少些,但是国企有国企的
福利,这个是外企不能比的.每个人都该知足,生活提高一点,抱怨就该少一点,自己已经挣
了30W一年,够花了,听说别的部门一年年终奖拿了20W,全年工资50W也该把心态放平和些,
不就是钱么,又不是不够花,何不知足长乐呢?(注:业务部门不包括那些网点的柜员,他们
工资很少的). 
     软开的发展空间最大的难处在我看来,是这里虽然由业务指导开发,但是开发量很大
,导致你也不能完全放下你的技术,这样技术和业务之间徘徊不定,最终会有碍人的成长,
而且他的技术为了业务开发的便捷,被很好的简化了最后有可能技术没学成技术,业务也
没懂多少.这个是确实,一个地方不可能十全十美. 
    我的意见是,你一生比较想过安稳的生活可以来这,你如果是一个有追求的人,并且脑
筋可以变通的人,也可以来这,你如果是是一个有追求的人,并且好学的人(无论是业务还
是技术,都多得让你学不完,当你学得够多就有资格提前成为领导了),也可以来这.一个有
追求的人,并且勤勉踏实的人也可以来,有这么两类人,技术的大牛人不要来,你应该去百
度/GOOGLE发挥你的优势所在,有追求,但是没有什么魄力改变现状的人,就不要来,免得一
辈子平庸的现状可能让你万分苦恼. 
    还有一个难处我也提一下,它终归是国企,它注重能力,毕竟银行的系统不能瞎来,同
时也要求年限,年限一到才能往上升,所以不能忍的人也不要来了吧,当然也可以来了再走
~呵呵 
   最后我说一下薪资发展空间吧,现在银行软开一般待遇都不差,但是升值空间,在你没
成为领导之前涨幅不大,其实任何地方都一样,只有当领导,工资才能有质的变化,只是软
开要当上领导的周期比外企要长一些,也不会长得不可理喻,大家有的总说想来这,觉得稳
定但是又嫌工资涨得不快,这就是典型的鱼和熊掌都想得到的心理了,选择了软开,选择了
国企的稳定,必然要放弃一部分收入的增幅,既然思想不够纯粹,要为追求奋斗一生,而是
选择既有保障也要有追求的奋斗,那么你的生命里必将在别的地方付出一些代价,怎么样
都能成功,问题还是在于个人吧. 
    我简单说明一下,工行软开,属于总行编制,恩,就这么多了. 

posted @ 2010-01-30 09:31 Myhsg 阅读(1006) 评论(0) 编辑
  2010年1月7日

向量空间模型将文档映射为一个特征向量V(d)=(t11(d);…;tn, ωn(d)),其中ti(i=1,2, …,n)为一列互不雷同的词条项,ωi(d)为ti在d中的权值, 一般被定义为ti在d中出现频率tfi(d)的函数,即 clip_image002

在信息检索中常用的词条权值计算方法为 TF-IDF 函数,其中N为所有文档的数目,ni为含有词条ti的文档数目。TF-IDF公式有很多变种,下面是一个常用的TF-IDF公式: clip_image004

clip_image002[6]

根据TF-IDF公式,文档集中包含某一词条的文档越多,说明它区分文档类别属性的能力越低,其权值越小;另一方面,某一文档中某一词条出现的频率越高,说明它区分文档内容属性的能力越强,其权值越大。

两文档之间的相似度可以用其对应的向量之间的夹角余弦来表示,即文档di,dj的相似度可以表示为

clip_image008

进行查询的过程中,先将查询条件Q进行向量化,主要依据布尔模型:

当ti在查询条件Q中时,将对应的第i坐标置为1,否则置为0,即

clip_image010

从而文档d与查询Q的相似度为

clip_image012

根据文档之间的相似度,结合机器学习的一些算法如神经网络算法,K-近邻算法和贝叶斯分类算法等,可以将文档集分类划分为一些小的文档子集。

在查询过程中,可以计算出每个文档与查询的相似度,进而可以根据相似度的大小,将查询的结果进行排序。

向量空间模型可以实现文档的自动分类和对查询结果的相似度排序,能够有效提高检索效率;它的缺点是相似度的计算量大,当有新文档加入时,则必须重新计算词的权值。


文章来自:”http://hi.baidu.com/my%5Flough/blog/item/ed82560017191b82e850cdcf%2Ehtml
posted @ 2010-01-07 14:24 Myhsg 阅读(82) 评论(0) 编辑

直接使用词的个数在比较词数很多和词数很少的文档时存在着问题。例如文档I中含有10000个词,而词a出现了10次;文档II中含有100个词,而a出现了5次。这样在相似度计算时,文档Ia对最后结果的影响比文档II中的a要大。这显然是不合理的,因为a只点文档I0.1%而却占文档II5%。为了解决这类问题,我们引入词频(TF)和反词频(IDF)两个概念。

其中TF = f/m,其中f表示当前词在当前文档中出现的次数,而m表示当前文档中出现次数最多的词的次数。这样TF值就在01之间。这样做可以减少文档中词的频率不合理分布所引起的误差。

IDF = log2 (n/nj) + 1,其中n表示在整个语料中文档的总数,而nj表示含有当前词的文档数。这样做可以减少在语料范围内词频分布不均匀造成的相似度误差。

最后,将这两项相乘得到T = TF * IDF,用这个量替代《向量空间模型(VSM)在文档相似度计算上的简单介绍》中的简单词频,就可以得到实际应用中常用的向量空间模型了。

posted @ 2010-01-07 10:59 Myhsg 阅读(50) 评论(0) 编辑

一: 不同区域的权重计算

1.  对出现在文档的不通区域的term赋予不同的权值,例如title,author,body等,这样需要在倒排表中记录term每一次出现的位置

2. 对不同的区域赋予不通的权值,Gi, 使得 Sum(Gi) = 1

3. 对于这个Gi的值,可以通过机器学习的方法来确定:给定一个文档集合和query,以及query与文档之间的相似性,然后假定一个表达式,采用这个样本来计算各种系数

二:出现频率的权重计算

1. 在这种模型下,文档被认为是词的集合,词的出现位置和顺序都不重要,重要的是词的出现次数,同样地query也做这样的处理,因此“我比你好”和“你比我好” 是一样的

1. term在某一篇文档中的频率tf, 在一个文档集合内的频率cf,在文档集合内包含该term的文档数df

2. 如果只用tf,则语气词等的权重会最大,或者是专业文章内,例如自动化的文章中自动化会出现很多次,因此用自动化就不能区分开这些文章,因此要借助于cf或者df

3. 由于df比cf具有更好的作用来区分不同词与文档的相关性,因此采用df配合tf来决定term在文档里的权重

4. 定义idf = log(N / df), N是文档总数

5. term的权重 = tf * idf

6. 因此,定义query与文档的权重关系为:score(q,d) = for t in q :  sum += tf(t,d) * idf(t)

7. 因此,将文档表示为一个term以及term权重的向量,V = (t1, t2, ..., tn), 因此计算V1 与 V2的相似性可以如下的公式:

sim(V1, V2) = V1 * V2 / (|V1| * | V2|), 分子是向量的点乘,分母是向量长度的乘积,如果将V1, V2表示为有方向的直线,这实际是在计算这两条线夹角的cos值

8. 将query也看成是term的向量集合,query中的term权重可以简单地设定为相等

三. 对tf,df的一些变化

1. 一般不会说如果词在文档内出现20次,则记为20,因此必须采用公式来计算tf,一般是tf = 1 + log(出现次数)

2. 上面计算出来的tf会在很大的范围内,差别很大,因此需要将其范围变小,同时引入平滑因子来降低不同值之间的差距,缩小范围是因为tf需要在不同的文档间计算,否则一篇很长的文章内的词会具有很大的tf值,这样会降低其他文章的权重,会影响相关性。

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/tianqio/archive/2009/05/24/4212434.aspx

posted @ 2010-01-07 10:54 Myhsg 阅读(56) 评论(0) 编辑
  2010年1月3日
Nutch的文件目录所包含的内容:
  • crawldb目录下面存放下载的URL,以及下载的日期,用来页面更新检查时间。
  • linkdb目录存放URL的关联关系,是下载完成后分析时创建的,通过这个关联关系可以实现类似google的pagerank功能。
  • segments目录存储抓取的页面,下面子目录的个数与获取页面的层数有关系。     内含有6个子目录
        content:下载页面的内容
        crawl_fetch:下载URL的状态内容
         crawl_generate:待下载的URL的集合,在generate任务生成时和下载过程中持续分析出来
        crawl_parse:存放用来更新crawldb的外部链接库
        parse_data:存放每个URL解析出来的外部链接和元数据
        parse_text:存放每个解析过的URL的文本内容
  • index目录存放符合lucene格式的索引目录,是indexs里所有的索引内容合并后的完整内容,这里的索引文件的内容基本与lucene的索引文件一致,但多了.nrm文件,少了lucene的.f0文件,而且是非复合索引。
  • indexs目录存放每次下载的索引目录,存放part-0000到part-0003
posted @ 2010-01-03 20:47 Myhsg 阅读(260) 评论(0) 编辑
  2010年1月1日
摘要: nutch环境配置备忘:1、Cygwin安装我使用的是Cygwin本地安装版,local install,并把所有组件都设为installed即可。2、解压nutch将NUTCH-0.9解压后复制到HOME/Administrator下,或者在Cygwin下使用gunzip命令皆可。3、安装JDK可能是我的系统最近不正常吧,我的JDK必须安装在nutch目录下才能找到(正确设置了环境变量,可是只要...阅读全文
posted @ 2010-01-01 11:49 Myhsg 阅读(544) 评论(0) 编辑
摘要: 告别2009,2010一切从头开始!!!阅读全文
posted @ 2010-01-01 10:17 Myhsg 阅读(43) 评论(0) 编辑
摘要: 测试环境Nutch release 0.9Eclipse 3.3 - aka EuropaJava 1.6开始之前Setting up Nutch to run into Eclipse can be tricky, and most of the time you are much faster if you edit Nutch in Eclipse but run the scripts f...阅读全文
posted @ 2010-01-01 10:16 Myhsg 阅读(443) 评论(0) 编辑