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

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

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

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

Q&A

解決済

1回答

902閲覧

【python】自然言語処理でテキストから日本語の名刺だけ抽出したい

studyprg

総合スコア57

Python

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

0グッド

0クリップ

投稿2022/07/05 08:11

編集2022/07/05 11:26

やりたいこと

自然言語処理について勉強しています。
Wikipediaのxmlデータからテキストを抜き出して処理をしようと思ってます。
抜き出したテキストは用意できましたが,テキスト中にリンクやタグ,数字などがあるので前処理としてテキストクリーニングしてテキストから日本語の名詞部分のみを抽出したいのですが,指定したい正規表現がわからなくて困ってます.
(*調査時にMeCabに通すときに日本語文字列の名刺だけピックアップできればいいのではないかなとも思いました.)

取り除きたいものは(re.subで’’に置き換えたい)
0. tag(<title>,<id>,<text>など)
1.http〜などのリンク部分(英語も全て)
2.無駄なスペース
3.数字(5や1994など)

プログラミングはあまり得意ではないです。
日本語の名詞だけを抜き出した後,重複単語を除いた単語リストを作成し,word2vecで単語間の類似度を算出したリストを生成したいです.

実行環境

Macbook pro(2017)
OS:11.6.7

以下に現在のソースコードを貼り付けます。

idf_test.py

1# -*- coding: utf-8 -*- 2import MeCab 3from tqdm import tqdm 4from gensim.models.doc2vec import Doc2Vec 5import pandas as pd 6import math 7import re 8print("モデルロード") 9model = Doc2Vec.load("jawiki.doc2vec.dbow300d.model") 10myfile = open('history_0text.txt') 11# 以下に抽出したい文textここをファイルを読み込むように変更 12 13text = myfile.read() 14m = MeCab.Tagger("-Ochasen") 15mp = MeCab.Tagger() 16# m.parse("") 17print("処理開始") 18removeW = re.compile( 19 '[!"#$%&\'\\\\()*+,-./:;<=>?@[\\]^_`{|}~「」〔〕“”〈〉『』【】&*・()$#@。、?!`+¥% ]') 20 21 22text = removeW.sub('', text) 23print("text clesn complite!") 24# print(text) 25# f=open('simw_d2v_2.txt',"w") 26#paragraf =mp.parse(text).split('\n') 27nouns = [line.split()[0] for line in m.parse(text).splitlines() 28 if "名詞" in line.split()[-1]] # ここをへんこうする 29for str in nouns: 30 str.split() 31 32 # type:strで格納済み 33# print(nouns)#中身の確認 34a = 0 35l_size = len(nouns) 36b = 0 37simd = {} 38simt = [] 39wsimx = {} 40wsimid = {} 41eject = [] 42 43# ここで重複単語の除外 44print("重複単語除外") 45nouns2 = [] 46for x in nouns: 47 if not x in nouns2: 48 nouns2.append(x) 49 50l_size2 = len(nouns2) 51# print(nouns2) 52# print(l_size2,"単語") 53listn = [[None]*l_size2 for i in range(l_size2)] 54# 辞書の作成key=nouns2,value=none 55for x in nouns2: 56 simd.setdefault(x, []) 57 58# 処理 本体 59 60print("計算中") 61for a in range(0, l_size2): 62 l_size2 = len(nouns2) 63 print(l_size2) 64 w1 = nouns2[a] 65 # simw=[for i in range(l_size2)] 66 print("単語:(", w1,")", a+1, "回目") 67 68 # simw[a].append(w1) 69 for b in range(0, l_size2): 70 print(b) 71 w2 = nouns2[b] 72 if w2 not in model.docvecs: 73 eject.append(w2) 74 nouns2.remove(w2) 75 # print("deleated\t:"+w2) 76 continue 77 78 sim = model.docvecs.similarity(w1, w2) 79 listn[a][b] = sim 80 81 if sim >= 0.8: 82 # print(w1,"類義語:",w2) 83 84 simd[w1].append(w2) 85 86 # print("類語 ",w1,":",simd[w1]) 87 88print("処理を", a+1, "回実行しました") 89for k, v in simd.items(): 90 print("単語", k, "値:", v) 91 92 93# 類語辞書作成 94 95 96print("makeing simdictionaly...") 97samw = 0 98for i in range(0, l_size2): 99 wsimid[i] = 0 100 # print(wsimid) 101 for alpha in simd.keys(): 102 list1 = simd.get(alpha) 103 if i <= 140: 104 # print(i,list1) 105 for x in list1: 106 # c=nouns.count(x) 107 # xid=wsimx.get(x) 108 # print(x,":",c) 109 #samw += c 110 wsimx.setdefault(x, i) 111 # wsimid[xid]=wsimid.get(xid)+c 112 # wsimid[xid]=c 113 i += 1 114 115 116print("単語からid辞書", wsimx) 117print("idから出現個数リスト(値は0)", wsimid) 118 119 120 121

