Example #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(morph.analyze(sentence))
                print('.', end='')
                sys.stdout.flush()
        markov.save(dicfile)
    print('\n')

    while True:
        line = input('> ')
        if not line:
            break
        parts = morph.analyze(line)
        keyword = next(
            (word for word, part in parts if morph.is_keyword(part)), '')
        print(markov.generate(keyword))
Example #2
0
 def response(self, _, parts):
     """形態素解析のリストpartsからキーワードを選択し,それに基づく文章を生成して返す
     キーワードに該当するものがなかった場合はランダム辞書から返す
     """
     keyword = next((x for x, p in parts if morph.is_keyword(p)), '')
     response = self._dictionary.markov.generate(keyword)
     return response if response else choice(self._dictionary.random)
Example #3
0
 def response(self, _, parts):
     keywords = [word for word, part in parts if morph.is_keyword(part)]
     count = len(keywords)
     if 0 < count:
         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)
Example #4
0
    def study_template(self, parts):
        template = ''
        count = 0
        for word, part in parts:
            if morph.is_keyword(part):
                word = '%noun%'
                count += 1
            template += word

            if count > 0 and template not in self._template[count]:
                self._template[count].append(template)
Example #5
0
 def study_pattern(self, text, parts):
     """ユーザーの発言textを、形態素partsに基づいてパターン辞書に保存する。"""
     for word, part in parts:
         if morph.is_keyword(part):
             duplicated = next(
                 (p for p in self._pattern if p['pattern'] == word), None)
             if duplicated:
                 if not text in duplicated['phrases']:
                     duplicated['phrases'].append(text)
             else:
                 self._pattern.append({'pattern': word, 'phrases': [text]})
Example #6
0
 def response(self, parts):
     """形態素解析結果partsに基づいてテンプレートを選択・生成して返す。"""
     keywords = [word for word, part in parts if is_keyword(part)]
     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 study_pattern(self, text, parts):
        """ユーザーの発言textを、形態素partsに基づいてパターン辞書に保存する。"""
        for word, part in parts:
            if not is_keyword(part):  # 品詞が名詞でなければ学習しない
                continue

            # 単語の重複チェック
            # 同じ単語で登録されていれば、パターンを追加する
            # 無ければ新しいパターンを作成する
            duplicated = self._find_duplicated_pattern(word)
            if duplicated and text not in duplicated['phrases']:
                duplicated['phrases'].append(text)
                self._pattern.append({'pattern': word, 'phrases': [text]})
Example #8
0
 def study_pattern(self, text, parts):
     """ユーザーの発言textを,形態素partsに基づいてパターン辞書に保存する."""
     for word, part in parts:
         if not is_keyword(part):  # 品詞が名詞でなければ学習しない
             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]})
Example #9
0
 def study_pattern(self, text, parts):
     """ユーザーの発言textを、形態素partsに基づいてパターン辞書に保存する。"""
     for word, part in parts:
         if morph.is_keyword(part):  # 品詞が名詞であれば学習
             # 単語の重複チェック
             # 同じ単語で登録されていれば、パターンを追加する
             # 無ければ新しいパターンを作成する
             duplicated = next(
                 (p for p in self._pattern if p['pattern'] == word), None)
             if duplicated:
                 if not text in duplicated['phrases']:
                     duplicated['phrases'].append(text)
             else:
                 self._pattern.append({'pattern': word, 'phrases': [text]})
Example #10
0
    def study_template(self, parts):
        """形態素のリストpartsを受け取り、
        名詞のみ'%noun%'に変更した文字列templateをself._templateに追加する。
        名詞が存在しなかった場合、または同じtemplateが存在する場合は何もしない。
        """
        template = ''
        count = 0
        for word, part in parts:
            if morph.is_keyword(part):
                word = '%noun%'
                count += 1
            template += word

        if count > 0 and template not in self._template[count]:
            self._template[count].append(template)
Example #11
0
def markov_twitter(filename):
    markov = Markov()
    sep = r'[.??!!  ]+'
    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(morph.analyze(sentence))
        markov.save(dicfile)
    print('\n')

    line = '*'
    parts = morph.analyze(line)
    keyword = next((word for word, part in parts if morph.is_keyword(part)),
                   '')
    return markov.generate(keyword)
Example #12
0
 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)
Example #13
0
 def response(self, parts):
     markov = Markov()
     keyword = next((w for w, p in parts if is_keyword(p)), '')
     response = markov.generate(keyword)
     return response
Example #14
0
 def response(self, _, parts):
     """形態素のリストpartsからキーワードを選択肢、それに基づく文章を生成してかえす
     キーワードに該当するものがなければランダム辞書から返す"""
     keyword = next((w for w, p in parts if morph.is_keyword(p)), '')
     responce = self._dictionary.markov.generate(keyword)
     return responce if responce else choice(self._dictionary.random)