我正在研究一个NLP问题(在Python 2.7中),从报告中的文本中提取新闻报道的位置。对于此任务,我使用的Clavin API运行良好。
但是我注意到位置区域的名称经常在报告本身的URL中提到,我想找到一种从域名中提取此实体的方法,以提高准确度Clavin在请求中提供了一个额外的命名实体。
在一个理想的世界里,我希望能够提供这样的信息:
www.britainnews.net
并返回此输出或类似输出:
[www,britain,news,net]
当然我可以使用.split()功能来分隔不重要的www
和net
令牌,但是我很难过如何在没有强化字典查找的情况下拆分中间短语
我不是要求某人解决这个问题或为我编写任何代码 - 但这是一个公开征集关于理想NLP库(如果存在)的建议或关于如何解决这个问题的任何想法。
答案 0 :(得分:0)
检查Word Segmentation Task来自Norvig的工作。
from __future__ import division
from collections import Counter
import re, nltk
WORDS = nltk.corpus.reuters.words()
COUNTS = Counter(WORDS)
def pdist(counter):
"Make a probability distribution, given evidence from a Counter."
N = sum(counter.values())
return lambda x: counter[x]/N
P = pdist(COUNTS)
def Pwords(words):
"Probability of words, assuming each word is independent of others."
return product(P(w) for w in words)
def product(nums):
"Multiply the numbers together. (Like `sum`, but with multiplication.)"
result = 1
for x in nums:
result *= x
return result
def splits(text, start=0, L=20):
"Return a list of all (first, rest) pairs; start <= len(first) <= L."
return [(text[:i], text[i:])
for i in range(start, min(len(text), L)+1)]
def segment(text):
"Return a list of words that is the most probable segmentation of text."
if not text:
return []
else:
candidates = ([first] + segment(rest)
for (first, rest) in splits(text, 1))
return max(candidates, key=Pwords)
print segment('britainnews') # ['britain', 'news']