質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

560閲覧

[2]textファイルを記事毎に分割し,さらに記事中の名詞を抽出して二次元配列にする.

studyprg

総合スコア57

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2022/10/27 06:43

前提

自然言語処理について勉強しています。
Wikipediaのdumpデータから本文を抜き出して処理をしようと思ってます。
用意したテキストファイルから段落ごとに分割し表示したいです.
ちなみに以下の質問から地続きです.
以下の質問

実現したいこと

  1. テキストファイルを読みこんでtextに格納

  2. textリストから記号などの削除(下図左)

  3. textを改行4つ(図だと三つになってますが四つです)でsplitして記事毎にhistory_protoに格納(下図右上)

  4. 記事の段落ごとにprotonに格納*1

  5. historyprotoの要素を一つずつ取り出して-Ochasenで名詞のみをhistoryに格納*2(下図右下)

  6. *1と*2を繰り返す

  7. historyを表示(段落ごとに分割し,さらに名詞で分割された二次元配列になる)

該当のソースコードと用意したテキストファイルの一部のイメージイメージ説明

※注図のhistory promoは誤字で正しくはhistory proto です。

pythonソースコード

1# -*- coding: utf-8 -*- 2from gensim.models import KeyedVectors 3import MeCab 4import gensim 5import pandas as pd 6import math 7import re 8print("モデルロード") 9# model_dir = 'entity_vector.model.txt' 10# model = KeyedVectors.load_word2vec_format(model_dir, binary=False) 11myfile = open('history_0text.txt') 12print("\n\nテキストを読み込みました\n\n") # history 13# 以下に抽出したい文textここをファイルを読み込むように変更 14# Gfile = open('') # ガイド文書 15 16htext = myfile.read() 17m = MeCab.Tagger("-Ochasen") 18mp = MeCab.Tagger() 19# m.parse("") 20print("処理開始") 21removeW = re.compile( 22 23 '[!"#$%&\'\\\\()*+,-./:;<=>?@[\\]^_`{|}~「」〔〕“”〈〉, ,『』【】&*・()$#@。、?!`+¥% ]') 24text = removeW.sub('', htext) 25 26# text = re.sub(r"\n", "", text) # 一行づつ配列に入れる時に改行文字が混じったから消しとく 27text = re.sub(r'[a-zA-Z0-9]+', "", text) # 英数字をすべて消す 28text = text.replace("[]", "") # 脚注で無意味に混じった[]の削除 29text = text.replace("\s", "") 30# print(text) 31print("\n\ntext clean complite!\n\n邪魔者消します") 32historyproto = text.split('\n\n\n\n') 33historyproto = list(filter(None, historyproto)) 34print("記事毎に分割しました\n\nnext:空要素を削除\n\n") 35history = [] 36for x in range(len(historyproto)): 37 proton = [line.split()[0] for line in m.parse( 38 historyproto[x]).splitlines() if "名詞" in line.split()[-1]] 39 if len(proton) != 0: 40 history.append(proton) 41 42for i in range(len(history)): 43 print("記事",i+1,"こめの単語数は\t[", len(history[i]),"]\n") 44 print("\n", i+1, "ばんめの記事\n") 45 print(history[i]) 46 47 48exit

用意したテキストファイルのリンクですテキストファイル
上記2記事と残り7記事で合計9記事分あります.

###実行結果でおかしいところ
一つめの中略と二つめの中略の間の部分がなぜか別の記事扱いになってます.(太字部分)

cmd

1 2['村上', '隆', 'ゴルファー', '村上', '隆', '青木', '功', '尾崎', '将司', '青木', '功'] 3記事 3 の単語数は [ 2 ] 4 5 6 3 ばんめの記事 7 8['中島', '常幸'] 9記事 4 の単語数は [ 4 ] 10 11 12 4 ばんめの記事 13 14['前田', '新作', '中島', '常幸'] 15記事 5 の単語数は [ 4 ] 16 17 18 5 ばんめの記事 19 20['デビッド', 'イシイ', '尾崎', '将司'] 21記事 6 の単語数は [ 8 ] 22 23 24 6 ばんめの記事 25 26['尾崎', '直道', '尾崎', '将司', '飯合', '肇', '尾崎', '将司'] 27記事 7 の単語数は [ 14 ] 28 29 30 7 ばんめの記事 31 32['尾崎', '直道', '片山', '晋', '呉', '伊沢', '利光', '谷口', '徹', '伊沢', '利光', '片山', '晋', '呉'] 33記事 8 の単語数は [ 143 ] 34

現在起きている問題

おそらく区切りがうまくできておらず,記事が余計に分割されている状態です.

期待する出力の一部

cmd