欲しい出力の一例です。これから数字も除外したいです。

sample

1#text = "湖山池 湖山池 は 鳥取 県 鳥取 市 に ある 湖 で ある なお 池 と 付く 湖沼 の 中 で は 日本 の 広 さ で も ある 姉妹 湖 として 島根 県 の 神西湖 が ある 湖山池 は 、 鳥取 で は 中海 の に 大きい 湖沼 で 古代 に 日本海 から し た 場所 が 砂丘 の 発達 や 堆積 により 海 と さ れ て でき た 海 跡 湖 で も ある 。 大小 の 小島 が 浮かぶ の 島 の 青島 に は から 架橋 さ れ て おり の 木 が 植え られ た 道路 で 徒歩 や 自転車 により する こと が でき キャンプ も 数 本 の が 、 川 によって 日本海 と 結ば れ て おり 鳥取 市 郊外 の 地 の と なっ て いる 地区 で は 的 に も 珍しい 石 漁 が に 行わ れ 石 の に 潜む を 棒 で つつい て する で 、 県 の 文化財 に さ れ て いる の 自治 や NPO が に 努め て い て 、 間 中 に は 石 祭 も 行わ れる 。 姉妹 湖 の 神西湖 シジミ も よく 穫 れる 。 広大 な を 有し て い た 長者 が 、 日没 まで に 田植え が 終わら なかっ た 扇子 で を 招き 返し て 田植え を 終え た が 、 一夜 明ける と 田 は 池 に 変わっ て い た という 長者 の 伝説 が 知ら れ て いる 似 た よう な 話 が 岐阜 市 の が 池 に 伝わっ て いる 古く から 開け た 地域 で あり 青島 周辺 に は 縄文 時代 から 弥生 時代 にかけて の 遺跡 が また 時代 に は 東側 の 湖畔 に 守護 所 で ある 天神山 城 が 置か れ 西側 の 湖畔 に 突き出 た 半島 に は 国人 領主 の 吉岡 氏 の 居城 だっ た が 築か れ た は JR 山陰本線 駅 駅 1995 年 7 月 27 日 鳥取 駅 が 加わっ た また 、 鳥取 駅 駅 の 間 で は 南 に 池 の 美しい 風景 が 見える ちなみに の 海 は 松林 で ある 。 2013 年 3 月 、 アザラシ が 発見 さ れ た 。 2012 年 3 月 に が と なっ た 川 を通じて 日本海 から 入っ て き た と 考え られる 2 2014 年 10 月 19 日 約 30 年 に 船 の を 3 画像 青島 石 が ま 歌川 脚注 脚注 の 国土 地理 院 2018 年 10 月 1 日 平成 30 年 都道府県 面積 調 湖沼 面積 2019 年 2 月 3 日 閲覧 日本 の 池 、 水門 鳥取 初 の 化 47 2012 年 3 月 12 は 濃度 の 上昇 に 伴い 環境 が 変化 し た 存在 し ない 類 が し から し て い た 類 が 絶滅 し つつ ある ニュース 山陰放送 山陰放送 2014 年 10 月 20 日 閲覧 関連 に は 湖山池 に 関連 する カテゴリ が あり ます 日本 の 湖沼 天神山 城 石 漁 東郷池 鳥取 県 中部 に ある 湖 で は も 池 と 呼ぶ " 2 3

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

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

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

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

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

quickquip

2022/07/05 08:43 編集

このコードが何で、何のために貼ったのかの説明と、質問が書かれていないようです。何を答えたらいいのか分かりません。
melian

2022/07/05 09:03

数字を除外すると、例えば「1995 年 7 月 27 日」は「年 月 日」、「約 30 年」は「約 年」となってしまいますが、それで構いませんか?
quickquip

2022/07/05 09:09

> 欲しい出力の一例です。 の、 "は", "に" は助詞です。"ある", "付く" は動詞です。"なお"は(ここでは)接続詞です。 名詞だけ抽出したい と 欲しい出力の一例 のどちらを信じたらいいでしょう。
studyprg

2022/07/05 09:15

日本語の名詞だけを抽出したいです.数字もいりません.
quickquip

2022/07/05 09:18

質問を編集してください。コードも「関係ない」と書いてある部分があるみたいなのでそこら辺は削除した方がいいと思います。
tuyioj

2022/07/05 19:11

