スタック・オーバーフロー 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))
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
Get help from others!
Recent Answers
Recent Questions
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP