TransWikia.com

tsvファイルに書かれている文章を分かち書きし、文章ごとに単語を入れ子構造リストとして格納したい

スタック・オーバーフロー Asked by jumpei manai on December 24, 2021

tsvファイルを読み込み、IDと単語を各行ごとに紐づけて分かち書きをしました。
このうち、単語のみを文章ごとにリストに格納するコードが分かりません。
したいアウトプットの形としては[[‘単語’,’単語’],[‘単語’…..]…]
という形です。
どなたかコードのご教授お願い致します。

from gensim.models.doc2vec import Doc2Vec
from gensim.models.doc2vec import TaggedDocument

import MeCab
import csv

mt = MeCab.Tagger()

reports = []

with open("tfidf.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 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

        stopword = ['れる','の','られる','せる','させる','LED','pantone','20','30','β','3','?','9','(','u3000','&','A','W','%','×','"','6','15','1994','3',"'",'GW','25','OO','s','1','/','500','%','.','0','2020','V','13','5','180','-', '%)','(','+','4','8','10','100','14','ABS','4','K','"','7','50','.','33','5','上','器','丿','・','0','40','7', '?',')','60','+','2','/','、','。','「','」','2','1000','1010123','1093','12','120','16','17','1930','1972','200','2002','21','24','260','27','34','35','36','360','37','40000','4136','43','480','70','75','agata','back','ball','basic','cd','chadwick','chair','co','crt','daa','degrees','dm','dvd','eco','epd','eva','fsc','gulfman','homearchi','hybrid','ic','ipad','ipod','lan','leavbes','led','may','md','mdf','mf','mm','mmx','ms','nanoe','nasa','nc','no','oa','off','ohashi','ojigi','on','pantone','pc','pet','pp','prism','pro','rom','sd','shock','soho','td','the','to','tpo','trek','usb','ventura','way','wear','av','diy','led','led','pc','1つ','2つ','そう','どこ','ここ','これ','この','いつ','こんな','いくつ','これら','どの','その','それぞれ','そのもの','こうした','それ','それなり','こちら','だれ','こういう','そういう','そういった','どう','どちら','どれ','どんな','どんなに','もの','こと','ところ','よう','ため','ぶり','がち','さ','み','等','度','時','事','感','点','所','為','面','用','的','化','性','約','材','者','力','色','部','品','ある程度','中','部分','全体','ある','いる','なる','おる','行く','いく','来る','くる','とる','見る','みる','言う','いう','過ぎる','すぎる','する','やる','行う','おこなう','行なう','出来る','できる','感じる','思う','おもう','考える','かんがえる','わかる','分かる','分る','見える','みえる','知る','しる','知れる','しれる','言える','いえる','示す','しめす','述べる','のべる','書く','かく','よる','だす','出す','入る','はいる','いれる','入れる','使う','つかう','用いる','もちいる','持つ','もつ','もてる','持てる','作る','つくる','なす','起こる','おこる','つく','つける','付く','付ける','聞く','よぶ','きく','呼ぶ','ない','高い','低い','多い','少ない','強い','大きい','小さい','長い','ながい','よい','良い','悪い','いい','やすい','にくい','うまい','デザイン','評価','機能','商品','製品','感じ']
        words2 = [token for token in words if token not in stopword]# wordsが文章の単語のリスト,tagsには文章IDを指定
        reports.append(TaggedDocument(words=words2, tags=[report_id]))

One Answer

具体的にお求めの成果物が分かりかねますので、推量を含む回答です。
[['単語','単語'],['単語'.....]...]で単語を区切ったリストを作るならば、for文の中で作成したwordを別のリストに追加することで作成できます。

下記のサンプルコードは辞書(wordDic)のキーとしてreport_idを残し、質問文のコードとご質問のリストを両方出せるコードになっています。

サンプルコード
from gensim.models.doc2vec import Doc2Vec
from gensim.models.doc2vec import TaggedDocument

import MeCab
import csv

mt = MeCab.Tagger()

reports = [] # TaggedDocumentのリスト(元の質問のまま)
wordDic = {} # 各行のreport_idと文章ごとに単語のみ入れたリスト

# 一行に口コミID,口コミがtab区切りの文字列
tsv = ["1tこのLEDをusbで起動させる", "2tnasaとjaxaは一体いつohashiを作ったのか", "3tそのojigiのdegreesは大きすぎる"]
reader = csv.reader(tsv, delimiter="t")
for report_id, report in reader:
    words = []
    node = mt.parseToNode(report)
    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

    wordDic[report_id] = words

stopword = ['れる','の','られる','せる','させる','LED','pantone','20','30','β','3','?','9','(','u3000','&','A','W','%','×','"','6','15','1994','3',"'",'GW','25','OO','s','1','/','500','%','.','0','2020','V','13','5','180','-', '%)','(','+','4','8','10','100','14','ABS','4','K','"','7','50','.','33','5','上','器','丿','・','0','40','7', '?',')','60','+','2','/','、','。','「','」','2','1000','1010123','1093','12','120','16','17','1930','1972','200','2002','21','24','260','27','34','35','36','360','37','40000','4136','43','480','70','75','agata','back','ball','basic','cd','chadwick','chair','co','crt','daa','degrees','dm','dvd','eco','epd','eva','fsc','gulfman','homearchi','hybrid','ic','ipad','ipod','lan','leavbes','led','may','md','mdf','mf','mm','mmx','ms','nanoe','nasa','nc','no','oa','off','ohashi','ojigi','on','pantone','pc','pet','pp','prism','pro','rom','sd','shock','soho','td','the','to','tpo','trek','usb','ventura','way','wear','av','diy','led','led','pc','1つ','2つ','そう','どこ','ここ','これ','この','いつ','こんな','いくつ','これら','どの','その','それぞれ','そのもの','こうした','それ','それなり','こちら','だれ','こういう','そういう','そういった','どう','どちら','どれ','どんな','どんなに','もの','こと','ところ','よう','ため','ぶり','がち','さ','み','等','度','時','事','感','点','所','為','面','用','的','化','性','約','材','者','力','色','部','品','ある程度','中','部分','全体','ある','いる','なる','おる','行く','いく','来る','くる','とる','見る','みる','言う','いう','過ぎる','すぎる','する','やる','行う','おこなう','行なう','出来る','できる','感じる','思う','おもう','考える','かんがえる','わかる','分かる','分る','見える','みえる','知る','しる','知れる','しれる','言える','いえる','示す','しめす','述べる','のべる','書く','かく','よる','だす','出す','入る','はいる','いれる','入れる','使う','つかう','用いる','もちいる','持つ','もつ','もてる','持てる','作る','つくる','なす','起こる','おこる','つく','つける','付く','付ける','聞く','よぶ','きく','呼ぶ','ない','高い','低い','多い','少ない','強い','大きい','小さい','長い','ながい','よい','良い','悪い','いい','やすい','にくい','うまい','デザイン','評価','機能','商品','製品','感じ']
for report_id in wordDic:
    print(wordDic[report_id])
    words2 = [token for token in wordDic[report_id] if token not in stopword]
    reports.append(TaggedDocument(words=words2, tags=[report_id]))

print(reports)
# words の単語のみを文章ごとにリストに格納するコード
print(list(wordDic.values()))
# words2の単語のみを文章ごとにリストに格納するコード
print([report.words for report in reports])
出力内容
['LED', 'usb', '起動', 'する', 'せる']
['nasa', 'jaxa', 'いる', 'ohashi', '作る', 'の']
['ojigi', 'degrees', '大きい', 'すぎる']
[TaggedDocument(words=['起動'], tags=['1']), TaggedDocument(words=['jaxa'], tags=['2']), TaggedDocument(words=[], tags=['3'])]
[['LED', 'usb', '起動', 'する', 'せる'], ['nasa', 'jaxa', 'いる', 'ohashi', '作る', 'の'], ['ojigi', 'degrees', '大きい', 'すぎる']]
[['起動'], ['jaxa'], []]

Answered by payaneco on December 24, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP