FirteX开发论坛 » FirteX用户专区 » 哈哈,第一帖,今天才知道这个软件和论坛

原贴:http://www.firtex.org/firtex_forum/archiver/?tid-52-page-3.html

哈哈,第一帖,今天才知道这个软件和论坛

ADMIN你好,今天才看到这个软件和论坛,看了一些帖子了,代码还没有研究呢。 机器上也没有C/C++的平台。不知道FIRTEX能否用VC97打开啊,必须用VS2003吗?不知道那部分是进行切词的阿,能否告知啊?这样俺也就可 以直接看相应的代码了!你说的这个FIRTEX代码的框架结构在哪里啊?没有发现噢!

[[i] 本帖最后由 yxg_80 于 2007-3-1 04:13 PM 编辑 [/i]]

2007-3-1 04:34 PM yxg_80
我在看FirteX编译和安装,代码没有看呢,能否告知切词的代码的位置??嗬嗬!:)

2007-3-4 12:45 PM admin
在src/analyzer目录下的CChineseAnalyzer.cpp

2007-3-4 02:19 PM yxg_80
好的,谢谢,今天终于买到visual studia .net 了,上午刚安装完成.刚才调试了一下,结果如下:
LINK : fatal error LNK1104: 无法打开文件“../../lib/comD.lib”
LINK : fatal error LNK1104: 无法打开文件“../../lib/FirteXD.lib”
---------------------- 完成 ---------------------

    生成: 3 已成功, 2 已失败, 0 已跳过
郭先生如果在,能否帮忙看看,如果不在线,那我就自己慢慢找原因!:P:)

2007-3-4 02:45 PM yxg_80
生成: 5 已成功, 0 已失败, 0 已跳过
呵呵,不知道怎么就成功了!:D
"重新生成解决方案“两次就可以了

[[i] 本帖最后由 yxg_80 于 2007-3-7 04:23 PM 编辑 [/i]]

2007-3-7 04:23 PM yxg_80
再问一个问题,Field是用来干什么的!程序里边解释的不少,但是不知道主要在什么时候使用阿

[[i] 本帖最后由 yxg_80 于 2007-3-7 04:25 PM 编辑 [/i]]

2007-3-7 10:27 PM admin
索引的对象是文档(document),每个document可以包含1个或者多个域(field),和数据库的域有点类似
例如如果需要索引网页的标题,正文,时间则可以将这个网页转化成有三个域的document(标题域,正文域和时间域)

2007-3-8 09:31 AM yxg_80
谢谢郭先生!

2007-3-9 09:02 PM yxg_80
:( :)

[[i] 本帖最后由 yxg_80 于 2007-3-12 05:38 PM 编辑 [/i]]

2007-3-14 09:34 PM yxg_80
各位,在CChineseAnalyzer.cpp中nPos = base + m_charset[code];//current position的意思原理是什么啊?
执行if(!pInput->appendWord(nWordHandle))时 *(((termid_t*)m_buffer) + m_nTokenNum) = tid是用来记录这个词在词典中的相对位置吗?那么如果要显示这个词如何显示呢?希望各位达人或正在理解的人提供一点思路!谢谢喽!

2007-3-15 09:17 AM admin
要理解CChineseAnalyzer.cpp中的代码,请先找一些使用双数组TRIE树分词的资料看看。if(!pInput-> appendWord(nWordHandle))是将词ID添加至Tokens 容器中,*(((termid_t*)m_buffer) + m_nTokenNum) = tid 是将词ID写入容器的buffer中,不同种类的token可以有不同的存储格式,目前仅使用数字ID类型的Token。

2007-3-15 07:58 PM yxg_80
在CChineseAnalyzer.cpp中,CChineseAnalyzer::Load(const tchar *sFilename)是将词典的数据读入
struct state
{//state information in double-array trie
        int base;        //base value
        int check;        //check value
        int handle;        //handle for dictionary entry
};
中,在分词时如果m_pData[i].base<0,则说明切词成功,并将m_pData[i].handle存入CTokens中,但是如何根据handle这个词典入口显示该词呢?

2007-3-15 09:07 PM yxg_80
state中没有字符型数据,那么字典中的词存到哪里了呢?双数组TRIE理论中,GB2312中的基本汉字转化成1-
6768的顺序码,以作为状态转换的基本量值。看来这个词典也得好好研究了。是不是根据handle来求顺序码呢?有兴趣地来讨论讨论,没有,俺就自娱自乐了,呵呵!:):D:P

2007-3-16 01:23 PM yxg_80
一个汉字对应2个字节,2^16=65536,所以定义char_set[65536],code = ((uint32_t)((uint8_t)sLine[i - buffbase]) << 8) + (uint8_t)sLine[i+1-buffbase]应该是本汉字无符号值,char_set[code]中存储的就是对应的“GB2312中的基 本汉字转化成1-6768的顺序码“这种理解,感觉应该是正确的!

2007-3-16 02:27 PM admin
呵呵,想研究给你帖篇同学的论文,自己在网上搜一下,论文题目如下:
王思力,张华平,王斌,双数组Trie树算法优化及其应用研究,《中文信息学报》,2006 Vol. 20, No. 5: 24-30

有什么心得继续帖上来:)

2007-3-16 03:14 PM yxg_80
双数组Trie树算法,在我这里只查到了两篇,王思力的这篇看过,还有一篇“汉语词典的快速查询算法研究“,这个更容易理解一些,想研究双数组的也可以参照我说的这篇。谢谢关照了。
“东”在GB2312编码中的值为46763,即程序中 根据((uint32_t)((uint8_t)sLine[i - buffbase]) << 8) + (uint8_t)sLine[i+1-buffbase]计算“东“得到的值,而m_charset[46763]=230,那么是不是“东“在 coredict.pdat 中的顺序码是230呢?
先写到这里,*(((termid_t*)m_buffer) + m_nTokenNum) = tid 这句存储handle的 理论基础 还没有想通,而且在程序的解释中又解释handle是//handle for dictionary entry,那么根据这个handle能够直接查到这个 切出来的词,但是怎么输出这个词呢?

我就是想知道handle怎么和切出来的词关联上,实在是没有征明白!admin能否给指个路?各位达人,有理解的否?

中  =54992   m_charset[54992]=62                   m_pData[62].base=-12173
国  =47610   国的顺序码m_charset[47610]= 57   nPos=12230(中国的顺序码) m_pData[57].base=20090
日  =51413   m_charset[51413]=156                 nPos= 20246(国日)          m_pData[20246].chec=17090
                  m_pData[156].base=-15081                  
报  =45480  m_charset[45480]=558                  nPos=15639(日报)

中国日报,正确的分法应该是 中/国/日/报/,还是 中国/日报。感觉程序分成了第一种呢!不知道这样对吗?我是跟程序跟出来的。
handle=11936 / handle=3586 / handle=7695 / handle=790 / 是 中国日报 切词后添加到Tokens类 ,m_buffer中的值,不知道怎么根据这些值,输出他们对应的 中国日报 这四个字呢?

有没有达人啊? 来的人太少!

[[i] 本帖最后由 yxg_80 于 2007-3-16 09:06 PM 编辑 [/i]]

2007-3-17 11:51 AM yxg_80
m_charset[1]=1988   m_charset[18]=3068   m_charset[33]=380    m_charset[38]=674    m_charset[39]=51  
m_charset[40]=1202   m_charset[41]=877    m_charset[43]=1989   m_charset[44]=381    m_charset[45]=22  
m_charset[46]=39     m_charset[47]=244    m_charset[48]=271    m_charset[49]=160    m_charset[50]=168
m_charset[51]=257    m_charset[52]=342    m_charset[53]=298    m_charset[54]=343    m_charset[55]=332
m_charset[56]=382    m_charset[57]=365    m_charset[64]=3069   m_charset[65]=27     m_charset[66]=33  
m_charset[67]=26     m_charset[68]=34     m_charset[69]=36     m_charset[70]=43     m_charset[71]=41  
m_charset[72]=42     m_charset[73]=38     m_charset[74]=49     m_charset[75]=45     m_charset[76]=35  
m_charset[77]=29     m_charset[78]=40     m_charset[79]=44     m_charset[80]=31     m_charset[81]=64  
m_charset[82]=37     m_charset[83]=25     m_charset[84]=32     m_charset[85]=48     m_charset[86]=47  
m_charset[87]=46     m_charset[88]=60     m_charset[89]=56     m_charset[90]=58     m_charset[91]=3070
m_charset[93]=3071   m_charset[97]=1      m_charset[98]=17     m_charset[99]=9      m_charset[100]=11  
m_charset[102]=18     m_charset[103]=15     m_charset[104]=14     m_charset[105]=2      m_charset[106]=30  
m_charset[107]=20     m_charset[108]=8      m_charset[109]=12     m_charset[110]=6      m_charset[111]=3   
m_charset[112]=13     m_charset[113]=28     m_charset[114]=4      m_charset[115]=7      m_charset[116]=5   
m_charset[117]=10     m_charset[118]=19     m_charset[119]=21     m_charset[120]=24     m_charset[121]=16  
m_charset[122]=23     m_charset[172]=3072   m_charset[193]=1702   m_charset[255]=1990   m_charset[41378]=3073
m_charset[63399]=5211   m_charset[63401]=5212   m_charset[63406]=5213   m_charset[63408]=5214   m_charset[63409]=5215
m_charset[63412]=5216   m_charset[63413]=5217   m_charset[63415]=5218   m_charset[63416]=5219   m_charset[63417]=5220
m_charset[63421]=5221   m_charset[63423]=5222   m_charset[63424]=5223   m_charset[63427]=5224   m_charset[63433]=5225
m_charset[63435]=5226   m_charset[63436]=5227   m_charset[63437]=5228   m_charset[63439]=5229   m_charset[63441]=3066
m_charset[63442]=5230   m_charset[63447]=5231   m_charset[63454]=5232   m_charset[63456]=5233   m_charset[63457]=5234
m_charset[63464]=1700   m_charset[63467]=1701   m_charset[63468]=3067   m_charset[63473]=5235   m_charset[63485]=5236
m_charset[65381]=2394   m_charset[65390]=5237   m_charset[65396]=5238   
共有 5238 个值,而汉字应该有6763个吧?怎么少了1500左右个字呢?
[ ]中括号中的值是汉字对应GB2312编码中的值,以m_charset[54992]=62为例,54992是“中“对应 GB2312编码中的值,而62 应该是“中”在 coredict.pdat中的顺序值。
不知道各位有对此 有不同意见的吗?大家一同商议!

2007-3-17 01:55 PM admin
FirteX中的分词代码是基于张华平师兄(ICTCLAS作者)的分词代码修改的,对基于双数组TIRE树的中文分词我也没有深入研究,看你对分词研究热情这么高,给你发一篇同学的硕士毕业论文,需要的话留下email:)

2007-3-17 02:49 PM yxg_80
好的。email:[email]yxg_80@163.com[/email]
先谢谢!

2007-3-17 03:16 PM admin
已发

2007-3-17 10:27 PM wubao_2004
我觉得handle是词在某词表中的偏移量,但对FirTex来说,只在制作coredict.pdat文件时用到了

2007-3-18 10:59 AM yxg_80
在ChineseAnalyzer.cpp中,切词后存储只有这个handle,如果像楼上所言,把他理解为偏移量的话倒是也可以。如:
1234567890中国日报
处理完后,得到:
handle=12  handle=34 / handle=56 / handle=78 / handle=90 / handle=11936 / handle=3586 / handle=7695 / handle=790 /
012345678999中国日报 处理完后,得到:
handle=1 / handle=23 / handle=45 / handle=67 / handle=89 / handle=99/ handle=11936 / handle=3586 / handle=7695 / handle=790
在处理的时候,数字也是取两个数为一组,12的handle=12,34的handle=34,...,90的handle=90,中的handle=11936
0的handle=0,也就是说,偏移量是从0开始计算的。也就是说 handle=11936 应该对应“中”

不知道各位认为我的理解是否正确?

2007-3-18 05:10 PM wubao_2004
我的理解是不管是偏移量也好,散列码也罢,只要分析文档和分析query使用同一个analyzer就可以了,FirTex本身不关心handle是个啥,只要不变就行了

2007-3-18 05:55 PM yxg_80
我现在是想得到切分后的词,但是一直没有找到 能够得到 “切分后的词”的方法。不知道楼上的知道得到 “切分后的词”的方法不?

2007-3-18 06:10 PM yxg_80
今天跟程序,得到如下的结果
“中“  的handle=11936, DynamicArray.h中分配内存  block=handle/128=93,offset=handle%128=32,
allocBlock(block)函数的语句如下
for (int i = 0;i<m_blkSize;i++) //m_blkSize=128
{
    m_blocks[blk][i] = NullValue();//NullValue()返回0,blk=93;   
}

然后return m_blocks[93][32],“国”返回return m_blocks[28][2]    ,只跟到这里,也不明白它们之间的联系是什么意义!仅供有心人做个参考。

2007-3-18 09:34 PM wubao_2004
无奈了... ...

2007-3-18 09:41 PM wubao_2004
我觉得很难(或无法)通过跟代码找到“切分后的词”,因为coredict.pdat中什么都有了

2007-3-19 08:37 AM yxg_80
个人感觉也是,coredict.pdat只存在了一些数字,要不然也不会那么小!另辟他路了!

2007-3-19 03:04 PM yxg_80
今天实现了分词,当然不是正确的。
分词原文如下:
中国日报网站消息:阿富汗信息部发言人3月3日称,阿富汗当日发生强烈地震。在首都喀布尔市内,已有至少5人丧生,20人受伤。与此同时,巴基斯坦及印度东北部地区也受到不同程度的影响。此外,与阿富汗北部相邻的塔吉克斯坦和乌兹别克斯坦也有强烈震感。
  据路透社报道,此次地震发生在阿富汗当地时间下午4:40(北京时间3日晚8:10),巴基斯坦首都伊斯兰堡、东部城市拉合尔及阿富汗北部城市马扎里 沙里夫也受到影响。这位发言人称:“至少已有30间房屋倒塌或被严重破坏。”另据当地居民称,遇害人中有一位45岁男子。当时,他家院子里的一堵墙被震 倒,他被压在墙下丧命。
  巴基斯坦白沙瓦地震局的科学家称,此次地震约为里氏6.7级。震中在阿富汗境内的兴都库什山脉,距巴基斯坦西部城市白沙瓦以北250公里。但据美国地 震局统计出来的数字显示,此次地震为里氏7.2级。据悉,6级以上强烈地震就足以造成一定程度的破坏。巴基斯坦北部与阿富汗相邻的吉德拉尔省官员称,目前 他还没有接到任何人员伤亡或是财物损失的报告,但他们仍在较远的人烟稀少的山区探查伤亡情况。另外,地震发生时,居住在白沙瓦和首都伊斯兰堡的民众纷纷离 开自己的家,走上大街以求自保。巴基斯坦北部所有地区的居民都感受到了此次地震。
  在阿富汗,首都喀布尔的市民也争相逃出他们饱受战乱摧残的房屋。此次地震也威胁到了东北部城市马扎里沙里夫。但驻扎在当地的联合国官员证实称,还没有接到民众伤亡的报告。与此同时,印度首都新德里和印巴边界处的克什米尔地区也有轻微震感。
  另外,塔吉克斯坦首都杜尚别部分地区的电力系统受到此次地震的影响而被迫中断。杜尚别地震学家在塔吉克斯坦境内测量出的地震幅度为里氏6级。乌兹别克 斯坦紧急事务部官员也表示,该国境内有4级以上震感。相对来说,阿富汗和巴基斯坦交界地带的兴都库什山脉属于地震多发区。今年1月3日,阿富汗北部就曾受 到程度相近的地震侵袭,所幸未造成较明显的损失。1998年,阿富汗北部塔哈尔省和巴达赫尚省也曾发生两次强烈地震。共有8500人在这两次地震中丧生, 成千上万间房屋被毁。

分词结果如下:

中 国 日 报 网 站 消 息 : 阿 富 汗 信 息 部 发 言 人 3 月 3 日 称 , 阿 富 汗 当 日 发 生 强 烈 地 震 。 在 首 都 喀 布 尔 市 内 , 已 有 至 少 5 人 丧 生 , 20 人 受 伤 。 与 此 同 时 , 巴 基 斯 坦 及 印 度 东 北 部 地 区 也 受 到 不 同 程 度 的 影 响 。 此 外 , 与 阿 富 汗 北 部 相 邻 的 塔 吉 克 斯 坦 和 乌 兹 别 克 斯 坦 也 有 强 烈 震 感 。 据 路 透 社 报 道 , 此 次 地 震 发 生 在 阿 富 汗 当 地 时 间 下 午 4 40 ( 北 京 时 间 3 日 晚 8 10 ) , 巴 基 斯 坦 首 都 伊 斯 兰 堡 、 东 部 城 市 拉 合 尔 及 阿 富 汗 北 部 城 市 马 扎 里 沙 里 夫 也 受 到 影 响 。 这 位 发 言 人 称 : “ 至 少 已 有 30 间 房 屋 倒 塌 或 被 严 重 破 坏 。 ” 另 据 当 地 居 民 称 , 遇 害 人 中 有 一 位 45 岁 男 子 。 当 时 , 他 家 院 子 里 的 一 堵 墙 被 震 倒 , 他 被 压 在 墙 下 丧 命 。 巴 基 斯 坦 白 沙 瓦 地 震 局 的 科 学 家 称 , 此 次 地 震 约 为 里 氏 6 7 级 。 震 中 在 阿 富 汗 境 内 的 兴 都 库 什 山 脉 , 距 巴 基 斯 坦 西 部 城 市 白 沙 瓦 以 北 25 0 公 里 。 但 据 美 国 地 震 局 统 计 出 来 的 数 字 显 示 , 此 次 地 震 为 里 氏 7 2 级 。 据 悉 , 6 级 以 上 强 烈 地 震 就 足 以 造 成 一 定 程 度 的 破 坏 。 巴 基 斯 坦 北 部 与 阿 富 汗 相 邻 的 吉 德 拉 尔 省 官 员 称 , 目 前 他 还 没 有 接 到 任 何 人 员 伤 亡 或 是 财 物 损 失 的 报 告 , 但 他 们 仍 在 较 远 的 人 烟 稀 少 的 山 区 探 查 伤 亡 情 况 。 另 外 , 地 震 发 生 时 , 居 住 在 白 沙 瓦 和 首 都 伊 斯 兰 堡 的 民 众 纷 纷 离 开 自 己 的 家 , 走 上 大 街 以 求 自 保 。 巴 基 斯 坦 北 部 所 有 地 区 的 居 民 都 感 受 到 了 此 次 地 震 。 在 阿 富 汗 , 首 都 喀 布 尔 的 市 民 也 争 相 逃 出 他 们 饱 受 战 乱 摧 残 的 房 屋 。 此 次 地 震 也 威 胁 到 了 东 北 部 城 市 马 扎 里 沙 里 夫 。 但 驻 扎 在 当 地 的 联 合 国 官 员 证 实 称 , 还 没 有 接 到 民 众 伤 亡 的 报 告 。 与 此 同 时 , 印 度 首 都 新 德 里 和 印 巴 边 界 处 的 克 什 米 尔 地 区 也 有 轻 微 震 感 。 另 外 , 塔 吉 克 斯 坦 首 都 杜 尚 别 部 分 地 区 的 电 力 系 统 受 到 此 次 地 震 的 影 响 而 被 迫 中 断 。 杜 尚 别 地 震 学 家 在 塔 吉 克 斯 坦 境 内 测 量 出 的 地 震 幅 度 为 里 氏 6 级 。 乌 兹 别 克 斯 坦 紧 急 事 务 部 官 员 也 表 示 , 该 国 境 内 有 4 级 以 上 震 感 。 相 对 来 说 , 阿 富 汗 和 巴 基 斯 坦 交 界 地 带 的 兴 都 库 什 山 脉 属 于 地 震 多 发 区 。 今 年 1 月 3 日 , 阿 富 汗 北 部 就 曾 受 到 程 度 相 近 的 地 震 侵 袭 , 所 幸 未 造 成 较 明 显 的 损 失 。 19 98 年 , 阿 富 汗 北 部 塔 哈 尔 省 和 巴 达 赫 尚 省 也 曾 发 生 两 次 强 烈 地 震 。 共 有 85 00 人 在 这 两 次 地 震 中 丧 生 , 成 千 上 万 间 房 屋 被 毁 。

只能达到将字分开,但是未能将词分开,努力ing!

[[i] 本帖最后由 yxg_80 于 2007-3-19 03:06 PM 编辑 [/i]]

2007-3-25 08:24 PM yxg_80
这个程序看了这么长的时间,现在感觉coredict.pdat只适合将汉语逐字分开,但是想切成 词语,我感觉不可能。
以中国为例(个人感觉“中国"应该是一个独立的单词):
中:m_charset[54992]=62                   m_pData[62].base=-12173
国:m_charset[47610]= 57                 |m_pData[62].base|+57=nPos=12230(中国的顺序码)
假如m_pData[12230].check=62,按照双数组trie定义(“中国”的check=中对应的数组下标),“中国”可以切分为词。
但是太多的情况下,确不是这样,即m_pData[ab].check!=a对应的数组下标,即使ab是一个单词但是也无法切分出来。

真得不知道这个词库是我理解错了,还是这个词库设计出来的目的不是为了切词。但是根据词典生成词库应该能够用来进行分词啊。万分的不理解!:'(:'(:'(:'(

[[i] 本帖最后由 yxg_80 于 2007-6-6 09:01 PM 编辑 [/i]]

admin
分词算法与切词结果是没有直接关系的,词典中有这个词自然就切成一个词,如果没有那就切成字的组合。例如“检索”,如果coredict.dat中包含了 "检索"这个词,那就切成一个词,如果不包含就切成“检"和”索“。防止一些商业公司在未授权的情况下商业使用FirteX,因此我们现在发布的版本提供 的词典包含的中文词语较少,但英文比较全。

2007-3-26 08:14 AM yxg_80
哈哈,谢谢郭先生的答复,虽然您现在答复我。但是我通过自己跟程序也发现了这个问题。
“中国” “中华“ “阿富“  能切出来,也就是说词库里有,但是“阿富汗",”消息“就不行了,词库里就没有了。
词库里差得太多了!!!!!!!

2007-3-26 09:19 AM yxg_80
如何申请,也就是在那里申请?我刚看到你的留言,还没有找在那里申请呢~!

2007-3-26 06:25 PM admin
邮件就行

2007-3-30 02:36 PM xifeng_2002
能向词库中添短语吗

我也想得到短语,而且看了google数学之美 系列一([url]http://googlechinablog.com/2006/04/blog-post.html[/url])中统计语言模型 合系列二([url]http://googlechinablog.com/2006/04/blog-post_10.html[/url])中的维 特比”(Viterbi) 算法快速地找到最佳分词,很需要这样一个东西:先从文本得到分词和短语,而且知道了单字和短语的最常用组合,从而形成特定领域的词库,或者说是对特定领域 有效的词库,这样使用TF/IDF就有保障了,而且匹配精度一定有保障,不知道FirteX中有没有这样的实现,思路什么?请赐教!

上次来的时候就看到yxg要申请什么东西,是不是可以申请向词库中添短语?mail真的行吗?

2007-3-30 03:27 PM xifeng_2002
如何利用统计语言模型分词、统计单字和短语词频

本来不想陷得太深,但是为了整理思路,也为了处理Textual Cased-Based Reasoning(TCBR)问题,特此撰文。

今天已经是我接触中文信息处理技术的第三天。因为我在做基于案例的推理(Cased-Based Reasoning,CBR)的时候,碰到的资料就是文本的,提取属性比较困难,而我又懒得去一个一个统计它们的<属性,值>对,所以就想借 助信息检索(Information Retrieval,IR)技术来完成这个工作,从而转化成传统CBR方法能够解决的问题。但是,在IR方面的水平有限,只是看了Google黑板报中的 系列之一、二、九、十二之后,查到了两个工具 lucene 和 lemur。

我的问题是,分词(像中科院分词系统的效果),并建立索引,便于进行文本相关度计算,以及其他的处理,因为基于信息熵的 TF/IDF 的价值不可估量,所以我急需一个这样的东西,也希望大家能够提供一些帮助。

现有的FirteX中只有对单字的词频统计,没有对短语的词频统计,中科院分词系统ICTCLAS分词效果不错,但是与短语词频统计相结合来计算 TF/IDF 的值却不知如何来用程序实现?

[[i] 本帖最后由 xifeng_2002 于 2007-4-3 07:20 PM 编辑 [/i]]

2007-3-30 04:12 PM admin
FirteX是一个检索系统,没有直接提供你所说的功能。可以把你的特定领域的词库发给我,帮你生成一个新的FirteX的分词词典,词典中短语的TF和IDF就可以通过FirteX的相关接口直接得到。
[quote]原帖由 [i]xifeng_2002[/i] 于 2007-3-30 02:36 PM 发表
我也想得到短语,而且看了google数学之美 系列一([url]http://googlechinablog.com/2006/04/blog-post.html[/url])中统计语言模型 合系列二([url]http://googlechinablog.com/2006/04/blog-post_10.html[/url])中的维 特比”(Viterbi ... [/quote]

2007-3-30 04:57 PM xifeng_2002
你说的词库是?

不好意思,基础概念不是很清楚,你说的这个词库是词典吗,还是文本集合?
要是词典的话,我还没有做好分词。因为用单字来表示不能满足要求,两字或多字的短语的表示我还没有归纳。
文本集合倒是有,不知道你是要合并在一个文件中的那种,还是逐个分开的那种?

单字的<词ID;词频>我倒是通过FirteX得到了,这个行不?

[[i] 本帖最后由 xifeng_2002 于 2007-3-30 04:58 PM 编辑 [/i]]

2007-4-3 08:47 AM yxg_80
记录:在chineseAnalyzer.cpp的构造函数中,只有tstring dict = GlobalConfig.General.Path + _T("//data//coredict.pdat");Load(dict.c_str())将词库读入m_pData中,但是停用词就没有读,也没 有定义停用词的数组。

管理员:问一下,stopword.stf用 CChineseAnalyzer::Load的函数能不能将内容读出来啊,我刚才看了一下,stopword.stf中m_charset[960]= 232029   m_charset[961]=-842150451,>=961的全是-的。这个停用词库全吗?

我如果想使用停用词,我应该如何修改程序啊?请赐教

[[i] 本帖最后由 yxg_80 于 2007-4-3 09:05 AM 编辑 [/i]]

2007-4-3 09:11 AM admin
词典,一行一个词
[quote]原帖由 [i]xifeng_2002[/i] 于 2007-3-30 04:57 PM 发表
不好意思,基础概念不是很清楚,你说的这个词库是词典吗,还是文本集合?
要是词典的话,我还没有做好分词。因为用单字来表示不能满足要求,两字或多字的短语的表示我还没有归纳。
文本集合倒是有,不知道你是要 ... [/quote]

2007-4-3 09:13 AM admin
停用词由CStopFilter完成,你只要配置好参数文件即可,如果想生成自己的停用词文件可以使用Fxist完成(在工具菜单栏)
[quote]原帖由 [i]yxg_80[/i] 于 2007-4-3 08:47 AM 发表
记录:在chineseAnalyzer.cpp的构造函数中,只有tstring dict = GlobalConfig.General.Path + _T("//data//coredict.pdat");Load(dict.c_str())将词库读入m_pData中,但是停用词就没有读,也没 有定义停 ... [/quote]

2007-4-3 02:58 PM yxg_80
谢谢,已经修改完成了。我没有大型的测试库,自己的停用词是不行了,先用你们的,呵呵
现在还在修改,想法子把我的融到你们提供的平台里。
有新发现或问题我会贴出来的!

2007-4-4 08:27 AM yxg_80
admin:

在analyzer.cpp中
case FIELDVALUE_READER://通过Reader
{
pTokens = pTokenField->tokensValue();
pTokens->clear();
reader = pField->readerValue();
pTokens = nextTokens(reader,pTokens);     此处返回的是return tokenFilter(。。。),所以
pTokens = tokenFilter(pTokens)                    此处是不是可以不用了,重复了
请指教。

2007-4-4 12:59 PM admin
是的,多了一行,已修正,谢谢!

2007-4-5 03:52 PM yxg_80
WordFieldIndexer.cpp 的作用是干什么的?
curPosting = pBuilder->find(tids[i])的作用呢?请各位指教!

2007-4-5 04:55 PM stickyman
应该是生成索引部分吧。
WordFieldIndexer是firtex提供的两个field的一个,还有一个是DateFieldIndexer,不过这个似乎不灵
通过FieldFactory.cpp创建,在IndexBarrelWriter.cpp中使用

2007-4-5 05:10 PM admin
[quote]原帖由 [i]stickyman[/i] 于 2007-4-5 04:55 PM 发表
应该是生成索引部分吧。
WordFieldIndexer是firtex提供的两个field的一个,还有一个是DateFieldIndexer,不过这个似乎不灵
通过FieldFactory.cpp创建,在IndexBarrelWriter.cpp中使用 [/quote]
配置好了,DateFieldIndexer应该可以使用啊,不过这个索引器没有严格测过

2007-4-5 05:34 PM yxg_80
FILE* fp = NULL;
char *outPutFileName="YXGresult.txt";
int i=0;
PARRAY_CHAIN_yxg array=new ARRAY_CHAIN_yxg[wordNum];
fp=_tfopen(outPutFileName,_T("w"));
pCur=m_pHead;
while(pCur!=NULL)
{
        array[i].handle =pCur->hanle;
        array[i].sWord =pCur->sWord;
        array[i].intfrequency =pCur->intfrequency;
        i++;
        pCur=pCur->next ;
}
                       
fwrite(&wordNum,sizeof(int),1,fp);
fwrite(array,sizeof(ARRAY_CHAIN_yxg),wordNum,fp);
delete [] array;                                   删除动态分配的数组是不是这样啊?这句感觉不好用啊
fclose(fp);

fp=_tfopen(outPutFileName,_T("r"));
fread(&word_Bound,1,sizeof(int),fp);
m_nLength=word_Bound+1;
if(yxgarray)
{
        free(yxgarray);
}
yxgarray=0;
yxgarray=(PARRAY_CHAIN_yxg)malloc(sizeof(ARRAY_CHAIN_yxg)*word_Bound);
fread(yxgarray,sizeof(ARRAY_CHAIN_yxg),word_Bound,fp);
for(i= 0 ; i < word_Bound; i++)
        cout<<yxgarray[i].handle<<""<<yxgarray[i].sWord <<" "<<yxgarray[i].intfrequency <<"                i="<<i<<endl;
delete [] yxgarray;
fclose(fp);

问你们一个基本的问题啊,不想自己查资料了。我自己想文件里输出数据,为什么读的时候,说不上在某个时候就说错误:fxist4cD.exe 中的 0x102157ac (msvcr71d.dll) 处未处理的异常: 0xC0000005: 读取位置 0xcdcdcdcd 时发生访问冲突 。
大家帮我看看了,谢谢啊!

2007-4-5 05:38 PM admin
没仔细看,但很明显 下面这个地方有问题:
yxgarray=(PARRAY_CHAIN_yxg)malloc(sizeof(ARRAY_CHAIN_yxg)*word_Bound);
fread(yxgarray,sizeof(ARRAY_CHAIN_yxg),word_Bound,fp);
for(i= 0 ; i < word_Bound; i++)
        cout<<yxgarray.handle<<""<<yxgarray.sWord <<" "<<yxgarray.intfrequency <<"                i="<<i<<endl;
delete [] yxgarray;

yxgarray 用malloc分配但是却用delete[] 释放
malloc/free,new/ delete 必须配对使用

2007-4-5 05:50 PM yxg_80
哦,哈哈,谢谢!

2007-4-5 06:12 PM yxg_80
在这里怎么这么难看,那位对fwrite,和fread熟悉,帮个忙看看,哪个地方有问题。在输出的时候老是提示错误。把代码复制下来,在自己的机器上看吧,这里太不好辨认了。
                               struct ArrayChain
                {
                        int                handle;
                        int                intfrequency;       
                        char        *sWord;                       
                };
                typedef struct ArrayChain ARRAY_CHAIN_yxg,*PARRAY_CHAIN_yxg;

                                                FILE* fp = NULL;
                        char *outPutFileName="YXGresult.txt";
                        int i=0;
                        PARRAY_CHAIN_yxg array=new ARRAY_CHAIN_yxg[wordNum];
                        fp=_tfopen(outPutFileName,_T("w"));
                        pCur=m_pHead;
                        while(pCur!=NULL)
                        {
                                array[i].handle =pCur->hanle;
                                array[i].sWord =pCur->sWord;
                                array[i].intfrequency =pCur->intfrequency;
                                i++;
                                pCur=pCur->next ;
                        }
                       
                        fwrite(&wordNum,sizeof(int),1,fp);
                        fwrite(array,sizeof(ARRAY_CHAIN_yxg),wordNum,fp);
                        delete [] array;
                        fclose(fp);


                        fp=_tfopen(outPutFileName,_T("r"));
                        fread(&word_Bound,1,sizeof(int),fp);
                        m_nLength=word_Bound+1;
                        if(yxgarray)
                        {
                                free(yxgarray);
                        }
                        yxgarray=0;
                        yxgarray=(PARRAY_CHAIN_yxg)malloc(sizeof(ARRAY_CHAIN_yxg)*word_Bound);
                        fread(yxgarray,sizeof(ARRAY_CHAIN_yxg),word_Bound,fp);
                        for(i= 0 ; i < word_Bound; i++)
                                cout<<yxgarray[i].handle<<"                "<<yxgarray[i].sWord <<" "<<yxgarray[i].intfrequency <<"                i="<<i<<endl;
                        free(yxgarray);
                        fclose(fp);

[[i] 本帖最后由 yxg_80 于 2007-4-5 06:17 PM 编辑 [/i]]

2007-4-5 07:23 PM stickyman
只分配了ArrayChain的内存空间,有为sWord分配内存空间吗?

2007-4-5 07:25 PM stickyman
struct ArrayChain
                {
                        int                handle;
                        int                intfrequency;      
                        char        sWord[128];                       
                };
试试看?

2007-4-5 07:39 PM yxg_80
感觉不是这个问题,我写到文件里,但是读出来的时候也能显示一部分,但是中间就会出问题,cout<< yxgarray.handle<<"  "<<yxgarray.sWord <<" "<<yxgarray.intfrequency <<" i="<<i<<endl;,就是这一句。

2007-4-5 08:25 PM stickyman
应该是 yxgarray.sWord没有被分配内存,所以这个地方出错阿.你先改了试试看?

2007-4-5 09:43 PM admin
while(pCur!=NULL)
        {
                array.handle =pCur->hanle;
                array.sWord =pCur->sWord;
                array.intfrequency =pCur->intfrequency;
                i++;
                pCur=pCur->next ;
        }

应该是array【i】. 而不是array.吧?
stickyman 说得没错,可能是sWord指向的内存有问题,但是不能改为:
struct ArrayChain
                {
                        int                handle;
                        int                intfrequency;      
                        char        sWord[128];                       
                };
因为在有"array[i].sWord =pCur->sWord;",因此,是不是pCur->sWord指向的内存在使用的时候已经释放掉了?但是从代码片段中无法知道m_pHead是怎么构造的,也就不好判断。

还有你读写的似乎是二进制文件,最好将"r" 改成”r+b",“w" 改成”w+b"

2007-4-6 08:50 AM yxg_80
哈哈,r" 改成”r+b",“w" 改成”w+b",就不会有问题了。其他的地方没有改!
msdn中的解释如下:
"r+"
Opens for both reading and writing. (The file must exist.)
"w+"
Opens an empty file for both reading and writing. If the given file exists, its contents are destroyed.
b
Open in binary (untranslated) mode; translations involving carriage-return and linefeed characters are suppressed.
其实我是想在写的时候只写,在读的时候只读,结果就出问题了

2007-4-6 08:52 AM stickyman
奇怪,没有分配sWord的内存块,退出的时候没有memory leaks吗?

2007-4-6 08:56 AM yxg_80
没有其他的提示啊!!!!!如果估计会有,stickyman 我应该如何避免呢?

2007-4-6 09:17 AM admin
打印出来的结果不正确吧?刚意识到,你这段写和读的代码是错误的。你的本意应该是把ArrayChain结构的数组写入文件(包括sWord指向的字符串),然后再读出来吧?但是你这段代码其实是将sWord指针的地址值(而不是指向的字符串)写入文件,然后再读取出来!

stickyman
程序结束的时候可以看到的阿。不知道为什么可以输出,感觉指针应该会乱掉才对……
给sWord也new/malloc一下内存块,不需要的时候free/delete []吧.

2007-4-6 09:29 AM yxg_80
像我贴出来的那样,在一个地方读,然后写,可以。但是如果到其他的地方读就不行了,看来是有问题,哈哈
还得像  stickyman 所说的那样
                               struct ArrayChain
                {
                        int        handle;
                        int        intfrequency;        //该词出现的次数
                        char        sWord[11];                //存放该词
                };
                typedef struct ArrayChain ARRAY_CHAIN_yxg,*PARRAY_CHAIN_yxg;

                               struct tagArrayChain
                {
                        int        hanle;
                        int        intfrequency;        //该词出现的次数
                        char        *sWord;                //存放该词的指针
                        struct        tagArrayChain *next;

                };
                typedef struct tagArrayChain ARRAY_CHAIN,*PARRAY_CHAIN;

                                               FILE* fp = NULL;
                        char *outPutFileName="YXGresult.txt";
                        int i=0,j=0;
                        PARRAY_CHAIN_yxg array=new ARRAY_CHAIN_yxg[wordNum];
                        fp=_tfopen(outPutFileName,_T("w+b"));
                        pCur=m_pHead;
                        while(pCur!=NULL)                    
                        {
                                array[i].handle =pCur->hanle;
                                j=0;
                                while(pCur->sWord[j]!='/0')
                                {
                                                                                array[i].sWord[j]=pCur->sWord[j];
                                        j++;
                                }
                                array[i].sWord[j]=pCur->sWord[j];
                                array[i].intfrequency =pCur->intfrequency;
                                i++;
                                pCur=pCur->next ;
                        }
                        fwrite(&wordNum,sizeof(int),1,fp);
                        fwrite(array,sizeof(ARRAY_CHAIN_yxg),wordNum,fp);
                        delete [] array;
                        fclose(fp);
//pCur是tagArrayChain类型的,我把切的词存储到“tagArrayChain类型de的队列“中,在写到文件中的时候,首先整理到ArrayChain结构的array中,然后再输出,我知道这样很浪费时间,但是现在的目的就是测试,然后改进。
各位有什么好的建议,尽管提!谢谢了!

[[i] 本帖最后由 yxg_80 于 2007-4-6 09:47 AM 编辑 [/i]]

2007-4-6 09:30 AM admin
那是因为原来的sWord写入之后还存在没有释放,把指针值读取出来之后又赋给新的sWord,只要之前的sWord的没有释放掉当然就不会有问题,我想这应该不是这段代码的本意,将指针值存入文件是没有意义的

2007-4-11 11:23 AM yxg_80
问大家一个问题,我在运行的时候发现一个问题,就是每执行一次程序,程序使用的内存都会增加40M左右。我把自己添加的程序注释掉,仍然这样,不知道是不是firtex设计的问题?内存逐渐地增加,导致运行的时间越来越大!

2007-4-11 11:34 AM admin
不知道你是怎么使用的,是否可以把代码贴出来看看?也可以用FirteX提供的Fxist或fxist4c示例应用程序试试。FirteX的索引内存是可控的,内存使用增加到用户设定的最大值后是不会在无限增加的

2007-4-11 03:42 PM yxg_80
嗬嗬,不好意思,我只是用了firtex和fexst4c这两个部分,所以在内存没有控制这块,不知道我要直接硬性规定大小的话,应该在哪个地方设置

2007-4-12 11:20 AM stickyman
index.memory是控制内存的,fexst4c跟一下,很容易找到

2007-4-12 04:37 PM yxg_80
index.memory好像在config.cpp里有定义Index.maxIndexTerms = 100000;Index.memory = 128000000;,但是在config.xml的memory也有限制不知道那里做最终的控制。

2007-4-12 08:29 PM admin
config.xml配置文件中如果提供了memory大小限制参数则使用config.xml定义的值,如果自定义参数文件里也设置了memory大小 限制参数则覆盖config.xml中的参数值,详细说明可以参考 [url]http://www.firtex.org/config_file.htm[/url]

2007-4-16 09:26 AM yxg_80
问大家一个问题,ICTCLAS分词的词库是什么结构?哈工大信息检索研究室分词的词库结构呢?还有天津市海量科技发展有限公司海量智能分词的词库结构呢,用的是什么结构?

[[i] 本帖最后由 yxg_80 于 2007-4-17 01:17 PM 编辑 [/i]]

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值