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

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

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

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

自然言語処理

自然言語処理は、日常的に使用される自然言語をコンピューターに処理させる技術やソフトウェアの総称です。

Q&A

解決済

2回答

1583閲覧

【自然言語処理】品詞分類の第1階層だけを正規表現で抜き出す

xdgy

総合スコア4

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

自然言語処理

自然言語処理は、日常的に使用される自然言語をコンピューターに処理させる技術やソフトウェアの総称です。

0グッド

0クリップ

投稿2020/10/02 16:08

自然言語処理で、単語に品詞付けを行い、品詞が以下のように表示されたとします.
(1)名詞-普通名詞-副詞可能
(2)助動詞(助動詞の下には下位分類が存在しないので,もともと第一階層までしか表示されない)

(1)の場合は,次のコードで第一階層の”名詞”のみを抜き出すことができます.

python

1>>> m = re.match(r"(.*?)(?=-)","名詞-普通名詞-副詞可能") 2>>> m.group() 3'名詞'

しかし,(2)に対して同じパターンを用いると,"-"が品詞情報の中に存在しないので,何もマッチしません.

python

1>>> m = re.match(r"(.*?)(?=-)","助動詞") 2>>> m.group() 3Traceback (most recent call last): 4 File "<stdin>", line 1, in <module> 5AttributeError: 'NoneType' object has no attribute 'group'

if文などを使ってソース文字列に"-"が存在するかしないかで場合分けをして対処することもできなくはないですが,同じパターンを用いて,第三階層まで存在する場合でも,第一階層しか存在しない場合でも,きちんと第一階層だけを抽出できるような書き方は存在しますでしょうか?

なお,pythonのバージョンは,3.7.6です.

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

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

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

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

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

guest

回答2

0

正規表現を使うのであれば、先読み部分を(?=-|$)に変えれば、「直後に-があるか、行末である位置」にマッチします。

>>> import re >>> m = re.match(r"(.*?)(?=-|$)","名詞-普通名詞-副詞可能") >>> m.group() '名詞' >>> m = re.match(r"(.*?)(?=-|$)","助動詞") >>> m.group() '助動詞' >>>

投稿2020/10/02 22:47

Daregada

総合スコア11990

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

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

xdgy

2020/10/03 09:37

なるほど,「または」を使えばエラーが出なくて済みますね. この度は回答ありがとうございました.
guest

0

ベストアンサー

品詞情報のフォーマットが質問の形式で固定なのであれば、無理に正規表現を使う必要はないと思います。

python

1case1 = "名詞-普通名詞-副詞可能" 2case2 = "助動詞" 3 4print(case1.split("-")[0]) 5# 名詞 6print(case2.split("-")[0]) 7# 助動詞

Paiza.IOでの実行例

str.split は区切り文字が無かった場合に、文字列全体を1要素として持つlistを返すようになっています。
そのため、想定している区切り文字を使ってsplitを呼び出せば、第1要素は必ず第1階層になります。

投稿2020/10/02 16:21

編集2020/10/02 16:23
attakei

総合スコア2740

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

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

xdgy

2020/10/03 09:35

確かに正規表現を使う必要もありませんでしたね. 第二階層までを抽出する場合の拡張性を考えて,ベストアンサーに選ばせていただきました.すなわち,第二階層まで抽出するなら, >>> '-'.join(case1.split('-')[:2]) '名詞-普通名詞' >>> '-'.join(case2.split('-')[:2]) '助動詞'
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問