高手解惑...全文检索中文分词问题...

yzqlee 2009-05-27 02:43:26
检索中文的时候,由于分词的问题很多会搜索不出来,
不是填充上面的问题,
不知道大家现在做搜索都是怎么做的,因为数据量会比较大,不考虑like查询
最好是能全文检索做出搜索出来.
目前真不知道那个分词的问题怎么解决,有解决此问题的高手来解惑吗
...全文
193 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhoulinli915 2012-05-27
  • 打赏
  • 举报
回复
目前好像就是这个样子,中文太复杂,它只是机器,所以难免会不精确,微软也是人组成的啊,不是神,平常心了
rucypli 2009-05-28
  • 打赏
  • 举报
回复
1.为了精简全文索引,Microsoft SQL Server 提供了一种机制,用来去掉那些经常出现但对搜索没有帮助的词。这些词称为“干扰词”或“终止词”。
2.干扰词文件位于 $SQL_Server_Install_Path\Microsoft SQL Server\MSSQL.1\MSSQL\FTDATA\ 目录中
3.如果对干扰词文件进行了编辑,则必须重新填充全文目录,更改才能生效。
ai_li7758521 2009-05-27
  • 打赏
  • 举报
回复
关注
yzqlee 2009-05-27
  • 打赏
  • 举报
回复
只是不知道sqlserver很多年前的问题,今时今日是否已解决了.
yanleiyigan 2009-05-27
  • 打赏
  • 举报
回复
这个问题也一直困扰着我,等牛人
htl258_Tony 2009-05-27
  • 打赏
  • 举报
回复
来源:http://blog.sina.com.cn/s/blog_477cf8ad010007kj.html
htl258_Tony 2009-05-27
  • 打赏
  • 举报
回复
--接上:


/**

* Builds an analyzer which removes words in the provided array.

*

* @param stopWords stop word array

*/

public CnAnalyzer(String[] stopWords) {

stopSet = StopFilter.makeStopSet(stopWords);

}



//~ Methods ----------------------------------------------------------------



/**

* get token stream from input

*

* @param fieldName lucene field name

* @param reader input reader

*

* @return TokenStream

*/

public final TokenStream tokenStream(String fieldName, Reader reader) {

TokenStream result = new CnTokenizer(reader);

return new StopFilter(result, stopSet);

}



}



四、输出结果介绍

输出结果中的词性标注代码说明如下:

代码
名称
帮助记忆的诠释

Ag
形语素
形容词性语素。形容词代码为a,语素代码g前面置以A。

a
形容词
取英语形容词adjective的第1个字母。

ad
副形词
直接作状语的形容词。形容词代码a和副词代码d并在一起。

an
名形词
具有名词功能的形容词。形容词代码a和名词代码n并在一起。

b
区别词
取汉字“别”的声母。

c
连词
取英语连词conjunction的第1个字母。

Dg
副语素
副词性语素。副词代码为d,语素代码g前面置以D。

d
副词
取adverb的第2个字母,因其第1个字母已用于形容词。

e
叹词
取英语叹词exclamation的第1个字母。

f


方位词
取汉字“方”

g


语素


绝大多数语素都能作为合成词的“词根”,取汉字“根”的声母。

h


前接成分
取英语head的第1个字母。

i


成语
取英语成语idiom的第1个字母。

j


简称略语
取汉字“简”的声母。

k


后接成分


l
习用语
习用语尚未成为成语,有点“临时性”,取“临”的声母。

m


数词
取英语numeral的第3个字母,n,u已有他用。

Ng
名语素
名词性语素。名词代码为n,语素代码g前面置以N。

n


名词
取英语名词noun的第1个字母。

nr
人名
名词代码n和“人(ren)”的声母并在一起。

ns


地名
名词代码n和处所词代码s并在一起。

nt


机构团体
“团”的声母为t,名词代码n和t并在一起。

nz
其他专名
“专”的声母的第1个字母为z,名词代码n和z并在一起。

o


拟声词
取英语拟声词onomatopoeia的第1个字母。

p
介词
取英语介词prepositional的第1个字母。

q


量词


取英语quantity的第1个字母。

r
代词
取英语代词pronoun的第2个字母,因p已用于介词。

s
处所词
取英语space的第1个字母。

Tg
时语素
时间词性语素。时间词代码为t,在语素的代码g前面置以T。

t
时间词
取英语time的第1个字母。

u
助词
取英语助词auxiliary

Vg


动语素
动词性语素。动词代码为v。在语素的代码g前面置以V。

v


动词
取英语动词verb的第一个字母。

vd
副动词
直接作状语的动词。动词和副词的代码并在一起。

vn
名动词
指具有名词功能的动词。动词和名词的代码并在一起。

w
标点符号


x
非语素字
非语素字只是一个符号,字母x通常用于代表未知数、符号。

y


语气词
取汉字“语”的声母。

z
状态词
取汉字“状”的声母的前一个字母。




五、分词效果

搜索“美的”,我们的结果是前22条全部是与“美的”品牌相关的新闻,百度的结果是前4条是相关的,中搜的结果是前10条中有4条是相关的。



让Nutch支持中文分词
Nutch搜索引擎是一个构建在Lucene上的开放源代码的搜索引擎。可以通过CVS取得它的最新版本。让nutch支持中文分词的方法和Lucene类似,但是nutch很多时候调用了底层的Lucene API。因此需要我们做更多的工作。



一、修改查询分析器



需要修改的文件是:net.nutch.analysis.NutchAnalysis.java。这个文件是从NutchAnalysis.jj使用JavaCC自动生成的,但是我们可以手工修改它以支持中文。



package net.nutch.analysis;



import net.nutch.searcher.Query;

import java.io.*;



/** The JavaCC-generated Nutch lexical analyzer and query parser. */

public class NutchAnalysis {



private String queryString;



/** Construct a query parser for the text in a reader. */

public static Query parseQuery(String queryString) throws IOException {

NutchAnalysis parser =

new NutchAnalysis();

parser.queryString = queryString;

return parser.parse();

}



/** For debugging. */

public static void main(String[] args) throws Exception {

String sentence ="厦门大学艺术教育学院副院长李未明教授长期从事音乐教学,";

StringReader input= new java.io.StringReader(sentence);

BufferedReader in = new BufferedReader(input);

//while (true) {

System.out.print("Query: ");

String line = in.readLine();

System.out.println(parseQuery(line));

//}

}



/** Parse a query. */

final public Query parse() throws IOException {

Query query = new Query();

StringReader input;



input = new java.io.StringReader(queryString);



org.apache.lucene.analysis.TokenStream tokenizer = new seg.result.CnTokenizer(input);



//just a demo

for (org.apache.lucene.analysis.Token t = tokenizer.next(); t != null; t = tokenizer.next())

{

String[] array = {t.termText()};

query.addRequiredPhrase(array, t.type());

}

return query;

}

}



二、测试



在命令行执行:



>java "-Ddic.dir=D:/SSeg/Dic" -classpath D:\lucenne\lucene-1.4-final.jar;D:\SSeg\lib\seg.jar;D:\SSeg\lib\nutch.jar net.nutch.analysis.NutchAnalysis



返回的查询对象内容是:



Query: ns:厦门 n:大学 n:艺术 vn:教育 n:学院 b:副 n:院长 nr:李 nr:未明 n:教授 d:长期 v:从事 n:音乐 vn:教学 w:,



在unix的命令行下执行略有不同:



$java "-Ddic.dir=/home/nutch/Dic" -cp /home/nutch/lib/lucene-1.4-final.jar:/home/nutch/lib/seg.jar:/home/nutch/lib/nutch.jar net.nutch.analysis.NutchAnalysis

htl258_Tony 2009-05-27
  • 打赏
  • 举报
回复
基于MS SQL Server的中文分词扩展存储过程

基于MS SQL Server的中文分词扩展存储过程
1、程序模块

xp_sseg.dll

2、程序接口

xp_seg 待分词的字符串,分词结果存放的字符串 OUTPUT

xp_initseg

xp_initseg 字典安装路径

3、使用说明

a.模块安装:

拷贝xp_sseg.dll到你希望安装扩展存储过程的目录:例如 C:\Dic。或者配置系统环境变量LIETU_DIC=你希望安装扩展存储过程的目录。例如 C:\Dic。

为SQLSERVER添加扩展存储过程:xp_initseg,xp_seg

b.使用注意:

xp_initseg 可以有一个参数(字典安装路径),也可以没有参数。如果没有配置系统环境变量LIETU_DIC,也没有在调用xp_initseg时传入参数(字典安装路径),模块将到目录C:\Dic中找字典。

xp_seg 有两个参数(待分词的字符串,分词结果存放的字符串 OUTPUT),最大长度都是1000个汉字。系统在第一次调用xp_seg之前一定要调用xp_initseg使模块初始化。

向Lucene增加中文分词功能
一、分词功能介绍