1[['日本', 'ゴルフ', 'ツアー', '機構', '基礎', '情報', '非', '営利', '団体', '名称', '日本', 'ゴルフ', 'ツアー', '機構', 'ロゴ', '創立', '者', '団体', '種類', '社団', '法人', '一般', '社団', '法人', '設立', '年月日', '所在地', '起源', '主要', '人物', '会長', '海老沢', '勝二', '活動', '地域', '製品', '主眼', '活動', '内容', 'プロ', 'ゴルフ', 'ツアー', '主催', '活動', '手段', '収入', '基本', '財産', 'ボランティア', '人数', '従業', '員', '数', '会員', '数', '子', '団体', '標語', 'ウェブサイト', '解散', '特記', '事項', '一般', '社団', '法人', '日本', 'ゴルフ', 'ツアー', '機構', 'ほん', 'ゴルフ', 'ツアー', 'きこう', '年度', '日本', 'プロ', 'ゴルフ', 'ツアー', '試合', '主催', '主管', '組織', '概要', 'シーズン', '月', '東', '建', 'ホームメイトカップ', '新', '年度', '最初', '試合', '月', '前後', '試合', '開催', '基本', '的', '大会', '日間', '競技', '開催', '一部', '大会', '当', 'ツアー', 'ワンアジアツアー', '共同', '主催', '国外', '大会', '年', '試合', '日本', '開催', 'アジアン', 'ツアー', '共催', 'ダイヤモンド', 'カップ', '試合', '実質', '的', '当', 'ツアー', '開幕', '戦', 'インドネシア', '選手権', '2', '0', '1', '4', '年', '初戦', 'インドネシア', '選手権', '日本', 'ゴルフ', 'ツアー', '機構', '当初', 'タイ', 'ランド', 'オープン', '実質', '的', '開幕', '戦', '予定', 'タイ', '王国', '政治', '的', '内紛', '事情', '延期', '当初', '年間', '年', 'パーソナルコンピュータ', 'パソコン', 'ディスプレイコンピュータディスプレイメーカー', 'イーヤマ', '特別', '協賛', 'スポンサー', '関係', 'イーヤマツアー', '現在', 'ツアー', 'そのもの', '冠', 'ノー', 'スポンサー', 'ツアー', '開始', '当初', '権利', '能力', '社団', '任意', '団体', '年', '社団', '法人', '化', '文部', '科学', '省', '所管', '年月', '社団', '法人', '一般', '社団', '法人', '移行', '一般', '社団', '法人', '日本', 'ゴルフ', 'ツアー', '機構', '会長', '海老沢', '勝二', '新年', 'ご', '挨拶', '日本', 'ゴルフ', 'ツアー', '機構', '年月日', 'シード', '枠', 'ツアー', '出場', '優先', '順位', '永久', 'シード', 'プロ', 'ゴルフ', '永久', 'シード', '所持', '者', '過去', '年間', 'ツアー', '賞金', 'ランキング', '位', '者', 'メジャー', 'タイトル', '優勝', '者', '大会', '年間', 'シード', '枠', '対象', '試合', '日本', 'プロ', 'ゴルフ', '選手権', '大会', '日本', 'ゴルフ', 'ツアー', '選手権', '日本', 'オープン', 'ゴルフ', '選手権', '競技', '過去', 'フィランソロピートーナメント', 'メジャー', 'こと', '前', '年度', 'ワールドカップ', '日本', '代表', '年', 'ツアー', '制度', '施行', '後', 'ツアー', '競技', '勝', '以上', '者', '永久', 'シード', '前年度', 'ダイナスティーカップ', '日本', '代表', 'ゴルフ', '日本', 'シリーズ', '日本', 'プロゴルフマッチプレー', '選手権', '日本', 'マッチ', 'プレー', '過去', '年間', '優勝', '者', '過去', '年間', 'ツアー', 'トーナメント', '優勝', '者', '規定', '試合', '数', '出場', '者', '過去', '年間', '本', 'ツアー', 'トーナメント', '優勝', '者', '前年度', '当該', 'ツアー', 'トーナメント', '成績', '上位', '位', '以内', '者', '直近', 'ツアー', 'トーナメント', '基本', '的', '前週', 'ツアー', 'トーナメント', '上位', '位', '以内', '者', '会長', '推薦', '者', '前年度', 'ツアー', '賞金', 'ランキング', '位', '以内', '者', '規定', '試合', '数', '出場', '者', '特別', '保障', '制度', '適用', '者', 'ツアー', 'トーナメント', '複数', '競技', '優勝', '者', '年間', '勝', '者', '年', '翌年', '年間', '年間', '勝', '者', '年', '翌年', '年間', '規定', '試合', '数', '出場', '者', '年', 'ツアー', '制度', '施行', '後', '通算', '賞金', '獲得', 'ランキング', '位', '以内', '選手', '前年度', '末', '時点', '前年度', 'アジアン', 'ツアー', '賞金', 'ランキング', '位', '者', '指定', 'チャレンジ', 'トーナメント', '優勝', '者', '指定', 'ツアー', 'トーナメント', '出場', '前年度', 'チャレンジ', 'トーナメント', '賞金', 'ランキング', '上位', '位', '以内', '者', '当該', '年度', '回', 'リランキング', '出場', '可能', '前年度', '回', 'リランキング', '後', 'クオリファイングトーナメント', '上位', '者', '主催', '者', '推薦', '者', 'プロ', '選手', '資格', '年', '日本', 'プロ', 'ゴルフ', '協会', 'プロテスト', '合格', 'ツアー', '競技', '正式', 'メンバー', 'トーナメント', 'プレイヤー', '当', '機構', '誕生', '年', '以後', '日本', 'プロ', 'ゴルフ', '協会', '資格', '認定', '審査', 'プロテスト', '認定', 'ツアー', 'プロテスト', '現存', '年', '以降', 'クオリファイングトーナメント', '以下', '予選', '会', '出場', '一定', '成績', 'プロ', '資格', '事実', '上', 'プロ', '選手', '出場', '権利', '参加', '者', '事前', '申し込み', '過去', '参加', '者', '各種', 'ゴルフ', '競技', '団体', '推薦', '者', '資格', '月', '月', 'ファースト', '次', '予選', 'ラウンドホールズ', 'スタート', 'これ', '全国', '各地', '開催', '各', '会場', '人', '程度', '出場', '上位', '選手', '出場', '選手', '総数', '勝ち抜き', '者', '数', 'セカンド', '次', '予選', '中略', 'デフォルト', 'ソート', 'ほん', 'ふつ', 'きこう', '日本', 'ゴルフ', 'ツアー', 'ゴルフ', '日本', '組織', 'ふつ', 'きこう', '一般', '社団', '法人', 'スポーツ', '関係', '東京', '都', '港', '区', '一般', '社団', '法人', '年', '設立'], ['桂米朝', '画像', '結び', '柏', '桂米朝', '一門', '定紋', '桂米朝', 'かつら', 'いちょう', '上方', '落語', '名跡', '本来', '大', '名跡', '桂', '米', '團', '治', '前', '段階', '名跡', '初代', '入門', '際', '師匠', '米', '夫人', '名前', '米', '朝', 'の', '当代', '代', '目', '初代', '初代', '桂米朝', '年', '年月日', '後', '代', '目', '桂', '文', '團', '治', '立川', '三吉桂文朝林家菊松桂米朝桂順朝代目桂米團治', '代目', '桂', '文', '團', '治', '襲名', '本名', '前田', '七三郎', '代目', '代目', '桂米朝', '年', '年月日', '後', '桂', '米', '團', '治代', '目代', '目', '桂', '米', '團', '治', '初代', '桂', 'かこ', '桂', '米', '歌子', 'かこ', '初代', '桂', '米', '助', '米', '朝', '代目', '米', '團', '治', '襲名', '本名', '早田', '福松', '代目', '頃', '初代', '文', '團', '治', '襲名', '出世', 'ため', '本来', '前座', '名', '米', '朝', '名前', '代', '目', '当代', '桂米朝', '代', '目代', '目', '桂米朝', '年月日', '入門', '当時', '上方', '落語', '復興', '尽力', 'し笑', '福', '亭', '松', '鶴代', '目代', '目', '笑', '福', '亭', '松', '鶴', '桂', '文枝', '代', '目代', '目', '桂', '文枝', '桂', '春', '団', '治代', '目代', '目', '桂', '春', '団', '治', '昭和', '以降', '上方', '落語', '四天王', '本名', '中川', '清', '上方', '落語', '界', '落語', '界', '人目', '人間', '国宝', '後', '演芸', '界', '初', '文化', '勲章', '受章', '者', '先代', '諸', '事情', 'ため', '米', '團', '治', '名前', '公言', '長男', '落語', '家', '桂', '米', '團', '治代', '目代', '目', '桂', '米', '團', '治', '年', '襲名', '関連', '項目', '米', '朝', '一門', '米', '朝', '事務所', '上方', '落語', '協会', '落語', '家', '一覧', '上方', '噺家', '落語', '名跡', 'かつら', 'いち', 'よう']

補足情報(FW/ツールのバージョンなど)

MacBookPro(2017)macos:11.6.7
usage: /System/Library/Frameworks/Python.framework/Versions/2.7/Resources/Python.app/Contents/MacOS/Python [option] ... [-c cmd | -m mod | file | -] [arg] ...
Try `python -h' for more information.

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jbpb0

2022/10/27 14:27

> 実行結果でおかしいところ 一つめの中略と二つめの中略の間の部分 「一つめの中略」とは? 「二つめの中略」とは? > 用意したテキストファイルのリンクです からダウンロードしたファイル内には、「中略」はありませんでした
jbpb0

2022/10/27 15:01 編集

> なぜか別の記事扱いになってます. は、 > textリストから記号などの削除(下図左) が終わった時点で空行(改行だけの行)がたくさん存在してるから、 > textを改行4つ(図だと三つになってますが四つです)でsplitして記事毎にhistory_protoに格納(下図右上) で別の記事扱いになるのではないですかね たとえば、元のファイルの ***** 開始 ***** |rg_year = 2008年 |ex_rg_year = |remarks = |url_no = 1223 |map_img = |map_img_width = 275px |}} [[ファイル:展望台から見たマラッカ海峡の風景.JPG|thumb|240px|展望台から見たマラッカ海峡側の風景]] ***** 終了 ***** の8行は、 ***** 開始 ***** 年 ファイル展望台から見たマラッカ海峡の風景展望台から見たマラッカ海峡側の風景 ***** 終了 ***** と6行が空行になってますので、そこで別記事に分かれてしまいますよね
studyprg

2022/10/27 19:08

そうかもしれません。 どうしたらいいんですかね?
studyprg

2022/10/27 19:09

「一つめの中略」とは? 「二つめの中略」とは?→消してなかっただけですね。 中身を貼り付けてた時の名残です。 忘れてください。
studyprg

2022/10/27 21:14

コメントの指摘から余計な文字の削除を分割後に行ったらうまいこと想定通りの実行結果になりました. コメントを回答にまとめていただけませんか?
studyprg

2022/10/27 21:15

一応修正後のソースを貼っておきます. ー======== # -*- coding: utf-8 -*- from gensim.models import KeyedVectors import MeCab import gensim import pandas as pd import math import re print("モデルロード") # model_dir = 'entity_vector.model.txt' # model = KeyedVectors.load_word2vec_format(model_dir, binary=False) myfile = open('history_0text.txt') print("\n\nテキストを読み込みました\n\n") # history # 以下に抽出したい文textここをファイルを読み込むように変更 # Gfile = open('') # ガイド文書 htext = myfile.read() m = MeCab.Tagger("-Ochasen") mp = MeCab.Tagger() # m.parse("") print("処理開始") removeW = re.compile( '[!"#$%&\'\\\\()*+,-./:;<=>?@[\\]^_`{|}~「」〔〕“”〈〉, ,『』【】&*・()$#@。、?!`+¥% ]') text = removeW.sub('', htext) # text = re.sub(r"\n", "", text) # 一行づつ配列に入れる時に改行文字が混じったから消しとく # print(text) print("\n\ntext clean complite!\n\n邪魔者消します") historyproto = text.split('\n\n\n\n') historyproto = list(filter(None, historyproto)) print("記事毎に分割しました\n\nnext:空要素を削除\n\n") history = [] for x in range(len(historyproto)): historyproto[x] = re.sub(r'[a-zA-Z0-9]+', "", historyproto[x]) # 英数字をすべて消す historyproto[x] = historyproto[x].replace("[]", "") # 脚注で無意味に混じった[]の削除 historyproto[x] = historyproto[x].replace("\s", "") historyproto = list(filter(None, historyproto)) proton = [line.split()[0] for line in m.parse( historyproto[x]).splitlines() if "名詞" in line.split()[-1]] if len(proton) != 0: history.append(proton) for i in range(len(history)): print("記事", i+1, "こめの単語数は\t[", len(history[i]), "]\n") print("\n", i+1, "ばんめの記事\n") print(history[i]) exit
guest

回答1

0

ベストアンサー

なぜか別の記事扱いになってます.

は、

textリストから記号などの削除(下図左)

が終わった時点で空行(改行だけの行)がたくさん存在してるから、

textを改行4つ(図だと三つになってますが四つです)でsplitして記事毎にhistory_protoに格納(下図右上)

で別の記事扱いになるのではないですかね

 
たとえば、元のファイルの

|rg_year = 2008年 |ex_rg_year = |remarks = |url_no = 1223 |map_img = |map_img_width = 275px |}} [[ファイル:展望台から見たマラッカ海峡の風景.JPG|thumb|240px|展望台から見たマラッカ海峡側の風景]]

の8行は、

年 ファイル展望台から見たマラッカ海峡の風景展望台から見たマラッカ海峡側の風景

と6行が空行になってますので、そこで別記事に分かれてしまいますよね

投稿2022/11/03 02:50

jbpb0

総合スコア7651

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問