Python 3のテキスト解析

書籍/ドキュメントのコンテンツ分析 書かれたテキスト内のパターンは、すべての著者または言語にわたって同じではありません。これにより、言語学者は原産地の言語または潜在的なテキストの著者名を研究することができます。 目的:このケーススタディでは、さまざまな著者やさまざまな言語の書籍コレクションに含まれる個々の書籍のプロパティを調べます。具体的には、書籍の長さ、ユニークな単語の数、およびこれらの属性が言語によってどのように分類されるかを調べます。作家。 出典:プロジェクトグーテンベルクは、書籍の最も古いデジタル図書館です。文化作品をデジタル化し、アーカイブすることを目的としており、現在、50,000冊以上の書籍が含まれています。これらすべての本をサブフォルダEnglish、French、German、PotugeseのあるBooksという名前のフォルダにまとめて入れてください。 テキスト内の単語頻度 それで、私たちはテキストの単語頻度を数える関数を構築するつもりです。我々はサンプルのテストテキストを検討するでしょう、そして後でサンプルテキストを今ダウンロードした本のテキストファイルで置き換えるでしょう。単語の頻度を数えるため、大文字と小文字は同じです。テキスト全体を小文字に変換して保存します。

🐶Pythonコードの例を示すで

text = "This is my test text. We're keeping this text short to keep things manageable."
text = text.lower()

🐶動画で動作確認してみよか?

動画で確認

単語の頻度はさまざまな方法で数えることができます。2つの方法(知識のためだけ)をコーディングします。1つはforループを使用し、もう1つはコレクションのCounterを使用します。これは前の方法よりも高速です。キーと値のペアとしてのユニークな単語の辞書とその出現頻度。

🐶Pythonコードの例を示すで

from collections import Counter

def count_words(text):                   #counts word frequency
    skips = [".", ", ", ":", ";", "'", '"']
    for ch in skips:
        text = text.replace(ch, "")
    word_counts = {}
    for word in text.split(" "):
        if word in word_counts:
            word_counts[word]+= 1
        else:
            word_counts[word]= 1
    return word_counts

    # >>>count_words(text)  You can check the function


def count_words_fast(text):      #counts word frequency using Counter from collections
    text = text.lower()
    skips = [".", ", ", ":", ";", "'", '"']
    for ch in skips:
        text = text.replace(ch, "")
    word_counts = Counter(text.split(" "))
    return word_counts

    # >>>count_words_fast(text) You can check the function

🐶動画で動作確認してみよか?

動画で確認

出力は、サンプルテキストの固有の単語をキーとして、各単語の頻度を値として保持する辞書です。両方の関数の出力を比較すると、次のようになります。

{'は':1、 'は':1、 '管理可能':1、 '〜':1、 'もの':1、 '維持':1、 '私':1、 'テスト':1、テキスト ':2、' keep ':1、' short ':1、' this ':2} カウンター({'テキスト':2、 'this':2、 'were':1、 'is':1、 '管理可能':1、 'to':1、 'もの':1、 '維持':1 、 'マイ':1、 'テスト':1、 'キープ':1、 'ショート':1}) Pythonで本を読む:それ以来、サンプルテキストで単語頻度関数をテストすることに成功しました。次に、テキストファイルとしてダウンロードした本で関数をテキスト化します。read_bookという関数を作成します。 Pythonで本を読んでそれを変数に長い文字列として保存し、それを返します。関数のパラメータは、読み込まれるbook.txtの場所になり、関数の呼び出し中に渡されます。

🐶Pythonコードの例を示すで

def read_book(title_path):  #read a book and return it as a string
    with open(title_path, "r", encoding ="utf8") as current_file:
        text = current_file.read()
        text = text.replace("\n", "").replace("\r", "")
    return text

🐶動画で動作確認してみよか?

動画で確認

ユニークワードの総数:word_stats()という別の関数を設計します。これは、単語頻度辞書(count_words_fast()/ count_words()の出力)をパラメータとして取ります。この関数は、ユニークワードの総数(sum)を返します。Tupleとして、単語頻度辞書の/ totalキー)とそれらの総数をまとめて保持するdict_values。

