XML論文からキーワードを抽出し、ワードクラウドで表示[Python]
ElsevierやSpringerなどのオンラインジャーナルは、一般的に、論文がXMLで提供されている。XMLで提供された論文からは、タイトルやアブストラクトや本文が取り出しやすいため、テキスト解析に重宝する。
今回はXML論文からキーワードをPositionRankアルゴリズムにより自動抽出し、キーワードをワードクラウドで表示するまでのスクリプトを貼る。
抽出の流れとしては、まず、自作パーサーを使って、XML論文からタイトルとアブストラクトを抽出し、次に、タイトルとアブストラクトをPosition Rankに入力し、キーワードを抽出。最後に、抽出されたキーワードを辞書で表し、ワードクラウド関数に入力し、PNG画像として結果を得ている。
出版社とのライセンス契約があるため、入力の論文XMLと出力のワードクラウドを見せることはできないが、コードだけでもどこかで役に立つと思い、掲示する。
実装に使用したリポジトリは以下である。 PositionRank: https://github.com/ymym3412/position-rank WordCloud: https://github.com/amueller/word_cloud
import refrom position_rank import position_rankfrom tokenizer import StanfordCoreNlpTokenizerfrom pathlib import Pathfrom matplotlib import pyplot as pltfrom wordcloud import WordCloudimport collectionsfrom tqdm import tqdmimport pandas as pd
class parse():
def __init__(self): pass
def fetch_meta(self, xml: str) -> str: title = self._xml_parser(xml, r'(.+?)') abst = self._xml_parser(xml, r'(.+?)')
return title, abst
def _xml_parser(self, xml: str, pattern: str) -> str: result = "" xml = xml.replace('\n', '') matchs = re.finditer(pattern, xml) for match in matchs: result = match.groups()[0]
result = re.sub(r"", "", result)
return result
if __name__ == "__main__":
xml_path = Path("./XML")
tokenizer = StanfordCoreNlpTokenizer("http://localhost", port = 9000)
all_key_word_list = []
parse = parse()
for xml in tqdm(xml_path.glob("*.XML")):
with open(xml, "r") as f: xml_str = xml.read_text()
title, abstract = parse.fetch_meta(xml_str)
key_word_list = position_rank(title + abstract, tokenizer)
all_key_word_list += key_word_list
c = collections.Counter(all_key_word_list) c = dict(c)
df = pd.DataFrame.from_dict(c, orient='index') df.to_csv("./freq.csv")
wc = WordCloud().fit_words(c)
fig = plt.figure(figsize=(16, 12), dpi=800) plt.imshow(wc) plt.axis('off') fig.savefig("wordcloud.png")