Giter Club home page Giter Club logo

blmoistawinde / harvesttext Goto Github PK

View Code? Open in Web Editor NEW
2.3K 55.0 327.0 4.41 MB

文本挖掘和预处理工具(文本清洗、新词发现、情感分析、实体识别链接、关键词抽取、知识抽取、句法分析等),无监督或弱监督方法

License: MIT License

Python 100.00%
nlp sentiment-analysis new-word-discovery unsupervised text-summarization named-entity-recognition dependency-parser text-segmentation text-cleaning pyhanlp

harvesttext's Introduction

HarvestText

HarvestText : A Toolkit for Text Mining and Preprocessing

GitHub stars PyPI - Python Version GitHub Version Version document

文档

Github码云Gitee上同步。如果在Github上浏览/下载速度慢的话可以转到码云上操作。

用途

HarvestText是一个专注无(弱)监督方法,能够整合领域知识(如类型,别名)对特定领域文本进行简单高效地处理和分析的库。适用于许多文本预处理和初步探索性分析任务,在小说分析,网络文本,专业文献等领域都有潜在应用价值。

使用案例:

【注:本库仅完成实体分词和情感分析,可视化使用matplotlib】

本README包含各个功能的典型例子,部分函数的详细用法可在文档中找到:

文档

具体功能如下:

目录:

  • 基本处理
    • 精细分词分句
      • 可包含指定词和类别的分词。充分考虑省略号,双引号等特殊标点的分句。
    • 文本清洗
      • 处理URL, email, 微博等文本中的特殊符号和格式,去除所有标点等
    • 实体链接
      • 把别名,缩写与他们的标准名联系起来。
    • 命名实体识别
      • 找到一句句子中的人名,地名,机构名等命名实体。
    • 实体别名自动识别(更新!)
      • 从大量文本中自动识别出实体及其可能别名,直接用于实体链接。例子见这里
    • 依存句法分析
      • 分析语句中各个词语(包括链接到的实体)的主谓宾语修饰等语法关系,
    • 内置资源
      • 通用停用词,通用情感词,IT、财经、饮食、法律等领域词典。可直接用于以上任务。
    • 信息检索
      • 统计特定实体出现的位置,次数等。
    • 新词发现
      • 利用统计规律(或规则)发现语料中可能会被传统分词遗漏的特殊词汇。也便于从文本中快速筛选出关键词。
    • 字符拼音纠错(调整)
      • 把语句中有可能是已知实体的错误拼写(误差一个字符或拼音)的词语链接到对应实体。
    • 自动分段
      • 使用TextTiling算法,对没有分段的文本自动分段,或者基于已有段落进一步组织/重新分段
    • 存取消除
      • 可以本地保存模型再读取复用,也可以消除当前模型的记录。
    • 英语支持
      • 本库主要旨在支持对中文的数据挖掘,但是加入了包括情感分析在内的少量英语支持
  • 高层应用
    • 情感分析
      • 给出少量种子词(通用的褒贬义词语),得到语料中各个词语和语段的褒贬度。
    • 关系网络
      • 利用共现关系,获得关键词之间的网络。或者以一个给定词语为中心,探索与其相关的词语网络。
    • 文本摘要
      • 基于Textrank算法,得到一系列句子中的代表性句子。
    • 关键词抽取
      • 基于Textrank, tfidf等算法,获得一段文本中的关键词
    • 事实抽取
      • 利用句法分析,提取可能表示事件的三元组。
    • 简易问答系统
      • 从三元组中建立知识图谱并应用于问答,可以定制一些问题模板。效果有待提升,仅作为示例。
  • 引用

用法

首先安装, 使用pip

pip install --upgrade harvesttext

或进入setup.py所在目录,然后命令行:

python setup.py install

随后在代码中:

from harvesttext import HarvestText
ht = HarvestText()

即可调用本库的功能接口。

注意:部分功能需要安装额外的库,但有一定可能安装失败,故需要的话请手动安装

# 部分英语功能
pip install pattern
# 命名实体识别、句法分析等功能,需要python <= 3.8
pip install pyhanlp

实体链接

给定某些实体及其可能的代称,以及实体对应类型。将其登录到词典中,在分词时优先切分出来,并且以对应类型作为词性。也可以单独获得语料中的所有实体及其位置:

para = "上港的武磊和恒大的郜林,谁是**最好的前锋?那当然是武磊武球王了,他是射手榜第一,原来是弱点的单刀也有了进步"
entity_mention_dict = {'武磊':['武磊','武球王'],'郜林':['郜林','郜飞机'],'前锋':['前锋'],'上海上港':['上港'],'广州恒大':['恒大'],'单刀球':['单刀']}
entity_type_dict = {'武磊':'球员','郜林':'球员','前锋':'位置','上海上港':'球队','广州恒大':'球队','单刀球':'术语'}
ht.add_entities(entity_mention_dict,entity_type_dict)
print("\nSentence segmentation")
print(ht.seg(para,return_sent=True))    # return_sent=False时,则返回词语列表

上港 的 武磊 和 恒大 的 郜林 , 谁 是 ** 最好 的 前锋 ? 那 当然 是 武磊 武球王 了, 他 是 射手榜 第一 , 原来 是 弱点 的 单刀 也 有 了 进步

采用传统的分词工具很容易把“武球王”拆分为“武 球王”

词性标注,包括指定的特殊类型。

print("\nPOS tagging with entity types")
for word, flag in ht.posseg(para):
	print("%s:%s" % (word, flag),end = " ")

上港:球队 的:uj 武磊:球员 和:c 恒大:球队 的:uj 郜林:球员 ,:x 谁:r 是:v **:ns 最好:a 的:uj 前锋:位置 ?:x 那:r 当然:d 是:v 武磊:球员 武球王:球员 了:ul ,:x 他:r 是:v 射手榜:n 第一:m ,:x 原来:d 是:v 弱点:n 的:uj 单刀:术语 也:d 有:v 了:ul 进步:d

for span, entity in ht.entity_linking(para):
	print(span, entity)

[0, 2] ('上海上港', '#球队#') [3, 5] ('武磊', '#球员#') [6, 8] ('广州恒大', '#球队#') [9, 11] ('郜林', '#球员#') [19, 21] ('前锋', '#位置#') [26, 28] ('武磊', '#球员#') [28, 31] ('武磊', '#球员#') [47, 49] ('单刀球', '#术语#')

这里把“武球王”转化为了标准指称“武磊”,可以便于标准统一的统计工作。

分句:

print(ht.cut_sentences(para))

['上港的武磊和恒大的郜林,谁是**最好的前锋?', '那当然是武磊武球王了,他是射手榜第一,原来是弱点的单刀也有了进步']

如果手头暂时没有可用的词典,不妨看看本库内置资源中的领域词典是否适合你的需要。

如果同一个名字有多个可能对应的实体("打球的李娜和唱歌的李娜不是一个人"),可以设置keep_all=True来保留多个候选,后面可以再采用别的策略消歧,见el_keep_all()

如果连接到的实体过多,其中有一些明显不合理,可以采用一些策略来过滤,这里给出了一个例子filter_el_with_rule()

本库能够也用一些基本策略来处理复杂的实体消歧任务(比如一词多义【"老师"是指"A老师"还是"B老师"?】、候选词重叠【xx市长/江yy?、xx市长/江yy?】)。 具体可见linking_strategy()

文本清洗

可以处理文本中的特殊字符,或者去掉文本中不希望出现的一些特殊格式。

包括:微博的@,表情符;网址;email;html代码中的 一类的特殊字符;网址内的%20一类的特殊字符;繁体字转简体字

例子如下:

