Derzeit bin ich Praktikant für Datenanalyse bei EXIDEA Co., Ltd., die SEO-Schreibwerkzeuge entwickelt. Es ist vier Monate her, seit ich angefangen habe zu arbeiten, aber aufgrund des Einflusses von Corona habe ich noch nie jemanden in der Firma getroffen. Aber was sind die Merkmale regelmäßiger Online-Trinkpartys und täglicher Treffen? Ich verstehe endlich. Außerdem höre ich bei den letzten monatlichen Treffen oft das Wort "Rekrutierung". Ich denke, es gibt viele Unternehmen, die Wantedly nutzen, um sich auf Rekrutierungsaktivitäten zu konzentrieren. In diesem Artikel wird der Story-Artikel von ** Wantedly eine Story sein, um die Unternehmensmerkmale und -gefühle, die Sie den Bewerbern vermitteln möchten, mithilfe des Pakets nlplot wiederzuerkennen, das die Visualisierung der natürlichen Sprache erleichtert. ** **.
Der Quellcode ist auf Github verfügbar. Nehmen Sie Kontakt mit uns auf. https://github.com/yuuuusuke1997/Article_analysis
· Mac OS ・ Python 3.7.6 ・ Jupyter-Notizbuch ・ Zsh Shell
In diesem Scraping werden wir die Webseite wie folgt umstellen und nur alle Artikel unseres Unternehmens erwerben. Vor dem Schaben werden wir dies tun, nachdem wir zuvor die Erlaubnis von Wantedly erhalten haben. Vielen Dank für Ihr Verständnis im Voraus.
Die Webseite von Wantedly lädt den nächsten Artikel, indem Sie zum Ende der Seite scrollen. Daher wird Selenium, das den Browserbetrieb automatisiert, an den minimal erforderlichen Stellen zum Erfassen von Daten verwendet. Um den Browser zu bedienen, müssen Sie einen mit Ihrem Browser kompatiblen Treiber vorbereiten und die Selenium-Bibliothek installieren. Da ich Google Chrome liebe, habe ich den Chrome-Treiber von hier heruntergeladen und in das folgende Verzeichnis gestellt. Ändern Sie außerdem * unter Benutzer entsprechend in Ihren eigenen Benutzernamen.
python
$ cd /Users/*/documents/nlplot
$ ls
article_analysis.ipynb
chromedriver
post_articles.csv
user_dic.csv
Installieren Sie die Selenium-Bibliothek mit pip.
python
$ pip install selenium
Wenn Sie mehr über Selen von der Installation bis zur Betriebsmethode erfahren möchten, lesen Sie den Artikel hier. Jetzt, wo wir fertig sind, werden wir tatsächlich kratzen.
article_analysis.ipynb
import json
import re
import time
import pandas as pd
import requests
from bs4 import BeautifulSoup as bs4
from selenium import webdriver
base_url = 'https://www.wantedly.com'
def scrape_path(url):
"""
Rufen Sie die URL der Space-Detail-Seite von der Story-Listenseite ab
Parameters
--------------
url: str
URL der Storylistenseite
Returns
----------
path_list: list of str
Liste mit der URL der Space-Detail-Seite
"""
path_list = []
response = requests.get(url)
soup = bs4(response.text, 'lxml')
time.sleep(3)
# <script data-placeholder-key="wtd-ssr-placeholder">Holen Sie sich den Inhalt
#Am Anfang des JSON-Charakters'//'Zu entfernen.string[3:]
feeds = soup.find('script', {'data-placeholder-key': 'wtd-ssr-placeholder'}).string[3:]
feed = json.loads(feeds)
# {'body'}von'spaces'Erhalten
feed_spaces = feed['body'][list(feed['body'].keys())[0]]['spaces']
for i in feed_spaces:
space_path = base_url + i['post_space_path']
path_list.append(space_path)
return path_list
path_list = scrape_path('https://www.wantedly.com/companies/exidea/feed')
def scrape_url(path_list):
"""
Rufen Sie die URL der Story-Detailseite von der Space-Detailseite ab
Parameters
--------------
path_list: list of str
Liste mit der URL der Space-Detail-Seite
Returns
----------
url_list: list of str
Liste mit URLs von Story-Detailseiten
"""
url_list = []
#Starten Sie Chrome(chromedriver befindet sich im selben Verzeichnis wie diese Datei)
driver = webdriver.Chrome('chromedriver')
for feed_path in path_list:
driver.get(feed_path)
#Scrollen Sie zum Ende der Seite und beenden Sie das Programm, wenn Sie nicht mehr scrollen können
#Höhe vor dem Scrollen
last_height = driver.execute_script("return document.body.scrollHeight")
while True:
#Scrollen Sie zum Ende der Seite
driver.execute_script('window.scrollTo(0, document.body.scrollHeight);')
#Die Selenverarbeitung ist zu schnell, um eine neue Seite zu laden. Warten Sie daher
time.sleep(3)
#Höhe nach dem Scrollen
new_height = driver.execute_script("return document.body.scrollHeight")
# last_Höhe ist neu_Scrollen Sie, bis es der Höhe entspricht
if new_height == last_height:
break
else:
last_height = new_height
continue
soup = bs4(driver.page_source, 'lxml')
time.sleep(3)
# <div class="post-space-item" >Holen Sie sich das Element von
post_space = soup.find_all('div', class_='post-content')
for post in post_space:
# <"post-space-item">von<a>Element abrufen
url = base_url + post.a.get('href')
url_list.append(url)
url_list = list(set(url_list))
#Webseite schließen
driver.close()
return url_list
url_list = scrape_url(path_list)
def get_text(url_list, wrong_name, correct_name):
"""
Holen Sie sich Text von der Story-Detailseite
Parameters
--------------
url_list: list of str
Liste mit URLs von Story-Detailseiten
wrong_name: str
Falscher Firmenname
correct_name: str
Richtiger Firmenname
Returns
----------
text_list: list of str
Liste mit Geschichten
"""
text_list = []
for url in url_list:
response = requests.get(url)
soup = bs4(response.text, 'lxml')
time.sleep(3)
# <section class="article-description" data-post-id="○○○○○○">Im<p>Holen Sie sich alle Elemente
articles = soup.find('section', class_='article-description').find_all('p')
for article in articles:
#Durch Trennzeichen aufgeteilt
for text in re.split('[\n!?!?。]', article.text):
#Vorverarbeitung
replaced_text = text.lower() #Kleinbuchstabenumrechnung
replaced_text = re.sub(wrong_name, correct_name, replaced_text) #Konvertieren Sie den Firmennamen in Großbuchstaben
replaced_text = re.sub(r'https?://[\w/:%#\$&\?\(\)~\.=\+\-…]+', '', replaced_text) #URL entfernen
replaced_text = re.sub('[0-9]', '', replaced_text) #Zahlen ausschließen
replaced_text = re.sub('[,:;-~%()]', '', replaced_text) #Ersetzen Sie das Symbol durch ein Leerzeichen halber Breite
replaced_text = re.sub('[,:; · ~% () "" "【】 (Lol)]', '', replaced_text) #Ersetzen Sie das Symbol durch ein Leerzeichen halber Breite
replaced_text = re.sub(' ', '', replaced_text) # \Entfernen Sie u3000
text_list.append(replaced_text)
text_list = [x for x in text_list if x != '']
return text_list
text_list = get_text(url_list, 'exidea', 'EXIDEA')
Speichern Sie den abgerufenen Text in einer CSV-Datei.
nlplot_articles.ipynb
df_text = pd.DataFrame(text_list, columns=['text'])
df_text.to_csv('post_articles.csv', index=False)
Von hier aus werde ich mit der Installation von MeCab und verschiedenen Vorbereitungen beginnen, aber es wird nicht so gut funktionieren, wie ich es erwartet hatte, und mein Herz wird gebrochen, also hoffe ich, dass es zu Motivation führt.
Warum machst du überhaupt eine so mühsame Aufgabe? Wenn Sie der Meinung sind, dass Sie nur auf einmal auf $ Brew Install Mecab klicken können, sind Sie es vielleicht. Um jedoch das gewünschte Ergebnis der morphologischen Analyse mit nlplot zu erhalten, muss der Zeichencode im Benutzerwörterbuch bei UTF-8 registriert werden, wobei der firmenspezifische Abteilungsname und das Firmenwort als richtige Nomenklatur verwendet werden. Als Ergebnis der einfachen Installation mit Brew wurde der Zeichencode zu EUC-JP, und ich musste mir zweimal die Mühe machen. Wenn Sie sich also an das Ausgabeergebnis halten möchten, probieren Sie die Methode von nun an aus. Wenn Sie es einfach ausprobieren möchten, installieren Sie es bitte mit Brew unter Bezugnahme auf Folgendes.
Vorbereiten der Umgebung für die Verwendung von MeCab auf einem Mac
MeCab Verwenden Sie von der offiziellen Website den Befehl curl, um ** MeCab selbst ** und ** IPA-Wörterbuch ** herunterzuladen. Installieren Sie es diesmal in der lokalen Umgebung. Zunächst wird MeCab selbst installiert.
python
#Erstellen Sie das Installationsverzeichnis von mecab in der lokalen Umgebung
$ mkdir /Users/*/opt/mecab
$ cd /Users/*/opt/mecab
#Im aktuellen Verzeichnis-o Download durch Angabe des Dateinamens mit der Option
$ curl -Lo mecab-0.996.tar.gz 'https://drive.google.com/uc?export=download&id=0B4y35FiV1wh7cENtOXlicTFaRUE'
#Entpacken Sie die Quellcodedatei
$ tar zxfv mecab-0.996.tar.gz
$ cd mecab-0.996
#Zeichencode UTF-Überprüfen Sie, ob es kompiliert werden kann, indem Sie 8 angeben
$ ./configure --prefix=/Users/*/opt/mecab --with-charset=utf-8
#Kompilieren Sie das von configure erstellte Makefile
$ make
#Überprüfen Sie vor der Installation, ob es ordnungsgemäß funktioniert
$ make check
#Binärdatei zusammengestellt von make/Users/*/opt/Auf dem Mecab installieren
$ make install
Done
Wenn Sie sich fragen, was konfigurieren, machen, installieren ist, kann hier hilfreich sein.
Nachdem Sie es installiert haben, gehen Sie den Pfad durch, damit Sie den Befehl mecab ausführen können.
python
#Überprüfen Sie den Shell-Typ
$ echo $SHELL
/bin/zsh
# .Pfad zu zshrc hinzufügen
$ echo 'export PATH=/Users/*/opt/mecab/bin:$PATH' >> ~/.zshrc
"""
Hinweis:Zuletzt per Login-Shell(~/.zshrc)Veränderung
Beispiel) $ echo 'export PATH=/Users/*/opt/mecab/bin:$PATH' >> ~/.bash_profile
"""
#Reflektiert die Shell-Einstellungen
$ source ~/.zshrc
#Überprüfen Sie, ob der Pass bestanden wurde
$ which mecab
/Users/*/opt/mecab/bin/mecab
Done
Referenzartikel: Was ist PATH?
python
#Wechseln Sie in das Startverzeichnis
$ cd /Users/*/opt/mecab
#Im aktuellen Verzeichnis-o Download durch Angabe des Dateinamens mit der Option
$ curl -Lo mecab-ipadic-2.7.0-20070801.tar.gz 'https://drive.google.com/uc?export=download&id=0B4y35FiV1wh7MWVlSDBCSXZMTXM'
#Entpacken Sie die Quellcodedatei
$ tar zxfv mecab-ipadic-2.7.0-20070801.tar.gz
$ cd mecab-ipadic-2.7.0-20070801
#Zeichencode UTF-Überprüfen Sie, ob es kompiliert werden kann, indem Sie 8 angeben
$ ./configure --prefix=/Users/*/opt/mecab --with-charset=utf-8
#Kompilieren Sie das von configure erstellte Makefile
$ make
#Binärdatei zusammengestellt von make/Users/*/opt/Auf dem Mecab installieren
$ make install
Done
#Bestätigung des Zeichencodes
#Der Zeichencode ist EUC-Für JP UTF-Wechseln Sie zu 8
$ mecab -P | grep config-charset
config-charset: EUC-JP
#Sucheinstellungsdatei
$ find /Users -name dicrc
/Users/*/opt/mecab/mecab-ipadic-2.7.0-20070801/dicrc
$ vim /Users/*/opt/mecab/mecab-ipadic-2.7.0-20070801/dicrc
[Vor Änderung] config-charset = EUC-JP
[Nach Änderung] config-charset = UTF-8
$ mecab
Ich werde Menschen aufhalten! Jojo
Mein Substantiv,Gleichbedeutend,Allgemeines,*,*,*,ich,mich,mich
Ist ein Assistent,Hilfe,*,*,*,*,Ist,C.,Beeindruckend
Menschliche Nomenklatur,Allgemeines,*,*,*,*,Mensch,Ningen,Ningen
Hilfs,Fallassistent,Allgemeines,*,*,*,Zu,Wo,Wo
Verb beenden,Unabhängigkeit,*,*,Ein Schritt,Grundform,Halt,Yamel,Yamel
Zo Assistent,Letzte Hilfe,*,*,*,*,Es tut mir Leid,Zo,Zo
!! Symbol,Allgemeines,*,*,*,*,!,!,!
Jojo Nomen,Proprietäre Nomenklatur,Organisation,*,*,*,*
EOS
#Überprüfen Sie das IPA-Wörterbuchverzeichnis
$ find /Users -name ipadic
/Users/*/opt/mecab/lib/mecab/dic/ipadic
python
#Wechseln Sie in das Startverzeichnis
cd /Users/*/opt/mecab
#Laden Sie den Quellcode von github herunter
$ git clone --depth 1 https://github.com/neologd/mecab-ipadic-neologd.git
$ cd mecab-ipadic-neologd
#Geben Sie auf dem Bildschirm "Ja" ein, um das Ergebnis auszuführen und zu überprüfen
$ ./bin/install-mecab-ipadic-neologd -n
Done
#Bestätigung des Zeichencodes
#Der Zeichencode ist EUC-Für JP UTF-Wechseln Sie zu 8
$ mecab -d /Users/*/opt/mecab/lib/mecab/dic/mecab-ipadic-neologd -P | grep config-charset
config-charset: EUC-JP
#Sucheinstellungsdatei
$ find /Users -name dicrc
/Users/*/opt/mecab/lib/mecab/dic/mecab-ipadic-neologd/dicrc
$ vim /Users/*/opt/mecab/lib/mecab/dic/mecab-ipadic-neologd/dicrc
[Vor Änderung] config-charset = EUC-JP
[Nach Änderung] config-charset = UTF-8
#Überprüfen Sie das Verzeichnis des NEologd-Wörterbuchs
$ find /Users -name mecab-ipadic-neologd
/Users/*/opt/mecab/lib/mecab/dic/mecab-ipadic-neologd
$echo „Ich verlasse die Menschen!| mecab -d /Users/*/opt/mecab/lib/mecab/dic/mecab-ipadic-neologd
"Symbol,Klammern öffnen,*,*,*,*,“,“,“
Ich werde Menschen aufhalten! Substantiv,Proprietäre Nomenklatur,Allgemeines,*,*,*,Ich werde Menschen verlassen!,Orehaningen Woyamerzo,Orewaningen Oyamelzo
Jojo Nomen,Allgemeines,*,*,*,*,*
EOS
Github-Beamter: mecab-ipadic-neologd
python
#Endlich pip, um Mecab mit Python3 verwenden zu können
$ pip install mecab-python3
Das Benutzerwörterbuch erstellt Wörter, die das Systemwörterbuch nicht verarbeiten kann, indem es dem Benutzer eine Bedeutung gibt.
Erstellen Sie zunächst eine CSV-Datei entsprechend dem Format des Wortes, das Sie hinzufügen möchten. Visualisieren Sie es einmal und wenn es ein Wort gibt, das Sie interessiert, versuchen Sie, das Wort zur CSV-Datei hinzuzufügen.
python
"""
Format
Oberflächentyp,Linke Kontext-ID,Richtige Kontext-ID,Kosten,Teil,Teil細分類1,Teil細分類2,Teil細分類3,Nutzungsart,Nutzungsart,Prototyp,lesen,Aussprache
"""
#Erstellung einer CSV-Datei
$ echo 'Praktikant,-1,-1,1,Substantiv,Allgemeines,*,*,*,*,*,*,*,Praktikant Sag'"\n"'Kernwert,-1,-1,1,Substantiv,Allgemeines,*,*,*,*,*,*,*,Kernwert'"\n"'Treffen Sie sich,-1,-1,1,Substantiv,Allgemeines,*,*,*,*,*,*,*,Treffen Sie sich' > /Users/*/Documents/nlplot/user_dic.csv
#Überprüfen Sie den Zeichencode der CSV-Datei
$ file /Users/*/Documents/nlplot/user_dic.csv
/users/*/documents/nlplot/user_dic.csv: UTF-8 Unicode text
Kompilieren Sie als Nächstes die erstellte CSV-Datei in ein Benutzerwörterbuch.
python
#Erstellen Sie ein Zielverzeichnis für das Benutzerwörterbuch
$ mkdir /Users/*/opt/mecab/lib/mecab/dic/userdic
"""
-d Verzeichnis mit Systemwörterbuch
-u Benutzer-Wo kann man das Wörterbuch speichern?
-f Zeichencode der CSV-Datei
-t Benutzerwörterbuch-Zeichencode/Wo soll die CSV-Datei gespeichert werden?
"""
##Erstellen Sie ein Benutzerwörterbuch
/Users/*/opt/mecab/libexec/mecab/mecab-dict-index \
-d /Users/*/opt/mecab/lib/mecab/dic/mecab-ipadic-neologd \
-u /Users/*/opt/mecab/lib/mecab/dic/userdic/userdic.dic \
-f utf-8 -t utf-8 /Users/*/Documents/nlplot/user_dic.csv
# userdic.Bestätigen Sie, dass dic fertig ist
$ find /Users -name userdic.dic
/Users/*/opt/mecab/lib/mecab/dic/userdic/userdic.dic
Nachdem wir Mecab installiert und ein Benutzerwörterbuch erstellt haben, werden wir mit der morphologischen Analyse fortfahren.
Referenzartikel: Hinzufügen von Wörtern
Laden Sie zunächst die während des Scrapings erstellte CSV-Datei.
nlplot_articles.ipynb
df = pd.read_csv('post_articles.csv')
df.head()
In nlplot möchten wir Sätze Wort für Wort ausgeben, daher führen wir eine morphologische Analyse mit Nomenklatur durch.
article_analysis.ipynb
import MeCab
def download_slothlib():
"""
Laden Sie SlothLib und erstellen Sie ein Stoppwort
Returns
----------
slothlib_stopwords: list of str
Liste mit Stoppwörtern
"""
slothlib_path = 'http://svn.sourceforge.jp/svnroot/slothlib/CSharp/Version1/SlothLib/NLP/Filter/StopWord/word/Japanese.txt'
response = requests.get(slothlib_path)
soup = bs4(response.content, 'html.parser')
slothlib_stopwords = [line.strip() for line in soup]
slothlib_stopwords = slothlib_stopwords[0].split('\r\n')
slothlib_stopwords = [x for x in slothlib_stopwords if x != '']
return slothlib_stopwords
stopwords = download_slothlib()
def add_stopwords():
"""
Fügen Sie Stoppwörter hinzu, um Stoppwörter zu stoppen
Returns
----------
stopwords: list of str
Liste mit Stoppwörtern
"""
add_words = ['Sehen', 'Unternehmen', 'Ich würde es gerne tun', 'Mit allen Mitteln', 'Geschichte', '弊Unternehmen', 'Mensch', 'Was', 'Artikel', 'Außer', 'Hmm', 'von', 'Mich', 'Sa', 'so was']
stopwords.extend(add_words)
return stopwords
stopwords = add_stopwords()
def tokenize_text(text):
"""
Extrahieren Sie nur die Nomenklatur durch morphologische Analyse
Parameters
--------------
text: str
Im Datenrahmen gespeicherter Text
Returns
----------
nons_list: list of str
Eine Liste, die nach morphologischer Analyse nur die Nomenklatur enthält
"""
#Geben Sie das Verzeichnis an, in dem das Benutzerwörterbuch und das neologd-Wörterbuch gespeichert sind
tagger = MeCab.Tagger('-d /Users/*/opt/mecab/lib/mecab/dic/mecab-ipadic-neologd -u /Users/*/opt/mecab/lib/mecab/dic/userdic/userdic.dic')
node = tagger.parseToNode(text)
nons_list = []
while node:
if node.feature.split(',')[0] in ['Substantiv'] and node.surface not in stopwords:
nons_list.append(node.surface)
node = node.next
return nons_list
df['words'] = df['text'].apply(tokenize_text)
article_analysis.ipynb
df.head()
python
$ pip install nlplot
3-2. uni-gram
nlplot_articles.ipynb
import nlplot
#Geben Sie die Wörter von df an
npt = nlplot.NLPlot(df, taget_col='words')
# top_Top 2 Wörter, die häufig in n vorkommen, min_Geben Sie mit freq häufige Unterwörter an
#Top 2 Wörter: ['Unternehmen', 'Arbeitsplätze']
stopwords = npt.get_stopword(top_n=2, min_freq=0)
npt.bar_ngram(
title='uni-gram',
xaxis_label='word_count',
yaxis_label='word',
ngram=1,
top_n=50,
stopwords=stopwords,
save=True
)
3-3. bi-gram
nlplot_articles.ipynb
npt.bar_ngram(
title='bi-gram',
xaxis_label='word_count',
yaxis_label='word',
ngram=2,
top_n=50,
stopwords=stopwords,
save=True
)
3-4. tri-gram
nlplot_articles.ipynb
npt.bar_ngram(
title='tri-gram',
xaxis_label='word_count',
yaxis_label='word',
ngram=3,
top_n=50,
stopwords=stopwords,
save=True
)
3-5. tree map
nlplot_articles.ipynb
npt.treemap(
title='tree map',
ngram=1,
stopwords=stopwords,
width=1200,
height=800,
save=True
)
3-6. wordcloud
nlplot_articles.ipynb
npt.wordcloud(
stopwords=stopwords,
max_words=100,
max_font_size=100,
colormap='tab20_r',
save=True
)
nlplot_articles.ipynb
npt.build_graph(stopwords=stopwords, min_edge_frequency=13)
display(
npt.node_df, npt.node_df.shape,
npt.edge_df, npt.edge_df.shape
)
npt.co_network(
title='All sentiment Co-occurrence network',
color_palette='hls',
save=True
)
3-8. sunburst chart
nlplot_articles.ipynb
npt.sunburst(
title='All sentiment sunburst chart',
colorscale=True,
color_continuous_scale='Oryel',
width=800,
height=600,
save=True
)
Referenzartikel: Die Bibliothek "nlplot", die natürliche Sprachen leicht visualisieren und analysieren kann, wurde veröffentlicht
Durch die Visualisierung hatte ich das Gefühl, die Aktionsrichtlinie "The share", die EXIDEA erneut schätzt, verkörpern zu können. Insbesondere ist die Aktie glücklich und aufrichtig. Und Altruistic spielt in dem Artikel eine herausragende Rolle, und als Ergebnis konnte ich Freunde treffen, die über das beste Arbeitsumfeld, das, was ich erreichen möchte, und meine Sorgen sprechen können. Obwohl es immer noch selten vorkommt, dass ich in meiner täglichen Arbeit einen Beitrag zum Unternehmen leisten kann, möchte ich das maximieren, was ich jetzt tun kann, z. B. mich voll und ganz der anstehenden Aufgabe widmen und sie nach außen senden.
In diesem Artikel konnte ich die Bedeutung der Vorverarbeitung bekräftigen. Ich begann mit dem Wunsch, nlplot auszuprobieren, aber als ich es ohne Vorverarbeitung visualisierte, wurde die richtige Nomenklatur in Morphologie auf Bi-Gramm und Tri-Gramm angezeigt, und das Ergebnis war katastrophal. Es hat sich gelohnt und ich denke, der beste Vorteil war, dass ich bei der Installation von Mecab und der Erstellung eines Benutzerwörterbuchs etwas über Linux lernen konnte. Anstatt es als Wissen zu erwerben, werde ich es für zukünftiges Lernen nutzen, um die grundlegende Sache, meine Hände tatsächlich zu bewegen, nicht zu vernachlässigen.
Es ist lange her, aber danke, dass Sie so weit gelesen haben. Wenn Sie Fehler finden, wäre ich Ihnen sehr dankbar, wenn Sie in den Kommentaren darauf hinweisen könnten.
Recommended Posts