2.実装
明細書【0052】段落参照すると、 類似度のスコア算出式=(発明文章の長さペナルティ)×(最小文の単語単位での含有率)×(文字列レベルでの編集距離の逆数) として、編集距離というアイデアを類似度に使ってるようなので、編集距離を計算するライブラリを発見して利用させてもらいました。 tfidfやfタームベクトルなどを補完する類似度判定に使えるといいなと思います。
!pip install python-Levenshtein
!pip install janome
import Levenshtein
import re
import pandas as pd
#編集距離の計算
def CalcLeven(sen1,sen2):
return 1/Levenshtein.distance(sen1, sen2)
#文章の長さ指数の計算
def CalcLengthoftext(sen1):
return len(sen1)
#最小文の単語単位での含有率
from janome.tokenizer import Tokenizer
t = Tokenizer()
def CalcContentofkw(sen1,sen2):
token_sen1 = []
token_sen2 = []
for token in t.tokenize(sen1):
token_sen1.append(token.surface)
for token2 in t.tokenize(sen2):
token_sen2.append(token2.surface)
s1 = set(token_sen1)
s2 = set(token_sen2)
s_intersection = s1 & s2
s_union = s1 | s2
return len(s_intersection) / len(s_union)
#最小文の抽出
def get_minimum_sentence(text):
sentences = text.replace('\n','').rstrip('\n')
sentences = sentences.split("。")
return sentences
def CalcScore(text1,text2):
sen1 = re.sub(r"\d","",text1)
sens2 = get_minimum_sentence(text2)
print("被判定文書(請求項): "+sen1)
print("-"*100)
tempframe = []
for sen2 in sens2:
if sen2 =="":
pass
else:
sen2 = re.sub(r"\d","",sen2)
a = CalcLeven(sen1,sen2)
b = CalcLengthoftext(sen2)
c = CalcContentofkw(sen1,sen2)
score = a*b*c*100
tempframe.append([score,sen2])
#print('スコア{s}:「{sen2}」'.format(sen1=sen1,sen2=sen2,s=score))
score_frame = pd.DataFrame(tempframe,columns=["score","sentence"])
return score_frame
3.試し結果
被判定文書(請求項): コンピュータが実行する特許評価判定方法であって、 発明に関する発明文章の入力を受け付ける発明入力ステップと、 前記入力された発明文章を単語単位に構文解析を行なった上で、前記発明文章における任意の検索キーワードを抽出するキーワード抽出ステップと、 前記抽出された検索キーワードを用いて当該検索キーワードが含まれる特許文章群をデータベースから抽出する特許文章群抽出ステップと、 前記発明文章および前記特許文章群に含まれる文章を比較して前記発明文章の特許性を判定する判定ステップと、 を含み、 前記判定ステップは、前記特許文章群に含まれる文章の編集距離の逆数に前記発明文章の長さ指数および前記検索キーワードの含有率を乗算した結果を基に前記発明文章の特許性を判定する ことを特徴とする特許評価判定方法。
Comments