
[code]

    text = open("test.txt",encoding="utf-8")
    t = text.read()
    sentence = t.split("\n")
    
    for tt in sentence:
        tt = tt.replace(",","") #　,を削除
        tt = tt.replace(".","") #　.を削除
        tt = tt.replace(";","") #　;を削除
        tt = tt.replace("?","") #  ?を削除
        tt = tt.replace("!","") #  !を削除
        words = tt.split() 
       #小文字でもOKにしたい
        swords = [] 
        for s in words:             
            ss = s.lower()    
            swords.append(ss)
    
    
    k = input("検索ワードを入力")
    if words.count(k) >= 1:
        print("合計で",words.count(k),"回出てきます。") 
        while words.count(k) >= 1: 
            print(words.index(k),"番目") 
    　      words.remove(k)
    
    elif swords.count(k) >= 1:
        print("合計で",swords.count(k),"回出てきます") 
        while swords.count(k) >= 1:
            print(swords.index(k),"番目") 
            swords.remove(k)
    
    else:
        print("お探しの単語は見つかりませんでした。")
    text.close()
    
[/code]

上のwordsというリストを作成する際にsentence内の1文目の文だったらwords1という名前にして文単位で何文目に検索した単語があるか調べるようなものにしたいのですが詰まってしまいました。ご教授願いたいです。よろしくお願いします。


CC BY-SA 3.0
2017-09-19T04:47:22.697
38030
2017-10-24T14:46:45.607
2017-09-19T04:50:14.037
754
25468
question
python3
Pythonで、ファイルから文章を取り込み、検索した単語がどの文に含まれていて何回出てくるか検索するようなものを作ってみたいのです。文ごとにリストを作製してそこから検索する際にforなどを用いて文ごとにリストを作製することはできないでしょうか。


とりあえず検索した単語の出現回数を調べる部分は作ってみました。

[code]

    import re
    from collections import Counter
    
    pattern = "[,.;?!]"
    # test.txtの中身はここの紹介文を使いました
    # http://englishmail.org/business/shokai_1.html
    with open("test.txt", encoding="utf-8") as txt:
        t = txt.read()
    sentence = t.split("\n")
    
    p = re.compile(pattern)
    result = []
    lower_result = []
    
    for s in sentence:
        replaced_sentence = re.sub(p, "", s)
        words = replaced_sentence.split()
        result.extend(words)
    
        lower_result.extend([word.lower() for word in words])
    
    cnt = Counter(result)
    lower_cnt = Counter(lower_result)
    
    k = input()
    
    if cnt.get(k, 0):
        print("合計で{}回出てきます".format(cnt.get(k)))
    elif lower_cnt.get(k, 0):
        print("合計で{}回出てきます".format(lower_cnt.get(k)))
    else:
        print("お探しの単語は見つかりませんでした。")
    
[/code]

ところで元のソースコードに対して2点気になったところがあったので下にまとめます。

## with構文を使いましょう

[code]

    # こちらのコードは
    text = open("test.txt",encoding="utf-8")
    t = text.read()
    text.close()
    
    # 下のようにclose文を省略できます！
    with open("test.txt",encoding="utf-8") as text
        t = text.read()
    
[/code]

## 文字の出現頻度はcollections.Counterを使うと便利です

[code]

    from collections import Counter
    Counter(["Google", "Apple", "Microsoft", "Apple"])
    >>> Counter({'Apple': 2, 'Google': 1, 'Microsoft': 1})
    
[/code]

参考リンク:  
<https://docs.python.jp/3/library/collections.html#collections.Counter>  
<https://qiita.com/hatchinee/items/a904c1f8d732a4686c9d>


CC BY-SA 3.0
2017-10-24T14:46:45.607
39006
2017-10-24T14:46:45.607
25868
38030
answer