print("各种清洗文本")
ht0 = HarvestText()
# 默认的设置可用于清洗微博文本
text1 = "回复@钱旭明QXM:[嘻嘻][嘻嘻] //@钱旭明QXM:杨大哥[good][good]"
print("清洗微博【@和表情符等】")
print("原:", text1)
print("清洗后:", ht0.clean_text(text1))
各种清洗文本
清洗微博【@和表情符等】
原: 回复@钱旭明QXM:[嘻嘻][嘻嘻] //@钱旭明QXM:杨大哥[good][good]
清洗后: 杨大哥
# URL的清理
text1 = "【#赵薇#:正筹备下一部电影 但不是青春片....http://t.cn/8FLopdQ"
print("清洗网址URL")
print("原:", text1)
print("清洗后:", ht0.clean_text(text1, remove_url=True))
清洗网址URL
原: 【#赵薇#:正筹备下一部电影 但不是青春片....http://t.cn/8FLopdQ
清洗后: 【#赵薇#:正筹备下一部电影 但不是青春片....
# 清洗邮箱
text1 = "我的邮箱是[email protected],欢迎联系"
print("清洗邮箱")
print("原:", text1)
print("清洗后:", ht0.clean_text(text1, email=True))
清洗邮箱
原: 我的邮箱是[email protected],欢迎联系
清洗后: 我的邮箱是,欢迎联系
# 处理URL转义字符
text1 = "www.%E4%B8%AD%E6%96%87%20and%20space.com"
print("URL转正常字符")
print("原:", text1)
print("清洗后:", ht0.clean_text(text1, norm_url=True, remove_url=False))
URL转正常字符
原: www.%E4%B8%AD%E6%96%87%20and%20space.com
清洗后: www.中文 and space.com
text1 = "www.中文 and space.com"
print("正常字符转URL[含有中文和空格的request需要注意]")
print("原:", text1)
print("清洗后:", ht0.clean_text(text1, to_url=True, remove_url=False))
正常字符转URL[含有中文和空格的request需要注意]
原: www.中文 and space.com
清洗后: www.%E4%B8%AD%E6%96%87%20and%20space.com
# 处理HTML转义字符
text1 = "&lt;a c&gt;&nbsp;&#x27;&#x27;"
print("HTML转正常字符")
print("原:", text1)
print("清洗后:", ht0.clean_text(text1, norm_html=True))
HTML转正常字符
原: &lt;a c&gt;&nbsp;&#x27;&#x27;
清洗后: <a c> ''
# 繁体字转简体
text1 = "心碎誰買單"
print("繁体字转简体")
print("原:", text1)
print("清洗后:", ht0.clean_text(text1, t2s=True))
繁体字转简体
原: 心碎誰買單
清洗后: 心碎谁买单
# markdown超链接提取文本
text1 = "欢迎使用[HarvestText : A Toolkit for Text Mining and Preprocessing](https://github.com/blmoistawinde/HarvestText)这个库"
print("markdown超链接提取文本")
print("原:", text1)
print("清洗后:", ht0.clean_text(text1, t2s=True))
markdown超链接提取文本
原: 欢迎使用[HarvestText : A Toolkit for Text Mining and Preprocessing](https://github.com/blmoistawinde/HarvestText)这个库
清洗后: 欢迎使用HarvestText : A Toolkit for Text Mining and Preprocessing这个库

命名实体识别

找到一句句子中的人名,地名,机构名等命名实体。使用了 pyhanLP 的接口实现。

ht0 = HarvestText()
sent = "上海上港足球队的武磊是**最好的前锋。"
print(ht0.named_entity_recognition(sent))
{'上海上港足球队': '机构名', '武磊': '人名', '**': '地名'}

依存句法分析

分析语句中各个词语(包括链接到的实体)的主谓宾语修饰等语法关系,并以此提取可能的事件三元组。使用了 pyhanLP 的接口实现。

ht0 = HarvestText()
para = "上港的武磊武球王是**最好的前锋。"
entity_mention_dict = {'武磊': ['武磊', '武球王'], "上海上港":["上港"]}
entity_type_dict = {'武磊': '球员', "上海上港":"球队"}
ht0.add_entities(entity_mention_dict, entity_type_dict)
for arc in ht0.dependency_parse(para):
    print(arc)
print(ht0.triple_extraction(para))
[0, '上港', '球队', '定中关系', 3]
[1, '的', 'u', '右附加关系', 0]
[2, '武磊', '球员', '定中关系', 3]
[3, '武球王', '球员', '主谓关系', 4]
[4, '是', 'v', '核心关系', -1]
[5, '**', 'ns', '定中关系', 8]
[6, '最好', 'd', '定中关系', 8]
[7, '的', 'u', '右附加关系', 6]
[8, '前锋', 'n', '动宾关系', 4]
[9, '。', 'w', '标点符号', 4]
print(ht0.triple_extraction(para))
[['上港武磊武球王', '是', '**最好前锋']]

字符拼音纠错

在V0.7版修改,使用tolerance支持拼音相同的检查

把语句中有可能是已知实体的错误拼写(误差一个字符或拼音)的词语链接到对应实体。

def entity_error_check():
    ht0 = HarvestText()
    typed_words = {"人名":["武磊"]}
    ht0.add_typed_words(typed_words)
    sent0 = "武磊和吴磊拼音相同"
    print(sent0)
    print(ht0.entity_linking(sent0, pinyin_tolerance=0))
    """
    武磊和吴磊拼音相同
    [([0, 2], ('武磊', '#人名#')), [(3, 5), ('武磊', '#人名#')]]
    """
    sent1 = "武磊和吴力只差一个拼音"
    print(sent1)
    print(ht0.entity_linking(sent1, pinyin_tolerance=1))
    """
    武磊和吴力只差一个拼音
    [([0, 2], ('武磊', '#人名#')), [(3, 5), ('武磊', '#人名#')]]
    """
    sent2 = "武磊和吴磊只差一个字"
    print(sent2)
    print(ht0.entity_linking(sent2, char_tolerance=1))
    """
    武磊和吴磊只差一个字
    [([0, 2], ('武磊', '#人名#')), [(3, 5), ('武磊', '#人名#')]]
    """
    sent3 = "吴磊和吴力都可能是武磊的代称"
    print(sent3)
    print(ht0.get_linking_mention_candidates(sent3, pinyin_tolerance=1, char_tolerance=1))
    """
    吴磊和吴力都可能是武磊的代称
    ('吴磊和吴力都可能是武磊的代称', defaultdict(<class 'list'>, {(0, 2): {'武磊'}, (3, 5): {'武磊'}}))
    """

情感分析

本库采用情感词典方法进行情感分析,通过提供少量标准的褒贬义词语(“种子词”),从语料中自动学习其他词语的情感倾向,形成情感词典。对句中情感词的加总平均则用于判断句子的情感倾向:

print("\nsentiment dictionary")
sents = ["武磊威武,中超第一射手!",
      "武磊强,中超最第一本土球员!",
      "郜林不行,只会抱怨的球员注定上限了",
      "郜林看来不行,已经到上限了"]
sent_dict = ht.build_sent_dict(sents,min_times=1,pos_seeds=["第一"],neg_seeds=["不行"])
print("%s:%f" % ("威武",sent_dict["威武"]))
print("%s:%f" % ("球员",sent_dict["球员"]))
print("%s:%f" % ("上限",sent_dict["上限"]))

sentiment dictionary 威武:1.000000 球员:0.000000 上限:-1.000000

print("\nsentence sentiment")
sent = "武球王威武,中超最强球员!"
print("%f:%s" % (ht.analyse_sent(sent),sent))

0.600000:武球王威武,中超最强球员!

如果没想好选择哪些词语作为“种子词”,本库中也内置了一个通用情感词典内置资源,在不指定情感词时作为默认的选择,也可以根据需要从中挑选。

默认使用的SO-PMI算法对于情感值没有上下界约束,如果需要限制在[0,1]或者[-1,1]这样的区间的话,可以调整scale参数,例子如下:

print("\nsentiment dictionary using default seed words")
docs = ["张市筹设兴华实业公司外区资本家踊跃投资晋察冀边区兴华实业公司,自筹备成立以来,解放区内外企业界人士及一般商民,均踊跃认股投资",
        "打倒万恶的资本家",
    "该公司原定资本总额为二十五万万元,现已由各界分认达二十万万元,所属各厂、各公司亦募得股金一万万余元",
    "连日来解放区以外各工商人士,投函向该公司询问经营性质与范围以及股东权限等问题者甚多,络绎抵此的许多资本家,于参观该公司所属各厂经营状况后,对**政府扶助与奖励私营企业发展的政策,均极表赞同,有些资本家因款项未能即刻汇来,多向筹备处预认投资的额数。由平津来张的林明棋先生,一次即以现款入股六十余万元"
   ]
# scale: 将所有词语的情感值范围调整到[-1,1]
# 省略pos_seeds, neg_seeds,将采用默认的情感词典 get_qh_sent_dict()
print("scale=\"0-1\", 按照最大为1,最小为0进行线性伸缩,0.5未必是中性")
sent_dict = ht.build_sent_dict(docs,min_times=1,scale="0-1")
print("%s:%f" % ("赞同",sent_dict["赞同"]))
print("%s:%f" % ("二十万",sent_dict["二十万"]))
print("%s:%f" % ("万恶",sent_dict["万恶"]))
print("%f:%s" % (ht.analyse_sent(docs[0]), docs[0]))
print("%f:%s" % (ht.analyse_sent(docs[1]), docs[1]))
sentiment dictionary using default seed words
scale="0-1", 按照最大为1,最小为0进行线性伸缩,0.5未必是中性
赞同:1.000000
二十万:0.153846
万恶:0.000000
0.449412:张市筹设兴华实业公司外区资本家踊跃投资晋察冀边区兴华实业公司,自筹备成立以来,解放区内外企业界人士及一般商民,均踊跃认股投资
0.364910:打倒万恶的资本家
print("scale=\"+-1\", 在正负区间内分别伸缩,保留0作为中性的语义")
sent_dict = ht.build_sent_dict(docs,min_times=1,scale="+-1")
print("%s:%f" % ("赞同",sent_dict["赞同"]))
print("%s:%f" % ("二十万",sent_dict["二十万"]))
print("%s:%f" % ("万恶",sent_dict["万恶"]))
print("%f:%s" % (ht.analyse_sent(docs[0]), docs[0]))
print("%f:%s" % (ht.analyse_sent(docs[1]), docs[1]))
scale="+-1", 在正负区间内分别伸缩,保留0作为中性的语义
赞同:1.000000
二十万:0.000000
万恶:-1.000000
0.349305:张市筹设兴华实业公司外区资本家踊跃投资晋察冀边区兴华实业公司,自筹备成立以来,解放区内外企业界人士及一般商民,均踊跃认股投资
-0.159652:打倒万恶的资本家

信息检索

可以从文档列表中查找出包含对应实体(及其别称)的文档,以及统计包含某实体的文档数。使用倒排索引的数据结构完成快速检索。

以下代码为省略了添加实体过程的节选,请先使用add_entities等函数添加希望关注的实体,再进行索引和检索。

docs = ["武磊威武,中超第一射手!",
		"郜林看来不行,已经到上限了。",
		"武球王威武,中超最强前锋!",
		"武磊和郜林,谁是**最好的前锋?"]
inv_index = ht.build_index(docs)
print(ht.get_entity_counts(docs, inv_index))  # 获得文档中所有实体的出现次数
# {'武磊': 3, '郜林': 2, '前锋': 2}

print(ht.search_entity("武磊", docs, inv_index))  # 单实体查找
# ['武磊威武,中超第一射手!', '武球王威武,中超最强前锋!', '武磊和郜林,谁是**最好的前锋?']

print(ht.search_entity("武磊 郜林", docs, inv_index))  # 多实体共现
# ['武磊和郜林,谁是**最好的前锋?']

# 谁是最被人们热议的前锋?用这里的接口可以很简便地回答这个问题
subdocs = ht.search_entity("#球员# 前锋", docs, inv_index)
print(subdocs)  # 实体、实体类型混合查找
# ['武球王威武,中超最强前锋!', '武磊和郜林,谁是**最好的前锋?']
inv_index2 = ht.build_index(subdocs)
print(ht.get_entity_counts(subdocs, inv_index2, used_type=["球员"]))  # 可以限定类型
# {'武磊': 2, '郜林': 1}

关系网络

(使用networkx实现) 利用词共现关系,建立其实体间图结构的网络关系(返回networkx.Graph类型)。可以用来建立人物之间的社交网络等。

# 在现有实体库的基础上随时新增,比如从新词发现中得到的漏网之鱼
ht.add_new_entity("颜骏凌", "颜骏凌", "球员")
docs = ["武磊和颜骏凌是队友",
		"武磊和郜林都是国内顶尖前锋"]
G = ht.build_entity_graph(docs)
print(dict(G.edges.items()))
G = ht.build_entity_graph(docs, used_types=["球员"])
print(dict(G.edges.items()))

获得以一个词语为中心的词语网络,下面以三国第一章为例,探索主人公刘备的遭遇(下为主要代码,例子见build_word_ego_graph())。

entity_mention_dict, entity_type_dict = get_sanguo_entity_dict()
ht0.add_entities(entity_mention_dict, entity_type_dict)
sanguo1 = get_sanguo()[0]
stopwords = get_baidu_stopwords()
docs = ht0.cut_sentences(sanguo1)
G = ht0.build_word_ego_graph(docs,"刘备",min_freq=3,other_min_freq=2,stopwords=stopwords)

word_ego_net

刘关张之情谊,刘备投奔的靠山,以及刘备讨贼之经历尽在于此。

文本摘要

(使用networkx实现) 使用Textrank算法,得到从文档集合中抽取代表句作为摘要信息,可以设置惩罚重复的句子,也可以设置字数限制(maxlen参数):

print("\nText summarization")
docs = ["武磊威武,中超第一射手!",
        "郜林看来不行,已经到上限了。",
        "武球王威武,中超最强前锋!",
        "武磊和郜林,谁是**最好的前锋?"]
for doc in ht.get_summary(docs, topK=2):
    print(doc)
print("\nText summarization(避免重复)")
for doc in ht.get_summary(docs, topK=3, avoid_repeat=True):
    print(doc)
Text summarization
武球王威武,中超最强前锋!
武磊威武,中超第一射手!

Text summarization(避免重复)
武球王威武,中超最强前锋!
郜林看来不行,已经到上限了。
武磊和郜林,谁是**最好的前锋?

关键词抽取

目前提供包括textrank和HarvestText封装jieba并配置好参数和停用词的jieba_tfidf(默认)两种算法。

示例(完整见example):

# text为林俊杰《关键词》歌词
print("《关键词》里的关键词")
kwds = ht.extract_keywords(text, 5, method="jieba_tfidf")
print("jieba_tfidf", kwds)
kwds = ht.extract_keywords(text, 5, method="textrank")
print("textrank", kwds)
《关键词》里的关键词
jieba_tfidf ['自私', '慷慨', '落叶', '消逝', '故事']
textrank ['自私', '落叶', '慷慨', '故事', '位置']

CSL.ipynb提供了不同算法,以及本库的实现与textrank4zh的在CSL数据集上的比较。由于仅有一个数据集且数据集对于以上算法都很不友好,表现仅供参考。

算法 P@5 R@5 F@5
textrank4zh 0.0836 0.1174 0.0977
ht_textrank 0.0955 0.1342 0.1116
ht_jieba_tfidf 0.1035 0.1453 0.1209

内置资源

现在本库内集成了一些资源,方便使用和建立demo。

资源包括:

此外,还提供了一个特殊资源——《三国演义》,包括:

  • 三国演义文言文文本
  • 三国演义人名、州名、势力知识库

大家可以探索从其中能够得到什么有趣发现😁。

def load_resources():
	from harvesttext.resources import get_qh_sent_dict,get_baidu_stopwords,get_sanguo,get_sanguo_entity_dict
    sdict = get_qh_sent_dict()              # {"pos":[积极词...],"neg":[消极词...]}
    print("pos_words:",list(sdict["pos"])[10:15])
    print("neg_words:",list(sdict["neg"])[5:10])
    
    stopwords = get_baidu_stopwords()
    print("stopwords:", list(stopwords)[5:10])

    docs = get_sanguo()                 # 文本列表,每个元素为一章的文本
    print("三国演义最后一章末16字:\n",docs[-1][-16:])
    entity_mention_dict, entity_type_dict = get_sanguo_entity_dict()
    print("刘备 指称:",entity_mention_dict["刘备"])
    print("刘备 类别:",entity_type_dict["刘备"])
    print("蜀 类别:", entity_type_dict["蜀"])
    print("益州 类别:", entity_type_dict["益州"])
load_resources()
pos_words: ['宰相肚里好撑船', '查实', '忠实', '名手', '聪明']
neg_words: ['散漫', '谗言', '迂执', '肠肥脑满', '出卖']
stopwords: ['apart', '左右', '结果', 'probably', 'think']
三国演义最后一章末16字:
 鼎足三分已成梦,后人凭吊空牢*。
刘备 指称: ['刘备', '刘玄德', '玄德']
刘备 类别: 人名
蜀 类别: 势力
益州 类别: 州名

加载清华领域词典,并使用停用词。

def using_typed_words():
    from harvesttext.resources import get_qh_typed_words,get_baidu_stopwords
    ht0 = HarvestText()
    typed_words, stopwords = get_qh_typed_words(), get_baidu_stopwords()
    ht0.add_typed_words(typed_words)
    sentence = "THUOCL是自然语言处理的一套中文词库,词表来自主流网站的社会标签、搜索热词、输入法词库等。"
    print(sentence)
    print(ht0.posseg(sentence,stopwords=stopwords))
using_typed_words()
THUOCL是自然语言处理的一套中文词库,词表来自主流网站的社会标签、搜索热词、输入法词库等。
[('THUOCL', 'eng'), ('自然语言处理', 'IT'), ('一套', 'm'), ('中文', 'nz'), ('词库', 'n'), ('词表', 'n'), ('来自', 'v'), ('主流', 'b'), ('网站', 'n'), ('社会', 'n'), ('标签', '财经'), ('搜索', 'v'), ('热词', 'n'), ('输入法', 'IT'), ('词库', 'n')]

一些词语被赋予特殊类型IT,而“是”等词语被筛出。

新词发现

从比较大量的文本中利用一些统计指标发现新词。(可选)通过提供一些种子词语来确定怎样程度质量的词语可以被发现。(即至少所有的种子词会被发现,在满足一定的基础要求的前提下。)

para = "上港的武磊和恒大的郜林,谁是**最好的前锋?那当然是武磊武球王了,他是射手榜第一,原来是弱点的单刀也有了进步"
#返回关于新词质量的一系列信息,允许手工改进筛选(pd.DataFrame型)
new_words_info = ht.word_discover(para)
#new_words_info = ht.word_discover(para, threshold_seeds=["武磊"])  
new_words = new_words_info.index.tolist()
print(new_words)

["武磊"]

高级设置(展开查看) 可以使用`excluding_words`参数来去除自己不想要的结果,默认包括了停用词。

算法使用了默认的经验参数,如果对结果数量不满意,可以设置auto_param=False自己调整参数,调整最终获得的结果的数量,相关参数如下:

:param max_word_len: 允许被发现的最长的新词长度
:param min_freq: 被发现的新词,在给定文本中需要达到的最低频率
:param min_entropy: 被发现的新词,在给定文本中需要达到的最低左右交叉熵
:param min_aggregation: 被发现的新词,在给定文本中需要达到的最低凝聚度

比如,如果想获得比默认情况更多的结果(比如有些新词没有被发现),可以在默认参数的基础上往下调,下面的默认的参数:

min_entropy = np.log(length) / 10
min_freq = min(0.00005, 20.0 / length)
min_aggregation = np.sqrt(length) / 15

具体的算法细节和参数含义,参考:http://www.matrix67.com/blog/archives/5044


使用结巴词典过滤旧词(展开查看) ``` from harvesttext.resources import get_jieba_dict jieba_dict = get_jieba_dict(min_freq=100) print("jiaba词典中的词频>100的词语数:", len(jieba_dict)) text = "1979-1998-2020的喜宝们 我现在记忆不太好,大概是拍戏时摔坏了~有什么笔记都要当下写下来。前几天翻看,找着了当时记下的话.我觉得喜宝既不娱乐也不启示,但这就是生活就是人生,10/16来看喜宝吧" new_words_info = ht.word_discover(text, excluding_words=set(jieba_dict), # 排除词典已有词语 exclude_number=True) # 排除数字(默认True) new_words = new_words_info.index.tolist() print(new_words) # ['喜宝'] ```

根据反馈更新 原本默认接受一个单独的字符串,现在也可以接受字符串列表输入,会自动进行拼接

根据反馈更新 现在默认按照词频降序排序,也可以传入sort_by='score'参数,按照综合质量评分排序。

发现的新词很多都可能是文本中的特殊关键词,故可以把找到的新词登录,使后续的分词优先分出这些词。

def new_word_register():
    new_words = ["落叶球","666"]
    ht.add_new_words(new_words)   # 作为广义上的"新词"登录
    ht.add_new_entity("落叶球", mention0="落叶球", type0="术语")  # 作为特定类型登录
    print(ht.seg("这个落叶球踢得真是666", return_sent=True))
    for word, flag in ht.posseg("这个落叶球踢得真是666"):
        print("%s:%s" % (word, flag), end=" ")

这个 落叶球 踢 得 真是 666

这个:r 落叶球:术语 踢:v 得:ud 真是:d 666:新词

也可以使用一些特殊的规则来找到所需的关键词,并直接赋予类型,比如全英文,或者有着特定的前后缀等。

# find_with_rules()
from harvesttext.match_patterns import UpperFirst, AllEnglish, Contains, StartsWith, EndsWith
text0 = "我喜欢Python,因为requests库很适合爬虫"
ht0 = HarvestText()

found_entities = ht0.find_entity_with_rule(text0, rulesets=[AllEnglish()], type0="英文名")
print(found_entities)
print(ht0.posseg(text0))
{'Python', 'requests'}
[('我', 'r'), ('喜欢', 'v'), ('Python', '英文名'), (',', 'x'), ('因为', 'c'), ('requests', '英文名'), ('库', 'n'), ('很', 'd'), ('适合', 'v'), ('爬虫', 'n')]

自动分段

使用TextTiling算法,对没有分段的文本自动分段,或者基于已有段落进一步组织/重新分段。

ht0 = HarvestText()
text = """备受社会关注的湖南常德滴滴司机遇害案,将于1月3日9时许,在汉寿县人民法院开庭审理。此前,犯罪嫌疑人、19岁大学生杨某淇被鉴定为作案时患有抑郁症,为“有限定刑事责任能力”。
新京报此前报道,2019年3月24日凌晨,滴滴司机陈师傅,搭载19岁大学生杨某淇到常南汽车总站附近。坐在后排的杨某淇趁陈某不备,朝陈某连捅数刀致其死亡。事发监控显示,杨某淇杀人后下车离开。随后,杨某淇到公安机关自首,并供述称“因悲观厌世,精神崩溃,无故将司机杀害”。据杨某淇就读学校的工作人员称,他家有四口人,姐姐是聋哑人。
今日上午,田女士告诉新京报记者,明日开庭时间不变,此前已提出刑事附带民事赔偿,但通过与法院的沟通后获知,对方父母已经没有赔偿的意愿。当时按照人身死亡赔偿金计算共计80多万元,那时也想考虑对方家庭的经济状况。
田女士说,她相信法律,对最后的结果也做好心理准备。对方一家从未道歉,此前庭前会议中,对方提出了嫌疑人杨某淇作案时患有抑郁症的辩护意见。另具警方出具的鉴定书显示,嫌疑人作案时有限定刑事责任能力。
新京报记者从陈师傅的家属处获知,陈师傅有两个儿子,大儿子今年18岁,小儿子还不到5岁。“这对我来说是一起悲剧,对我们生活的影响,肯定是很大的”,田女士告诉新京报记者,丈夫遇害后,他们一家的主劳动力没有了,她自己带着两个孩子和两个老人一起过,“生活很艰辛”,她说,“还好有妹妹的陪伴,现在已经好些了。”"""
print("原始文本[5段]")
print(text+"\n")
print("预测文本[手动设置分3段]")
predicted_paras = ht0.cut_paragraphs(text, num_paras=3)
print("\n".join(predicted_paras)+"\n")
原始文本[5段]
备受社会关注的湖南常德滴滴司机遇害案,将于1月3日9时许,在汉寿县人民法院开庭审理。此前,犯罪嫌疑人、19岁大学生杨某淇被鉴定为作案时患有抑郁症,为“有限定刑事责任能力”。
新京报此前报道,2019年3月24日凌晨,滴滴司机陈师傅,搭载19岁大学生杨某淇到常南汽车总站附近。坐在后排的杨某淇趁陈某不备,朝陈某连捅数刀致其死亡。事发监控显示,杨某淇杀人后下车离开。随后,杨某淇到公安机关自首,并供述称“因悲观厌世,精神崩溃,无故将司机杀害”。据杨某淇就读学校的工作人员称,他家有四口人,姐姐是聋哑人。
今日上午,田女士告诉新京报记者,明日开庭时间不变,此前已提出刑事附带民事赔偿,但通过与法院的沟通后获知,对方父母已经没有赔偿的意愿。当时按照人身死亡赔偿金计算共计80多万元,那时也想考虑对方家庭的经济状况。
田女士说,她相信法律,对最后的结果也做好心理准备。对方一家从未道歉,此前庭前会议中,对方提出了嫌疑人杨某淇作案时患有抑郁症的辩护意见。另具警方出具的鉴定书显示,嫌疑人作案时有限定刑事责任能力。
新京报记者从陈师傅的家属处获知,陈师傅有两个儿子,大儿子今年18岁,小儿子还不到5岁。“这对我来说是一起悲剧,对我们生活的影响,肯定是很大的”,田女士告诉新京报记者,丈夫遇害后,他们一家的主劳动力没有了,她自己带着两个孩子和两个老人一起过,“生活很艰辛”,她说,“还好有妹妹的陪伴,现在已经好些了。”

预测文本[手动设置分3段]
备受社会关注的湖南常德滴滴司机遇害案,将于1月3日9时许,在汉寿县人民法院开庭审理。此前,犯罪嫌疑人、19岁大学生杨某淇被鉴定为作案时患有抑郁症,为“有限定刑事责任能力”。
新京报此前报道,2019年3月24日凌晨,滴滴司机陈师傅,搭载19岁大学生杨某淇到常南汽车总站附近。坐在后排的杨某淇趁陈某不备,朝陈某连捅数刀致其死亡。事发监控显示,杨某淇杀人后下车离开。随后,杨某淇到公安机关自首,并供述称“因悲观厌世,精神崩溃,无故将司机杀害”。据杨某淇就读学校的工作人员称,他家有四口人,姐姐是聋哑人。
今日上午,田女士告诉新京报记者,明日开庭时间不变,此前已提出刑事附带民事赔偿,但通过与法院的沟通后获知,对方父母已经没有赔偿的意愿。当时按照人身死亡赔偿金计算共计80多万元,那时也想考虑对方家庭的经济状况。田女士说,她相信法律,对最后的结果也做好心理准备。对方一家从未道歉,此前庭前会议中,对方提出了嫌疑人杨某淇作案时患有抑郁症的辩护意见。另具警方出具的鉴定书显示,嫌疑人作案时有限定刑事责任能力。新京报记者从陈师傅的家属处获知,陈师傅有两个儿子,大儿子今年18岁,小儿子还不到5岁。“这对我来说是一起悲剧,对我们生活的影响,肯定是很大的”,田女士告诉新京报记者,丈夫遇害后,他们一家的主劳动力没有了,她自己带着两个孩子和两个老人一起过,“生活很艰辛”,她说,“还好有妹妹的陪伴,现在已经好些了。”

与原始论文中不同,这里以分句结果作为基本单元,而使用不是固定数目的字符,语义上更加清晰,且省去了设置参数的麻烦。因此,默认设定下的算法不支持没有标点的文本。但是可以通过把seq_chars设置为一正整数,来使用原始论文的设置,为没有标点的文本来进行分段,如果也没有段落换行,请设置align_boundary=False。例见examples/basic.py中的cut_paragraph()

print("去除标点以后的分段")
text2 = extract_only_chinese(text)
predicted_paras2 = ht0.cut_paragraphs(text2, num_paras=5, seq_chars=10, align_boundary=False)
print("\n".join(predicted_paras2)+"\n")
去除标点以后的分段
备受社会关注的湖南常德滴滴司机遇害案将于月日时许在汉寿县人民法院开庭审理此前犯罪嫌疑人岁大学生杨某淇被鉴定为作案时患有抑郁症为有 
限定刑事责任能力新京报此前报道年
月日凌晨滴滴司机陈师
傅搭载岁大学生杨某淇到常南汽车总站附近坐在后排的杨某淇趁陈某不备朝陈某连捅数刀致其死亡事发监控显示杨某淇杀人后下车离开随后杨某淇 
到公安机关自首并供述称因悲观厌世精神崩溃无故将司机杀害据杨某淇就读学校的工作人员称他家有四口人姐姐是聋哑人今日上午田女士告诉新京 
报记者明日开庭时间不变此前已提出刑事附带民事赔偿但通过与法院的沟通后获知对方父母已经没有赔偿的意愿当时按照人身死亡赔偿金计算共计 
多万元那时也想考虑对方家庭的经济状况田女士说她相信法律对最后的结果也做好心理准备对方一家从未道歉此前庭前会议中对方提
出了嫌疑人杨某淇作案时患有抑郁症的辩护意见另具警方出具的鉴定书显示嫌疑人作案时有限定刑事责任能力新京
报记者从陈师傅的家属处获知陈师傅有两个儿子大儿子今年岁小儿子还不到岁这对我来说是一起悲剧对我们生活的影响肯定是很大的田女士告诉新 
京报记者丈夫遇害后他们一家的主劳动力没有了她自己带着两个孩子和两个老人一起过生活很艰辛她说还好有妹妹的陪伴现在已经好些了

存取消除

可以本地保存模型再读取复用,也可以消除当前模型的记录。

from harvesttext import loadHT,saveHT
para = "上港的武磊和恒大的郜林,谁是**最好的前锋?那当然是武磊武球王了,他是射手榜第一,原来是弱点的单刀也有了进步"
saveHT(ht,"ht_model1")
ht2 = loadHT("ht_model1")

# 消除记录
ht2.clear()
print("cut with cleared model")
print(ht2.seg(para))

简易问答系统

具体实现及例子在naiveKGQA.py中,下面给出部分示意:

QA = NaiveKGQA(SVOs, entity_type_dict=entity_type_dict)
questions = ["你好","孙中山干了什么事?","谁发动了什么?","清政府签订了哪些条约?",
			 "英国与鸦片战争的关系是什么?","谁复辟了帝制?"]
for question0 in questions:
	print("问:"+question0)
	print("答:"+QA.answer(question0))
问:孙中山干了什么事?
答:就任临时大总统、发动护法运动、让位于袁世凯
问:谁发动了什么?
答:英法联军****、国民党人二次革命、英国鸦片战争、日本**朝鲜、孙中山护法运动、法国**越南、英国****西藏战争、慈禧太后戊戌政变
问:清政府签订了哪些条约?
答:北京条约、天津条约
问:英国与鸦片战争的关系是什么?
答:发动
问:谁复辟了帝制?
答:袁世凯

英语支持

本库主要旨在支持对中文的数据挖掘,但是加入了包括情感分析在内的少量英语支持。

需要使用这些功能,需要创建一个专门英语模式的HarvestText对象。

# ♪ "Until the Day" by JJ Lin
test_text = """
In the middle of the night. 
Lonely souls travel in time.
Familiar hearts start to entwine.
We imagine what we'll find, in another life.  
""".lower()
ht_eng = HarvestText(language="en")
sentences = ht_eng.cut_sentences(test_text)  # 分句
print("\n".join(sentences))
print(ht_eng.seg(sentences[-1]))             # 分词[及词性标注]
print(ht_eng.posseg(sentences[0], stopwords={"in"}))
# 情感分析
sent_dict = ht_eng.build_sent_dict(sentences, pos_seeds=["familiar"], neg_seeds=["lonely"],
                                   min_times=1, stopwords={'in', 'to'})
print("sentiment analysis")
for sent0 in sentences:
    print(sent0, "%.3f" % ht_eng.analyse_sent(sent0))
# 自动分段
print("Segmentation")
print("\n".join(ht_eng.cut_paragraphs(test_text, num_paras=2)))

# 情感分析也提供了一个内置英文词典资源
# from harvesttext.resources import get_english_senti_lexicon
# sent_lexicon = get_english_senti_lexicon()
# sent_dict = ht_eng.build_sent_dict(sentences, pos_seeds=sent_lexicon["pos"], neg_seeds=sent_lexicon["neg"], min_times=1)
in the middle of the night.
lonely souls travel in time.
familiar hearts start to entwine.
we imagine what we'll find, in another life.

['we', 'imagine', 'what', 'we', "'ll", 'find', ',', 'in', 'another', 'life', '.']
[('the', 'DET'), ('middle', 'NOUN'), ('of', 'ADP'), ('the', 'DET'), ('night', 'NOUN'), ('.', '.')]

sentiment analysis
in the middle of the night. 0.000
lonely souls travel in time. -1.600
familiar hearts start to entwine. 1.600
we imagine what we'll find, in another life. 0.000

Segmentation
in the middle of the night. lonely souls travel in time. familiar hearts start to entwine.
we imagine what we'll find, in another life.

目前对英语的支持并不完善,除去上述示例中的功能,其他功能不保证能够使用。

引用

如果你发现这个库对你的学术工作有所帮助,请按照下面的格式引用

@misc{zhangHarvestText,
	author = {Zhiling Zhang},
	title = {HarvestText: A Toolkit for Text Mining and Preprocessing},
	journal = {GitHub repository},
	howpublished = {\url{https://github.com/blmoistawinde/HarvestText}},
	year = {2023}
}

More

本库正在开发中,关于现有功能的改善和更多功能的添加可能会陆续到来。欢迎在issues里提供意见建议。觉得好用的话,也不妨来个Star~

感谢以下repo带来的启发:

snownlp

pyhanLP

funNLP

ChineseWordSegmentation

EventTriplesExtraction

textrank4ZH

harvesttext's People

Contributors

blmoistawinde avatar francis-du avatar sean16sysu avatar tabletreedev avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

harvesttext's Issues

对没有标点的文本进行分段

您好,我这边有个样本数据没有任何标点,主要是因为实际中给的数据就没有标点,使用这里介绍的方法基本没有分出来段,texttilling这个方法我记得原作者是基于字的个数去进行相似度计算的,而不是标点?

@Sean16SYSU @blmoistawinde @JiaxiangBU

def find_chinese(file):
    pattern = re.compile(r'[^\u4e00-\u9fa5]')
    chinese = re.sub(pattern, '', file)
    return chinese

if __name__ == "__main__":
    line = '''
    ****总书记、国家主席、**军委主席***近日在安徽考察时强调,要贯彻落实好党**决策部署,贯彻新发展理念,坚持稳中求进工作总基调,坚持改革开放,坚持高质量发展,深化供给侧结构性改革,打好三大攻坚战,做好“六稳”工作,落实“六保”任务,决胜全面建成小康社会、决战脱贫攻坚,在构建以国内大循环为主体、国内国际双循环相互促进的新发展格局中实现更大作为,在加快建设美好安徽上取得新的更大进展。
    八月的江淮大地,烈日炎炎。8月18日至21日,***在安徽省委书记李锦斌、省长李国英陪同下,先后来到阜阳、马鞍山、合肥等地,深入防汛救灾一线、农村、企业、革命纪念馆等,看望慰问受灾群众和防汛救灾一线人员,就统筹推进常态化疫情防控和经济社会发展工作、加强防汛救灾和灾后恢复重建、推进长三角一体化发展、谋划“十四五”时期经济社会发展进行调研。
    18日下午,***首先来到阜阳市阜南县王家坝闸,听取安徽省防汛工作及王家坝开闸分洪情况介绍。王家坝闸有千里淮河“第一闸”之称。今年7月20日,王家坝闸时隔13年再次开闸蓄洪,有效发挥了错峰减压功能。在王家坝防汛抗洪展厅,***详细了解淮河治理历史和淮河流域防汛抗洪工作情况。他强调,淮河是新**成立后第一条全面系**理的大河。70年来,淮河治理取得显著成效,防洪体系越来越完善,防汛抗洪、防灾减灾能力不断提高。要把治理淮河的经验总结好,认真谋划“十四五”时期淮河治理方案。
    随后,***来到附近的红亮箱包有限公司,了解阜南县开展就业扶贫和防止因灾致贫返贫情况,并察看车间生产线,同职工亲切交流。***希望企业克服困难,把灾害造成的损失抢回来。他要求各级党委和政府加大扶持力度,帮助企业渡过难关,保障受灾群众、贫困群众就业。
    离开扶贫车间,***来到蒙洼蓄洪区曹集镇利民村西田坡庄台考察调研。洪水退后,庄台附近农田一派繁忙景象,村民正加紧在水塘中采摘芡实、在退水地块中补种蔬菜。***沿着田埂走进农田深处,向正在劳作的乡亲们了解生产恢复情况。他指出,要因地制宜、抢种补种,尽量把灾害损失降到最低,争取秋季仍然取得好的收成。要根据蓄洪区特点安排群众生产生活,扬长避短,同时引导和鼓励乡亲们逐步搬离出去,确保蓄洪区人口不再增多。
    ***接着来到西田坡庄台,察看村容村貌,并走进村民的家,了解他们的家庭收入、受灾损失、生产恢复等情况。***指出,各级党委和政府要根据国家规定,尽快将相关补偿款落实到位,并出台兜底保障等帮扶措施,确保受灾群众基本生活不受影响。
    离开庄台时,村民们纷纷向总书记问好。***对乡亲们说,我十分牵挂灾区群众,这次专程来看望乡亲们,看到大家在党委和政府帮助下生活逐步恢复正常,积极开展生产自救,我就放心了。希望乡亲们自力更生,继续努力,让日子越过越红火!
    19日上午,***前往马鞍山市考察调研。薛家洼生态园地处长江岸边,长期以来乱搭乱建、污水横流,经过整治,如今已成为百姓亲江亲水亲绿的美丽岸线。***详细了解马鞍山市长江岸线综合整治和生态环境保护修复、长江十年禁渔等工作落实情况,并走到江边察看长江水势和岸线生态环境。***强调,生态环境保护和经济发展不是矛盾对立的关系,而是辩证统一的关系。把生态保护好,把生态优势发挥出来,才能实现高质量发展。实施长江十年禁渔计划,要把相关工作做到位,让广大渔民愿意上岸、上得了岸,上岸后能够稳得住、能致富。长江经济带建设,要共抓大保护、不搞大开发。要增强爱护长江、保护长江的意识,实现“人民保护长江、长江造福人民”的良性循环,早日重现“一江碧水向东流”的胜景。
    马鞍山市因钢而设、因钢而兴。***来到**宝武马钢集团,了解企业生产经营情况,察看重点产品展示。随后,***走进优质合金棒材车间,察看加热炉、初轧机、中轧机等运行情况。车间外,企业劳动模范、工人代表看到总书记来了,热烈鼓掌。***亲切地同大家打招呼。他指出,疫情发生以来,马钢克服困难,率先复工复产,上半年产量和营收同比实现“双升”。要抓住深化国有企业改革和推动长三角一体化发展的重大机遇,加强新材料新技术研发,开发生产更多技术含量高、附加值高的新产品,增强市场竞争力。劳动模范是共和国的功臣,要大力弘扬劳模精神。
    19日下午,***来到合肥市肥东县十八联圩生态湿地蓄洪区巢湖大堤罗家疃段考察。今年入汛以来,巢湖水位多次突破历史极值,合肥市主动启用十八联圩及周边圩区蓄洪。***仔细察看巢湖水势水情,听取环巢湖主要圩口分洪及周边湿地蓄洪、巢湖综合治理情况汇报,了解防汛物资和大堤加固情况。他强调,要坚持湿地蓄洪区的定位和规划,尽快恢复生态湿地蓄洪区的行蓄洪功能和生态保护功能。他指出,当前,南方有关地方要继续抓好防汛救灾工作,同时要严防次生灾害。北方有关地方要对可能发生的汛情加强警戒和防范,全面落实防汛救灾各项工作,确保安全度汛,确保人民群众生命财产安全。
    大堤上,***亲切看望慰问了在防汛抗洪救灾斗争中牺牲同志的家属、防汛抗洪一线人员、先进典型代表和参加抗洪抢险的部队官兵,并向全国奋战在防汛抗洪救灾一线的同志们表示诚挚的问候。他强调,今年入汛以来,南北方江河湖泊接连出现超警戒水位险情。广大干部群众和人民解放军、武警官兵坚决响应党和政府号召,发扬不怕累苦、不怕疲劳、不怕牺牲的精神斗志,坚守在防汛抗洪救灾第一线,涌现了许多先进典型和感人事迹,展现了**人民众志成城、顽强拼搏、敢于胜利的英雄气概,书写了洪水无情人有情的人间大爱。党和人民感谢你们!
    当天下午,***在合肥参观了安徽创新馆,对安徽在推进科技创新和发展战略性新兴产业上取得积极进展表示肯定。他指出,安徽要加快融入长三角一体化发展,实现跨越式发展,关键靠创新。要进一步夯实创新的基础,加快科技成果转化,加快培育新兴产业,锲而不舍、久久为功。
    渡江战役纪念馆坐落在巢湖之滨。71年前,在人民群众大力支援下,人民解放军一举突破长江天险,为解放全**创造了条件。***参观了纪念馆,重温那段革命历史。他强调,淮海战役的胜利是靠老百姓用小车推出来的,渡江战役的胜利是靠老百姓用小船划出来的。任何时候我们都要不忘初心、牢记使命,都不能忘了人民这个根,永远做忠诚的人民服务员。要广泛开展爱国主义教育,让人们深入理解为什么历史和人民选择了**共产党,为什么必须坚持走**特色社会主义道路、实现中华民族伟大复兴。
    21日上午,***听取了安徽省委和省政府工作汇报,对安徽各项工作取得的成绩给予肯定,希望安徽广大干部群众进一步解放**、开拓奋进,知重负重、攻坚克难,为全面建成小康社会、开启全面建设社会主义现代化国家新征程贡献更大力量。
    ***强调,当前,防汛救灾任务仍很艰巨,各级党委和政府要发扬不怕疲劳、连续作战的作风,做好防汛救灾和灾后恢复重建工作,支持受灾企业复工复产。要把防止因疫因灾致贫返贫摆在突出位置,坚持精准扶贫,进行有针对性的帮扶。要坚持以防为主、防抗救相结合,结合“十四五”规划,聚焦河流湖泊安全、生态环境安全、城市防洪安全,谋划建设一批基础性、枢纽性的重大项目。要坚决扛稳粮食安全责任,深化农业供给侧结构性改革,促进农村三产融合发展,提高农业质量效益和竞争力。
    ***指出,要深刻把握发展的阶段性新特征新要求,坚持把做实做强做优实体经济作为主攻方向,一手抓传统产业转型升级,一手抓战略性新兴产业发展壮大,推动制造业加速向数字化、网络化、智能化发展,提高产业链供应链稳定性和现代化水平。要牢牢把握扩大内需这个战略基点,努力探索形成新发展格局的有效路径。要对标世界一流,加强前沿探索和前瞻布局,加大关键核心技术攻坚力度。要发挥好改革的突破和先导作用,依靠改革破除发展瓶颈、汇聚发展优势、增强发展动力。要紧扣一体化和高质量两个关键词,深入推进重点领域一体化建设,推进长三角一体化发展。
    ***强调,要牢固树立以人民为中心的发展**,扎实推进民生工程,出台更多援企、减负、稳岗、扩就业的支持性措施,突出做好高校毕业生、农民工、退役军人、受灾群众等重点人群就业工作,落实好纾困惠企政策,保护和激发市场主体活力。要全面贯彻党的教育方针,落实立德树人根本任务,促进教育公平。要保持现有帮扶政策总体稳定,接续推进全面脱贫与乡村振兴有效衔接,推动贫困地区走向全面振兴。要完善重大疫情防控救治体制机制,健全公共卫生应急管理体系。要推动社会治理和服务重心向基层下移,完善基层社会治安综合治理。
    ***指出,人民是我们党的执政基础。抗击新冠肺炎疫情、抗洪抢险斗争再次表明,只要我们党始终为人民执政、依靠人民执政,就能无往而不胜。各级领导班子和领导干部要践行党的宗旨,树牢群众观点,力戒形式主义、官僚主义。要教育引导广大党员、干部坚定理想信念,不断提高辨别政治是非、保持政治定力、驾驭政治局面、防范政治风险的能力。要坚持反腐败无禁区、全覆盖、零容忍,一体推进不敢腐、不能腐、不想腐体制机制建设,推动全面从严治党向基层一线、向群众身边延伸,实现正气充盈、政治清明。
    丁薛祥、刘鹤、陈希、王勇、何立峰和**有关部门负责同志陪同考察,张又侠参加有关活动。
    '''
    # print("原文:")
    # print(line)
    print("保留中文:")
    text=find_chinese(line)
    # print("保留非中文:")
    # find_unchinese(line)


ht = HarvestText()

print("原始文本[1段]")
# print(get_text+"\n")
print("预测文本[手动设置分5段]")
predicted_paras = ht.cut_paragraphs(text, num_paras=5)
print("\n".join(predicted_paras)+"\n")

结果的话我这边放个图,也就是还是1段,没有分出来

image

pip下载的harvesttext版本落后

我已经仔细查看过本库的README和之前的Issues,没有发现解决方案。

问题描述
您好!请问为什么我用pip下载harvesttext的版本为0.4.1呢?使用pip install --upgrade harvesttext后也没用。谢谢!

如何复现

操作系统:

python版本:
3.9
HarvestText版本:

安装出现很多问题

这个安装的时候很多报错啊,比如 No module named 'community' 很奇怪,有这个模块?

一定要安装mysql吗

我已经仔细查看过本库的README和之前的Issues,没有发现解决方案。

问题描述

如何复现

操作系统:

python版本:

HarvestText版本:

英文文本效果如何?

a nlp beginner, 最近在看无(弱)监督的情感分析,想知道这个项目对英文文本效果如何?

mysql_config not found

我已经仔细查看过本库的README和之前的Issues,没有发现解决方案。

问题描述

在安装的时候,不管是从源码编译requirements.txt,还是pip install HarvestText. 都会出现 mysql_config not found
如何复现

操作系统:MacOs

python版本:3.6

HarvestText版本:最新版

请问下,通用情感词典[内置资源]要怎样才能用上?

如果没想好选择哪些词语作为“种子词”,本库中也内置了一个通用情感词典内置资源,在不指定情感词时作为默认的选择,也可以根据需要从中挑选。
具体如何挑选?
sent_dict = ht.build_sent_dict(sents,min_times=1,scale="+-1")
是我从qh_sent_dict.json里挑选词,组成sents吗?有无自动加载qh_sent_dict.json全部词的方法?

关系网络无论怎么弄,都返回空的{}

我已经仔细查看过本库的README和之前的Issues,没有发现解决方案。

我完整运行了提供的以下关系网络示例函数,但print都是{},其它函数如情感分析、分句分词等都正常
def entity_network():
print("\nentity network")
# 在现有实体库的基础上随时新增,比如从新词发现中得到的漏网之鱼
ht.add_new_entity("武磊", "颜骏凌", "球员")
docs = ["武磊和颜骏凌是球员",
"武磊和郜林都是国内顶尖前锋"]
G = ht.build_entity_graph(docs)
print(dict(G.edges.items()))
G = ht.build_entity_graph(docs, used_types=["球员"])
print(dict(G.edges.items()))

操作系统:linux

python版本:3.6.8

HarvestText版本:V0.8

三元组抽取是报错了,不知道你有没有遇到?网上没有找到解决方法

Traceback (most recent call last):
File "/root/PycharmProjects/entity_extract/test.py", line 82, in
SVOs += ht2.triple_extraction(sent.strip())
File "/root/anaconda3/envs/tensorflow/lib/python3.6/site-packages/harvesttext-0.5.4-py3.6.egg/harvesttext/harvesttext.py", line 577, in triple_extraction
arcs = self.dependency_parse(sent, standard_name, stopwords)
File "/root/anaconda3/envs/tensorflow/lib/python3.6/site-packages/harvesttext-0.5.4-py3.6.egg/harvesttext/harvesttext.py", line 550, in dependency_parse
sentence = HanLP.parseDependency(sent2)
jpype._jexception.NoSuchElementExceptionPyRaisable: java.util.NoSuchElementException

清洗模块改进

通过爬虫抓取微博热门语料对HT的清洗模块进行了小测试,故根据返回结果提出反馈:

①
①:每条语料都有”\u200b“

②
②:中间的博文内容“辛苦了”被洗掉

③
③:存在特殊表情符号无法处理

④
④:“[]"后的全部内容被洗掉

⑤
⑤:中括号内的“[]"包裹的内容被洗掉

⑥
⑥:除了”\u200b“,HT大多数情况下的表现已经很好

HarvestText 安装出现以下问题AttributeError: module 'gensim' has no attribute 'utils'

我已经仔细查看过本库的README和之前的Issues,没有发现解决方案。

问题描述
安装出现以下问题

AttributeError Traceback (most recent call last)
in ()
----> 1 from harvesttext import HarvestText
2 ht = HarvestText()

D:\python\lib\site-packages\harvesttext_init_.py in ()
2 #!/usr/bin/env python
3 import pickle
----> 4 from .harvesttext import HarvestText
5 from .resources import *
6

D:\python\lib\site-packages\harvesttext\harvesttext.py in ()
21 from .sentiment import SentimentMixin
22 from .summary import SummaryMixin
---> 23 from .word_discover import WordDiscoverMixin
24 from .resources import get_baidu_stopwords
25

D:\python\lib\site-packages\harvesttext\word_discover.py in ()
9 from .resources import get_baidu_stopwords
10 from .algorithms.word_discoverer import WordDiscoverer
---> 11 from .algorithms.entity_discoverer import NFLEntityDiscoverer, NERPEntityDiscover
12 from .algorithms.keyword import textrank
13

D:\python\lib\site-packages\harvesttext\algorithms\entity_discoverer.py in ()
9 from collections import defaultdict
10 from sklearn.metrics.pairwise import cosine_similarity
---> 11 from gensim.models import FastText
12
13 class NERPEntityDiscover:

D:\python\lib\site-packages\gensim_init_.py in ()
3 """
4
----> 5 from gensim import parsing, corpora, matutils, interfaces, models, similarities, summarization, utils # noqa:F401
6 import logging
7

D:\python\lib\site-packages\gensim\models_init_.py in ()
20 from .atmodel import AuthorTopicModel # noqa:F401
21 from .ldaseqmodel import LdaSeqModel # noqa:F401
---> 22 from .fasttext import FastText # noqa:F401
23 from .translation_matrix import TranslationMatrix, BackMappingTranslationMatrix # noqa:F401
24

D:\python\lib\site-packages\gensim\models\fasttext.py in ()
322
323
--> 324 class FastText(BaseWordEmbeddingsModel):
325 """Train, use and evaluate word representations learned using the method
326 described in Enriching Word Vectors with Subword Information <https://arxiv.org/abs/1607.04606>_, aka FastText.

D:\python\lib\site-packages\gensim\models\fasttext.py in FastText()
494
495 @Property
--> 496 @gensim.utils.deprecated("Attribute will be removed in 4.0.0, use wv.min_n instead")
497 def min_n(self):
498 return self.wv.min_n

AttributeError: module 'gensim' has no attribute 'utils'

操作系统:
win10
python版本:3.7
HarvestText版本:0.8.1.1
genism版本:3.8.3

请问下这个如何解决?

实体链接功能

您好,请问我只需要识别出句子中的实体的位置,还需要上传实体的类型词典吗?实体类型词典是必须要传的吗?

能支持模型训练吗

自动分段模型训练
用了自己的数据中英文结合的,发现分段效果不太好。请问能支持特定数据的模型训练吗?

获得文档中所有实体出现次数的例子与预期结果不符

在readme中有一段例子如下

from harvesttext import HarvestText
ht = HarvestText()
docs = ["武磊威武,中超第一射手!",
		"郜林看来不行,已经到上限了。",
		"武球王威武,中超最强前锋!",
		"武磊和郜林,谁是**最好的前锋?"]
inv_index = ht.build_index(docs)
print(ht.get_entity_counts(docs, inv_index))
# {'武磊': 3, '郜林': 2, '前锋': 2}

我按照例子的代码来做,得出的结果为空值,其中inv_index的值为{defaultdict:0}

信息检索

我已经仔细查看过本库的README和之前的Issues,没有发现解决方案。

问题描述
信息检索结果为空

如何复现
from harvesttext import HarvestText
ht = HarvestText()
docs = ["武磊威武,中超第一射手!",
"郜林看来不行,已经到上限了。",
"武球王威武,中超最强前锋!",
"武磊和郜林,谁是**最好的前锋?"]
inv_index = ht.build_index(docs)
print(ht.get_entity_counts(docs, inv_index))

操作系统:windows

python版本:Python 3.8.5

HarvestText版本:0.8.1.4

ModuleNotFoundError: No module named 'harvesttext.algorithms'

我已经仔细查看过本库的README和之前的Issues,没有发现解决方案。

问题描述
ModuleNotFoundError: No module named 'harvesttext.algorithms'

如何复现
直接运行的examples/basic.py 文件

操作系统:

python版本:

HarvestText版本:

链接失效

我已经仔细查看过本库的README和之前的Issues,没有发现解决方案。

问题描述

【注:本库仅完成实体分词和情感分析,可视化使用matplotlib】
- [近代史纲要信息抽取及问答系统](https://blog.csdn.net/blmoistawinde/article/details/86557070)(命名实体识别,依存句法分析,简易问答系统)

https://blog.csdn.net/blmoistawinde/article/details/86557070链接失效

语料处理增加对数学中符号的转化

a³转化为a的三次幂,能够讲右上角阿拉伯数字转中文数字,还有计量单位也可以增加一下,电流,毫安,这些,能增加符号温度℃这些更完美了

电流 | 安(培) | A
平面角1°=60ˊ

文本清洗

列如微博文本中有#号未清洗,微博也新增了很多表情。希望大佬将一功能更新

劳烦在码仓里添加一下引文格式

描述你想要的功能
劳烦在码仓里添加一下引文格式

是否有自己想过的可能解决方案?
有,这不您写的我们引起来放心

其他想说的
像下面这样的

@misc{blmHar???,
title={HarvestText : ????},
author={???},
journal = {GitHub repository},
howpublished = {\url{https://github.com/blmoistawinde/HarvestText}},
year={???}
}

自动分段bug

下面自动分段的代码运行时, 报错了, IndexError: list index out of range

from harvesttext import HarvestText
ht0 = HarvestText()

text = """冠心病不是遗传性疾病。
遗传性疾病的发生,是因为从父母得到的遗传物质出了问题,例如染色体、基因发生了改变。目前,医学界还没有发现有遗传物质改变会明确导致冠心病。因此,严格来说,冠心病并不属于遗传性疾病,本身并不会遗传。
但是冠心病具有一定的家族聚集性,这是因为,与冠心病发生相关的一些危险因素有可能在家族中集中发生,例如高脂血症可能遗传,家人可能共同具有吸烟、高盐饮食、少运动等不良生活方式。同时,相关的研究也表明,遗传因素确实对早发冠心病有影响,一般来说,男性小于 55 岁、女性小于 65 岁明确诊断冠心病被认为是早发。
因此,如果家人中有冠心病患者,特别是有早发冠心病家族史,即一级亲属(父母、子女、兄弟姐妹)中有男性小于 55 岁、女性小于 65 岁明确诊断冠心病,自己还是要警惕。"""

predicted_paras = ht0.cut_paragraphs(text)

文本分段指定段数切割失败

我已经仔细查看过本库的README和之前的Issues,没有发现解决方案。

问题描述

ht0 = HarvestText()

text='《长征》第1集 The Long March 01震惊世界的二万五千里长征(唐国强/陈道明),【CCTV电视剧】Highlights:***针对奔袭湘江的作战命令会给数万红军带来的严重损失,连夜找“三人团”请示复议作战计划,李德不耐烦地指责***是在危言耸听。'
print('fenduanqian==',text)
predicted_paras = ht0.cut_paragraphs(text, num_paras=3) 
for i in predicted_paras:
    print('duan==',i)

如何复现

fenduanqian== 《长征》第1集 The Long March 01震惊世界的二万五千里长征(唐国强/陈道明),【CCTV电视剧】Highlights:***针对奔袭湘江的作战命令会给数万红军带来的严重损失,连夜找“三人团”请示复议作战计划,李德不耐烦地指责***是在危言耸听。 
duan== 《长征》第1集 The Long March 01震惊世界的二万五千里长征(唐国强/陈道明),【CCTV电视剧】Highlights:***针对奔 袭湘江的作战命令会给数万红军带来的严重损失,连夜找“三人团”请示复议作战计划,李德不耐烦地指责***是在危言耸听。

操作系统:
windows10
python版本:
3.8
HarvestText版本:
0.8.1.5

TopicRank 实现

描述你想要的功能
能够提供具体例子更好

TextRank 得到的是摘要性的句子而非短语,TopicRank 可以实现这一点,这算一个新功能。
而且从 paper 的对比试验来看,短语抽取是比 TextRank 会更高些(作者对比可英文和法语)。

是否有自己想过的可能解决方案?

其实有解决方案了,见 pke,但是这个包实在是太多 bug 了

  1. 基本上是依赖包各种问题(nltk),要么就是一些浮动值计算的bug,如ZeroDivisionError: float division by zero,这里gap不做极端例子的处理, self.graph[i][j]['weight'] += 1.0 / gap
  2. 整个包我看了,不支持中文,只支持英文和其他几种外语,如果要强用中文,需要自己手动分词等按照英文的方式去套用模型,这个在中文文本数据处理有点违背初衷了。
  3. 我有一些准备,基本上 paper 我看了,idea 大概比较清楚,这有一些 notes,实现上,我还在考虑,基本上其实可以参考一些 pke 的底层函数。

其他想说的

也想看看项目开发者的想法,比如这个需求有没有必要做。

问答模块无法正常使用

你好,我尝试使用您的问答模块跑demo,就是运行naiveKGQA.py这个Python脚本,结果直接报如下错误:
问:你好
答:你好
问:孙中山干了什么事?
Traceback (most recent call last):
File "D:\workspace\git\HarvestText\examples\naiveKGQA.py", line 165, in
print("答:"+QA.answer(question0))
File "D:\workspace\git\HarvestText\examples\naiveKGQA.py", line 110, in answer
answers = self.search_answers(search0)
File "D:\workspace\git\HarvestText\examples\naiveKGQA.py", line 99, in search_answers
records = self.KG.query(search0)
File "D:\ProgramData\anaconda3\envs\kg_env\lib\site-packages\rdflib\graph.py", line 1127, in query
result = plugin.get(result, query.Result)
File "D:\ProgramData\anaconda3\envs\kg_env\lib\site-packages\rdflib\plugin.py", line 107, in get
return p.getClass()
File "D:\ProgramData\anaconda3\envs\kg_env\lib\site-packages\rdflib\plugin.py", line 69, in getClass
module = import(self.module_path, globals(), locals(), [""])
File "D:\ProgramData\anaconda3\envs\kg_env\lib\site-packages\rdflib\plugins\sparql_init_.py", line 33, in
from . import parser
File "D:\ProgramData\anaconda3\envs\kg_env\lib\site-packages\rdflib\plugins\sparql\parser.py", line 184, in
Param('prefix', PN_PREFIX)) + Suppress(':').leaveWhitespace()
File "D:\ProgramData\anaconda3\envs\kg_env\lib\site-packages\rdflib\plugins\sparql\parserutils.py", line 114, in init
self.name = name
AttributeError: can't set attribute

操作系统:Win10 专业版

python版本:3.6.13

HarvestText版本:0.8.1.8

提个分句的建议

对于扩尾与句号或省略号的连用,不能直接分句。
具体如下:

import re
from harvesttext import HarvestText
ht = HarvestText()
para = "向量的研究结合了数学的三个基本领域:数量、结构及空间。向量分析则将其扩展至第四个基本的领域内,即变化。创立于二十世纪三十年代的法国的布尔巴基学派认为:纯粹数学,是研究抽象结构的理论。结构,就是以初始概念和公理出发的演绎系统。空间的研究源自于几何-尤其是欧几里得几何。布尔巴基学派认为,有三种基本的抽象结构:代数结构(群,环,域……),序结构(偏序,全序……),拓扑结构(邻域,极限,连通性,维数……)。"
print(ht.cut_sentences(para))
输出结果:
   ['向量的研究结合了数学的三个基本领域:数量、结构及空间。', 
    '向量分析则将其扩展至第四个基本的领域内,即变化。', 
    '创立于二十世纪三十年代的法国的布尔巴基学派认为:纯粹数学,是研究抽象结构的理论。', 
    '结构,就是以初始概念和公理出发的演绎系统。', '空间的研究源自于几何-尤其是欧几里得几何。', 
    '布尔巴基学派认为,有三种基本的抽象结构:代数结构(群,环,域……', 
    '),序结构(偏序,全序……', 
    '),拓扑结构(邻域,极限,连通性,维数……', 
    ')。']

给个粗暴的解决方案哈:检测到括号后,把括号与括号内的内容存起来并替换成某符号,再做分句处理,最后再替换回来。

url正则表达式卡死

我已经仔细查看过本库的README和之前的Issues,没有发现解决方案。

问题描述
某些文本正则表达式会卡死

如何复现
“#王一博百里弘毅# wyb#王一博风起洛阳#@二哈啃鸡腿 @yb甜甜的小可爱 //@Knife-Peace反黑站 【1/25】今日五再来‼️‼️裙👉🏻O网页链接目标打卡人数:3000打卡模版 见评论⭕️评论时请同步@ xxx@\xa0 xxx 两位好友•不要@ 你哥⭕️打卡完请顺手转发,转发不带tag✅微博「有害•暴恐」 1.https://service.account.weibo.com/reportspamobile?rid=4597215374620241&type=2&from=400002.https://service.account.weibo.com/reportspamobile?rid=4597257192873019&type=1&from=400003.https://service.account.weibo.com/reportspamobile?rid=4597238372241607&type=1&from=400004.https://service.account.weibo.com/reportspamobile?rid=4597253895883962&type=1&from=400005.https://service.account.weibo.com/reportspamobile?rid=4597261051368482&type=1&from=400006.https://service.account.weibo.com/reportspamobile?rid=4597256013743185&type=1&from=400007.https://service.account.weibo.com/reportspamobile?rid=4597258354169688&type=1&from=400008.https://service.account.weibo.com/reportspamobile?rid=4597253216408617&type=1&from=400009.https://service.account.weibo.com/reportspamobile?rid=4597257359852121&type=1&from=40000✅主页「人身攻击+同步拉黑」⚠️人身攻击模板已更新见评论(按正序查看)1.https://service.account.weibo.com/reportspamobile?rid=7315070554&type=3&from=400002.https://service.account.weibo.com/reportspamobile?rid=7405781810&type=3&from=400003.https://service.account.weibo.com/reportspamobile?rid=7521879541&type=3&from=400004.https://service.account.weibo.com/reportspamobile?rid=6605423447&type=3&from=400005.https://service.account.weibo.com/reportspamobile?rid=5344089965&type=3&from=400006.https://service.account.weibo.com/reportspamobile?rid=6742563952&type=3&from=400007.https://service.account.weibo.com/reportspamobile?rid=1708151137&type=3&from=40000(批皮黑:ID:我们翘课吧)8.https://service.account.weibo.com/reportspamobile?rid=5161857914&type=3&from=400009.https://service.account.weibo.com/reportspamobile?rid=2060991762&type=3&from=40000(批皮黑,ID:Y/i/b/o_姐姐)10.https://service.account.weibo.com/reportspamobile?rid=5470126181&type=3&from=4000011.https://service.account.weibo.com/reportspamobile?rid=2697131254&type=3&from=40000⭕ 今日一:O网页链接⭕ 今日二:O网页链接⭕ 今日三:O网页链接⭕ 今日四:O网页链接历史查询👉🏻 O微博社区管理中心 d\x014597294076798896\x010”

操作系统:Ubuntu18.04

python版本:3.8.5

HarvestText版本:0.8

情感分析跑出来的结果超过[-1, 1]

在情感分析当中,跑出来的结果超过了[-1,1]

  • pos:用的是get_qh_sent_dict() ['pos']

  • neg:用的是get_qh_sent_dict() ['neg']

  • 训练文本

docs = ["张市筹设兴华实业公司外区资本家踊跃投资晋察冀边区兴华实业公司,自筹备成立以来,解放区内外企业界人士及一般商民,均踊跃认股投资", 
        "该公司原定资本总额为二十五万万元,现已由各界分认达二十万万元,所属各厂、各公司亦募得股金一万万余元",
        "连日来解放区以外各工商人士,投函向该公司询问经营性质与范围以及股东权限等问题者甚多,络绎抵此的许多资本家,于参观该公司所属各厂经营状况后,对**政府扶助与奖励私营企业发展的政策,均极表赞同,有些资本家因款项未能即刻汇来,多向筹备处预认投资的额数。由平津来张的林明棋先生,一次即以现款入股六十余万元"
       ]
ht = HarvestText()
sdict = ht.build_sent_dict(docs, min_times=1, pos_seeds=pos,neg_seeds=neg)
  • 测试
ht.analyse_sent(docs[0])

输出:2.571525361280356

ht.clean_text内emoji或weibo_topic的功能改进建议

描述你想要的功能
ht.clean_textemojiweibo_topic的功能,目前是去除[]包括的表情包(限定字符串长度)以及去除两个#之间包裹的内容
是否可以提供一个新的接口,可以去除给定首尾字符串如'【''】'之间的字符串(包括首尾字符串)
即,新参数如:
specefic_cont: list
["【", "】", 20]
首、尾、上限长度
或者上限长度设为缺省,允许2个输入,即
specefic_con_start_end: list, specefic_con_len: int

如:
specefic_con_start_end = ["【", "】“]

specefic_con_len = 20

去除包括"【"和"】“在内,长度为20的字符串(话说我还不知道你源码限定的那个字符串长度,是包括两边的括号?还是没包括??)

是否有自己想过的可能解决方案?
有啊,魔改你的类库,哈哈!最近做实验赶时间还没来得及看你源码
我都打算拿你那个emoji直接改了

其他想说的
welldone,即便佬你不改我之后也会改一版...(泪目
怎么会有人在网上发帖,用这么多奇奇怪怪的括号啊..方括号大括号小括号,奇奇怪怪的括号啊救命

清洗模块反馈

通过爬虫抓取微博热门语料对HT的清洗模块进行了小测试,故根据返回结果提出反馈:

①
①:每条语料都有”\u200b“

②
②:中间的博文内容“辛苦了”被洗掉

③
③:存在特殊表情符号无法处理

④
④:“[]"后的全部内容被洗掉

⑤
⑤:中括号内的“[]"包裹的内容被洗掉

⑥
⑥:除了”\u200b“,HT大多数情况下的表现已经很好

情感预测正负向概率均为0

仅输入一个句子,预测概率均为0
ht.build_sent_dict(["今天天气不错"],min_times=1,scale="+-1")
{'今天天气': 0.0, '不错': 0.0}

新词发现的结果质量问题

描述你想要的功能

一封邮件反馈问题:
image
可见图一中,我们新词发现的期待值为“喜宝”,实际结果也返回了“喜宝”,但却有两个无关项。

image
图二中对新词的识别效果就明显不行了,连“自己”、“没有”、“跳舞”这样的词也判定为新词

两个例子中的共同问题是识别出了不希望出现的结果,即,算法的准确问题。

图二的例子中,所有结果都不是理想的结果,即,算法的召回问题。

可能解决方案

准确问题

要想解决准确问题,只要过滤掉“不好”的结果就可以了。

过滤功能实际上本库已经实现了,可以使用excluding_words参数,在其中设定不想要出现的单词列表/集合等即可。

问题是如何定义“不好”的结果,这里大概可以提供两种设想:

  1. 停用词
  2. 旧词,即词典中的常见单词

如果只是使用停用词,本库现在已经可以完成整个流程:

from harvesttext import HarvestText
from harvesttext.resources import get_baidu_stopwords

ht = HarvestText()
stopwords = get_baidu_stopwords()
text = "这里填入你的文本"
new_words_info = ht.word_discover(para, excluding_words=stopwords)  # 这里过滤了停用词
new_words = new_words_info.index.tolist()

如果要过滤旧词,本库还需要引入外部词典。

召回问题

召回问题,可能可以通过获得更多词语来缓解。这可以通过调整参数来实现,这个函数有这些参数可以调整:

:param max_word_len: 允许被发现的最长的新词长度
:param min_freq: 被发现的新词,在给定文本中需要达到的最低频率
:param min_entropy: 被发现的新词,在给定文本中需要达到的最低左右交叉熵
:param min_aggregation: 被发现的新词,在给定文本中需要达到的最低凝聚度

第一项容易理解,后面三项涉及算法原理,不过简单地说,都是越低,能发现的词就越多,不过太低就会引入更多错误结果,出现上一类问题。

要调参获得更多词语的话,首先要设置auto_param=False,然后,可以在默认参数的基础上往下调,下面的默认的参数:

min_entropy = np.log(length) / 10
min_freq = min(0.00005, 20.0 / length)
min_aggregation = np.sqrt(length) / 15

未来改进计划

  • 将停用词设为默认过滤词

  • 引入外部词典,允许方便地过滤旧词

  • 上面的操作在readme和文档中还不明确,需要完善

无法解析导入“pyxdameraulevenshtein”

我已经仔细查看过本库的README和之前的Issues,没有发现解决方案。

问题描述
无法解析导入“pyxdameraulevenshtein”

操作系统:
win11

编译器:vscode

python版本:3.8.10

HarvestText版本:0.8.2.1

image

更新到0.5.4.1版本失败

当输入了,
pip install harvesttext==0.5.4.1 --extra-index-url https://pypi.python.org/simple
时,
安装出现了问题:

Exception:
Traceback (most recent call last):
  File "c:\users\lijy2\appdata\local\programs\python\python36\lib\site-packages\pip\_internal\cli\base_command.py", line 179, in main
    status = self.run(options, args)
  File "c:\users\lijy2\appdata\local\programs\python\python36\lib\site-packages\pip\_internal\commands\install.py", line 393, in run
    use_user_site=options.use_user_site,
  File "c:\users\lijy2\appdata\local\programs\python\python36\lib\site-packages\pip\_internal\req\__init__.py", line 50, in install_given_reqs
    auto_confirm=True
  File "c:\users\lijy2\appdata\local\programs\python\python36\lib\site-packages\pip\_internal\req\req_install.py", line 816, in uninstall
    uninstalled_pathset = UninstallPathSet.from_dist(dist)
  File "c:\users\lijy2\appdata\local\programs\python\python36\lib\site-packages\pip\_internal\req\req_uninstall.py", line 496, in from_dist
    for path in uninstallation_paths(dist):
  File "c:\users\lijy2\appdata\local\programs\python\python36\lib\site-packages\pip\_internal\req\req_uninstall.py", line 50, in unique
    for item in fn(*args, **kw):
  File "c:\users\lijy2\appdata\local\programs\python\python36\lib\site-packages\pip\_internal\req\req_uninstall.py", line 67, in uninstallation_paths
    r = csv.reader(FakeFile(dist.get_metadata_lines('RECORD')))
  File "c:\users\lijy2\appdata\local\programs\python\python36\lib\site-packages\pip\_vendor\pkg_resources\__init__.py", line 1414, in get_metadata_lines
    return yield_lines(self.get_metadata(name))
  File "c:\users\lijy2\appdata\local\programs\python\python36\lib\site-packages\pip\_vendor\pkg_resources\__init__.py", line 1411, in get_metadata
    return value.decode('utf-8') if six.PY3 else value
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb0 in position 1921: invalid start byte

加上-U命令也是不行

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.