astamuse Lab

astamuse Labとは、アスタミューゼのエンジニアとデザイナーのブログです。アスタミューゼの事業・サービスを支えている知識と舞台裏の今を発信しています。

CoreNLPを使ってみる(2) API編

山縣です。

新年明けましておめでとうございます。

弊社の年末年始休暇は例年になく長く11連休となりました。おかげでかなりリフレッシュできました。 まだちょっと休みボケも残っていますが頑張っていきたいと思います。

本年も弊社と当ブログをよろしくお願いします。

今回も CoreNLP について書きたいと思います。 前回 CoreNLP を CLI から使う方法やサーバとして起動してAPI経由で使う方法について書きました。 今回は API の方を見ていきたいと思います。 CoreNLP では Java の API が提供されているので、これを Scala から使ってみます。

1. Stanford CoreNLP API

サンプルコードとその実行

CoreNLP のサイトでAPI についてはこちらで説明されています。 このサイトを参考に Scala から API を使ってみます。

Scala の環境ということでビルドツールに SBT (1.0.4) を使います。

$ cat project/build.properties
sbt.version=1.0.4

build.sbt は以下のとおりです。

lazy val root = (project in file(".")).
  settings(
    organization := "example",
    scalaVersion := "2.11.12",
    version      := "0.1.0-SNAPSHOT",
    name := "Example1",
    libraryDependencies ++= Seq(
      "edu.stanford.nlp" % "stanford-corenlp" % "3.8.0",
      "edu.stanford.nlp" % "stanford-corenlp" % "3.8.0" classifier "models-english",
      "org.slf4j" % "slf4j-simple" % "1.7.12"
    ),
    fork in run := true,
    outputStrategy := Some(StdoutOutput),
    javaOptions in run += "-Xmx8G"
  )

corenlp は maven 上にパッケージがあるのでそれを利用します。 英語のモデルデータを取得するため、追加で classifier "models-english" を指定した依存関係も記述します。 また slf4j-simple を追加しています。このパッケージがないとcorenlp のログメッセージが出力されません。

サンプルのプログラムをサイトのサンプルを元に書いてみました。

package example1
import java.util

import scala.collection.JavaConverters._
import edu.stanford.nlp.ling.CoreAnnotations._
import edu.stanford.nlp.ling.CoreLabel
import edu.stanford.nlp.pipeline._
import edu.stanford.nlp.util.{CoreMap, PropertiesUtils}

import scala.collection.mutable


object Example1 {
  def main(args: Array[String]): Unit = {
    val props = PropertiesUtils.asProperties(
      "annotators", "tokenize, ssplit, pos, lemma, ner",
      "tokenize.language", "en"
    )
    val pipeline = new StanfordCoreNLP(props) //定義したプロパティ propsで Annotator である StanfordCoreNLP を生成

    val text = "Stanford University is located in California. It is a great university."
    val document: Annotation = new Annotation(text) //サンプルテキスト(String) で Annotation を生成

    pipeline.annotate(document) // アノテートする

    printResult(document)
  }

  def printResult(document:Annotation):Unit = {
    val sentences: mutable.Seq[CoreMap] = document.get(classOf[SentencesAnnotation]).asScala
    val tokens: mutable.Seq[CoreLabel] = sentences.flatMap(s => s.get(classOf[TokensAnnotation]).asScala)
    tokens.foreach{ t =>
      val txt: String = t.get(classOf[TextAnnotation])
      val pos: String = t.get(classOf[PartOfSpeechAnnotation])
      val lemma: String = t.get(classOf[LemmaAnnotation])
      val ner: String = t.get(classOf[NamedEntityTagAnnotation])
      println((txt,pos,lemma, ner))
    }
  }

実行すると以下のような出力が表示されます。

sbt:Example1> run
...
[info] Running (fork) example1.Example1
[main] INFO edu.stanford.nlp.pipeline.StanfordCoreNLP - Adding annotator tokenize
[main] INFO edu.stanford.nlp.pipeline.StanfordCoreNLP - Adding annotator ssplit
[main] INFO edu.stanford.nlp.pipeline.StanfordCoreNLP - Adding annotator pos
[main] INFO edu.stanford.nlp.tagger.maxent.MaxentTagger - Loading POS tagger from edu/stanford/nlp/models/pos-tagger/english-left3words/english-left3words-distsim.tagger ... done [0.8 sec].
...
(Stanford,NNP,Stanford,ORGANIZATION)
(University,NNP,University,ORGANIZATION)
(is,VBZ,be,O)
(located,JJ,located,O)
(in,IN,in,O)
(California,NNP,California,LOCATION)
(.,.,.,O)
(It,PRP,it,O)
(is,VBZ,be,O)
(a,DT,a,O)
(great,JJ,great,O)
(university,NN,university,O)
(.,.,.,O)
[success] Total time: 18 s, completed Dec 26, 2017 3:59:03 AM```
アノテーションの実行

上記のサンプルでトークナイズなどの一通りの処理(アノテーシ ョン)を実行する部分は以下になります。

    val props = PropertiesUtils.asProperties(
      "annotators", "tokenize, ssplit, pos, lemma, ner, parse, dcoref",
      "tokenize.language", "en"
    )
    val pipeline = new StanfordCoreNLP(props)

    val text = "Stanford University is located in California. It is a great university."
    val document: Annotation = new Annotation(text)

    pipeline.annotate(document)

コードを少し細かく見ていきます。

    val props = PropertiesUtils.asProperties(
      "annotators", "tokenize, ssplit, pos, lemma, ner, parse, dcoref",
      "tokenize.language", "en"
    )
    val pipeline = new StanfordCoreNLP(props) 

上記の部分では props に処理内容を記述しアノテータである StanfordCoreNLP を生成しています。

    val text = "Stanford University is located in California. It is a great university."
    val document: Annotation = new Annotation(text) 

次に処理したいテキストを用意します。 Annotation クラスのインスタンスdocumentとして定義します。

以上で準備が整ったので実際にアノテーションを実行します。

    pipeline.annotate(document)

annotate を呼ぶことでアノテーションの処理が実行され処理結果が document に保存されます。

処理結果の取得

次に処理された結果の表示について見ていきます。表示は printResult(..) メソッドにまとめています。

  def printResult(document:Annotation):Unit = {
    val sentences: mutable.Seq[CoreMap] = document.get(classOf[SentencesAnnotation]).asScala
    val tokens: mutable.Seq[CoreLabel] = sentences.flatMap(s => s.get(classOf[TokensAnnotation]).asScala)
    tokens.foreach{ t =>
      val txt: String = t.get(classOf[TextAnnotation])
      val pos: String = t.get(classOf[PartOfSpeechAnnotation])
      val lemma: String = t.get(classOf[LemmaAnnotation])
      val ner: String = t.get(classOf[NamedEntityTagAnnotation])
      println((txt,pos,lemma, ner))
    }
  }

まず下記のコードでセンテンスのリストを取得しています。

    val sentences: mutable.Seq[CoreMap] = document.get(classOf[SentencesAnnotation]).asScala

document.get() でアノテーションクラスのClass型インスタンスを渡すことで対応するデータを取得しています。 SentencesAnnotation を渡すと List[CoreMap] が返されます。(上記の場合 asScala で Scala のコレクション mutable.Seq に変換されています。)

各センテンスの情報は CoreMap インタフェースの実装クラスに保存されています。CoreMapはCoreNLP ライブラリの独自の Map インタフェースを定義しています。

次にセンテンスからトークンを取得します。

    val tokens: mutable.Seq[CoreLabel] = sentences.flatMap(s => s.get(classOf[TokensAnnotation]).asScala)

センテンスからトークンのリストを取得しているのは "s.get(classOf[TokensAnnotation])" です。 こちらも get() でトークンのアノテーションクラスのClass型インスタンスを渡すことで結果を取得しています。 get() で返ってくるのは List[CoreLabel] です。(例によって asScala で Scala のコレクション mutable.Seq に変換されています。) flatMap 使うことで Seq のネストを解消して mutable.Seq[CoreLabel] にしています。

各トークンに対してトークンのテキスト、品詞、レンマ、固有表現抽出の結果を出力しているのが下記の部分になります。

    tokens.foreach{ t =>
      val txt: String = t.get(classOf[TextAnnotation])
      val pos: String = t.get(classOf[PartOfSpeechAnnotation])
      val lemma: String = t.get(classOf[LemmaAnnotation])
      val ner: String = t.get(classOf[NamedEntityTagAnnotation])
      println((txt,pos,lemma, ner))
    }

CoreLabel は一つのトークンおよびアノテータにより付加されたアノテーション情報を保存するクラスです。 CoreLabel.get() において引数で指定されたClass型インスタンスに対応した値を返します。上記では各 トークン(CoreLabel) に対して TextAnnotation, PartOfSpeechAnnotation, LemmaAnnotation, NamedEntityTagAnnotation のそれぞれのアノテーションの情報(この場合はいずれもString型)を取得して表示しています。 以上のようにデータを取得するには各段階で get(classOf[...] ) というメソッドを呼び出しますが、コードが見づらい印象を受けます。 CoreLabel では代わりにそれぞれのアノテーションを簡易に取得するメソッドも提供されており上記の部分は、下記のように書くこともできます。

    tokens.foreach{ t =>
      val txt: String = t.word()
      val pos: String = t.tag()
      val lemma:String = t.lemma()
      val ner: String = t.ner()
      println((txt,pos,lemma, ner))
    }

こちらのほうが簡潔に書けて良いですね。

2. Simple CoreNLP API

以上のように Stanford CoreNLP API の使用方法を見てきましたが、少々まどろっこしい感じも受けますね。CoreNLP の API には前述の API とは別に Simple CoreNLP API というものも提供されており、より簡潔な記述で CoreNLP を利用する方法もありますので、ここではそれを見ていきたいと思います。

package example2

import scala.collection.JavaConversions._
import edu.stanford.nlp.simple._

import scala.collection.mutable


object Example2{
  def main(args: Array[String]): Unit = {
    val text = "Stanford University is located in California. It is a great university."
    val doc = new Document(text)
    val tokens: mutable.Seq[Token] = doc.sentences.flatMap(_.tokens())
    tokens.foreach{ t =>
      val txt: String = t.word()
      val pos: String = t.tag()
      val lemma:String = t.lemma()
      val ner: String = t.ner()
      println((txt,pos,lemma, ner))
    }
  }
}

上記は先程の Example1 と同じ内容の処理になります。 実際に実行して確認してみます。

sbt:Example1> runMain example2.Example2
[warn] Multiple main classes detected.  Run 'show discoveredMainClasses' to see the list
[info] Running example2.Example2
[run-main-0] INFO edu.stanford.nlp.tagger.maxent.MaxentTagger - Loading POS tagger from edu/stanford/nlp/models/pos-tagger/english-left3words/english-left3words-distsim.tagger ... done [1.0 sec].
...
(Stanford,NNP,Stanford,ORGANIZATION)
(University,NNP,University,ORGANIZATION)
(is,VBZ,be,O)
(located,JJ,located,O)
(in,IN,in,O)
(California,NNP,California,LOCATION)
(.,.,.,O)
(It,PRP,it,O)
(is,VBZ,be,O)
(a,DT,a,O)
(great,JJ,great,O)
(university,NN,university,O)
(.,.,.,O)
[success] Total time: 17 s, completed Dec 25, 2017 3:34:25 AM

同じ結果が返ってきています。

Simple API を使用するには "edu.stanford.nlp.simple._" を import します。

コードの書き方について Stanford API と比較すると、一番大きな違いは Stanford API で行っていた、アノテータ(StanfordCoreNLP) の生成と annotate() の実行が無いことです。これらの処理は隠蔽されています。

    val doc = new Document(text)
    val tokens: mutable.Seq[Token] = doc.sentences.flatMap(_.tokens())

処理したいテキストで クラスDocument を生成します。上記の "doc.sentences はメソッドでこのメソッドの中で tokenize, ssplit に対応するアノテータが実行されています。

    tokens.foreach{ t =>
      val txt: String = t.word()
      val pos: String = t.tag()
      val lemma:String = t.lemma()
      val ner: String = t.ner()
      println((txt,pos,lemma, ner))
    }

こちらのコードでは、各アノテーションを取得しています。 例えば POS(PartOfSpeach) 情報を取得する tag() メソッドでは内部で pos に対応するAnnotator を実行します。このように Simple API ではデータが実際に必要になったときにはじめて処理が呼び出される遅延実行をすることで無駄な処理が実行されないようにしています。

ドキュメントでは Simple API のメリットとして以下が上げられています。

  • 直感的なシンタックス
  • Lazy computation (必要になるまで処理が実行されない)
  • ヌルポが起きない(nullを返さない)
  • 高速で頑健なシリアライゼーション(protocol buffers を使用)
  • スレッドセーフ

一方で、カスタマイズがしづらいこと、処理が決定的でない(呼ばれる処理の順番によって使用されるアルゴリズムが異なったりすることで結果が常に同じにはならない)などをデメリットとして上げています。

3. Stanford CoreNLP API と Simple CoreNLP APIの性能比較

Stanford API と Simple API について性能面で違いがあるのか比較してみました。 基本的には上記までの Example1, Example2 と同じ処理(pos, lemma, ner) を大きなテキストデータについて実行し、実行時間を計測してみました。 データは社内にあるデータ (英文)1000件、約2MBのデータになります。 環境は 私の作業用のノートPC(Win10, WSL) 上です。

sbt:Example1> runMain example3.Example3 simple
...
[success] Total time: 154 s, completed Dec 26, 2017 7:35:20 AM

上記のように引数 simple をつけた場合 Simple API をそうでない場合は Stanford API を実行するようにし、3回実行して平均を取りました。

Stanford API Simple API
1回目  168 160
2回目  154 154
3回目  155 150
平均  159.0 154.7

結果を見ると Simple API のほうが少し速いようですが、あまり厳密なテストでもないですし、ほとんど変わらないと考えて良いのでは無いかと思います。

次に少し処理を変えてみます。

Stanford API/ Simple API それぞれのデータを取得するメソッドは以下のようになっています。

Standford API:

  def getResult(document:Annotation):Seq[Result] = {
    val sentences: mutable.Seq[CoreMap] = document.get(classOf[SentencesAnnotation]).asScala
    val tokens: mutable.Seq[CoreLabel] = sentences.flatMap(s => s.get(classOf[TokensAnnotation]).asScala)
    tokens.map(t => Result(t.word(), t.tag(), t.lemma(), t.ner())).toSeq
  }

Simple API:

  def getResult(document:Document):Seq[Result] = {
    val tokens = document.sentences.asScala.flatMap(x => x.tokens().asScala)
    tokens.map(t => Result(t.word(), t.tag(), t.lemma(), t.ner())).toSeq
  }

Result はアノテーションの結果を保存する case class で、以下のように定義されています。

case class Result(txt:String, pos:String, lemma:String = "", ner:String = "")

先程までは pos, lemma, ner という3つのアノテーション結果を取得していましたが、lemmaとnerは使わなかったので pos だけを取得しようとコードを変えたとします。 Stanford API/ Simple API それぞれ

    tokens.map(t => Result(t.word(), t.tag(), t.lemma(), t.ner())).toSeq

となっている部分を

    tokens.map(t => Result(t.word(), t.tag())).toSeq

として 品詞の結果だけを取得するように変更します。修正点はここだけになります。 このように変更したコードを使って再度処理を実行してみます。

Stanford API Simple API
1回目  155 17
2回目  160 16
3回目  157 16
平均  157.3 16.3

今回は結果が大きく異なり Simple API は大幅に速くなりました。 一方 Stanford API は、前とほとんど変わりません。

これは Stanford API の場合 プロパティ "annotators" で処理内容を決めており、データを取得する、取得しないにかかわらず annotate() を実行した時点でこれらの処理がすべて実行されてしまうからです。一方で Simple API ではアノテーション取得時に対応するアノテータがオンデマンドで実行されるので呼び出さなければその処理が実行されないため大幅に処理時間を短縮できています。

もちろん Stanford API でも必要としていない lemma, ner を annotators から抜けば同じような処理時間で処理をすることが可能です。ですが、ついうっかり忘れてしまうと無駄に処理時間がかかってしまいます。

おわりに

以上、Stanford API と Simple API について見てみました。 どちらを使うのかは好みの問題とは思いますが、CLI と同じように使いたい、細かいカスタマイズがしたいなら Stanford API を、あまり細かいところは良いのでとにかく手軽に処理がしたいのなら Simple API という感じでしょうか。また NLP の処理は重いので不必要な処理は実行しないようにしないと無駄に処理時間がかかってしまうので気をつけたほうが良いと思います。

ちょっと時間がなくなってしまったので Spark での CoreNLP の使用については次回に書きたいと思います。

システムテスト自動化カンファレンス2017に登壇しました

f:id:astamuse:20171213181216j:plain

こんにちは。nishikawaです。

12月10日 日曜日に行われたシステムテスト自動化カンファレンスにて、弊社の転職ナビチームの事例紹介をしてまいりましたので、レポートも含めてご報告させていただきます。

資料配布

会場の雰囲気

会場には自動テストに課題のある方や、コミュニティの方など色々な方がおり、質疑応答なども含め白熱したイベントでした。

発表、そして登壇を終えての感想

そんな中、弊社の転職ナビチームがやっているテストや課題などの事例紹介を発表させていただきました。

f:id:astamuse:20171213181132j:plain

始まる前は人生初登壇ということもあり、とても緊張しておりましたが、発表が始まった後は会場の皆様と一緒になって冗談を交えながら楽しく発表することができ、なんとか終わらせることができました。

質疑応答でも、弊社の事例について沢山ご質問いただき、初めての登壇にしては成功だったなと満足することができました。

今後について

今後も転職ナビチームでは、システムの自動化を推進し効率良く開発できるように邁進したいと思います。

そうした努力の末、転職ナビの品質を向上させ、より良い転職ができるサービスという形で様々な方にお返しできればと思います。

それでは。

特許とその制度について 出願後~権利取得まで

お久しぶりです。主に特許関連のデータ処理を担当しているBTと申します。 前回までの3回で、特許出願についてご説明いたしました。 今回は出願後の特許取得までの流れについてご説明したいと思います。 宜しくお願いいたします。

出願公開

特許出願を行うと、その出願の日から1年6月経過するとその特許出願の内容を記載した公報が特許庁より発行されることにより、広く一般に内容が公開されます。 出願公開は、出願人以外の会社等に出願された発明を広く周知するために行われています。

出願公開が無いとするとどうなるでしょうか?

特定の発明に基づいて事業化して商品等を販売している場合に、その発明が他者によってすでに特許出願されていて事業開始後に特許になったとすると、その商品は販売できなくなり事業が継続できなくなることが考えられます。

また、すでに他者である出願人によって出願されている発明を知らずに、同じ内容の発明について研究開発等に重複投資をしてしまうことで、最終的に事業化できずにその投資が無駄になってしまうことも考えられます。

このようなことがあると、新しい発明に基づいて事業を開始したり、新しい発明に投資をしたりすることに及び腰になってしまうことが考えられ、発明を推奨する特許法の目的にそぐわない結果となってしまいます。

そこで、全ての出願(出願から1年6月経過する前に取り下げられたものなどは除く)について、その内容を公開することで出願人以外の第三者にどのような発明が出願されているのか、あるいは今後どのような発明が特許になる可能性があるのか予測できるようにしています。

では、なぜ特許出願から1年6月経過した後に出願公開されるのでしょうか? 上記の話だけですと、出願後すぐに全て公開するようにしてしまえば一番良いように思えます。

すぐに公開しない理由は、出願人の利益を守るためです。 出願人は、特許出願後に元の出願に基づき、内容を高度化したり足りない部分を補足したりして優先権の主張をした出願をすることが出来ます。これの期限が元の出願から1年とされており、優先権の主張のための証明書の提出などが元の出願から1年4月まで認められています。このような手続きを行うことが出来る期間の前に出願内容が公開されてしまうと、悪意のある第三者によって公開された内容を元に別の出願がなされて、出願人が行うことの出来る手続きが妨害されてしまうことが考えれます。

このようなことから、出願人と第三者の利益を調整した結果、出願から1年6月経過した後に公開されることになっています。

なお、出願人が何も手続きをしなければ出願から1年6月経過した後に出願公開がなされますが、出願人が申請することで出願から1年6月経過する前であっても早期に公開されることがあります。

審査(実体審査)

審査請求

特許出願をすると自動的に審査が行われて、特許になるかどうか決まるというわけではありません(過去にはそういう時代もありましたが・・・)。 特許出願した内容について、特許庁に審査をして貰うためには、特許出願とは別に審査請求の手続きを行う必要があります。 審査請求が可能期間は、特許出願から3年以内となっています。

出願人は、特許出願の時にはありとあらゆる関連する発明をカバーしようとしたり、漏れがあるといけないと考えたりして、出願書類にいっぱい記載してしまいがちです。 そこで出願人には、特許出願の後3年の期間を利用して出願した発明について精査し、権利化(特許取得)を目指すべきか否かを熟慮することが求められます。

出願自体はさほどの費用は掛かりませんが、審査請求には請求項の数に比例した金額+αの費用がかかるため、請求項の数によってはとても高額になります。 このため、出願当初の内容から請求項を削除したり審査請求そのものをしないことで、審査を行う価値があると思われるものに絞り込まれることになります。

なお、特許出願後3年以内に審査請求をしなかった場合は、その特許出願は取り下げたものとして扱われます。

ちなみに、意外に思うかもしれませんが審査請求は出願人でなくとも可能です(もちろん、出願人が審査請求にかかる費用を出さない場合は、自分で負担する必要がありますが・・・)。 これは、出願人にとって審査請求をして特許にする価値がなくても、第三者から見たらその価値がある場合があるからです。 このようなケースで特許になった場合でも、原則として出願人が特許権者になるところは変わりませんので注意が必要です(権利を出願人から譲渡された場合は、自分が特許権者になることができます)。

最初の拒絶理由通知

審査の結果、何ら指摘を受けることが無いということは滅多ありませんので、特許庁の審査官より拒絶理由通知が届きます。

出願人は、拒絶理由通知の内容を精査し、指定された期日までに意見書、または補正書を特許庁に提出します。 指摘された期日までになんら応答をしなかった場合はそのまま拒絶査定になってしまいます。

意見書は、主に審査官が指摘してきた拒絶理由について納得できない場合に反論を提出するもので、審査官が指摘してきた拒絶理由が存在しないことを説明することになります。 補正書は、審査官が指摘してきた拒絶理由に対して、出願書類の内容を変更して拒絶理由が存在しなくなるようにする場合に提出します。場合によっては、追加で意見書も提出して補正書の内容について補足説明などを行うことも出来ます。

なお、意見書で反論する場合を除いて指摘を受けた拒絶理由は全て補正書により解消している必要があります。 解消していないと審査官に判断された場合は、拒絶査定となります。

最後の拒絶理由通知

出願人が最初の拒絶理由通知に対して適切に応答し、指摘された拒絶理由をすべて解消していても、補正書により出願書類を変更したことによって新たに別の拒絶理由が生じる場合があります。 このような拒絶理由のみを出願人に通知するのが最後の拒絶理由通知となります(審査官より届く書類に、「最後の拒絶理由通知」と記載されていますので、最初の拒絶理由通知で無いことがわかるようになっています)。

最初の拒絶理由通知で通知した拒絶理由が残っていれば拒絶査定となるので、それ以外の拒絶理由が存在していた場合、すなわち最初の拒絶理由通知において通知し忘れていた新たな拒絶理由が見つかった場合は、2回目の拒絶理由通知であっても最初の拒絶理由通知として扱われます。

出願人が取るべき応答は最初の拒絶理由通知と同様なのですが、最初の拒絶理由通知の時と異なり指摘を受けた拒絶理由を解消させると共に出願書類の内容を変更することによって新たなに別の拒絶理由が生じることも許されないため(生じた場合は拒絶査定となります)、慎重に対応する必要があります。 場合によっては、確実に拒絶理由が存在しなくなるように大幅に請求項を削除したりするなどを対応をすることになります。

特許査定または拒絶査定

審査官による審査と拒絶理由通知とそれに応答する意見書や補正書の提出を経て、最終的に審査官は特許すべきか否かを決定します。 特許すべき場合は特許査定を、そうでない場合は拒絶査定を出願人に対して出すことになります。

拒絶査定を受けた場合において、その後出願人が取り得るべき手段については次回以降に説明します。

特許登録

特許査定を受けても、特許になったわけではありません。 出願人は、特許査定のあと速やかに所定の特許料を納付しなければなりません。 これが納められて初めて、特許庁により特許番号が振られて新たな特許として登録されることになります。

なお、特許料の納付をしない場合は、特許として登録されず、特許権を取得することは出来なくなります。 特許料はかなり高額になるため、このときになって金額の大きさに驚いて特許料を払わないことで結局特許権を取得しないケースもあるようです。

特許掲載公報

特許庁により特許として登録された場合は、その内容について速やかに特許掲載公報が発行され、特許となった発明について広く周知がなされます。

なお、特許出願と同時に審査請求をした場合や早期に審査請求をした場合などは、出願から1年6月よりも前に特許として登録されることがあります。 このような場合は、出願公開の公報よりも先に特許掲載公報が発行されることになります(この場合は出願公開は法律上不要なのですが、出願当初の内容が知りたいといったニーズがあるため、出願公開の公報も特許掲載公報の発行の後で発行する運用がなされています)。

まとめ

以上、出願後から特許になるまでについて説明をしてきました。次回は、審判について見ていきたいと思います。

最後になりましたが、 アスタミューゼでは現在、エンジニア・デザイナーを募集中です。 興味のある方はぜひ 採用サイト からご応募ください。

参考にした資料など

Copyright © astamuse company, ltd. all rights reserved.