|
|
2007/9/5(Wed) 20:05:41|NO.10884
りんご みかん すいか かぼす かぼちゃ
かぼちゃ りんご すいか りんご ばなな
このようなtxtを読み込んだときに
りんご 3 30.00%
すいか 2 30.00%
かぼちゃ 2 30.00%
ばなな 1 10.00%
かぼす 1 10.00%
みかん 1 10.00%
とmesbox内でソートするにはどのように記述していけばよいでしょうか?
|
|
2007/9/5(Wed) 20:39:54|NO.10885
追記
またこの状態で、
これはりんごですか?いいえ、ばななです。
等の文章となった場合、
これは・りんご・ですか・?・いいえ・、・ばなな・です・。
等のように単語毎に区切ったりはHSPで可能でしょうか?
|
|
2007/9/5(Wed) 22:24:53|NO.10886
りんご 3 30.00%
すいか 2 30.00%
かぼちゃ 2 30.00%
ばなな 1 10.00%
かぼす 1 10.00%
みかん 1 10.00%
この3,2,1などの数値や%というのは一体何の値なんでしょうか?
それを基準にして並べ替えるということなら出来ます。
書き込みだけでは何を基準に並べ替えてるかがよくわからないのですが…
|
|
2007/9/5(Wed) 23:04:34|NO.10888
横から失礼します。
instr や strmid 等の文字列の操作コマンドを利用して、
文字を検索して、見つかったらカウントしていくという形はいかがでしょうか。
また、文字列を単語ごとに分解する場合などは、
特徴を探して、それがきたら分割という形はいかがでしょう。
たとえば、
「これは」「あれは」などをまとめて、「れは」がきたら区切る。といった形で。
ただ、一例ですのでご自分で考えてくんでみることをおすすめします。
|
|
2007/9/6(Thu) 06:09:15|NO.10889
単語ごとに区切る方法は分かりませんので、検索の方法のさわりだけ。
連想配列が使えればそれを利用した方がスマートだと思いますが、使えなくてもHSPDA.DLLの排他メモリノートを利用すれば可能です。
なお現在HSPで連想配列を利用するにはCOMを利用する必要があります。
#include "hspda.as"
target = {"りんご みかん すいか かぼす かぼちゃ
かぼちゃ りんご すいか りんご ばなな"}
notesel xnote : xnotesel xnote
stock = "" // 単語をストックするための変数
gosub *serch // 検索実行
gosub *show_result // 結果の表示
stop
// 検索の実行
// 検索対象文字が全角文字のみで構成されていることを前提!
*serch
repeat strlen( target )
s = strmid( target, cnt, 2 )
if ( s == " " ) | ( s == "\n" ) {
// 全角スペースまたは改行の場合、単語の区切れとして認識
gosub *count
} else {
stock += s
}
continue cnt + 2
loop
if stock != "" : gosub *count
return
//
// 変数 stock に格納されている単語を排他メモリに追加
*count
xnoteadd stock
stock = ""
return
//
// 結果の表示
*show_result
repeat notemax
sortget num, cnt
noteget name, cnt
pos 0, cnt * 20 : mes name
pos 100, cnt * 20 : mes num
loop
return
出現率表示や出現頻度順のソートは簡単だと思うので省きました。
ソートはsortval&sortgetを利用するのが簡単だと思います。
|
|
2007/9/6(Thu) 06:27:20|NO.10890
一応補足を……!
特に排他メモリノートや連想配列を使わなくても、普通の配列変数だけで実現は可能です。
ただその方法はサンプルスクリプトとしてのスマートさに欠けると思ったので、排他メモリノートを使ったスクリプトとさせていただきました。
↑のスクリプトは動作原理をお見せするために作成したものです。<hr>さんの実力とするためにもコピペで使うのではなく、動作原理を理解した上で1から作り直されることをお勧めします。
|
|
2007/9/6(Thu) 13:22:37|NO.10891
みなさん有難う御座います。
肝心の数字に少し誤記が合った事と、
各内容を説明します。
りんご 3 30.00%
すいか 2 20.00%
かぼちゃ 2 20.00%
ばなな 1 10.00%
かぼす 1 10.00%
みかん 1 10.00%
文章内に出ているワード
ワードの合計数
ワードの出現率
といった3つの要素を表現したかったのです。
分かりにくい文章で申し訳有りません。
|
|
2007/9/6(Thu) 23:41:59|NO.10897
テキストに検索するキーワードがどれだけ含まれているかを、わかり易くしたいということですか?
>とmesbox内でソートするにはどのように記述していけばよいでしょうか?
…>といった3つの要素を表現したかったのです。
ちょうど eller さんの
>>出現率表示や出現頻度順のソートは簡単だと思うので省きました。
省かれた部分っぽい…。
#include "hspda.as"
; テキスト
txt = {"りんご みかん すいか かぼす かぼちゃ
かぼちゃ りんご すいか りんご ばなな"}
; 検索するキーワード
key = "りんご", "すいか","かぼちゃ", "みかん", "ばなな"
n = length(key) ; 検索キーワードの数
dim count, n ; 見つかったキーワードの数を代入する変数
repeat n
c = cnt : i = 0
repeat length(key)
a = instr(txt, i, key(c)) : if a<0 : break
i += a + strlen(key(c)) : count(c)++ ; 見つかったらカウントする
loop
loop
sortval count, 1 ; ソート
sdim ms, 1024
repeat n
sortget a, cnt; ソート元のインデックスを取得
ms += "" + key(a) + ", " + count(cnt) + "個, " + (double(count(cnt))/n*100) + "%\n"
loop
objmode 2
mesbox ms, 640, 480
|
|
2007/9/7(Fri) 17:28:02|NO.10903
>またこの状態で、
>これはりんごですか?いいえ、ばななです。
>等の文章となった場合、
>これは・りんご・ですか・?・いいえ・、・ばなな・です・。
>等のように単語毎に区切ったりはHSPで可能でしょうか?
ちょっと乱暴ですが、「助詞」ごとに区切ればいいと思います。
ただ、
はははははのひにはをぬきにいった。
(こんなやつでしたっけ?とにかくひらがなだらけのもの)
みたいなやつは「は」や「に」で区切られては困るので、「、」でくぎるような処置方法もあります。
ははは、ははのひに、はを、ぬきにいった。
う〜〜ん。こんな感じでいいんでしょうか?
|
|
2007/9/7(Fri) 17:44:13|NO.10904
もっこさん
まさにベストな解答有難う御座います。
検索の部分をいじっているのですが、
検索窓をつけて文字を入力して書き出すと、
そのワードしか出ず常に100%になってしまうのですが、
その場合、非表示状態で全体の検索を行うようなスクリプトを考えていく方が
スマートな表記になるのでしょうか?
|
|
2007/9/7(Fri) 19:56:56|NO.10908
少々長いソースになっていたので、
質問部分のみ端折ってみたのですが、まだ長くて申し訳有りません。
このソースを一度実行してもらうと分かりやすいと思うのですが、
取得したテキスト部分をソートしていきたいのでした。
今、HELPの部分に もっこさん の検索ソートを追記させて反映させているのですが
どうも綺麗に動いてない状態です。
cls 2
screen 0,310,605
title "サンプル-Ver1.2"
#include "hspda.as"
#module "Sort"
#deffunc SoortStr array a, int R, int L
x= a.(R+rnd(L-R)) : i= R : j= L
repeat
repeat
if a.i!x!m : break
i++
loop
repeat
if x!a.j!m : break
j--
loop
if i >= j : break
t= a.i : a.i= a.j : a.j= t
t= b.i : b.i= b.j : b.j= t
i++ : j--
loop
if R<i-1 : SoortStr a, R, i-1
if j+1< L : SoortStr a, j+1, L
return
#deffunc QsortStr array a, var old, int n, int mode
dim old,n : dup b,old
repeat n
b.cnt=cnt
loop
m=((mode)&1)*2-1 : SoortStr a, 0, n-1
return
#deffunc SepArray array a, var buf
i=0
repeat
getstr a.cnt, buf,i
if strsize=0 : break
i+strsize
loop
return
#deffunc AddArray var buf,array a, int n, int mode
i=0
repeat n-1
if mode:if a.cnt="" : continue
poke buf,i, a.cnt+"\n" : i+strsize
loop
poke buf,i, a(n-1)
return
#global
;***** HTMLタグを除去 (comobj56.hsp) *****
#module
#deffunc delspace var prm1,str prm2
return ((peek(buf,idx)^$20)-$a1&$ff)<=$3b ;全角1 半角0
strText = prm2 : ls=strlen(strText) : if ls==0 : return -1
sdim value,ls : tempstr=""
repeat ls
tempstr=strmid(strText,cnt,1)
if tempstr=" "|tempstr="\t" : continue
value+=tempstr
loop
prm1=value : sdim value,0
return 0
#global
pos 5,5
objsize 150.40
button "テキストソース取得",*tagdel
url="http://616.vc/"
input url,149
pos 155,5
objsize 150.40
button "抜き出しテキスト保存",*save
objid=4
button "Help",*aaa
pos 5,60
ReturnHTML="\n\n\n\tテキストソースが表示されます。"
font "MS ゴシック",12 : objmode 2
mesbox ReturnHTML,300,250,1
objectID=box2 : objsel objectID
pos 5,350
kaki="\n\n\n\t解析結果が表示されます。"
font "MS ゴシック",12 : objmode 3
mesbox kaki,300,250,1
objectID=box3 : objsel objectID
stop
*tagdel
;▼IE(InternetExplorer.Application)オブジェクトを作成
newcom objIE, "InternetExplorer.Application"
objIE("Silent") = 1
objIE("Visible") = 0
objIE->"Navigate" url
gosub *busywait
objDoc=objIE("Document")
objBody=objDoc("body")
ReturnHTML=objBody("innerText")
objprm 4,ReturnHTML
objIE->"Quit"
delcom objDoc
delcom objBody
delcom objIE
stop
*busywait
;▼ページの読み込みが終了するまで待つ
title "ページ内のタグ等削除中です。"
repeat
wait 5
if objIE("Busy")==0 : break
loop
objDoc=objIE("Document")
repeat
wait 5
if (objdoc("readyState") == "complete") : break
loop
title "TAG全滅"
return
*save
;▼変換後のファイルを保存
dialog "txt",17 : if stat=0 : stop
notesel ReturnHTML : notesave refstr
stop
//もっこさんのスクリプトをつかわさせて貰っています
*aaa
screen 1,300,650
; テキスト
txt =ReturnHTML
; 検索するキーワード
key = ""
input key
button"検索",*tag
stop
*tag
n = length(key) ; 検索キーワードの数
dim count, n ; 見つかったキーワードの数を代入する変数
repeat n
c = cnt : i = 0
repeat length(key)
a = instr(txt, i, key(c)) : if a<0 : break
i += a + strlen(key(c)) : count(c)++ ; 見つかったらカウントする
loop
loop
sortval count, 1 ; ソート
sdim ms, 1024
repeat n
sortget a, cnt; ソート元のインデックスを取得
ms += "" + key(a) + ", " + count(cnt) + "ワード, " + (double(count(cnt))/n*100) + "%\n"
loop
objmode 2
mesbox ms, 300, 25
| |
|
2007/9/7(Fri) 20:31:09|NO.10912
>少々長いソースになっていたので、
それだけ書けるのに…
ellerさんのサンプル見ましたか?
#include "hspda.as"
; テキスト
txt = {"<br/>MZ(FFFF0000esp-0x1000(PE"}
; 検索するキーワードを半角スペースで区切って指定
intxt = "<br/> ページ esp MZ PE"
objsize 256 : objmode 2 :input intxt
button "検索", *Search
stop
*Search
key = "" : i = 0 : len = strlen(intxt)
repeat
; 入力したキーワードを key に代入する
a = instr(intxt, i, " ") : if a<0 { key(cnt) = strmid(intxt, i, len) : break }
key(cnt) = strmid(intxt, i, a) : i += a + 1
loop
; ### 以下同じ ### ;
n = length(key) ; 検索キーワードの数
dim count, n ; 見つかったキーワードの数を代入する変数
repeat n
c = cnt : i = 0
repeat length(key)
a = instr(txt, i, key(c)) : if a<0 : break
i += a + strlen(key(c)) : count(c)++ ; 見つかったらカウントする
loop
loop
sortval count, 1 ; ソート
sdim ms, 1024
repeat n
sortget a, cnt; ソート元のインデックスを取得
ms += "" + key(a) + ", " + count(cnt) + "個, " + (double(count(cnt))/n*100) + "%\n"
loop
mesbox ms, 640, 128
|
|
2007/9/7(Fri) 20:41:48|NO.10913
あ〜
>ms += "" + key(a) + ", " + count(cnt) + "個, " + (double(count(cnt))/n*100) + "%\n"
これだと、検索するキーワードが多いと100%を超えてしまいすね…
|
|
2007/9/7(Fri) 21:20:37|NO.10919
もっこさん、返信有難う御座います。
そうなんですよ、検索すると
検索結果から100%の割り振りとなるため、
検索されなかった文章全体からの比率が分からないのです。
その方法がどうしたものかと悩んでいまして、
例えば、
りんご 3 30.00%
すいか 2 20.00%
かぼちゃ 2 20.00%
ばなな 1 10.00%
かぼす 1 10.00%
みかん 1 10.00%
初期に投稿した結果表記ですが
先ほど私が書き込んだソースの場合、
固定ではなく、取得された情報がテキスト化されています。
その情報をこのりんごリスト?のように表示させるには
書き出されたテキストの中から判別しなくてはいけなくなってしまいます。
接続詞で区切る事も考えていたのですが
りんごすいかばなな
というワードが出現すれば、
りんごすいかばなな
その部分から りんご すいか ばなな の数と%を表記するのに
りんご すいか ばななを先に指定しておく方法しか無いのでしょうか・・・
この上記の方法がベストなのですが、
検索窓を付けて一部だけ摘出に妥協?した場合は成功しそうなのですが
もっこさんや皆さんに教えていただいてる方法から
取得したリストから、検索窓に入力した単語の比率部分のみ摘出
という方法に結びつきません・・・
りんごとだけ検索した場合に結果に
りんご 4個 25.02%
などと全体のワードの比率からの計算となると
根本の考え方を変えないといけないのでしょうか・・・
数日このプログラムに悩まされて心が折れそうになって来ました
でもがんばってみます!
できれば皆様もう少しだけお付き合いお願いします。
またまた長文失礼致しました
|
|
2007/9/7(Fri) 22:19:23|NO.10929
>>これは・りんご・ですか・?・いいえ・、・ばなな・です・。
単語だけの辞書ファイルを作成し、
一番長い単語とマッチした場合 ひとつの単語としてくぎる。
検索文字列が「これ」だとして
×これ
○これは
×これくたー
一番長いこれくたー には 「く」の文字が違うので×
これによって これは が 一番適しているといえる。
次のループでは 「りんご」も同様に辞書チェックしていけばいいと思います。
|
|
2007/9/7(Fri) 23:08:23|NO.10937
>その部分から りんご すいか ばなな の数と%を表記するのに
>りんご すいか ばななを先に指定しておく方法しか無いのでしょうか・・・
人間も基準となるものがあるから(りんごは赤っぽいとか…と記憶しているから)判断できるわけで、コンピュータもあらかじめ判断材料を指定しておかなければなりません。
指定するキーワードがひとつしかない(判断材料が一つ)と、ほかのものと比べることはできません。
質問の回答としては、りんご すいか ばななを先に指定しておいて文法を単語ごとに調べる方法以外無いと思います。
大変なことですが、がんばってください。
以下のプログラムは提案ですが、検索した任意のキーワードに対して見つかったキーワードが何%あったか得るようにしてみてはいかがですか。
これなら検索する人が指定する任意のキーワードの情報が得られますし。
#include "hspda.as"
; テキスト
txt = {"<br/>MZ<br/>(FFFF0000esp-0x1000(PE"}
; 検索するキーワードを半角スペースで区切って指定
intxt = "<br/> ページ kernel かっこ esp MZ PE"
objsize 256 : objmode 2 :input intxt
button "検索", *Search
stop
*Search
key = "" : i = 0 : len = strlen(intxt)
repeat
; 入力したキーワードを key に代入する
a = instr(intxt, i, " ") : if a<0 { key(cnt) = strmid(intxt, i, len) : break }
key(cnt) = strmid(intxt, i, a) : i += a + 1
loop
n = length(key) ; 検索キーワードの数
dim count, n ; 見つかったキーワードの数を代入する変数
all = 0 ; count の合計
repeat n
c = cnt : i = 0
repeat length(key)
a = instr(txt, i, key(c)) : if a<0 : break
i += a + strlen(key(c)) : count(c)++ : all++ ; 見つかったらカウントする
loop
loop
sortval count, 1 ; ソート
sdim ms, 1024
repeat n
sortget a, cnt; ソート元のインデックスを取得
ms += "" + key(a) + ", " + count(cnt) + "個, " + (double(count(cnt))/all*100) + "%\n"
loop
mesbox ms, 640, 256
| |
|