HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2007
0905
<hr>呼び込んだtxtのソートについて。15未解決


<hr>

リンク

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内でソートするにはどのように記述していけばよいでしょうか?



この記事に返信する


<hr>

リンク

2007/9/5(Wed) 20:39:54|NO.10885

追記

またこの状態で、


これはりんごですか?いいえ、ばななです。

等の文章となった場合、

これは・りんご・ですか・?・いいえ・、・ばなな・です・。

等のように単語毎に区切ったりはHSPで可能でしょうか?



D.K

リンク

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などの数値や%というのは一体何の値なんでしょうか?
それを基準にして並べ替えるということなら出来ます。
書き込みだけでは何を基準に並べ替えてるかがよくわからないのですが…



Mimura

リンク

2007/9/5(Wed) 23:04:34|NO.10888

横から失礼します。
instr や strmid 等の文字列の操作コマンドを利用して、
文字を検索して、見つかったらカウントしていくという形はいかがでしょうか。
また、文字列を単語ごとに分解する場合などは、
特徴を探して、それがきたら分割という形はいかがでしょう。
たとえば、
「これは」「あれは」などをまとめて、「れは」がきたら区切る。といった形で。
ただ、一例ですのでご自分で考えてくんでみることをおすすめします。



eller

リンク

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を利用するのが簡単だと思います。



eller

リンク

2007/9/6(Thu) 06:27:20|NO.10890

一応補足を……!

特に排他メモリノートや連想配列を使わなくても、普通の配列変数だけで実現は可能です。
ただその方法はサンプルスクリプトとしてのスマートさに欠けると思ったので、排他メモリノートを使ったスクリプトとさせていただきました。

↑のスクリプトは動作原理をお見せするために作成したものです。<hr>さんの実力とするためにもコピペで使うのではなく、動作原理を理解した上で1から作り直されることをお勧めします。



<hr>

リンク

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で可能でしょうか?

ちょっと乱暴ですが、「助詞」ごとに区切ればいいと思います。
ただ、

はははははのひにはをぬきにいった。
(こんなやつでしたっけ?とにかくひらがなだらけのもの)

みたいなやつは「は」や「に」で区切られては困るので、「、」でくぎるような処置方法もあります。

ははは、ははのひに、はを、ぬきにいった。

う〜〜ん。こんな感じでいいんでしょうか?



<hr>

リンク

2007/9/7(Fri) 17:44:13|NO.10904

もっこさん
まさにベストな解答有難う御座います。

検索の部分をいじっているのですが、

検索窓をつけて文字を入力して書き出すと、

そのワードしか出ず常に100%になってしまうのですが、
その場合、非表示状態で全体の検索を行うようなスクリプトを考えていく方が
スマートな表記になるのでしょうか?



<hr>

リンク

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%を超えてしまいすね…



<hr>

リンク

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%

などと全体のワードの比率からの計算となると
根本の考え方を変えないといけないのでしょうか・・・

数日このプログラムに悩まされて心が折れそうになって来ました


でもがんばってみます!

できれば皆様もう少しだけお付き合いお願いします。

またまた長文失礼致しました



L

リンク

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



ONION software Copyright 1997-2023(c) All rights reserved.