60748


tsvファイルをmecabを用いて分かち書きを行い、名詞・形容詞・動詞のみを基本形でリスト化したいです。  
tsvファイルを読み込み、mecabを用いて分かち書きし、ストップワードを除外するコード/名詞・形容詞・動詞のみを基本形で分かち書きするコードはそれぞれあるのですが、２つを組み合わせる方法が分かりません。  
どなたかご教授いただけると幸いです。

**使用環境**  
jupyternotebook  
windows10

tsvファイルを読み込み、mecabを用いて分かち書きし、ストップワードを除外するコード

[code]

    from gensim.models.doc2vec import Doc2Vec
    from gensim.models.doc2vec import TaggedDocument
    
    import MeCab
    import csv
    
    mt = MeCab.Tagger()
    
    reports = []
    with open("reports.tsv",mode='r',encoding='utf-8') as f:
        # reports.tsvには一行にID,文章がtab区切りで保存されている
        reader = csv.reader(f, delimiter="\t")
        for report_id, report in reader:
            words = []
            node = mt.parseToNode(report)
            while node:
                if len(node.surface) > 0:
                    words.append(node.surface)
                node = node.next
            stopword = ['では','のみ','か','まだ','はず','く','て','つつ','ば','でも']
            words2 = [token for token in words if token not in stopword]
            # wordsが文章の単語のリスト,tagsには文章IDを指定
            reports.append(TaggedDocument(words=words2, tags=[report_id]))
    print(reports)
    
[/code]

名詞・形容詞・動詞のみを基本形で分かち書きするコード

[code]

    tokenizer = MeCab.Tagger()
    tokenizer.parse("")
    node = tokenizer.parseToNode("テキストデータ")
    keywords = []
    while node:
        if node.feature.split(",")[0] == u"名詞":
            keywords.append(node.surface)
        elif node.feature.split(",")[0] == u"形容詞":
            keywords.append(node.feature.split(",")[6])
        elif node.feature.split(",")[0] == u"動詞":
            keywords.append(node.feature.split(",")[6])
        node = node.next
    print(keywords)
    
[/code]


CC BY-SA 4.0
2019-11-21T16:28:55.243
60743
2019-11-22T03:06:53.733
2019-11-21T16:41:52.573
3060
36375
question
python mecab 自然言語処理
tsvファイルを分かち書きし、特定の品詞を基本形で出力したい


最初のプログラム（tsvファイルを読み込み、mecabを用いて分かち書きし、ストップワードを除外するコード）の下記部分[品詞に関わらず、リスト化している（？）]

[code]

           while node:
            if len(node.surface) > 0:
                words.append(node.surface)
            node = node.next
    
[/code]

に、二つ目のプログラムの下記部分[名詞、形容詞、動詞に限って、リスト化している（？）]

[code]

    while node:
        if node.feature.split(",")[0] == u"名詞":
            keywords.append(node.surface)
        elif node.feature.split(",")[0] == u"形容詞":
            keywords.append(node.feature.split(",")[6])
        elif node.feature.split(",")[0] == u"動詞":
            keywords.append(node.feature.split(",")[6])
        node = node.next
    
[/code]

を組み合わせて

[code]

           while node:
              if node.feature.split(",")[0] == u"名詞":
                  words.append(node.surface)
              elif node.feature.split(",")[0] == u"形容詞":
                  words.append(node.feature.split(",")[6])
              elif node.feature.split(",")[0] == u"動詞":
                  words.append(node.feature.split(",")[6])
            node = node.next
    
[/code]

とすれば、良いのではないでしょうか？


CC BY-SA 4.0
2019-11-22T01:39:33.140
60748
2019-11-22T01:39:33.140
217
60743
answer


ストップワードを除外したいだけなら`node.surface not in stopword`の条件を付ければいいと思います。

[code]

    from gensim.models.doc2vec import Doc2Vec
    from gensim.models.doc2vec import TaggedDocument
    
    import MeCab
    import csv
    
    mt = MeCab.Tagger()
    
    with open("reports.tsv",mode='r',encoding='utf-8') as f:
        # reports.tsvには一行にID,文章がtab区切りで保存されている
        reader = csv.reader(f, delimiter="\t")
        words = []
        stopword = ['では','のみ','か','まだ','はず','く','て','つつ','ば','でも']
        for report_id, report in reader:
            node = mt.parseToNode(report)
            while node:
                if len(node.surface) > 0 and node.surface not in stopword:
                    if node.feature.split(",")[0] == u"名詞":
                        words.append(node.surface)
                    elif node.feature.split(",")[0] == u"形容詞":
                        words.append(node.feature.split(",")[6])
                    elif node.feature.split(",")[0] == u"動詞":
                        words.append(node.feature.split(",")[6])
                node = node.next
        print(words)
    
[/code]


CC BY-SA 4.0
2019-11-22T03:06:53.733
60753
2019-11-22T03:06:53.733
21092
60743
answer