예제 #1
0
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
예제 #2
0
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 = ""
예제 #3
0
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
예제 #5
0
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))
예제 #6
0
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""
예제 #7
0
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 = ""
예제 #8
0
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
예제 #9
0
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
예제 #10
0
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)