python thulac如何添加优先级更高的词典

我在使用python的thulac库对一些短语进行分词,试图提取出每个短语中(大部分在短语的开头)的地区名,即词性为ns的单位。但是我发现有一些短语不能进行有效的分词。比如石家庄尊旺商贸有限公司,会被分解为[('石', 'np'), ('家', 'n'), ('庄尊旺', 'np'), ('商贸', 'j'), ('有限公司', 'n')],而不是('石家庄','ns'),……
后来我使用了thulac函数中的user_dict参数,把'石家庄'这个单位作为一个整体,试图让程序将其提取出来并给予'uw'的标识,然后后续再将其词性用程序手动改成‘ns’,但是也只有部分词条中的‘石家庄’作为一个整体被识别出来,仍然有一些[('石', 'np'), ('家', 'n'), ('庄尊旺', 'np'), ('商贸', 'j'), ('有限公司', 'n')]的情况出现。程序如下:

import thulac
 
# 创建thulac实例
thu = thulac.thulac(user_dict='custom_dict.txt')#txt文件中有'石家庄'三个字
 
# 自定义地名词典
custom_dict = ["石家庄"]  # 你可以补充更多的地名
 
def tag_place_names(text):
    tagged_words = thu.cut(text)
    tagged_list = []
    for word, pos in tagged_words:
        if word in custom_dict:
            tagged_list.append((word, "ns"))  # 手动标记为地名类别
        else:
            tagged_list.append((word, pos))
    return tagged_list
 
# 测试示例文本
text = "石家庄尊旺商贸有限公司"
 
# 调用函数进行分词和标记
result = tag_place_names(text)
 
print(result)

所以我想问,thulac库中是否有方法,在进行分词和词性识别时,把一些新词典中给定的单位的优先级设置为最高?

实际上 类似公司名字的这种,从逻辑上来看 就需要 特殊处理, 我觉得大概率的可能是 thulac 所使用的数据库压根就没有这个词 所以 想要分出来 当然很困难

【以下回答由 GPT 生成】

Thulac库目前没有直接支持给定词典中某些单位优先级最高的功能。不过,可以通过修改源代码来实现这一功能。下面是具体的解决方案:

  1. 从Thulac的GitHub仓库中获取源代码:https://github.com/thunlp/THULAC-Python

  2. 打开thulac/thulac.py文件。

  3. thulac类的__init__函数中,找到user_dict的相关代码。将以下两行代码从self.__call__(text)前面移动到后面:

python # 自定义地名词典 self.custom_dict = custom_dict

  1. thulac类中找到cut函数,查找以下代码块:

```python else: tmp = p.word

if tmp in self.pre_load: resu.append((tmp, self.pre_load[tmp][0])) ```

  1. 在上述代码块后面添加以下代码:

python elif tmp in self.custom_dict: resu.append((tmp, "ns"))

  1. 保存并关闭thulac.py文件。

你可以在自己的代码中使用修改后的Thulac库,添加自定义词典的优先级更高。以下是修改后的代码示例:

import thulac

# 创建thulac实例
thu = thulac.thulac(user_dict='custom_dict.txt') #txt文件中包含要标记为'ns'的自定义地名

# 自定义地名词典
custom_dict = ["石家庄"]  # 你可以补充更多的地名

def tag_place_names(text):
    tagged_words = thu.cut(text)
    tagged_list = []
    for word, pos in tagged_words:
        if word in custom_dict:
            tagged_list.append((word, "ns"))  # 手动标记为地名类别
        else:
            tagged_list.append((word, pos))
    return tagged_list

# 测试示例文本
text = "石家庄尊旺商贸有限公司"

# 调用函数进行分词和标记
result = tag_place_names(text)

print(result)

虽然这个修改可以提高自定义词典中单位的优先级,但需要注意任何修改源代码的风险。如果有维护更新的版本发布,可能需要重新应用此修改。同时,请遵守Thulac库的许可证要求。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^