TransWikia.com

Pythonでjoin関数を使用するときにピリオドやカンマでは間を開けないようにしたい

スタック・オーバーフロー Asked by NPP on January 7, 2021

前提・実現したいこと

前の質問「文中の単語を大文字から小文字に変換する時に、固有名詞や文頭の語だけ除外する方法について」に関連する質問で、問題はPythonのjoin関数の使い方です。

プログラムで入力と出力が以下のようになっているのですが、それをピリオドやカンマ、アポストロフィーでは空白をなくした形にしたいです。

#入力
Kate forgot John's login ID, and was not able to use the computer.

#出力
Kate forgot John 's login id , and was not able to use the computer .

#求めたい出力
Kate forgot John's login id, and was not able to use the computer.

問題と試したこと

現在の出力は以下のようになっており、

Kate forgot John 's login id , and was not able to use the computer .

join関数の" "(空白)をなくすとprint("".join(conved))、以下の出力になり、どうすれば求めたい出力を得られるjoin関数の使い方をできるのかわからない状態です。

KateforgotJohn'sloginid,andwasnotabletousethecomputer.

実行中のコード

import nltk

sentences = """Kate forgot John's login ID, and was not able to use the computer.
"""

def replace_if_all_uppercase(word):
    # もし単語のすべての文字が大文字ならば、すべて小文字に変換
    if all(map(lambda w: w.isupper(), word[0].split())):
        return word[0].lower()
    
    return word[0]
    

for sentence in sentences.splitlines():
    # nltkを使って分かち書き&品詞の取得
    tokens = nltk.word_tokenize(sentence)
    tagged = nltk.pos_tag(tokens)
    conved = list(map(lambda s: replace_if_all_uppercase(s), tagged))
    print(" ".join(conved))

2 Answers

Python Untokenize a sentence - Stack Overflow が参考になりそうです。

私はこのnltkに詳しくないですし(というか今初めて使いました)、質問者さんも join をお使いになりたいようなので、joinを使っている回答を参考にします。

import nltk
import string

sentences = """Kate forgot John's login ID, and was not able to use the computer.
"""

def replace_if_all_uppercase(word):
    # もし単語のすべての文字が大文字ならば、すべて小文字に変換
    if all(map(lambda w: w.isupper(), word[0].split())):
        return word[0].lower()
    
    return word[0]
    

for sentence in sentences.splitlines():
    # nltkを使って分かち書き&品詞の取得
    tokens = nltk.word_tokenize(sentence)
    tagged = nltk.pos_tag(tokens)
    conved = list(map(lambda s: replace_if_all_uppercase(s), tagged))

    print("".join([" "+i if not i.startswith("'") and i not in string.punctuation else i for i in conved]).strip())

joinを使っている回答のコメント部分が少し気になりますが、質問者さんが欲している文字列は今回取得できました。

実行結果:

Kate forgot John's login id, and was not able to use the computer.

おそらく質問者さんであれば、本家の他の回答が参考にできるかもしれません。

Correct answer by shingo.nakanishi on January 7, 2021

以下は functools.reduce() を使う方法です。

from functools import reduce

         :

for sentence in sentences.splitlines():
    # nltkを使って分かち書き&品詞の取得
    tokens = nltk.word_tokenize(sentence)
    tagged = nltk.pos_tag(tokens)
    conved = list(map(lambda s: replace_if_all_uppercase(s), tagged))
    print(reduce(
      lambda x, y: x+y if y.startswith(('.', ',', "'")) else x+' '+y, conved))

=>
Kate forgot John's login id, and was not able to use the computer.

Answered by metropolis on January 7, 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