class KnpService(object): MARK_EOS = "EOS" def __init__(self): self.__knp = KNP() def parse(self, string): formatted_string = JumanKnpUtil.format_input_string(string) return self.__knp.parse(formatted_string) def parse_all(self, strings): return [self.parse(string) for string in strings.split("\n")] def result(self, string_iterator): results = [] data = "" for line in string_iterator: data += line if line.strip() == KnpService.MARK_EOS: results.append(self.__knp.result(data)) data = "" return results def load_with_handler(self, string_iterator, handler): data = "" for line in string_iterator: data += line if line.strip() == KnpService.MARK_EOS: # 応急処置 (出力がまともに出ていない or 文が長すぎるなどが原因で格解析ができなくて構文解析だけが行われた場合をスキップ) if not (JumanKnpUtil.is_match_partly(r"\n\* \d+ ", data) ) and not (JumanKnpUtil.is_match_partly( r"Fell back to", data)): handler(self.__knp.result(data)) data = "" return def load_from_file_with_handler(self, filepath, handler): with open(filepath, "r") as f: results = self.load_with_handler(iter(f.readline, ""), handler) return results def load_from_file(self, filepath): with open(filepath, "r") as f: results = self.result(iter(f.readline, "")) return results
def load_knp_from_stream(f, juman_format=JUMAN_FORMAT.DEFAULT): """ KNPフォーマットの解析結果ファイルを解釈し、文節列オブジェクトを返す Args: f (file): KNPフォーマットの解析結果のファイルオブジェクト juman_format (JUMAN_FORMAT): Jumanのlattice出力形式 Yields: BList: 文節列オブジェクト """ knp = KNP() buf = "" for line in f: buf += line if line.startswith("EOS"): yield knp.result(buf, juman_format=juman_format) buf = ""
def read_knp_result_file(filename: str) -> List[BList]: """Read a KNP result file. Args: filename: A filename. Returns: A list of :class:`pyknp.knp.blist.BList` objects. """ knp = KNP() blists = [] with open(filename, "rt", encoding="utf-8", errors="replace") as f: chunk = "" for line in f: chunk += line if line.strip() == "EOS": blists.append(knp.result(chunk)) chunk = "" return blists
def get_context_words(self, sentence_size_limit=100): knp = KNP() knp_extractor = KNP_extractor(self.config.knp_index_db, self.config.knp_parent_dir, self.config.knp_sub_index_length) context_words = Counter() for index, sent_tuple in enumerate(self.sents[:sentence_size_limit]): sid = sent_tuple.sid.split('%')[0] sup_knp = knp_extractor.get_knp(sid) if not sup_knp: sys.stderr.write("fail to convert knp of %s.\n" % sid) continue try: result = knp.result(sup_knp.decode('utf-8')) context_words.update(self._get_sentence_args(result)) except: sys.stderr.write("fail to convert knp of %s.\n" % sid) context_words = dict(context_words) return context_words
def evg(): parser = argparse.ArgumentParser() parser.add_argument("--output", "-o", default="", help="path to output") args = parser.parse_args() basicConfig(format="%(asctime)s - %(name)s - %(levelname)s - %(message)s") knp = KNP() results = [] chunk = "" for line in codecs.getreader("utf-8")(getattr(sys.stdin, "buffer", sys.stdin)): chunk += line if line.strip() == "EOS": results.append(knp.result(chunk)) chunk = "" evg_ = EventGraph.build(results) if args.output: evg_.save(args.output) else: print(json.dumps(evg_.to_dict(), indent=4, ensure_ascii=False))
def test(): # ex.)echo "私は自然言語処理の研究をする" | juman | knp -tab -dpnd | python DependencyParser.py import codecs sys.stdin = codecs.getreader('UTF-8')(sys.stdin) sys.stdout = codecs.getwriter('UTF-8')(sys.stdout) sys.stderr = codecs.getwriter('UTF-8')(sys.stderr) knp = KNP() data = u"" for line in iter(sys.stdin.readline, ""): data += line if line.strip() == u"EOS": result = knp.result(data) DB = parseDependency(result.bnst_list(), head=False) DBhead = parseDependency(result.bnst_list(), head=True) print "parent-child" # for bnstrep in DB: # print bnstrep for bnstrep in DBhead: print bnstrep data = u""
from pyknp import KNP import sys knp = KNP(jumanpp=True) data = "" for line in iter(sys.stdin.readline, ""): data += line if line.strip() == "EOS": result = knp.result(data) for bnst in result.bnst_list(): meisi = False setubiji = False for mrph in bnst.mrph_list(): if mrph.hinsi == "名詞": meisi = True if mrph.hinsi == "接尾辞": setubiji = True if meisi and setubiji: print("".join(mrph.midasi for mrph in bnst.mrph_list())) break data = ""
class Solver(object): def __init__(self): self.juman = Juman() self.knp = KNP() def Q61(self): u"""61. 文を標準入力から読み込み、それを単語単位に分かち書きせよ (形態素間にスペースを挿入) """ input_sentence = raw_input() result = self.juman.analysis(input_sentence.decode("utf8")) for mrph in result.mrph_list(): sys.stdout.write("{} ".format(mrph.midasi.encode("utf8"))) sys.stdout.write("\n") return def Q62(self): u"""62. 形態素解析結果を読み込み、名詞だけを抽出してプリントせよ ヒント: mrph.hinsi が u"名詞" という文字列と一致するかどうかを判定 """ data = u"" for line in iter(sys.stdin.readline, ""): # 入力文を1行ずつ読む data += line.decode("utf8") if line.strip() == "EOS": # 1文が終わったら解析 result = self.juman.result(data) s = ",".join(mrph.midasi for mrph in result.mrph_list() if mrph.hinsi == u"名詞") # 名詞だけ表示 if len(s) > 0: print(s) data = u"" def Q63(self): u"""62. 形態素解析結果を読み込み、名詞だけを抽出してプリントせよ ヒント: mrph.hinsi が u"名詞" という文字列と一致するかどうかを判定 """ data = u"" for line in iter(sys.stdin.readline, ""): # 入力文を1行ずつ読む data += line.decode("utf8") if line.strip() == "EOS": # 1文が終わったら解析 result = self.juman.result(data) s = ",".join(mrph.genkei for mrph in result.mrph_list() if mrph.hinsi == u"動詞") # 動詞だけ表示 if len(s) > 0: print(s) data = u"" def Q64(self): u"""64. 形態素解析結果を読み込み、形態素の原形を頻度順に並べよ ヒント: ディクショナリ、sorted 関数を使う """ data = u"" hist = {} for line in iter(sys.stdin.readline, ""): # 入力文を1行ずつ読む data += line.decode("utf8") if line.strip() == "EOS": # 1文が終わったら解析 result = self.juman.result(data) for mrph in result.mrph_list(): try: hist[mrph.genkei] += 1 except KeyError: hist[mrph.genkei] = 1 data = u"" for key, val in sorted(hist.items(), key=lambda t: t[1], reverse=True): print("{},{}".format(key.encode("utf8"), val)) def Q65(self): u"""65. 形態素解析結果を読み込み、全形態素数 (総数) に対する述語の割合を計算せよ ここで、述語とは、動詞、イ形容詞 (形容詞)、ナ形容詞 (形容動詞) とする """ data = u"" num = 0 denom = 0 for line in iter(sys.stdin.readline, ""): # 入力文を1行ずつ読む data += line.decode("utf8") if line.strip() == "EOS": # 1文が終わったら解析 result = self.juman.result(data) if verbose: logger.info("denom: {}".format(denom)) for mrph in result.mrph_list(): denom += 1 if mrph.hinsi == u"動詞": num += 1 continue if mrph.hinsi == u"形容詞" and mrph.bunrui.startswith(u"イ形容詞"): num += 1 continue if mrph.hinsi == u"形容動詞" and mrph.bunrui.startswith(u"ナ形容詞"): num += 1 continue data = u"" print("{}/{}={}".format(num, denom, float(num) / denom)) def Q66(self): u"""66. 形態素解析結果を読み込み、「サ変名詞+する/できる」というパターンを抽出しプリントせよ """ data = u"" extract = set() for line in iter(sys.stdin.readline, ""): # 入力文を1行ずつ読む data += line.decode("utf8") if line.strip() == "EOS": # 1文が終わったら解析 result = self.juman.result(data) buff = None for mrph in result.mrph_list(): if mrph.genkei == u"できる" or mrph.genkei == u"する": if buff is not None: extract.add((buff.genkei.encode("utf8"), mrph.genkei.encode("utf8"))) if mrph.bunrui == u"サ変名詞": buff = mrph else: buff = None data = u"" for t in extract: print("{}+{}".format(t[0], t[1])) def Q67(self): u"""67. 形態素解析結果を読み込み、「AのB」という表現 (A と B は名詞の1形態素) をすべてプリントせよ """ data = u"" extract = set() for line in iter(sys.stdin.readline, ""): # 入力文を1行ずつ読む data += line.decode("utf8") if line.strip() == "EOS": # 1文が終わったら解析 result = self.juman.result(data) buff = [] for mrph in result.mrph_list(): if mrph.genkei == u"の" and len(buff) == 1: buff.append(u"の") continue if mrph.hinsi == u"名詞": if len(buff) == 0: buff.append(mrph.genkei) continue if len(buff) == 2: extract.add((buff[0], mrph.genkei)) buff = [] data = u"" for t in extract: print("{}の{}".format(t[0].encode("utf8"), t[1].encode("utf8"))) def Q68(self): u"""68. 文を標準入力から読み込み、それを文節単位に分かち書きせよ (文節間にスペースを挿入) """ input_sentence = raw_input() result = self.knp.parse(input_sentence.decode("utf8")) for bnst in result.bnst_list(): sys.stdout.write("{} ".format("".join(mrph.midasi.encode("utf8") for mrph in bnst.mrph_list()))) sys.stdout.write("\n") return def Q69(self): u"""69. 構文解析結果を読み込み、接頭辞を含む文節をプリントせよ """ data = u"" extract = set() for line in iter(sys.stdin.readline, ""): data += line.decode("utf8") if line.strip() == "EOS": result = self.knp.result(data) for bnst in result.bnst_list(): if len(filter(lambda x: x.hinsi == u"接頭辞", bnst.mrph_list())) < 1: continue extract.add("{} ".format("".join(mrph.midasi.encode("utf8") for mrph in bnst.mrph_list()))) data = u"" for bnst in extract: if len(bnst) > 0: print(bnst) return def Q70(self): u"""70. 構文解析結果を読み込み、名詞を2つ以上含む文節をプリントせよ """ data = u"" extract = set() for line in iter(sys.stdin.readline, ""): data += line.decode("utf8") if line.strip() == "EOS": result = self.knp.result(data) for bnst in result.bnst_list(): if len(filter(lambda x: x.hinsi == u"名詞", bnst.mrph_list())) < 2: continue extract.add("{} ".format("".join(mrph.midasi.encode("utf8") for mrph in bnst.mrph_list()))) data = u"" for bnst in extract: if len(bnst) > 0: print(bnst) return
class Solver(object): def __init__(self): self.juman = Juman() self.knp = KNP() def Q61(self): u"""61. 文を標準入力から読み込み、それを単語単位に分かち書きせよ (形態素間にスペースを挿入) """ input_sentence = raw_input() result = self.juman.analysis(input_sentence.decode('utf8')) for mrph in result.mrph_list(): sys.stdout.write('{} '.format(mrph.midasi.encode('utf8'))) sys.stdout.write('\n') return def Q62(self): u"""62. 形態素解析結果を読み込み、名詞だけを抽出してプリントせよ ヒント: mrph.hinsi が u"名詞" という文字列と一致するかどうかを判定 """ data = u'' for line in iter(sys.stdin.readline, ""): # 入力文を1行ずつ読む data += line.decode('utf8') if line.strip() == 'EOS': # 1文が終わったら解析 result = self.juman.result(data) s = ','.join(mrph.midasi for mrph in result.mrph_list() if mrph.hinsi == u'名詞') # 名詞だけ表示 if len(s) > 0: print(s) data = u'' def Q63(self): u"""62. 形態素解析結果を読み込み、名詞だけを抽出してプリントせよ ヒント: mrph.hinsi が u"名詞" という文字列と一致するかどうかを判定 """ data = u'' for line in iter(sys.stdin.readline, ""): # 入力文を1行ずつ読む data += line.decode('utf8') if line.strip() == 'EOS': # 1文が終わったら解析 result = self.juman.result(data) s = ','.join(mrph.genkei for mrph in result.mrph_list() if mrph.hinsi == u'動詞') # 動詞だけ表示 if len(s) > 0: print(s) data = u'' def Q64(self): u"""64. 形態素解析結果を読み込み、形態素の原形を頻度順に並べよ ヒント: ディクショナリ、sorted 関数を使う """ data = u'' hist = {} for line in iter(sys.stdin.readline, ""): # 入力文を1行ずつ読む data += line.decode('utf8') if line.strip() == 'EOS': # 1文が終わったら解析 result = self.juman.result(data) for mrph in result.mrph_list(): try: hist[mrph.genkei] += 1 except KeyError: hist[mrph.genkei] = 1 data = u'' for key, val in sorted(hist.items(), key=lambda t:t[1], reverse=True): print('{},{}'.format(key.encode('utf8'), val)) def Q65(self): u"""65. 形態素解析結果を読み込み、全形態素数 (総数) に対する述語の割合を計算せよ ここで、述語とは、動詞、イ形容詞 (形容詞)、ナ形容詞 (形容動詞) とする """ data = u'' num = 0 denom = 0 for line in iter(sys.stdin.readline, ""): # 入力文を1行ずつ読む data += line.decode('utf8') if line.strip() == 'EOS': # 1文が終わったら解析 result = self.juman.result(data) if verbose: logger.info('denom: {}'.format(denom)) for mrph in result.mrph_list(): denom += 1 if mrph.hinsi == u'動詞': num += 1 continue if mrph.hinsi == u'形容詞' and mrph.bunrui.startswith(u'イ形容詞'): num += 1 continue if mrph.hinsi == u'形容動詞' and mrph.bunrui.startswith(u'ナ形容詞'): num += 1 continue data = u'' print('{}/{}={}'.format(num, denom, float(num)/denom)) def Q66(self): u"""66. 形態素解析結果を読み込み、「サ変名詞+する/できる」というパターンを抽出しプリントせよ """ data = u'' extract = set() for line in iter(sys.stdin.readline, ""): # 入力文を1行ずつ読む data += line.decode('utf8') if line.strip() == 'EOS': # 1文が終わったら解析 result = self.juman.result(data) buff = None for mrph in result.mrph_list(): if mrph.genkei == u'できる' or mrph.genkei == u'する': if buff is not None: extract.add((buff.genkei.encode('utf8'), mrph.genkei.encode('utf8'))) if mrph.bunrui == u'サ変名詞': buff = mrph else: buff = None data = u'' for t in extract: print('{}+{}'.format(t[0], t[1])) def Q67(self): u"""67. 形態素解析結果を読み込み、「AのB」という表現 (A と B は名詞の1形態素) をすべてプリントせよ """ data = u'' extract = set() for line in iter(sys.stdin.readline, ""): # 入力文を1行ずつ読む data += line.decode('utf8') if line.strip() == 'EOS': # 1文が終わったら解析 result = self.juman.result(data) buff = [] for mrph in result.mrph_list(): if mrph.genkei == u'の' and len(buff) == 1: buff.append(u'の') continue if mrph.hinsi == u'名詞': if len(buff) == 0: buff.append(mrph.genkei) continue if len(buff) == 2: extract.add((buff[0], mrph.genkei)) buff = [] data = u'' for t in extract: print('{}の{}'.format(t[0].encode('utf8'), t[1].encode('utf8'))) def Q68(self): u"""68. 文を標準入力から読み込み、それを文節単位に分かち書きせよ (文節間にスペースを挿入) """ input_sentence = raw_input() result = self.knp.parse(input_sentence.decode('utf8')) for bnst in result.bnst_list(): sys.stdout.write('{} '.format("".join(mrph.midasi.encode('utf8') for mrph in bnst.mrph_list()))) sys.stdout.write('\n') return def Q69(self): u"""69. 構文解析結果を読み込み、接頭辞を含む文節をプリントせよ """ data = u'' extract = set() for line in iter(sys.stdin.readline, ""): data += line.decode('utf8') if line.strip() == 'EOS': result = self.knp.result(data) for bnst in result.bnst_list(): if len(filter(lambda x: x.hinsi == u'接頭辞', bnst.mrph_list())) < 1: continue extract.add('{} '.format("".join(mrph.midasi.encode('utf8') for mrph in bnst.mrph_list()))) data = u'' for bnst in extract: if len(bnst) > 0: print(bnst) return def Q70(self): u"""70. 構文解析結果を読み込み、名詞を2つ以上含む文節をプリントせよ """ data = u'' extract = set() for line in iter(sys.stdin.readline, ""): data += line.decode('utf8') if line.strip() == 'EOS': result = self.knp.result(data) for bnst in result.bnst_list(): if len(filter(lambda x: x.hinsi == u'名詞', bnst.mrph_list())) < 2: continue extract.add('{} '.format("".join(mrph.midasi.encode('utf8') for mrph in bnst.mrph_list()))) data = u'' for bnst in extract: if len(bnst) > 0: print(bnst) return
def example_interface(): """This functions shows you how to use interface function""" if six.PY2: input_document = [ { u"text-id": u"input-1", u"text": "おじいさんは山に芝刈りへ、おばあさんは川に洗濯へ行きました。" }, { u"text-id": u"input-2", u"text": u"東京 3日 ロイター] - 日銀は3日、急激な金利上昇を止めるため、特定の年限の国債買い入れを増やす「指値オペ」を実施した。トランプ米大統領による円安誘導批判を受け、日銀が長期金利を押し下げるようなオペは難しくなるとの思惑が浮上。長期金利は3日、一時、0.15%を超えて上昇した。日銀は、指し値オペの実行によってゼロ%に抑える政策に変化がないことを明確にし、圧力を意識した市場に「強い意思」を示した格好だ。" }, { u"text-id": u"input-3", u"text": u"指値オペの実施は現在の金融政策「長短金利操作(イールドカーブ・コントロール、YCC)」を開始した2016年9月以来、2度目となる。" }, { u"text-id": u"input-4", u"text": u"ドナルド・トランプ米大統領が有権者の心をつかんだ理由の一つは、その率直な物言いだ。ドルに関して言えば、米国の歴代財務長官が昔から繰り返してきた「強いドルは米国の国益にかなう」という妄言と決別するという新政権の意向は歓迎されよう。" }, ] else: input_document = [ { "text-id": "input-1", "text": "おじいさんは山に芝刈りへ、おばあさんは川に洗濯へ行きました。" }, { "text-id": "input-2", "text": "東京 3日 ロイター] - 日銀は3日、急激な金利上昇を止めるため、特定の年限の国債買い入れを増やす「指値オペ」を実施した。トランプ米大統領による円安誘導批判を受け、日銀が長期金利を押し下げるようなオペは難しくなるとの思惑が浮上。長期金利は3日、一時、0.15%を超えて上昇した。日銀は、指し値オペの実行によってゼロ%に抑える政策に変化がないことを明確にし、圧力を意識した市場に「強い意思」を示した格好だ。" }, { "text-id": "input-3", "text": "指値オペの実施は現在の金融政策「長短金利操作(イールドカーブ・コントロール、YCC)」を開始した2016年9月以来、2度目となる。" }, { "text-id": "input-4", "text": "ドナルド・トランプ米大統領が有権者の心をつかんだ理由の一つは、その率直な物言いだ。ドルに関して言えば、米国の歴代財務長官が昔から繰り返してきた「強いドルは米国の国益にかなう」という妄言と決別するという新政権の意向は歓迎されよう。" }, ] result_obj = knp_job.main( seq_input_dict_document=input_document, n_jobs=-1, is_normalize_text=True, is_get_processed_doc=True, is_split_text=True, juman_command= PATH_JUMAN_COMMAND, # Note: You can set jumanpp also (if it's available in your system) knp_command=PATH_KNP_COMMAND, process_mode="pexpect") import json logger.info(msg="--- example of parsed result ---") print(json.dumps(result_obj.to_dict()[0], ensure_ascii=False)) logger.info('---') """You call get associated with pyknp which is official python wrapper for KNP""" ### With pyknp try: import pyknp except: logger.error(msg="Failed to install pyknp. Skip this process.") else: from pyknp import KNP knp_obj = KNP() for knp_parsed_obj in result_obj.seq_document_obj: pyknp_parsed_result = knp_obj.result( input_str=knp_parsed_obj.parsed_result) bnst_surface = [ "".join(mrph.midasi for mrph in bnst_obj.mrph_list()) for bnst_obj in pyknp_parsed_result.bnst_list() ] print(bnst_surface)