为什么要使用自然语言呢,因为在项目中客户要求根据ai对话,来筛选出想要的数据,比如当用户说我想要吃烧烤,这时使用自然语言来把用户的语句分段,分成[我想,要,吃,烧烤],这时在根据mysql已有的数据,来筛选出关于烧烤的商家。
我使用了很多前端自然语言库,比如node-nlp,node-hanlp。
1.node-nlp库似乎只支持英文和一些发达国家,唯独不支持中文。这里如果大家对语言没有要求,一定要注意marager.train执行的时机,我一开始试了好多次,搞不懂为什么一直返回的是空,原因就是:模型没有训练完(也就是manager.addDocument没有执行完)。
// 创建 NLP 管理器实例
const manager = new NlpManager({ languages: ['en'] });
// 训练 NLP 模型
manager.addDocument('en', 'hello', 'my name is sunhe');
manager.addDocument('en', 'money', 'this is $14');
// 创建一个接口来处理聊天请求
app.post('/chat',async (req, res) => {
// 训练模型
await manager.train();
manager.save();
const { text } = req.body;
console.log(text);
const response =await manager.process('en', text);
res.json({ reply: response });
});
2.node-hanlp库,这个库我也搞不懂为什么要安装java环境才能运行,但是我安装完了之后各种报错
const Hanlp = require("node-hanlp");
// 分词库初始化及配置
const HanLP = new Hanlp({
properties: "/root/hanlp/hanlp.properties", // 配置文件绝对路径
CustomDict: true, // 使用自定义词典
NameRecognize: true, // 中国人名识别
TranslatedNameRecognize: true, // 音译人名识别
JapaneseNameRecognize: true, // 日本人名识别
PlaceRecognize: true, // 地名识别
OrgRecognize: true // 机构名识别
});
let words = HanLP.Tokenizer("商品和服务");
console.log(words);
## 报错信息
Cannot find module '../build/jvm_dll_path.json'
最后我使用了python+spacy解决了这个问题
- 安装spacy
pip install spacy
- 下载语言模型
python -m spacy download zh_core_web_sm # 下载小型模型
python -m spacy download zh_core_web_md # 下载中型模型
python -m spacy download zh_core_web_lg # 下载大型模型
- 示例代码:
import spacy
nlp = spacy.load('zh_core_web_sm') # 加载小型中文模型
text = "自然语言处理是人工智能领域的一个重要方向。"
doc = nlp(text)
for token in doc:
print(token.text, token.lemma_, token.pos_, token.dep_)
打印的数据:
这里我搭配和我的项目来写的,通过spacy中文模型来筛选小皮面板的mysql数据库中merchant表中的商家类型,比如merchant表中有的商家名字是小孙烧烤,老王烧烤,孙鹤卖花,我想通过用户输入烧烤,来筛选出来关于烧烤的一些商家。并且把筛选出来的数据打印出来。
import spacy
import mysql.connector
# 加载 spaCy 中文模型
nlp = spacy.load('zh_core_web_sm')
# 连接到 MySQL 数据库
db = mysql.connector.connect(
host="localhost",
user="root",
password="root",
database="order_meal"
)
cursor = db.cursor()
# 用户输入的关键词
user_input = "我想吃烧烤"
# 使用 spaCy 处理用户输入
doc = nlp(user_input)
# 提取所有名词作为可能的关键词
keywords = [token.text for token in doc if token.pos_ == 'NOUN']
print(keywords)
# 准备查询语句
query = "SELECT * FROM merchant WHERE name LIKE %s"
# 构建包含所有关键词的查询参数
params = ('%' + '% '.join(keywords) + '%',)
# 执行查询
cursor.execute(query, params)
# 读取所有结果
results = cursor.fetchall()
for result in results:
print(result)
# 现在可以安全地关闭游标和数据库连接
cursor.close()
db.close()
打印的数据