【Python自然言語処理+tkinterグラフィカルインターフェース】インテリジェント医療接客Q&Aロボットの実戦を実現(ソースコード、データセット、超詳細デモ付)

ソースコードとデータセットが必要な場合は、コレクションを気に入ってフォローし、コメント領域にプライベートメッセージを残してください~~~

1.Q&Aスマートカスタマーサービスのご紹介

QA Q&A とは Question-and-Answer の略で、利用者からの質問に対して回答を取り出し、利用者が理解できる自然言語で回答します。

アプリケーション ドメインの観点から、質問応答システムは、限定ドメインの質問応答システムとオープン ドメインの質問応答システムに分けることができます。

質問応答システムが回答を生成するのをサポートする文書ベース、知識ベース、および技術分類に従って、自然言語データベース質問応答システム、会話型質問応答システム、読解システム、共通質問に基づく質問応答システムに分けることができます。セット、ナレッジベースベースのシステム、質問応答システムなど。

スマート Q&A カスタマー サービスの機能アーキテクチャ

典型的な質問応答システムは, 質問入力, 質問理解, 情報検索, 情報抽出, 回答ソート, 回答生成, 結果出力を含む. まず, ユーザーが質問をし, 検索操作は知識ベースに問い合わせて関連情報を取得し,特定のルールに従って、抽出された情報から情報を抽出します. 対応する回答候補の固有ベクトルを抽出し、最終的に回答候補の結果をフィルタリングしてユーザーに出力します. 

 インテリジェントな質問応答カスタマー サービス フレームワーク

1:問題処理問題処理プロセスは、問題に含まれる情報を識別し、問題の話題情報と話題カテゴリ(一般的なカテゴリに属する​​か、特定のトピックカテゴリに属する​​かなど)を判断し、問題に関連するキー情報を抽出します。キャラクター情報、場所、時間情報などのトピック。

2:質問マッピング ユーザーから寄せられた質問をもとに、曖昧さを解消する質問マッピングを行います。文字列類似性マッチングやシノニム テーブルなどによってマッピングの問題を解決し、必要に応じて分割およびマージ操作を実行します。

3: クエリ構築は、入力された質問を処理することでコンピュータが理解できるクエリ言語に質問を変換し、ナレッジ グラフまたはデータベースにクエリを実行し、対応する代替回答を検索によって取得します。

4:質問の属性に基づいて知識推論を行う質問の基本属性がナレッジグラフやデータベースで既知の定義情報に属している場合、ナレッジグラフやデータベースから検索して回答を返すことができる直接。質問属性が未定義の質問である場合、マシン アルゴリズムの推論を通じて回答を生成する必要があります。

5:曖昧さ回避ソートナレッジグラフ内のクエリによって返された1つ以上の代替回答に従って、質問属性と組み合わせて、曖昧さ回避処理と優先順位付けを行い、最良の回答を出力します。

2. スマートメディカル接客Q&A実践

カスタマイズされたインテリジェントな顧客サービス プログラムでは、通常、コーパスを選択し、ノイズ情報を削除し、アルゴリズムに従って予測をトレーニングし、最終的にヒューマン マシン インターフェイスの質疑応答ダイアログを提供する必要があります. インターネットから取得した医療コーパスに基づいて、基本的な余弦類似性の原則、以下の質問と回答の設計と開発 インテリジェント医療顧客サービス アプリケーション

プロジェクトの構造は次のとおりです。 

結果を示す 

以下は、csv ファイルで定義されたいくつかのケースです。

定義済みのウェルカム センテンス 

 

 

chatrobot ファイルを実行すると、次のウィンドウがポップアップして質問が出力されます。次に、[Submit Consultation] をクリックします。  

 

コーパスにない質問への回答を自動的に推測する (多くの場合、精度が低くなります) 

 

 

 3. コード

コードの一部は次のとおりです すべてのコードとデータセットは、コレクションを気に入ってフォローし、コメント領域にプライベートメッセージを残してください

# -*- coding:utf-8 -*-
from fuzzywuzzy import fuzz
import sys
import jieba
import csv
import pickle
print(sys.getdefaultencoding())

import logging
from fuzzywuzzy import fuzz
import math
from scipy import sparse
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer
from scipy.sparse import lil_matrix
from sklearn.naive_bayes import MultinomialNB
import warnings
from tkinter import *
import time
import difflib
from collections import Counter
import numpy as np


filename = 'label.csv'

def tokenization(filename):


    corpus = []
    label = []
    question = []
    answer = []
    with open(filename, 'r', encoding="utf-8") as f:
        data_corpus = csv.reader(f)
        next(data_corpus)
        for words in data_corpus:
            word = jieba.cut(words[1])
            tmp = ''
            for x in word:
                tmp += x
            corpus.append(tmp)
            question.append(words[1])
            label.append(words[0])
            answer.append(words[2])
    
    with open('corpus.h5','wb') as f:
        pickle.dump(corpus,f)
    with open('label.h5','wb') as f:
        pickle.dump(label,f)
    with open('question.h5', 'wb') as f:
        pickle.dump(question, f)
    with open('answer.h5', 'wb') as f:
        pickle.dump(answer, f)

    return corpus,label,question,answer



def train_model():

    with open('corpus.h5','rb') as f_corpus:
        corpus = pickle.load(f_corpus)

    with open('label.h5','rb') as f_label:
        label = pickle.load(f_label,encoding='bytes')


    vectorizer = CountVectorizer(min_df=1)
    transformer = TfidfTransformer()
    tfidf = transformer.fit_transform(vectorizer.fit_transform(corpus))
    words_frequency = vectorizer.fit_transform(corpus)
    word = vectorizer.get_feature_names()
    saved = tfidf_calculate(vectorizer.vocabulary_,sparse.csc_matrix(words_frequency),len(corpus))
    model = MultinomialNB()
    model.fit(tfidf,label)


    with open('model.h5','wb') as f_model:
        pickle.dump(model,f_model)

    with open('idf.h5','wb') as f_idf:
        pickle.dump(saved,f_idf)

    return model,tfidf,label
    
    
    
    
class tfidf_calculate(object):
    def __init__(self,feature_index,frequency,docs):
        self.feature_index = feature_index
        self.frequency = frequency
        self.docs = docs
        self.len = len(feature_index)

    def key_count(self,input_words):
        keys = jieba.cut(input_words)
        count = {}
        for key in keys:
            num = count.get(key, 0)
            count[key] = num + 1
        return count

    def getTfidf(self,input_words):
        count = self.key_count(input_words)
        result = lil_matrix((1, self.len))
        frequency = sparse.csc_matrix(self.frequency)
        for x in count:
            word = self.feature_index.get(x)
            if word != None and word>=0:
                word_frequency = frequency.getcol(word)
                feature_docs = word_frequency.sum()
                tfidf = count.get(x) * (math.log((self.docs+1) / (feature_docs+1))+1)
                result[0, word] = tfidf
        return result    

if __name__=="__main__":
    tokenization(filename)
    train_model()

作るのは簡単ではありませんが、参考にしてください。いいね、フォロー、収集してください~~~

おすすめ

転載: blog.csdn.net/jiebaoshayebuhui/article/details/128199100