スタック・オーバーフロー Asked by montjeu on September 1, 2021
プログラミング初心者です。アドバイスをいただきたいです。
形態素解析をするために下記サイトなどを参考に関数を利用しようとしたところ、出力データがリスト化されてしまったので、リスト化せずに出力する方法をどなたかご教示いただけませんでしょうか。
元のデータは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)
['すもも', 'もも', 'もも', 'うち']
どのようにすればリスト形式(且つカンマ毎に単語が区切られていない)ではない形で出力できますでしょうか?
具体的な質問内容が
「リスト形式(['すもも', 'もも', 'もも', 'うち']
) → 文字列形式('すももももももうち'
) の変換方法を知りたい」
であると想定して回答します。
その場合は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
Get help from others!
Recent Questions
Recent Answers
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP