質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.34%

  • Python

    9180questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

  • Python 3.x

    7387questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

  • 機械学習

    763questions

    機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

  • 自然言語処理

    138questions

    自然言語処理は、日常的に使用される自然言語をコンピューターに処理させる技術やソフトウェアの総称です。

python 自然言語処理について

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 474

---stax---

score 73

表題の件でアドバイスを頂きたいです。

テキストデータを読み込み、形態素解析を行い、word2vecでベクトル化させるという部分をpythonでコードを書き、学習しています。
次のステップとして、主軸となるワードに対して一緒に用いられる頻度が高い単語の抽出が出来たらと考えています。

上記の内容が'共起'ということを指しているのかなと思い調べてみたのですが、あてはまる内容を見つけられず、プログラミングもサンプルを見ながらでしか書き進めることが出来ないレベルなのでどういったモジュールを使うのか、どのように共起している単語の抽出を実装していけばよいか分からず悩んでいます。
調べ方が悪いのだと思いますが、そもそも自分がやろうとしている共起している単語の抽出はpythonを用いて実装することは可能でしょうか?
またどのように学習していけばよいかアドバイスを頂きたいです。
機械学習、自然言語処理ついて勉強し始めたばかりで知識もないので的外れな内容かもしれませんがよろしくお願いいたします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+1

主軸となるワードって何ですか・・・

共起語の抽出自体は、形態素解析さえできていれば(なにをもって共起と考えるのかにもよりますが)簡単にできます。word2vecは不要です。練習だと思ってpure pythonで書いてみては。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/24 10:30

    回答ありがとうございます。
    分かりにくくて申し訳ありません主軸となるワードは、自分が検索したい単語を指しています
    例えば主軸となるワードとして’シリンダ’と入力すれば同じ文に同時に出現する頻度の高い’動作不良’等が抽出できることを目標としています。
    pure pythonについても触れたことがないので併せて調べてみます

    キャンセル

  • 2018/05/24 10:36

    ごめんなさい、pure pythonは「ただの(ライブラリとかに頼らない)pythonプログラム」という意味です・・・
    文中の共起を計算したいのですか? それともテキスト中? そのへんによって微妙に話が変わってきます

    キャンセル

  • 2018/05/24 11:18

    ありがとうございます。
    文章中の共起は”ラーメンを食べにいって凄く美味しかった”というような文があったとすると(例が下手ですいません)
    ”ラーメン”に対して”美味しい”などが共起語と理解しています。
    一方のテキスト中の共起とはどういうイメージでしょうか・・・?
    自分の今の状況としましては何万行あるトラブルデータが一つのテキストファイルに記述されており、その内容に対して名詞で形態素解析するという段階まではできています。
    その中から任意のワードを指定すると、任意のワードと一緒によくつかわれる単語を抽出したいです。
    単語の群はテキストファイルを元に作っているのですが、共起していると認識させるのは文章で判断すると思うのでおそらく自分がやりたいのは文中の共起なのかな?と思っています・・・。
    目的とする事があいまいで申し訳ありません。

    キャンセル

  • 2018/05/24 11:25

    テキスト中の共起とは、
    「池袋に行った。駅前のラーメン屋に寄ったらすごく美味しかった。また行きたいな。」
    を1文書として、「池袋・ラーメン」とか「池袋・行きたい」まで共起語とするだけで、概念的には文中の共起とさほど変わりません。
    まあ、文中共起をやりたいということでしたら、自分で書くのも簡単ですし、実はこういう手があったり・・・
    https://stackoverflow.com/questions/35562789/word-word-co-occurrence-matrix

    キャンセル

  • 2018/05/24 11:49

    ありがとうございます。
    やりたいことはテキスト中の共起でもあるような気がしてきました・・・
    参考リンクもありがとうございます。
    まずは何とか参考にしながら進めてみます。

    キャンセル

  • 2018/05/24 22:31

    何度も申し訳ございません。
    頂いたリンクのコードを試してみたのですが正直全然理解できませんでした・・・

    rom sklearn.feature_extraction.text import CountVectorizer
    docs = ['this this this book',
    'this cat good',
    'cat good shit']
    count_model = CountVectorizer(ngram_range=(1,1)) # default unigram model
    X = count_model.fit_transform(docs)
    Xc = (X.T * X) # this is co-occurrence matrix in sparse csr format
    Xc.setdiag(0) # sometimes you want to fill same word cooccurence to 0
    print(Xc.todense()) # print out matrix in dense format

    count_model.vocabulary_


    結果
    [[0 0 0 0 3]
    [0 0 2 1 1]
    [0 2 0 1 1]
    [0 1 1 0 0]
    [3 1 1 0 0]]

    {'book': 0, 'cat': 1, 'good': 2, 'shit': 3, 'this': 4}

    上記の内容がBag-of-Wordsを指しているのかと思い、知識もなかったのでまずは概要を調べています。
    単語の出現頻度を表しているというのは何となく理解できるのですが、どのように活用するのかイメージが沸かず悩んでいます。
    Bag-of-Wordsで表した物を、自分が目的としている共起している単語の抽出につなげるにはどのような知識が必要でしょうか?
    おそらくほとんど答えに近いアドバイスを頂いていると思うのですが質問を重ねてしまい申し訳ありませんがよろしくお願いいたします。

    キャンセル

  • 2018/05/24 22:53

    ドキュメントとその回答の英語をよく読んでくださいな。Xが何を表しているのかと、 (X.T * X)の式が何を表しているのか、ぜんぶドキュメントとその回答に書いてあります。あとは自分で小さいプログラムを動かしてみたり、手計算したりすれば理解できるはずです。
    ちなみに活用するには引きたい単語に該当する行か列を取ります。

    キャンセル

