自然言語処理モジュール

自然言語処理

self_NL.py

レポートやノートの分析の基礎となる「分かち書き」や「文書ベクトル」の計算をします。また、文書ベクトルから文書間の一致度を計算する「cos類似度」を計算したり、csvファイルに保存されているレポート(フィールド名「loginid」に学籍番号、フィールド名「tassei」に計算対象の文章)間の一致度を計算します。

  1. from janome.tokenizer import Tokenizer

  2. t = Tokenizer()


  3. import pandas as pd

  4. import numpy as np


  5. #わかち書き関数

  6. def wakachi(text):

  7. tokens = t.tokenize(text)

  8. docs=[]

  9. for token in tokens:

  10. docs.append(token.surface)

  11. return docs


  12. #わかち書き関数(品詞付き)

  13. def wakachi_part(text,parts):

  14. tokens = t.tokenize(text)

  15. docs=[]

  16. docp=[]

  17. for token in tokens:

  18. if parts in token.part_of_speech:

  19. docs.append(token.surface)

  20. docp.append(token.part_of_speech)

  21. return docs,docp


  22. #文書ベクトル

  23. def docs_vec(documents):

  24. from sklearn.feature_extraction.text import TfidfVectorizer

  25. docs = np.array(documents)

  26. vectorizer = TfidfVectorizer(analyzer=wakachi)

  27. vecs = vectorizer.fit_transform(docs)

  28. return vecs.toarray()


  29. #文書ベクトル(単語を含む)

  30. def docs_vec2(documents):

  31. from sklearn.feature_extraction.text import TfidfVectorizer

  32. docs = np.array(documents)

  33. vectorizer = TfidfVectorizer(analyzer=wakachi)

  34. vecs = vectorizer.fit_transform(docs)

  35. return vecs.toarray(),pd.DataFrame(vecs.toarray(), columns=vectorizer.get_feature_names())


  36. def docs_cos(docs):

  37. from sklearn.metrics.pairwise import cosine_similarity

  38. cs_array = np.round(cosine_similarity(docs_vec(docs), docs_vec(docs)),2)

  39. return cs_array


  40. def docs_ittido(docs):

  41. df=docs_cos(docs)

  42. kekka=[]

  43. for x in df:

  44. kekka.append((np.sum(x)-1)/(len(x)-1))

  45. return kekka


  46. def wordkumokaki(df):

  47. from wordcloud import WordCloud

  48. import matplotlib.pyplot as plt


  49. fpath = '************.ttc'#フォントファイル

  50. words_wakati=" ".join(df)

  51. wordcloud = WordCloud(

  52. font_path=fpath,

  53. background_color="white", # default=”black”/"white"

  54. contour_width=3, contour_color='steelblue',

  55. max_words=100, # default=200

  56. min_font_size=4, #default=4

  57. collocations = False #default = True

  58. ).generate(words_wakati)

  59. plt.figure()

  60. plt.imshow(wordcloud)

  61. plt.show()

  62. def csv_ittido(s_f,s_name,s_text):

  63. fileCSV="c:/*********/"+s_f #CSVファイルの保存場所

  64. docs=pd.read_csv(fileCSV)

  65. ittido_id=[]

  66. ittido_value=[]

  67. ittido_volume=[]


  68. for i_t in docs[s_text]:

  69. ittido_value.append(i_t)

  70. ittido_volume.append(len(i_t))

  71. ittido_value=docs_ittido(ittido_value)


  72. for i_i in docs[s_name]:

  73. ittido_id.append(i_i)


  74. ittido=[]

  75. for i in range(0,len(ittido_id)):

  76. retu=[]

  77. retu.append(ittido_id[i])

  78. retu.append(ittido_value[i])

  79. retu.append(ittido_volume[i])

  80. ittido.append(retu)


  81. return np.array(ittido)

  82. #return ittido #npにしない場合



  83. if __name__ == '__main__':

  84. #文字列の初期値

  85. text1="すもももももももものうち"

  86. text2="すももはももの1つです"

  87. text3="すももはももです"

  88. docs=[]

  89. docs.append(text1)

  90. docs.append(text2)

  91. docs.append(text3)

  92. print('単語の分かち書き')

  93. df=wakachi(text1)

  94. print(df)


  95. print('ワードクラウド')

  96. wordkumokaki(df)

  97. print('単語の分かち書き(品詞付き)')

  98. df=wakachi_part(text3,"名詞") #"動詞"、指定なしは""

  99. print("単語:",df[0])

  100. print("品詞:",df[1])


  101. print('文書ベクトル')

  102. print('1:',docs_vec(docs))


  103. print('文書ベクトル(単語含む) ')

  104. print('2:',docs_vec2(docs))


  105. print('docsリストに対するcos類似度')

  106. df=docs_cos(docs)

  107. print(df)


  108. print('docsリストに対する一致度(1:nのcos類似度の平均値)')

  109. df=docs_ittido(docs)

  110. print(df)


  111. print('csvファイルに対する一致度(id,一致度、文字数をnumpyで返す)')

  112. s_f='samplecsv.csv'

  113. s_name="loginid" #フィールド名「loginid」に学籍番号

  114. s_text="tassei" #フィールド名「tassei」に計算対象の文章

  115. df=csv_ittido(s_f,s_name,s_text)

  116. print(df)

北海道医療大学・情報センター