@@ -1,78 +0,0 @@ | |||||
## ideaseg | |||||
`ideaseg` 是一个基于最新的 [HanLP](https://github.com/hankcs/HanLP/tree/1.x) 自然语言处理工具包实现的中文分词器, | |||||
包含了最新的模型数据,同时移除了 HanLP 所包含的非商业友好许可的 [NeuralNetworkParser](https://github.com/hankcs/HanLP/issues/644) 相关代码和数据。 | |||||
`HanLP` 相比其他诸如 `IK`、`jcseg` 等分词器而言,在分词的准确率上有巨大的提升,但速度上有所牺牲。 | |||||
通过对 `HanLP` 进行优化配置,`ideaseg` 在准确度和分词速度上取得了最佳的平衡。 | |||||
与其他基于 `HanLP` 的插件相比,`ideaseg` 同步了最新 `HanLP` 的代码和数据,去除了无法商用的相关内容;实现了自动配置; | |||||
包含了模型数据,无需自行下载,使用简单方便。 | |||||
`ideaseg` 提供三个模块包括: | |||||
1. `core` ~ 核心分词器模块 | |||||
2. `elasticsearch` ~ ElasticSearch 的 ideaseg 分词插件 (默认版本 7.10.2) | |||||
3. `opensearch` ~ OpenSearch 的 ideaseg 分词插件 (默认版本 2.4.1) | |||||
此外 `data` 包含 `HanLP` 的模型数据。 | |||||
由于 `ElasticSearch` 的插件机制严格绑定引擎本身的版本,而且版本众多,因此本项目不提供预编译的二进制版本,你需要执行下载源码进行构建。 | |||||
### 构建 | |||||
以下是插件的构建过程,在开始之前请先安装好 `git`、`java`、`maven` 等相关工具。 | |||||
首先确定你的 `ElasticSearch` 或者 `OpenSearch` 的具体版本,假设你使用的是 `ElasticSearch` 7.10.2 版本, | |||||
请使用文本编辑器打开 `ideaseg/elasticsearch/pom.xml` 文件,修改 `elasticsearch.version` 对应的值为 `7.10.2` | |||||
(如果是 `OpenSearch` 请修改 `opensearch/pom.xml`)。 | |||||
保存文件并打开命令行窗口,执行如下命令开始构建: | |||||
```shell | |||||
$ git clone https://gitee.com/indexea/ideaseg | |||||
$ cd ideaseg | |||||
$ mvn install | |||||
``` | |||||
构建完成后,将在 `elasticsearch/target` 和 `opensearch/target` 各生成两个插件文件为 `ideaseg.zip` 。 | |||||
### 安装 | |||||
构建完成后,我们可以利用 `ElasticSearch` 或 `OpenSearch` 提供的插件管理工具进行安装。 | |||||
`ElasticSearch` 对应的插件管理工具为 `<elasticsearch>/bin/elasticsearch-plugin` , | |||||
而 `OpenSearch` 对应的管理工具为 `<opensearch>/bin/opensearch-plugin`。 | |||||
其中 `<elasticsearch>` 和 `<opensearch>` 为两个服务安装后所在的目录。 | |||||
#### ElasticSearch 安装 ideaseg 插件 | |||||
```shell | |||||
$ bin/elasticsearch-plugin install file:///<ideaseg>/elasticsearch/target/ideaseg.zip | |||||
``` | |||||
#### OpenSearch 安装 ideaseg 插件 | |||||
```shell | |||||
$ bin/opensearch-plugin install file:///<ideaseg>/opensearch/target/ideaseg.zip | |||||
``` | |||||
其中 `<ideaseg>` 为 `ideaseg` 源码所在的路径。要特别注意到是路径前必须有 `file://` 。 | |||||
安装过程会询问插件所需的权限,回车确认即可完成安装,安装完毕需要重启服务才能让插件生效。 | |||||
接下来你可以使用分词测试工具来对插件进行测试,如下所示: | |||||
``` | |||||
POST _analyze | |||||
{ | |||||
"analyzer": "ideaseg", | |||||
"text": "你好,我用的是 ideaseg 分词插件。" | |||||
} | |||||
``` | |||||
关于分词测试的详情请参考 [ElasticSearch 官方文档](https://www.elastic.co/guide/en/elasticsearch/reference/7.10/test-analyzer.html)。 | |||||
### 反馈问题 | |||||
如果你在使用 `ideaseg` 过程中有任何问题,请通过 [Issues](https://gitee.com/indexea/ideaseg/issues) 提出。 |
@@ -12,12 +12,16 @@ | |||||
`ideaseg` 提供三个模块包括: | `ideaseg` 提供三个模块包括: | ||||
1. `core` ~ 核心分词器模块 | 1. `core` ~ 核心分词器模块 | ||||
2. `elasticsearch` ~ ElasticSearch 的 ideaseg 分词插件 (默认版本 7.10.2) | |||||
2. `elasticsearch` ~ ElasticSearch 的 ideaseg 分词插件 (最高支持 7.10.2 版本) | |||||
3. `opensearch` ~ OpenSearch 的 ideaseg 分词插件 (默认版本 2.4.1) | 3. `opensearch` ~ OpenSearch 的 ideaseg 分词插件 (默认版本 2.4.1) | ||||
**关于 `ElasticSearch` 的版本说明,由于从 7.11.1 版本开始 Elastic 修改 ES 的许可证,同时修改了插件的权限策略, | |||||
不再允许插件对文件进行读写。由于 `HanLP` 本身的模型数据很大,为了提升速度其处理机制需要在插件的数据目录下生成一些相当于缓存的文件。 | |||||
因此,如果你使用的是 `ElasticSearch` 请尽量用 7.10.2 或者以下的版本,推荐使用 `OpenSearch` 。** | |||||
此外 `data` 包含 `HanLP` 的模型数据。 | 此外 `data` 包含 `HanLP` 的模型数据。 | ||||
由于 `ElasticSearch` 的插件机制严格绑定引擎本身的版本,而且版本众多,因此本项目不提供预编译的二进制版本,你需要执行下载源码进行构建。 | |||||
由于包含数据模型体积较大(打包后四五百兆),再加上 `ElasticSearch` 的插件机制严格绑定引擎本身的版本,而且版本众多,因此本项目不提供预编译的二进制版本,你需要自行下载源码进行构建。 | |||||
### 构建 | ### 构建 | ||||
@@ -57,7 +61,7 @@ $ bin/elasticsearch-plugin install file:///<ideaseg>/elasticsearch/target/idease | |||||
$ bin/opensearch-plugin install file:///<ideaseg>/opensearch/target/ideaseg.zip | $ bin/opensearch-plugin install file:///<ideaseg>/opensearch/target/ideaseg.zip | ||||
``` | ``` | ||||
其中 `<ideaseg>` 为 `ideaseg` 源码所在的路径。要特别注意到是路径前必须有 `file://` 。 | |||||
其中 `<ideaseg>` 为 `ideaseg` 源码所在的路径。要特别注意到是路径前必须有 `file://` ,如果是 Windows 系统,则需要路径前添加 `file:///` ,例如 `file:///D:\WORKDIR\Indexea\ideaseg\elasticsearch\target\ideaseg.zip`。 | |||||
安装过程会询问插件所需的权限,回车确认即可完成安装,安装完毕需要重启服务才能让插件生效。 | 安装过程会询问插件所需的权限,回车确认即可完成安装,安装完毕需要重启服务才能让插件生效。 | ||||
@@ -75,4 +79,8 @@ POST _analyze | |||||
### 反馈问题 | ### 反馈问题 | ||||
如果你在使用 `ideaseg` 过程中有任何问题,请通过 [Issues](https://gitee.com/indexea/ideaseg/issues) 提出。 | |||||
如果你在使用 `ideaseg` 过程中有任何问题,请通过 [Issues](https://gitee.com/indexea/ideaseg/issues) 提出。 | |||||
### 特别感谢 | |||||
https://github.com/KennFalcon/elasticsearch-analysis-hanlp |
@@ -1,23 +0,0 @@ | |||||
## ideaseg 分词核心模块 | |||||
根据实际的比较结果来看,成熟可用的中文分词模块有如下几个: | |||||
* **HanLP (最佳选择)** | |||||
基于深度学习和海量语料训练的自然语言处理,代码结构差但是可用。性能相比 jcseg 可能有10倍差距(没细测) 但是准确度非常高,分词效果非常好。 | |||||
该项目最新版本 1.8.2 ,以后基本上不会再更新了,官方以前全面转向云服务。 | |||||
* jcseg | |||||
速度快,但是分词定位错误问题始终没有解决,不过解决思路已经有了。暂时不予考虑。 | |||||
* CoreNLP | |||||
非常专业的自然语言处理能力,但是体积大、速度慢,无法在生产中使用, 日后可以考虑使用它为一些高净值客户提供专属服务 | |||||
* ikanalyzer | |||||
比较老而且成熟的基于词库分词,多年未更新,有志愿者一直提供 ES 插件的更新。 | |||||
经过多次比较最终确定第一版基于 **HanLP** 实现分词功能。 | |||||
**下一步需要做的包括:** | |||||
1. 提供多租户的分词个性化定制能力 | |||||
2. 优化分词性能 | |||||
3. 完善 HanLP 的代码结构 | |||||
4. 提供多种分词模型 | |||||
5. 研究如何更新语料库,生成新的语料模型 |
@@ -1,8 +0,0 @@ | |||||
## ideaseg 的 ElasticSearch 插件 | |||||
插件名称:ideaseg | |||||
**下一步需要做的包括:** | |||||
1. 深入研究并充分理解 ES 分词插件的接口 | |||||
2. 结合分词的设置功能,为用户提供分词器的个性化定制 |
@@ -4,7 +4,6 @@ import com.hankcs.hanlp.utility.Predefine; | |||||
import com.indexea.ideaseg.core.IdeasegIOAdapter; | import com.indexea.ideaseg.core.IdeasegIOAdapter; | ||||
import com.indexea.ideaseg.core.PluginBase; | import com.indexea.ideaseg.core.PluginBase; | ||||
import org.apache.lucene.analysis.Analyzer; | import org.apache.lucene.analysis.Analyzer; | ||||
import org.elasticsearch.common.io.PathUtils; | |||||
import org.elasticsearch.common.settings.Settings; | import org.elasticsearch.common.settings.Settings; | ||||
import org.elasticsearch.env.Environment; | import org.elasticsearch.env.Environment; | ||||
import org.elasticsearch.index.analysis.AnalyzerProvider; | import org.elasticsearch.index.analysis.AnalyzerProvider; | ||||
@@ -14,6 +13,7 @@ import org.elasticsearch.plugins.AnalysisPlugin; | |||||
import org.elasticsearch.plugins.Plugin; | import org.elasticsearch.plugins.Plugin; | ||||
import java.io.File; | import java.io.File; | ||||
import java.nio.file.FileSystems; | |||||
import java.nio.file.Path; | import java.nio.file.Path; | ||||
import java.util.HashMap; | import java.util.HashMap; | ||||
import java.util.Map; | import java.util.Map; | ||||
@@ -35,8 +35,8 @@ public class IdeasegPlugin extends Plugin implements AnalysisPlugin, PluginBase | |||||
home = Environment.PATH_HOME_SETTING.get(settings); | home = Environment.PATH_HOME_SETTING.get(settings); | ||||
if (home == null) | if (home == null) | ||||
throw new IllegalStateException(Environment.PATH_HOME_SETTING.getKey() + " is not configured"); | throw new IllegalStateException(Environment.PATH_HOME_SETTING.getKey() + " is not configured"); | ||||
Path pluginHome = PathUtils.get(home, "plugins", PLUGIN_NAME); | |||||
IdeasegIOAdapter.BASE_PATH = pluginHome.toString() + File.separator; //设置 HanLP 根目录 | |||||
Path pluginHome = FileSystems.getDefault().getPath(home, "plugins", PLUGIN_NAME); | |||||
IdeasegIOAdapter.BASE_PATH = pluginHome + File.separator; //设置 HanLP 根目录 | |||||
Predefine.HANLP_PROPERTIES_PATH = IdeasegIOAdapter.BASE_PATH + CONFIG_FILE_NAME; | Predefine.HANLP_PROPERTIES_PATH = IdeasegIOAdapter.BASE_PATH + CONFIG_FILE_NAME; | ||||
} | } | ||||
@@ -1,7 +0,0 @@ | |||||
## ideaseg 的 OpenSearch 插件 | |||||
插件名称:ideaseg | |||||
**下一步需要做的包括:** | |||||
与 elasticsearch 插件的工作相同 |