📜  Python 3中的文本分析

📅  最后修改于: 2020-05-04 14:52:32             🧑  作者: Mango

书本/文档的内容分析

书面文本中的模式在所有作者或语言中都不尽相同,这使语言学家可以研究原著语言或可能没有直接了解这些特征的文本的潜在作者身份,例如《美国革命》的联邦主义者论文。
目的:在本案例研究中,我们将研究来自不同作者和不同语言的书籍集中的各个书籍的属性,更具体地说,我们将研究书籍的长度,唯一单词的数量以及这些属性如何通过或的语言进行聚类作者身份。

资料来源: 古腾堡计划是最古老的数字图书图书馆,旨在对文化作品进行数字化和存档,目前包含50,000本书,这些书籍以前都已出版,现在可通过电子方式获得,请从此处下载其中的一些英语和法语书籍而葡萄牙和德国的书籍在这里为analysis.Put所有这些书一起在子文件夹英语,法语,德语和Potugese一个文件夹,名为书籍。

文字中的词频

因此,我们将构建一个可对文本中的单词频率进行计数的函数,我们将考虑一个示例测试文本,然后将示例文本替换为我们刚刚下载的书籍的文本文件。计算单词的频率,因此大写和小写字母是相同的。我们将整个文本转换为小写并保存。

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

可以以多种方式计算单词频率,我们将使用两种方式(仅出于知识目的)进行编码:一种使用for循环,另一种使用Collection中的Counter,这被证明比前一种更快,该函数将返回唯一词字典及其频率作为键值对。因此,我们编写以下代码:

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)  您可以检查函数
def count_words_fast(text):      # 使用来自集合的计数器计算单词频率
    text = text.lower()
    skips = [".", ", ", ":", ";", "'", '"']
    for ch in skips:
        text = text.replace(ch, "")
    word_counts = Counter(text.split(" "))
    return word_counts
    # >>>count_words_fast(text) 您可以检查函数

输出:输出是一个字典,将示例文本的唯一单词作为键,每个单词的频率作为值,比较这两个函数的输出,我们得到:

{‘were’: 1, ‘is’: 1, ‘manageable’: 1, ‘to’: 1, ‘things’: 1, ‘keeping’: 1, ‘my’: 1, ‘test’: 1, ‘text’: 2, ‘keep’: 1, ‘short’: 1, ‘this’: 2}
Counter({‘text’: 2, ‘this’: 2, ‘were’: 1, ‘is’: 1, ‘manageable’: 1, ‘to’: 1, ‘things’: 1, ‘keeping’: 1, ‘my’: 1, ‘test’: 1, ‘keep’: 1, ‘short’: 1})

用Python阅读书籍:自此,我们成功地用示例文本测试了词频函数。现在,我们将书籍中的函数文本化,并以文本文件的形式下载。我们将创建一个名为read_book的函数。 将使用Python读取我们的书籍,并将其保存为长字符串并保存在变量中,然后将其返回。该函数的参数将是要读取的book.txt的位置,并将在调用该函数时传递。

def read_book(title_path):  # 读一本书并以字符串形式返回
    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()的输出)作为参数。该函数将返回唯一单词总数(和) /词频字典中的/ total键)和一个dict_values,将它们的总数作为一个元组存储在一起。

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

调用函数:因此最后,我们要读一本书,例如罗密欧与朱丽叶的英文版,并从函数中收集有关词频,唯一词,唯一词总数的信息。

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

借助我们创建的函数,我们发现罗密欧与朱丽叶的英语版本中有5118个唯一单词,并且这些单词的出现频率总和总计为40776. 我们可以知道哪个单词出现得最多可以通过上述功能与不同版本的书,不同语言的书一起玩,以了解它们及其统计信息。

绘制书籍的特征

我们将导入pandas创建一个pandas数据框架,该框架将书籍中的信息作为列保存。我们将这些列分类按“语言”,“作者”,“标题”,“长度”和“唯一”之类的不同类别。要绘制沿x轴的书本长度和沿y轴的唯一字数,请编写以下代码:

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()

输出:我们绘制了两个图表,第一个图表代表每本使用不同语言和作者的书,简直就是一本书。第一个图表中的红点代表一本书,并由蓝线连接。对数图创建离散点[这里的线性图创建了连接这些点的线性曲线[这里是蓝色]。

第二个图是对数图,它显示了具有不同颜色的不同语言的书本(红色代表英语,绿色代表法语,等等)作为离散点。
这些图有助于从视觉上分析有关生动来源的不同书籍的事实,从图中我们知道葡萄牙语书籍的长度更长,并且比德语或英语书籍具有更多的独特单词,对这些数据进行绘图证明非常有用帮助语言学家。