Esempio n. 1
0
def load_juman_from_stream(f, juman_format=JUMAN_FORMAT.DEFAULT):
    """
    JUMANフォーマットの解析結果ファイルを解釈し、文節列オブジェクトを返す

    Args:
        f (file): JUMANフォーマットの解析結果のファイルオブジェクト
        juman_format (JUMAN_FORMAT): Jumanのlattice出力形式

    Yields:
        MList: 形態素列オブジェクト
    """
    juman = Juman()
    buf = ""
    for line in f:
        buf += line
        if line.startswith("EOS"):
            yield juman.result(buf, juman_format=juman_format)
            buf = ""
Esempio n. 2
0
from pyknp import Juman
import sys

juman = Juman()
data = ""
flag = False
word = ""

for line in iter(sys.stdin.readline, ""):
    if line.strip() == "EOS":
        result = juman.result(data)
        for mrph in result.mrph_list():
            if flag and (mrph.genkei == "する" or mrph.genkei == "できる"):
                # print(mrph.midasi)
                print(word + mrph.midasi)
            flag = False
            word = ""
            if mrph.bunrui == "サ変名詞":
                flag = True
                # print(mrph.bunrui)
                word = mrph.midasi
        data = ""

    else:
        data += line
Esempio n. 3
0
from pyknp import Juman
import sys

juman = Juman()

data = ""
for line in iter(sys.stdin.readline, ""):  # 解析結果ファイルを1行ずつ読む
    if line.strip() == "EOS":  # 1文の解析結果を読み込んだら
        result = juman.result(data)  # 内部構造に変換
        for mrph in result.mrph_list():
            if mrph.hinsi == "動詞":
                print(mrph.genkei)
        data = ""
    else:
        data += line

# for line in iter(sys.stdin.readline,""):
#     result=juman.result(line)
#     for mrph in result.mrph_list():
#         if mrph.hinsi=="動詞":
#             print(mrph.genkei)
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
Esempio n. 5
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