TransWikia.com

関数を適用したときにList化されないようにするには

スタック・オーバーフロー Asked by montjeu on September 1, 2021

プログラミング初心者です。アドバイスをいただきたいです。

形態素解析をするために下記サイトなどを参考に関数を利用しようとしたところ、出力データがリスト化されてしまったので、リスト化せずに出力する方法をどなたかご教示いただけませんでしょうか。

PythonでJanomeを使って形態素解析

元のデータはData Frameでテキストが縦に並んでおります(例:ブログのタイトルが日付ごとに1列に並んでいる)

Date, Title
2020-01-01, 今日も元気だ
2020-02-02, ラッキョがうまい
.
.
.

このようなデータのTitle部分を下記関数でフィルタリングをかけて、そのまま(Data frame形式のまま?)出力したいのですが(カンマも取り除きたいです)、

def wakati_filter(text: str,
                  char_reg_filter=[("[,.(){}[]]"," ")],
                  ignore_filter=['接続詞', '接頭辞', '接尾辞', '記号', '助詞', '助動詞']):
    char_filters = [UnicodeNormalizeCharFilter()]
    for reg in char_reg_filter:
        char_filters.append(RegexReplaceCharFilter(*reg))

    tokenizer = Tokenizer()
    token_filters = [POSStopFilter(ignore_filter)]
    analyzer = Analyzer(char_filters, tokenizer, token_filters)
    return [token.surface for token in analyzer.analyze(text)]

上記関数だと出力されるデータが各単語ごとにListになってしまいます。

ext='すもももももももものうち'
wakati_filter(text)

['すもも', 'もも', 'もも', 'うち']

どのようにすればリスト形式(且つカンマ毎に単語が区切られていない)ではない形で出力できますでしょうか?

One Answer

具体的な質問内容が
「リスト形式(['すもも', 'もも', 'もも', 'うち']) → 文字列形式('すももももももうち') の変換方法を知りたい」
であると想定して回答します。

その場合はstr.joinを使うことでリストを結合して文字列に変換できます。

質問文のコードを下記のように変更します。
変更前: return [token.surface for token in analyzer.analyze(text)]
変更後: return ''.join([token.surface for token in analyzer.analyze(text)])

このようなデータのTitle部分を下記関数でフィルタリングをかけて、そのまま(Data frame形式のまま?)出力したいのですが(カンマも取り除きたいです)

Title列にmap関数wakati_filterを一括適用することができます。

サンプルコード

from janome.tokenizer import Tokenizer
from janome.analyzer import Analyzer
from janome.charfilter import UnicodeNormalizeCharFilter, RegexReplaceCharFilter
from janome.tokenfilter import POSStopFilter

def wakati_filter(text: str,
                  char_reg_filter=[("[,.(){}[]]"," ")],
                  ignore_filter=['接続詞', '接頭辞', '接尾辞', '記号', '助詞', '助動詞']):
    char_filters = [UnicodeNormalizeCharFilter()]
    for reg in char_reg_filter:
        char_filters.append(RegexReplaceCharFilter(*reg))

    tokenizer = Tokenizer()
    token_filters = [POSStopFilter(ignore_filter)]
    analyzer = Analyzer(char_filters, tokenizer, token_filters)
    return ''.join([token.surface for token in analyzer.analyze(text)])

text = 'すもももももももものうち'
print(wakati_filter(text))

import pandas as pd

df = pd.DataFrame({'Date': [pd.Timestamp('2020-01-01'), pd.Timestamp('2020-01-02')],
                  'Title': ['今日も元気だ', 'ラッキョがうまい']})
df.Title = df.Title.map(wakati_filter)
print(df)

出力内容

すももももももうち
        Date    Title
0 2020-01-01     今日元気
1 2020-01-02  ラッキョうまい

Correct answer by payaneco on September 1, 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