コラボラトリーで動くwikiからスクレイピングして重複したものを削除した状態で名詞を出す一例 ```python import re import requests#webからデータを持ってくるやつ from bs4 import BeautifulSoup#持ってきたHTMLを加工するやつ? #スクレイピング処理の大枠---------------------------------------------------------- url = 'https://ja.wikipedia.org/wiki/%E6%B9%96%E5%B1%B1%E6%B1%A0' res = requests.get(url) e=[]#後でねじ込む用の配列 soup = BeautifulSoup(res.text, "html.parser") soup2 = soup.find(class_="mw-parser-output")#WIKIのメインのクラス for element in soup2.find_all("p"):# その中のp(段落だけ) e.append(element.text)#一行づつ表示される段落を配列に入れていく e = ''.join(e) #配列を一つの文字列にしてる #-------------------------------------------------------------------------------------------- #テキストクリーニング?--------------------------------------------------- e=re.sub(r"\n", "",e)#一行づつ配列に入れる時に改行文字が混じったから消しとく e=re.sub(r'[a-zA-Z0-9]+', "", e)#英数字をすべて消す e=e.replace("[]", "")#脚注で無意味に混じった[]の削除 e #---------------------------------------------------------------------------------------- #コメントアウトしてるけどMeCab使うならコメント外して回す #!apt install aptitude #!aptitude install mecab libmecab-dev mecab-ipadic-utf8 git make curl xz-utils file -y #!pip install mecab-python3==0.7 #使うテキストと単語帳っぽいもの text = e m = MeCab.Tagger("-Ochasen") #テキストを単語帳の単語(文節?)で区切る nouns = [line for line in m.parse(text).splitlines() if "名詞" in line.split()[-1]] a=[]#文節で分けられたやつを配列に入れて for str in nouns: a.append(str.split()) b=[]#配列の0番目に入ったオリジナル?を重複を消して配列に入れる for i in range(len(a)): b.append(a[i][0]) print(list(set(b))) ``` 正直質問の長いコードの中で何をしているのか何が出来ないのかがわからないから適当にやったけど 正規表現とかMeCabとか単語は拾えてるんだからもうちょっと今やっていることをまとめれると助かる 最近になってpythonでプログラム組むようになった人間だけど上のやつは python スクレイピング re.sub 正規表現 数字 mecab 名詞 抽出 これで出てきたやつのコピペと軽い修正で出来てるからそこそこ単語拾えてるならいけるはず
studyprg

2022/07/06 02:14

ありがとうございます. ベストアンサーにしたいので解答に記述していただけませんか?
guest

回答1

0

ベストアンサー

python

1import re 2import requests#webからデータを持ってくるやつ 3from bs4 import BeautifulSoup#持ってきたHTMLを加工するやつ? 4 5#スクレイピング処理の大枠---------------------------------------------------------- 6url = 'https://ja.wikipedia.org/wiki/%E6%B9%96%E5%B1%B1%E6%B1%A0' 7res = requests.get(url) 8 9e=[]#後でねじ込む用の配列 10 11soup = BeautifulSoup(res.text, "html.parser") 12soup2 = soup.find(class_="mw-parser-output")#WIKIのメインのクラス 13for element in soup2.find_all("p"):# その中のp(段落だけ) 14e.append(element.text)#一行づつ表示される段落を配列に入れていく 15 16e = ''.join(e) #配列を一つの文字列にしてる 17#-------------------------------------------------------------------------------------------- 18 19#テキストクリーニング?--------------------------------------------------- 20e=re.sub(r"\n", "",e)#一行づつ配列に入れる時に改行文字が混じったから消しとく 21e=re.sub(r'[a-zA-Z0-9]+', "", e)#英数字をすべて消す 22e=e.replace("[]", "")#脚注で無意味に混じった[]の削除 23e 24#---------------------------------------------------------------------------------------- 25 26#コメントアウトしてるけどMeCab使うならコメント外して回す 27#!apt install aptitude 28#!aptitude install mecab libmecab-dev mecab-ipadic-utf8 git make curl xz-utils file -y 29#!pip install mecab-python3==0.7 30 31#使うテキストと単語帳っぽいもの 32text = e 33m = MeCab.Tagger("-Ochasen") 34 35#テキストを単語帳の単語(文節?)で区切る 36nouns = [line for line in m.parse(text).splitlines() 37if "名詞" in line.split()[-1]] 38 39a=[]#文節で分けられたやつを配列に入れて 40for str in nouns: 41a.append(str.split()) 42 43b=[]#配列の0番目に入ったオリジナル?を重複を消して配列に入れる 44for i in range(len(a)): 45b.append(a[i][0]) 46print(list(set(b)))

投稿2022/07/06 03:56

tuyioj

総合スコア13

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問