Posted on 2008-11-17 13:54
eaglet 阅读(956)
评论(44) 编辑 收藏 网摘 所属分类:
搜索引擎 、
Lucene
1.4.2 版本是 1.4 正式版,该版本修改了 1.4.1 版本的一些错误。
1、 修改 dotnetpager 一处bug
2、 KTDictSeg.HighLight 当查不出结果时应返回空字符串,1.4.1版本是返回全文
3、 支持 Lucene.net 2.3 版本
4、 修改分词权重不对的bug
5、 搜索英文不能高亮,原因是KTDictSeg.HighLight对大小写敏感,已经修改这个bug
6、 DictMgr.InsertWord 有时会出现引用空对象错误,已经加入防范代码
7、 1.4版本新加了 KTDictSegTokenizer默认构造,没有全面考虑到锁的问题。导致多线程查询是会出错,已经更改这出错误。
下载位置
项目首页
Sourceforge 中位置
Feedback
eaglet终于支持2.3了,呵呵,,,等好久了
修改分词权重不对的bug
-------------------------不知修改后的情况怎样了,,马上看看,,,。
3Q
v1.4.02.zip 3M 2008-11-12 英国 澳洲1 澳洲2 N/A
是这个吗?,,11-12号就传上了去?
Thanks a lot, it is a great stuff!!
我试用的时候有出错,比如搜索“我”的时候,不知道是什么原因:
源错误:
行 191: QueryParser queryParser = new QueryParser("contents", new Lucene.Net.Analysis.KTDictSeg.KTDictSegAnalyzer(true));
行 192:
行 193: Query query = queryParser.Parse(q);
行 194:
行 195: Hits hits = search.Search(query);
源文件: f:\v1.4.021\WebDemo\App_Code\Index.cs 行: 193
堆栈跟踪:
[ParseException: Encountered "<EOF>" at line 1, column 0.
Was expecting one of:
<NOT> ...
"+" ...
"-" ...
"(" ...
<QUOTED> ...
<TERM> ...
<PREFIXTERM> ...
<WILDTERM> ...
"[" ...
"{" ...
<NUMBER> ...
]
Lucene.Net.QueryParsers.QueryParser.Jj_consume_token(Int32 kind) +375
Lucene.Net.QueryParsers.QueryParser.Clause(String field) +451
Lucene.Net.QueryParsers.QueryParser.Query(String field) +133
Lucene.Net.QueryParsers.QueryParser.Parse(String query) +117
SimpleSearch.Index.Search(String indexDir, String q, Int32 pageLen, Int32 pageNo, Int32& recCount) in f:\v1.4.021\WebDemo\App_Code\Index.cs:193
_Default.ShowTable(String text) in f:\v1.4.021\WebDemo\Default.aspx.cs:53
_Default.ButtonSearch_Click(Object sender, EventArgs e) in f:\v1.4.021\WebDemo\Default.aspx.cs:102
System.Web.UI.WebControls.Button.OnClick(EventArgs e) +75
System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument) +97
System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +7
System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +11
System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +33
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +4886
@hling
这个错误很可能是因为分词时启用停用词造成,由于 我 默认是停用词,如果你输入这个词,分词时将返回一个空字符串,这样会导致Lucene 搜索时出错。
解决办法是在搜索之前判断一下输入的句子经过分词后是否是空字符串,如果是就不要搜索了。
分词结果没有包含词性,如果逐个用DictManage.Search似乎性能不好。
@灵感之源
分词结果中有词性信息,在 Tag 字段中
在配置中取消停用词功能,或者在停用词表中删除你不想让它成为停用词的词
这里的Tag属性是null的?你的代码中也没有设置Tag值的:
T_WordInfo wordInfo = new T_WordInfo();
wordInfo.Word = word;
wordInfo.Position = position;
retWords.Add(wordInfo);
一些英文或者是不在字典中出现的词会返回null,你用之前判断一下。
我测的是常用的词,譬如“中国”,字典里面有的。问题在于所有的Tag都是null,是SegmentToWordInfos方法根本就没返回Tag。
你肯定?
v1.4.02\DictSeg\SimpleDictSeg.cs, SegmentToWordInfos
T_WordInfo wordInfo = new T_WordInfo();
wordInfo.Word = word;
wordInfo.Position = position;
retWords.Add(wordInfo);
我看了一下代码,如果不选择多元分词,确实不返回词性。你选择多元分词,应该就有词性了。
非多元分词没有词性应该是一个bug,我后续版本改进吧。
建搜引的时候出错:
System.IO.FileNotFoundException: 未能加载文件或程序集“DictSeg, Version=1.4.2.0, Culture=neutral, PublicKeyToken=null”或它的某一个依赖项。系统找不到指定的文件。文件名:“DictSeg, Version=1.4.2.0, Culture=neutral, PublicKeyToken=null” 在 Lucene.Net.Analysis.KTDictSeg.KTDictSegTokenizer..ctor(TextReader input) 在 Lucene.Net.Analysis.KTDictSeg.KTDictSegAnalyzer.TokenStream(String fieldName, TextReader reader) 在 Lucene.Net.Analysis.Analyzer.ReusableTokenStream(String fieldName, TextReader reader) 在 Lucene.Net.Index.DocumentsWriter.ThreadState.FieldData.InvertField(Fieldable field, Analyzer analyzer, Int32 maxFieldLength) 在 Lucene.Net.Index.DocumentsWriter.ThreadState.FieldData.ProcessField(Analyzer analyzer) 在 Lucene.Net.Index.DocumentsWriter.ThreadState.ProcessDocument(Analyzer analyzer) 在 Lucene.Net.Index.DocumentsWriter.UpdateDocument(Document doc, Analyzer analyzer, Term delTerm) 在 Lucene.Net.Index.DocumentsWriter.AddDocument(Document doc, Analyzer analyzer) 在 Lucene.Net.Index.IndexWriter.AddDocument(Document doc, Analyzer analyzer) 在 Lucene.Net.Index.IndexWriter.AddDocument(Document doc) 在 admin_Refresh.CreateIndex(SqlDataReader myred, String filename) 位置 e:\doc\Training\admin\Refresh.aspx.cs:行号 67 警告: 程序集绑定日志记录被关闭。要启用程序集绑定失败日志记录,请将注册表值 [HKLM\Software\Microsoft\Fusion!EnableLog] (DWORD)设置为 1。注意: 会有一些与程序集绑定失败日志记录关联的性能损失。要关闭此功能,请移除注册表值 [HKLM\Software\Microsoft\Fusion!EnableLog]。
是什么原因?
DictSeg.dll 没有和KTDictSegAnalyzer.dll 放在同一目录下。
to eaglet:
KTDictSeg 1.4.2的分词效果很不错,我将其集成到lucene2.0里,对大量文件进行索引,发现如下几个问题:
第一,对文件的索引速度比较慢,比lucene自带的standeranalyzer慢多了,
第二,大量的占用内存,在indexwriter默认的配置情况下(MergeFactor =10),几乎将内存耗尽,一直再增加,将MergeFactor 设为2后,索引过程中还是要占用近200M的内存。
要是能将内存问题解决好的话就很好了。
速度确实比lcnene自带的那个慢很多,lucene 自带的那个几乎是不能处理中文的,对中文全部按一元分词处理,算法简单,当然会很快。不过KTDictSeg的分词效率应该还是由提高的空间的。我将在Hubble.Net中推出全新的分词组件。
KTDictSeg 对内存的占用应该是恒定的,这个内存的大小和字典的大小有关,但和你的文本大小没有关系。我侧过2000万汉字文本的情况下,KTDictSeg占用内存大概在14M左右,而lucene大概在200M左右。你的内存大量占用的问题应该是 lucene 造成的,由于分词结果不同,KTDictSeg 分词和 lucene自带分词对lucene索引内存的影响可能不一样,但这个通过改分词程序是无法改进的。
Hubble.Net 项目将改进 lucene的一些固有缺陷,相信到时候能解决这些问题。
试用几天后,放到服务器上,当写入搜引,时有发现无法写入,说要权限,发现搜引文件夹下,有些文件变成只读文件,如deletable,segments,删除再建后又可以用,过得几天又变这样,是什么原因??
我的Lucene.Net.dll是2.3.1.2
写入是这样的:
Analyzer analyzer = new KTDictSegAnalyzer();
IndexWriter writer = new IndexWriter(Server.MapPath("..\\bookimage\\book\\"), analyzer, false);
Document doc = new Document();
doc.Add(new Field("id", u_id.ToString(), Field.Store.YES, Field.Index.UN_TOKENIZED));
doc.Add(new Field("name", cName, Field.Store.YES, Field.Index.TOKENIZED));
writer.AddDocument(doc);
writer.Optimize();
writer.Close();
不太清楚,是不是 Lucene做了什么设置了?我用 Lucene.Net 2.0 没有遇到过这个问题。
使用1.4.2版本出现如下错误
The type 'Lucene.Net.Analysis.Analyzer' is defined in an assembly that is not referenced. You must add a reference to assembly 'Lucene.Net, Version=2.0.0.2, Culture=neutral, PublicKeyToken=null'.
好像您的DLL是基于2.0.0.2的 我查看您的压缩包里DLL的版本号也是2.0.0.2
不知能否提供基于2.3.1.2的DLL
QQ:391626833
谢谢
另外2.3.1.2创建的索引文件是如下文件名
segments_3
segments.gen
_0.cfs
和2.0.0.2也有所区别
将上述文件放入Release\news目录 无法完成WEB搜索
强热期待您的哈勃--我们江苏产的望远镜,哈哈。
你将 lucene.net 2.3 版本直接覆盖 luncene 2.0 版本的动态库就可以了。
不好意思,还是不行啊
创建一个winform程序
引用Lucene.net 2.3 DLL 和 KTDictSegAnalyzer DLL
第一条语句就出错
Lucene.Net.Analysis.Analyzer analyzer = new Lucene.Net.Analysis.KTDictSeg.KTDictSegAnalyzer();
还是
The type 'Lucene.Net.Analysis.Analyzer' is defined in an assembly that is not referenced. You must add a reference to assembly 'Lucene.Net, Version=2.0.0.2, Culture=neutral, PublicKeyToken=null'.
请指教
谢谢
还有一个问题:使用您的分词组件,怎么自己维护词库?在项目文件里没找到词库文件。
不好意思,刚刚接触搜索引擎,很多问题很弱智,请谅解。
你把KTDictSeg 的代码引用 Lucene.Net 2.3的动态库编译一下,再引用试试看呢,另外好像不能光引用这两个动态库,KTDictSeg带的那几个动态库都要引用。
字库文件是在 Data目录下那个 .Dct 扩展名的文件
谢谢回复,这么快,我试试看。
我有个域名51seek.com,想做一个垂直搜索,如果感兴趣可以合作。
QQ:391626833
谢谢您,pass了。
“另外好像不能光引用这两个动态库,KTDictSeg带的那几个动态库都要引用。”--就是您说的这个问题。
带着对您share精神的钦佩之情进一步学习......
请问一下,我下载并装好了,试用是正常的,我想问下,怎么和本地链接啊,我要搜索我的BBS中的所有东西,怎么设置呢?先谢谢了
@eaglet:
我查看了一下源码,pos标注那块我有点疑惑,
从词库里面读取的时候是可能有多种词性的,在分词的过程中,似乎并未根据上下文来选定某个确定的词性,返回分词后词性标注仍旧是词典中的词性么?不知道说法是否理解了你的源码,谢谢`
请问楼主在吗?我是第一次使用这个,不知道怎么链接到自己的数据库上,意思就是说我要做个站内搜索,请问怎么做呢?期待中。。。。。。。。。
请问可否出的帮助文件,要不第一次使用真的不明白怎么回事啊。
请您考虑一下
@cyberhunter
是字典中的词性
新版本我将考虑尝试用信息指纹技术来做,这样就可以访问该词在当前上下文中的词性了。
@可乐乐
如果你不会使用 Lucene ,你可以看 Lucene的帮助,我的组件中确实有个例子,但那个例子无法帮你实现你特定的搜索需求,因为搜索这块不是这个组件要完成的,这个组件只是一个中文分词组件,不是搜索组件。我的那个WEB 的例子确实缺少一些配置帮助,等有空我写一个。谢谢你的关注。
@eaglet
信息指纹技术我所知道的主要是用于去重的方向,怎么想都很难与上下文词性标注结合起来,有些好奇,呵呵:)