предисловие
У всех историй есть начало и конец.
Эта статья положит конец сходству китайских иероглифов НЛП и завершит серию.
Ци-НЛП Китайская форма рядом со словом Идеи расчета сходства
Реализация алгоритма наследования китайской формы и подобия слов, немного сделать для китайского НЛП
Чжуань-Какие китайские иероглифы самые дорогие в современном Китае?
недостаточность
Причина написания этой статьи в том, что в реализации последнего алгоритма есть некоторые недостатки.
Вавилонская башня
В Библии есть рассказы о строительстве Вавилонской башни, которое в итоге было закрыто из-за языковых проблем.
创11:6 “看哪!他们成为一样的人民,都是一样的言语,如今既作起这事来,以后他们所要作的事,就没有不成就的了。
创11:7 我们下去,在那里变乱他们的口音,使他们的言语彼此不通。”
创11:8 于是,耶和华使他们从那里分散在全地上;他们就停工不造那城了。
Чтобы избежать языковых проблем, я вначале реализовал программу сравнения, упакованную exe4j, и она работала очень гладко.
Как только маленький друг побежал, операция провалилась. Различные среды настраиваются для одной операции, и в итоге сообщается об ошибке.
Итак, я написал простую версию Python, которую легко освоить друзьям, занимающимся исследованиями в области НЛП.
java — это язык, а python — это язык.
Языки программирования могут общаться между людьми и машинами, но создают разрыв между людьми.
разделить слово
существуетКакой самый дорогой китайский иероглиф в современном Китае?В этой статье мы впервые объяснили разборку китайских иероглифов.
Одной из основных целей разделения китайских иероглифов является улучшение сравнения сходства китайских иероглифов.
Путем сравнения разделенных частей китайских иероглифов и последующего получения сходства разделенных символов точность сравнения повышается.
Разделить сходство слов
простые потребности
Чтобы облегчить понимание мелких партнеров, мы используем мышление менеджера по продукту, чтобы представить вам метод внедрения.
我的需求比较简单。
你看,【明】可以拆分【日】【月】,【冐】也可以拆分为【日】【月】。对比一下,结果是显然的。
怎么实现我不管,明天上线吧。
Ребята, вы уже должны знать, как это сделать, верно?
Используйте опыт
Как говорится в продукте, эта потребность была удовлетворена.
импорт maven
<dependency>
<groupId>com.github.houbb</groupId>
<artifactId>nlp-hanzi-similar</artifactId>
<version>1.2.0</version>
</dependency>
использовать
double rate1 = HanziSimilarHelper.similar('末', '未');
Соответствующий результат: 0,9696969696969697.
Дополнительные сведения об использовании см. по адресу с открытым исходным кодом:
напиши до конца
вовлеченные проекты
На этом расчет сходства китайских иероглифов подошёл к концу.
Основные данные и задействованные элементы:
Тезаурус структуры китайских иероглифов
Китайский радикальный тезаурус
Конечно, это также может привестиopencc4jПроводится традиционная и упрощенная обработка, которая не будет здесь распространяться.
план после
В области НЛП еще многое предстоит преодолеть, ведь китайское НЛП только началось.
Технологии пока не удались, товарищи еще потрудиться надо.
Говорят, что некий господин Хуан из Гусиного города заставил всех жаловаться.
Многие друзья сказали, что если есть программное обеспечение, которое может реализовать коммуникативную функцию [мужа месяца Ма Янюшан Вукай Рэньян], то я обязательно им воспользуюсь.
У так называемого говорящего нет намерения, а у слушателя есть намерение.
Написание коммуникационного программного обеспечения в основном предназначено для закрепления изучения netty, а остальные не важны.
Хотя я знаю, что даже если и будет, то все точно не изменятся, но старый конь все равно готов попробовать.
идеи реализации Java
Предупреждение, если у вас закончились волосы или вы не заинтересованы в выполнении.
Затем вы можете добавить в закладки + лайк + комментарий [неразборчиво], а затем уйти.
Ниже приведена скучная ссылка на реализацию кода.
ум программиста
Вот что думает программист.
Сначала нужно решить несколько задач:
(1) Реализация разделения китайских иероглифов
Это напрямую использует уже реализованную реализацию разделения китайских символов.
List<String> stringList = ChaiziHelper.chai(charWord.charAt(0));
Один и тот же китайский иероглиф можно разделить несколькими способами.Для простоты мы берем первый по умолчанию.
(2) Подобные сравнения
Предположим, мы сравниваем два китайских символа A и B, которые можно разделить на следующие подмножества.
A = {A1, A2, ..., Am}
B = {B1, B2, ..., Bm}
/**
* 获取拆分后对应的拆分字符
* @param charWord 字符
* @return 结果
*/
private char[] getSplitChars(String charWord) {
List<String> stringList = ChaiziHelper.chai(charWord.charAt(0));
// 这里应该选择哪一个是有讲究的。此处为了简单,默认选择第一个。
String string = stringList.get(0);
return string.toCharArray();
}
Есть много способов реализовать сравнение разделенного подмножества.Для простоты мы напрямую просматриваем элементы, чтобы определить, существует ли другое подмножество.
Конечно, обход должен основываться на меньшем количестве расщеплений.
int minLen = Math.min(charsOne.length, charsTwo.length);
// 比较
double totalScore = 0.0;
for(int i = 0; i < minLen; i++) {
char iChar = charsOne[i];
String textChar = iChar+"";
if(ArrayPrimitiveUtil.contains(charsTwo, iChar)) {
//累加分数
}
}
(3) Веса для разделения подмножеств
Например一
月
Оба китайских иероглифа являются подмножествами, но из-за разного количества штрихов вес также разный.
Мы рассчитываем вес по количеству штрихов в подмножестве с учетом количества штрихов во всем китайском иероглифе.
int textNumber = getNumber(textChar, similarContext);
double scoreOne = textNumber*1.0 / numberOne * 1.0;
double scoreTwo = textNumber*1.0 / numberTwo * 1.0;
totalScore += (scoreOne + scoreTwo) / 2.0;
ps: деление на 2 здесь для нормализации. Окончательный результат гарантированно будет между 0-1.
(4) Количество ходов
Чтобы получить количество ударов, мы можем напрямую использовать предыдущий метод.
Если совпадения нет, количество ходов по умолчанию равно 1.
private int getNumber(String text, IHanziSimilarContext similarContext) {
Map<String, Integer> map = similarContext.bihuashuData().dataMap();
Integer number = map.get(text);
if(number == null) {
return 1;
}
return number;
}
Полная реализация Java
Сшиваем все кусочки вместе и получаем полную реализацию.
/**
* 拆字
*
* @author 老马啸西风
* @since 1.0.0
*/
public class ChaiziSimilar implements IHanziSimilar {
@Override
public double similar(IHanziSimilarContext similarContext) {
String hanziOne = similarContext.charOne();
String hanziTwo = similarContext.charTwo();
int numberOne = getNumber(hanziOne, similarContext);
int numberTwo = getNumber(hanziTwo, similarContext);
// 拆分
char[] charsOne = getSplitChars(hanziOne);
char[] charsTwo = getSplitChars(hanziTwo);
int minLen = Math.min(charsOne.length, charsTwo.length);
// 比较
double totalScore = 0.0;
for(int i = 0; i < minLen; i++) {
char iChar = charsOne[i];
String textChar = iChar+"";
if(ArrayPrimitiveUtil.contains(charsTwo, iChar)) {
int textNumber = getNumber(textChar, similarContext);
double scoreOne = textNumber*1.0 / numberOne * 1.0;
double scoreTwo = textNumber*1.0 / numberTwo * 1.0;
totalScore += (scoreOne + scoreTwo) / 2.0;
}
}
return totalScore * similarContext.chaiziRate();
}
/**
* 获取拆分后对应的拆分字符
* @param charWord 字符
* @return 结果
*/
private char[] getSplitChars(String charWord) {
List<String> stringList = ChaiziHelper.chai(charWord.charAt(0));
// 这里应该选择哪一个是有讲究的。此处为了简单,默认选择第一个。
String string = stringList.get(0);
return string.toCharArray();
}
/**
* 获取笔画数
* @param text 文本
* @param similarContext 上下文
* @return 结果
*/
private int getNumber(String text, IHanziSimilarContext similarContext) {
Map<String, Integer> map = similarContext.bihuashuData().dataMap();
Integer number = map.get(text);
if(number == null) {
return 1;
}
return number;
}
}
резюме
В этой статье представлено разделение китайских иероглифов, которое еще больше обогащает понимание сходства.
Конечно, в самой реализации еще есть много областей, которые стоит улучшить, например, выбор после разделения, возможность рекурсивного разделения и т. д. Это оставлено для будущих исследований.
Я старая лошадь, и я с нетерпением жду встречи с вами в следующий раз.