def main(): markov = Markov() sep = r'[。??!! ]+' filename = sys.argv[1] dicfile = '{}.dat'.format(filename) if os.path.exists(dicfile): markov.load(dicfile) else: with open(filename, encoding='utf-8') as f: sentences = [] for line in f: sentences.extend(re.split(sep, line.strip())) for sentence in tqdm.tqdm(sentences): if sentence: markov.add_sentence(analyze(sentence)) # print('.', end='') # sys.stdout.flush() markov.save(dicfile) print('\n') while True: line = input('> ') if not line: break parts = analyze(line) keyword = next((word for word, part in parts if is_keyword(part)), '') print(markov.generate(keyword))
def study_pattern(self, text, parts): """ユーザーの発言textを、形態素partsに基づいてパターン辞書に保存する。""" for word, part in parts: if not is_keyword( part ) or word != 'ルン' or word != '♪' or word != '♥': # 品詞が名詞でなければ学習しない continue # 単語の重複チェック # 同じ単語で登録されていれば、パターンを追加する # 無ければ新しいパターンを作成する duplicated = self._find_duplicated_pattern(word) if duplicated and text not in duplicated['phrases']: duplicated['phrases'].append(text) else: self._pattern.append({'pattern': word, 'phrases': [text]})
def study_template(self, parts): """形態素のリストpartsを受け取り、 #名詞のみ'%noun%'に変更した文字列templateをself._templateに追加する。 #名詞が存在しなかった場合、または同じtemplateが存在する場合は何もしない。 """ template = '' count = 0 for word, part in parts: if is_keyword( part) and word != 'ルン' and word != '♪' and word != '♥': word = '%noun%' count += 1 template += word if count > 0 and template not in self._template[count]: self._template[count].append(template)
def response(self, _, parts): """形態素解析結果partsに基づいてテンプレートを選択・生成して返す。""" keywords = [word for word, part in parts if is_keyword(part)] try: keywords.remove('ルン') except ValueError: pass try: keywords.remove('♥') except ValueError: pass try: keywords.remove('♪') except ValueError: pass count = len(keywords) if count > 0: if count in self._dictionary.template: template = choice(self._dictionary.template[count]) for keyword in keywords: template = template.replace('%noun%', keyword, 1) return template return choice(self._dictionary.random)
def response(self, _, parts): """形態素のリストpartsからキーワードを選択し、それに基づく文章を生成して返す。 キーワードに該当するものがなかった場合はランダム辞書から返す。""" keyword = next((w for w, p in parts if is_keyword(p)), '') response = self._dictionary.markov.generate(keyword) return response if response else choice(self._dictionary.random)