NLP メジャーは、キューブのファクト・テーブルには格納されず、アナライザに表示されないことに注意してください。NLP メジャーの主な目的は、Text Analytics ドメインを定義することと、NLP ディメンジョンの基礎として使用することです。次のセクションを参照してください。
代替手法 : 他の場所からの構造化されていないテキストの取得
一部のシナリオでは、構造化されていないテキストを Web ページから取得する必要が生じることがあります。例えば、追加情報 (ニュース記事など) を検索できる URL を含むフィールドのある、構造化された情報のテーブルがある場合があります。そのような場合、NLP メジャーとしてテキストを使用する最も簡単な方法は、以下のとおりです。
例えば、ニュース記事に関する概要情報のあるクラスでキューブをベースにするとします。クラス内の各レコードには、報道会社の名前、日付、見出し、および Link という名前のプロパティ (ニュース全文の URL が格納されている) が格納されています。それらの URL にあるニュース本文を使用する NLP メジャーを作成します。
そのためには、以下のように GetArticleText() メソッドをキューブ・クラスで定義できます。
ClassMethod GetArticleText(pLink As %String) As %String
{
set tSC = $$$OK, tStringValue = ""
try {
set tRawText = ..GetRawTextFromLink(pLink, .tSC)
quit:$$$ISERR(tSC)
set tStringValue = ..StripHTML(tRawText, .tSC)
quit:$$$ISERR(tSC)
} catch (ex) {
set tSC = ex.AsStatus()
}
if $$$ISERR(tSC) {
set tLogFile = "UpdateNEWSARCHIVE"
set tMsg = $system.Status.GetOneErrorText(tSC)
do ##class(%DeepSee.Utils).%WriteToLog("UPDATE", tMsg, tLogFile)
}
quit tStringValue
}
GetRawTextFromLink() メソッドは、以下のように Raw テキストを取得します。
ClassMethod GetRawTextFromLink(pLink As %String, Output pSC As %Status) As %String
{
set pSC = $$$OK, tRawText = ""
try {
// derive server and path from pLink
set pLink = $zstrip(pLink,"<>W")
set pLink = $e(pLink,$find(pLink,"://"),*)
set tFirstSlash = $find(pLink,"/")
set tServer = $e(pLink,1,tFirstSlash-2)
set tPath = $e(pLink,tFirstSlash-1,*)
// send the HTTP request for the article
set tRequest = ##class(%Net.HttpRequest).%New()
set tRequest.Server = tServer
set tSC = tRequest.Get(tPath)
quit:$$$ISERR(tSC)
set len = 32000
while len>0 {
set tString = tRequest.HttpResponse.Data.Read(.len, .pSC)
quit:$$$ISERR(pSC)
set tRawText = tRawText _ tString
}
} catch (ex) {
set pSC = ex.AsStatus()
}
quit tRawText
}
StripHTML() メソッドは、以下のように HTML フォーマットを削除します。
ClassMethod StripHTML(pRawText As %String, Output pSC As %Status) As %String
{
set pSC = $$$OK, tCleanText = ""
try {
for tTag = "b","i","span","u","a","font","em","strong","img","label","small","sup","sub" {
set tReplaceTag(tTag) = " "
}
set tLowerText = $$$LOWER(pRawText)
set tStartPos = $find(tLowerText,"<body")-5, tEndTag = ""
set pRawText = $e(pRawText,tStartPos,*), tLowerText = $e(tLowerText,tStartPos,*)
for {
set tPos = $find(tLowerText,"<")
quit:'tPos // no tag start found
set tNextSpace = $f(tLowerText," ",tPos), tNextEnd = $f(tLowerText,">",tPos)
set tTag = $e(tLowerText,tPos,$s(tNextSpace&&(tNextSpace<tNextEnd):tNextSpace, 1:tNextEnd)-2)
if (tTag="script") || (tTag="style") {
set tPosEnd = $find(tLowerText,">",$find(tLowerText,"</"_tTag,tPos))
} else {
set tPosEnd = tNextEnd
}
if 'tPosEnd { //
set tEndTag = $e(pRawText,tPos-1,*)
set pRawText = $e(pRawText,1,tPos-2)
quit
}
set tReplace = $s(tTag="":"", 1:$g(tReplaceTag(tTag),$c(13,10,13,10)))
set pRawText = $e(pRawText,1,tPos-2) _ tReplace _ $e(pRawText,tPosEnd,*)
set tLowerText = $e(tLowerText,1,tPos-2) _ tReplace _ $e(tLowerText,tPosEnd,*)
}
set tCleanText = $zstrip($zconvert(pRawText, "I", "HTML"),"<>=W")
} catch (ex) {
set pSC = ex.AsStatus()
}
quit tCleanText
}
最後に、NLP メジャーを作成し、それを %cube.GetArticleText(%source.Link) ソース式でベースにします。