新人报到,写了个中文词性高亮的小功能,请各位前辈批评

依存句法分析的高亮部分完工啦!

因为还有很多功能有待开发、糅合,而且安装步骤还打算重写,所以目前还没有提交上去quq

image

实现思路是这样的:找到主谓宾这几个重要的句子成分,给它们单独分配颜色,然后所有修饰语跟随它后方的重要成分的颜色。目前看来效果还是不错的,就是在某些测试句上高亮的结果显得很怪,然后我定睛一看:原来是我句子不够通顺 :rofl:

有效实现了我的初衷 :rofl:


接下来打算把按句子成分移动做了,再添加一个在mode-line实时显示光标所在词的词性、作什么成分、修饰谁又被谁修饰的功能。现在还不太清楚怎么实现,前辈们知道这种hacking mode-line可以借鉴哪个项目嘛qwq


再次感谢大家一直以来的使用和鼓励 :smiling_face_with_three_hearts:

4 个赞

搞了这么个东东,显示句子的分析结果,依存关系啊词性啊什么的:

因为给cnhl设计高亮方案的时候需要直观地看到每个词的依存关系,就顺手写了一个。可能有些同学比我更需要这个功能,发出来问问大家的想法,有没有什么想要的enhancement,我加上去~ :stuck_out_tongue_closed_eyes:

