goo blog サービス終了のお知らせ 

dak ブログ

python、rubyなどのプログラミング、MySQL、サーバーの設定などの備忘録。レゴの写真も。

epub 形式のファイルから本文のテキストを抽出する方法

2020-07-23 15:04:55 | python
epub 形式のファイルから本文のテキストを抽出する方法のメモ。

epub 形式のファイルでは、本文が p タグに記述されているため、p タグ内のテキストを抽出します。
ただし、ruby タグなど他のタグが含まれる場合があるため、不要なタグを除去する必要があります。
import lxml.etree
import ebooklib
from ebooklib import epub

def remove_tag(elem):
    text = lxml.etree.tostring(elem, encoding='utf-8').decode('utf-8')
    text = re.sub('(?:.*?|.*?)','', text)
    text = re.sub('<.*?>', '', text)
    return text

epub_path = "{epubファイル}"
book = epub.read_epub(epub_path)

for item in book.get_items_of_type(ebooklib.ITEM_DOCUMENT):
    dom = lxml.html.fromstring(item.get_content())
    text_nodes = dom.xpath("//p")
    for text_node in text_nodes:
        text = remove_tag(text_node)
        print(text)



python で主成分分析

2020-06-28 19:47:28 | python
python で主成分分析を行う方法のメモ

以下でランダムに生成した10次元のベクトルを2次元に変換します。
import random
import numpy as np
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA

# 乱数で 10 次元ベクトル x 1000個を生成
xs = []
for i in range(1000):
    x = [random.uniform(0, 1) for j in range(10)]
    xs.append(x)

# numpy に変換
xs_ns = np.array(xs)
print('元データ(10次元)')
print(xs_ns)

# 標準化
sc = StandardScaler()
xs_std = sc.fit_transform(xs_ns)

# PCA で 2次元に縮退
pca = PCA(n_components=2)
xs_pca = pca.fit_transform(xs_std)

# 2次元ベクトル x 1000個
print('2次元に変換')
print(xs_pca)


python の http.client で html をダウンロードする方法

2019-12-21 14:22:07 | python
python の http.client で html をダウンロードする方法のメモ。

requests.get(url) で簡単に html をダウンロードできましたが、
url にポート番号を入れたらダウンロードできなかったので、
http.client を使ってみました。
import http.client

host = 'localhost' # ホスト名
port = 5104 # ポート番号
request_path = '/index' # パス

conn = http.client.HTTPConnection(host, port)

conn.request('GET', request_path)
response = conn.getresponse()

conn.close()

html = response.read().decode('utf-8')
print(html)


python で excel ファイルを生成する方法

2019-12-08 16:39:36 | python
python で excel ファイルを生成する方法のメモ。

pandas で excel ファイルを生成することができます。
import pandas as pd

data = [['colun_a', 'column_b'],
        [1, 2],
        [3, 4],
        [5, 6],
        ]

# 出力
df = pd.DataFrame(data)
df.to_excel(ファイル名, index=False, header=False)


■実行結果
以下のデータの excel ファイルが生成されます。
colun_a	column_b
1	2
3	4
5	6




python で excel ファイルを読み込む方法

2019-12-08 16:24:28 | python
python で excel ファイルを読み込む方法のメモ。

pandas で excel ファイルの読み書きを行うことができます。
import pandas as pd

# excel ファイルを読み込み
df = pd.read_excel(ファイル名, シート番号(0オリジン), index_col=None)

# 行数・列数
num_rows = df.shape[0]
num_cols = df.shape[1]

# データ参照
for r in range(0, num_rows):
    for c in range(0, num_cols):
        # セルの値を参照
        val = df.iat[r, c]

        # 標準出力に出力
        print("[%d, %d]: %s" % (r, c, val))


python でのリスト操作方法

2019-11-16 20:02:19 | python
python でのリスト操作方法のメモ。

■リストの末尾に要素を追加 (スタックの push)
items = [0, 1, 2, 3]
items.append(4)
items
-> [0, 1, 2, 3]


■リストの末尾の要素を削除 (スタックの pop)
items = [0, 1, 2, 3, 4]
a = items.pop()
a
-> 4
items
-> [0, 1, 2, 3]


■リストの連結
items = [0, 1, 2, 3, 4]
items.extend([5, 6, 7])
items
-> [0, 1, 2, 3, 4, 5, 6, 7]



■リストの先頭に要素を追加
items = [0, 1, 2, 3]
items.insert(0, -1)
items
-> [-1, 0, 1, 2, 3]


■リストの先頭から要素を削除
items = [-1, 0, 1, 2, 3]
a = items.pop(0)
a
-> -1
items
-> [0, 1, 2, 3]



pythonでキャラクタコードと文字の変換すす方法のメモ

2019-11-12 00:45:11 | python
pythonでキャラクタコードと文字の変換する方法のメモ。

ord(文字) で指定文字のキャラクタコードを取得できます。
>>> ord('a')
97


chr(コード) で指定コードの文字を取得できます。
>>> chr(97)
'a'


a から z まで繰り返すには以下のようにします。
for code in range(ord('a'), ord('z')+1):
    print('%s' % (chr(code)))


python でライブラリのパスを指定する方法

2019-11-07 23:34:17 | python
python でライブラリのパスを指定する方法のメモ。

ライブラリを読み込む際、読み込み元からのライブラリとの相対パスで以下のように指定します。
import sys
import os

sys.path.append(os.path.dirname(os.path.abspath(__file__)) + '/読み込み元からのライブラリとの相対パス')


libディレクトリにライブラリがある場合、以下を指定します。
sys.path.append(os.path.dirname(os.path.abspath(__file__)) + '/lib')


nmslibの使い方のメモ

2019-11-07 23:24:44 | python
nmslibの使い方のメモ

■インデックス生成
vectors = numpy.array(numpy.array([...], ,dtype='float32'))

indexer = nmslib.init(method='hnsw', space='cosinesimil')
num = indexer.addDataPointBatch(vectors) # num: インデックス数
indexer.createIndex({'post': 2}, print_progress=True)


■インデックス保存
indexer.saveIndex(fname)


■インデックス読み込み
indexer = nmslib.init(method='hnsw', space='cosinesimil')
indexer.loadIndex(fname)


■検索
arg_vector = numpy.array([...], dtype='float32')
res = indexer.knnQuery(arg_vector, 10)

ids = res[0] # IDのリスト
dists = res[1] # 距離のリスト


pip でバージョンを指定してパッケージをインストールする方法

2019-10-20 14:44:32 | python
pip でバージョンを指定してパッケージをインストールする方法のメモ。

pip install パッケージ名==バージョン

例えば、以下のように使います。
$ pip install nmslib==1.6.3
Collecting nmslib==1.6.3
  Downloading https://files.pythonhosted.org/packages/56/02/83e77d9cbe5a8e3593c06974331b548e61f161b8af7f91b21399161e5366/nmslib-1.6.3.tar.gz (366kB)
...


numpyのマルチスレッドの並列数の指定方法

2019-08-15 13:21:24 | python
numpy のマルチスレッドの並列数の指定方法のメモ。

sklearn.cluster.KMeans を実行したら、CPU使用率が 700% に達していて
まわりのご迷惑になっていたため、並列数を指定する必要がありました。

k-means で使われている numpy の並列数は環境変数の OMP_NUM_THREADS で
指定することができます。
export OMP_NUM_THREADS={並列数}

とすだけで、指定した並列数でプログラムを実行することができます。