🐶Pythonコードの例を示すで

def word_stats(word_counts):     # word_counts = count_words_fast(text)    
    num_unique = len(word_counts)
    counts = word_counts.values()
    return (num_unique, counts)

🐶動画で動作確認してみよか?

動画で確認

関数を呼び出す:それでは、最後に、たとえば本を読みます。たとえば、ロミオとジュリエットの英語版で、関数から単語の出現頻度、ユニークな単語、ユニークな単語の総数などの情報を収集します。

🐶Pythonコードの例を示すで

text = read_book("./Books / English / shakespeare / Romeo and Juliet.txt")

word_counts = count_words_fast(text)          
(num_unique, counts) = word_stats(word_counts)
print(num_unique, sum(counts))  

私たちが作成した関数の助けを借りて、私たちはロミオとジュリエットの英語版に5118のユニークな単語があり、ユニークな単語の頻度の合計が最大40776まであることを知るようになりました。本の中で&上記の機能の助けを借りてそれらについて知るために異なるバージョンの本、異なる言語の本と遊ぶことができます。 本の特徴をプロットする (i)ブックの長さとmatplotlibを使用して異なる言語のすべてのブックのユニークな単語の数。列として本に関する情報を保持するパンダデータフレームを作成するためにパンダをインポートします。これらの列を分類します。 言語著者タイトル長さユニークなど、さまざまなカテゴリで分類します。本の長さをx軸に沿って、ユニークな単語の数をy軸に沿ってプロットするには、次のようにコーディングします。

🐶Pythonコードの例を示すで

import os
import pandas as pd

book_dir = "./Books"
os.listdir(book_dir)

stats = pd.DataFrame(columns =("language", "author", "title", "length", "unique"))
# check >>>stats
title_num = 1
for language in os.listdir(book_dir):
    for author in os.listdir(book_dir+"/"+language):
        for title in os.listdir(book_dir+"/"+language+"/"+author):
            inputfile = book_dir+"/"+language+"/"+author+"/"+title
            print(inputfile)
            text = read_book(inputfile)
            (num_unique, counts) = word_stats(count_words_fast(text))
            stats.loc[title_num]= language, author.capitalize(), title.replace(".txt", ""),  
            sum(counts), num_unique
            title_num+= 1
import matplotlib.pyplot as plt
plt.plot(stats.length, stats.unique, "bo-")

plt.loglog(stats.length, stats.unique, "ro")

stats[stats.language =="English"] #to check information on english books

plt.figure(figsize =(10, 10))
subset = stats[stats.language =="English"]
plt.loglog(subset.length, subset.unique, "o", label ="English", color ="crimson")
subset = stats[stats.language =="French"]
plt.loglog(subset.length, subset.unique, "o", label ="French", color ="forestgreen")
subset = stats[stats.language =="German"]
plt.loglog(subset.length, subset.unique, "o", label ="German", color ="orange")
subset = stats[stats.language =="Portuguese"]
plt.loglog(subset.length, subset.unique, "o", label ="Portuguese", color ="blueviolet")
plt.legend()
plt.xlabel("Book Length")
plt.ylabel("Number of Unique words")
plt.savefig("fig.pdf")
plt.show()

2つのグラフをプロットしました。最初のグラフは、異なる言語および著者のすべての本を単なる本として表しています。最初のグラフの赤い点は1冊の本を表し、青い線で接続されています。 2番目のグラフは、異なる言語の本(英語は赤、フランス語は緑など)を別々の点として表示する対数プロットです。   これらのグラフは、鮮やかな起源のさまざまな本について視覚的に分析するのに役立ちます。グラフから、ポルトガル語の本はドイツ語または英語の本よりも長さが長く、ユニークな単語の数が多いことがわかりました。言語学者を助けます。

Last Updated: 5/19/2019, 1:46:25 AM