(其实最初想到这一点还是因为我们语文老师期待的眼神哈哈哈哈,感觉可以开始传教了 :rofl:

争取今晚前把新功能commit上去qwq

1 个赞

求助!!
安装不了,执行 README.org 代码 显示无法找到 file-name-concat 函数
:roll_eyes:
在 Emacs 中也无法找到此函数 :sweat_smile:
当我手动执行时,
我已经克隆了那个项目 thulac ,但没有在其中找到 cnhl-thulac.cpp 文件

I’m sorry!对不起我一不小心用了一个emacs 28的函数QwQ

新的安装方法正在写,你现在先这样吧,把第二步的代码改成:

(defvar cnhl-export-dir "~/.emacs.d/cnhl")

(setq cnhl-export-path
      (expand-file-name cnhl-export-dir "cnhl.el"))

(setq cnhl-thulac-export-path
      (expand-file-name cnhl-export-dir "cnhl-thulac.cpp"))

(org-babel-tangle)

(cd cnhl-export-dir)

(async-shell-command
 "git clone --depth 1 https://github.com/thunlp/THULAC.git ./thulac ; g++ -c -I ./thulac/include -std=c++11 cnhl-thulac.cpp ; g++ -shared cnhl-thulac.o -o cnhl-thulac.so ; rm -rf cnhl-thulac.cpp cnhl-thulac.o thulac/"
 "*Cnhl Compile Module*")

这样再执行就可以啦

这种奇怪安装方法好像很不友好的样子QwQ 今明两天我赶紧写一个正常点的

再次抱歉qwq

似乎还是不行,显示没有找到目录
cd: No such directory found via CDPATH environment variable
我已经设置了目录,也就是你给的默认目录,执行时,它已经在 ~/.emacs.d/ 生成了一个 cnhl 文件,没有后缀名,看着像是你的 cnhl.el 文件
我已经有 gcc g++ 工具
总输出如下:
executing Emacs-Lisp code block…
Wrote /data/data/com.termux/files/home/.emacs.d/cnhl [30 times]
Tangled 30 code blocks from README.org
cd: No such directory found via CDPATH environment variable

谢谢!这是我的原因,我猜你的~/.emacs.d下并没有cnhl目录?因为我傻呆呆忘了设置没有目录的时候mkdir :joy:

看到你补写的了,我在我的termux上和你复现出了一样的结果。事实上,电脑端的cd在没有目录的情况下会直接报no such file or directory,但termux就会有CDPATH出现,真神奇哈哈

其实建一下cnhl-export-dir就好了,一个尝试性的解决方法是这样:

(defvar cnhl-export-dir "~/.emacs.d/cnhl")

(setq cnhl-export-path
      (expand-file-name cnhl-export-dir "cnhl.el"))

(setq cnhl-thulac-export-path
      (expand-file-name cnhl-export-dir "cnhl-thulac.cpp"))

(when (file-exists-p cnhl-export-dir)
  (mkdir cnhl-export-dir))

(org-babel-tangle)

(cd cnhl-export-dir)

(async-shell-command
 "git clone --depth 1 https://github.com/thunlp/THULAC.git ./thulac ; g++ -c -I ./thulac/include -std=c++11 cnhl-thulac.cpp ; g++ -shared cnhl-thulac.o -o cnhl-thulac.so ; rm -rf cnhl-thulac.cpp cnhl-thulac.o thulac/"
 "*Cnhl Compile Module*")

感谢捉虫!如果你不急着用的话我尽快捣鼓出新一版好用的cnhl,千万不要折腾没兴趣啦哈哈

(其实cnhl不是特别适合在termux上跑,因为无论thulac还是fasthan加载完都会占掉300M+的内存……诶不过话说回来,微信手机版占内存2G+呢,我怕啥哈哈)

返回同样的错误😭
我该如何得到cpp文件,因为我克隆了thulac项目也无法使用make编译出来。。。
当我已经建立了 ~/.emacs.d/cnhl 文件夹,显示我已经有此目录😔
现在无论我有没没有那个目录都报错😐

抱歉给你添了这么大麻烦 :sob:

cnhl-thulac.cpp:

#include <iostream>
#include <emacs-module.h>
#include "thulac/include/thulac.h"

using namespace std;

int plugin_is_GPL_compatible;

THULAC t;

bool initialized = false;

static char *
retrieve_string (emacs_env *env, emacs_value str)
{
  char *buf = NULL;
  ptrdiff_t size = 0;

  env->copy_string_contents (env, str, NULL, &size);

  buf = (char *) malloc (size);
  if (buf == NULL) return NULL;

  env->copy_string_contents (env, str, buf, &size);

  return buf;
}

static emacs_value
Fcnhl_thulac_module_init(emacs_env *env, ptrdiff_t nargs, emacs_value args[], void *data) noexcept
{
  if (initialized)
    {
      t.deinit();
    }
  string module_path = retrieve_string(env, args[0]);
  t.init(module_path.data(), NULL, 0, 0, 0, '_');
  cout << "THULAC initialized!" << endl;
  initialized = true;
  return env->intern(env, "t");
}

static emacs_value
Fcnhl_thulac_string(emacs_env *env, ptrdiff_t nargs, emacs_value args[], void *data) noexcept
{
  if (initialized != true)
    {
      cout << "THULAC module hasn't initialized!" << endl;
      return env->intern(env, "");
    }
  string s = retrieve_string(env, args[0]);
  THULAC_result r = t.cut(s);
  s = t.toString(r);
  return env->make_string(env, s.data(), s.length());
}

static void
provide (emacs_env *env, const char *feature)
{
    emacs_value Qfeat = env->intern (env, feature);
    emacs_value Qprovide = env->intern (env, "provide");
    emacs_value args[] = { Qfeat };

    env->funcall (env, Qprovide, 1, args);
}

static void
bind_function (emacs_env *env, const char *name, emacs_value Sfun)
{
    emacs_value Qfset = env->intern (env, "fset");
    emacs_value Qsym = env->intern (env, name);
    emacs_value args[] = { Qsym, Sfun };

    env->funcall (env, Qfset, 2, args);
}

int
emacs_module_init(struct emacs_runtime *ert) noexcept
{

  emacs_env *env = ert->get_environment (ert);

#define DEFUN(lsym, csym, amin, amax, doc, data)			\
  bind_function (env, lsym,						\
		 env->make_function (env, amin, amax, csym, doc, data))
  DEFUN("cnhl-thulac-string", Fcnhl_thulac_string, 1, 1, "Send string to THULAC and return the result.", NULL);
  DEFUN("cnhl-thulac-module-init", Fcnhl_thulac_module_init, 1, 1, "Load THULAC module.", NULL);

#undef DEFUN

  provide(env, "cnhl-thulac");
  return 0;
}

其实cnhl的安装是这样的:找一个目录,把这个目录添加到load-path里,然后把cnhl.el、cnhl-thulac.cpp放在这个文件夹里,再把thulac文件夹克隆到这个目录下,然后在这个目录下执行那条编译命令得到cnhl-thulac.so就算安装好了,之后require一下cnhl就可以使用了

这次发布前我会在termux上好好做测试的 :sob:

算了😌
等完整版吧,我是真的找不到问题出在了😬
不好意思啊哈,我太菜了🙏
给你添麻烦了

1 个赞

没关系没关系,是我的问题 :sob:……

怎么说呢,都说能力是锻炼出来的,但想让一个人从没能力变得有能力,也是有代价的。所谓一将功成万骨枯,放在这里夸张了些,但道理是一样的。大家为我、为我创造的这个小trick,其实付出了许多,所以没什么添不添麻烦的,我才应该感谢你们呢。

谢谢!


目前fasthan的词法高亮完工了,数据结构也重构了一下,我尽快把按句法移动做出来

句法分析用了一段时间,同步跑fasthan分析实在太卡了,等我拿epc改一下异步,再试一下安装流程 :joy: 今儿没统练,争取一天完工quq

这两天学校事情多,加上想写cnhl的小痴愿,忙得整个人都不好了。中午偶得一片,送给繁忙工作中的大家。

生活很快,真的很快,所以不要忘记看一看珍贵的春天~


一夜南风润北京,但绝暇隙咏清明。

大夫伤感惜三友,山卉无心图盛名。

风景无需著姓字,春光岂欲冠歌铭。

坤黄坎碧真春色,卧看熏风逗野苹。


注:坤卦地,坎卦水。

(食堂门口的重瓣粉海棠,正开花呢)

4 个赞

我天真了,这异步像是跟我八字不合,deferred小毛病不断,甚至逼我改数据结构……碌碌无为又一天 :sob:

明儿一定给它整好!正好今天刚学拟行路难,泻水置平地,各自东西南北流,安能行叹复坐愁呢! :imp:

呼,commit上去啦!

各种蒙来蒙去,总算把异步带来的问题搞定了,还给一路上的每个函数都加了个参数,差点搞得乱七八糟……没一开始就用纯正的函数式去写真的是最大的错误……可能过一阵子我又得重构了 :rofl:

现在句法高亮的卡顿问题解决了,但按句法移动还是会卡,不过这种情况下轻微的卡顿大概是无伤大雅,我试着改改。

换了比较传统的安装方式,把.el、.cpp和这次新增的cnhl-fasthan.py都给commit上去了,克隆仓库之后加load-path就行ww

学了下emacs-rime,加了个自动编译的函数,这回dynamic module编译大概不会有问题了。

todo清掉一项,蹦出来好几项,是什么给了我勇气哈哈 :rofl: 生活大概就是这样走啊走啊走下去的吧。

真的希望大家能够喜欢,希望我创造的东西有其价值和意义。马克思认为劳动是人类的必需品,但是,日复一日地解那些蓄意刁难的数学题、求出那早已知晓的结果,怎么能算是劳动呢?怎么能说是创造了价值呢?

所以我最喜欢的两件事:编程和写作。它们都是和语言有关的,都具有语言的普遍的美。文字使我了解我时刻依赖着的社会,代码使我了解时刻陪伴着我的设备;文学使我能毫无保留地与他人促膝长谈,编程能令计算机忠实而诚恳地接受我的倾诉;文学的创作陶冶人的情操,程序的创作陶冶人的生活。

而人与计算机,却又是两个极端。一个极端复杂、多变、难以捉摸;一个极端单纯、稳定、朴实忠诚。所谓长短相形、高下相倾,他们是一对如此完美的辩证。正因如此,它们都是我生活中伟大的一部分。我将毫无保留地向他们奉献我真挚的爱。


好累啊,让我先休息一会儿。大家晚安~

3 个赞

你本论坛穿堂风,偏偏率性引山洪

劳动亦有道也,有价值甚妙也。 刘禹锡的陋室铭说无案牍之劳形。

而人与计算机,却又是两个极端…

系辞曰:“天尊地卑,乾坤定矣。卑高以陈,贵贱位矣。”

阴阳之理妙也,相辅相成。孤阴不长,独阳不生。

文学使我能毫无保留地与他人促膝长谈

庄子说: 万世之后而遇一大圣知其解者,旦暮遇之也

这世上死亡不可怕,并非终点,可怕的是孤独,千万孤独。无一人可语之高山流水。万人皆醉我读醒。所以,莫愁前路无知己,天下谁人不识君。

语多必失,还望提点,珍重珍重,与君共勉 :pray:

后生可畏啊。。。

哈哈哈哈!:grinning_face_with_smiling_eyes: 不愁前路无知己了,与君共勉!

谢谢前辈鼓励,我一定继续努力 :stuck_out_tongue_closed_eyes:

:joy: 发现一个bug:在tty下启动emacs,require cnhl后,键盘的backspace键会产生del键的行为,而C-h按键(也即终端默认退格键组合)会产生backspace键的行为。

用help命令看了下,好像不是key bindings被改了,而是底层识别直接就变成别的键了,按下bksp弹出个del……我真的不知道我是怎么做到的,太佩服我自己了 :rofl:

目前看来,这个问题只会影响到tty用户,无论windows、mac还是X都没有问题……明儿我好好研究研究 :laughing:

这个feature bug也不是一点好处没有,只要牺牲C-h,colemak布局的用户就可以在不改键的情况下畅享tty下的capslock了 :joy: ……憋问我是怎么知道的,问就是小概率事件 :joy:


再次感叹一下cjktty的省电和好用,现在我已经用各种极限操作把我的新arch的功率压到6W了,距离winserver的3W还有很长的路要走……

不过,只要linux上还能打红警,我大概就不会再叛教了 :rofl:

1 个赞

高考完了,可以整点活了!

2 个赞

我为啥这么晚才看到这个帖子。。。人呢?

1 个赞