huaban/jieba-anaанализ — наиболее часто используемый инструмент сегментации слов в версии Java. Github предоставляет подробное описание того, как его использовать.
Однако существует несколько онлайн-руководств о том, как использовать сегментацию слов jieba для извлечения собственного словаря и упаковки собственных функций интерфейса в пакет jar.
В этой статье в основном рассказывается, как использовать сегментацию слов jieba в Java, как использовать свой собственный словарь при сегментации слов jieba, а также о проблемах и решениях, с которыми можно столкнуться в процессе предоставления пакетов jar.
Нам не нужно самостоятельно создавать Java-версию колеса сегментации слов jieba, используйте инструмент jieba-analysi с открытым исходным кодом ~
Добавьте зависимости в pom-файл:
<dependencies>
<dependency>
<groupId>com.huaban</groupId>
<artifactId>jieba-analysis</artifactId>
<version>1.0.2</version>
</dependency>
</dependencies>
Также относительно просто использовать
import com.huaban.analysis.jieba.JiebaSegmenter;
import com.huaban.analysis.jieba.WordDictionary;
JiebaSegmenter segmenter;
segmenter = new JiebaSegmenter();
List result = segmenter.sentenceProcess(info_str);
Приведенный выше код может сегментировать строку info_str~
Иногда у нас есть особые потребности и мы не хотим использовать словарь по умолчанию, а хотим использовать собственный словарь dict.txt.
Ловушка началась. Большинство методов в Интернете таковы:
Поместите словарь dict.txt в папку ресурсов, затем получите путь к ресурсу через this.getClass().getResource("/dict.txt") и напрямую используйте интерфейс loadUserDict для загрузки словаря.
URL file_path = this.getClass().getResource("/dict.txt");
Path path = Paths.get(new File(this.getClass().getResource("").getPath() + "/dict.txt").getAbsolutePath());
WordDictionary.getInstance().loadUserDict(path);
При локальном запуске приведенного выше кода проблем нет, но они появятся, когда мы соберем jar-пакет на третьем этапе.
’the return value of "java.lang.ClassLoader.getResource(String)" is null 'ошибка
或者file not foundошибка
或者user dict load failureошибка
Оставляя в стороне вопрос загрузки словарей в библиотеку jieba, если мы хотим загрузить текстовые ресурсы в Java, мы обычно используем следующий метод:
String filePath = this.getClass().getClassLoader().getResource("dict.txt").getPath();
try (BufferedReader br = new BufferedReader(newFileReader(filePath))) {
String line;
while ((line = br.readLine()) != null) {
txt_list.add(line);
}
} catch (IOException e) {
e.printStackTrace();
}
Однако после сборки пакета jar использование java -jar для проверки приведет к ошибке, связанной с невозможностью найти ресурс dict.txt.
Решение:
Необходимо использовать InputStream is= this.getClass().getResourceAsStream("/dict.txt")
List tag_list = new ArrayList<>();
try (InputStream is= this.getClass().getResourceAsStream("/dict.txt")){
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String line;
while ((line = br.readLine()) != null) {
tag_list.add(line);
}
} catch (IOException e) {
e.printStackTrace();
}
Возвращаясь к проблеме сегментации слов jieba и загрузки локального тезауруса, мы также не можем использовать метод getResource напрямую, но надеемся использовать решение getResourceAsStream.
Что делать? Перегрузить пользовательский интерфейс? Нет, когда мы заходим в класс WordDictionary, мы можем обнаружить, что автор уже решил за нас эту проблему.
Давайте посмотрим на исходный код loadDict:
public void loadDict() {
this._dict = new DictSegment('\u0000');
InputStream is = this.getClass().getResourceAsStream("/dict.txt");
try {
BufferedReader br = new BufferedReader(new InputStreamReader(is, Charset.forName("UTF-8")));
long s = System.currentTimeMillis();
Итак, нам просто нужно изменить интерфейс
WordDictionary.getInstance().loadDict();
Следует отметить, что пользовательский словарь должен называться dict.txt, а каждая строка должна быть в формате частотной части речи.
Если в вашем словаре есть только слова, также возникнет проблема некорректной загрузки.
После того, как проект был портирован с платформы Mac для победы, произошла ошибка
Java: предупреждение: для исходной версии 9 требуется целевая версия 9
Если конфигурация Java отличается, просто измените ее, измените 9 на 8.
<configuratio>
<source> 8 </source>
<target> 8 </target>
</configuration>
Такая же проблема возникает после пересадки платформы. На Mac логика отображается нормально, а на Win логика неправильная.
При распечатке прочитанных строк все строки искажаются, но библиотека заиканий может отображать их нормально.
Очевидно, это проблема с кодировкой. Я уже упоминал о проблеме с кодировкой.
Решение:
Просто обратитесь к исходному коду и добавьте формат кодировки.
BufferedReader br = new BufferedReader(new InputStreamReader(is, Charset.forName("UTF-8")));
Если возникла проблема с отсутствием основного атрибута манифеста при создании пакета jar
Добавьте в pom.xml
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<includeSystemScope>true</includeSystemScope>
</configuration>
<version>2.0.1.RELEASE</version>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
После завершения вышеуказанной работы и использования java -jar xxx.jar для проверки работоспособности вашего интерфейса вы можете опубликовать свой jar-пакет~