分词模块对于搜索的重要性不言而喻。例如,没有分词时,搜索“和服”会出现“产品和服务”,搜索“海尔”会出现“海尔德”,搜索“华为”会出现“清华为何”。所以有必要给文本增加词的边界信息以提高检索精确度。

猎兔全球首家推出支持Lucene的准确可用的中文分词模块。



二、执行方法



可以在命令行执行分词测试:



>java "-Ddic.dir=D:/lg/work/SSeg/Dic" -classpath D:\JAVA\lib\lucene-1.4.jar;D:\JAVA\lib\seg.jar test.seg.result.CnTokenizer



其中系统参数dic.dir指定数据文件路径,如:

"-Ddic.dir=D:/lg/work/SSeg/Dic"



或者编写一个用于测试的Jsp页面。

让Nutch支持中文分词
Nutch搜索引擎是一个构建在Lucene上的开放源代码的搜索引擎。可以通过CVS取得它的最新版本。让nutch支持中文分词的方法和Lucene类似,但是nutch很多时候调用了底层的Lucene API。因此需要我们做更多的工作。



一、修改查询分析器



需要修改的文件是:net.nutch.analysis.NutchAnalysis.java。这个文件是从NutchAnalysis.jj使用JavaCC自动生成的,但是我们可以手工修改它以支持中文。



package net.nutch.analysis;



import net.nutch.searcher.Query;

import java.io.*;



/** The JavaCC-generated Nutch lexical analyzer and query parser. */

public class NutchAnalysis {



private String queryString;



/** Construct a query parser for the text in a reader. */

public static Query parseQuery(String queryString) throws IOException {

NutchAnalysis parser =

new NutchAnalysis();

parser.queryString = queryString;

return parser.parse();

}



/** For debugging. */

public static void main(String[] args) throws Exception {

String sentence ="厦门大学艺术教育学院副院长李未明教授长期从事音乐教学,";

StringReader input= new java.io.StringReader(sentence);

BufferedReader in = new BufferedReader(input);

//while (true) {

System.out.print("Query: ");

String line = in.readLine();

System.out.println(parseQuery(line));

//}

}



/** Parse a query. */

final public Query parse() throws IOException {

Query query = new Query();

StringReader input;



input = new java.io.StringReader(queryString);



org.apache.lucene.analysis.TokenStream tokenizer = new seg.result.CnTokenizer(input);



//just a demo

for (org.apache.lucene.analysis.Token t = tokenizer.next(); t != null; t = tokenizer.next())

{

String[] array = {t.termText()};

query.addRequiredPhrase(array, t.type());

}

return query;

}

}



二、测试



在命令行执行:



>java "-Ddic.dir=D:/SSeg/Dic" -classpath D:\lucenne\lucene-1.4-final.jar;D:\SSeg\lib\seg.jar;D:\SSeg\lib\nutch.jar net.nutch.analysis.NutchAnalysis



返回的查询对象内容是:



Query: ns:厦门 n:大学 n:艺术 vn:教育 n:学院 b:副 n:院长 nr:李 nr:未明 n:教授 d:长期 v:从事 n:音乐 vn:教学 w:,



在unix的命令行下执行略有不同:



$java "-Ddic.dir=/home/nutch/Dic" -cp /home/nutch/lib/lucene-1.4-final.jar:/home/nutch/lib/seg.jar:/home/nutch/lib/nutch.jar net.nutch.analysis.NutchAnalysis


三、调用接口



seg.result.CnTokenizer,该类继承org.apache.lucene.analysis.Tokenizer。



一个简单的使用例子是:



import java.io.Reader;

import java.util.Set;



import org.apache.lucene.analysis.Analyzer;

import org.apache.lucene.analysis.LowerCaseFilter;

import org.apache.lucene.analysis.StopFilter;

import org.apache.lucene.analysis.TokenStream;



/**

* @author luogang

*

*/

public class CnAnalyzer extends Analyzer {

//~ Static fields/initializers ---------------------------------------------



/**

* An array containing some Chinese words that are not usually

* useful for searching.

*/

private static String[] stopWords = {

"www","的","和","与","时","在",

"是","被","所","那","这","有",

"将","会","为","对","了","过",

"去"};



//~ Instance fields --------------------------------------------------------



/** stop word list */

private Set stopSet;



//~ Constructors -----------------------------------------------------------



/**

* Builds an analyzer which removes words in STOP_WORDS.

*/

public CnAnalyzer() {

stopSet = StopFilter.makeStopSet(stopWords);

}

22,207

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