Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

关于splitTextToWords的多语言支持 #2

Closed
yunge opened this issue Nov 14, 2013 · 5 comments
Closed

关于splitTextToWords的多语言支持 #2

yunge opened this issue Nov 14, 2013 · 5 comments

Comments

@yunge
Copy link

yunge commented Nov 14, 2013

目前segmenter.go中的splitTextToWords函数,将会把所有non-english语言,分解为最小单位。

除了CJK中日韩等东亚语言,其它国家的语言都还是类似英语,属于字母型语言,利用unicode包中的IsLetter、IsNumber函数,可以很方便的处理。因此,建议将
_, size := utf8.DecodeRune(text[current:])
if size == 1 &&
(text[current] >= 'a' && text[current] <= 'z') ||
(text[current] >= 'A' && text[current] <= 'Z') ||
(text[current] >= '0' && text[current] <= '9') {

改为
r, size := utf8.DecodeRune(text[current:])
if unicode.IsLetter(r) || unicode.IsNumber(r) {

这样sego基本上可以用于所有的语言。

@huichen
Copy link
Owner

huichen commented Nov 15, 2013

经实验不可以,因为当r为单个中文字时,unicode.IsLetter也会返回true,这样就起不到划分中文字的目的,比如

“中国” 原本划分为 "中/国/",按照你的改动会划分为"中国/"

如果假定非中日韩语言都是字节长度为1或者2的话(不确定这个假设),可修改为

if size <= 2 && r != " " {

经实验可正确处理下面的语言

中文,日文,韩文,德语,法语,西班牙语,俄语

https://github.com/huichen/sego/blob/master/segmenter.go#L239

@huichen
Copy link
Owner

huichen commented Nov 15, 2013

貌似只有中日韩是2或者3字节这个假设是正确的,只有一种印度的语言除外,见UTF-8分区表

http://en.wikipedia.org/wiki/Utf-8#Codepage_layout

但不清楚是否非中日韩语言都是依赖空格分词的,这个假设可能过强,但对主要的几个字母语言是正确的假设。

@yunge
Copy link
Author

yunge commented Nov 15, 2013

抱歉没有仔细验证IsLetter对cjk的处理。
目前这个方法不错,对于分词应该够了,3字节及以上应该都是一些特殊字符。
我以后在做其它各个语言的数据采集时,会进行一下检查,有问题再联系。

我不知道你email,一些建议就在这里提一下了。
首先真的很希望你能把这个项目坚持下去,目前来看wukong应该是go语言第一个全文检索/搜索引擎了,说实话开源项目的先发优势,有时候还是很大的,所以如果能坚持下去,wukong是可能有一个很大的发展的,就像lucene、sphinx。当然这也确实需要大量的精力投入,如果你真的很忙,我也完全理解。
另外就是两个具体的建议,首先是多语言支持,其次是索引的持久化。

我在你的微博看到你现在人在google,那么是否有可能找一些自然语言处理方面的同事,一起完善一下多语言部分?持久化这个相信你也肯定考虑过,如果有具体的计划,
不妨也公布一下。

不管如何,多谢你的这个项目,我以前是用sphinx的,刚开始的时候sphinx连个go的库都没有,我自己还写一个了sphinx的client库。如果有纯go开发的全文检索库,可以做很多深入的针对业务的优化了。

2013/11/15 Hui Chen notifications@github.com

经实验不可以,因为当r为单个中文字时,unicode.IsLetter也会返回true,这样就起不到划分中文字的目的,比如

“中国” 原本划分为 "中国",按照你的改动会划分为"中国/"

如果假定非中日韩语言都是字节长度为1或者2的话(不确定这个假设),可修改为

if size <= 2 && r != " " {

经实验可正确处理下面的语言

中文,日文,韩文,德语,法语,西班牙语,俄语

https://github.com/huichen/sego/blob/master/segmenter.go#L239


Reply to this email directly or view it on GitHubhttps://github.com//issues/2#issuecomment-28542397
.

@yunge
Copy link
Author

yunge commented Nov 15, 2013

又想起一个问题,目前这种方式,好像难以处理字母语言的标点符号。

而且有些语种的标点符号与英语不同,像阿拉伯语的问号,是倒过来的'؟'。
你看会不会这样好一些?
if size <= 2 && (unicode.IsLetter(r) || unicode.IsNumber(r)) {

2013/11/15 Fu Yunge yunge.fu@gmail.com

抱歉没有仔细验证IsLetter对cjk的处理。
目前这个方法不错,对于分词应该够了,3字节及以上应该都是一些特殊字符。
我以后在做其它各个语言的数据采集时,会进行一下检查,有问题再联系。

我不知道你email,一些建议就在这里提一下了。

首先真的很希望你能把这个项目坚持下去,目前来看wukong应该是go语言第一个全文检索/搜索引擎了,说实话开源项目的先发优势,有时候还是很大的,所以如果能坚持下去,wukong是可能有一个很大的发展的,就像lucene、sphinx。当然这也确实需要大量的精力投入,如果你真的很忙,我也完全理解。
另外就是两个具体的建议,首先是多语言支持,其次是索引的持久化。

我在你的微博看到你现在人在google,那么是否有可能找一些自然语言处理方面的同事,一起完善一下多语言部分?持久化这个相信你也肯定考虑过,如果有具体的计划,
不妨也公布一下。

不管如何,多谢你的这个项目,我以前是用sphinx的,刚开始的时候sphinx连个go的库都没有,我自己还写一个了sphinx的client库。如果有纯go开发的全文检索库,可以做很多深入的针对业务的优化了。

2013/11/15 Hui Chen notifications@github.com

经实验不可以,因为当r为单个中文字时,unicode.IsLetter也会返回true,这样就起不到划分中文字的目的,比如

“中国” 原本划分为 "中国",按照你的改动会划分为"中国/"

如果假定非中日韩语言都是字节长度为1或者2的话(不确定这个假设),可修改为

if size <= 2 && r != " " {

经实验可正确处理下面的语言

中文,日文,韩文,德语,法语,西班牙语,俄语

https://github.com/huichen/sego/blob/master/segmenter.go#L239


Reply to this email directly or view it on GitHubhttps://github.com//issues/2#issuecomment-28542397
.

@huichen
Copy link
Owner

huichen commented Nov 15, 2013

已经改正,多谢!

谢谢你对这个项目的鼓励和支持,正如你所说的,多语言支持和索引持久化正是悟空最缺乏的两个功能。如果你使用中有什么问题请尽管问。我也希望有更多人来使用和完善这个引擎,让我们一起把这个开源项目做大做好!

@huichen huichen closed this as completed Aug 24, 2016
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants