Jcseg — это легковесный китайский сегментатор, основанный на алгоритме mmseg, который также включает в себя такие функции как извлечение ключевых слов, ключевых фраз, ключевых предложений и автоматическое создание сводок статей. В Jcseg встроен веб-сервер на основе Jetty, что позволяет легко вызывать его через HTTP на различных языках программирования. Кроме того, он предоставляет интерфейсы для сегментации текста для последних версий Lucene, Solr, Elasticsearch/OpenSearch.
Файл конфигурации jcseg.properties
входит в состав Jcseg и используется для быстрой настройки приложения под различные условия использования, такие как максимальная длина слова, активация распознавания китайских имён, добавление пиньиня, добавление синонимов и так далее.
lexicon
можно свободно добавлять/удалять/изменять словари и содержимое словарей, а также разделение словарей на категории.lexicon
.путь позволяет использовать ';' для разделения нескольких директорий со словарями.При необходимости перевести текст на русский язык, следует обратить внимание на следующие моменты:
"Imagination Cup Hacking Technology Contest" переведено как "Imagination Cup Hacking Technology Contest".
"lex-lname", "lex-dname-1", "lex-dname-2", "jcseg.properties", "lex-stopwords.lex", "lex-autoload.todo" остаются без изменений, поскольку являются именами файлов или конфигураций.
"URL" остается без изменений, так как это аббревиатура.
"Континентальный Китай" переведено правильно.
"Денежные единицы" переведено правильно.
"Быстрый запуск" переведено правильно.#### Тестирование в командной строке:
Перейти в корневую директорию Jcseg с помощью команды cd
.
Выполнить сборку проекта с помощью ant all
(или использовать Maven для компиляции).
Запустить приложение с помощью команды java -jar jcseg-core-{версия}.jar
.
Вы увидите следующий интерфейс командной строки.
Введите текст в поле курсора для начала тестирования (введите параметр seg_mode
, чтобы переключиться между различными алгоритмами разделения).
+---------------------Jcseg китайский токенизатор слов-----------------------------+
| - @Автор chenxin<chenxin619315@gmail.com> |
| - :seg_mode : переключение на указанный режим токенизации. |
| - (:complex,:simple,:most,:detect,:delimiter,:NLP,:ngram) |
| - :keywords : переключение на режим извлечения ключевых слов. |
| - :keyphrase : переключение на режим извлечения ключевых фраз. |
| - :sentence : переключение на режим извлечения предложений. |
| - :summary : переключение на режим извлечения сводок. |
| - :help : вывод этого меню помощи. |
| - :quit : выход из программы. |
+-----------------------------------------------------------------------------------+
jcseg~токенизация:complex>>
Амбивалентность и синонимы: исследование происхождения жизни, смешанные слова: сделать УЗИ для проверки здоровья, что такое сущность рентгеновского излучения, сегодня мы отправляемся в KTV "караоке" в районе Чжиду, Дора Эйч-Эн — главный герой анимационного сериала, единицы измерения и полукруглые символы: путешествие в университет началось 6 августа 2009 года, температура в городе Яньян составляет 38,6°C, то есть 101,48°F, китайские цифры/дроби: вы получаете две тридцатых, Чжоу Цинь берёт пять тридцатых, остальные двадцать три тридцатых принадлежат мне, это было до 1998 года, блюдо "манты" очень вкусное, движение 4 мая оставило после себя дух 4 мая. Ноутбуки со скидкой 50%, отправка за почтой. Распознавание имён: я Чжоу Цинь, также автор Jcseg, Жу Гэньсинь из эпохи Троецарствия был гением, давайте вместе поболеем за Лю Хян, Лу Цзи очень рад тому, что У Ла подарил ему ноутбук. Распознавание иностранных имён: время в Исландии 1 июля, актёр Том Круз, который снимается там, признал через своего пресс-секретаря, что его брак с третьей женой Кэтти Хермес (ранее были два брака с Ми-Ми Роджерс и Николь Кидман соответственно) скоро закончится. Парные знаки препинания: победителем конкурса хакерских технологий "Чангсиань" является Чжан Сань из группы 09-2BF, награда — книга по C++ и набор учебников PHP от "Чангсиань".
Перед использованием примеров тестовых данных убедитесь, что вы правильно установили и скомпилировали проект **Jcseg**.##### Разбиение на слова:
Разделение:/w
Исландия/ns время/n июль/m первое число/m ,/ находящийся/u там/s съёмка/vi Том Круз/nr А Танг Гэ/nr признался/v через/v представителя/n ,/ он/r с/o третьего/m женой/n Кейт Холмс/nr (первый/a второй/j женой/n Ми Ми Роджерс/nr Николь Кидман/nr )/ его/u брак/n закончится/d .,/ пары/vn знаки/n :/ этот/r «/ Цай Сян Бэй/nz »/ хакеры/n технологии/n конкурс/vn победитель/n является/a Telecommunications/нт 09/en -/ BF/en 2BF/en Чжан Сан/nr ,/ награда/vn C++/en программирование/gi язык/n книга/ns и/o [ Cай-ксе-нь цю-бин/nz ]/ его/u «/ PHP Tutorial/nz »/ набор/m .,/ особенный/a буквы/n :/ [ I/nz ]/ (/ II/m )/,/ английский/n английский/n цифры/n :/ Bug/en Report/en Ченсинь/en 619315/en Gmail/en Com/en Ченсинь619315@gmail.com/en Or/en Visit/en Http/en :// Code/en Google/en Com/en Code.Google.Com/en // P/en // Jcseg/en ,/ мы/r все/pl восхищаемся/v приветствуем/v любим/v наслаждаемся/v духом/n ума/n хакера/n ! / особенный/a цифры/n :/ ①/m ⑩/m ⑽/m ㈩/m . /# **Jcseg** Maven репозиторий:
* jcseg-core:
```xml
<dependency>
<groupId>org.lionsoul</groupId>
<artifactId>jcseg-core</artifactId>
<version>2.6.3</version>
</dependency>
<dependency>
<groupId>org.lionsoul</groupId>
<artifactId>jcseg-analyzer</artifactId>
<version>2.6.3</version>
</dependency>
<dependency>
<groupId>org.lionsoul</groupId>
<artifactId>jcseg-elasticsearch</artifactId>
<version>2.6.3</version>
</dependency>
<dependency>
<groupId>org.lionsoul</groupId>
<artifactId>jcseg-opensearch</artifactId>
<version>2.6.3</version>
</dependency>
<dependency>
<groupId>org.lionsoul</groupId>
<artifactId>jcseg-server</artifactId>
<version>2.6.3</version>
</dependency>
// Для версий Lucene 6.3.0 и выше
Analyzer analyzer = new JcsegAnalyzer(ISegment.COMPLEX, config, dic);
// Необязательно (для изменения конфигурации по умолчанию): Получение экземпляра конфигурации сегментатора
JcsegAnalyzer jcseg = (JcsegAnalyzer) analyzer;
SegmenterConfig config = jcseg.getConfig();
// Добавление синонимов, требуется настройка jcseg.loadsyn=1 в jcseg.properties
config.setAppendCJKSyn(true);
// Добавление пиньиня, требуется настройка jcseg.loadpinyin=1 в jcseg.properties
config.setAppendCJKPinyin();
// Больше настроек, см. org.lionsoul.jcseg.SegmenterConfig
```# **Jcseg** интерфейс лексемизации Solr:
1. Копируйте jcseg-core-{версия}.jar и jcseg-analyzer-{версия}.jar в каталог библиотек Solr.
2. Добавьте одну из следующих двух конфигураций в scheme.xml Solr:
```xml
<!-- Комплексный режим лемматизации: -->
<fieldtype name="textComplex" class="solr.TextField">
<analyzer>
<tokenizer class="org.lionsoul.jcseg.analyzer.JcsegTokenizerFactory" mode="complex"/>
</analyzer>
</fieldtype>
<!-- Простой режим лемматизации: -->
<fieldtype name="textSimple" class="solr.TextField">
<analyzer>
<tokenizer class="org.lionsoul.jcseg.analyzer.JcsegTokenizerFactory" mode="simple"/>
</analyzer>
</fieldtype>
<!-- Детекторный режим лемматизации: -->
<fieldtype name="textDetect" class="solr.TextField">
<analyzer>
<tokenizer class="org.lionsoul.jcseg.analyzer.JcsegTokenizerFactory" mode="detect"/>
</analyzer>
</fieldtype>
<!-- Поисковый режим лемматизации: -->
<fieldtype name="textSearch" class="solr.TextField">
<analyzer>
<tokenizer class="org.lionsoul.jcseg.analyzer.JcsegTokenizerFactory" mode="most"/>
</analyzer>
</fieldtype>
<!-- Режим лемматизации NLP: -->
<fieldtype name="textNLP" class="solr.TextField">
<analyzer>
<tokenizer class="org.lionsoul.jcseg.analyzer.JcsegTokenizerFactory" mode="nlp"/>
</analyzer>
</fieldtype>
<!-- Режим лемматизации с разделителем: -->
<fieldtype name="textDelimiter" class="solr.TextField">
<analyzer>
<tokenizer class="org.lionsoul.jcseg.analyzer.JcsegTokenizerFactory" mode="delimiter"/>
</analyzer>
</fieldtype>
<!-- Режим лемматизации n-gram: -->
<fieldtype name="textNGram" class="solr.TextField">
<analyzer>
<tokenizer class="org.lionsoul.jcseg.analyzer.JcsegTokenizerFactory" mode="ngram"/>
</analyzer>
</fieldtype>
Примечание:1. Если используется версия Solr-4.x, скачайте исходный код с тэга v1.9.7-release, скомпилируйте его и получите соответствующий jar. Затем замените v5x
в вышеупомянутом xml на v4x
.
2. Если используется версия Solr-6.3.0 или ниже, путь к пакету JcsegTokenizerFactory будет следующим: org.lionsoul.jcseg.analyzer.v5x.JcsegTokenizerFactoryДля определения типа токенизатора можно использовать любую конфигурацию, определённую в jcseg.properties. Разница заключается в том, что имя конфигурации должно иметь _
вместо .
. Включите синонимы:
<fieldtype name="textComplex" class="solr.TextField">
<analyzer>
<tokenizer class="org.lionsoul.jcseg.analyzer.JcsegTokenizerFactory" mode="complex" jsceg_loadsyn="1"/>
</analyzer>
</fieldtype>
Существуют следующие варианты анализаторов:
jcseg : соответствует алгоритму анализа для поиска
jcseg_complex : соответствует сложному алгоритму анализа
jcseg_simple : соответствует простому алгоритму анализа
jcseg_detect : соответствует алгоритму анализа для обнаружения
jcseg_most : соответствует алгоритму анализа для максимального количества слов
jcseg_nlp : соответствует алгоритму анализа для NLP
jcseg_delimiter : соответствует алгоритму анализа для разделителей
jcseg_ngram : соответствует алгоритму анализа для n-грамм
Настройка конфигурации уровня индекса: Начиная с версий 2.5.0 и выше, вы можете использовать любые параметры из файла jcseg.properties для переопределения конфигураций при создании карты Elasticsearch/OpenSearch. Разница заключается в том, что имя конфигурации должно содержать "_" вместо ".", например, для настройки загрузки синонимов:
"settings": {
"analysis": {
"analyzer": {
"jcseg_complex_v3": {
"type": "jcseg_complex",
"jcseg_maxlen": "3",
"jcseg_loadsyn": "1"
}
}
}
}
```Адрес для тестирования конфигурации:```
http://localhost:9200/_analyze? analyzer=jcseg_most&text=сто долларов равно сколько юаней
curl 'http://localhost:9200/_analyze? pretty=true' -H 'Content-Type:application/json' -d'
{
"analyzer": "jcseg_most",
"text": "сто долларов равно сколько юаней"
}'
Вывод результата:
{
"tokens" : [
{
"token" : "сто",
"start_offset" : 0,
"end_offset" : 2,
"type" : "word",
"position" : 0
},
{
"token" : "долларов",
"start_offset" : 2,
"end_offset" : 7,
"type" : "word",
"position" : 1
},
{
"token" : "равно",
"start_offset" : 7,
"end_offset" : 11,
"type" : "word",
"position" : 2
},
{
"token" : "сколько",
"start_offset" : 11,
"end_offset" : 16,
"type" : "word",
"position" : 3
},
{
"token" : "юаней",
"start_offset" : 16,
"end_offset" : 21,
"type" : "word",
"position" : 4
}
]
}
"token" : "民",
"start_offset" : 9,
"end_offset" : 10,
"type" : "слово",
"position" : 15
},
{
"token" : "币",
"start_offset" : 10,
"end_offset" : 11,
"type" : "слово",
"position" : 16
}
]
}
Также можно использовать пакет Elasticsearch, интегрированный с JCSEG: elasticsearch-jcseg, распакуйте и сразу сможете использовать.## JCSEG-разделочный сервер:
Модуль jcseg-server
включает Jetty и реализует высокопроизводительный сервер, который добавляет RESTful API ко всем функциям JCSEG и стандартизирует JSON-формат вывода API. Для использования этих API достаточно вызвать HTTP-клиента.
jcseg-server-{версия}.jar
. Maven уже скомпилировал все зависимые JAR-файлы вместе. Если используется Ant, то зависимости должны быть загружены при запуске.# В конце передайте путь к файлу конфигурации jcseg-server.properties
java -jar jcseg-server-{версия}.jar ./jcseg-server.properties
jcseg-server/target/jcseg-server
, структура директорий следующая:
01, config: Конфигурационная директория, где `jcseg-server.properties` управляет настройками сервера и словарей, а `jvm.options` управляет параметрами JVM, такими как выделение памяти, по умолчанию 1.5 ГБ.
02, lib: Директория со всеми зависимыми JAR-файлами.
03, lexicon: Директория словарей JCSEG, здесь можно менять и управлять словарями.
04, jcseg-server: Скрипт управления запуском, доступен только для Linux, добавление параметра `-d` позволяет запускать в фоновом режиме.
# Скопируйте директорию `jcseg-server/target/jcseg-server` в место установки, назначьте её `$JS_DIR`.
``` cd $JS_DIR
# При первом запуске добавьте права выполнения к `jcseg-server`.
# Запуск одновременно
./jcseg-server
# Запуск в фоновом режиме
./jcseg-server -d
{ # Конфигурация сервера jcseg "server_config": { # Порт сервера "port": 1990, # Дефолтная кодировка связи "charset": "utf-8", # Время простоя HTTP соединения в миллисекундах "http_connection_idle_timeout": 60000, # Максимальное количество потоков пула потоков Jetty "max_thread_pool_size": 200, # Время простоя потока в миллисекундах "thread_idle_timeout": 30000, # Размер буфера вывода HTTP "http_output_buffer_size": 32768, # Размер заголовка запроса "http_request_header_size": 8192, # Размер заголовка ответа "http_response_header_size": 8192 }, # Глобальные настройки для jcseg, ещё один экземпляр старого файла конфигурации jcseg.properties "jcseg_global_config": { # Максимальная длина совпадения (5-7) "jcseg_maxlen": 7, # Распознавание китайских имён # (true - открыто, false - закрыто) "jcseg_icnname": true, # Максимальная длина парной пунктуационной последовательности # Установите значение в 0 для отключения этой функции "jcseg_pptmaxlen": 7, # Максимальная длина фамилии и имени китайского человека "jcseg_cnmaxlnadron": 1, # Очистка списка запрещённых слов # (true - очистить список запрещённых слов, false - отключить эту функцию) "jcseg_clearstopword": false, # Преобразование китайских цифр в арабские цифры
Необходимо завершить последнюю строку:
```markdown
# Преобразование китайских цифр в арабские цифры
"jcseg_chinese_to_arabic_conversion": true
}
}
``` # (true - включено, false - выключено)
# Например, '\u4E09\u4E07' будет преобразовано в 3000.
"jcseg_cnnumtoarabic": true,
# Преобразование китайской дроби в арабскую дробь
# @Примечание: для Lucene, Solr, Elasticsearch эта функция должна быть отключена.
"jcseg_cnfratoarabic": false,
# Сохранение нераспознанных слов
# (true - сохранять нераспознанные слова, false - удалить их)
"jcseg_keepunregword": true,
# Вторичное деление сложных английских слов
"jcseg_ensencondseg": true,
# Минимальная длина вторичного простого токена
# лучше больше чем 1
"jcseg_stokenminlen": 2,
# Пороговое значение для распознавания китайских имён
# лучше не менять это значение до тех пор пока вы точно знаете что делаете
"jcseg_nsthreshold": 1000000,
# Пунктуация, которая будет сохранена внутри токена
# (не в конце токена)
"jcseg_keeppunctuations": "@#%. &+"
},
``` # Настройка экземпляра словаря.
# Добавьте свои данные здесь с использованием стандартной JSON синтаксис
"jcseg_dict": {
"master": {
"path": [
"{jar.dir}/лексикон"
# Абсолютный путь здесь
# "/java/JavaSE/jcseg/lexicon"
],
# Загружать ли части речи слов
"loadpos": true,
# Загрузка пиньиня слов.
"loadpinyin": true,
}
}``` # Загрузка синонимов слов.
"loadsyn": true,
# Загрузка сущностей слов.
"loadentity": true,
# Автоматическая загрузка модифицированного словарного файла.
"autoload": true,
# Интервал опроса для автоматической загрузки. (в секундах)
"polltime": 300
}
# Добавьте свои здесь
# ,"name" : {
# "path": [
# "абсолютный путь до стандартного лексикона jcseg 1",
# "абсолютный путь до стандартного лексикона jcseg 2"
# ...
# ],
# "autoload": 0,
# "polltime": 300
# }
},
# Настройки конфигурации сегментатора.
# @Примечание:
# Все экземпляры конфигурации здесь расширяются от глобальных настроек выше.
# Отсутствие действий приведёт к применению всех настроек из глобальных настроек.
"jcseg_config": {
"master": {
# Расширение и переопределение глобальных настроек
"jcseg_pptmaxlen": 0,
"jcseg_cnfratoarabic": true,
"jcseg_keepunregword": false
}
# Этот экземпляр используется для извлечения ключевых слов, ключевых фраз, предложений и суммаризации.
# @Примечание: не удаляйте этот экземпляр, если вы хотите использовать jcseg как службу извлечения.
,"extractor": {
"jcseg_pptmaxlen": 0,
"jcseg_clearstopword": true,
"jcseg_cnnumtoarabic": false,
"jcseg_cnfratoarabic": false,
"jcseg_keepunregword": false,
"jcseg_ensencondseg": false
}```markdown
# Добавьте больше своих здесь
# ,"name": {
# ...
# }
# Настройка экземпляра jcseg tokenizer.
# Вы можете использовать этот экземпляр для вас с помощью доступа:
# http://jcseg_server_host:port/tokenizer/instance_name
# instance_name — это имя экземпляра, которое вы определяете ниже.
"jcseg_tokenizer": {
"master": {
# Алгоритм jcseg tokenizer, может быть:
# 1: SIMPLE_MODE
# 2: COMPLEX_MODE
# 3: DETECT_MODE
# 4: MOST_MODE
# 5: DELIMITER_MODE
# 6: NLP_MODE
# 7: NGRAM_MODE
# См. org.lionsoul.jcseg.segmenter.SegmenterConfig для получения дополнительной информации
"algorithm": 2,
# Имя экземпляра словаря
# Выберите одно из ваших определений выше в области словарей
"dict": "master",
# Имя экземпляра конфигурации
# Выберите одно из ваших определений выше в области конфигураций
"config": "master"
},
# Этот экземпляр tokenizer используется для сервиса извлечения данных
# Не удаляйте его, если хотите, чтобы jcseg обслуживал ваш сервис извлечения данных
"extractor": {
"algorithm": 2,
"dict": "master",
"config": "extractor"
}
}
# Экземпляр используется только для NLP.
,"nlp" : {
"jcseg_ensencondseg": false,
"jcseg_cnfratoarabic": true,
"jcseg_cnnumtoarabic": true
}
```### RESTful API:
#### 1. Извлечение ключевых слов:
> Адрес API: http://jcseg_server_host:port/extractor/keywords?text=&number=&autoFilter=true|false
> Параметры запроса:
<pre>
text: текст документа, передаваемого через POST или GET
number: количество ключевых слов для извлечения
autoFilter: автоматическое отсеивание ключевых слов с низкими баллами (true/false)
</pre>> Возвращаемое значение API:
```json
{
// Код ошибки API, 0 — успешное выполнение, 1 — ошибка в параметрах, -1 — внутренняя ошибка
"code": 0,
// Данные ответа API
"data": {
// Массив ключевых слов
"keywords": [],
// Время выполнения операции
"took": 0.001
}
}
Дополнительные конфигурации см. в org.lionsoul.jcseg.server.controller.KeywordsController
.
Адрес API: http://jcseg_server_host:port/extractor/keyphrase?text=&number=
Параметры запроса:
text: текст документа, передаваемого через POST или GET number: количество ключевых фраз для извлечения
Возвращаемое значение API:
{
"code": 0,
"data": {
"took": 0.0277,
// Массив ключевых фраз
"keyphrase": []
}
}
Дополнительные конфигурации см. в org.lionsoul.jcseg.server.controller.KeyphraseController
.
Адрес API: http://jcseg_server_host:port/extractor/sentence?text=&number=
Параметры запроса:
text: текст документа, передаваемого через POST или GET number: количество ключевых предложений для извлечения
Возвращаемое значение API:
{
"code": 0,
"data": {
"took": 0.0277,
// Массив ключевых предложений
"sentence": []
}
}
Дополнительные конфигурации см. в org.lionsoul.jcseg.server.controller.SentenceController
.
Адрес API: http://jcseg_server_host:port/extractor/summary?text=&length=
Параметры запроса:
text: текст документа, передаваемого через POST или GET length: длина аннотации для извлечения> Возвращаемое значение API:
{
"code": 0,
"data": {
"took": 0.0277,
// Аннотация статьи
"summary": ""
}
}
Дополнительные конфигурации см. в org.lionsoul.jcseg.server.controller.SummaryController
.
API адрес:
http://jcseg_server_host:port/tokenizer/tokenizer_instance?text=&ret_pinyin=&ret_pos=...
Параметры API:
tokenizer_instance: имя экземпляра сегментатора, определённого в jcseg-server.properties text: текст статьи, полученный через POST или GET запрос ret_pinyin: указывает, следует ли включать пиньинь слов в результате сегментации (отменено после версии 2.0.1) ret_pos: указывает, следует ли включать части речи слов в результате сегментации (отменено после версии 2.0.1)
Возвращаемое значение API:
{
"code": 0,
"data": {
"took": 0.00885,
// массив объектов словарей
"list": [
{
"word": "哆啦a梦",
"position": 0,
"length": 4,
"pinyin": "duo la a meng",
"pos": "nz",
"entity": null
}
]
}
}
Дополнительные конфигурации см. в org.lionsoul.jcseg.server.controller.TokenizerController
Справочник JavaDoc: Jcseg JavaDoc##### (1) Создание объекта конфигурации SegmenterConfig:
Поиск файла jcseg.properties:
Поэтому, по умолчанию вы можете поместить файл jcseg.properties в ту же директорию, что и jcseg-core-{версия}.jar, чтобы настроить конфигурацию.
Конструктор SegmenterConfig:
SegmenterConfig(); //Инициализация без поиска конфигурационного файла
SegmenterConfig(boolean autoLoad); //autoLoad=true автоматически ищет конфигурационный файл для инициализации
SegmenterConfig(String proFile); //Инициализация конфигурационного объекта из указанного конфигурационного файла
SegmenterConfig(InputStream is); //Инициализация конфигурационного объекта из указанного входного потока
Пример кода:
//Создание объекта SegmenterConfig с использованием стандартной конфигурации, без поиска конфигурационного файла
SegmenterConfig config = new SegmenterConfig();
Конструктор ADictionary представлен ниже:
ADictionary(SegmenterConfig config, boolean sync);
//config: вышеупомянутый экземпляр SegmenterConfig
//sync: создать ли поточно-безопасный словарь, если требуется оперировать с объектом словаря во время выполнения — передайте true,
// если в jcseg.properties autoload=1, то будет автоматически создан поточно-безопасный словарь
```Пример кода:
```java
// Jcseg предоставляет org.lionsoul.jcseg.dic.DictionaryFactory для удобства создания словарей и последующей совместимости
// Обычно можно использовать
// DictionaryFactory#createDefaultDictionary(SegmenterConfig)
// DictionaryFactory.createSingletonDictionary(SegmenterConfig)
// два метода для создания объекта словаря и загрузки файлов словарей; рекомендуется использовать createSingletonDictionary для создания одиночного словаря
```// config — это вышеупомянутый объект SegmenterConfig.
// Если пути к словарям в данном SegmenterConfig указаны правильно,
// ADictionary загружает все действительные словари согласно информации словарей в config;
// данный метод также решает синхронность или асинхронность словаря на основе config.isAutoload(),
// если config.isAutoload() равно true, создается синхронный словарь, иначе — асинхронный,
// config.isAutoload() соответствует lexicon.autoload в jcseg.properties;
// если config.getLexiconPath() равно null, DictionaryFactory автоматически загружает словари из classpath
// если не хотите, чтобы он автоматически загружал словари из lexicon,
// можно вызвать: DictionaryFactory.createSingletonDictionary(config, false) для создания ADictionary;
ADictionary dic = DictionaryFactory.createSingletonDictionary(config);
```## Создание асинхронного словаря ADictionary с конфигурацией по пути config.lexPath.
```java
ADictionary dic = DictionaryFactory.createDefaultDictionary(config, false);
ADictionary dic = DictionaryFactory.createDefaultDictionary(config, true);
ADictionary dic = DictionaryFactory.createDefaultDictionary(config, config.isAutoload());
// Указывает ADictionary на загрузку всех словарей из указанной директории. // config.getLexiconPath возвращает массив действительных путей к словарям. for (String path : config.getLexiconPath()) { dic.loadDirectory(path); }// Указывает ADictionary на загрузку словаря из указанного файла. dic.load("/java/lex-main.lex"); dic.load(new File("/java/lex-main.lex"));
// Указывает ADictionary на загрузку словаря из указанного входящего потока. dic.load(new FileInputStream("/java/lex-main.lex"));
// Прочтите ниже раздел «Если вы используете пользовательский словарь» для получения дополнительной информации.
Основные методы интерфейса ISegment:
public IWord next();
// Возвращает следующее слово после сегментации.
Пример кода:
// На основе заданного ADictionary и SegmenterConfig создается экземпляр ISegment.
// 1. Через параметр ISegment.Type
// ISegment.COMPLEX указывает на создание объекта ComplexSeg — сложного ISegment.
// ISegment.SIMPLE указывает на создание объекта SimpleSeg — простого ISegment.
// ISegment.DETECT указывает на создание объекта DetectSeg — ISegment для детектирования.
// ISegment.SEARCH указывает на создание объекта SearchSeg — ISegment для поиска.
// ISegment.DELIMITER указывает на создание объекта DelimiterSeg — ISegment для разделителей.
// ISegment.NLP указывает на создание объекта NLPSeg — ISegment для NLP.
// ISegment.NGRAM указывает на создание объекта NGramSeg — ISegment для n-грамм.
ISegment seg = ISegment.Type.fromIndex(mode).factory.create(config, dic);
```// 2. Через вызов прямых методов создания
// ISegment.COMPLEX указывает на конструктор объекта ComplexSeg.
// ISegment.SIMPLE указывает на конструктор объекта SimpleSeg.
// ISegment.DETECT указывает на конструктор объекта DetectSeg.
// ISegment.MOST указывает на конструктор объекта ComplexSeg.
// ISegment.DELIMITER указывает на конструктор объекта DelimiterSeg.
// ISegment.NLP указывает на конструктор объекта NLPSeg.
// ISegment.NGRAM указывает на конструктор объекта NGramSeg.
ISegment seg = ISegment.COMPLEX.factory.create(config, dic);// Устанавливает текст для сегментации
String str = "Исследование происхождения жизни.";
seg.reset(new StringReader(str));
// Получение результатов сегментации
IWord word = null;
while ((word = seg.next()) != null) {
System.out.println(word.getValue());
}
```java
// Создание экземпляра SegmenterConfig для конфигурации сегментации, автоматическое получение jcseg.properties для инициализации.
SegmenterConfig config = new SegmenterConfig(true);
ADictionary dic = DictionaryFactory.createSingletonDictionary(config);
ISegment
на основе предоставленного ADictionary
и SegmenterConfig
Для обеспечения обратной совместимости рекомендуется использовать SegmentFactory
, чтобы создать объект ISegment
.
ISegment seg = ISegment.COMPLEX.factory.create(config, dic);
Нижеследующий код можно многократно вызывать; seg
является небезопасным для потока.
// Устанавливаем текст для токенизации
String str = "Исследование происхождения жизни.";
seg.reset(new StringReader(str));
// Получаем результат токенизации
IWord word = null;
while ((word = seg.next()) != null) {
System.out.println(word.getValue());
}
jcseg.properties
и все словари в jcseg-core-{версия}.jar
. Если SegmenterConfig(true)
используется для создания SegmenterConfig
или если метод SegmenterConfig#autoLoad()
был вызван, то при отсутствии пользовательского конфигурационного файла Jcseg автоматически загружает конфигурацию из classpath. Если config.getLexiconPath() == null
, то DictionaryFactory
по умолчанию будет автоматически загружать словари из classpath.* 1) Настройка пути до словаря через SegmenterConfig
:// 1. По умолчанию создаем SegmenterConfig, не ищем конфигурационные файлы для инициализации
SegmenterConfig config = new SegmenterConfig();
// 2. Устанавливаем путь до пользовательского словаря
config.setLexiconPath(new String[] {
"относительный или абсолютный путь до словаря1",
"относительный или абсолютный путь до словаря2"
// Добавьте больше здесь
});
// 3. Создаем словарь через конфигурацию и DictionaryFactory загружает все словари согласно указанному пути
ADictionary dic = DictionaryFactory.createSingletonDictionary(config);
ADictionary
:// 1. Создаем по умолчанию SegmenterConfig, не ищем конфигурационные файлы для инициализации
SegmenterConfig config = new SegmenterConfig();
```// 2. Создаем объект ADictionary словаря
// Обратите внимание на второй параметр, который равен false, что блокирует автоматическое обнаружение путей до словарей в DictionaryFactory
ADictionary dic = DictionaryFactory.createSingletonDictionary(config, false);
```// 3. Ручное загрузка словаря
dic.load(new File("абсолютный или относительный путь до файла словаря")); // Загружает все записи из указанного файла словаря
dic.load("абсолютный или относительный путь до файла словаря"); // Загружает все записи из указанного файла словаря
dic.load(new FileInputStream("абсолютный или относительный путь до файла словаря")); // Загружает все записи из указанного потока ввода InputStream
dic.loadDirectory("абсолютный или относительный путь до директории словарей"); // Загружает все записи из всех файлов словаря в указанной директории
dic.loadClassPath(); // Загружает все записи из всех файлов словаря в пути classpath (по умолчанию /lexicon)
TextRankKeywordsExtractor
:TextRankKeywordsExtractor(ISegment seg);
//seg: объект Jcseg ISegment для токенизации
//1, Создание объекта Jcseg ISegment для токенизации
SegmenterConfig config = new SegmenterConfig(true);
config.setClearStopwords(true); //Настройка фильтрации стоп-слов
config.setAppendCJKSyn(false); //Настройка отключения добавления синонимов
config.setKeepUnregWords(false); //Настройка удаления нераспознанных слов
ADictionary dic = DictionaryFactory.createSingletonDictionary(config);
ISegment seg = ISegment.COMPLEX.factory.create(config, dic);
//2, Создание экземпляра TextRankKeywordsExtractor для извлечения ключевых слов
TextRankKeywordsExtractor extractor = new TextRankKeywordsExtractor(seg);
extractor.setMaxIterateNum(100); //Установка максимального количества итераций алгоритма PageRank, необязательно, можно использовать значение по умолчанию
extractor.setWindowSize(5); //Установка размера окна для вычислений TextRank, необязательно, можно использовать значение по умолчанию
extractor.setKeywordsNum(10); //Установка максимального количества возвращаемых ключевых слов, значение по умолчанию равно 10
//3, Получение ключевых слов из входящего потока чтения
String str = "Существующие методы токенизации могут быть разделены на три основные категории: методы токенизации на основе строкового совпадения, методы токенизации на основе понимания и методы токенизации на основе статистики.";
List<String> keywords = extractor.getKeywords(new StringReader(str));
```//4, вывод:
//"токенизация", "методы", "разделены", "понимание", "статистика", "строковое", "совпадение", "процесс", "категории", "основные"
org.lionsoul.jcseg.test.KeywordsExtractorTest
### 3. API для автоматического создания суммаризации/извлечения ключевых предложений с помощью Jcseg:
* 1) Конструктор `TextRankSummaryExtractor`:
```java
TextRankSummaryExtractor(ISegment seg, SentenceSeg sentenceSeg);
//seg: объект Jcseg ISegment для токенизации
//sentenceSeg: объект Jcseg SentenceSeg для разбиения предложения
//1, Создание объекта Jcseg ISegment для токенизации
SegmenterConfig config = new SegmenterConfig(true);
config.setClearStopwords(true); //Настройка фильтрации стоп-слов
config.setAppendCJKSyn(false); //Настройка отключения добавления синонимов
config.setKeepUnregWords(false); //Настройка удаления нераспознанных слов
ADictionary dic = DictionaryFactory.createSingletonDictionary(config);
ISegment seg = ISegment.COMPLEX.factory.create(config, dic);
//2, Создание объекта TextRankSummaryExtractor для автоматического суммирования текста
SummaryExtractor extractor = new TextRankSummaryExtractor(seg, new SentenceSeg());
``````java
//3, Получаем сумму текста длиной length символов из входящего потока Reader
String str = "Jcseg — это легковесный открытый китайский сегментатор, основанный на алгоритме mmseg. Он также включает в себя функции извлечения ключевых слов, ключевых фраз, ключевых предложений и автоматической суммаризации текста. Кроме того, он предоставляет интерфейсы сегментации для последних версий Lucene, Solr и Elasticsearch. Jcseg имеет встроенный файл конфигурации jcseg.properties для быстрой настройки и получения подходящих для различных случаев сегментационных приложений. Например: максимальная длина слова, активация распознавания китайских имён, добавление пиньиня, добавление синонимов и так далее!";
String summary = extractor.getSummary(new StringReader(str), 64);
```//4, вывод:
//Jcseg — это легковесный открытый китайский сегментатор, основанный на алгоритме mmseg. Он также включает в себя функции извлечения ключевых слов, ключевых фраз, ключевых предложений и автоматической суммариализации текста. Кроме того, он предоставляет интерфейсы сегментации для последних версий Lucene, Solr и Elasticsearch.
//-----------------------------------------------------------------
//5, Извлечение n ключевых предложений из входящего потока Reader
String str = "ваш исходный текст здесь";
extractor.setSentenceNum(6); //Устанавливаем количество возвращаемых ключевых предложений
List<String> keySentences = extractor.getKeySentence(new StringReader(str)); //2, Создаем экземпляр TextRankKeyphraseExtractor для извлечения ключевых фраз
TextRankKeyphraseExtractor extractor = new TextRankKeyphraseExtractor(seg);
extractor.setMaxIterateNum(100); //Устанавливаем максимальное количество итераций алгоритма PageRank, необязательно, можно использовать значение по умолчанию
extractor.setWindowSize(5); //Устанавливаем размер окна для textRank, необязательно, можно использовать значение по умолчанию
extractor.setKeywordsNum(15); //Устанавливаем максимальное количество возвращаемых ключевых слов, по умолчанию равно 10
extractor.setMaxWordsNum(4); //Устанавливаем максимальную длину ключевой фразы, по умолчанию равно 5
## Связанные приложения
### 1, Сопоставление частей речи Jcseg:Например: существительные (n), временные слова (t), географические названия (s), направления (f), числительные (m), меры (q), отличительные слова (b), местоимения (r), глаголы (v), прилагательные (a), состояния (z), наречия (d), предлоги (p), союзы (c), вспомогательные слова (u), частицы (y), восклицания (e), имитации звуков (o), пословицы (i), привычные выражения (l), сокращения (j), начальные компоненты (h), конечные компоненты (k), лексемы (g), не являющиеся лексемами знаки (x) и знаки препинания (w). Кроме того, с точки зрения применения корпуса данных, были добавлены специализированные существительные (персональные имена nr, географические названия ns, названия организаций nt, другие специализированные существительные nz).### 2. Управление синонимами Jcseg:
* 01), Единая категоризация словаря:
С версии 2.2.0 jcseg объединил все синонимы в отдельную категорию CJK_SYN. Вы можете добавить свои определения синонимов напрямую в существующий словарь синонимов vendors/lexicons/lex-synonyms.lex или создать новый словарь и указать его как CJK_SYN в первой строке.
* 02), Единый формат синонимов:
Формат: Корневое слово, синоним1[/(необязательное произношение)], синоним2[/(необязательное произношение)], ..., синонимn[/(необязательное произношение)]
Пример: Однострочное определение: исследование, обсуждение, углубленное исследование, полировка/ян мо, разработка
Множественное определение: (если корневое слово одинаково, то все определённые синонимы относятся к одному множеству) Центральный канал 1, Центральное телевидение 1, Центральный канал 1 Центральный канал 1, Центральный канал 1, Центральное телевидение 1, Центральное телевидение 1
* 03), Формат и требования:```
1. Первое слово должно быть корневым словарным словом синонимического набора; это слово обязательно должно существовать в CJK_WORD словарной базе. Если такого слова нет, то данное определение синонимов будет проигнорировано.
2. Корневое слово используется как отличительный признак между различными наборами синонимов. Если два набора синонимов имеют одно и то же корневое слово, они будут автоматически объединены в один синонимический набор.
3. В jcseg используется org.lionsoul.jcseg.SynonymsEntry для управления синонимическими наборами; каждый объект IWord имеет свойство SynonymsEntry, которое указывает на его синонимический набор.
4. SynonymsEntry.rootWord хранит корневое слово синонимического набора; рекомендуется использовать корневое слово для всех синонимов в данном наборе.
5. Исключая корневое слово, все остальные синонимы jcseg автоматически проверяет и создаёт соответствующие объекты IWord, добавляя их в CJK_WORD словарную базу. Это значит, что остальные синонимы не обязательно должны существовать в CJK_WORD словарной базе.
6. Все остальные синонимы автоматически наследуют часть речи и определение сущностей корневого слова, а также наследуют определение произношения из CJK_WORD словарной базы (если таковое существует). Также можно отдельно определить произношение после слова, добавив "/произношение".
7.
```Все объекты IWord одного синонимического набора указывают на одно и то же SynonymsEntry, то есть синонимы автоматически взаимно ссылаются друг на друга.
```### 3. Ссылки и источники:
* 1. Оригинальная статья MMSEG алгоритма: http://technology.chtsai.org/mmseg/```### 4. Технические материалы и презентации
* 1. Пример использования: [YiCloud NLU ~ понимание смысла](https://nlu.yycloud.pro), [Поиск на Gitee ~ информационный поиск](https://search.gitee.com/?skin=rec&type=repository&q=%E5%88%86%E8%AF%8D), [Kooder ~ поиск открытого кода](https://gitee.com/koode/kooder)
* 2. Блог по NLP: WeChat публичный аккаунт: lionsoul-org(Левый дух)
> Это последняя строка, спасибо за чтение!!!
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )