コード例 #1
0
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))
コード例 #2
0
    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]})
コード例 #3
0
    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)
コード例 #4
0
ファイル: responder.py プロジェクト: TAT527/stp-line-projectl
 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)
コード例 #5
0
ファイル: responder.py プロジェクト: TAT527/stp-line-projectl
 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)