0

伙计们,

wordsegment在过去的几个小时里,我正在使用 Grant Jenks 的 python 库。该库适用于任何不完整的单词或分隔组合词,例如e nd ==> endthisisacat ==> this is a cat

我正在处理涉及数字的文本数据,并且在此文本数据上使用此库会产生相反的效果。increased $55 million or 23.8% for转换为非常奇怪的东西的完美文本increased 55millionor238 for(在重新调整的列表上执行连接操作之后)。请注意,对于文本中涉及数字的任何部分,这都是随机发生的(可能会发生也可能不会发生)。

  • 以前有人用过这个库吗?
  • 如果是,您是否遇到过类似情况并找到解决方法?
  • 如果没有,你知道任何其他为我们做这个技巧的 python 库吗?

谢谢你。

4

2 回答 2

0

需要帮助理解这个 Python 维特比算法时,有 Ruby 和 Python 中的实现。

算法(和那些实现)非常简单,复制和粘贴可能比使用库更好,因为(根据我的经验)这个问题几乎总是需要一些自定义以适应手头的数据(即语言/特定主题/自定义实体/日期或货币格式)。

于 2019-12-27T19:34:37.630 回答
0

查看代码,该segment函数首先运行clean删除所有非字母数字字符,然后在文本块中搜索已知的单字母和双字母,并根据它们在英语中的出现频率对找到的单词进行评分。

'increased $55 million or 23.8% for'

变成

'increased55millionor238for'

在搜索子词时,它会找到'increased'and 'for',但是由于某种原因,未知短语'55millionor238'的分数要好于分解它的分数。

它似乎对未知文本做得更好,尤其是较小的未知文本元素。您可以替换掉非字母字符序列,运行它segment,然后再替换回去。

import re
from random import choices

CONS = 'bdghjklmpqvwxz'

def sub_map(s, mapping):
    out = s
    for k,v in mapping.items():
        out = out.replace(k,v)
    return out

mapping = {m.group():''.join(choices(cons, k=3)) for m 
           in re.finditer(r'[0-9\.,$%]+', s)}
revmap = {v:k for k,v in mapping.items()}
word_list = wordsegment.segment(sub_map(s, mapping))
word_list = [revmap.get(w,w) for w in word_list]
word_list
# returns:
['increased', '$55', 'million', 'or', '23.8%', 'for']    
于 2018-11-30T02:15:09.580 回答