+1

テキストから単語を取り出すには、テキストの形態素解析を行い、特定の種類の形態素(例えば、名詞と形容詞)を抽出します。(英語などはスペース文字で単語が分かれているので単語に切り分けるのが容易ですが、日本語はスペースを入れませんから形態素解析するのが普通です)

'共起'は対象範囲が定まれば機械的に判断できます。1つのテキストブロック(文、段落、章、頁)から抽出された単語群を'共起語集合'とすれば良いわけですから。(文、段落、章、頁の区切りは判りますよね)

共起関係、共起語集合、などの単語でWeb検索して見つかった、情報処理学会や言語処理学会の論文に目を通してみると思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/24 10:33

    回答ありがとうございます。
    形態素解析自体はjanomeを使用して実装出来ました。
    なにか特別なモジュール等を使用するのかと考えていましたが、教えて頂いたキーワードでもっと概要についても調べてみます。

    キャンセル

+1

gensimの中にmost_similarという関数があるので、試してみてはいかがでしょうか。これは所定の単語に近似したベクトルを有した単語を抽出するものなので、何らかの方法で得た主軸となる単語とオプションパラメーターを設定して呼び出せば、とりあえず結果は出ます。ただし、学習そのものがうまくいっていないと結果も使えないものが出力されるので、適宜、モデルのチューニングをしてください

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/24 10:53

    回答ありがとうございます。
    word2vec_model = word2vec.Word2Vec.load('C:/Users/Desktop/data.model')
    ttt = word2vec_model.wv.most_similar(positive=['不良'], topn=9)
    for item in ttt:
    print(item[0], item[1])

    冷却 0.6006556749343872
    01 0.5672667026519775
    4 0.47878962755203247
    座 0.43691882491111755
    PE 0.4153861999511719
    02 0.40251225233078003
    面 0.3871880769729614
    固定 0.3771429657936096
    測定 0.35740208625793457

    上記のようには表示させることが出来ています。
    この表示されているのは意味が類似している単語と認識しているのですが、この結果が共起語とイコールなのでしょうか?
    理解しきれていない状態で申し訳ありません

    キャンセル

  • 2018/05/24 22:49

    なるほど、共起(あるワードに対するその前後に出現するワードの確率)が欲しいのですね。
    そうすると、most_similarではなく、predict_output_wordかと思います。詳細は、gensimのサイトにAPIリファレンスがあるのでこちらで確認するといいかと思います。
    https://radimrehurek.com/gensim/index.html

    キャンセル

  • 2018/05/25 10:27

    回答ありがとうございます。
    さっそく試してみました。
    word2vec_model = word2vec.Word2Vec.load('C:/Users/Desktop/data.model')

    kkk = ['不良']
    testmodel = word2vec_model.predict_output_word(kkk,topn=10)
    print(testmodel)

    [('03', 0.61715645), ('02', 0.38265774), ('3', 0.00016280386), ('-', 1.9871653e-05), ('排出', 1.6483687e-06), ('搬送', 1.0329422e-06), ('st', 1.6281716e-08), ('新人', 4.291772e-09), ('断', 3.795836e-09), ('連動', 3.4870768e-09)]

    model.predict_output_word(kkk,topn=10)の引数で渡すリストの作り方は、共起の主軸となる単語をリストに入れて引数としたのですがこの方法は理解が間違っていますか?

    キャンセル

  • 2018/05/25 18:08

    predict_output_wordのアウトプットは引数のワードに対し、その前後に出現する確率の高いワードとその確率です。お示しいただいた結果からいうと、不良という単体のワードの場合、03というワードが61.7%の確率で出現することが読み取れます

    キャンセル

同じタグがついた質問を見る

  • Python

    9180questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

  • Python 3.x

    7387questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

  • 機械学習

    763questions

    機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

  • 自然言語処理

    138questions

    自然言語処理は、日常的に使用される自然言語をコンピューターに処理させる技術やソフトウェアの総称です。