著者:岩本 和真
人間の言語をコンピュータで処理する自然言語処理の分野は、近年、急速に進歩しています。それによって例えば、自然な翻訳や文章生成をする技術などが開発されています。同分野の学習成果として筆者は、「秘書チャット」と名付けたチャットボットアプリを作成しました。今回は、このアプリに盛り込んだ機能について、技術的に解説します。
シェルスクリプトマガジン Vol.79は以下のリンク先でご購入できます。
図5 形態素解析処理をするmorpheme()関数の定義コード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
def morpheme(self, input, speech=False): input=unicodedata.normalize('NFKC', input) if speech: speech_list = [] sentence = self.wakati.parse(input).split() node = self.wakati.parseToNode(input) while node: if node.feature.split(",")[0] != "BOS/EOS": speech_list.append(node.feature.split(",")[0]) node = node.next return sentence, speech_list else: sentence = self.wakati.parse(input).split() return sentence |
図8 予定の内容を抽出するcontent_extract()関数の定義コード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
def content_extract(self, input_list, speech_list): out_list = [] ban_word = ["覚え", "記憶"] pass_word = ["予定", "こと"] for i, input in enumerate(input_list): if input in ban_word: break elif input in pass_word: continue elif input.isdecimal() and \ input_list[i+1] in self.date_key: continue elif (input_list[i-1]).isdecimal() and \ input in self.date_key: continue elif out_list != [] and speech_list[i-1] == "名詞" and \ speech_list[i+1] == "名詞" and \ input_list[i+1] not in pass_word: out_list.append(input_list[i]) elif speech_list[i] == "名詞": out_list.append(input) else: continue return ''.join(out_list) |
図9 Webページのテキスト情報を抽出するscraping()関数の定義コード
1 2 3 4 5 6 7 8 9 10 11 12 |
from bs4 import BeautifulSoup import requests def scraping(url, file_path): responses = requests.get(url) soup = BeautifulSoup(responses.content, 'html.parser') text_list = soup.get_text().splitlines() text_list = list(set(text_list)) text_list = [text.replace('\u3000', '') for text in text_list] text = '\n'.join(text_list) with open(file_path, 'w', encoding='utf_8') as f: f.write(text) |
図12 曜日や豆知識を答える機能のコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
def week_teach(self, input): year = None month = None day = None input = self.date_update.convert(input) input_list = self.morpheme(input) if "年" in input_list: year = self.date_specify("年", input_list) else: year = self.year if "月" in input_list: month = self.date_specify("月", input_list) else: month = self.month day = self.date_specify("日", input_list) d_key = dt.date(year, month, day) week_key = d_key.weekday() return year, month, day, self.week_list[week_key] def knowledge_teach(self): file_path = "text_data/min_kl.txt" with open(file_path, 'r', encoding='UTF-8') as f: knowledge_data = f.readlines() knowledge = random.choice(knowledge_data) return knowledge |